{"id":660,"date":"2025-01-09T21:12:08","date_gmt":"2025-01-09T21:12:08","guid":{"rendered":"https:\/\/bendauphinee.com\/writing\/?p=660"},"modified":"2025-01-14T22:36:02","modified_gmt":"2025-01-14T22:36:02","slug":"an-app-from-scratch-part-7-creating-the-template-list-page-us1-c2","status":"publish","type":"post","link":"https:\/\/bendauphinee.com\/writing\/2025\/01\/09\/an-app-from-scratch-part-7-creating-the-template-list-page-us1-c2\/","title":{"rendered":"An App From Scratch: Part 7 \u2013\u00a0Creating The Template List Page (US1-C2)"},"content":{"rendered":"\n<p class=\"has-small-font-size\">14 minute reading time; ~2600 words<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Welcome and hello!<\/p>\n\n\n\n<p>Today, we&#8217;re going to create a template list page!<\/p>\n\n\n\n<p>Along the way, I&#8217;m going to show how we break down this more complex card, interpreting the wireframe into pieces of work, and how we get from start to finish. We&#8217;ll also explore how to efficiently style our page, and get to an end product that will let our stakeholders start to see the shape of the feature we&#8217;re building.<\/p>\n\n\n\n<p class=\"has-accent-5-background-color has-background\">If you haven&#8217;t read the previous posts, I&#8217;d suggest you start at <a href=\"https:\/\/bendauphinee.com\/writing\/2024\/12\/20\/designing-an-app-from-scratch-part-1-what-to-build\/\" data-type=\"link\" data-id=\"https:\/\/bendauphinee.com\/writing\/2024\/12\/20\/designing-an-app-from-scratch-part-1-what-to-build\/\">An App From Scratch: Part 1 \u2013 What To Build<\/a>. You can also find all the related documents and code here: <a href=\"https:\/\/bendauphinee.com\/writing\/building-tailgunner\/\">Building Tailgunner<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Do I See?<\/h2>\n\n\n\n<p>Today&#8217;s card seems simple at first glance, but the details link to a mockup, which suggests there&#8217;s more work expected.<\/p>\n\n\n\n<div class=\"wp-block-group has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-95f6958ffcabc8cc60f61655bf8163b1 has-global-padding is-layout-constrained wp-container-core-group-is-layout-9597dc02 wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">\n<p class=\"has-contrast-color has-accent-3-background-color has-text-color has-background has-link-color wp-elements-83bbfd4638157ea6a53a4ed354de16ed\" style=\"padding-top:0;padding-right:0.3rem;padding-bottom:0;padding-left:0.3rem\"><strong>Card<\/strong>: US1-C2<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-4bf8fa03559180f6a65d7015bc498d5b\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Title<\/h4>\n\n\n\n<p>Create template list page<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-208c9d0f6b2264867b69c2622d7d9968\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Type<\/h4>\n\n\n\n<p>Story<\/p>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-base-color has-text-color has-background has-link-color wp-elements-c2d2f57ca0c39c3684d432537b97ceee\" style=\"background-color:#dddddd;padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--10)\">Description<\/h4>\n\n\n\n<p class=\"has-medium-font-size\">As a business owner, I want a page that will list all templates I own, so that I can manage and work with them.<\/p>\n\n\n\n<p><strong>Acceptance Criteria<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A tool exists to list all templates the business owner is allowed to see.<\/li>\n<\/ul>\n\n\n\n<p><strong>Details<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create a page to list the templates: <a href=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2024\/12\/Tailgunner-Template-List-Template-List-scaled.jpeg\" target=\"_blank\" rel=\"noreferrer noopener\" data-rel=\"lightbox-gallery-s5ca0ydt\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\">Mockup<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">What I Need To Do<\/h3>\n\n\n\n<p>Let&#8217;s break it down into tasks.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create a new route to show our template list<\/li>\n\n\n\n<li>Create a new controller to list the items and show an Inertia page\n<ul class=\"wp-block-list\">\n<li>Create an Inertia page using Vue.js<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Make the Inertia page work like the wireframe\n<ul class=\"wp-block-list\">\n<li>Make sure I have all the data elements loaded<\/li>\n\n\n\n<li>Add some buttons<\/li>\n\n\n\n<li>Figure out how to create relative dates<\/li>\n\n\n\n<li>Style the page<\/li>\n\n\n\n<li>Make the buttons pop up an alert for what they do<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Putting It Into Action<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"newroute\">Create a new route to show our template list<\/h4>\n\n\n\n<p>First thing&#8217;s first, we need a route to let us access the template list page. There are two methods to do this. Method 1 means you will have to explicitly specify every single route setup that you want, but it&#8217;s more flexible for uncommon routes, while Method 2 is <a href=\"https:\/\/laravel.com\/docs\/11.x\/controllers#actions-handled-by-resource-controllers\">a more elegant way for the most common REST access methods<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PHP<\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Method 1\nRoute::get('\/templates', [TemplateController::class, 'index'])-&gt;name('templates.index');\n\n\/\/ Method 2\nRoute::resource('\/templates', TemplateController::class)-&gt;only(['index']);\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Method 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">Route<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;\/templates&#39;<\/span><span style=\"color: #D4D4D4\">, [<\/span><span style=\"color: #4EC9B0\">TemplateController<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;index&#39;<\/span><span style=\"color: #D4D4D4\">])-&gt;<\/span><span style=\"color: #DCDCAA\">name<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;templates.index&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Method 2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">Route<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">resource<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;\/templates&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">TemplateController<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\">)-&gt;<\/span><span style=\"color: #DCDCAA\">only<\/span><span style=\"color: #D4D4D4\">([<\/span><span style=\"color: #CE9178\">&#39;index&#39;<\/span><span style=\"color: #D4D4D4\">]);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Create a new controller to list the items and show an Inertia page<\/h4>\n\n\n\n<p>Now that we have a route, we get to update our controller! Remember in the last post, <a href=\"https:\/\/bendauphinee.com\/writing\/2025\/01\/07\/an-app-from-scratch-part-6-creating-db-tables-us1-c1\/#newmigrationsandmodels\" data-type=\"post\" data-id=\"614\" target=\"_blank\" rel=\"noreferrer noopener\">we created an empty controller along with our model<\/a>, and now it&#8217;s time to make it do something.<\/p>\n\n\n\n<p>The code we&#8217;re adding here will load up a list of templates, modify it with some fields we don&#8217;t have the data for yet (<a href=\"https:\/\/laravel.com\/docs\/11.x\/collections#method-transform\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">using the <code>transform()<\/code> method<\/a>), and then pass the whole thing back to the user along with the <a href=\"https:\/\/inertiajs.com\/pages\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Inertia page<\/a> to render it.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PHP<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Models\\Template;\nuse Illuminate\\Http\\Request;\nuse Inertia\\Inertia;\n\nclass TemplateController extends Controller\n{\n    public function index()\n    {\n        \/**\n         * Get the template data, and modify it to include the fields that\n         * we're going to fetch later when we make the actual table to store\n         * the data entered in a template.\n         *\/\n        $templates = Template::query()\n            -&gt;where('user_id', auth()-&gt;id())\n            -&gt;get()\n            -&gt;transform(function($template) {\n                return [\n                    'id' =&gt; $template-&gt;id,\n                    'title' =&gt; $template-&gt;title,\n                    'description' =&gt; $template-&gt;description,\n                    'created_at' =&gt; $template-&gt;created_at,\n\n                    \/\/ Fake these fields for now\n                    'last_used' =&gt; $template-&gt;created_at-&gt;addDay(),\n                    'records' =&gt; rand(20, 100),\n                ];\n            });\n\n        \/\/ Send back the Inertia template and template data\n        return Inertia::render('Templates\/Index', [\n            'templates' =&gt; $templates\n        ]);\n    }\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">&lt;?php<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">namespace<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">App\\Http\\Controllers<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">use<\/span><span style=\"color: #D4D4D4\"> App\\Models\\<\/span><span style=\"color: #4EC9B0\">Template<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">use<\/span><span style=\"color: #D4D4D4\"> Illuminate\\Http\\<\/span><span style=\"color: #4EC9B0\">Request<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">use<\/span><span style=\"color: #D4D4D4\"> Inertia\\<\/span><span style=\"color: #4EC9B0\">Inertia<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">TemplateController<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">extends<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Controller<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">index<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #6A9955\">         * Get the template data, and modify it to include the fields that<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #6A9955\">         * we&#39;re going to fetch later when we make the actual table to store<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #6A9955\">         * the data entered in a template.<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #6A9955\">         *\/<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">$templates<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4EC9B0\">Template<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">query<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            -&gt;<\/span><span style=\"color: #DCDCAA\">where<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;user_id&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #DCDCAA\">auth<\/span><span style=\"color: #D4D4D4\">()-&gt;<\/span><span style=\"color: #DCDCAA\">id<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            -&gt;<\/span><span style=\"color: #DCDCAA\">get<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            -&gt;<\/span><span style=\"color: #DCDCAA\">transform<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">$template<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> [<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #CE9178\">&#39;id&#39;<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">$template<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #CE9178\">&#39;title&#39;<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">$template<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #9CDCFE\">title<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #CE9178\">&#39;description&#39;<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">$template<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #9CDCFE\">description<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #CE9178\">&#39;created_at&#39;<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">$template<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #9CDCFE\">created_at<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #6A9955\">\/\/ Fake these fields for now<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #CE9178\">&#39;last_used&#39;<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">$template<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #9CDCFE\">created_at<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">addDay<\/span><span style=\"color: #D4D4D4\">(),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #CE9178\">&#39;records&#39;<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #DCDCAA\">rand<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                ];<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            });<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send back the Inertia template and template data<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Inertia<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">render<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;Templates\/Index&#39;<\/span><span style=\"color: #D4D4D4\">, [<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #CE9178\">&#39;templates&#39;<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">$templates<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        ]);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Along with the controller code, we&#8217;re going to make an empty template list page, so that we can actually load the endpoint and see something. To do this, we&#8217;re just going to copy the Welcome page that the initial install provided us with, change the name and title, and leave a spot for us to add our data in later.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;script setup&gt;\nimport AppLayout from '@\/Layouts\/AppLayout.vue';\n&lt;\/script&gt;\n\n&lt;template&gt;\n    &lt;AppLayout title=&quot;Templates&quot;&gt;\n        &lt;template #header&gt;\n            &lt;h2 class=&quot;font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight&quot;&gt;\n                Templates\n            &lt;\/h2&gt;\n        &lt;\/template&gt;\n\n        &lt;div class=&quot;py-1&quot;&gt;\n            &lt;div class=&quot;max-w-7xl mx-auto sm:px-6 lg:px-8&quot;&gt;\n                &lt;div class=&quot;bg-white dark:bg-gray-800 overflow-hidden shadow-xl sm:rounded-lg&quot;&gt;\n                    A list of templates\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/AppLayout&gt;\n&lt;\/template&gt;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">script<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">setup<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">AppLayout<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;@\/Layouts\/AppLayout.vue&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">script<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">template<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #F44747\">AppLayout<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">title<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;Templates&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">template<\/span><span style=\"color: #D4D4D4\"> #<\/span><span style=\"color: #9CDCFE\">header<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">h2<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                Templates<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">h2<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">template<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;py-1&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;max-w-7xl mx-auto sm:px-6 lg:px-8&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;bg-white dark:bg-gray-800 overflow-hidden shadow-xl sm:rounded-lg&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                    A list of templates<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #F44747\">AppLayout<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">template<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>At this point, everything should be working! Here&#8217;s what the page looks like now:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"196\" src=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-1024x196.png\" alt=\"\" class=\"wp-image-705\" srcset=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-1024x196.png 1024w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-300x57.png 300w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-768x147.png 768w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image.png 1227w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Make the Inertia page work like the wireframe<\/h4>\n\n\n\n<p>Now that we have a basic working page, let&#8217;s get the data properly loaded into it, and add various UI elements and formatting.<\/p>\n\n\n\n<ul style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--30)\" class=\"wp-block-list has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-b1eb89394ff5b2fdd79a7746655e53d4\">\n<li>Make sure I have all the data elements loaded<\/li>\n\n\n\n<li>Add some buttons<\/li>\n<\/ul>\n\n\n\n<p>First, we need to update our page to access the properties we&#8217;re passing back from the controller.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;script setup&gt;\nimport AppLayout from '@\/Layouts\/AppLayout.vue';\n\ndefineProps({\n    templates: Object\n});\n&lt;\/script&gt;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">script<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">setup<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">AppLayout<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;@\/Layouts\/AppLayout.vue&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #DCDCAA\">defineProps<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">templates:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Object<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">script<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Next, we&#8217;re going to replace our placeholder text &#8220;A list of templates&#8221; with an actual list of templates. We&#8217;ll add a table if there are any templates for this user (line 3), or display a message if not (line 33).<\/p>\n\n\n\n<p>Inside the table, we&#8217;ll have to loop over the templates data structure to generate each row of the table (line 15). This simple table will give our page some basic structure, and show us the data so we can further tune the list. I&#8217;ve also added some basic buttons that we can play with as we get deeper into this card.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;template&gt; &lt;!-- Ignore this line, it's just so the formatter shows the right colors --&gt;\n\n&lt;table v-if=&quot;templates.length&quot;&gt;\n    &lt;thead&gt;\n        &lt;tr&gt;\n            &lt;th&gt;Template Name&lt;\/th&gt;\n            &lt;th&gt;Description&lt;\/th&gt;\n            &lt;th&gt;Created&lt;\/th&gt;\n            &lt;th&gt;Last Used&lt;\/th&gt;\n            &lt;th&gt;Records&lt;\/th&gt;\n            &lt;th&gt;Template&lt;\/th&gt;\n        &lt;\/tr&gt;\n    &lt;\/thead&gt;\n    &lt;tbody&gt;\n        &lt;tr v-for=&quot;template in templates&quot; :key=&quot;template.id&quot;&gt;\n            &lt;td&gt;{{ template.title }}&lt;\/td&gt;\n            &lt;td&gt;{{ template.description }}&lt;\/td&gt;\n            &lt;td&gt;{{ template.created_at }}&lt;\/td&gt;\n            &lt;td&gt;{{ template.last_used }}&lt;\/td&gt;\n            &lt;td&gt;\n                {{ template.records }} Entries\n                &lt;button&gt;Add Record&lt;\/button&gt;\n                &lt;button&gt;View Records&lt;\/button&gt;\n            &lt;\/td&gt;\n            &lt;td&gt;\n                &lt;button&gt;Edit&lt;\/button&gt;\n                &lt;button&gt;Delete&lt;\/button&gt;\n                &lt;button&gt;Clone&lt;\/button&gt;\n            &lt;\/td&gt;\n        &lt;\/tr&gt;\n    &lt;\/tbody&gt;\n&lt;\/table&gt;\n&lt;div v-else&gt;\n    No templates found.\n&lt;\/div&gt;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">template<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">&lt;!-- Ignore this line, it&#39;s just so the formatter shows the right colors --&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">v-if<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;templates.length&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">thead<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Template Name<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Description<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Created<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Last Used<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Records<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Template<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">thead<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">tbody<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">v-for<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;template in templates&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">:key<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;template.id&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.title }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.description }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.created_at }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.last_used }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                {{ template.records }} Entries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Add Record<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">View Records<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Edit<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Delete<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Clone<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">tbody<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">v-else<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    No templates found.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">div<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now that we have all the elements lined up in a table, and populated with data, let&#8217;s make the user experience better!<\/p>\n\n\n\n<ul style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--30)\" class=\"wp-block-list has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-b8838ba297f212e6c2f5c29224c9dde1\">\n<li>Figure out how to create relative dates<\/li>\n<\/ul>\n\n\n\n<p>It&#8217;s a lot easier to read a relative date, so we&#8217;re going to add a formatter for this. I&#8217;d still like to have the date available if they hover over it as well, in case they need to know exactly when something was done.<\/p>\n\n\n\n<p>For this formatting, we&#8217;re going to use <a href=\"https:\/\/day.js.org\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Day.js<\/a> (a modern date handling Javascript library). First we&#8217;ll install it:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Bash<\/span><span role=\"button\" tabindex=\"0\" data-code=\"npm install dayjs\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">npm<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">install<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">dayjs<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Then we&#8217;ll need to add it to our setup code. Along with this, we&#8217;re going to add a few shortcut functions for use in our template.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;script setup&gt;\nimport AppLayout from '@\/Layouts\/AppLayout.vue';\n\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs\/plugin\/relativeTime';\nimport advancedFormat from 'dayjs\/plugin\/advancedFormat';\n\ndayjs.extend(relativeTime);\ndayjs.extend(advancedFormat);\n\ndefineProps({\n    templates: Object\n});\n\nconst relDate = (date) =&gt; dayjs(date).fromNow();\nconst formatDate = (date) =&gt; dayjs(date).format('YYYY-MM-DD HH:mm:ss Z');\n&lt;\/script&gt;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">script<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">setup<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">AppLayout<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;@\/Layouts\/AppLayout.vue&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">dayjs<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;dayjs&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">relativeTime<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;dayjs\/plugin\/relativeTime&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">advancedFormat<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;dayjs\/plugin\/advancedFormat&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">dayjs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">extend<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">relativeTime<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">dayjs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">extend<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">advancedFormat<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">defineProps<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">templates:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">relDate<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">dayjs<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">fromNow<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">formatDate<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">dayjs<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">date<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">format<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;YYYY-MM-DD HH:mm:ss Z&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">script<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now, let&#8217;s update our display code to show these dates. We&#8217;re going to use Vue&#8217;s dynamic binding to format the date and add it as a title property on our cells, and we&#8217;re also going to format our dates as relative ones.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;template&gt; &lt;!-- Ignore this line, it's just so the formatter shows the right colors --&gt;\n\n&lt;tr v-for=&quot;template in templates&quot; :key=&quot;template.id&quot;&gt;\n    &lt;td&gt;{{ template.title }}&lt;\/td&gt;\n    &lt;td&gt;{{ template.description }}&lt;\/td&gt;\n    &lt;td :title=&quot;formatDate(template.created_at)&quot;&gt;{{ relDate(template.created_at) }}&lt;\/td&gt;\n    &lt;td :title=&quot;formatDate(template.last_used)&quot;&gt;{{ relDate(template.last_used) }}&lt;\/td&gt;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">template<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">&lt;!-- Ignore this line, it&#39;s just so the formatter shows the right colors --&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">v-for<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;template in templates&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">:key<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;template.id&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.title }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.description }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">:title<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;formatDate(template.created_at)&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ relDate(template.created_at) }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">:title<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;formatDate(template.last_used)&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ relDate(template.last_used) }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>With that cleaned up, let&#8217;s move on and make the UI easier to navigate!<\/p>\n\n\n\n<ul style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--30)\" class=\"wp-block-list has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-1d863b0930aed372567936bce99d68a1\">\n<li>Style the page<\/li>\n<\/ul>\n\n\n\n<p>Finally, we&#8217;re going to apply some styles to the page, to make it easier to read and work with, since what we have right now is a little&#8230; lacking in character.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"341\" src=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-1024x341.png\" alt=\"\" class=\"wp-image-712\" srcset=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-1024x341.png 1024w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-300x100.png 300w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-768x256.png 768w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-1536x511.png 1536w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2.png 1542w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>We&#8217;re using <a href=\"https:\/\/tailwindcss.com\/\">Tailwindcss<\/a>, so we have a ton of easy selectors available out of the box. This also tends to be a little verbose if we want to change multiple properties however, so we&#8217;re going to modify the app.css file that comes with Laravel, and do some styling shortcuts, instead of repeating the styles over and over in the table code itself.<\/p>\n\n\n\n<p>I&#8217;m going to create a style called <code>style01<\/code>, to use with my table, and write it so that I only have to add it to the table, and the elements inside will be adjusted as well.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">CSS<\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/* Set a style for the whole table. *\/\ntable.style01{\n    @apply min-w-full bg-white border border-gray-300 rounded-md;\n}\n\n\/* Set a style for any header cell. *\/\ntable.style01 thead th{\n    @apply px-4 py-2 text-left text-gray-50 bg-gray-700 border-b-4;\n}\n\n\/* Set a style for alternating rows in the table. *\/\ntable.style01 tbody tr:nth-child(even){\n    @apply bg-gray-200;\n}\n\n\/* Set a style for when someone hovers over a row. Order matters in CSS,\n * if this was before the alternating row color, it wouldn't work on the\n * gray rows.\n *\/\ntable.style01 tbody tr:hover{\n    @apply bg-green-100;\n}\n\n\/* Set a style to apply to each table body cell. *\/\ntable.style01 tbody td{\n    @apply px-4 py-2 text-left text-gray-900 border-b;\n}\n\n\/* Create a generic style for buttons inside this table. *\/\ntable.style01 button{\n    @apply mx-1 px-3 py-1 text-xs text-white rounded bg-slate-400;\n}\n\n\/* When we hover over the button, give it a different background to distinguish it. *\/\ntable.style01 button:hover{\n    @apply bg-blue-800;\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/* Set a style for the whole table. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply min-w-full bg-white <\/span><span style=\"color: #9CDCFE\">border<\/span><span style=\"color: #D4D4D4\"> border-gray-300 rounded-md;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/* Set a style for any header cell. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">thead<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">th<\/span><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply px-4 py-2 text-left text-gray-50 bg-gray-700 border-b-4;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/* Set a style for alternating rows in the table. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">tbody<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">tr:nth-child<\/span><span style=\"color: #D4D4D4\">(even){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply bg-gray-200;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/* Set a style for when someone hovers over a row. Order matters in CSS,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * if this was before the alternating row color, it wouldn&#39;t work on the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * gray rows.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">tbody<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">tr:hover<\/span><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply bg-green-100;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/* Set a style to apply to each table body cell. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">tbody<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">td<\/span><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply px-4 py-2 text-left text-gray-900 border-b;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/* Create a generic style for buttons inside this table. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">button<\/span><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply mx-1 px-3 py-1 text-xs text-white rounded bg-slate-400;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/* When we hover over the button, give it a different background to distinguish it. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">button:hover<\/span><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply bg-blue-800;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>In addition to the breakdown I gave you there, let&#8217;s break down the first header cell style to give you an idea of what it does. (You can read more in the <a href=\"https:\/\/tailwindcss.com\/docs\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Tailwindcss docs<\/a> about what these do.)<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">CSS<\/span><span role=\"button\" tabindex=\"0\" data-code=\"table.style01 thead th{\n    @apply px-4 py-2 text-left text-gray-600 font-medium border-b;\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D7BA7D\">table.style01<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">thead<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #D7BA7D\">th<\/span><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @apply px-4 py-2 text-left text-gray-600 font-medium border-b;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Class Name<\/th><th>Effect<\/th><\/tr><\/thead><tbody><tr><td>px-4<\/td><td>Adds horizontal padding to the cell (1rem \/ 16px).<\/td><\/tr><tr><td>py-2<\/td><td>Adds vertical padding to the cell (0.5rem \/ 8px).<\/td><\/tr><tr><td>text-left<\/td><td>Explicitly aligns the text in the cell to the left.<\/td><\/tr><tr><td>text-gray-50<\/td><td>Sets the cell text color to a very light gray.<\/td><\/tr><tr><td>bg-gray-700<\/td><td>Sets the cell background color to dark gray.<\/td><\/tr><tr><td>border-b-4<\/td><td>Adds a border to the bottom of the cell (4px wide).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Now that we have our styles, let&#8217;s format our table and elements. As you can see below, all we have to do to affect the whole table is add the one style to it (line 3). I also noticed some of the text was squashed, so we&#8217;re going to add a <code>text-nowrap<\/code> to fix that where it matters most (lines 18, 22, 26).<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;template&gt; &lt;!-- Ignore this line, it's just so the formatter shows the right colors --&gt;\n\n&lt;table v-if=&quot;templates.length&quot; class=&quot;style01&quot;&gt;\n    &lt;thead&gt;\n        &lt;tr&gt;\n            &lt;th&gt;Template Name&lt;\/th&gt;\n            &lt;th&gt;Description&lt;\/th&gt;\n            &lt;th&gt;Created&lt;\/th&gt;\n            &lt;th&gt;Last Used&lt;\/th&gt;\n            &lt;th&gt;Records&lt;\/th&gt;\n            &lt;th&gt;Template&lt;\/th&gt;\n        &lt;\/tr&gt;\n    &lt;\/thead&gt;\n    &lt;tbody&gt;\n        &lt;tr v-for=&quot;template in templates&quot; :key=&quot;template.id&quot;&gt;\n            &lt;td&gt;{{ template.title }}&lt;\/td&gt;\n            &lt;td&gt;{{ template.description }}&lt;\/td&gt;\n            &lt;td class=&quot;text-nowrap&quot; \n              :title=&quot;formatDate(template.created_at)&quot;&gt;\n              {{ relDate(template.created_at) }}\n            &lt;\/td&gt;\n            &lt;td class=&quot;text-nowrap&quot; \n              :title=&quot;formatDate(template.last_used)&quot;&gt;\n              {{ relDate(template.last_used) }}\n            &lt;\/td&gt;\n            &lt;td class=&quot;text-nowrap&quot;&gt;\n                {{ template.records }} Entries&lt;br&gt;\n                &lt;button&gt;Add Record&lt;\/button&gt;&lt;br&gt;\n                &lt;button&gt;View Records&lt;\/button&gt;\n            &lt;\/td&gt;\n            &lt;td&gt;\n                &lt;button&gt;Edit&lt;\/button&gt;\n                &lt;button&gt;Delete&lt;\/button&gt;\n                &lt;button&gt;Clone&lt;\/button&gt;\n            &lt;\/td&gt;\n        &lt;\/tr&gt;\n    &lt;\/tbody&gt;\n&lt;\/table&gt;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">template<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">&lt;!-- Ignore this line, it&#39;s just so the formatter shows the right colors --&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">v-if<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;templates.length&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;style01&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">thead<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Template Name<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Description<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Created<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Last Used<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Records<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Template<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">th<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">thead<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">tbody<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">v-for<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;template in templates&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">:key<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;template.id&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.title }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">{{ template.description }}<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;text-nowrap&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">:title<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;formatDate(template.created_at)&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              {{ relDate(template.created_at) }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;text-nowrap&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">:title<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;formatDate(template.last_used)&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              {{ relDate(template.last_used) }}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;text-nowrap&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                {{ template.records }} Entries<\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">br<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Add Record<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;&lt;<\/span><span style=\"color: #569CD6\">br<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">View Records<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Edit<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Delete<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><span style=\"color: #D4D4D4\">Clone<\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">td<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">tr<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">tbody<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>With these styles now applied, let&#8217;s have a quick look at the list of templates now. In the new screenshot, I&#8217;m hovering over both a row and specific button, so you can see that style as well.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"341\" src=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-1024x341.png\" alt=\"\" class=\"wp-image-712\" srcset=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-1024x341.png 1024w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-300x100.png 300w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-768x256.png 768w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2-1536x511.png 1536w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-2.png 1542w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"327\" src=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-3-1024x327.png\" alt=\"\" class=\"wp-image-715\" srcset=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-3-1024x327.png 1024w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-3-300x96.png 300w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-3-768x245.png 768w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-3-1536x490.png 1536w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-3.png 1557w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>It&#8217;s amazing what a few style tweaks can do to take something cramped and hard to read and make it easier to work with!<\/p>\n\n\n\n<ul style=\"padding-top:var(--wp--preset--spacing--10);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--30)\" class=\"wp-block-list has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-48e0844950d8789f31be138a9832c9d0\">\n<li>Make the buttons pop up an alert for what they do<\/li>\n<\/ul>\n\n\n\n<p>One little bit of easy interactivity, since this tool has a lot of not useful buttons right now, is to add a simple alert for them. We&#8217;re going to add a simple click event that will pop up an alert telling you what the button will do.<\/p>\n\n\n\n<p>First, we&#8217;ll create a small generic function in our setup code, to pop up the alert.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;script setup&gt;\nconst btnClick = (message) =&gt; {window.alert(message)}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">script<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">setup<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">btnClick<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><span style=\"color: #9CDCFE\">window<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">alert<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">)}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Then we&#8217;ll add the click event to the button, to trigger the message.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Vue<\/span><span role=\"button\" tabindex=\"0\" data-code=\"&lt;button @click=&quot;btnClick(`Add Record To Template ${template.id}`)&quot;&gt;\nAdd Record\n&lt;\/button&gt;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #808080\">&lt;<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #D4D4D4\"> @<\/span><span style=\"color: #9CDCFE\">click<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #D4D4D4\">&quot;<\/span><span style=\"color: #DCDCAA\">btnClick<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Add Record To Template <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">template<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #D4D4D4\">&quot;<\/span><span style=\"color: #808080\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Add Record<\/span><\/span>\n<span class=\"line\"><span style=\"color: #808080\">&lt;\/<\/span><span style=\"color: #569CD6\">button<\/span><span style=\"color: #808080\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>And then we&#8217;ll give it a click.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"823\" height=\"329\" src=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-5.png\" alt=\"\" class=\"wp-image-717\" srcset=\"https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-5.png 823w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-5-300x120.png 300w, https:\/\/bendauphinee.com\/writing\/wp-content\/uploads\/2025\/01\/image-5-768x307.png 768w\" sizes=\"auto, (max-width: 823px) 100vw, 823px\" \/><\/figure>\n\n\n\n<p>With this completed, we now have a list page that is easy to read, and has some interactivity to it as well, allowing our stakeholders to get an early feel for the tool.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Commit And Merge<\/h2>\n\n\n\n<p>Along the way, we&#8217;re made quite a few changes. As we <a href=\"https:\/\/bendauphinee.com\/writing\/2025\/01\/07\/an-app-from-scratch-part-6-creating-db-tables-us1-c1\/#commit-and-merge\" data-type=\"post\" data-id=\"614\" target=\"_blank\" rel=\"noreferrer noopener\">talked about previously<\/a>, there are multiple strategies to arranging your code, but today&#8217;s branch is named: <code>US2-C2_create_template_list<\/code><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Bash<\/span><span role=\"button\" tabindex=\"0\" data-code=\"$ git push origin US2-C2_create_template_list\nEnumerating objects: 36, done.\nCounting objects: 100% (36\/36), done.\nDelta compression using up to 32 threads\nCompressing objects: 100% (19\/19), done.\nWriting objects: 100% (21\/21), 3.34 KiB | 114.00 KiB\/s, done.\nTotal 21 (delta 12), reused 0 (delta 0), pack-reused 0\nremote: Resolving deltas: 100% (12\/12), completed with 10 local objects.\nremote:\nremote: Create a pull request for 'US2-C2_create_template_list' on GitHub by visiting:\nremote:      https:\/\/github.com\/bendauphinee\/tailgunner\/pull\/new\/US2-C2_create_template_list\nremote:\nremote: GitHub found 1 vulnerability on bendauphinee\/tailgunner's default branch (1 moderate).\nremote: To find out more, visit:\nremote:      https:\/\/github.com\/bendauphinee\/tailgunner\/security\/dependabot\/1\nremote:\nTo github.com:bendauphinee\/tailgunner.git\n * [new branch]      US2-C2_create_template_list -&gt; US2-C2_create_template_list\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">$<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">git<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">push<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">origin<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">US2-C2_create_template_list<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Enumerating<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">36<\/span><span style=\"color: #CE9178\">,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Counting<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (36\/36), done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Delta<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">compression<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">using<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">up<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">to<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">32<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">threads<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Compressing<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (19\/19), done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Writing<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (21\/21), 3.34 KiB | <\/span><span style=\"color: #DCDCAA\">114.00<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">KiB\/s,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Total<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">21<\/span><span style=\"color: #D4D4D4\"> (delta <\/span><span style=\"color: #B5CEA8\">12<\/span><span style=\"color: #D4D4D4\">), reused 0 (<\/span><span style=\"color: #DCDCAA\">delta<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">), pack-reused 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Resolving<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">deltas:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (12\/12), completed with 10 local objects.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Create<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">a<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">pull<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">request<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">for<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;US2-C2_create_template_list&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">on<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">GitHub<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">by<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">visiting:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #CE9178\">https:\/\/github.com\/bendauphinee\/tailgunner\/pull\/new\/US2-C2_create_template_list<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">GitHub<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">found<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">vulnerability<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">on<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">bendauphinee\/tailgunner&#39;s default branch (1 moderate).<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #CE9178\">remote: To find out more, visit:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #CE9178\">remote:      https:\/\/github.com\/bendauphinee\/tailgunner\/security\/dependabot\/1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">remote:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">To github.com:bendauphinee\/tailgunner.git<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\"> * [new branch]      US2-C2_create_template_list -&gt; US2-C2_create_template_list<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>In pushing our code to GitHub, we also got back a <a href=\"https:\/\/github.com\/bendauphinee\/tailgunner\/security\/dependabot\/1\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Dependabot security warning<\/a>. Looking into that, there&#8217;s a moderate security issue with one of the libraries Laravel uses, so I&#8217;m having Dependabot generate a PR for the fix while I create and review my own code.<\/p>\n\n\n\n<p>With a few small whitespace tweaks, my <a href=\"https:\/\/github.com\/bendauphinee\/tailgunner\/pull\/3\" target=\"_blank\" rel=\"noreferrer noopener\">PR<\/a> is <a href=\"https:\/\/github.com\/bendauphinee\/tailgunner\/commit\/54548694c8c2e57314ea87cad320a2de4c3c8771\" target=\"_blank\" rel=\"noreferrer noopener\">merged<\/a>.<\/p>\n\n\n\n<p>Reviewing the <a href=\"https:\/\/github.com\/bendauphinee\/tailgunner\/pull\/2\" target=\"_blank\" rel=\"noreferrer noopener\">automated PR<\/a> from <a href=\"https:\/\/docs.github.com\/en\/code-security\/getting-started\/dependabot-quickstart-guide\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Dependabot<\/a>, it bumps the version of the vulnerable library, and related ones. I&#8217;ve <a href=\"https:\/\/github.com\/bendauphinee\/tailgunner\/commit\/795a5c9d96336d54329aa57ae8a6ff2896ac6911\" target=\"_blank\" rel=\"noreferrer noopener\">merged that change<\/a> as well, concluding the code for today&#8217;s post!<\/p>\n\n\n\n<p>One other thing, since there are now changes that for sure aren&#8217;t reflected in my local code, it&#8217;s time to go back to our main branch, pull down updates from our Github repo (which now include the security change), and then update our development install.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Bash<\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Switch back from our working branch to main\n$ git checkout main\nUpdating files: 100% (6\/6), done.\nSwitched to branch 'main'\nYour branch is up to date with 'origin\/main'.\n\n# Pull the changes to main in from Github\n$ git pull origin main\nremote: Enumerating objects: 38, done.\nremote: Counting objects: 100% (38\/38), done.\nremote: Compressing objects: 100% (14\/14), done.\nremote: Total 22 (delta 13), reused 11 (delta 6), pack-reused 0 (from 0)\nUnpacking objects: 100% (22\/22), 5.06 KiB | 6.00 KiB\/s, done.\nFrom github.com:bendauphinee\/tailgunner\n * branch            main       -&gt; FETCH_HEAD\n   df58791..795a5c9  main       -&gt; origin\/main\nUpdating files: 100% (7\/7), done.\nUpdating df58791..795a5c9\nFast-forward\n src\/app\/Http\/Controllers\/TemplateController.php | 31 ++++++++++-\n src\/composer.lock                               | 60 ++++++++++----------\n src\/package-lock.json                           |  6 ++\n src\/package.json                                |  1 +\n src\/resources\/css\/app.css                       | 28 ++++++++++\n src\/resources\/js\/Pages\/Templates\/Index.vue      | 73 +++++++++++++++++++++++++\n src\/routes\/web.php                              |  3 +\n 7 files changed, 171 insertions(+), 31 deletions(-)\n create mode 100644 src\/resources\/js\/Pages\/Templates\/Index.vue\n\n# Run composer install to update the things Dependabot changed\n$ composer install\nInstalling dependencies from lock file (including require-dev)\nVerifying lock file contents can be installed on current platform.\nPackage operations: 0 installs, 2 updates, 0 removals\n  - Downloading symfony\/translation (v7.2.2)\n  - Downloading nesbot\/carbon (3.8.4)\n  - Upgrading symfony\/translation (v7.2.0 =&gt; v7.2.2): Extracting archive\n  - Upgrading nesbot\/carbon (3.8.2 =&gt; 3.8.4): Extracting archive\nGenerating optimized autoload files\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\"># Switch back from our working branch to main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">$<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">git<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">checkout<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Updating<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">files:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (6\/6), done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Switched<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">to<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">branch<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;main&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Your<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">branch<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">up<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">to<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">with<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;origin\/main&#39;.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Pull the changes to main in from Github<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">$<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">git<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">pull<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">origin<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Enumerating<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">38<\/span><span style=\"color: #CE9178\">,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Counting<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (38\/38), done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Compressing<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (14\/14), done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">remote:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Total<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">22<\/span><span style=\"color: #D4D4D4\"> (delta <\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\">), reused 11 (<\/span><span style=\"color: #DCDCAA\">delta<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">), pack-reused 0 (<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Unpacking<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">objects:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (22\/22), 5.06 KiB | <\/span><span style=\"color: #DCDCAA\">6.00<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">KiB\/s,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">From<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">github.com:bendauphinee\/tailgunner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">*<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">branch<\/span><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #CE9178\">main<\/span><span style=\"color: #D4D4D4\">       -&gt; <\/span><span style=\"color: #CE9178\">FETCH_HEAD<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">df58791..795a5c9<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">main<\/span><span style=\"color: #D4D4D4\">       -&gt; <\/span><span style=\"color: #CE9178\">origin\/main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Updating<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">files:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #CE9178\">%<\/span><span style=\"color: #D4D4D4\"> (7\/7), done.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Updating<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">df58791..795a5c9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Fast-forward<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">src\/app\/Http\/Controllers\/TemplateController.php<\/span><span style=\"color: #D4D4D4\"> | <\/span><span style=\"color: #DCDCAA\">31<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">++++++++++-<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">src\/composer.lock<\/span><span style=\"color: #D4D4D4\">                               | <\/span><span style=\"color: #DCDCAA\">60<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">++++++++++----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">src\/package-lock.json<\/span><span style=\"color: #D4D4D4\">                           |  <\/span><span style=\"color: #DCDCAA\">6<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">++<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">src\/package.json<\/span><span style=\"color: #D4D4D4\">                                |  <\/span><span style=\"color: #DCDCAA\">1<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">src\/resources\/css\/app.css<\/span><span style=\"color: #D4D4D4\">                       | <\/span><span style=\"color: #DCDCAA\">28<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">++++++++++<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">src\/resources\/js\/Pages\/Templates\/Index.vue<\/span><span style=\"color: #D4D4D4\">      | <\/span><span style=\"color: #DCDCAA\">73<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">+++++++++++++++++++++++++<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">src\/routes\/web.php<\/span><span style=\"color: #D4D4D4\">                              |  <\/span><span style=\"color: #DCDCAA\">3<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">7<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">files<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">changed,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">171<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">insertions<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">+<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #CE9178\">,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">deletions<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">-<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">create<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">mode<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100644<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">src\/resources\/js\/Pages\/Templates\/Index.vue<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Run composer install to update the things Dependabot changed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">$<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">composer<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">install<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Installing<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">dependencies<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">lock<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">file<\/span><span style=\"color: #D4D4D4\"> (including <\/span><span style=\"color: #CE9178\">require-dev<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Verifying<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">lock<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">file<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">contents<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">can<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">be<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">installed<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">on<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">current<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">platform.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Package<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">operations:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">installs,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">updates,<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">removals<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">-<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Downloading<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">symfony\/translation<\/span><span style=\"color: #D4D4D4\"> (v7.2.2)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">-<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Downloading<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">nesbot\/carbon<\/span><span style=\"color: #D4D4D4\"> (3.8.4)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">-<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Upgrading<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">symfony\/translation<\/span><span style=\"color: #D4D4D4\"> (v7.2.0 =&gt; <\/span><span style=\"color: #CE9178\">v7.2.2<\/span><span style=\"color: #D4D4D4\">): Extracting archive<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">-<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">Upgrading<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">nesbot\/carbon<\/span><span style=\"color: #D4D4D4\"> (3.8.2 =&gt; <\/span><span style=\"color: #B5CEA8\">3.8<\/span><span style=\"color: #CE9178\">.4<\/span><span style=\"color: #D4D4D4\">): Extracting archive<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">Generating<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">optimized<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">autoload<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">files<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>These steps are a common task in between different pieces of work on a project. This housekeeping ensures that the next thing we do starts from whatever state the main codebase is in, which should reduce the risk of having code conflicts when we do more work.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping Up<\/h2>\n\n\n\n<p>This post took us from a tool that only had a database full of fake data, and gave us a way to actually look at the data. Building this tool first sets the stage for our other work, since it serves as the entry point into any of our other workflows, and it also gives us a way to look at our data to see that it makes sense.<\/p>\n\n\n\n<p>From start to finish, this work would have taken an hour or three, depending on what debugging or styling a developer chooses to go with, and how many rounds of changes they make, either by themselves or after talking with stakeholders.<\/p>\n\n\n\n<p>Hopefully you found this part of the process illuminating, and look for the next part soon: <a href=\"https:\/\/bendauphinee.com\/writing\/2025\/01\/14\/an-app-from-scratch-part-8-creating-new-templates-tool-us1-c3\/\">Creating new templates tool (US1-C3)<\/a><\/p>\n\n\n\n<p>Let me know what you think of my design, or anything else from this post!<\/p>\n\n\n\n<p>Cheers!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>14 minute reading time; ~2600 words Welcome and hello! Today, we&#8217;re going to create a template list page! Along the way, I&#8217;m going to show how we break down this more complex card, interpreting the wireframe into pieces of work, and how we get from start to finish. We&#8217;ll also explore how to efficiently style [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[41,40,25,26,34,38,39],"class_list":["post-660","post","type-post","status-publish","format-standard","hentry","category-software-engineering","tag-dependabot","tag-github","tag-laravel","tag-php","tag-software","tag-tailwindcss","tag-vuejs"],"_links":{"self":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/posts\/660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/comments?post=660"}],"version-history":[{"count":72,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/posts\/660\/revisions"}],"predecessor-version":[{"id":840,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/posts\/660\/revisions\/840"}],"wp:attachment":[{"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/media?parent=660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/categories?post=660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bendauphinee.com\/writing\/wp-json\/wp\/v2\/tags?post=660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}