<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Andréia Bohner</title>
    <description>The latest articles on Forem by Andréia Bohner (@andreiabohner).</description>
    <link>https://forem.com/andreiabohner</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3994%2Ffb1b4e1b-02c2-4a70-8d90-b4a91a8b5483.jpg</url>
      <title>Forem: Andréia Bohner</title>
      <link>https://forem.com/andreiabohner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/andreiabohner"/>
    <language>en</language>
    <item>
      <title>Stop Wrestling with Business Hours. There's a Better Way</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Sun, 26 Apr 2026 20:10:16 +0000</pubDate>
      <link>https://forem.com/andreiabohner/stop-wrestling-with-business-hours-theres-a-better-way-3mk6</link>
      <guid>https://forem.com/andreiabohner/stop-wrestling-with-business-hours-theres-a-better-way-3mk6</guid>
      <description>&lt;p&gt;If you've ever built a store locator, a restaurant site, or a booking system, you know that "Business Hours" are a secret nightmare.&lt;/p&gt;

&lt;p&gt;At first glance, it seems simple. But as the project grows, so do the requirements. Split shifts (opening for lunch, closing, then reopening for dinner). Timezones. That one random Tuesday the shop is closed for a local holiday. Then come the special requests: "We close early on Tuesdays.", "We need to block out Christmas week.", "What about our summer hours?", "Can we handle different time zones?", "But what about daylight saving time?".&lt;/p&gt;

&lt;p&gt;What started as a simple text field turns into a tangled mess of conditionals, edge cases, and timezone headaches. You've built this same wheel a dozen times, and each time it's slightly different, slightly broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's What You Actually Need
&lt;/h2&gt;

&lt;p&gt;Most business start with a simple requirement: "Display when we're open.". However, as a project scales, you quickly run into technical bottlenecks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structural Constraints:&lt;/strong&gt; hardcoding hours into a model makes it nearly impossible to query "Open Now" status across different timezones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complexity of Exceptions:&lt;/strong&gt; handling a one-off holiday closure shouldn't require a developer to manually toggle a boolean in the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User Experience:&lt;/strong&gt; tables full of text-based hours are difficult for admins to scan and manage.&lt;/p&gt;

&lt;p&gt;When building applications for physical locations or service availability, like restaurants, medical clinics, hotels, booking systems, managing operating hours is a core requirement. Generic text fields or basic time pickers aren't enough when you need to answer: "Is this place open right now?"&lt;/p&gt;

&lt;p&gt;You need multiple time slots per day, exceptions for holidays, recurring patterns for annual events, timezone awareness, and it all wrapped in a UI that people will actually love using.&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;Filament Business Hours&lt;/strong&gt; comes in: a plugin built to streamline everything from simple opening hours to complex scheduling scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Just Works the Way You'd Expect
&lt;/h2&gt;

&lt;p&gt;Picture this: Your client opens the form. They see a clean interface with toggles for each day of the week. Click. Monday is open. Add a time slot: 9:00 AM to 5:00 PM. Need a lunch break? Add another slot: 9:00 AM to 12:00 PM, then 1:00 PM to 5:00 PM.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphk8njtimypdv9jvrdds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphk8njtimypdv9jvrdds.png" alt="Screenshot: Clean business hours interface with day toggles and time slots" width="800" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Special hours for Black Friday? Click "Set up exceptions," pick the date, adjust the hours. Annual Christmas closure? Set it to recur every year. The whole thing takes seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to see it in action?&lt;/strong&gt;  &lt;a href="https://www.youtube.com/watch?v=5gXI0v3BwAU" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpnumdswyfbwnookchg0.jpg" alt="Check out the demo video" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check out more examples and screenshots of business hours &lt;a href="https://andreia.github.io/blog/2025-02-09/filament-php-nord-theme/" rel="noopener noreferrer"&gt;on my blog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Your Experience?
&lt;/h2&gt;

&lt;p&gt;Have you built business hours functionality before? What challenges did you run into?&lt;/p&gt;

&lt;p&gt;Or maybe you've already tried Filament Business Hours and have feedback to share? I'd genuinely love to hear about your experiences, whether it's war stories from custom implementations or insights from using this plugin in production.&lt;/p&gt;

&lt;p&gt;Drop a comment below :)&lt;/p&gt;

</description>
      <category>filament</category>
      <category>php</category>
      <category>businesshours</category>
      <category>openinghours</category>
    </item>
    <item>
      <title>Arctic Nord Theme for Filament PHP</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Sun, 09 Feb 2025 17:47:20 +0000</pubDate>
      <link>https://forem.com/andreiabohner/arctic-nord-theme-for-filament-php-36fo</link>
      <guid>https://forem.com/andreiabohner/arctic-nord-theme-for-filament-php-36fo</guid>
      <description>&lt;p&gt;The Filament PHP ecosystem just got a fresh new look! I'm excited to introduce the &lt;a href="https://github.com/andreia/filament-nord-theme" rel="noopener noreferrer"&gt;Nord Theme for Filament PHP&lt;/a&gt;. This beautifully designed theme features both light and dark modes and is inspired by the popular &lt;a href="https://www.nordtheme.com/docs/colors-and-palettes" rel="noopener noreferrer"&gt;Nord color palette&lt;/a&gt;.&lt;br&gt;
If you're looking for a clean, stylish, and visually soothing user interface for your Filament applications, this theme is your perfect match! ❄️ ⛄&lt;/p&gt;
&lt;h2&gt;
  
  
  Why the Nord Theme?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nordtheme.com/" rel="noopener noreferrer"&gt;Nord&lt;/a&gt; is a beloved color palette derived from the icy blues, snowy tones of the Arctic and the mesmerizing hues of the Aurora Borealis. Designed for optimal readability and minimal eye strain, it blends Nordic aesthetics with cool, calming, and balanced dimmed pastel tones making it a ideal choice for a modern and elegant UI.&lt;/p&gt;

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

&lt;p&gt;This is the Filament Nord theme custom gray palette used to match the Nord's Polar Night and Snow Storm colors:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2wdh857a5ggct1qla88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2wdh857a5ggct1qla88.png" alt="Custom Filament gray palette" width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Getting started with the Filament Nord Theme is simple. You can install it via Composer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require andreia/filament-nord-theme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install the theme's required JS libraries (the forms, typography TailwindCSS plugins, and also postcss and autoprefixer) and create the postcss.config.js file if it not exists yet, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan filament-nord-theme:install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a new item to the input array of your &lt;code&gt;vite.config.js&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'vendor/andreia/filament-nord-theme/resources/css/theme.css'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile the assets with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Register the plugin on your panel (e.g. &lt;code&gt;/app/Providers/Filament/AdminPanelProvider.php&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Andreia\FilamentNordTheme\FilamentNordThemePlugin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$panel&lt;/span&gt;
  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FilamentNordThemePlugin&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You are all set!&lt;/p&gt;

&lt;h2&gt;
  
  
  Theme Preview
&lt;/h2&gt;

&lt;p&gt;Here's a preview of what the &lt;a href="https://github.com/filamentphp/demo" rel="noopener noreferrer"&gt;Filament demo project&lt;/a&gt; looks like with the Nord Theme applied:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdzxd621bryarem8hjpd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdzxd621bryarem8hjpd.jpg" title="Click to watch the theme preview" alt="Filament Nord Theme preview" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;p&gt;Every detail is carefully thought out to create a eye-comfortable, and clean feeling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9k21h3pwo8v5nglihfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9k21h3pwo8v5nglihfr.png" alt="Rounded corners dashboard widgets dark" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0nq9kpwas0ni4h1990d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0nq9kpwas0ni4h1990d.png" alt="Rounded corners dashboard widgets light" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rwwe05qe1u3cy9xdany.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rwwe05qe1u3cy9xdany.png" alt="Rounded corners buttons light" width="800" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xvas5ejz8mxklhk7u23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xvas5ejz8mxklhk7u23.png" alt="Rounded corners button and widgets light" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check more screenshots &lt;a href="https://andreia.github.io/blog/2025-02-09/filament-php-nord-theme/" rel="noopener noreferrer"&gt;on my blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Give it a try and let me know your thoughts! You can find the project on &lt;a href="https://github.com/andreia/filament-nord-theme" rel="noopener noreferrer"&gt;GitHub: Filament Nord Theme&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy theming! 💛 ✨&lt;/p&gt;

</description>
      <category>filament</category>
      <category>php</category>
      <category>nord</category>
      <category>theme</category>
    </item>
    <item>
      <title>Filament PHP Blade UI Components Visually Explained</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Tue, 18 Jun 2024 16:52:23 +0000</pubDate>
      <link>https://forem.com/andreiabohner/filament-php-blade-ui-components-visually-explained-3941</link>
      <guid>https://forem.com/andreiabohner/filament-php-blade-ui-components-visually-explained-3941</guid>
      <description>&lt;p&gt;In addition to the awesome full-stack components that &lt;a href="https://filamentphp.com/docs/" rel="noopener noreferrer"&gt;Filament PHP&lt;/a&gt; provides, some &lt;a href="https://filamentphp.com/docs/3.x/support/blade-components/overview" rel="noopener noreferrer"&gt;UI components&lt;/a&gt; are also available to be used independently on your Blade view files.&lt;/p&gt;

&lt;p&gt;I've been working on creating references to easily visualize these Blade UI components. &lt;br&gt;
You can check them all out on my blog: &lt;a href="https://andreia.github.io/blog/2024-06-15/filament-php-blade-ui-components-visually-explained/" rel="noopener noreferrer"&gt;https://andreia.github.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5h20vq2e1pt90hs66be2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5h20vq2e1pt90hs66be2.jpg" alt="Filament PHP Blade UI Components Overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope they've come in handy for your projects! :)&lt;/p&gt;

</description>
      <category>filament</category>
      <category>php</category>
      <category>blade</category>
      <category>components</category>
    </item>
    <item>
      <title>How to Extend a Filament Resource</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Sun, 07 Apr 2024 22:00:00 +0000</pubDate>
      <link>https://forem.com/andreiabohner/how-to-extend-a-filament-resource-2cl1</link>
      <guid>https://forem.com/andreiabohner/how-to-extend-a-filament-resource-2cl1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this article, we'll walk through how to extend a plugin resource, as well as other Filament resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking the Plugin's Configuration
&lt;/h2&gt;

&lt;p&gt;Let's say we installed a plugin that registers resources, for example, the &lt;a href="https://github.com/TappNetwork/filament-authentication-log/tree/main/src/Resources"&gt;Filament Authentication Log&lt;/a&gt;, and we want to extend the available &lt;code&gt;AuthenticationLogResource.php&lt;/code&gt; resource to add some customizations in our application.&lt;/p&gt;

&lt;p&gt;To start with, we need to check whether the plugin enables us to configure its resources. We can take a look at the &lt;a href="https://github.com/TappNetwork/filament-authentication-log/blob/main/config/filament-authentication-log.php"&gt;plugin's config file&lt;/a&gt; to see if we can locate a "resources" key or something similar that specifies the original resource(s):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config/filament-authentication-log.php&lt;/span&gt;

&lt;span class="s1"&gt;'resources'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'AutenticationLogResource'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;\Tapp\FilamentAuthenticationLog\Resources\AuthenticationLogResource&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And on the &lt;a href="https://github.com/TappNetwork/filament-authentication-log/blob/main/src/FilamentAuthenticationLogPlugin.php"&gt;plugin's class&lt;/a&gt; (the class used to interact with a panel configuration file), we can check that the resources registered are the ones defined on the config file:&lt;/p&gt;

&lt;p&gt;e.g.: &lt;a href="https://github.com/TappNetwork/filament-authentication-log/blob/main/src/FilamentAuthenticationLogPlugin.php"&gt;/src/FilamentAuthenticationLogPlugin.php&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Panel&lt;/span&gt; &lt;span class="nv"&gt;$panel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$panel&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'filament-authentication-log.resources'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have confirmed that the plugin provides this configuration, let's extend the resource!&lt;/p&gt;

&lt;h2&gt;
  
  
  Extending the Plugin Resource
&lt;/h2&gt;

&lt;p&gt;We are ready to write our own &lt;code&gt;AuthenticationLogResource.php&lt;/code&gt; resource that extends the plugin's resource! We can write it in our project's Filament resource directory (&lt;code&gt;app/Filament/Resources&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Filament\Resources&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Tapp\FilamentAuthenticationLog\Resources\AuthenticationLogResource&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;BaseAuthenticationLogResource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationLogResource&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;BaseAuthenticationLogResource&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// your custom code here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you haven't yet, you can now publish the plugin's configuration file so we would be able to instruct Filament to use our custom resource. Below is an example using our local &lt;code&gt;App\Filament\Resources\AuthenticationLogResource&lt;/code&gt; class we've just written in the project's &lt;code&gt;config/filament-authentication-log.php&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'resources'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'AutenticationLogResource'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;\App\Filament\Resources\AuthenticationLogResource&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, we can add the respective &lt;a href="https://filamentphp.com/docs/3.x/panels/pages"&gt;create, edit, list, and view pages&lt;/a&gt; (if they are used) on our local project. Here's an example for the list page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Filament\Resources\AuthenticationLogResource\Pages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Filament\Resources\Pages\ListRecords&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ListAuthenticationLogs&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ListRecords&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's just one more thing left: in the project's custom resource class, we need to override the &lt;code&gt;getPages()&lt;/code&gt; method to use our page instead of the plugin's:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Filament\Resources\AuthenticationLogResource\Pages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getPages&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Pages\ListAuthenticationLogs&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great! Our new resource class should now be used.&lt;/p&gt;

&lt;p&gt;This same technique can be applied to extend other Filament resources as well.&lt;/p&gt;

&lt;p&gt;Feel free to ping me here or on my &lt;a href="https://github.com/andreia/andreia"&gt;social networks&lt;/a&gt; if you have any questions, suggestions, or are using this technique. I'd love to hear from you! :)&lt;/p&gt;

&lt;p&gt;Happy coding and see you next time!&lt;/p&gt;

</description>
      <category>filament</category>
      <category>php</category>
      <category>resources</category>
    </item>
    <item>
      <title>Tiny Tip: Open a Wire Elements Modal from a Filament table action</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Fri, 21 Jul 2023 16:42:28 +0000</pubDate>
      <link>https://forem.com/andreiabohner/tiny-tip-open-a-wire-elements-modal-from-a-filament-table-action-1h4n</link>
      <guid>https://forem.com/andreiabohner/tiny-tip-open-a-wire-elements-modal-from-a-filament-table-action-1h4n</guid>
      <description>&lt;p&gt;You can open a Wire Elements Modal from an action using &lt;code&gt;$livewire&lt;/code&gt; (the current Livewire component instance) to emit the openModal event, like so:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LA4zfwjT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5281nife8fx9qco98sn7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LA4zfwjT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5281nife8fx9qco98sn7.png" alt="Code to open a wire element modal from a Filament action" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://filamentphp.com/tricks/open-a-wire-elements-modal-from-a-filament-table-action"&gt;https://filamentphp.com/tricks/open-a-wire-elements-modal-from-a-filament-table-action&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>filament</category>
      <category>modal</category>
      <category>wireelements</category>
    </item>
    <item>
      <title>Cheat Sheet for Uppy File Uploader</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Mon, 17 Jul 2023 02:46:22 +0000</pubDate>
      <link>https://forem.com/andreiabohner/cheat-sheet-for-uppy-file-uploader-12a2</link>
      <guid>https://forem.com/andreiabohner/cheat-sheet-for-uppy-file-uploader-12a2</guid>
      <description>&lt;p&gt;&lt;a href="https://uppy.io/"&gt;Uppy&lt;/a&gt; is a complete open source JavaScript uploader library with several features: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch files from local or several remote sources, &lt;/li&gt;
&lt;li&gt;Upload files using S3, S3 multipart, XHR for regular uploads to a HTTP server, Tus for resumable uploads, Transloadit for all kinds of processing, &lt;/li&gt;
&lt;li&gt;Resumable file uploads,&lt;/li&gt;
&lt;li&gt;Complete User Interface, &lt;/li&gt;
&lt;li&gt;Translated to several languages,&lt;/li&gt;
&lt;li&gt;File editing, compression, thumbnail generation, and more! &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This cheat sheet compiles all the Uppy functionalities so you can use it as a handy quick reference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download for free: &lt;a href="https://github.com/andreia/uppy-cheat-sheet/blob/main/uppy_cheat_sheet_v1.pdf"&gt;https://github.com/andreia/uppy-cheat-sheet/blob/main/uppy_cheat_sheet_v1.pdf&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if you use the PHP Laravel Framework and you're looking for Blade components for Uppy or if you looking to uploading files directly to S3 using multipart upload we've got you covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TappNetwork/laravel-uppy-s3-multipart-upload"&gt;Package for Multipart Uploads using Laravel, AWS S3, and Uppy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TappNetwork/blade-uppy"&gt;Blade Uppy components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PHP uploader classes coming soon :)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>uppy</category>
      <category>cheatsheet</category>
      <category>uploader</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Linux Cheat Sheet: Save the command output to a file</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Sun, 13 Mar 2022 01:38:58 +0000</pubDate>
      <link>https://forem.com/andreiabohner/linux-cheat-sheet-save-the-command-output-to-a-file-4l9i</link>
      <guid>https://forem.com/andreiabohner/linux-cheat-sheet-save-the-command-output-to-a-file-4l9i</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A1Kx8r_4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vfljqodnnz0jyvar301d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A1Kx8r_4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vfljqodnnz0jyvar301d.jpg" alt="Save the command output to a file" width="880" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/andreia/cheat-sheets/blob/master/linux/linux-cheat-sheet-command-output-to-file.jpg"&gt;Full size&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>cheatsheet</category>
      <category>commandline</category>
      <category>cli</category>
    </item>
    <item>
      <title>Quick Tip: 302, 303, or 307? Which HTTP response status code should be used to redirect?</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Mon, 09 Aug 2021 01:42:04 +0000</pubDate>
      <link>https://forem.com/andreiabohner/quick-tip-302-303-or-307-which-http-response-status-code-should-be-used-to-redirect-5ck0</link>
      <guid>https://forem.com/andreiabohner/quick-tip-302-303-or-307-which-http-response-status-code-should-be-used-to-redirect-5ck0</guid>
      <description>&lt;p&gt;Quick Tip on Redirecting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3YyHwSEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y4ki1iipacz3gwgh21tf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3YyHwSEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y4ki1iipacz3gwgh21tf.png" alt="Which HTTP response status code should be used to redirect?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reference:&lt;br&gt;
&lt;a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#:%7E:text=Note:%20RFC%201945%20and,expected%20of%20the%20client"&gt;https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#:~:text=Note:%20RFC%201945%20and,expected%20of%20the%20client&lt;/a&gt;&lt;/p&gt;

</description>
      <category>temporaryredirect</category>
      <category>httpstatus</category>
      <category>redirect</category>
    </item>
    <item>
      <title>OMGit! Git Commands Quick Reference</title>
      <dc:creator>Andréia Bohner</dc:creator>
      <pubDate>Sat, 03 Apr 2021 22:57:18 +0000</pubDate>
      <link>https://forem.com/andreiabohner/omgit-git-commands-quick-reference-1a2c</link>
      <guid>https://forem.com/andreiabohner/omgit-git-commands-quick-reference-1a2c</guid>
      <description>&lt;p&gt;I created a repository dedicated to collect Git commands that I find useful along the way of my development adventures:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/andreia/OMGit"&gt;https://github.com/andreia/OMGit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--57RYSVez--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzp6g547n6c3r2s9qs1j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--57RYSVez--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzp6g547n6c3r2s9qs1j.gif" alt="Adventure Time!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you find something useful on it :)&lt;/p&gt;

&lt;p&gt;A command I recently learned that you can use to time travel on your local Git repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;reset&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;hard&lt;/span&gt; &lt;span class="no"&gt;HEAD&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mf"&gt;10.&lt;/span&gt;&lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AcuWlUqa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tk5v89ow8g9y8rxk86ki.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AcuWlUqa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tk5v89ow8g9y8rxk86ki.jpg" alt="Time travel with Git"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have a Git command to share I would love to hear about it!&lt;/p&gt;

</description>
      <category>git</category>
      <category>reference</category>
      <category>tips</category>
      <category>commandline</category>
    </item>
  </channel>
</rss>
