mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-15 09:14:08 +00:00
feat(menu): priority-sorted menu groups, user-menu items, sidebar appearance toggle
Every main_menu entry moves from numeric group (1/2/3) to string-based group + group_label + priority. Groups now carry their own i18n label and child entries are sorted by an explicit priority field instead of config-array order, so module-contributed menu items can slot into any existing group at any position.
BootstrapController merges module-registered menu items into main_menu (previously they lived in a separate module_menu response key) and introduces a user_menu response key for items modules want to place in the avatar dropdown. The global store follows suit: moduleMenu becomes userMenu, menuGroups is a computed that sorts by priority, and hasActiveModules drops out.
New admin Appearance setting page with a single toggle for whether sidebar group labels render — so instances that prefer a compact sidebar can hide the Documents/Administration/Modules headings without losing the grouping itself. CompanyLayout watches route meta and re-bootstraps when the admin-mode flag flips so the sidebar repaints with the right menu on navigation across the admin boundary.
Test suites updated: module menu merging is asserted against main_menu (name: 'module-{slug}') rather than the old module_menu response; HelloWorldIntegrationTest verifies the schema translation path; CompanyModulesIndexTest covers the display_name attachment.
This commit is contained in:
@@ -48,6 +48,7 @@ class BootstrapController extends Controller
|
||||
'admin_page_title',
|
||||
'copyright_text',
|
||||
'save_pdf_to_disk',
|
||||
'show_sidebar_group_labels',
|
||||
]);
|
||||
|
||||
// Super admin mode — return admin-only menu with all companies listed
|
||||
@@ -92,6 +93,20 @@ class BootstrapController extends Controller
|
||||
$main_menu = $this->generateMenu('main_menu', $current_user);
|
||||
$setting_menu = $this->generateMenu('setting_menu', $current_user);
|
||||
|
||||
// Merge module-registered menu items into the main menu so they
|
||||
// participate in the unified group + priority ordering.
|
||||
foreach (ModuleRegistry::allMenu() as $slug => $item) {
|
||||
$main_menu[] = [
|
||||
'title' => __($item['title']),
|
||||
'link' => $item['link'],
|
||||
'icon' => $item['icon'],
|
||||
'name' => 'module-'.$slug,
|
||||
'group' => $item['group'] ?? 'modules',
|
||||
'group_label' => $item['group_label'] ?? 'navigation.modules',
|
||||
'priority' => $item['priority'] ?? 100,
|
||||
];
|
||||
}
|
||||
|
||||
$current_company = Company::find($request->header('company'));
|
||||
|
||||
if ((! $current_company) || ($current_company && ! $current_user->hasCompany($current_company->id))) {
|
||||
@@ -119,7 +134,15 @@ class BootstrapController extends Controller
|
||||
'main_menu' => $main_menu,
|
||||
'setting_menu' => $setting_menu,
|
||||
'modules' => Module::where('enabled', true)->pluck('name'),
|
||||
'module_menu' => array_values(ModuleRegistry::allMenu()),
|
||||
'user_menu' => collect(ModuleRegistry::allUserMenu())
|
||||
->map(fn (array $item, string $slug) => [
|
||||
...$item,
|
||||
'title' => __($item['title']),
|
||||
'name' => 'module-'.$slug,
|
||||
])
|
||||
->sortBy('priority')
|
||||
->values()
|
||||
->all(),
|
||||
'pending_invitations' => CompanyInvitationResource::collection($pendingInvitations),
|
||||
]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user