Repository navigation
v0.5.0
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 withconfig(). - 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.phpCustomers 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);