feat: show "View X" instead of "Edit X" for read-only users

Titlebar, breadcrumbs, and page title now reflect the user's actual
permission level across all 6 edit pages (roles, users, departments,
tenants, permissions, scheduled jobs). Added i18n keys for de and en.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-22 22:28:19 +01:00
parent 91d8aa5055
commit 06e619f26c
14 changed files with 36 additions and 17 deletions

View File

@@ -145,6 +145,7 @@
"Permission key": "Berechtigungs-Schlüssel",
"Create permission": "Berechtigung erstellen",
"Edit permission": "Berechtigung bearbeiten",
"View permission": "Berechtigung anzeigen",
"Delete this permission?": "Diese Berechtigung löschen?",
"Permission created": "Berechtigung erstellt",
"Permission updated": "Berechtigung aktualisiert",
@@ -232,6 +233,7 @@
"Create user": "Benutzer anlegen",
"Add a new user account": "Neues Benutzerkonto anlegen",
"Edit user": "Benutzer bearbeiten",
"View user": "Benutzer anzeigen",
"Update account details": "Kontodaten aktualisieren",
"Create": "Erstellen",
"Create & close": "Erstellen & schließen",
@@ -482,6 +484,7 @@
"Tenants": "Mandanten",
"Create tenant": "Mandant anlegen",
"Edit tenant": "Mandant bearbeiten",
"View tenant": "Mandant anzeigen",
"Tenant created": "Mandant erstellt",
"Tenant updated": "Mandant aktualisiert",
"Tenant deleted": "Mandant gelöscht",
@@ -508,6 +511,7 @@
"Departments": "Abteilungen",
"Create department": "Abteilung anlegen",
"Edit department": "Abteilung bearbeiten",
"View department": "Abteilung anzeigen",
"Department created": "Abteilung erstellt",
"Department updated": "Abteilung aktualisiert",
"Department deleted": "Abteilung gelöscht",
@@ -532,6 +536,7 @@
"Assignable roles": "Zuweisbare Rollen",
"Create role": "Rolle anlegen",
"Edit role": "Rolle bearbeiten",
"View role": "Rolle anzeigen",
"Role created": "Rolle erstellt",
"Role updated": "Rolle aktualisiert",
"Role deleted": "Rolle gelöscht",
@@ -1093,6 +1098,7 @@
"Scheduled job could not be saved": "Geplante Aufgabe konnte nicht gespeichert werden",
"Scheduled job saved": "Geplante Aufgabe gespeichert",
"Edit scheduled job": "Geplante Aufgabe bearbeiten",
"View scheduled job": "Geplante Aufgabe anzeigen",
"Job": "Aufgabe",
"Job key": "Aufgaben-Key",
"Run history": "Laufhistorie",

View File

@@ -145,6 +145,7 @@
"Permission key": "Permission key",
"Create permission": "Create permission",
"Edit permission": "Edit permission",
"View permission": "View permission",
"Delete this permission?": "Delete this permission?",
"Permission created": "Permission created",
"Permission updated": "Permission updated",
@@ -232,6 +233,7 @@
"Create user": "Create user",
"Add a new user account": "Add a new user account",
"Edit user": "Edit user",
"View user": "View user",
"Update account details": "Update account details",
"Create": "Create",
"Create & close": "Create & close",
@@ -482,6 +484,7 @@
"Tenants": "Tenants",
"Create tenant": "Create tenant",
"Edit tenant": "Edit tenant",
"View tenant": "View tenant",
"Tenant created": "Tenant created",
"Tenant updated": "Tenant updated",
"Tenant deleted": "Tenant deleted",
@@ -508,6 +511,7 @@
"Departments": "Departments",
"Create department": "Create department",
"Edit department": "Edit department",
"View department": "View department",
"Department created": "Department created",
"Department updated": "Department updated",
"Department deleted": "Department deleted",
@@ -532,6 +536,7 @@
"Assignable roles": "Assignable roles",
"Create role": "Create role",
"Edit role": "Edit role",
"View role": "View role",
"Role created": "Role created",
"Role updated": "Role updated",
"Role deleted": "Role deleted",
@@ -1093,6 +1098,7 @@
"Scheduled job could not be saved": "Scheduled job could not be saved",
"Scheduled job saved": "Scheduled job saved",
"Edit scheduled job": "Edit scheduled job",
"View scheduled job": "View scheduled job",
"Job": "Job",
"Job key": "Job key",
"Run history": "Run history",

View File

@@ -151,4 +151,4 @@ if ($request->isMethod('POST')) {
$validationSummaryErrors = $errorBag->toArray();
$errors = $errorBag->toFlatList();
Buffer::set('title', t('Edit department'));
Buffer::set('title', $canUpdateDepartment ? t('Edit department') : t('View department'));

View File

@@ -13,6 +13,7 @@ $pageAuth = is_array($viewAuth['page'] ?? null) ? $viewAuth['page'] : [];
$canUpdateDepartment = (bool) ($pageAuth['can_update_department'] ?? false);
$canDeleteDepartment = (bool) ($pageAuth['can_delete_department'] ?? false);
$isReadOnly = !$canUpdateDepartment;
$titleText = $isReadOnly ? t('View department') : t('Edit department');
?>
@@ -23,11 +24,11 @@ $isReadOnly = !$canUpdateDepartment;
$breadcrumbs = [
['label' => t('Home'), 'path' => 'admin'],
['label' => t('Departments'), 'path' => 'admin/departments'],
['label' => t('Edit department')],
['label' => $titleText],
];
require templatePath('partials/app-breadcrumb.phtml');
$titlebar = [
'title' => t('Edit department'),
'title' => $titleText,
'backHref' => 'admin/departments',
'backTitle' => t('Cancel'),
'actions' => $canUpdateDepartment ? [

View File

@@ -112,4 +112,4 @@ if ($request->isMethod('POST')) {
$validationSummaryErrors = $errorBag->toArray();
$errors = $errorBag->toFlatList();
Buffer::set('title', t('Edit permission'));
Buffer::set('title', $canUpdatePermission ? t('Edit permission') : t('View permission'));

View File

@@ -12,6 +12,8 @@ use MintyPHP\Session;
$canUpdatePermission = (bool) ($canUpdatePermission ?? false);
$canDeletePermission = (bool) ($canDeletePermission ?? false);
$isReadOnly = !$canUpdatePermission;
$titleText = $isReadOnly ? t('View permission') : t('Edit permission');
?>
<div class="app-details-container">
@@ -20,11 +22,11 @@ $canDeletePermission = (bool) ($canDeletePermission ?? false);
$breadcrumbs = [
['label' => t('Home'), 'path' => 'admin'],
['label' => t('Permissions'), 'path' => 'admin/permissions'],
['label' => t('Edit permission')],
['label' => $titleText],
];
require templatePath('partials/app-breadcrumb.phtml');
$titlebar = [
'title' => t('Edit permission'),
'title' => $titleText,
'backHref' => 'admin/permissions',
'backTitle' => t('Cancel'),
'actions' => $canUpdatePermission ? [

View File

@@ -128,4 +128,4 @@ if ($request->isMethod('POST')) {
$validationSummaryErrors = $errorBag->toArray();
$errors = $errorBag->toFlatList();
Buffer::set('title', t('Edit role'));
Buffer::set('title', $canUpdateRole ? t('Edit role') : t('View role'));

View File

@@ -14,6 +14,7 @@ $values = $form ?? $role ?? [];
$canUpdateRole = (bool) ($canUpdateRole ?? false);
$canDeleteRole = (bool) ($canDeleteRole ?? false);
$isReadOnly = !$canUpdateRole;
$titleText = $isReadOnly ? t('View role') : t('Edit role');
?>
@@ -23,11 +24,11 @@ $isReadOnly = !$canUpdateRole;
$breadcrumbs = [
['label' => t('Home'), 'path' => 'admin'],
['label' => t('Roles'), 'path' => 'admin/roles'],
['label' => t('Edit role')],
['label' => $titleText],
];
require templatePath('partials/app-breadcrumb.phtml');
$titlebar = [
'title' => t('Edit role'),
'title' => $titleText,
'backHref' => 'admin/roles',
'backTitle' => t('Cancel'),
'actions' => $canUpdateRole ? [

View File

@@ -73,5 +73,5 @@ $scheduleSummary = $scheduledJobService->scheduleSummary($job ?? []);
$validationSummaryErrors = $errorBag->toArray();
$errors = $errorBag->toFlatList();
Buffer::set('title', t('Edit scheduled job'));
Buffer::set('title', $canManage ? t('Edit scheduled job') : t('View scheduled job'));
Buffer::set('grid_lang', json_encode(gridLang(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));

View File

@@ -38,15 +38,16 @@ if ($canRunNow) {
<div class="app-details-container">
<section>
<?php
$titleText = $canManage ? t('Edit scheduled job') : t('View scheduled job');
$breadcrumbs = [
['label' => t('Home'), 'path' => 'admin'],
['label' => t('Scheduled jobs'), 'path' => 'admin/scheduled-jobs'],
['label' => t('Edit')],
['label' => $titleText],
];
require templatePath('partials/app-breadcrumb.phtml');
$titlebar = [
'title' => t('Edit scheduled job'),
'title' => $titleText,
'backHref' => 'admin/scheduled-jobs',
'backTitle' => t('Back'),
'actions' => $canManage ? [

View File

@@ -158,4 +158,4 @@ if ($canManageSso && empty($ssoUiState)) {
$validationSummaryErrors = $errorBag->toArray();
$errors = $errorBag->toFlatList();
Buffer::set('title', t('Edit tenant'));
Buffer::set('title', $canUpdateTenant ? t('Edit tenant') : t('View tenant'));

View File

@@ -15,6 +15,7 @@ $canDeleteTenant = (bool) ($pageAuth['can_delete_tenant'] ?? false);
$canManageCustomFields = (bool) ($pageAuth['can_manage_custom_fields'] ?? false);
$canManageSso = (bool) ($pageAuth['can_manage_sso'] ?? false);
$isReadOnly = !$canUpdateTenant;
$titleText = $isReadOnly ? t('View tenant') : t('Edit tenant');
$avatarUuid = (string) ($values['uuid'] ?? '');
$tenantAvatarService = app(\MintyPHP\Service\Tenant\TenantAvatarService::class);
$tenantFaviconService = app(\MintyPHP\Service\Tenant\TenantFaviconService::class);
@@ -29,11 +30,11 @@ $hasFavicon = $avatarUuid !== '' && $tenantFaviconService->hasFavicon($avatarUui
$breadcrumbs = [
['label' => t('Home'), 'path' => 'admin'],
['label' => t('Tenants'), 'path' => 'admin/tenants'],
['label' => t('Edit tenant')],
['label' => $titleText],
];
require templatePath('partials/app-breadcrumb.phtml');
$titlebar = [
'title' => t('Edit tenant'),
'title' => $titleText,
'backHref' => 'admin/tenants',
'backTitle' => t('Cancel'),
'actions' => $canUpdateTenant ? [

View File

@@ -300,4 +300,4 @@ if ($request->isMethod('POST')) {
$validationSummaryErrors = $errorBag->toArray();
$errors = $errorBag->toFlatList();
Buffer::set('title', $isOwnAccount ? t('My account') : t('Edit user'));
Buffer::set('title', $isOwnAccount ? t('My account') : ($canEditUser ? t('Edit user') : t('View user')));

View File

@@ -14,7 +14,8 @@ $userAvatarService = app(\MintyPHP\Service\User\UserAvatarService::class);
$hasAvatar = $avatarUuid !== '' && $userAvatarService->hasAvatar($avatarUuid);
$currentUserId = (int) ($_SESSION['user']['id'] ?? 0);
$isOwnAccount = $currentUserId > 0 && $currentUserId === (int) ($values['id'] ?? 0);
$titleText = $isOwnAccount ? t('My account') : t('Edit user');
$canEditUser = !empty($canEditUser);
$titleText = $isOwnAccount ? t('My account') : ($canEditUser ? t('Edit user') : t('View user'));
$canViewUsers = !empty($canViewUsers);
$canViewUserMeta = !empty($canViewUserMeta);
$canViewUserAudit = !empty($canViewUserAudit);