<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ladislav Szolik</title>
    <description>The latest articles on DEV Community by Ladislav Szolik (@ladislavszolik).</description>
    <link>https://dev.to/ladislavszolik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F609796%2F5d771e45-8ed8-4eba-8ded-e2678988792c.jpeg</url>
      <title>DEV Community: Ladislav Szolik</title>
      <link>https://dev.to/ladislavszolik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ladislavszolik"/>
    <language>en</language>
    <item>
      <title>Building app using Power Apps in teams</title>
      <dc:creator>Ladislav Szolik</dc:creator>
      <pubDate>Thu, 15 Feb 2024 20:03:17 +0000</pubDate>
      <link>https://dev.to/ladislavszolik/building-app-using-power-apps-in-teams-38io</link>
      <guid>https://dev.to/ladislavszolik/building-app-using-power-apps-in-teams-38io</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;A teacher, who is a friend of mine, wants to digitalise the school. As a first step we wanted change the way teachers take student’s attendance. His wish was to keep the price of the software as low as possible, so I set a challenge do keep it 0. &lt;/p&gt;

&lt;p&gt;They use Microsoft Office together with Microsoft Teams and I found out that you can build an app inside of Teams for free. It can be found inside Teams Apps, and &lt;strong&gt;Power Apps&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vx9079qb61ol13jz6v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4vx9079qb61ol13jz6v.jpg" alt="Start" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;Dataverse&lt;/strong&gt; database, which is database provided by Power Apps Teams integration, also completely free. &lt;/p&gt;




&lt;h2&gt;
  
  
  Requirements from the teachers
&lt;/h2&gt;

&lt;p&gt;The app should allow teachers to perform the following actions:&lt;br&gt;
Core:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take class attendance for a specific class having specific subject on a specific date&lt;/li&gt;
&lt;li&gt;View and filter already recorded attendances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create, modify and delete class names.&lt;/li&gt;
&lt;li&gt;Search and assign students to class.&lt;/li&gt;
&lt;li&gt;Create, modify and delete subjects. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To fulfil these requirements I solved these questions: &lt;/p&gt;


&lt;h2&gt;
  
  
  How can I access all students?
&lt;/h2&gt;

&lt;p&gt;One option is to let the teacher enter student data manually, but come on, it is 2024, we can do better. &lt;br&gt;
Each student uses Teams and Power Apps app has access to them. &lt;/p&gt;

&lt;p&gt;The screen to manage students in classes looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x7lz971bbkezz38pvrx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x7lz971bbkezz38pvrx.jpg" alt="manage students" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The classes are coming from “ClassNames” table, see (Tables I created…) &lt;/p&gt;
&lt;h3&gt;
  
  
  Add Office365Users connector:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnghdtphtt7murdv5vf5b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnghdtphtt7murdv5vf5b.jpg" alt="Connector" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Use autocomplete to easily find students
&lt;/h3&gt;

&lt;p&gt;I used gallery component “AutocompleteGallery” to show the user suggestions based on an entered text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Office365Users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SearchUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;SearchUserInput&lt;/span&gt;&lt;span class="p"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}),!&lt;/span&gt;&lt;span class="nf"&gt;IsBlank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UserPrincipalName&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The search text I take from an input field. This component just need a name “SearchUserInput”. Power Apps takes care of the rest. &lt;/p&gt;

&lt;h3&gt;
  
  
  Store students in a class
&lt;/h3&gt;

&lt;p&gt;The next step is to add a selected student into a class. The autocomplete gallery has the following OnSelect event to actually store the selected Office User:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="nf"&gt;Patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Classes&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;UserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ThisItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GivenName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ThisItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GivenName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Surname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ThisItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Surname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ThisItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ClassName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SelectedClassName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SearchUserInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, I used other gallery component  “ClassGallery” to show the stored students in the class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="nf"&gt;SortByColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Classes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ClassName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NameOfClass&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SelectedClassName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NameOfClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"cr15e_surname"&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Remark&lt;/strong&gt;: It took me some time to get to use to how Power Apps work. First you display the list and add inputs and controls to alter the list content. Here I show students from Office, but I filter them using the input field. &lt;/p&gt;




&lt;h2&gt;
  
  
  How should I store the attendance records?
&lt;/h2&gt;

&lt;p&gt;Requirements &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teacher selects a date, a class and a subject, then each student should have a record saying whether he was there or not. &lt;/li&gt;
&lt;li&gt;Teacher should be able to simple modify these records (if a students shows up 5 minutes later). &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  These tables I created to fulfil the requirements
&lt;/h3&gt;

&lt;p&gt;The “AbsenceRecords” table, which holds the actual record of absence looks like this (it took few iterations until I came up with this):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2maz0olv455w5rpw4swn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2maz0olv455w5rpw4swn.png" alt="Absence records table" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course before that I needed to create all the related tables. &lt;/p&gt;

&lt;p&gt;“Class” table where I store the students:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3eacka1w8pz6zyg585d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3eacka1w8pz6zyg585d.png" alt="Class" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This table contains the copy of office users (students). I accessed them using the Office365Users connector (showed you above how). It also holds a reference to the “ClassNames” table.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02gdspzn5lbivr1gpzei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02gdspzn5lbivr1gpzei.png" alt="Class names" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“ClassNames” table serves as a simple way to manage the class names. I guess there are many ways how you can mark the classes, I wanted to use Power Apps Choice, but I could not make it work. &lt;/p&gt;

&lt;p&gt;The last table required for the “AbsenceRecords” table to function was the “Subjects” table. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp87lpz5mg64kngob5l0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp87lpz5mg64kngob5l0k.png" alt="Subjects" width="800" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Subjects” table is also a very simple, it holds the name of each school subject. &lt;/p&gt;

&lt;p&gt;The status “Present, Absent, Late, Excused” I managed to solve with Choice. As a table column looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funj81gbnndjqikdqi0ft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funj81gbnndjqikdqi0ft.png" alt="Column" width="740" height="1844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the choice itself, is looking like this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrwswthxy9w7481tci4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrwswthxy9w7481tci4j.png" alt="Choice" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to build the UI for attendance taking?
&lt;/h2&gt;

&lt;p&gt;The challenge was to display and save “Present” state at first time for the selected class. And allow modifications later. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxkd5img0fzt4h3wrpz0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxkd5img0fzt4h3wrpz0.jpg" alt="Start record absence" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added 3 input fields to set Date, Class and Subject of the recording.&lt;/p&gt;

&lt;p&gt;Added the Gallery component to simple display the records filtered based on the 3 inputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Students gallery&lt;/span&gt;

&lt;span class="c1"&gt;// AddColumns was required to make Table Relationships accessible for the app.&lt;/span&gt;
&lt;span class="nf"&gt;SortByColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;AddColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AbsenceRecords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ClassNameId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClassName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Surname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Surname&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;ClassNameId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ClassComboBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;RecordDate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Datum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SubjectComboBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s"&gt;"Surname"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Button component “StartButton” starts the first time recording.  OnSelect action creates all the records based on the 3 Input fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// MyTable creates an in memory table&lt;/span&gt;
&lt;span class="nf"&gt;ClearCollect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;MyTable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;AddColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;Classes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"ClassNameId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ClassName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;ClassNameId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ClassComboBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// For all is "patching" means inserting the records to the database&lt;/span&gt;
&lt;span class="nf"&gt;ForAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;MyTable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;Patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;@AbsenceRecords&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SubjectComboBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;RecordDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Datum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ThisRecord&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the Gallery is filled with data, you see 4 buttons: Present, Absent, Late and Excused. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7swuaabsfiv1qacmokm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7swuaabsfiv1qacmokm.jpg" alt="Recording is ongoing" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each button has an OnSelect event that updates the given row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="nf"&gt;Patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AbsenceRecords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;LookUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;AbsenceRecords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ThisItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;RecordStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AbsenceStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Excused&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, I indicate which status is currently set by simple switching the ButtonType:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If(ThisItem.RecordStatus = AbsenceStatus.Excused, "Primary", "Secondary")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Error handling can be included if necessary….&lt;/p&gt;




&lt;h2&gt;
  
  
  How to show all the attendances?
&lt;/h2&gt;

&lt;p&gt;The final screen looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobcm8bjsxjiqkxuwh9x7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobcm8bjsxjiqkxuwh9x7.jpg" alt="All attendances" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This screen could have been so simple, but instead I needed to include the percentage of absences per student. On top of that, there should be a filter. Makes sense for the teacher, was a nightmare for me. Anyways, the final gallery component has the following Items:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="nf"&gt;SortByColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="nf"&gt;AddColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;GroupBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;AddColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;AbsenceRecords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s"&gt;"StudentId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s"&gt;"GivenName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GivenName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s"&gt;"Surname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Surname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s"&gt;"ClassNameId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClassName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s"&gt;"Choices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;RecordStatus&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;

            &lt;span class="nf"&gt;If&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;IsBlank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubjectsFilterCombox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SubjectsFilterCombox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nf"&gt;If&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;IsEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ClassFilterCombox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedItems&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;ClassNameId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ClassFilterCombox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nf"&gt;If&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;IsBlank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DateFilterPicker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;RecordDate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateFilterPicker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nf"&gt;If&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;IsEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StudentFilterCombox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedItems&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mail&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StudentFilterCombox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mail&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;        
        &lt;span class="s"&gt;"StudentId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"GivenName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"Surname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"Students"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s"&gt;"SumOfPresent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;CountIf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Students&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Choices&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AbsenceStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Present&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s"&gt;"SumOfAbsent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;CountIf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Students&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Choices&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AbsenceStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Absent&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s"&gt;"SumOfExcused"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;CountIf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Students&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Choices&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AbsenceStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Excused&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s"&gt;"SumOfLate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;CountIf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Students&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Choices&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AbsenceStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Late&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s"&gt;"Ratio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;CountRows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Students&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"Surname"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How should a teacher manage class names and school subjects?
&lt;/h2&gt;

&lt;p&gt;Power Apps has out of the box UI where you select the data source and it automatically generates a screen with a list and form to manipulate the list. I used for both tables this feature:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz75tch93xp5va7web2q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz75tch93xp5va7web2q.jpg" alt="Manage class names and subjects" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How should a teacher navigate between screens?
&lt;/h2&gt;

&lt;p&gt;As you saw on the print screens, I used tabs. This component is from the “Modern” component library of Power Apps.  &lt;/p&gt;

&lt;p&gt;I set the tab labels and the navigation at the OnStart event of the App:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// OnStart&lt;/span&gt;
&lt;span class="nf"&gt;ClearCollect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;topNavItems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Absenz aufnehmen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TakeAttendance&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"Alle Absenzen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ViewAttendances&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"Klassen Namen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ViewClassNames&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"Studenten"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ViewStudents&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"Fächer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ViewSubjects&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I set the following OnSelect event for the tabs component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;varCurrentNav&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;Navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ScreenTransition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Publish
&lt;/h2&gt;

&lt;p&gt;They made it super easy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dji0oouj6frzdm4igsf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dji0oouj6frzdm4igsf.jpg" alt="Publish" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attention: I was using production database in the app builder. I did not figure out how to have a test database. &lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I hope it was helpful for you. I haven’t explained here every detail, but I am happy to answer any question.&lt;/p&gt;

</description>
      <category>powerapps</category>
      <category>teams</category>
      <category>microsoft</category>
      <category>programming</category>
    </item>
    <item>
      <title>Introduction</title>
      <dc:creator>Ladislav Szolik</dc:creator>
      <pubDate>Tue, 31 Jan 2023 15:26:29 +0000</pubDate>
      <link>https://dev.to/ladislavszolik/introduction-5823</link>
      <guid>https://dev.to/ladislavszolik/introduction-5823</guid>
      <description>&lt;h2&gt;
  
  
  About the final app
&lt;/h2&gt;

&lt;p&gt;In this series I will share my experience building a fully functional app, listed on the App Store. This app is an expense tracker called Expenny &lt;a href="https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=1666233678" rel="noopener noreferrer"&gt;Link to App Store&lt;/a&gt;. The following features are included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read &amp;amp; store data from Core Data&lt;/li&gt;
&lt;li&gt;use form controls like: TextField, DatePicker and Picker&lt;/li&gt;
&lt;li&gt;display data as Segmented (Grouped) list with filter&lt;/li&gt;
&lt;li&gt;use form controls with bindings to save new item and to edit existing items &lt;/li&gt;
&lt;li&gt;use of sheet and navigation stack &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Future plans:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support for different currencies&lt;/li&gt;
&lt;li&gt;Add charts to visualise historical data&lt;/li&gt;
&lt;li&gt;Add ML to predict certain user actions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I needed?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Figma to design the logo and wireframes for the app&lt;/li&gt;
&lt;li&gt;xcode installed on my macbook&lt;/li&gt;
&lt;li&gt;Developer license to ship the app and to test on real devices&lt;/li&gt;
&lt;li&gt;an iPhone to test&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Starting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Getting to know the platform and the framework
&lt;/h3&gt;

&lt;p&gt;Before I had any idea what I will build, I was curious about iOS design updates and I watched some &lt;a href="https://developer.apple.com/videos/swiftui-ui-frameworks" rel="noopener noreferrer"&gt;Videos form Apple's WWDC&lt;/a&gt;. These recordings have high quality and you can find references in the developer documentation. For building this app, the following videos were specially useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/videos/play/wwdc2022/10052/" rel="noopener noreferrer"&gt;What's new in SwiftUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.apple.com/videos/play/wwdc2022/10136/" rel="noopener noreferrer"&gt;Hello Swift Charts&lt;/a&gt; (in the end I skipped charts from the app for now)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/videos/play/wwdc2022/10054/" rel="noopener noreferrer"&gt;The SwiftUI cookbook for navigation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/videos/play/wwdc2021/10017/" rel="noopener noreferrer"&gt;Bring Core Data concurrency to Swift and SwiftUI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Coming up with an idea
&lt;/h3&gt;

&lt;p&gt;The WWDC videos inspired me to build something. I did not wanted to do customer research for that and I did not wanted to build the next Instagram or Facebook. Just something small. I knew my partner wanted to track her expenses. We wanted to know how much we spend on restaurants, petrol, etc. &lt;/p&gt;

&lt;p&gt;If you struggle to come up with an idea, you can reach out to me, happy to help.&lt;/p&gt;

&lt;p&gt;Next, I opened Figma and visualised what I am going to build:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftttvvc6aiecd8uuofgm9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftttvvc6aiecd8uuofgm9.jpg" alt="Wireframes made in Figma" width="800" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This exercise helped me to come up with the following list of user features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter expense amount (for now without currency)&lt;/li&gt;
&lt;li&gt;Set expense date (today's date preselected)&lt;/li&gt;
&lt;li&gt;Choose expense category&lt;/li&gt;
&lt;li&gt;Manage categories&lt;/li&gt;
&lt;li&gt;View expenses per month, per category&lt;/li&gt;
&lt;li&gt;Edit and delete expenses&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Playing with SwiftUI
&lt;/h3&gt;

&lt;p&gt;I am a beginner in the world of Swift or SwiftUI development. So I created many small projects where I built small parts of the app. &lt;/p&gt;

&lt;p&gt;I started with the form, where the user enters the expense, then I moved to displaying the list of expenses and lastly to modify the list, adding categories, etc. &lt;/p&gt;

&lt;p&gt;In general, when I know beforehand what features I will build, I prepare proof of concepts for them in separation. This way is easier to play with edge cases to see if it would even work. &lt;/p&gt;

&lt;p&gt;To build the new expense form, I experimented with TextField to learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to display a full width TextField? &lt;/li&gt;
&lt;li&gt;How to limit to enter only numbers? &lt;/li&gt;
&lt;li&gt;How to show the keyboard when the user arrives on the page?&lt;/li&gt;
&lt;li&gt;How to hide the keyboard? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next post of this series I will share my answers to these questions and additionally how I built the entire new expense form. &lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>offers</category>
      <category>web3</category>
    </item>
    <item>
      <title>Career crisis</title>
      <dc:creator>Ladislav Szolik</dc:creator>
      <pubDate>Mon, 14 Mar 2022 14:50:05 +0000</pubDate>
      <link>https://dev.to/ladislavszolik/career-crisis-31b8</link>
      <guid>https://dev.to/ladislavszolik/career-crisis-31b8</guid>
      <description>&lt;p&gt;In this short post I wanted to share with you an obstacle I face and my thinking around it.&lt;/p&gt;

&lt;p&gt;I started to work full-time in 2011 as a Java developer. My first project was a giant software for tax department. Very complex, very boring. Actually I wanted to quit and do illustration instead. &lt;/p&gt;

&lt;p&gt;Since 2011 instead of quitting I switched roles from Scrum Master, Frontend developer, Dev Ops to UX design. It was actually nice to see the industry from different perspectives. However now I face with a big problem: Where to go next? What is the next step in my professional life? &lt;/p&gt;

&lt;p&gt;I became comfortable with my role and knowledge =&amp;gt; I am not growing anymore. Of course I share what I learned with my colleagues (or anyone who is interested). &lt;/p&gt;

&lt;p&gt;In my mind the next step is to do my own business. In the last 5 years I took courses, read books, talked with business owners and I tried to ship that first version. I still failing make it happen. &lt;/p&gt;

&lt;p&gt;I saw other people got so desperate, that they want to do work for free, just to start somehow and later have trouble to get paid. I aim to avoid that... &lt;/p&gt;

&lt;p&gt;I am searching the answer for these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What to do if you don't see any opportunity in your surrounding which is small enough to get started, but can grow to sustain you? &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What to do if you have only few connections and they are very different from you or they are not interested in the things you make? &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;P.S. After so much business/startup research, whenever I have a new idea, I feel like my mind can think only in slogans and landing pages. It might not be healthy anymore, I guess I will have to take a break.&lt;/p&gt;

</description>
      <category>career</category>
      <category>startup</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Why enterprise software is so bad?</title>
      <dc:creator>Ladislav Szolik</dc:creator>
      <pubDate>Tue, 08 Mar 2022 20:44:20 +0000</pubDate>
      <link>https://dev.to/ladislavszolik/why-enterprise-software-is-so-bad-23e7</link>
      <guid>https://dev.to/ladislavszolik/why-enterprise-software-is-so-bad-23e7</guid>
      <description>&lt;p&gt;Why most enterprise apps are so bad? ... I was thinking about this recently. &lt;/p&gt;

&lt;p&gt;Both, MS Outlook and MS Teams are super slow on the Mac. It is noticeable that they are not native apps and they are buggy. For MS Teams sometimes even the cmd+Tab does not work. &lt;/p&gt;

&lt;p&gt;Another example are Jira and Confluence web applications. They both are very complex and require employee training. &lt;/p&gt;

&lt;p&gt;I believe, Microsoft and Atlassian have many smart developers, yet quality of these apps is ... off, why?&lt;/p&gt;

&lt;p&gt;I've worked on complex applications and I noticed a certain requiring theme: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The stakeholders want to deliver on their imaginary deadline&lt;/li&gt;
&lt;li&gt;They find weird ways to reduce the budget&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? &amp;gt; The pressure they create cascades to the developers. Maybe not all developers are skilled, or maybe they are distracted by the large amount of meetings thanks to agile. The quality of their work goes down and the new software quickly becomes yet another slow legacy system which is hard to maintain. &lt;/p&gt;

&lt;p&gt;The project becomes so painful that people start to leave. The new hires spend their energy to understand the mess, but eventually they get tired too and the circle continues. &lt;/p&gt;

&lt;p&gt;Of course, the salary is good, so there will be always somebody who is willing to struggle with that app for 2-3 years.&lt;/p&gt;

&lt;p&gt;Maybe sometimes we could ask ourselves more often if we want to continue on this route... I think we always have a choice.&lt;/p&gt;

&lt;p&gt;P.S. &lt;a href="https://dev.to"&gt;https://dev.to&lt;/a&gt; is an example of good software.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>management</category>
      <category>development</category>
    </item>
    <item>
      <title>A minimal CMS for jamstack blogging</title>
      <dc:creator>Ladislav Szolik</dc:creator>
      <pubDate>Wed, 09 Jun 2021 19:29:56 +0000</pubDate>
      <link>https://dev.to/ladislavszolik/a-minimal-cms-for-jamstack-blogging-3hnb</link>
      <guid>https://dev.to/ladislavszolik/a-minimal-cms-for-jamstack-blogging-3hnb</guid>
      <description>&lt;h2&gt;
  
  
  The problem the project tries to solve
&lt;/h2&gt;

&lt;p&gt;I made my homepage using a static page generator &lt;a href="https://www.11ty.dev/"&gt;11ty&lt;/a&gt;. The blogs and project documentations are written in a Markdown &lt;a href="https://www.markdownguide.org/"&gt;about markdown&lt;/a&gt;. These documents the page generator transforms into static HTML. &lt;/p&gt;

&lt;p&gt;It is super easy to write them in my code editor connected to github. Sometimes I would like to write &amp;amp; publish on the go using my tablet or iPhone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;an responsive web app written in vanilla JS. It connects to your github using github's &lt;a href="https://github.com/octokit/core.js/"&gt;octokitjs&lt;/a&gt; library.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Printscreens
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ApyLlvTW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38kfy2mfii5yw0tvxe8y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ApyLlvTW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38kfy2mfii5yw0tvxe8y.png" alt="Login to github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_539oclp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pczri365wx4smn0w9gzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_539oclp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pczri365wx4smn0w9gzo.png" alt="Editing a blog entry"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Urbjihpe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a78v3heywvixkt63lzq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Urbjihpe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a78v3heywvixkt63lzq1.png" alt="Mobile view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A github based project (basically a new commit triggers a new deployment)&lt;/li&gt;
&lt;li&gt;Personal access tokens has been generated &lt;a href="https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;Guide to create one&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;nodejs installed&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;as of now you would need to clone the repository: 
&lt;code&gt;git clone https://github.com/LadislavSzolik/cms4devs.git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;install dependencies with node: 
&lt;code&gt;npm isntall&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;adapt the repository settings to your needs &lt;/li&gt;
&lt;li&gt;build it for production: 
&lt;code&gt;npm run build&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;copy the generated output to your project&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Feedback
&lt;/h2&gt;

&lt;p&gt;THis project is work in progress. However if you find it useful for you, let me know about the challenges you while using it. &lt;/p&gt;

&lt;p&gt;Thanks&lt;/p&gt;

</description>
      <category>writing</category>
      <category>jamstack</category>
      <category>vanillajs</category>
      <category>github</category>
    </item>
    <item>
      <title>Learning from dev courses...or from side projects?</title>
      <dc:creator>Ladislav Szolik</dc:creator>
      <pubDate>Tue, 13 Apr 2021 19:43:03 +0000</pubDate>
      <link>https://dev.to/ladislavszolik/learning-from-dev-courses-or-from-side-projects-4i98</link>
      <guid>https://dev.to/ladislavszolik/learning-from-dev-courses-or-from-side-projects-4i98</guid>
      <description>&lt;p&gt;I love to complete a good course on software development or design. It makes me feel that I learned something new and I feel confident about it. 💪&lt;/p&gt;

&lt;p&gt;This last until I face a project and I realize I either forgot some parts or I don't know how to use it here. &lt;/p&gt;

&lt;p&gt;First I thought, the is a problem with my note taking technique or the course material...&lt;/p&gt;

&lt;p&gt;Then recently a friend asked me to build a web app for her small business. It was all on me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hosting&lt;/li&gt;
&lt;li&gt;landing page&lt;/li&gt;
&lt;li&gt;brand + UI design&lt;/li&gt;
&lt;li&gt;database design&lt;/li&gt;
&lt;li&gt;authentication &lt;/li&gt;
&lt;li&gt;mails&lt;/li&gt;
&lt;li&gt;i18n &lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In that half year of discussions, design and development I feel learned a tons and I thought to share with you. &lt;/p&gt;

&lt;p&gt;Having a stake in the game changed the way I build knowledge. &lt;/p&gt;

&lt;p&gt;If you haven't been responsible to build something for somebody else, I can highly recommend! Even more, I am always happy to collaborate!  &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>learning</category>
      <category>writing</category>
    </item>
    <item>
      <title>Use of mental models</title>
      <dc:creator>Ladislav Szolik</dc:creator>
      <pubDate>Sat, 10 Apr 2021 07:57:13 +0000</pubDate>
      <link>https://dev.to/ladislavszolik/use-of-mental-models-54ig</link>
      <guid>https://dev.to/ladislavszolik/use-of-mental-models-54ig</guid>
      <description>&lt;p&gt;Mental models give us a shorthand to know how things work around us. Our brain constantly creates them to help us managing our life. This is a good thing, if the model is useful and help us move forward!&lt;/p&gt;

&lt;p&gt;In software design, people love to invent new terms for already existing things. That is so far okay. Then they re-explain it as it was new and problem happens when they convince others that is available only to certain people...&lt;/p&gt;

&lt;p&gt;When a developers says: &lt;em&gt;I don't know how to do UX. I just implement the code, I am not a creative kind.&lt;/em&gt; This person often times has an image about a UX Designer, who effortlessly comes up with creative ideas and design wonderful screens and exactly knows what the user want. This is not empowering. &lt;/p&gt;

&lt;p&gt;Of course the reality might be different. Still that model exist in the dev's mind and it might block her to level up. &lt;/p&gt;

&lt;p&gt;Useful mental models like performance, authentication ... are super useful, but for some other models we might need to dig deeper to re validate our understanding. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>writing</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
