<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Vince Ramces Oliveros Blog]]></title><description><![CDATA[Vince Ramces Oliveros Blog]]></description><link>https://vinceramcesoliveros.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 09:52:23 GMT</lastBuildDate><atom:link href="https://vinceramcesoliveros.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Creating Enrollment System without prior experience in Laravel + React over the weekend]]></title><description><![CDATA[Self Introduction
I have more than 5 years of experience in the software development, most of them are in mobile application using Flutter and Web using VueJS(Vue2 + Javascirpt), My web stack has been on silos since then. But it’s not always the fram...]]></description><link>https://vinceramcesoliveros.dev/creating-enrollment-system-without-prior-experience-in-laravel-react-over-the-weekend</link><guid isPermaLink="true">https://vinceramcesoliveros.dev/creating-enrollment-system-without-prior-experience-in-laravel-react-over-the-weekend</guid><category><![CDATA[Laravel]]></category><category><![CDATA[React]]></category><category><![CDATA[PHP]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[CSS]]></category><category><![CDATA[SQL]]></category><category><![CDATA[enrollment-management]]></category><dc:creator><![CDATA[Vince Ramces Oliveros]]></dc:creator><pubDate>Mon, 09 Jun 2025 12:48:33 GMT</pubDate><content:encoded><![CDATA[<h3 id="heading-self-introduction">Self Introduction</h3>
<p>I have more than 5 years of experience in the software development, most of them are in mobile application using Flutter and Web using VueJS(Vue2 + Javascirpt), My web stack has been on silos since then. But it’s not always the frameworks that I’ve been focusing on. Most of the time its solving problems and challenges that make the most of it.</p>
<p>When I challenged myself to do this task over the weekend, I worked myself around 10 hours a day of reading documentation and writing code. Of course, this would be easier if this was generated by AI. but how would I debug, analyze, and fix it if I don’t know what the tool is.</p>
<h3 id="heading-tldr-i-didnt-get-the-job-after-the-final-interview">TLDR; I didn’t get the job after the final interview.</h3>
<p>I am saddened to hear this, but I know that I’ve become more confident in these challenges and I will continue to pursue and grow my career.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">📍</div>
<div data-node-type="callout-text">As of this writing. I am 60% complete on my multi-platform note taking app for trekkers, hikers and campers who want to share their memories and automate their itinerary written in Flutter. Local first, it works offline, and capable of syncing to different devices.</div>
</div>

<h3 id="heading-overview-of-the-system">Overview of the system</h3>
<p>The enrollment system consist of two users.</p>
<ul>
<li><p>The admin and user.</p>
</li>
<li><p>An admin can access the admin dashboard via login &amp; register, view registered enrolees table and Add enrolee.</p>
</li>
<li><p>Users can register in the home page, then on submit they will receive an email that they have successfully enrolled.</p>
</li>
</ul>
<p><em>Pretty hard for beginners, right?</em></p>
<p>I would have said this myself while I was a fresh graduate. But for right now, I see that this is just a minor feature to be added on a weekday job with few polishing and doing UAT and deployment.</p>
<h3 id="heading-requirements">Requirements</h3>
<ul>
<li><p><strong>Laravel</strong> - SQLITE, ORM, Routing &amp; Mail</p>
</li>
<li><p><strong>React -</strong> HTML,CSS,JS,Typescript, Tailwind</p>
</li>
<li><p><strong>InertiaJS</strong> - build pages and communicates directly to server side API</p>
</li>
<li><p><a target="_blank" href="https://www.mailersend.com/"><strong>mailersend</strong></a> <strong>(optional)</strong></p>
</li>
<li><p><strong>VSCode</strong> - Code editor, allows the editor to read <em>Language server protocol</em>(TBD later)</p>
</li>
</ul>
<h3 id="heading-getting-started">Getting started</h3>
<h4 id="heading-php-language">PHP Language</h4>
<p>PHP had a reputation for inconsistent naming convention, lack of documentation, poorly written code, type safety, security and legacy code. This all changed when laravel gained popularity. My experience was seamless, but often times there are still black magic that no one can explain even the LSP itself.</p>
<p>I learned PHP for a single day using <a target="_blank" href="https://learnxinyminutes.com/php/">https://learnxinyminutes.com/php/</a>. The language itself is comfortable knowing that there are type safe syntax and OOP fundamentals.</p>
<h4 id="heading-react-typescript">React + Typescript</h4>
<p>The React framework is like a matured wild west that is widely used in big tech companies. But nowadays it has been growing rapidly and interchangeably by replacing one stack to another. Each month there are news of something that is being replaced by something new and it’s hard to keep up especially you are maintaining a big legacy code that will eventually become deprecated.</p>
<p>For best learning resources, head out to <a target="_blank" href="https://reactjs.org/">https://reactjs.org/</a> for more guides and documentation.</p>
<p>I was already familiar with typescript along with Javascript, though what works best is not the language but the tooling. I’m using <a target="_blank" href="https://vite.dev/">Vite</a> to bundle typescript code. this makes it easier to import files and allow LSP to navigate and read the files.</p>
<h4 id="heading-mailersend-optional">Mailersend (optional)</h4>
<p>This is just for creating and sending email templates, this works well in other frameworks and we are going to use it in Laravel.</p>
<h4 id="heading-vscode">VSCode</h4>
<p>The code editor for using LSP and using React+Laravel Extensions.</p>
<h2 id="heading-project-setup">Project setup</h2>
<h3 id="heading-laravel-installation">Laravel Installation</h3>
<p>Go to <a target="_blank" href="https://laravel.com/docs/12.x">https://laravel.com/docs/12.x</a> and run the following commands</p>
<p><strong>Install PHP</strong></p>
<p><strong>MacOS</strong></p>
<pre><code class="lang-bash">/bin/bash -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://php.new/install/mac/8.4)</span>"</span>
</code></pre>
<p><strong>Windows(Powershell)</strong></p>
<pre><code class="lang-powershell"><span class="hljs-comment"># Run as administrator...</span>
<span class="hljs-built_in">Set-ExecutionPolicy</span> Bypass <span class="hljs-literal">-Scope</span> <span class="hljs-keyword">Process</span> <span class="hljs-literal">-Force</span>; [<span class="hljs-type">System.Net.ServicePointManager</span>]::SecurityProtocol = [<span class="hljs-type">System.Net.ServicePointManager</span>]::SecurityProtocol <span class="hljs-operator">-bor</span> <span class="hljs-number">3072</span>; <span class="hljs-built_in">iex</span> ((<span class="hljs-built_in">New-Object</span> System.Net.WebClient).DownloadString(<span class="hljs-string">'https://php.new/install/windows/8.4'</span>))
</code></pre>
<p><strong>Linux</strong></p>
<pre><code class="lang-powershell">/bin/bash <span class="hljs-literal">-c</span> <span class="hljs-string">"<span class="hljs-variable">$</span>(curl -fsSL https://php.new/install/linux/8.4)"</span>
</code></pre>
<p>After running the commands, <strong>restart the terminal</strong> and install <strong>Laravel.</strong></p>
<pre><code class="lang-bash">composer global require laravel/installer
</code></pre>
<p>Great! We have laravel installed in our local machine and we can run laravel in any folders</p>
<p>Next We’ll install nodejs</p>
<h4 id="heading-nodejs">NodeJS</h4>
<p>To run nodejs in your terminal. you must install nodejs first.</p>
<p><a target="_blank" href="https://nodejs.org/en">https://nodejs.org/en</a></p>
<p>To check if nodejs installed, run the following commands</p>
<pre><code class="lang-bash">node --version <span class="hljs-comment">#v22.16.0</span>
npm --version <span class="hljs-comment">#v22.16.0</span>
</code></pre>
<p>Let’s create a <strong>laravel</strong> project.</p>
<pre><code class="lang-bash">laravel new enrollment
</code></pre>
<p>We want to use react starter kit for this simple project. Select <strong>react</strong></p>
<pre><code class="lang-bash"> ┌ Which starter kit would you like to install? ────────────────┐
 │   ○ None                                                     │
 │ › ● React                                                    │
 │   ○ Vue                                                      │
 │   ○ Livewire                                                 │
 └──────────────────────────────────────────────────────────────┘
</code></pre>
<p>Select <strong>Laravel’s built-in authentication</strong></p>
<pre><code class="lang-bash"> ┌ Which authentication provider <span class="hljs-keyword">do</span> you prefer? ────────────────┐
 │ › ● Laravel<span class="hljs-string">'s built-in authentication                        │
 │   ○ WorkOS (Requires WorkOS account)                         │
 └──────────────────────────────────────────────────────────────┘</span>
</code></pre>
<p>Select any test framework you want, but I will use Pest in this project.</p>
<pre><code class="lang-bash"> ┌ Which testing framework <span class="hljs-keyword">do</span> you prefer? ──────────────────────┐
 │ › ● Pest                                                     │
 │   ○ PHPUnit                                                  │
 └──────────────────────────────────────────────────────────────┘
</code></pre>
<p>Select <strong>Yes</strong> to run <strong>npm install</strong> and <strong>npm run build</strong></p>
<pre><code class="lang-bash"> ┌ Would you like to run npm install and npm run build? ────────┐
 │ ● Yes / ○ No                                                 │
 └──────────────────────────────────────────────────────────────┘
</code></pre>
<p>Once the application has been created, open the enrollment folder from VSCode</p>
<p>To run the laravel application.</p>
<pre><code class="lang-bash">composer run dev
</code></pre>
<p>This will run the project and watch any file changes. Any changes in the code will automatically update to the UI.</p>
<h3 id="heading-important-files-and-folders">Important files and folders</h3>
<p>Looking inside the laravel application, There are lots of folders files. That is an important feat because we are following the standards and architecture of the project. Soon, you will learn this convention and grow the application.</p>
<h4 id="heading-environmentenv">Environment(<code>.env</code>)</h4>
<p>This is where the environment variables that we will monitor before we build our project. This contains sensitive information such as API keys and database connection.</p>
<h2 id="heading-model-view-controller">Model-view-controller</h2>
<p>Ah yes, the most used state management architecture, <strong>MVC framework</strong>.</p>
<p>For quick introduction, this is what MVC looks like.</p>
<pre><code class="lang-mermaid">flowchart TD
    subgraph User Interface
        A[User]
    end

    subgraph Controller Layer
        B[Controller]
    end

    subgraph View Layer
        C[View]
    end

    subgraph Model Layer
        D[Model]
    end

    A --&gt;|Input| B
    B --&gt;|Updates Model| D
    D --&gt;|Notifies View| C
    C --&gt;|Renders Output| A
</code></pre>
<p>This reads from top to bottom, left to right. In summary</p>
<ul>
<li><p><strong>Models</strong> are not bound in any business logic or framework logic</p>
</li>
<li><p><strong>Controllers</strong> handle model changes and CRUD logic.</p>
</li>
<li><p><strong>Views</strong> are there to display the output of the <strong>Controller</strong> and any specific UI logic showing checkbox state or handling error messages.</p>
</li>
</ul>
<p>By default, Laravel will generate MVC for users since this is the basic functionality of a laravel app.</p>
<p>We will skip this topic and focus solely on building our own table.</p>
<h3 id="heading-model">Model</h3>
<p>to create a new model, we can do it manually, or use Laravel CLI to generate our model.</p>
<p>The easiest way to create them is to include model, migration, factory, seeder, policy, controller, and form requests etc…</p>
<pre><code class="lang-bash">
<span class="hljs-comment"># Shortcut to generate a model, migration, factory, seeder, policy, controller, and form requests...</span>
php artisan make:model Enrolee --all
<span class="hljs-comment"># OR</span>
php artisan make:model Enrolee -a
</code></pre>
<p>This will generate files, and configuration ready to add properties to the model.</p>
<h3 id="heading-adding-model-properties">Adding model properties</h3>
<p>In <code>app/Models/Enrolees.php</code> file. We can add the following properties to our model.</p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Models</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Database</span>\<span class="hljs-title">Eloquent</span>\<span class="hljs-title">Factories</span>\<span class="hljs-title">HasFactory</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Database</span>\<span class="hljs-title">Eloquent</span>\<span class="hljs-title">Model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Notifications</span>\<span class="hljs-title">Notifiable</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Enrolee</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span>
</span>{
    <span class="hljs-comment">/** <span class="hljs-doctag">@use</span> HasFactory&lt;\Database\Factories\EnroleeFactory&gt; */</span>
    <span class="hljs-keyword">use</span> <span class="hljs-title">HasFactory</span>, <span class="hljs-title">Notifiable</span>;
    <span class="hljs-keyword">protected</span> $table = <span class="hljs-string">'enrolee'</span>;
    <span class="hljs-comment">// Should be true or not set</span>
    <span class="hljs-keyword">public</span> $timestamps = <span class="hljs-literal">true</span>;
    <span class="hljs-keyword">protected</span> $fillable = [
        <span class="hljs-string">'name'</span>,
        <span class="hljs-string">'birthday'</span>,
        <span class="hljs-string">'parent_name'</span>,
        <span class="hljs-string">'parent_relation'</span>,
        <span class="hljs-string">'parent_email'</span>,
        <span class="hljs-string">'student_id'</span>,
        <span class="hljs-string">'parent_contact_number'</span>,
    ];
}
</code></pre>
<p>We added <code>HasFactory</code> and <code>Notifiable</code> trait to allow us to seed fake enrolees and send emails</p>
<p>The <code>$fillable</code> getter is where we construct our object properties.</p>
<h3 id="heading-database-and-migration">Database and Migration</h3>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">We are using Sqlite for our project</div>
</div>

<p>In the <code>database/migrations</code> folder, we will create a new migration.</p>
<pre><code class="lang-bash">php artisan make:migration create_enrolee_table
</code></pre>
<p>Inside the <code>create_enrolee_table.php</code> file</p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Database</span>\<span class="hljs-title">Migrations</span>\<span class="hljs-title">Migration</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Database</span>\<span class="hljs-title">Schema</span>\<span class="hljs-title">Blueprint</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Support</span>\<span class="hljs-title">Facades</span>\<span class="hljs-title">Schema</span>;

<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Migration</span>
</span>{
    <span class="hljs-comment">/**
     * Run the migrations.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">up</span>(<span class="hljs-params"></span>): <span class="hljs-title">void</span>
    </span>{
        Schema::create(<span class="hljs-string">'enrolee'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Blueprint $table</span>) </span>{
            $table-&gt;id();
            $table-&gt;timestamps();
            $table-&gt;string(<span class="hljs-string">'name'</span>);
            $table-&gt;string(<span class="hljs-string">'parent_name'</span>);
            $table-&gt;string(<span class="hljs-string">'parent_email'</span>);
            $table-&gt;string(<span class="hljs-string">'parent_relation'</span>);
            $table-&gt;datetime(<span class="hljs-string">'birthday'</span>);
            $table-&gt;string(<span class="hljs-string">'student_id'</span>)-&gt;nullable();
            $table-&gt;string(<span class="hljs-string">'parent_contact_number'</span>)-&gt;nullable();
        });
    }

    <span class="hljs-comment">/**
     * Reverse the migrations.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">down</span>(<span class="hljs-params"></span>): <span class="hljs-title">void</span>
    </span>{
        Schema::dropIfExists(<span class="hljs-string">'enrolee'</span>);
    }
};
</code></pre>
<p>We have created our own model and its associates. This time, we want to include it to our database migration. Next, we will create a seeder to populate our fake data</p>
<p>Let’s create our seeder file.</p>
<pre><code class="lang-bash">php artisan make:seeder EnroleeSeeder
</code></pre>
<p>Inside the <code>/Database/Seeders/EnroleeSeeder.php</code> file. we will create 10 fake enrolees.</p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">Database</span>\<span class="hljs-title">Seeders</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Database</span>\<span class="hljs-title">Factories</span>\<span class="hljs-title">EnroleeFactory</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Database</span>\<span class="hljs-title">Seeder</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Models</span>\<span class="hljs-title">Enrolee</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EnroleeSeeder</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Seeder</span>
</span>{
    <span class="hljs-comment">/**
     * Run the database seeds.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">run</span>(<span class="hljs-params"></span>): <span class="hljs-title">void</span>
    </span>{
        Enrolee::factory()-&gt;count(<span class="hljs-number">10</span>)-&gt;create();
    }
}
</code></pre>
<p>But we can’t populate fake data in our database without creating our fake data in php. For this, we will create a factory file.</p>
<pre><code class="lang-bash">php artisan make:factory EnroleeFactory
</code></pre>
<p>And in the <code>/Database/factories/EnroleeFactory.php</code> file. we have the model and definition class.</p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">Database</span>\<span class="hljs-title">Factories</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Models</span>\<span class="hljs-title">Enrolee</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Database</span>\<span class="hljs-title">Eloquent</span>\<span class="hljs-title">Factories</span>\<span class="hljs-title">Factory</span>;

<span class="hljs-comment">/**
 * <span class="hljs-doctag">@extends</span> \Illuminate\Database\Eloquent\Factories\Factory&lt;\App\Models\Enrolee&gt;
 */</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EnroleeFactory</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Factory</span>
</span>{


    <span class="hljs-keyword">protected</span> $model = Enrolee::class;
    <span class="hljs-comment">/**
     * Define the model's default state.
     *
     * <span class="hljs-doctag">@return</span> array&lt;string, mixed&gt;
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">definition</span>(<span class="hljs-params"></span>): <span class="hljs-title">array</span>
    </span>{
        <span class="hljs-keyword">return</span> [
            <span class="hljs-string">'name'</span> =&gt;  fake()-&gt;name(),
            <span class="hljs-string">'birthday'</span> =&gt; fake()-&gt;date(),
            <span class="hljs-string">'parent_name'</span> =&gt; fake()-&gt;name(),
            <span class="hljs-string">'parent_email'</span> =&gt; fake()-&gt;email(),
            <span class="hljs-string">'parent_relation'</span> =&gt; <span class="hljs-string">'Guardian'</span>,
            <span class="hljs-string">'student_id'</span> =&gt; fake()-&gt;creditCardNumber(),
            <span class="hljs-string">'parent_contact_number'</span> =&gt; fake()-&gt;phoneNumber(),
        ];
    }
}
</code></pre>
<p>Now we can seed our fake data to database migration.</p>
<pre><code class="lang-bash">php artisan migrate:fresh --seed
</code></pre>
<h3 id="heading-models-for-our-react">Models for our React?</h3>
<p>I asked the same question, why didn’t laravel create models for react too? InertiaJS is responsible for this feature, but I suppose there are libraries out there that generate models and form validation especially with Zod. Let’s just create a basic Enrolee model in our client side application.</p>
<p>Inside <code>/resources/js/types/index.d.ts</code> we will create our Enrolee model written in Typescript.</p>
<pre><code class="lang-typescript">
<span class="hljs-keyword">type</span> EnroleeForm = {
    name: <span class="hljs-built_in">string</span>,
    birthday: <span class="hljs-built_in">string</span>,
    parent_name: <span class="hljs-built_in">string</span>,
    parent_email: <span class="hljs-built_in">string</span>,
    parent_relation: <span class="hljs-built_in">string</span>,
    student_id: <span class="hljs-built_in">string</span>,
    parent_contact_number: <span class="hljs-built_in">string</span>,
}
</code></pre>
<h3 id="heading-controllers">Controllers</h3>
<p>Let’s create our own controllers from Laravel CLI.</p>
<pre><code class="lang-bash">php artisan make:controller EnroleeController
</code></pre>
<p>And inside <code>app/Http/Controllers/EnroleeController.php</code></p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Controllers</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Events</span>\<span class="hljs-title">EnroleeCreated</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Exports</span>\<span class="hljs-title">EnroleesExport</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Requests</span>\<span class="hljs-title">UpdateEnroleeRequest</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Models</span>\<span class="hljs-title">Enrolee</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Notifications</span>\<span class="hljs-title">EnroleeSubmitNotification</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Maatwebsite</span>\<span class="hljs-title">Excel</span>\<span class="hljs-title">Facades</span>\<span class="hljs-title">Excel</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Inertia</span>\<span class="hljs-title">Response</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Support</span>\<span class="hljs-title">Facades</span>\<span class="hljs-title">DB</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Request</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EnroleesController</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">show</span>(<span class="hljs-params"></span>): <span class="hljs-title">Response</span>
    </span>{
        $enrolees = Enrolee::orderBy(<span class="hljs-string">'created_at'</span>, <span class="hljs-string">'desc'</span>)
            -&gt;get([
                <span class="hljs-string">'student_id'</span>,
                <span class="hljs-string">'name'</span>,
                <span class="hljs-string">'birthday'</span>,
                <span class="hljs-string">'parent_name'</span>,
                <span class="hljs-string">'parent_contact_number'</span>,
                <span class="hljs-string">'parent_email'</span>,
                <span class="hljs-string">'created_at'</span>,
                <span class="hljs-string">'parent_relation'</span>,
            ]);

        <span class="hljs-keyword">return</span> inertia(<span class="hljs-string">'enrolees'</span>, [
            <span class="hljs-string">'enrolees'</span> =&gt; [
                <span class="hljs-string">'data'</span> =&gt; $enrolees
            ],
        ]);
    }

    <span class="hljs-comment">/**
     * Display a listing of the resource.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span>(<span class="hljs-params"></span>) </span>{}

    <span class="hljs-comment">/**
     * Show the form for creating a new resource.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">create</span>(<span class="hljs-params">Request $request</span>): <span class="hljs-title">Response</span>
    </span>{
        <span class="hljs-keyword">return</span> inertia(<span class="hljs-string">'enrollment'</span>, [

            <span class="hljs-string">'status'</span> =&gt; $request-&gt;session()-&gt;get(<span class="hljs-string">'status'</span>),
        ]);
    }

    <span class="hljs-comment">/**
     * Store a newly created resource in storage.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">store</span>(<span class="hljs-params">Request $request</span>)
    </span>{

        $enrolee = Enrolee::create([

            <span class="hljs-string">'name'</span> =&gt; $request-&gt;name,
            <span class="hljs-string">'birthday'</span> =&gt; $request-&gt;birthday,
            <span class="hljs-string">'parent_name'</span> =&gt; $request-&gt;parent_name,
            <span class="hljs-string">'parent_email'</span> =&gt; $request-&gt;parent_email,
            <span class="hljs-string">'parent_relation'</span> =&gt; $request-&gt;parent_relation,
            <span class="hljs-string">'student_id'</span> =&gt; $request-&gt;student_id,
            <span class="hljs-string">'parent_contact_number'</span> =&gt; $request-&gt;parent_contact_number,
        ]);
        broadcast(<span class="hljs-keyword">new</span> EnroleeCreated($enrolee));

        $enrolee-&gt;notify(<span class="hljs-keyword">new</span> EnroleeSubmitNotification($enrolee));

        <span class="hljs-comment">// event(new EnroleeCreated($enrolee));</span>

        <span class="hljs-keyword">return</span> redirect(<span class="hljs-string">'/enrolees'</span>);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">submit</span>(<span class="hljs-params">Request $request</span>)
    </span>{

        $enrolee = Enrolee::create([

            <span class="hljs-string">'name'</span> =&gt; $request-&gt;name,
            <span class="hljs-string">'birthday'</span> =&gt; $request-&gt;birthday,
            <span class="hljs-string">'parent_name'</span> =&gt; $request-&gt;parent_name,
            <span class="hljs-string">'parent_email'</span> =&gt; $request-&gt;parent_email,
            <span class="hljs-string">'parent_relation'</span> =&gt; $request-&gt;parent_relation,
            <span class="hljs-string">'student_id'</span> =&gt; $request-&gt;student_id,
            <span class="hljs-string">'parent_contact_number'</span> =&gt; $request-&gt;parent_contact_number,
        ]);

        <span class="hljs-comment">// event(new EnroleeCreated($enrolee));</span>
        broadcast(<span class="hljs-keyword">new</span> EnroleeCreated($enrolee));

        $enrolee-&gt;notify(<span class="hljs-keyword">new</span> EnroleeSubmitNotification($enrolee));


        <span class="hljs-keyword">return</span> back()-&gt;with(<span class="hljs-string">'status'</span>, __(<span class="hljs-string">'We sent a confirmation email of the enrollment form. please check your email.'</span>));
    }

    <span class="hljs-comment">/**
     * Show the form for editing the specified resource.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">edit</span>(<span class="hljs-params">Enrolee $enrolee</span>)
    </span>{
        <span class="hljs-comment">//</span>
    }

    <span class="hljs-comment">/**
     * Update the specified resource in storage.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">update</span>(<span class="hljs-params">UpdateEnroleeRequest $request, Enrolee $enrolee</span>)
    </span>{
        <span class="hljs-comment">//</span>
    }

    <span class="hljs-comment">/**
     * Remove the specified resource from storage.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">destroy</span>(<span class="hljs-params">Enrolee $enrolee</span>)
    </span>{
        $enrolee = DB::table(<span class="hljs-string">'enrolee'</span>)-&gt;delete([
            <span class="hljs-string">"id"</span> =&gt; $enrolee-&gt;id
        ]);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">export</span>(<span class="hljs-params"></span>)
    </span>{
        <span class="hljs-keyword">return</span> Excel::download(<span class="hljs-keyword">new</span> EnroleesExport, <span class="hljs-string">'enrolees.xlsx'</span>,);
    }
}
</code></pre>
<p>This will handle CRUD + Email + Export to spreadsheet file.</p>
<h3 id="heading-mail">Mail</h3>
<p>You can configure the mail setup here. Just pick your poison. <a target="_blank" href="https://laravel.com/docs/12.x/mail#main-content">https://laravel.com/docs/12.x/mail#main-content</a></p>
<p>Afterwards, we can create a new mail file.</p>
<pre><code class="lang-bash">php artisan make:mail EnrollmentSubmitted.php
</code></pre>
<p>Include these code snippet in the <code>/app/Http/Mail/EnrollmentSubmitted.php</code></p>
<p>Be sure to edit <strong>YOUR_EMAIL_ADDRESS</strong> with the email address from mailersend.</p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Mail</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Mail</span>\<span class="hljs-title">Mailables</span>\<span class="hljs-title">Address</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Bus</span>\<span class="hljs-title">Queueable</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Mail</span>\<span class="hljs-title">Mailable</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Mail</span>\<span class="hljs-title">Mailables</span>\<span class="hljs-title">Content</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Mail</span>\<span class="hljs-title">Mailables</span>\<span class="hljs-title">Envelope</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">SerializesModels</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Models</span>\<span class="hljs-title">Enrolee</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Support</span>\<span class="hljs-title">Arr</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">MailerSend</span>\<span class="hljs-title">Helpers</span>\<span class="hljs-title">Builder</span>\<span class="hljs-title">Personalization</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">MailerSend</span>\<span class="hljs-title">LaravelDriver</span>\<span class="hljs-title">MailerSendTrait</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EnrollmentSubmitted</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Mailable</span>
</span>{
    <span class="hljs-keyword">use</span> <span class="hljs-title">Queueable</span>, <span class="hljs-title">SerializesModels</span>, <span class="hljs-title">MailerSendTrait</span>;
    <span class="hljs-comment">/**
     * Create a new message instance.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params"><span class="hljs-keyword">public</span> Enrolee $enrolee</span>) </span>{}

    <span class="hljs-comment">/**
     * Get the message envelope.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">envelope</span>(<span class="hljs-params"></span>): <span class="hljs-title">Envelope</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Envelope(
            subject: <span class="hljs-string">'Enrollment Submitted'</span>,
            <span class="hljs-keyword">from</span>: <span class="hljs-keyword">new</span> Address(env(<span class="hljs-string">'MAIL_FROM_ADDRESS'</span>, <span class="hljs-string">"YOUR_EMAIL_ADDRESS"</span>), env(<span class="hljs-string">'MAIL_FROM_NAME'</span>)),

        );
    }

    <span class="hljs-comment">/**
     * Get the message content definition.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">content</span>(<span class="hljs-params"></span>): <span class="hljs-title">Content</span>
    </span>{

        $to = Arr::get(<span class="hljs-keyword">$this</span>-&gt;to, <span class="hljs-string">'0.address'</span>);

        <span class="hljs-comment">// Additional options for MailerSend API features</span>
        <span class="hljs-keyword">$this</span>-&gt;mailersend(
            template_id: <span class="hljs-string">"3z0vklo822147qrx"</span>,
            tags: [<span class="hljs-string">'laravel-notifications'</span>],
            personalization: [
                <span class="hljs-keyword">new</span> Personalization(
                    $to,
                    [
                        <span class="hljs-string">"name"</span> =&gt; <span class="hljs-keyword">$this</span>-&gt;enrolee-&gt;parent_name,
                        <span class="hljs-string">"account"</span> =&gt; [
                            <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"Enrollmentify"</span>
                        ],
                        <span class="hljs-string">"child_name"</span> =&gt; <span class="hljs-keyword">$this</span>-&gt;enrolee-&gt;name,
                        <span class="hljs-string">"support_email"</span> =&gt; <span class="hljs-string">"YOUR_EMAIL_ADDRESS"</span>

                    ]
                )
            ],
            precedenceBulkHeader: <span class="hljs-literal">true</span>,
        );

        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Content();
    }

    <span class="hljs-comment">/**
     * Get the attachments for the message.
     *
     * <span class="hljs-doctag">@return</span> array&lt;int, \Illuminate\Mail\Mailables\Attachment&gt;
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">attachments</span>(<span class="hljs-params"></span>): <span class="hljs-title">array</span>
    </span>{
        <span class="hljs-keyword">return</span> [];
    }
}
</code></pre>
<h3 id="heading-routeres">Routeres</h3>
<p>The last step for PHP is the routers. we will register this to expose the endpoints to our client side application. Modify our routes in <code>routes/web.php</code></p>
<pre><code class="lang-php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Support</span>\<span class="hljs-title">Facades</span>\<span class="hljs-title">Route</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Inertia</span>\<span class="hljs-title">Inertia</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Controllers</span>\<span class="hljs-title">EnroleesController</span>;


Route::get(<span class="hljs-string">'/'</span>, [EnroleesController::class, <span class="hljs-string">'create'</span>])-&gt;name(<span class="hljs-string">'home'</span>);
Route::post(<span class="hljs-string">'/'</span>, [EnroleesController::class, <span class="hljs-string">'submit'</span>])-&gt;name(<span class="hljs-string">'enrolees.submit'</span>);

Route::get(<span class="hljs-string">'/new'</span>, [EnroleesController::class, <span class="hljs-string">'index'</span>])-&gt;name(<span class="hljs-string">'new'</span>);

Route::middleware([<span class="hljs-string">'auth'</span>, <span class="hljs-string">'verified'</span>])-&gt;group(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    Route::get(<span class="hljs-string">'dashboard'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
        <span class="hljs-keyword">return</span> redirect(<span class="hljs-string">'/enrolees'</span>);
    })-&gt;name(<span class="hljs-string">'dashboard'</span>);

    Route::get(<span class="hljs-string">'/enrolees'</span>, [EnroleesController::class, <span class="hljs-string">'show'</span>]);
    Route::post(<span class="hljs-string">'/enrolees/create'</span>, [EnroleesController::class, <span class="hljs-string">'store'</span>])-&gt;name(<span class="hljs-string">'enrolees.create'</span>);
    Route::get(<span class="hljs-string">'users/export/'</span>, [EnroleesController::class, <span class="hljs-string">'export'</span>])-&gt;name(<span class="hljs-string">'enrolees.export'</span>);
});


<span class="hljs-keyword">require</span> <span class="hljs-keyword">__DIR__</span> . <span class="hljs-string">'/settings.php'</span>;
<span class="hljs-keyword">require</span> <span class="hljs-keyword">__DIR__</span> . <span class="hljs-string">'/auth.php'</span>;
</code></pre>
<ul>
<li><p>The <code>/</code> route is for users who want to view and create form. Inside middleware.</p>
</li>
<li><p>The admin can export enrolees.</p>
</li>
<li><p>The admin can view and create enrolees.</p>
</li>
</ul>
<p>Now that we have setup most of the php files. Let’s get started with React.</p>
<h3 id="heading-pages">Pages</h3>
<p>Let’s create two files in <code>resources/js/pages</code> folder.</p>
<p><strong>enrollment.tsx</strong></p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { EnrollmentForm } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/components/enrollment/form'</span>
<span class="hljs-keyword">import</span> { SharedData } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/types'</span>;
<span class="hljs-keyword">import</span> { Head, Link, usePage, } <span class="hljs-keyword">from</span> <span class="hljs-string">'@inertiajs/react'</span>
<span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">EnrollmentPage</span>(<span class="hljs-params">{ status }: { status?: <span class="hljs-built_in">string</span> }</span>) </span>{
    <span class="hljs-keyword">const</span> { auth } = usePage&lt;SharedData&gt;().props;

    <span class="hljs-keyword">return</span> (
        &lt;&gt;

            &lt;Head title=<span class="hljs-string">"Welcome"</span>&gt;
                &lt;link rel=<span class="hljs-string">"preconnect"</span> href=<span class="hljs-string">"https://fonts.bunny.net"</span> /&gt;
                &lt;link href=<span class="hljs-string">"https://fonts.bunny.net/css?family=instrument-sans:400,500,600"</span> rel=<span class="hljs-string">"stylesheet"</span> /&gt;
            &lt;/Head&gt;
            &lt;div className=<span class="hljs-string">"flex-col items-center  p-6  bg-muted "</span>&gt;
                &lt;header className=<span class="hljs-string">"mb-4 w-full text-sm not-has-[nav]:hidden "</span>&gt;
                    &lt;nav className=<span class="hljs-string">"flex items-center justify-end gap-4"</span>&gt;
                        {auth.user ? (
                            &lt;Link
                                href={route(<span class="hljs-string">'dashboard'</span>)}
                                className=<span class="hljs-string">"inline-block rounded-sm border border-[#19140035] px-5 py-1.5 text-sm leading-normal text-[#1b1b18] hover:border-[#1915014a] dark:border-[#3E3E3A] dark:text-[#EDEDEC] dark:hover:border-[#62605b]"</span>
                            &gt;
                                Dashboard
                            &lt;/Link&gt;
                        ) : (
                            &lt;&gt;
                                &lt;Link
                                    href={route(<span class="hljs-string">'login'</span>)}
                                    className=<span class="hljs-string">"inline-block rounded-sm border border-transparent px-5 py-1.5 text-sm leading-normal text-[#1b1b18] hover:border-[#19140035] dark:text-[#EDEDEC] dark:hover:border-[#3E3E3A]"</span>
                                &gt;
                                    Log <span class="hljs-keyword">in</span>
                                &lt;/Link&gt;
                            &lt;/&gt;
                        )}
                    &lt;/nav&gt;
                &lt;/header&gt;
                &lt;div className=<span class="hljs-string">"flex  items-center justify-center "</span>&gt;
                    &lt;div className=<span class="hljs-string">"w-full max-w-sm md:max-w-3xl"</span>&gt;
                        &lt;EnrollmentForm status={status} /&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/&gt;
    )
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> EnrollmentPage
</code></pre>
<p><strong>enrolees.tsx</strong></p>
<pre><code class="lang-typescript">
<span class="hljs-keyword">import</span> AddEnroleeForm <span class="hljs-keyword">from</span> <span class="hljs-string">'@/components/enrolees/add-enrolee-form'</span>;
<span class="hljs-keyword">import</span> { columns, Enrolee } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/components/enrolees/table/columns'</span>;
<span class="hljs-keyword">import</span> { DataTable } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/components/enrolees/table/data-table'</span>;
<span class="hljs-keyword">import</span> { Button } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/components/ui/button'</span>;
<span class="hljs-keyword">import</span> AppLayout <span class="hljs-keyword">from</span> <span class="hljs-string">'@/layouts/app-layout'</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-keyword">type</span> BreadcrumbItem } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/types'</span>;
<span class="hljs-keyword">import</span> { Head, } <span class="hljs-keyword">from</span> <span class="hljs-string">'@inertiajs/react'</span>;
<span class="hljs-keyword">import</span> { Printer } <span class="hljs-keyword">from</span> <span class="hljs-string">'lucide-react'</span>;

<span class="hljs-keyword">const</span> breadcrumbs: BreadcrumbItem[] = [
    {
        title: <span class="hljs-string">'Enrolees'</span>,
        href: <span class="hljs-string">'/enrolees'</span>,
    },
];



<span class="hljs-keyword">type</span> Props = {
    enrolees: {

        data: Enrolee[],
        current_page: <span class="hljs-built_in">number</span>,
        next_page_url: <span class="hljs-built_in">string</span>,
        prev_page_url: <span class="hljs-built_in">string</span>,
        total: <span class="hljs-built_in">number</span>,
        <span class="hljs-keyword">from</span>: <span class="hljs-built_in">number</span>,
        to: <span class="hljs-built_in">number</span>,
    }

}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Enrolees</span>(<span class="hljs-params">{ enrolees }: Props</span>) </span>{

    <span class="hljs-built_in">console</span>.log(enrolees);
    <span class="hljs-comment">// useEcho(`enrolees`, 'EnroleeCreated', (payload: Enrolee) =&gt; {</span>
    <span class="hljs-comment">//     console.log(payload);</span>
    <span class="hljs-comment">// });</span>

    <span class="hljs-keyword">return</span> (
        &lt;AppLayout breadcrumbs={breadcrumbs}&gt;
            &lt;Head title=<span class="hljs-string">"Enrolee"</span> /&gt;
            &lt;div className=<span class="hljs-string">"flex flex-row"</span>&gt;

                &lt;AddEnroleeForm /&gt;
                &lt;div className=<span class="hljs-string">"px-2 py-4"</span>&gt;
                    &lt;Button className=<span class="hljs-string">"bg-green-600"</span> onClick={<span class="hljs-function">() =&gt;</span> {

                        <span class="hljs-built_in">window</span>.location.href = route(<span class="hljs-string">'enrolees.export'</span>);
                    }}&gt;&lt;Printer color=<span class="hljs-string">'white'</span>&gt;&lt;/Printer&gt; Print
                    &lt;/Button&gt;
                &lt;/div&gt;

            &lt;/div&gt;
            &lt;div className=<span class="hljs-string">'px-4 py-4'</span>&gt;

                &lt;DataTable columns={columns}
                    data={enrolees.data}
                /&gt;

            &lt;/div&gt;
        &lt;/AppLayout&gt;
    );
}
</code></pre>
<h3 id="heading-components">Components</h3>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">The react starter kit uses radix or shadcn under the hood. by folowing the documentation in <a target="_self" href="https://ui.shadcn.com/docs/">https://ui.shadcn.com/docs/</a></div>
</div>

<p>You can add as many components as you want. Here’s the list I added</p>
<ul>
<li><p><a target="_blank" href="https://ui.shadcn.com/docs/components/dialog">Dialog</a></p>
</li>
<li><p><a target="_blank" href="https://ui.shadcn.com/docs/components/data-table">Data Table</a></p>
</li>
</ul>
<p>We’ll create components so the pages can read those files.</p>
<p>Create <code>resources/js/components/enrollment.tsx</code></p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { cn, onPaste, validateNumber } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/lib/utils"</span>
<span class="hljs-keyword">import</span> { Button } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/button"</span>
<span class="hljs-keyword">import</span> { Card, CardContent } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/card"</span>
<span class="hljs-keyword">import</span> { Input } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/input"</span>
<span class="hljs-keyword">import</span> { Label } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/label"</span>
<span class="hljs-keyword">import</span> { useForm } <span class="hljs-keyword">from</span> <span class="hljs-string">"@inertiajs/react"</span>
<span class="hljs-keyword">import</span> { EnroleeForm } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/types"</span>
<span class="hljs-keyword">import</span> { FormEventHandler } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>
<span class="hljs-keyword">import</span> InputError <span class="hljs-keyword">from</span> <span class="hljs-string">"../input-error"</span>

<span class="hljs-keyword">type</span> EnrollmentFormProps = {
    status?: <span class="hljs-built_in">string</span>,
} &amp; React.ComponentProps&lt;<span class="hljs-string">"div"</span>&gt;;
<span class="hljs-keyword">export</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">EnrollmentForm</span>(<span class="hljs-params">{
    className,
    ...props
}: EnrollmentFormProps</span>) </span>{
    <span class="hljs-keyword">const</span> { data, setData, post, processing, reset, errors, clearErrors } = useForm&lt;Required&lt;EnroleeForm&gt;&gt;({
        name: <span class="hljs-string">''</span>,
        parent_email: <span class="hljs-string">'vinceramcesoliveros@gmail.com'</span>,
        parent_relation: <span class="hljs-string">''</span>,
        parent_name: <span class="hljs-string">''</span>,
        parent_contact_number: <span class="hljs-string">''</span>,
        birthday: <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toISOString().split(<span class="hljs-string">'T'</span>)[<span class="hljs-number">0</span>],
        student_id: <span class="hljs-string">''</span>,
    });
    <span class="hljs-keyword">const</span> submit: FormEventHandler = <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {
        e.preventDefault();

        post(route(<span class="hljs-string">'enrolees.submit'</span>), {
            onFinish: <span class="hljs-function">() =&gt;</span> {
                <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'From EnrollmentFormProps:'</span>, props.status);
            },
            onSuccess: <span class="hljs-function">() =&gt;</span> {
                clear();
            },
            onError: <span class="hljs-function">() =&gt;</span> <span class="hljs-built_in">console</span>.error(errors)
        })

    };
    <span class="hljs-keyword">const</span> clear = <span class="hljs-function">() =&gt;</span> {
        clearErrors();
        reset();
    };

    <span class="hljs-keyword">return</span> (
        &lt;div className={cn(<span class="hljs-string">"flex flex-col gap-6"</span>, className)} {...props}&gt;
            &lt;Card className=<span class="hljs-string">"overflow-hidden"</span>&gt;
                &lt;CardContent className=<span class="hljs-string">"grid p-0 md:grid-cols-2"</span>&gt;
                    &lt;form className=<span class="hljs-string">"flex flex-col gap-4 p-6 md:p-8"</span> onSubmit={submit}&gt;
                        &lt;div className=<span class="hljs-string">"flex flex-col items-center text-center"</span>&gt;
                            &lt;h1 className=<span class="hljs-string">"text-2xl font-bold"</span>&gt;Enroll now!&lt;/h1&gt;
                            &lt;p className=<span class="hljs-string">"text-balance text-muted-foreground"</span>&gt;
                                Enrollment is on-going until school starts.
                            &lt;/p&gt;
                        &lt;/div&gt;
                        &lt;div className=<span class="hljs-string">"grid gap-4"</span>&gt;
                            &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                                &lt;Label htmlFor=<span class="hljs-string">"student_id"</span>&gt;LRN or Student ID&lt;/Label&gt;
                                &lt;Input
                                    id=<span class="hljs-string">"student_id"</span>
                                    required
                                    tabIndex={<span class="hljs-number">1</span>}
                                    autoFocus
                                    autoComplete=<span class="hljs-string">"student_id"</span>
                                    value={data.student_id}
                                    onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'student_id'</span>, e.target.value)}
                                    disabled={processing}
                                    placeholder=<span class="hljs-string">"LRN or Student ID"</span>
                                    min={<span class="hljs-number">1</span>}
                                    maxLength={<span class="hljs-number">10</span>}
                                    onKeyDown={validateNumber}
                                    onPaste={onPaste}
                                /&gt;
                                &lt;InputError message={errors.student_id} className=<span class="hljs-string">"mt-2"</span> /&gt;
                            &lt;/div&gt;
                            &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                                &lt;Label htmlFor=<span class="hljs-string">"name"</span>&gt;Enrolee Name&lt;/Label&gt;
                                &lt;Input
                                    id=<span class="hljs-string">"name"</span>
                                    <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                    required
                                    tabIndex={<span class="hljs-number">2</span>}
                                    autoComplete=<span class="hljs-string">"name"</span>
                                    value={data.name}
                                    onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'name'</span>, e.target.value)}
                                    disabled={processing}
                                    placeholder=<span class="hljs-string">"Full name"</span>

                                /&gt;
                                &lt;InputError message={errors.name} className=<span class="hljs-string">"mt-2"</span> /&gt;
                            &lt;/div&gt;
                            &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                                &lt;Label htmlFor=<span class="hljs-string">"birthday"</span>&gt;Birth date&lt;/Label&gt;
                                &lt;Input
                                    id=<span class="hljs-string">"birthday"</span>
                                    <span class="hljs-keyword">type</span>=<span class="hljs-string">"date"</span>
                                    required
                                    tabIndex={<span class="hljs-number">3</span>}
                                    value={data.birthday}
                                    onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'birthday'</span>, e.target.value)}
                                    disabled={processing}
                                    placeholder=<span class="hljs-string">"Birthday"</span>
                                /&gt;
                                &lt;InputError message={errors.birthday} /&gt;
                            &lt;/div&gt;

                            &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                                &lt;Label htmlFor=<span class="hljs-string">"parent_name"</span>&gt;Parent name&lt;/Label&gt;
                                &lt;Input
                                    id=<span class="hljs-string">"parent_name"</span>
                                    <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                    required
                                    tabIndex={<span class="hljs-number">4</span>}
                                    value={data.parent_name}
                                    onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_name'</span>, e.target.value)}
                                    disabled={processing}
                                    placeholder=<span class="hljs-string">"Parent name"</span>
                                /&gt;
                                &lt;InputError message={errors.parent_name} /&gt;
                            &lt;/div&gt;

                            &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                                &lt;Label htmlFor=<span class="hljs-string">"parent_contact_number"</span>&gt;Parent contact <span class="hljs-built_in">number</span>&lt;/Label&gt;
                                &lt;Input
                                    id=<span class="hljs-string">"parent_contact_number"</span>
                                    <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                    required
                                    tabIndex={<span class="hljs-number">5</span>}
                                    autoComplete=<span class="hljs-string">"parent_contact_number"</span>
                                    value={data.parent_contact_number}
                                    onKeyDown={validateNumber}
                                    onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_contact_number'</span>, e.target.value)}
                                    disabled={processing}
                                    placeholder=<span class="hljs-string">"+16 245 485 499"</span>
                                /&gt;
                                &lt;InputError message={errors.parent_contact_number} /&gt;
                            &lt;/div&gt;

                            &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                                &lt;Label htmlFor=<span class="hljs-string">"parent_email"</span>&gt;Parent email address&lt;/Label&gt;
                                &lt;Input
                                    id=<span class="hljs-string">"parent_email"</span>
                                    <span class="hljs-keyword">type</span>=<span class="hljs-string">"email"</span>
                                    required
                                    tabIndex={<span class="hljs-number">6</span>}
                                    autoComplete=<span class="hljs-string">"parent_email"</span>
                                    value={data.parent_email}
                                    onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_email'</span>, e.target.value)}
                                    disabled={processing}
                                    placeholder=<span class="hljs-string">"email@example.com"</span>
                                /&gt;
                                &lt;InputError message={errors.parent_email} /&gt;
                            &lt;/div&gt;

                            &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                                &lt;Label htmlFor=<span class="hljs-string">"parentRelation"</span>&gt;Parent Relationship&lt;/Label&gt;
                                &lt;Input
                                    id=<span class="hljs-string">"parent_relation"</span>
                                    <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                    required
                                    tabIndex={<span class="hljs-number">7</span>}
                                    value={data.parent_relation}
                                    onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_relation'</span>, e.target.value)}
                                    disabled={processing}
                                    placeholder=<span class="hljs-string">"E.g. (Mother Father Guardian)"</span>
                                /&gt;
                                &lt;InputError message={errors.parent_relation} /&gt;
                            &lt;/div&gt;

                            {props.status &amp;&amp; &lt;div className=<span class="hljs-string">"mb-4 text-center text-sm font-medium text-green-600"</span>&gt;{props.status}&lt;/div&gt;}

                            &lt;Button variant=<span class="hljs-string">"default"</span> disabled={processing} asChild&gt;
                                &lt;button <span class="hljs-keyword">type</span>=<span class="hljs-string">"submit"</span>&gt;Submit&lt;/button&gt;
                            &lt;/Button&gt;
                        &lt;/div&gt;
                    &lt;/form&gt;
                    &lt;div className=<span class="hljs-string">"relative hidden md:block"</span>&gt;
                        &lt;img
                            src=<span class="hljs-string">"/placeholder.jpg"</span>
                            alt=<span class="hljs-string">"Image"</span>
                            className=<span class="hljs-string">"absolute inset-0 h-full w-full object-fill px-2"</span>
                        /&gt;
                    &lt;/div&gt;
                &lt;/CardContent&gt;
            &lt;/Card&gt;
            &lt;div className=<span class="hljs-string">"text-balance text-center text-xs text-muted-foreground [&amp;_a]:underline [&amp;_a]:underline-offset-4 hover:[&amp;_a]:text-primary"</span>&gt;
                By clicking <span class="hljs-keyword">continue</span>, you agree to our &lt;a href=<span class="hljs-string">"#"</span>&gt;Terms <span class="hljs-keyword">of</span> Service&lt;/a&gt;{<span class="hljs-string">" "</span>}
                and &lt;a href=<span class="hljs-string">"#"</span>&gt;Privacy Policy&lt;/a&gt;.
            &lt;/div&gt;
        &lt;/div&gt;
    )
}
</code></pre>
<p>And in <code>resources/js/components/enrolees/add-enrolee-form.tsx</code></p>
<pre><code class="lang-typescript">
<span class="hljs-keyword">import</span> React, { FormEventHandler } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>

<span class="hljs-keyword">import</span> { Button } <span class="hljs-keyword">from</span> <span class="hljs-string">'../ui/button'</span>;
<span class="hljs-keyword">import</span> { useForm } <span class="hljs-keyword">from</span> <span class="hljs-string">'@inertiajs/react'</span>;
<span class="hljs-keyword">import</span> { Label } <span class="hljs-keyword">from</span> <span class="hljs-string">'../ui/label'</span>;
<span class="hljs-keyword">import</span> InputError <span class="hljs-keyword">from</span> <span class="hljs-string">'../input-error'</span>;
<span class="hljs-keyword">import</span> { Dialog, DialogClose, DialogContent, DialogFooter, DialogTitle, DialogTrigger } <span class="hljs-keyword">from</span> <span class="hljs-string">'../ui/dialog'</span>;
<span class="hljs-keyword">import</span> { Input } <span class="hljs-keyword">from</span> <span class="hljs-string">'../ui/input'</span>;
<span class="hljs-keyword">import</span> { EnroleeForm } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/types'</span>;
<span class="hljs-keyword">import</span> { onPaste, validateNumber } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/lib/utils'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">AddEnroleeForm</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">const</span> { data, setData, post, processing, reset, errors, clearErrors } = useForm&lt;Required&lt;EnroleeForm&gt;&gt;({
        name: <span class="hljs-string">''</span>,
        parent_email: <span class="hljs-string">'vinceramcesoliveros@gmail.com'</span>,
        parent_relation: <span class="hljs-string">''</span>,
        parent_name: <span class="hljs-string">''</span>,
        parent_contact_number: <span class="hljs-string">''</span>,
        birthday: <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toISOString().split(<span class="hljs-string">'T'</span>)[<span class="hljs-number">0</span>],
        student_id: <span class="hljs-string">''</span>,
    });
    <span class="hljs-keyword">const</span> submit: FormEventHandler = <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {
        e.preventDefault();
        post(route(<span class="hljs-string">'enrolees.create'</span>), {
            onSuccess: <span class="hljs-function">() =&gt;</span> {
                closeModal();
            },
            onError: <span class="hljs-function">() =&gt;</span> <span class="hljs-built_in">console</span>.error(errors)
        })

    };
    <span class="hljs-keyword">const</span> closeModal = <span class="hljs-function">() =&gt;</span> {
        clearErrors();
        reset();
    };



    <span class="hljs-keyword">return</span> (
        &lt;Dialog &gt;
            &lt;DialogTrigger asChild&gt;
                &lt;div className=<span class="hljs-string">"p-4"</span>&gt;
                    &lt;Button &gt;Add Enrolee&lt;/Button&gt;
                &lt;/div&gt;
            &lt;/DialogTrigger&gt;
            &lt;DialogContent&gt;
                &lt;DialogTitle&gt;Add enrolee&lt;/DialogTitle&gt;
                &lt;form className=<span class="hljs-string">"flex flex-col gap-4"</span> onSubmit={submit}&gt;
                    &lt;div className=<span class="hljs-string">"grid gap-4"</span>&gt;

                        &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                            &lt;Label htmlFor=<span class="hljs-string">"student_id"</span>&gt;LRN or Student ID&lt;/Label&gt;
                            &lt;Input
                                id=<span class="hljs-string">"student_id"</span>
                                required
                                tabIndex={<span class="hljs-number">1</span>}
                                autoFocus
                                autoComplete=<span class="hljs-string">"student_id"</span>
                                value={data.student_id}
                                onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'student_id'</span>, e.target.value)}
                                disabled={processing}
                                placeholder=<span class="hljs-string">"LRN or Student ID"</span>
                                min={<span class="hljs-number">1</span>}
                                maxLength={<span class="hljs-number">10</span>}
                                onKeyDown={validateNumber}
                                onPaste={onPaste}
                            /&gt;
                            &lt;InputError message={errors.student_id} className=<span class="hljs-string">"mt-2"</span> /&gt;
                        &lt;/div&gt;
                        &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                            &lt;Label htmlFor=<span class="hljs-string">"name"</span>&gt;Enrolee Name&lt;/Label&gt;
                            &lt;Input
                                id=<span class="hljs-string">"name"</span>
                                <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                required
                                tabIndex={<span class="hljs-number">2</span>}
                                autoComplete=<span class="hljs-string">"name"</span>
                                value={data.name}
                                onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'name'</span>, e.target.value)}
                                disabled={processing}
                                placeholder=<span class="hljs-string">"Full name"</span>

                            /&gt;
                            &lt;InputError message={errors.name} className=<span class="hljs-string">"mt-2"</span> /&gt;
                        &lt;/div&gt;
                        &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                            &lt;Label htmlFor=<span class="hljs-string">"birthday"</span>&gt;Birth date&lt;/Label&gt;
                            &lt;Input
                                id=<span class="hljs-string">"birthday"</span>
                                <span class="hljs-keyword">type</span>=<span class="hljs-string">"date"</span>
                                required
                                tabIndex={<span class="hljs-number">3</span>}
                                value={data.birthday}
                                onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'birthday'</span>, e.target.value)}
                                disabled={processing}
                                placeholder=<span class="hljs-string">"Birthday"</span>
                            /&gt;
                            &lt;InputError message={errors.birthday} /&gt;
                        &lt;/div&gt;

                        &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                            &lt;Label htmlFor=<span class="hljs-string">"parent_name"</span>&gt;Parent name&lt;/Label&gt;
                            &lt;Input
                                id=<span class="hljs-string">"parent_name"</span>
                                <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                required
                                tabIndex={<span class="hljs-number">4</span>}
                                value={data.parent_name}
                                onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_name'</span>, e.target.value)}
                                disabled={processing}
                                placeholder=<span class="hljs-string">"Parent name"</span>
                            /&gt;
                            &lt;InputError message={errors.parent_name} /&gt;
                        &lt;/div&gt;

                        &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                            &lt;Label htmlFor=<span class="hljs-string">"parent_contact_number"</span>&gt;Parent contact <span class="hljs-built_in">number</span>&lt;/Label&gt;
                            &lt;Input
                                id=<span class="hljs-string">"parent_contact_number"</span>
                                <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                required
                                tabIndex={<span class="hljs-number">5</span>}
                                autoComplete=<span class="hljs-string">"parent_contact_number"</span>
                                value={data.parent_contact_number}
                                onKeyDown={validateNumber}
                                onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_contact_number'</span>, e.target.value)}
                                disabled={processing}
                                placeholder=<span class="hljs-string">"+16 245 485 499"</span>
                            /&gt;
                            &lt;InputError message={errors.parent_contact_number} /&gt;
                        &lt;/div&gt;

                        &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                            &lt;Label htmlFor=<span class="hljs-string">"parent_email"</span>&gt;Parent email address&lt;/Label&gt;
                            &lt;Input
                                id=<span class="hljs-string">"parent_email"</span>
                                <span class="hljs-keyword">type</span>=<span class="hljs-string">"email"</span>
                                required
                                tabIndex={<span class="hljs-number">6</span>}
                                autoComplete=<span class="hljs-string">"parent_email"</span>
                                value={data.parent_email}
                                onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_email'</span>, e.target.value)}
                                disabled={processing}
                                placeholder=<span class="hljs-string">"email@example.com"</span>
                            /&gt;
                            &lt;InputError message={errors.parent_email} /&gt;
                        &lt;/div&gt;

                        &lt;div className=<span class="hljs-string">"grid gap-2"</span>&gt;
                            &lt;Label htmlFor=<span class="hljs-string">"parentRelation"</span>&gt;Parent Relationship&lt;/Label&gt;
                            &lt;Input
                                id=<span class="hljs-string">"parent_relation"</span>
                                <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span>
                                required
                                tabIndex={<span class="hljs-number">7</span>}
                                value={data.parent_relation}
                                onChange={<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> setData(<span class="hljs-string">'parent_relation'</span>, e.target.value)}
                                disabled={processing}
                                placeholder=<span class="hljs-string">"E.g. (Mother Father Guardian)"</span>
                            /&gt;
                            &lt;InputError message={errors.parent_relation} /&gt;
                        &lt;/div&gt;
                        &lt;DialogFooter className=<span class="hljs-string">"gap-2"</span>&gt;
                            &lt;DialogClose asChild&gt;
                                &lt;Button variant=<span class="hljs-string">"secondary"</span> onClick={closeModal}&gt;
                                    Cancel
                                &lt;/Button&gt;
                            &lt;/DialogClose&gt;
                            &lt;DialogClose asChild&gt;

                                &lt;Button variant=<span class="hljs-string">"default"</span> disabled={processing} asChild&gt;
                                    &lt;button <span class="hljs-keyword">type</span>=<span class="hljs-string">"submit"</span>&gt;Add enrolee&lt;/button&gt;
                                &lt;/Button&gt;
                            &lt;/DialogClose&gt;
                        &lt;/DialogFooter&gt;
                    &lt;/div&gt;
                &lt;/form&gt;
            &lt;/DialogContent&gt;
        &lt;/Dialog&gt;

    )
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> AddEnroleeForm
</code></pre>
<h3 id="heading-tables">Tables</h3>
<p>We can create tables along with columns.</p>
<p><code>resources/js/components/enrolees/table/data-table.tsx</code></p>
<pre><code class="lang-typescript">
<span class="hljs-keyword">import</span> {
    ColumnDef,
    ColumnFiltersState,
    flexRender,
    getCoreRowModel,
    getFilteredRowModel,
    getPaginationRowModel,
    SortingState,
    useReactTable,
} <span class="hljs-keyword">from</span> <span class="hljs-string">"@tanstack/react-table"</span>

<span class="hljs-keyword">import</span> {
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
} <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/table"</span>
<span class="hljs-keyword">import</span> { Button } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/button"</span>
<span class="hljs-keyword">import</span> { useState } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>
<span class="hljs-keyword">import</span> { Input } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/input"</span>

<span class="hljs-keyword">interface</span> DataTableProps&lt;TData, TValue&gt; {
    columns: ColumnDef&lt;TData, TValue&gt;[]
    data: TData[],
}

<span class="hljs-keyword">export</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">DataTable</span>&lt;<span class="hljs-title">TData</span>, <span class="hljs-title">TValue</span>&gt;(<span class="hljs-params">{
    columns,
    data,

}: DataTableProps&lt;TData, TValue&gt;</span>) </span>{

    <span class="hljs-keyword">const</span> [columnFilters, setColumnFilters] = useState&lt;ColumnFiltersState&gt;(
        []
    );
    <span class="hljs-keyword">const</span> [sorting] = useState&lt;SortingState&gt;([])

    <span class="hljs-keyword">const</span> table = useReactTable({
        data,
        columns,
        getCoreRowModel: getCoreRowModel(),
        getPaginationRowModel: getPaginationRowModel(),
        pageCount: data.length,
        onColumnFiltersChange: setColumnFilters,
        getFilteredRowModel: getFilteredRowModel(),
        state: {
            sorting,
            columnFilters,
        },


    })

    <span class="hljs-keyword">return</span> (
        &lt;&gt;

            &lt;div className=<span class="hljs-string">"flex items-center py-4"</span>&gt;
                &lt;Input
                    placeholder=<span class="hljs-string">"Filter name..."</span>
                    value={(table.getColumn(<span class="hljs-string">"name"</span>)?.getFilterValue() <span class="hljs-keyword">as</span> <span class="hljs-built_in">string</span>) ?? <span class="hljs-string">""</span>}
                    onChange={<span class="hljs-function">(<span class="hljs-params">event</span>) =&gt;</span>
                        table.getColumn(<span class="hljs-string">"name"</span>)?.setFilterValue(event.target.value)
                    }
                    className=<span class="hljs-string">"max-w-sm"</span>
                /&gt;
            &lt;/div&gt;
            &lt;div className=<span class="hljs-string">"rounded-md border"</span>&gt;

                &lt;Table&gt;
                    &lt;TableHeader&gt;
                        {table.getHeaderGroups().map(<span class="hljs-function">(<span class="hljs-params">headerGroup</span>) =&gt;</span> (
                            &lt;TableRow key={headerGroup.id}&gt;
                                {headerGroup.headers.map(<span class="hljs-function">(<span class="hljs-params">header</span>) =&gt;</span> {
                                    <span class="hljs-keyword">return</span> (
                                        &lt;TableHead key={header.id}&gt;
                                            {header.isPlaceholder
                                                ? <span class="hljs-literal">null</span>
                                                : flexRender(
                                                    header.column.columnDef.header,
                                                    header.getContext()
                                                )}
                                        &lt;/TableHead&gt;
                                    )
                                })}
                            &lt;/TableRow&gt;
                        ))}
                    &lt;/TableHeader&gt;
                    &lt;TableBody&gt;
                        {table.getRowModel().rows?.length ? (
                            table.getRowModel().rows.map(<span class="hljs-function">(<span class="hljs-params">row</span>) =&gt;</span> (
                                &lt;TableRow
                                    key={row.id}
                                    data-state={row.getIsSelected() &amp;&amp; <span class="hljs-string">"selected"</span>}
                                &gt;
                                    {row.getVisibleCells().map(<span class="hljs-function">(<span class="hljs-params">cell</span>) =&gt;</span> (
                                        &lt;TableCell key={cell.id}&gt;
                                            {flexRender(cell.column.columnDef.cell, cell.getContext())}
                                        &lt;/TableCell&gt;
                                    ))}
                                &lt;/TableRow&gt;
                            ))
                        ) : (
                            &lt;TableRow&gt;
                                &lt;TableCell colSpan={columns?.length ?? <span class="hljs-number">0</span>} className=<span class="hljs-string">"h-24 text-center"</span>&gt;
                                    No results.
                                &lt;/TableCell&gt;
                            &lt;/TableRow&gt;
                        )}
                    &lt;/TableBody&gt;
                &lt;/Table&gt;
            &lt;/div&gt;

            &lt;div className=<span class="hljs-string">"flex items-center justify-end space-x-2 py-4"</span>&gt;
                &lt;div className=<span class="hljs-string">"flex-1 text-sm text-muted-foreground"</span>&gt;
                    {table.getFilteredSelectedRowModel().rows.length} <span class="hljs-keyword">of</span>{<span class="hljs-string">" "</span>}
                    {table.getFilteredRowModel().rows.length} row(s) selected.
                &lt;/div&gt;
                &lt;div className=<span class="hljs-string">"space-x-2"</span>&gt;
                    &lt;Button
                        variant=<span class="hljs-string">"outline"</span>
                        size=<span class="hljs-string">"sm"</span>
                        onClick={<span class="hljs-function">() =&gt;</span> table.previousPage()}
                        disabled={!table.getCanPreviousPage()}
                    &gt;
                        Previous
                    &lt;/Button&gt;
                    &lt;Button
                        variant=<span class="hljs-string">"outline"</span>
                        size=<span class="hljs-string">"sm"</span>
                        onClick={<span class="hljs-function">() =&gt;</span> table.nextPage()}
                        disabled={!table.getCanNextPage()}
                    &gt;
                        Next
                    &lt;/Button&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/&gt;
    );
}
</code></pre>
<p><code>resources/js/components/enrolees/table/columns.tsx</code></p>
<pre><code class="lang-typescript"><span class="hljs-string">"use client"</span>

<span class="hljs-keyword">import</span> { ColumnDef } <span class="hljs-keyword">from</span> <span class="hljs-string">"@tanstack/react-table"</span>

<span class="hljs-comment">// This type is used to define the shape of our data.</span>
<span class="hljs-comment">// You can use a Zod schema here if you want.</span>
<span class="hljs-keyword">export</span> <span class="hljs-keyword">type</span> Enrolee = {
    id: <span class="hljs-built_in">number</span>
    name: <span class="hljs-built_in">string</span>,
    birthday: <span class="hljs-built_in">string</span>,
    parent_name: <span class="hljs-built_in">string</span>,
    parent_email: <span class="hljs-built_in">string</span>
    parent_relation: <span class="hljs-built_in">string</span>,
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> columns: ColumnDef&lt;Enrolee&gt;[] = [
    {
        accessorKey: <span class="hljs-string">"student_id"</span>,
        header: <span class="hljs-string">"Student ID"</span>,
        maxSize: <span class="hljs-number">128</span>,
    },
    {
        accessorKey: <span class="hljs-string">"name"</span>,
        header: <span class="hljs-string">"Child name"</span>,
        maxSize: <span class="hljs-number">128</span>,
    },

    {
        accessorKey: <span class="hljs-string">"birthday"</span>,
        header: <span class="hljs-string">"Birthday"</span>,
        maxSize: <span class="hljs-number">128</span>,
        cell: <span class="hljs-function">(<span class="hljs-params">data</span>) =&gt;</span> {
            <span class="hljs-keyword">const</span> val = data.getValue() <span class="hljs-keyword">as</span> <span class="hljs-built_in">string</span>;
            <span class="hljs-keyword">const</span> date = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(val);
            <span class="hljs-keyword">return</span> date.toLocaleDateString();
        }

    },

    {
        accessorKey: <span class="hljs-string">"parent_contact_number"</span>,
        header: <span class="hljs-string">"Parent Contact Number"</span>,
        maxSize: <span class="hljs-number">128</span>,
    },
    {
        accessorKey: <span class="hljs-string">"parent_name"</span>,
        header: <span class="hljs-string">"Parent Name"</span>,
        maxSize: <span class="hljs-number">128</span>,
    },
    {
        accessorKey: <span class="hljs-string">"parent_email"</span>,
        header: <span class="hljs-string">"Parent Email"</span>,
        maxSize: <span class="hljs-number">128</span>,
    },
    {
        accessorKey: <span class="hljs-string">"parent_relation"</span>,
        header: <span class="hljs-string">"Parent Relationship"</span>,
        maxSize: <span class="hljs-number">128</span>,
    },
]
</code></pre>
<h3 id="heading-output">Output</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749472032144/c10cb56c-1a59-4834-8638-3e9aca0c1750.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749472015333/b3433995-c316-4943-b17b-30c026807996.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749472003008/17c3b02f-d878-4540-b3b5-bf3e2a1fb116.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Although, this is not how I typically work on development. There are trial and errors I have been doing and a lot of reading documentation. The lesson for me is, hard work pays off. The sad thing is, I didn’t get hired over working this system and I hope that I can be as fast as iterating this feature, including proper documentation and architecture.</p>
<p>With the rise of LLMs, MCPs, Agentic coding, and other buzzwords. It would be faster for me to iterate as long as I know the tool that I’m working on.</p>
]]></content:encoded></item><item><title><![CDATA[Luxury of time and recovering from burn out]]></title><description><![CDATA[It all started when I dreamed of earning lots of money to be able to purchase things that I want to try. At first, it was fulfilling to enjoy things I bought. A few weeks later, I was out of focus because I couldn’t manage my time handling tasks whet...]]></description><link>https://vinceramcesoliveros.dev/luxury-of-time-and-recovering-from-burn-out</link><guid isPermaLink="true">https://vinceramcesoliveros.dev/luxury-of-time-and-recovering-from-burn-out</guid><category><![CDATA[burnout]]></category><category><![CDATA[Burnout recovery]]></category><category><![CDATA[Traveling]]></category><category><![CDATA[mountains]]></category><category><![CDATA[Solo Travel]]></category><category><![CDATA[Motorcycle]]></category><category><![CDATA[dota 2]]></category><category><![CDATA[self-help]]></category><category><![CDATA[Time management]]></category><dc:creator><![CDATA[Vince Ramces Oliveros]]></dc:creator><pubDate>Fri, 17 Jan 2025 10:15:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1737109817701/f8e7c817-5658-4323-8e9f-623fa2cfe5b6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It all started when I dreamed of earning lots of money to be able to purchase things that I want to try. At first, it was fulfilling to enjoy things I bought. A few weeks later, I was out of focus because I couldn’t manage my time handling tasks whether it was during my work hours or in my free time. I couldn’t figure it out as I was running out of time and doing tasks from my work. I began to breakdown really hard.</p>
<h2 id="heading-a-good-long-investment-playable-pc">A good, long investment, playable PC</h2>
<p>This was my dream of having a PC just to play games like what I wanted in my early teenage life. I was expecting to do other things like learning how to use Blender, Video editing and learn game development. I thought for sure that I could manage my time doing these. It did not go so well.</p>
<h2 id="heading-accomplishments-in-dota-2">Accomplishments in DotA 2</h2>
<p>Once I clocked out on my full time job, I really got pumped up and wanted to play DotA 2 for 1-2 games per day on weekdays, and 8-10 games on weekends. I reached Immortal in just a month and I wonder if I could reach the maximum potential and be at the top 5,000 ranking players in South East Asia.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737102152628/2811ef5f-fc4d-4f6d-b49e-bd0c007bc00c.png" alt class="image--center mx-auto" /></p>
<p>I played Position 4/5 most of the time because thats the quickest queue I can tolerate and have fun. I remove toxicity and just mute them. Then again, It’s just me having frustration about the skills I have and I blame myself for doing so. This was the moment that I knew recently that I have changed and how it affects my work and passion for problem solving.</p>
<h2 id="heading-excuses-tardiness-and-mentalphysical-health">Excuses, Tardiness, and Mental/Physical Health</h2>
<p>It didn’t go well at one point that my peripherals got wet because of leaking rain water from my roof on a stormy midnight. I panicked and tried my best to recover them and work whenever possible. I just said to my Team lead that everything is fine and I thought that was the case. Ever since then, I started to be wary of my room and repair any leakage.</p>
<p>There were times that I took care of a lost cat. Then I started sneezing and coughing quite a lot because of the furs and allergies. I wasn’t focusing on my job and I think it degraded me awfully.</p>
<p>I really like my company because of the culture they have, I learned a lot of things and courtesy of a working adult on a work from home environment. I also learned a lot of things from my circle especially they have a good reputation of doing community talks. I joined these community to inspire and give talk to them.</p>
<p><strong>But as the saying goes.</strong></p>
<p><img src="https://images.unsplash.com/photo-1642179715424-7ffdc1cb2c92?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.0.3&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="A visible rotten fruit is always segregated from others" /></p>
<p><em>A visible rotten fruit is always segregated from others.</em></p>
<h2 id="heading-part-ways-and-unexpected-journey">Part ways, and unexpected journey</h2>
<p>I got pressured with the bugs I created that I can fix immediately, and bugs that I never even worked on because of project shuffling between co-workers. Working tirelessly on a bug that is hard to reproduce, a feature that was easy to implement even I clarified to the team lead about the requirements, yet the testing was not as I imagine in the feature.</p>
<p>I began to see myself not aligning the estimated hours, and the confidence that I can achieve to completing those estimates. I began to breakdown again and had a hard time with my sleep schedule.</p>
<p>I began to notice that this was the perfect moment to improve our workflow. We began to add Unit/Widget/Integration testing on our project. A perfect automation that I no longer require to manually check and update them.</p>
<p>I thought maybe if we can implement this, Our workflow would enhance and it would require less time for testing. I began presenting this to my coworkers and they actually liked it.</p>
<p>I don’t really know what happened when I think about it. I was tasked to do what I was told and tried to improve the quality of work from the company I worked on. But maybe that is just one of the good things I knew. But in reality, There weren’t any new clients and some might have ghosted us. It was a tough decision from the higher ups and knowing well that I have these episode, they decided to let me go and give time to rest.</p>
<p>I thank my former company from the experience I gain, and the culture I learned from them. It was that time for me to rest and explore other opportunities.</p>
<h2 id="heading-entrepreneur-mindset-and-uiux-design">Entrepreneur mindset and UI/UX design</h2>
<p>After we parted ways. I practiced on working with Figma and Penpot, two tools that I can work on and practice my problem solving skills as well as Document everything that went through on my mind.</p>
<p>I was working on a travel note taking app for individuals, and event handling for organizers. I believe this was lacking in most travel agencies, and solo travelers that want alternative. Most note taking apps don’t do this and there is no way for their users to automate their travel.</p>
<p>I said to myself that this was easy and began to work intensively. Then it hit me when I wasn’t focusing my time working on my own, and playing competitive games just to clear my mind.</p>
<p>The knowledge I gain practicing UI/UX design wasn’t in vain, In fact. The resource and knowledge I gained while browsing product hunt and behance was helpful and I just think to myself, <em>Do I really need this</em>?</p>
<p>Months passed, little progress was made, DotA2 made me progress a lot.</p>
<h2 id="heading-self-help-books">Self-help books</h2>
<p>My former CEO helped me teaching the ways of handling adult life. It’s the reason why the work culture there is great. I ask for an advice that usually is vague in some cases, and often times he would recommend me reading books. I got inspired and bought a few books. Even though there is one for free on the internet. I think that reading books without using smartphone is a great way to stay focus and learn everything there.</p>
<p>I started reading self-help books like Ikigai, Atomic habits, and Love language books. I urged myself not to play video games, and focus on reading books to help recover my burn out. That didn’t work out as I expect. Still, there are things I learned reading books especially it helps ease my mind and have a great meditation.</p>
<h2 id="heading-mountains-solo-ride-and-reaching-out-of-nowhere">Mountains, Solo ride, and reaching out of nowhere.</h2>
<p>I’m at that age where lost mind is wandering, and time flies like it didn’t count. I asked myself, Do I want to waste my time sitting and doing things I like? It hit me really hard again and again questioning things that I do.</p>
<p>It was then I started to drive alone and enjoy the time I had. I really like the view of the mountains</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737105672522/c01e6a2d-d510-40eb-a654-e0a3bc6db1bb.jpeg" alt class="image--center mx-auto" /></p>
<p>It then cleared my burn out after traveling mountainous places. I feel like I really want to solve this problem.<br />This time, I was happy that I could record my journey, learning color grading in video editing to adjust the moments I went and visualize the great imagery of the clouds and mountains.</p>
<h3 id="heading-odd-jobs-and-side-projects">Odd jobs, and Side projects</h3>
<p>After 4 months spending my luxurious time, Starting January was the best episode of my life and I can’t wait to achieve these. For recruiters or hiring managers, If you question my resume gap. its because of the luxurious time I had this entire time and I want the best I could to cope and figure how can I proceed with my life.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Time is a luxurious asset that cannot be valued by anyone else other than myself. So even if I laze around doing nothing, its because I was trying to figure out things I can be productive, and forcing myself to work is just the opposite of trying to figure myself and be contented. The best productivity is not someone forcing me to work, it’s the best of myself that I can produce the best work.</p>
<p>You might guess, “<em>This didn’t solve you solving your time and burn out</em>”. burn out is not about the absence of productivity. It was <strong>time</strong>. time you wish you could go back. I never regret the things I did in the past. It’s to organize the time I wanted to try without regret. <strong>It takes time and its not that easy.</strong></p>
]]></content:encoded></item><item><title><![CDATA[Career, Life, and Passion. A crisis stuck in stagnation]]></title><description><![CDATA[5 years since my career as a mobile developer. I have not seen myself improving nor enjoying it. I have my own flaws in the tech world. I often make mistakes as many programmers do. I'm not living paycheck to paycheck and I am frugal of my spending.
...]]></description><link>https://vinceramcesoliveros.dev/career-life-and-passion-a-crisis-stuck-in-stagnation</link><guid isPermaLink="true">https://vinceramcesoliveros.dev/career-life-and-passion-a-crisis-stuck-in-stagnation</guid><dc:creator><![CDATA[Vince Ramces Oliveros]]></dc:creator><pubDate>Mon, 18 Mar 2024 14:13:58 GMT</pubDate><content:encoded><![CDATA[<p>5 years since my career as a mobile developer. I have not seen myself improving nor enjoying it. I have my own flaws in the tech world. I often make mistakes as many programmers do. I'm not living paycheck to paycheck and I am frugal of my spending.</p>
<p>I want to see myself what I will do 1 year from now and how to commit these ideal plans in my life.</p>
<p>Most young adults and new to the corporate environment would want to experience the joy of spending and earning and vacation.I chose mobile development because it is one of the most in demand jobs in startups. I had web development experience but it was a daunting experience knowing that I will hate this job for the rest of my life.</p>
<p>After creating an open source payment wrapper for developers in the Philippines, thats the time I really enjoy showcasing it and improve my understanding of open source community. However, it really consumes a lot of time and effort to write and debug code that I often get distracted by a bunch of stackoverflow answers.</p>
<p>During pandemic, I was able to find a work from home environment where there are no micromanagements and easy to get along with the higher executives, the pay is above average and I've been saving a lot of money. there is just one thing that most of us will worry when we get older, that is loneliness. It's tough to endure these crucial times in crisis and the urge of bad habits. I don't have leader's intuition because often times it is not my call to initiate and take control of the tasks. I often follow what was given to me and fulfill before the deadline. There are vacation leave and christmas/new year leave to get some rest. A good work/life balance.</p>
<p>There are times that I want to experience as a young adult when I spend this kind of money to think about my hobbies, drones, action camera, long ride trips, out of nowhere experience, hiking and diving. That's cool and all, but I wonder to myself if I can commit to these wonderful things while still having my full time job. After all, It is impossible to become a Jack of all trades masters of none. You've seen those nomads enjoying the way of the remote work experience. I wanted to experience those but I am limited to the location I am currently living, and the condition of the internet connection that may often be slow and unproductive.</p>
<p>Moving forward. What I am lacking in all of these is time management and cutting costs to what I consider a priority and feedback flow. What do I think is best to enjoy doing it and experiencing it, good habits and practice, medication and meditation, and get a good romantic partner. It's good to experience these kind of events. I'm just lacking experience in social life and good organizing my tools at good use.</p>
<p>I hope that the future me will be as productive as I was 5 years ago an d continue to learn new things in life. Accept what it is and have courage to myself.</p>
]]></content:encoded></item><item><title><![CDATA[Day 2: I got bored again and start to learn Go.]]></title><description><![CDATA[Introduction
I really haven't done anything today besides testing and releasing a testflight for our iOS app. I did the usual routine. Eat, play games, and watch youtube. Suddenly I had an interest learning go again and tried gin.
Gin is a Framework ...]]></description><link>https://vinceramcesoliveros.dev/day-2-i-got-bored-again-and-start-to-learn-go</link><guid isPermaLink="true">https://vinceramcesoliveros.dev/day-2-i-got-bored-again-and-start-to-learn-go</guid><category><![CDATA[Go Language]]></category><category><![CDATA[PostgreSQL]]></category><category><![CDATA[backend]]></category><dc:creator><![CDATA[Vince Ramces Oliveros]]></dc:creator><pubDate>Thu, 03 Dec 2020 17:09:51 GMT</pubDate><content:encoded><![CDATA[<h1 id="introduction">Introduction</h1>
<p>I really haven't done anything today besides testing and releasing a testflight for our iOS app. I did the usual routine. Eat, play games, and watch youtube. Suddenly I had an interest learning go again and tried gin.</p>
<p>Gin is a Framework inspired how Express JS works. It works as a RESTFUL framework that is easy to maintain and fun to code.</p>
<p>I initially installed golang in my laptop and the setup was easy.
The linting was cool until it gets me annoyed everytime I create an interface or a struct, it tells me to provide a comment when it actually doesn't need to.</p>
<p>I really don't know what pointers in Go. They're heavily used in every project and that's what confuses me. I get the gist of how the pointers flow in the code. But never actually thought of knowing what the value will be when it gets executed.</p>
<p>I tried to recall every syntax go provides, what it inherits or implements an interface.</p>
<h1 id="thinking-of-side-projects-again">Thinking of side projects again. 😞</h1>
<p>I was thinking of starting a project with a simple back-end stack. Postgres + Go and some ORM tools to be chosen tomorrow. But the hardest part is where to deploy my simple project. It gets me stuck to know why I don't really know how to deploy my project on a free services. </p>
<h1 id="summary">Summary</h1>
<p>I haven't used postgresql since the time I got a job as a Mobile Developer. I'll relearn database design and postgresql tomorrow. I had fun with go and I might continue as well on my spare time. Thanks for reading!</p>
]]></content:encoded></item><item><title><![CDATA[Day 1: Being productivity starting.... Today!]]></title><description><![CDATA[TL;DR. This article is just a record of my task and experiences. I will record my tasks everyday starting today to keep up my career progression for my job and the community I'm in. What I learn and what I'm struggling is all part of this journal and...]]></description><link>https://vinceramcesoliveros.dev/being-productivity-starting-today</link><guid isPermaLink="true">https://vinceramcesoliveros.dev/being-productivity-starting-today</guid><category><![CDATA[Blogging]]></category><category><![CDATA[blog]]></category><category><![CDATA[journal]]></category><category><![CDATA[startup]]></category><dc:creator><![CDATA[Vince Ramces Oliveros]]></dc:creator><pubDate>Wed, 02 Dec 2020 14:29:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1606919321783/zPlh3Jw4U.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>TL;DR. This article is just a record of my task and experiences. I will record my tasks everyday starting today to keep up my career progression for my job and the community I'm in. What I learn and what I'm struggling is all part of this journal and blog post. Some post might be short, and some might be long. It still depends on the time I've spent.</em></p>
<h1 id="introduction">Introduction</h1>
<p>Today was quite boring to me. I have a lot of pending tasks, Manual testing, providing solutions for our budget because our <strong>Billing spiked </strong> last month, go shopping, and playing games(Looking at you Genshin Impact). </p>
<p>I wasn't productive at that time that's why there was no coding mentioned above. I really want to learn something for my stack as I'm at the state of being poor, yet creative. I have not learned a backend stack without wasting money. Most of the tutorials have a paid service which some of my card have been rejected.</p>
<p> But maybe someday. I can lead many developers with good practice, a culture of architecture, and have an open source project to maintain.</p>
<h2 id="my-current-state">My current state</h2>
<p>I am 22 years old. Young but ignorant. I used the nickname <strong>Clueless</strong> because anonymous by definition is someone that hides their identity. While being <strong>Clueless</strong> is for the people who seek curiosity, but still ignorant on what's happening. but being <strong>Clueless</strong> is just a title and no value anymore. I stopped being clueless and start my journey.</p>
<p>I have a Bachelor's Degree in Information Technology. I have experience in Web development, Database Design, UX, Mobile, but lack experience with how the backend technology works. The reason why I don't have much experience in backend is I have no money to learn paid services which has a free trial that I won't even use later on.</p>
<h2 id="co-founded-a-startup-company">Co-founded a Startup company</h2>
<p>Yes. I would say that I pioneered to this project months ago when the lockdown happened. I have no experience in this Food Delivery thing. But I do order food from a food delivery app here in Davao City.</p>
<p>I get monthly salary but I am not employed at that time. I resigned from my previous company because how they treat employees like buddies without profession. At that time, I was still a freelance. then he contacted me again to build a food delivery app for local communities. Made by Filipinos, for the Filipinos.</p>
<p>Tomorrow. I'll be recording my progress and See what improvements I want to make.</p>
]]></content:encoded></item></channel></rss>