From b749b5d1922414862f4629601da3212f4c1721cc Mon Sep 17 00:00:00 2001 From: fs Date: Sun, 5 Apr 2026 17:17:06 +0200 Subject: [PATCH] feat: centralize breadcrumbs in topbar and remove history navigation Move breadcrumb rendering from individual page templates into the core topbar. Each page now sets $breadcrumbs in its action .php file; the topbar renders it automatically via the shared partial. - Remove global back/forward buttons and app-nav-history.js component - Remove Alt+Arrow keyboard shortcuts for history navigation - Render breadcrumb in topbar-left section (replaces button area) - Clean up breadcrumb CSS: context-neutral base (flex, no margin) - Recalculate sticky titlebar offset in details container - Migrate all 41 pages (core + helpdesk, audit, addressbook, api-docs) - Add missing breadcrumbs to addressbook detail view - Update architecture contract tests (nav-history references removed) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../pages/address-book/index().php | 4 + .../pages/address-book/index(default).phtml | 7 -- .../pages/address-book/view($id).php | 5 + modules/api-docs/pages/api-docs/index().php | 4 + .../pages/api-docs/index(default).phtml | 5 - .../audit/pages/audit/api-audit/index().php | 4 + .../audit/api-audit/index(default).phtml | 7 -- .../audit/pages/audit/api-audit/view($id).php | 5 + .../pages/audit/api-audit/view(default).phtml | 7 -- .../pages/audit/import-audit/index().php | 4 + .../audit/import-audit/index(default).phtml | 7 -- .../pages/audit/import-audit/view($id).php | 5 + .../audit/import-audit/view(default).phtml | 7 -- .../pages/audit/system-audit/index().php | 4 + .../audit/system-audit/index(default).phtml | 7 -- .../pages/audit/system-audit/view($id).php | 5 + .../audit/system-audit/view(default).phtml | 7 -- .../audit/user-lifecycle-audit/index().php | 4 + .../user-lifecycle-audit/index(default).phtml | 7 -- .../audit/user-lifecycle-audit/view($id).php | 5 + .../user-lifecycle-audit/view(default).phtml | 7 -- .../helpdesk/pages/helpdesk/debitor($id).php | 5 + .../pages/helpdesk/debitor(default).phtml | 9 -- modules/helpdesk/pages/helpdesk/index().php | 4 + .../pages/helpdesk/index(default).phtml | 7 -- .../pages/helpdesk/settings/index().php | 5 + .../helpdesk/settings/index(default).phtml | 7 -- .../helpdesk/pages/helpdesk/ticket($id).php | 8 ++ .../pages/helpdesk/ticket(default).phtml | 12 --- pages/admin/departments/create().php | 5 + pages/admin/departments/create(default).phtml | 6 -- pages/admin/departments/edit($id).php | 8 +- pages/admin/departments/edit(default).phtml | 6 -- pages/admin/departments/index().php | 4 + pages/admin/departments/index(default).phtml | 7 -- pages/admin/docs/index($slug).php | 6 ++ pages/admin/docs/index(default).phtml | 8 -- pages/admin/imports/index().php | 5 + pages/admin/imports/index(default).phtml | 6 -- pages/admin/index().php | 5 + pages/admin/index(default).phtml | 7 -- pages/admin/mail-log/index().php | 4 + pages/admin/mail-log/index(default).phtml | 7 -- pages/admin/mail-log/view($id).php | 5 + pages/admin/mail-log/view(default).phtml | 8 -- pages/admin/permissions/create().php | 5 + pages/admin/permissions/create(default).phtml | 6 -- pages/admin/permissions/edit($id).php | 8 +- pages/admin/permissions/edit(default).phtml | 8 +- pages/admin/permissions/index().php | 4 + pages/admin/permissions/index(default).phtml | 7 -- pages/admin/roles/create().php | 5 + pages/admin/roles/create(default).phtml | 6 -- pages/admin/roles/edit($id).php | 8 +- pages/admin/roles/edit(default).phtml | 6 -- pages/admin/roles/index().php | 4 + pages/admin/roles/index(default).phtml | 7 -- pages/admin/scheduled-jobs/edit($id).php | 8 +- .../admin/scheduled-jobs/edit(default).phtml | 7 -- pages/admin/scheduled-jobs/index().php | 4 + .../admin/scheduled-jobs/index(default).phtml | 7 -- pages/admin/settings/index().php | 5 + pages/admin/settings/index(default).phtml | 5 - pages/admin/stats/index().php | 5 + pages/admin/stats/index(default).phtml | 7 -- pages/admin/system-info/index().php | 5 + pages/admin/system-info/index(default).phtml | 7 -- pages/admin/tenants/create().php | 5 + pages/admin/tenants/create(default).phtml | 6 -- pages/admin/tenants/edit($id).php | 8 +- pages/admin/tenants/edit(default).phtml | 6 -- pages/admin/tenants/index().php | 4 + pages/admin/tenants/index(default).phtml | 7 -- pages/admin/users/create().php | 5 + pages/admin/users/create(default).phtml | 6 -- pages/admin/users/edit($id).php | 10 +- pages/admin/users/edit(default).phtml | 10 -- pages/admin/users/index().php | 4 + pages/admin/users/index(default).phtml | 7 -- pages/help/hotkeys(default).phtml | 1 - pages/search/index().php | 5 + pages/search/index(default).phtml | 7 -- templates/partials/app-breadcrumb.phtml | 3 +- templates/partials/app-topbar.phtml | 19 ++-- .../FrontendRuntimeContractSupport.php | 1 - .../FrontendRuntimeHostContractTest.php | 1 - web/css/components/app-breadcrumb.css | 9 +- web/css/components/app-details.css | 18 +--- web/css/layout/app-topbar.css | 19 +--- web/js/app-init.js | 5 - web/js/components/app-nav-history.js | 96 ------------------- 91 files changed, 231 insertions(+), 436 deletions(-) delete mode 100644 web/js/components/app-nav-history.js diff --git a/modules/addressbook/pages/address-book/index().php b/modules/addressbook/pages/address-book/index().php index a65eb42..08ec1bd 100644 --- a/modules/addressbook/pages/address-book/index().php +++ b/modules/addressbook/pages/address-book/index().php @@ -76,6 +76,10 @@ $csrfKey = Session::$csrfSessionKey; $csrfToken = $session[$csrfKey] ?? ''; Buffer::set('title', t('Address book')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Address book')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); Buffer::set( 'grid_csrf', diff --git a/modules/addressbook/pages/address-book/index(default).phtml b/modules/addressbook/pages/address-book/index(default).phtml index 89ccbd9..916af0f 100644 --- a/modules/addressbook/pages/address-book/index(default).phtml +++ b/modules/addressbook/pages/address-book/index(default).phtml @@ -16,13 +16,6 @@ $filterChipMeta = is_array($filterChipMeta ?? null) ? $filterChipMeta : []; $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Address book')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - t('Home'), 'path' => 'admin'], + ['label' => t('Address book'), 'path' => 'address-book'], + ['label' => $title], +]; diff --git a/modules/api-docs/pages/api-docs/index().php b/modules/api-docs/pages/api-docs/index().php index 578d086..275b1d9 100644 --- a/modules/api-docs/pages/api-docs/index().php +++ b/modules/api-docs/pages/api-docs/index().php @@ -8,4 +8,8 @@ Guard::requireLogin(); Guard::requireAbilityOrForbidden(ApiDocsAuthorizationPolicy::ABILITY_VIEW); Buffer::set('title', t('API docs')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('API docs')], +]; Buffer::set('style_groups', json_encode(['api-docs'])); diff --git a/modules/api-docs/pages/api-docs/index(default).phtml b/modules/api-docs/pages/api-docs/index(default).phtml index 5a2447d..aabb453 100644 --- a/modules/api-docs/pages/api-docs/index(default).phtml +++ b/modules/api-docs/pages/api-docs/index(default).phtml @@ -1,10 +1,5 @@ t('Home'), 'path' => 'admin'], - ['label' => t('API docs')], -]; $specUrl = lurl('admin/api-docs/spec'); -require templatePath('partials/app-breadcrumb.phtml'); ?>
diff --git a/modules/audit/pages/audit/api-audit/index().php b/modules/audit/pages/audit/api-audit/index().php index e6ff29d..3663e32 100644 --- a/modules/audit/pages/audit/api-audit/index().php +++ b/modules/audit/pages/audit/api-audit/index().php @@ -17,6 +17,10 @@ $viewAuth['page'] = app(UiAccessService::class)->pageCapabilities( ); Buffer::set('title', t('API audit logs')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('API audit logs')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $filterSchema = require __DIR__ . '/filter-schema.php'; diff --git a/modules/audit/pages/audit/api-audit/index(default).phtml b/modules/audit/pages/audit/api-audit/index(default).phtml index cbf3333..4bfed9f 100644 --- a/modules/audit/pages/audit/api-audit/index(default).phtml +++ b/modules/audit/pages/audit/api-audit/index(default).phtml @@ -11,13 +11,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('API audit logs')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/modules/audit/pages/audit/api-audit/view($id).php b/modules/audit/pages/audit/api-audit/view($id).php index 16da877..f7ee2c4 100644 --- a/modules/audit/pages/audit/api-audit/view($id).php +++ b/modules/audit/pages/audit/api-audit/view($id).php @@ -13,3 +13,8 @@ $auditLog = AuditPageHelper::findOrRedirect( 'View API audit entry', $id ?? null ); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('API audit logs'), 'path' => 'audit/api-audit'], + ['label' => t('View')], +]; diff --git a/modules/audit/pages/audit/api-audit/view(default).phtml b/modules/audit/pages/audit/api-audit/view(default).phtml index 304d4b6..dd268f1 100644 --- a/modules/audit/pages/audit/api-audit/view(default).phtml +++ b/modules/audit/pages/audit/api-audit/view(default).phtml @@ -51,13 +51,6 @@ $tokenTenantId = (int) ($auditLog['token_tenant_id'] ?? 0);
t('Home'), 'path' => 'admin'], - ['label' => t('API audit logs'), 'path' => 'audit/api-audit'], - ['label' => t('View')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - $titlebar = [ 'title' => t('View API audit entry'), 'backHref' => 'audit/api-audit', diff --git a/modules/audit/pages/audit/import-audit/index().php b/modules/audit/pages/audit/import-audit/index().php index 9be8378..eacaea8 100644 --- a/modules/audit/pages/audit/import-audit/index().php +++ b/modules/audit/pages/audit/import-audit/index().php @@ -17,6 +17,10 @@ $viewAuth['page'] = app(UiAccessService::class)->pageCapabilities( ); Buffer::set('title', t('Import audit logs')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Import audit logs')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $filterSchema = require __DIR__ . '/filter-schema.php'; diff --git a/modules/audit/pages/audit/import-audit/index(default).phtml b/modules/audit/pages/audit/import-audit/index(default).phtml index 4325402..0281a1c 100644 --- a/modules/audit/pages/audit/import-audit/index(default).phtml +++ b/modules/audit/pages/audit/import-audit/index(default).phtml @@ -11,13 +11,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Import audit logs')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/modules/audit/pages/audit/import-audit/view($id).php b/modules/audit/pages/audit/import-audit/view($id).php index c51cc4e..2a6864d 100644 --- a/modules/audit/pages/audit/import-audit/view($id).php +++ b/modules/audit/pages/audit/import-audit/view($id).php @@ -13,3 +13,8 @@ $auditRun = AuditPageHelper::findOrRedirect( 'View import audit entry', $id ?? null ); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Import audit logs'), 'path' => 'audit/import-audit'], + ['label' => t('View')], +]; diff --git a/modules/audit/pages/audit/import-audit/view(default).phtml b/modules/audit/pages/audit/import-audit/view(default).phtml index 076b376..50ba0c7 100644 --- a/modules/audit/pages/audit/import-audit/view(default).phtml +++ b/modules/audit/pages/audit/import-audit/view(default).phtml @@ -54,13 +54,6 @@ if ($tenantLabel === '') {
t('Home'), 'path' => 'admin'], - ['label' => t('Import audit logs'), 'path' => 'audit/import-audit'], - ['label' => t('View')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - $titlebar = [ 'title' => t('View import audit entry'), 'backHref' => 'audit/import-audit', diff --git a/modules/audit/pages/audit/system-audit/index().php b/modules/audit/pages/audit/system-audit/index().php index f22f23c..12c0889 100644 --- a/modules/audit/pages/audit/system-audit/index().php +++ b/modules/audit/pages/audit/system-audit/index().php @@ -17,6 +17,10 @@ $viewAuth['page'] = app(UiAccessService::class)->pageCapabilities( ); Buffer::set('title', t('System audit logs')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('System audit logs')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $filterSchema = require __DIR__ . '/filter-schema.php'; diff --git a/modules/audit/pages/audit/system-audit/index(default).phtml b/modules/audit/pages/audit/system-audit/index(default).phtml index a288dc1..064feb1 100644 --- a/modules/audit/pages/audit/system-audit/index(default).phtml +++ b/modules/audit/pages/audit/system-audit/index(default).phtml @@ -10,13 +10,6 @@ $filterChipMeta = is_array($filterChipMeta ?? null) ? $filterChipMeta : []; $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchema : []; $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; -?> - t('Home'), 'path' => 'admin'], - ['label' => t('System audit logs')], -]; -require templatePath('partials/app-breadcrumb.phtml'); ?> t('Home'), 'path' => 'admin'], + ['label' => t('System audit logs'), 'path' => 'audit/system-audit'], + ['label' => t('View')], +]; diff --git a/modules/audit/pages/audit/system-audit/view(default).phtml b/modules/audit/pages/audit/system-audit/view(default).phtml index 43da6f8..55bee26 100644 --- a/modules/audit/pages/audit/system-audit/view(default).phtml +++ b/modules/audit/pages/audit/system-audit/view(default).phtml @@ -47,13 +47,6 @@ if ($tenantLabel === '') {
t('Home'), 'path' => 'admin'], - ['label' => t('System audit logs'), 'path' => 'audit/system-audit'], - ['label' => t('View')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - $titlebar = [ 'title' => t('View system audit entry'), 'backHref' => 'audit/system-audit', diff --git a/modules/audit/pages/audit/user-lifecycle-audit/index().php b/modules/audit/pages/audit/user-lifecycle-audit/index().php index 30f29a8..765c099 100644 --- a/modules/audit/pages/audit/user-lifecycle-audit/index().php +++ b/modules/audit/pages/audit/user-lifecycle-audit/index().php @@ -20,6 +20,10 @@ $viewAuth['page'] = app(UiAccessService::class)->pageCapabilities( ); Buffer::set('title', t('User lifecycle logs')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('User lifecycle logs')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $filterSchema = require __DIR__ . '/filter-schema.php'; diff --git a/modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml b/modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml index aea2096..ca33265 100644 --- a/modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml +++ b/modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml @@ -11,13 +11,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('User lifecycle logs')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/modules/audit/pages/audit/user-lifecycle-audit/view($id).php b/modules/audit/pages/audit/user-lifecycle-audit/view($id).php index 2d26b01..9e522ce 100644 --- a/modules/audit/pages/audit/user-lifecycle-audit/view($id).php +++ b/modules/audit/pages/audit/user-lifecycle-audit/view($id).php @@ -18,6 +18,11 @@ $auditLog = AuditPageHelper::findOrRedirect( 'View user lifecycle audit entry', $id ?? null ); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('User lifecycle logs'), 'path' => 'audit/user-lifecycle-audit'], + ['label' => t('View')], +]; $auditService = app(UserLifecycleAuditService::class); $snapshot = null; diff --git a/modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml b/modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml index a3eeaec..d65e6b4 100644 --- a/modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml +++ b/modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml @@ -29,13 +29,6 @@ $isRestorable = $canRestore
t('Home'), 'path' => 'admin'], - ['label' => t('User lifecycle logs'), 'path' => 'audit/user-lifecycle-audit'], - ['label' => t('View')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - $titlebar = [ 'title' => t('View user lifecycle audit entry'), 'backHref' => 'audit/user-lifecycle-audit', diff --git a/modules/helpdesk/pages/helpdesk/debitor($id).php b/modules/helpdesk/pages/helpdesk/debitor($id).php index 622613b..b69da27 100644 --- a/modules/helpdesk/pages/helpdesk/debitor($id).php +++ b/modules/helpdesk/pages/helpdesk/debitor($id).php @@ -126,3 +126,8 @@ $contactsFilterChipMeta = [ Buffer::set('title', $customerName . ' — ' . t('Helpdesk')); Buffer::set('style_groups', json_encode(['helpdesk'])); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Helpdesk'), 'path' => 'helpdesk'], + ['label' => $customerName], +]; diff --git a/modules/helpdesk/pages/helpdesk/debitor(default).phtml b/modules/helpdesk/pages/helpdesk/debitor(default).phtml index b10f432..6951994 100644 --- a/modules/helpdesk/pages/helpdesk/debitor(default).phtml +++ b/modules/helpdesk/pages/helpdesk/debitor(default).phtml @@ -37,15 +37,6 @@ $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; data-controlling-dashboard-url="" >
- t('Home'), 'path' => 'admin'], - ['label' => t('Helpdesk'), 'path' => 'helpdesk'], - ['label' => $customerName], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - ?> - isConfigured(); Buffer::set('title', t('Customers')); Buffer::set('style_groups', json_encode(['helpdesk'])); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Helpdesk')], +]; diff --git a/modules/helpdesk/pages/helpdesk/index(default).phtml b/modules/helpdesk/pages/helpdesk/index(default).phtml index 23e14f9..e7e6cb0 100644 --- a/modules/helpdesk/pages/helpdesk/index(default).phtml +++ b/modules/helpdesk/pages/helpdesk/index(default).phtml @@ -9,13 +9,6 @@ $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; $filterChipMeta = is_array($filterChipMeta ?? null) ? $filterChipMeta : []; $isConfigured = $isConfigured ?? false; ?> - t('Home'), 'path' => 'admin'], - ['label' => t('Helpdesk')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> diff --git a/modules/helpdesk/pages/helpdesk/settings/index().php b/modules/helpdesk/pages/helpdesk/settings/index().php index 2e0f624..92a6637 100644 --- a/modules/helpdesk/pages/helpdesk/settings/index().php +++ b/modules/helpdesk/pages/helpdesk/settings/index().php @@ -163,3 +163,8 @@ $controllingConfigSource = (string) ($controllingConfigEnvelope['source'] ?? 'de Buffer::set('title', t('Helpdesk settings')); Buffer::set('style_groups', json_encode(['helpdesk'])); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Helpdesk'), 'path' => 'helpdesk'], + ['label' => t('Settings')], +]; diff --git a/modules/helpdesk/pages/helpdesk/settings/index(default).phtml b/modules/helpdesk/pages/helpdesk/settings/index(default).phtml index 996234f..7fffc11 100644 --- a/modules/helpdesk/pages/helpdesk/settings/index(default).phtml +++ b/modules/helpdesk/pages/helpdesk/settings/index(default).phtml @@ -52,13 +52,6 @@ $isOAuth2 = $authMode === HelpdeskSettingsGateway::AUTH_MODE_OAUTH2;
t('Home'), 'path' => 'admin'], - ['label' => t('Helpdesk'), 'path' => 'helpdesk'], - ['label' => t('Settings')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - $titlebar = [ 'title' => t('Helpdesk settings'), 'backHref' => lurl('helpdesk'), diff --git a/modules/helpdesk/pages/helpdesk/ticket($id).php b/modules/helpdesk/pages/helpdesk/ticket($id).php index b0ac040..b1e0020 100644 --- a/modules/helpdesk/pages/helpdesk/ticket($id).php +++ b/modules/helpdesk/pages/helpdesk/ticket($id).php @@ -44,3 +44,11 @@ $ticketCommunicationUrl = lurl('helpdesk/ticket-communication-data'); Buffer::set('title', $ticketDescription . ' — ' . t('Helpdesk')); Buffer::set('style_groups', json_encode(['helpdesk'])); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Helpdesk'), 'path' => 'helpdesk'], +]; +if ($ticketCustomerNo !== '') { + $breadcrumbs[] = ['label' => (string) ($ticket['Company_Contact_Name'] ?? $ticketCustomerNo), 'path' => 'helpdesk/debitor/' . rawurlencode($ticketCustomerNo)]; +} +$breadcrumbs[] = ['label' => t('Ticket') . ' ' . $ticketNo]; diff --git a/modules/helpdesk/pages/helpdesk/ticket(default).phtml b/modules/helpdesk/pages/helpdesk/ticket(default).phtml index abc2f07..2bc6d89 100644 --- a/modules/helpdesk/pages/helpdesk/ticket(default).phtml +++ b/modules/helpdesk/pages/helpdesk/ticket(default).phtml @@ -26,18 +26,6 @@ $backUrl = $ticketCustomerNo !== '' ? lurl('helpdesk/debitor/' . rawurlencode($t data-ticket-communication-url="" >
- t('Home'), 'path' => 'admin'], - ['label' => t('Helpdesk'), 'path' => 'helpdesk'], - ]; - if ($ticketCustomerNo !== '') { - $breadcrumbs[] = ['label' => (string) ($ticket['Company_Contact_Name'] ?? $ticketCustomerNo), 'path' => 'helpdesk/debitor/' . rawurlencode($ticketCustomerNo)]; - } - $breadcrumbs[] = ['label' => t('Ticket') . ' ' . $ticketNo]; - require templatePath('partials/app-breadcrumb.phtml'); - ?> - t('Ticket') . ' ' . $ticketNo, diff --git a/pages/admin/departments/create().php b/pages/admin/departments/create().php index 403b3cf..7918337 100644 --- a/pages/admin/departments/create().php +++ b/pages/admin/departments/create().php @@ -100,3 +100,8 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); Buffer::set('title', t('Create department')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Departments'), 'path' => 'admin/departments'], + ['label' => t('Create department')], +]; diff --git a/pages/admin/departments/create(default).phtml b/pages/admin/departments/create(default).phtml index 4bbfadf..7a0d165 100644 --- a/pages/admin/departments/create(default).phtml +++ b/pages/admin/departments/create(default).phtml @@ -10,12 +10,6 @@
t('Home'), 'path' => 'admin'], - ['label' => t('Departments'), 'path' => 'admin/departments'], - ['label' => t('Create department')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => t('Create department'), 'backHref' => 'admin/departments', diff --git a/pages/admin/departments/edit($id).php b/pages/admin/departments/edit($id).php index 298d330..c85157d 100644 --- a/pages/admin/departments/edit($id).php +++ b/pages/admin/departments/edit($id).php @@ -151,4 +151,10 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); -Buffer::set('title', $canUpdateDepartment ? t('Edit department') : t('View department')); +$titleText = $canUpdateDepartment ? t('Edit department') : t('View department'); +Buffer::set('title', $titleText); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Departments'), 'path' => 'admin/departments'], + ['label' => $titleText], +]; diff --git a/pages/admin/departments/edit(default).phtml b/pages/admin/departments/edit(default).phtml index 52c11b5..5dede92 100644 --- a/pages/admin/departments/edit(default).phtml +++ b/pages/admin/departments/edit(default).phtml @@ -21,12 +21,6 @@ $titleText = $isReadOnly ? t('View department') : t('Edit department');
t('Home'), 'path' => 'admin'], - ['label' => t('Departments'), 'path' => 'admin/departments'], - ['label' => $titleText], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => $titleText, 'backHref' => 'admin/departments', diff --git a/pages/admin/departments/index().php b/pages/admin/departments/index().php index 5847a12..b05f8f7 100644 --- a/pages/admin/departments/index().php +++ b/pages/admin/departments/index().php @@ -42,6 +42,10 @@ usort($tenants, static function ($a, $b) { }); Buffer::set('title', t('Departments')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Departments')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $csrfKey = Session::$csrfSessionKey; $csrfToken = $session[$csrfKey] ?? ''; diff --git a/pages/admin/departments/index(default).phtml b/pages/admin/departments/index(default).phtml index deb2d8f..cde2294 100644 --- a/pages/admin/departments/index(default).phtml +++ b/pages/admin/departments/index(default).phtml @@ -14,13 +14,6 @@ $activeTenant = (string) ($activeTenant ?? ($toolbarFilterState['tenant'] ?? '') $showTenantTabs = isset($tenants) && is_array($tenants) && count($tenants) > 1; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Departments')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/pages/admin/docs/index($slug).php b/pages/admin/docs/index($slug).php index d586485..a22eaa2 100644 --- a/pages/admin/docs/index($slug).php +++ b/pages/admin/docs/index($slug).php @@ -54,5 +54,11 @@ $currentSlug = $slug; $currentTitle = (string) $allDocs[$slug]; Buffer::set('title', $currentTitle . ' - ' . t('Documentation')); + +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Documentation'), 'path' => 'admin/docs/' . $defaultSlug], + ['label' => $currentTitle], +]; Buffer::set('style_groups', json_encode(['docs'])); Buffer::set('docs_rendered_html', $renderedHtml); diff --git a/pages/admin/docs/index(default).phtml b/pages/admin/docs/index(default).phtml index a1df697..a1acc09 100644 --- a/pages/admin/docs/index(default).phtml +++ b/pages/admin/docs/index(default).phtml @@ -44,14 +44,6 @@
- t('Home'), 'path' => 'admin'], - ['label' => t('Documentation'), 'path' => 'admin/docs/' . $defaultSlug], - ['label' => $currentTitle], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - ?>
diff --git a/pages/admin/imports/index().php b/pages/admin/imports/index().php index 9ae015d..c6c9d96 100644 --- a/pages/admin/imports/index().php +++ b/pages/admin/imports/index().php @@ -136,3 +136,8 @@ foreach ($profileOptions as $option) { } Buffer::set('title', t('Imports')); + +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Imports')], +]; diff --git a/pages/admin/imports/index(default).phtml b/pages/admin/imports/index(default).phtml index c278ff6..fae6e16 100644 --- a/pages/admin/imports/index(default).phtml +++ b/pages/admin/imports/index(default).phtml @@ -1,10 +1,5 @@ t('Home'), 'path' => 'admin'], - ['label' => t('Imports')], -]; - $hasAllowedProfile = !empty($allowedProfileOptions); $renderErrorTable = static function (array $rows): void { @@ -43,7 +38,6 @@ $renderErrorTable = static function (array $rows): void {
-

diff --git a/pages/admin/index().php b/pages/admin/index().php index 565160c..05d0c04 100644 --- a/pages/admin/index().php +++ b/pages/admin/index().php @@ -11,3 +11,8 @@ $user = $session['user'] ?? null; $first_name = $user['first_name'] ?? ''; Buffer::set('title', t('Admin')); + +$breadcrumbs = [ + ['label' => t('Login'), 'path' => 'logout'], + ['label' => t('Home')], +]; diff --git a/pages/admin/index(default).phtml b/pages/admin/index(default).phtml index 4dfa118..87b60e6 100644 --- a/pages/admin/index(default).phtml +++ b/pages/admin/index(default).phtml @@ -6,13 +6,6 @@ */ -?> - t('Login'), 'path' => 'logout'], - ['label' => t('Home')], -]; -require templatePath('partials/app-breadcrumb.phtml'); ?>

diff --git a/pages/admin/mail-log/index().php b/pages/admin/mail-log/index().php index b35a369..c4b70c6 100644 --- a/pages/admin/mail-log/index().php +++ b/pages/admin/mail-log/index().php @@ -41,6 +41,10 @@ $clientFilterSchema = $listFilterContext['clientFilterSchema']; $searchConfig = $listFilterContext['searchConfig']; Buffer::set('title', t('Mail logs')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Mail logs')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $csrfKey = Session::$csrfSessionKey; $csrfToken = $session[$csrfKey] ?? ''; diff --git a/pages/admin/mail-log/index(default).phtml b/pages/admin/mail-log/index(default).phtml index 5f1c7fc..b691b94 100644 --- a/pages/admin/mail-log/index(default).phtml +++ b/pages/admin/mail-log/index(default).phtml @@ -10,13 +10,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Mail logs')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/pages/admin/mail-log/view($id).php b/pages/admin/mail-log/view($id).php index 123421b..95bd805 100644 --- a/pages/admin/mail-log/view($id).php +++ b/pages/admin/mail-log/view($id).php @@ -17,3 +17,8 @@ if (!$mailLog) { } Buffer::set('title', t('View mail log')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Mail logs'), 'path' => 'admin/mail-log'], + ['label' => t('View')], +]; diff --git a/pages/admin/mail-log/view(default).phtml b/pages/admin/mail-log/view(default).phtml index 751a41a..b9694b4 100644 --- a/pages/admin/mail-log/view(default).phtml +++ b/pages/admin/mail-log/view(default).phtml @@ -13,14 +13,6 @@ $statusBadge = $status->badgeVariant();
- t('Home'), 'path' => 'admin'], - ['label' => t('Mail logs'), 'path' => 'admin/mail-log'], - ['label' => t('View')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - ?>

diff --git a/pages/admin/permissions/create().php b/pages/admin/permissions/create().php index 7c08260..5bd68ef 100644 --- a/pages/admin/permissions/create().php +++ b/pages/admin/permissions/create().php @@ -66,3 +66,8 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); Buffer::set('title', t('Create permission')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Permissions'), 'path' => 'admin/permissions'], + ['label' => t('Create permission')], +]; diff --git a/pages/admin/permissions/create(default).phtml b/pages/admin/permissions/create(default).phtml index 65fdb02..d95003a 100644 --- a/pages/admin/permissions/create(default).phtml +++ b/pages/admin/permissions/create(default).phtml @@ -9,12 +9,6 @@
t('Home'), 'path' => 'admin'], - ['label' => t('Permissions'), 'path' => 'admin/permissions'], - ['label' => t('Create permission')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => t('Create permission'), 'backHref' => 'admin/permissions', diff --git a/pages/admin/permissions/edit($id).php b/pages/admin/permissions/edit($id).php index a2787ea..39d4e65 100644 --- a/pages/admin/permissions/edit($id).php +++ b/pages/admin/permissions/edit($id).php @@ -112,4 +112,10 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); -Buffer::set('title', $canUpdatePermission ? t('Edit permission') : t('View permission')); +$titleText = $canUpdatePermission ? t('Edit permission') : t('View permission'); +Buffer::set('title', $titleText); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Permissions'), 'path' => 'admin/permissions'], + ['label' => $titleText], +]; diff --git a/pages/admin/permissions/edit(default).phtml b/pages/admin/permissions/edit(default).phtml index d393756..e3f9490 100644 --- a/pages/admin/permissions/edit(default).phtml +++ b/pages/admin/permissions/edit(default).phtml @@ -13,18 +13,12 @@ use MintyPHP\Session; $canUpdatePermission = (bool) ($canUpdatePermission ?? false); $canDeletePermission = (bool) ($canDeletePermission ?? false); $isReadOnly = !$canUpdatePermission; -$titleText = $isReadOnly ? t('View permission') : t('Edit permission'); +$titleText = $titleText ?? ($isReadOnly ? t('View permission') : t('Edit permission')); ?>
t('Home'), 'path' => 'admin'], - ['label' => t('Permissions'), 'path' => 'admin/permissions'], - ['label' => $titleText], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => $titleText, 'backHref' => 'admin/permissions', diff --git a/pages/admin/permissions/index().php b/pages/admin/permissions/index().php index a45efef..8b9885e 100644 --- a/pages/admin/permissions/index().php +++ b/pages/admin/permissions/index().php @@ -49,6 +49,10 @@ $clientFilterSchema = $listFilterContext['clientFilterSchema']; $searchConfig = $listFilterContext['searchConfig']; Buffer::set('title', t('Permissions')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Permissions')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $csrfKey = Session::$csrfSessionKey; $csrfToken = $session[$csrfKey] ?? ''; diff --git a/pages/admin/permissions/index(default).phtml b/pages/admin/permissions/index(default).phtml index d6d299b..c6373e2 100644 --- a/pages/admin/permissions/index(default).phtml +++ b/pages/admin/permissions/index(default).phtml @@ -12,13 +12,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Permissions')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/pages/admin/roles/create().php b/pages/admin/roles/create().php index 0d2f2a2..0f3e080 100644 --- a/pages/admin/roles/create().php +++ b/pages/admin/roles/create().php @@ -116,3 +116,8 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); Buffer::set('title', t('Create role')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Roles'), 'path' => 'admin/roles'], + ['label' => t('Create role')], +]; diff --git a/pages/admin/roles/create(default).phtml b/pages/admin/roles/create(default).phtml index f9c9a8a..651f31a 100644 --- a/pages/admin/roles/create(default).phtml +++ b/pages/admin/roles/create(default).phtml @@ -9,12 +9,6 @@
t('Home'), 'path' => 'admin'], - ['label' => t('Roles'), 'path' => 'admin/roles'], - ['label' => t('Create role')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => t('Create role'), 'backHref' => 'admin/roles', diff --git a/pages/admin/roles/edit($id).php b/pages/admin/roles/edit($id).php index 08f8fba..e0ac029 100644 --- a/pages/admin/roles/edit($id).php +++ b/pages/admin/roles/edit($id).php @@ -128,4 +128,10 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); -Buffer::set('title', $canUpdateRole ? t('Edit role') : t('View role')); +$titleText = $canUpdateRole ? t('Edit role') : t('View role'); +Buffer::set('title', $titleText); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Roles'), 'path' => 'admin/roles'], + ['label' => $titleText], +]; diff --git a/pages/admin/roles/edit(default).phtml b/pages/admin/roles/edit(default).phtml index 725c8ac..7038bcc 100644 --- a/pages/admin/roles/edit(default).phtml +++ b/pages/admin/roles/edit(default).phtml @@ -21,12 +21,6 @@ $titleText = $isReadOnly ? t('View role') : t('Edit role');
t('Home'), 'path' => 'admin'], - ['label' => t('Roles'), 'path' => 'admin/roles'], - ['label' => $titleText], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => $titleText, 'backHref' => 'admin/roles', diff --git a/pages/admin/roles/index().php b/pages/admin/roles/index().php index a9d4c22..1242989 100644 --- a/pages/admin/roles/index().php +++ b/pages/admin/roles/index().php @@ -49,6 +49,10 @@ $clientFilterSchema = $listFilterContext['clientFilterSchema']; $searchConfig = $listFilterContext['searchConfig']; Buffer::set('title', t('Roles')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Roles')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $csrfKey = Session::$csrfSessionKey; $csrfToken = $session[$csrfKey] ?? ''; diff --git a/pages/admin/roles/index(default).phtml b/pages/admin/roles/index(default).phtml index 10d0deb..f377913 100644 --- a/pages/admin/roles/index(default).phtml +++ b/pages/admin/roles/index(default).phtml @@ -12,13 +12,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Roles')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/pages/admin/scheduled-jobs/edit($id).php b/pages/admin/scheduled-jobs/edit($id).php index 669a5cc..2f51f34 100644 --- a/pages/admin/scheduled-jobs/edit($id).php +++ b/pages/admin/scheduled-jobs/edit($id).php @@ -73,5 +73,11 @@ $scheduleSummary = $scheduledJobService->scheduleSummary($job ?? []); $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); -Buffer::set('title', $canManage ? t('Edit scheduled job') : t('View scheduled job')); +$titleText = $canManage ? t('Edit scheduled job') : t('View scheduled job'); +Buffer::set('title', $titleText); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Scheduled jobs'), 'path' => 'admin/scheduled-jobs'], + ['label' => $titleText], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); diff --git a/pages/admin/scheduled-jobs/edit(default).phtml b/pages/admin/scheduled-jobs/edit(default).phtml index 88c3b51..453b7cb 100644 --- a/pages/admin/scheduled-jobs/edit(default).phtml +++ b/pages/admin/scheduled-jobs/edit(default).phtml @@ -39,13 +39,6 @@ if ($canRunNow) {
t('Home'), 'path' => 'admin'], - ['label' => t('Scheduled jobs'), 'path' => 'admin/scheduled-jobs'], - ['label' => $titleText], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - $titlebar = [ 'title' => $titleText, 'backHref' => 'admin/scheduled-jobs', diff --git a/pages/admin/scheduled-jobs/index().php b/pages/admin/scheduled-jobs/index().php index 5c3f4c5..f9cd860 100644 --- a/pages/admin/scheduled-jobs/index().php +++ b/pages/admin/scheduled-jobs/index().php @@ -46,4 +46,8 @@ $clientFilterSchema = $listFilterContext['clientFilterSchema']; $searchConfig = $listFilterContext['searchConfig']; Buffer::set('title', t('Scheduled jobs')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Scheduled jobs')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); diff --git a/pages/admin/scheduled-jobs/index(default).phtml b/pages/admin/scheduled-jobs/index(default).phtml index 115c873..0318f9e 100644 --- a/pages/admin/scheduled-jobs/index(default).phtml +++ b/pages/admin/scheduled-jobs/index(default).phtml @@ -10,13 +10,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Scheduled jobs')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/pages/admin/settings/index().php b/pages/admin/settings/index().php index 5f911e6..0855507 100644 --- a/pages/admin/settings/index().php +++ b/pages/admin/settings/index().php @@ -81,3 +81,8 @@ if ($request->isMethod('POST')) { } Buffer::set('title', t('Settings')); + +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Settings')], +]; diff --git a/pages/admin/settings/index(default).phtml b/pages/admin/settings/index(default).phtml index fc39b6f..51e85d4 100644 --- a/pages/admin/settings/index(default).phtml +++ b/pages/admin/settings/index(default).phtml @@ -104,11 +104,6 @@ $disabledAttr = $isReadOnly ? 'disabled' : '';
t('Home'), 'path' => 'admin'], - ['label' => t('Settings')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => t('Settings'), 'actions' => $canUpdateSettings ? [ diff --git a/pages/admin/stats/index().php b/pages/admin/stats/index().php index c5f5a3f..3f1aad4 100644 --- a/pages/admin/stats/index().php +++ b/pages/admin/stats/index().php @@ -17,3 +17,8 @@ $currentUserId = (int) ($session['user']['id'] ?? 0); $viewAuth['page'] = app(UiAccessService::class)->pageCapabilities($currentUserId, UiCapabilityMap::PAGE_STATS_INDEX); Buffer::set('title', t('Statistics')); + +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Statistics')], +]; diff --git a/pages/admin/stats/index(default).phtml b/pages/admin/stats/index(default).phtml index dbdd206..0ccbefc 100644 --- a/pages/admin/stats/index(default).phtml +++ b/pages/admin/stats/index(default).phtml @@ -107,13 +107,6 @@ $canViewAuditTab = (bool) ($auditStatsAvailable ?? false) && ( || ($canViewUserLifecycleAudit && (bool) ($userLifecycleAuditStatsAvailable ?? false)) ); -?> - t('Home'), 'path' => 'admin'], - ['label' => t('Statistics')], -]; -require templatePath('partials/app-breadcrumb.phtml'); ?>

diff --git a/pages/admin/system-info/index().php b/pages/admin/system-info/index().php index aa2c143..fe4c47b 100644 --- a/pages/admin/system-info/index().php +++ b/pages/admin/system-info/index().php @@ -14,3 +14,8 @@ $permissions = $pageData['permissions'] ?? []; $healthChecks = $overview['health_checks'] ?? []; Buffer::set('title', t('System Info')); + +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('System Info')], +]; diff --git a/pages/admin/system-info/index(default).phtml b/pages/admin/system-info/index(default).phtml index 67bf6b3..c341e59 100644 --- a/pages/admin/system-info/index(default).phtml +++ b/pages/admin/system-info/index(default).phtml @@ -12,13 +12,6 @@ $modules = $modules ?? []; $permissions = $permissions ?? []; $healthChecks = $healthChecks ?? []; -?> - t('Home'), 'path' => 'admin'], - ['label' => t('System Info')], -]; -require templatePath('partials/app-breadcrumb.phtml'); ?>

diff --git a/pages/admin/tenants/create().php b/pages/admin/tenants/create().php index 0ada726..7dc2516 100644 --- a/pages/admin/tenants/create().php +++ b/pages/admin/tenants/create().php @@ -135,3 +135,8 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); Buffer::set('title', t('Create tenant')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Tenants'), 'path' => 'admin/tenants'], + ['label' => t('Create tenant')], +]; diff --git a/pages/admin/tenants/create(default).phtml b/pages/admin/tenants/create(default).phtml index 5d39f57..748b391 100644 --- a/pages/admin/tenants/create(default).phtml +++ b/pages/admin/tenants/create(default).phtml @@ -11,12 +11,6 @@
t('Home'), 'path' => 'admin'], - ['label' => t('Tenants'), 'path' => 'admin/tenants'], - ['label' => t('Create tenant')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => t('Create tenant'), 'backHref' => 'admin/tenants', diff --git a/pages/admin/tenants/edit($id).php b/pages/admin/tenants/edit($id).php index aca5d1d..d0acad4 100644 --- a/pages/admin/tenants/edit($id).php +++ b/pages/admin/tenants/edit($id).php @@ -182,4 +182,10 @@ if ($canManageSso && empty($ldapUiState)) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); -Buffer::set('title', $canUpdateTenant ? t('Edit tenant') : t('View tenant')); +$titleText = $canUpdateTenant ? t('Edit tenant') : t('View tenant'); +Buffer::set('title', $titleText); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Tenants'), 'path' => 'admin/tenants'], + ['label' => $titleText], +]; diff --git a/pages/admin/tenants/edit(default).phtml b/pages/admin/tenants/edit(default).phtml index 656ca3f..9c75aa2 100644 --- a/pages/admin/tenants/edit(default).phtml +++ b/pages/admin/tenants/edit(default).phtml @@ -27,12 +27,6 @@ $hasFavicon = $avatarUuid !== '' && $tenantFaviconService->hasFavicon($avatarUui
t('Home'), 'path' => 'admin'], - ['label' => t('Tenants'), 'path' => 'admin/tenants'], - ['label' => $titleText], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => $titleText, 'backHref' => 'admin/tenants', diff --git a/pages/admin/tenants/index().php b/pages/admin/tenants/index().php index 3f8fb23..db73fe4 100644 --- a/pages/admin/tenants/index().php +++ b/pages/admin/tenants/index().php @@ -46,6 +46,10 @@ $clientFilterSchema = $listFilterContext['clientFilterSchema']; $searchConfig = $listFilterContext['searchConfig']; Buffer::set('title', t('Tenants')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Tenants')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $csrfKey = Session::$csrfSessionKey; $csrfToken = $session[$csrfKey] ?? ''; diff --git a/pages/admin/tenants/index(default).phtml b/pages/admin/tenants/index(default).phtml index bc7a2ef..31ce279 100644 --- a/pages/admin/tenants/index(default).phtml +++ b/pages/admin/tenants/index(default).phtml @@ -12,13 +12,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Tenants')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/pages/admin/users/create().php b/pages/admin/users/create().php index 498b0ef..aaa972c 100644 --- a/pages/admin/users/create().php +++ b/pages/admin/users/create().php @@ -214,3 +214,8 @@ if (!$customFieldDefinitionsByTenant && $selectedTenantIds) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); Buffer::set('title', t('Create user')); +$breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Users'), 'path' => 'admin/users'], + ['label' => t('Create user')], +]; diff --git a/pages/admin/users/create(default).phtml b/pages/admin/users/create(default).phtml index a7c2d20..dd1e605 100644 --- a/pages/admin/users/create(default).phtml +++ b/pages/admin/users/create(default).phtml @@ -12,12 +12,6 @@
t('Home'), 'path' => 'admin'], - ['label' => t('Users'), 'path' => 'admin/users'], - ['label' => t('Create user')], - ]; - require templatePath('partials/app-breadcrumb.phtml'); $titlebar = [ 'title' => t('Create user'), 'backHref' => 'admin/users', diff --git a/pages/admin/users/edit($id).php b/pages/admin/users/edit($id).php index d8f1b0e..49e788d 100644 --- a/pages/admin/users/edit($id).php +++ b/pages/admin/users/edit($id).php @@ -300,4 +300,12 @@ if ($request->isMethod('POST')) { $validationSummaryErrors = $errorBag->toArray(); $errors = $errorBag->toFlatList(); -Buffer::set('title', $isOwnAccount ? t('My account') : ($canEditUser ? t('Edit user') : t('View user'))); +$titleText = $isOwnAccount ? t('My account') : ($canEditUser ? t('Edit user') : t('View user')); +Buffer::set('title', $titleText); +if (!($isOwnAccount && !$canViewUsers)) { + $breadcrumbs = [ + ['label' => t('Home'), 'path' => 'admin'], + ['label' => t('Users'), 'path' => 'admin/users'], + ['label' => $titleText], + ]; +} diff --git a/pages/admin/users/edit(default).phtml b/pages/admin/users/edit(default).phtml index 734e186..5d3f7e0 100644 --- a/pages/admin/users/edit(default).phtml +++ b/pages/admin/users/edit(default).phtml @@ -46,16 +46,6 @@ if ($lastLoginAt !== '') {
- - t('Home'), 'path' => 'admin'], - ['label' => t('Users'), 'path' => 'admin/users'], - ['label' => $titleText], - ]; - require templatePath('partials/app-breadcrumb.phtml'); - ?> - t('Home'), 'path' => 'admin'], + ['label' => t('Users')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); $csrfKey = Session::$csrfSessionKey; $csrfToken = $session[$csrfKey] ?? ''; diff --git a/pages/admin/users/index(default).phtml b/pages/admin/users/index(default).phtml index d61315f..3c50c1a 100644 --- a/pages/admin/users/index(default).phtml +++ b/pages/admin/users/index(default).phtml @@ -22,13 +22,6 @@ $currentUserUuid = (string) ($_SESSION['user']['uuid'] ?? ''); $showTenantTabs = isset($tenants) && is_array($tenants) && count($tenants) > 1; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Users')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/pages/help/hotkeys(default).phtml b/pages/help/hotkeys(default).phtml index 4dfa8de..83516a9 100644 --- a/pages/help/hotkeys(default).phtml +++ b/pages/help/hotkeys(default).phtml @@ -13,7 +13,6 @@ $hotkeyRows = HotkeyService::list(); ['label' => t('Home'), 'path' => 'admin'], ['label' => t('Keyboard shortcuts')], ]; - require templatePath('partials/app-breadcrumb.phtml'); ?> t('Home'), 'path' => 'admin'], + ['label' => t('Search')], +]; Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); Buffer::set( 'grid_csrf', diff --git a/pages/search/index(default).phtml b/pages/search/index(default).phtml index 56abd78..0e7924f 100644 --- a/pages/search/index(default).phtml +++ b/pages/search/index(default).phtml @@ -8,13 +8,6 @@ $clientFilterSchema = is_array($clientFilterSchema ?? null) ? $clientFilterSchem $searchConfig = is_array($searchConfig ?? null) ? $searchConfig : null; ?> t('Home'), 'path' => 'admin'], - ['label' => t('Search')], -]; -require templatePath('partials/app-breadcrumb.phtml'); -?> - diff --git a/templates/partials/app-breadcrumb.phtml b/templates/partials/app-breadcrumb.phtml index e65e102..a4670fd 100644 --- a/templates/partials/app-breadcrumb.phtml +++ b/templates/partials/app-breadcrumb.phtml @@ -1,6 +1,5 @@ -
+