Skip to content

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 22:09
32e2d3a

0.5.0 (2026-10-29)

⚠ BREAKING CHANGES

  • let extensions register admin pages through @larasell-dev/admin (#191)
  • add an orders index page
  • list products with Route::index and renumber the navigation
  • make the admin config publishable (#151)

Features

  • add a read-only order page (446ac8f)
  • add admins from the settings (6fa3043)
  • add an orders index page (e511842)
  • add and edit customers (b4fb93a)
  • add table actions to table headers and empty states (#156) (18f8539)
  • ask for the password again once the session expires (a412ac5)
  • create and edit products (#157) (43772d6)
  • cycle the theme with a rebindable keyboard shortcut (#145) (e377c01)
  • delete admins from the admins table (4814085)
  • delete customers from the customers table (e8c45a9)
  • delete products from the products table (1f1a318)
  • edit a product's SKU and barcode (#159) (59d738e)
  • edit a product's stock, backorders and quantity limits (eb3c45e)
  • edit a product's weight and dimensions (d1004df)
  • edit admins from the settings (47206f6)
  • fill a new category's slug from its name (#118) (e61875f)
  • freeze the navigation once the app has booted (#134) (9c51714)
  • hide a row action, for every row or per record (0f541cc)
  • hold off saving while a field in the form is busy (dddf955)
  • let admins choose a light, dark, or system theme on the profile page (87b016f)
  • let apps turn the customers module off (2190ec5)
  • let extensions register admin pages through @larasell-dev/admin (#191) (f3ce5c7)
  • limit navigation items to 100 children per parent (#132) (f7a4f57)
  • link the dashboard to the first onboarding steps (672ad5b)
  • link the products on a category's page to their edit page (768b640)
  • link to creating a product from a category's empty products (af39a9b)
  • list a customer's orders on their page (003a162)
  • list admins under a new Settings navigation item (dc0fed7)
  • list products on a new Products page (5cbda18)
  • list products with Route::index and renumber the navigation (ec98739)
  • make the admin config publishable (#151) (41d12de)
  • open a product's images in a lightbox to edit their alt text (85ca66e)
  • pick a product's categories from a checkbox tree (b07a0b1)
  • prefetch link actions in a category's products menu on hover (a90804d)
  • put the profile fields in a General section (2350974)
  • register a table route and its navigation item with Navigation::index (87367c9)
  • remove a product's images from a menu on each image (70e9969)
  • render the admin 404 pages through Inertia's exception handling (1ccf765)
  • reorder a product's images by dragging them (27fda6a)
  • report navigation items with an unregistered route as a structured error (#135) (7ed7c40)
  • shorten the category products menu's view item to "View" (b402a0a)
  • shorten the category tree menu's view item to "View" (96c6bb8)
  • show a 404 page inside the admin panel (6cb9000)
  • show a loading card per image while it uploads (3291b48)
  • show a loading state on the dev login link (#126) (1cda394)
  • show an icon or picture in table cells with image() (#150) (b16c152)
  • show Products above Categories in the navigation (27270eb)
  • show toasts and say why a stale image link didn't open (ff15aea)
  • show values in a coloured badge with BadgeColumn (#152) (96cfc25)
  • support nested navigation items (#128) (efb1f9e)
  • upload a product's images and link them on save (24f48f2)
  • use PasswordInput for the login password field (#124) (455715d)
  • use the unsaved changes toast on the profile page (#125) (c24acf7)
  • view a product from a category's products menu (ced44be)

Bug Fixes

  • animate the session expired dialog out after signing back in (ebc1bb4)
  • break navigation position ties by id instead of label (#130) (045b94a)
  • control the image lightbox with an open prop and drop stale image links (6f35a71)
  • freeze the mobile nav while it closes (6a81c0e)
  • keep the add images input inside its square (870e464)
  • keep the confirmation dialog's content unchanged while it closes (#123) (0d6d1a0)
  • keep the product form's last field clear of the unsaved changes toast (8a15c17)
  • leave out the actions menu on rows whose actions are all hidden (c0a5016)
  • let the category delete dialog animate out after deleting (#122) (4dd69e5)
  • only let siblings stop a navigation item from matching its pages (#131) (60898db)
  • put dialogs opened later above earlier ones (c6c87bc)
  • shorten the stale image link toast so it fits on one line (520b3a4)
  • show a back link instead of the category tree trigger when there are no categories (#121) (d7fd8b9)
  • stack the add product search above its buttons on narrow screens (#120) (891acd0)
  • stop avatar uploads on cancel and explain why they fail (fd66549)
  • stop the page jumping when the rows per page select opens (675a52a)
  • upload product images one at a time and explain each failure (13ee622)
  • visit the dev login with an Inertia link to avoid a full reload (24d13ac)

Miscellaneous Chores

  • add a phpstan rule that prefers route() over hard-coded URLs in tests (41679fb)
  • add an oxlint rule that asks for cn() in class lists (258ceee)
  • add an oxlint rule that forbids positive margins (#147) (7776bf5)
  • enable oxlint plugins and type-aware linting (#148) (95b8672)
  • report oxlint correctness rules as errors (#149) (27d9ad5)
  • store product images on the public disk in the workbench (d6510c4)
  • update @larasell-dev/ui to 0.1.19 (#138) (f50b174)
  • update @larasell-dev/ui to 0.1.25 (f677aef)

Upgrade guide

Admin pages import @larasell-dev/admin and register with Larasell.booting()

The larasell-admin/register, larasell-admin/components and larasell-admin/layouts modules
are now one module, @larasell-dev/admin. Pages are registered in a Larasell.booting()
callback and load when they're first opened instead of on every admin page. Every export of
React, Inertia and @larasell-dev/ui is now available to admin pages, not only the hooks and
components that were listed by hand.

Who is affected

Apps with their own admin pages in resources/js/admin, built with the admin() Vite plugin.
Apps without that directory are not affected.

How to upgrade

Register pages with a loader in resources/js/admin/app.tsx:

// Before
import { page } from "larasell-admin/register";
import Report from "./pages/Report";

page.add("Report", Report);

// After
import { Larasell } from "@larasell-dev/admin";

Larasell.booting(({ pages }) => {
  pages.register("Report", () => import("./pages/Report"));
});

Import components and layouts from @larasell-dev/admin:

// Before
import { ResourceTable } from "larasell-admin/components";
import { SidebarLayout } from "larasell-admin/layouts";

// After
import { ResourceTable, SidebarLayout } from "@larasell-dev/admin";

The TableResource type and its parts now match what tables send: they include
headerActions, pagination, badge columns and row links.

The config now lives in config/larasell/admin/panel.php under larasell.admin.panel

The admin config can now be published with php artisan vendor:publish --tag=larasell-admin-config.
It is published into its own config/larasell/admin folder, so future config files can sit
next to panel.php without crowding the app's config directory. Laravel names config keys
after their folder, so the key changed from larasell-admin to larasell.admin.panel.

Who is affected
  • Apps that read or set larasell-admin.path, larasell-admin.disk, or
    larasell-admin.tables.namespace, for example with config().
  • Apps with their own config/larasell-admin.php. The panel no longer reads that file, so its
    values are silently ignored.

Apps that only set LARASELL_ADMIN_PATH or LARASELL_ADMIN_DISK in .env are not affected.

How to upgrade

Rename the config keys:

// Before
config('larasell-admin.path');
config('larasell-admin.disk');
config(['larasell-admin.tables.namespace' => 'App\\Admin\\Tables']);

// After
config('larasell.admin.panel.path');
config('larasell.admin.panel.disk');
config(['larasell.admin.panel.tables.namespace' => 'App\\Admin\\Tables']);

If you have a config/larasell-admin.php, publish the new file, copy your values into it, and
delete the old one:

php artisan vendor:publish --tag=larasell-admin-config
# copy your values from config/larasell-admin.php into config/larasell/admin/panel.php
rm config/larasell-admin.php

Customers and Settings moved down one navigation position

The new Orders navigation item takes position 4000, between Categories and Customers. To keep the
built-in items 1000 apart, Customers moved from 4000 to 5000 and Settings from 5000 to 6000.

Who is affected

Apps that add navigation items with a fixed position() above 3000. An item at 4500 used to sit
between Customers and Settings; it now sits between Orders and Customers. Apps that place items
with before() or after(), or with NavItem::...->position(), keep their order and are not
affected.

How to upgrade

Add 1000 to positions above 3000 to keep an item where it was. Better, place it relative to a
built-in item so it follows any future change:

use Larasell\Admin\Enums\NavItem;
use Larasell\Admin\Facades\Navigation;

// Before: between Customers and Settings
Navigation::add('Reports', 'reports.index', 'bar-chart')->position(4500);

// After
Navigation::add('Reports', 'reports.index', 'bar-chart')->position(5500);

// Or
Navigation::add('Reports', 'reports.index', 'bar-chart')->after(NavItem::Customers);

Customers and Settings moved down one navigation position

The new Products navigation item takes position 3000, between Categories and Customers. To keep
the built-in items 1000 apart, Customers moved from 3000 to 4000 and Settings from 4000 to 5000.

Who is affected

Apps that add navigation items with a fixed position() above 2000. An item at 3500 used to sit
between Customers and Settings; it now sits between Products and Customers. Apps that place items
with before() or after(), or with NavItem::...->position(), keep their order and are not
affected.

How to upgrade

Add 1000 to positions above 2000 to keep an item where it was. Better, place it relative to a
built-in item so it follows any future change:

use Larasell\Admin\Enums\NavItem;
use Larasell\Admin\Facades\Navigation;

// Before: between Customers and Settings
Navigation::add('Reports', 'reports.index', 'bar-chart')->position(3500);

// After
Navigation::add('Reports', 'reports.index', 'bar-chart')->position(4500);

// Or
Navigation::add('Reports', 'reports.index', 'bar-chart')->after(NavItem::Customers);