Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 08:38
2a75872

0.4.0 (2026-10-23)

⚠ BREAKING CHANGES

  • infer the model a table lists from its class name (#101)
  • give every admin page its own title (#99)

Features

  • add a category tree (#89) (708fe19)
  • add a headless tree component (#88) (b4e13f5)
  • add a log in as admin button to the login page in local (dc4732e)
  • add a subcategory from the category tree (cea1408)
  • add an unsaved changes toast for Inertia forms (835b0e4)
  • add category pages (#90) (8c97b5e)
  • add Section, SectionStack and Inset layout components (9745bbf)
  • always show the category menu button (#105) (514f7bf)
  • create and edit categories (5d6c67c)
  • delete a category with all categories below it (b8f5607)
  • give every admin page its own title (#99) (6de6534)
  • give the panel's own tables larasell: slugs (07e59a7)
  • infer the model a table lists from its class name (#101) (9e3bbd6)
  • let tables take constructor arguments for their actions (#93) (aec3460)
  • list, add and remove a category's products (d913115)
  • move categories by dragging them in the tree (436323f)
  • offer to add the first category when there are none (50c6876)
  • open categories with a chevron and show their number of children (#106) (7588d1a)
  • open the category tree in a dialog on mobile (#98) (3ef1c06)
  • open the current category instead of the clicked one (#107) (46c791e)
  • position built-in nav items via the NavItem enum (#103) (40094b6)
  • show an empty state for a category that no longer exists (#102) (c8c4610)

Bug Fixes

  • align the mobile header with the sidebar content (15b9cc7)
  • clear the category tree's scroll fade once it no longer scrolls (#111) (bf517e6)
  • flush every prefetched page after a change (67eb6b9)
  • keep deeply nested category names readable in the tree (#110) (b84b397)
  • keep the mobile category tree unchanged while its dialog closes (#108) (9157791)
  • open the path to the current category on every page load (a652495)
  • remember the mobile category tree's open categories (#109) (da08fd1)

Miscellaneous Chores

  • fix the Amp orb setup when it runs without root (9dcd95e)

Upgrade guide

Admin page titles now come from Laravel Head

Every admin page now has its own title, such as "Customers - Admin", set on the
server with Laravel Head instead of
Inertia's <Head> component. The admin panel no longer adds " - Admin" to
titles set with <Head title="...">.

Who is affected

Apps with their own admin pages, registered in resources/js/admin/pages, that
set a title with Inertia's <Head> component. Such a title now shows without
the " - Admin" suffix and competes with the title Laravel Head sets. Apps that
only use Route::index() table pages are not affected: those pages are titled
after their table.

How to upgrade

Remove the <Head> component from your page and set the title on its route in
routes/admin.php instead. The admin panel adds the " - Admin" suffix.

// Before: resources/js/admin/pages/Reports.tsx
<Head title="Reports" />
// After: routes/admin.php
Route::get('reports', ReportController::class)
    ->name('reports')
    ->withHead(title: 'Reports');

For a title that depends on the request, call Head::title() in the controller:

use Laravel\Head\Facades\Head;

Head::title($report->name);

Default table titles no longer end in "table"

A table's default title now leaves out a Table suffix in its class name, so
ProductReviewsTable is titled "Product reviews" instead of "Product reviews
table". Tables can now be named with the suffix they infer their model from,
like ProductReviewTable, without it showing up in the title.

Who is affected

Tables whose class name ends in Table and that don't override title(). The
new title also shows up in the page title of their Route::index route. Tables
without the suffix, and tables that define title(), are not affected.

How to upgrade

To keep the old title, return it from title():

use Larasell\Admin\Tables\Table;

class ProductReviewsTable extends Table
{
    // Before: no title() method, titled "Product reviews table"

    // After
    public function title(): string
    {
        return 'Product reviews table';
    }
}