2026-02-04 23:31:53 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var array<int, string> $errors
|
|
|
|
|
* @var array $form
|
|
|
|
|
* @var array $user
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
use MintyPHP\Session;
|
|
|
|
|
|
2026-02-24 08:49:40 +01:00
|
|
|
$values = $form;
|
2026-02-04 23:31:53 +01:00
|
|
|
$avatarUuid = (string) ($values['uuid'] ?? '');
|
2026-03-04 15:56:58 +01:00
|
|
|
$userAvatarService = app(\MintyPHP\Service\User\UserAvatarService::class);
|
2026-02-23 12:58:19 +01:00
|
|
|
$hasAvatar = $avatarUuid !== '' && $userAvatarService->hasAvatar($avatarUuid);
|
2026-02-04 23:31:53 +01:00
|
|
|
$currentUserId = (int) ($_SESSION['user']['id'] ?? 0);
|
|
|
|
|
$isOwnAccount = $currentUserId > 0 && $currentUserId === (int) ($values['id'] ?? 0);
|
2026-03-22 22:28:19 +01:00
|
|
|
$canEditUser = !empty($canEditUser);
|
|
|
|
|
$titleText = $isOwnAccount ? t('My account') : ($canEditUser ? t('Edit user') : t('View user'));
|
2026-02-24 08:49:40 +01:00
|
|
|
$canViewUsers = !empty($canViewUsers);
|
|
|
|
|
$canViewUserMeta = !empty($canViewUserMeta);
|
|
|
|
|
$canViewUserAudit = !empty($canViewUserAudit);
|
|
|
|
|
$canAccessPdf = !empty($canAccessPdf);
|
|
|
|
|
$canViewSecurityArtifacts = !empty($canViewSecurityArtifacts);
|
|
|
|
|
$canViewPermissionsTable = !empty($canViewPermissionsTable);
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
$canEditUser = !empty($canEditUser);
|
2026-02-24 08:49:40 +01:00
|
|
|
$canDeleteUser = !empty($canDeleteUser);
|
2026-02-04 23:31:53 +01:00
|
|
|
$hideNavigation = $isOwnAccount && !$canViewUsers;
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
$lastLoginProvider = strtolower((string) ($values['last_login_provider'] ?? ($user['last_login_provider'] ?? '')));
|
|
|
|
|
$lastLoginAt = (string) ($values['last_login_at'] ?? ($user['last_login_at'] ?? ''));
|
|
|
|
|
$lastLoginProviderLabel = '-';
|
|
|
|
|
$lastLoginProviderVariant = 'neutral';
|
|
|
|
|
if ($lastLoginAt !== '') {
|
|
|
|
|
if ($lastLoginProvider === 'microsoft') {
|
|
|
|
|
$lastLoginProviderLabel = t('Microsoft');
|
|
|
|
|
$lastLoginProviderVariant = 'primary';
|
|
|
|
|
} elseif ($lastLoginProvider === 'local') {
|
|
|
|
|
$lastLoginProviderLabel = t('Local');
|
|
|
|
|
$lastLoginProviderVariant = 'secondary';
|
|
|
|
|
} else {
|
|
|
|
|
$lastLoginProviderLabel = t('Unknown');
|
|
|
|
|
$lastLoginProviderVariant = 'warning';
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-04 23:31:53 +01:00
|
|
|
|
|
|
|
|
?>
|
|
|
|
|
|
|
|
|
|
<div class="app-details-container">
|
|
|
|
|
<section>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<?php
|
|
|
|
|
$asideActions = [];
|
feat: extend module platform with UI slots, runtime components, CLI tooling and {{userId}} search support
Completes the generic module platform that enables modules to contribute
UI elements, runtime JS components, and search resources without any
core hardcoding.
New generic UI slot types:
- topbar.right_item: module-contributed topbar buttons
- layout.body_end_template: module-contributed dialog/overlay templates
- layout.head_style: module-contributed global CSS
- runtime.component: declarative JS component registration with phase ordering
New infrastructure:
- ModuleAutoloader: PSR-4 autoloading for module-local PHP classes
- ModuleRuntimePageBuilder: symlinks module pages into runtime directory
- ModuleRuntimeAssetPublisher: publishes module CSS/JS to web/modules/
- ModulePermissionSynchronizer: syncs module permissions to DB
- CLI scripts: module-runtime-sync, module-build, module-migrate,
module-permissions-sync, module-assets-sync
- {{userId}} placeholder in SearchDataService for user-scoped search queries
- Component runtime with phased initialization (early/default/late)
- AppContainer.protectExistingBindings() to prevent module→core overwrites
- Architecture tests: ModuleStructureContractTest, CoreTemplateIsolationTest,
FrontendComponentRuntimeContractTest, AppContainerIsolationContractTest
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 22:19:56 +01:00
|
|
|
$moduleSlots = is_array($layoutNav['moduleSlots'] ?? null) ? $layoutNav['moduleSlots'] : [];
|
|
|
|
|
$moduleAsideActionSlots = is_array($moduleSlots['user.edit.aside_action'] ?? null) ? $moduleSlots['user.edit.aside_action'] : [];
|
|
|
|
|
$slotContextMap = [
|
|
|
|
|
'{user_id}' => (string) ($values['id'] ?? ''),
|
|
|
|
|
'{user_uuid}' => (string) ($values['uuid'] ?? ''),
|
|
|
|
|
];
|
|
|
|
|
foreach ($moduleAsideActionSlots as $slotAction) {
|
|
|
|
|
if (!is_array($slotAction)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
$slotPermission = trim((string) ($slotAction['permission'] ?? ''));
|
|
|
|
|
if ($slotPermission !== '' && empty($layoutAuth[$slotPermission])) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$slotLabel = trim((string) ($slotAction['label'] ?? ''));
|
|
|
|
|
if ($slotLabel === '') {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
$slotType = trim((string) ($slotAction['type'] ?? 'link'));
|
|
|
|
|
if ($slotType === 'form') {
|
|
|
|
|
$slotFormAction = trim((string) ($slotAction['action'] ?? ''));
|
|
|
|
|
if ($slotFormAction === '') {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
$slotFormAction = strtr($slotFormAction, $slotContextMap);
|
|
|
|
|
if (!str_starts_with($slotFormAction, '/') && !str_starts_with($slotFormAction, 'http://') && !str_starts_with($slotFormAction, 'https://')) {
|
|
|
|
|
$slotFormAction = lurl($slotFormAction);
|
|
|
|
|
}
|
|
|
|
|
$asideActions[] = [
|
|
|
|
|
'type' => 'form',
|
|
|
|
|
'method' => strtoupper(trim((string) ($slotAction['method'] ?? 'POST'))),
|
|
|
|
|
'action' => $slotFormAction,
|
|
|
|
|
'label' => t($slotLabel),
|
|
|
|
|
];
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$slotHref = trim((string) ($slotAction['href'] ?? ''));
|
|
|
|
|
if ($slotHref === '') {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
$slotHref = strtr($slotHref, $slotContextMap);
|
|
|
|
|
if (!str_starts_with($slotHref, '/') && !str_starts_with($slotHref, 'http://') && !str_starts_with($slotHref, 'https://')) {
|
|
|
|
|
$slotHref = lurl($slotHref);
|
|
|
|
|
}
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
$asideActions[] = [
|
|
|
|
|
'type' => 'link',
|
feat: extend module platform with UI slots, runtime components, CLI tooling and {{userId}} search support
Completes the generic module platform that enables modules to contribute
UI elements, runtime JS components, and search resources without any
core hardcoding.
New generic UI slot types:
- topbar.right_item: module-contributed topbar buttons
- layout.body_end_template: module-contributed dialog/overlay templates
- layout.head_style: module-contributed global CSS
- runtime.component: declarative JS component registration with phase ordering
New infrastructure:
- ModuleAutoloader: PSR-4 autoloading for module-local PHP classes
- ModuleRuntimePageBuilder: symlinks module pages into runtime directory
- ModuleRuntimeAssetPublisher: publishes module CSS/JS to web/modules/
- ModulePermissionSynchronizer: syncs module permissions to DB
- CLI scripts: module-runtime-sync, module-build, module-migrate,
module-permissions-sync, module-assets-sync
- {{userId}} placeholder in SearchDataService for user-scoped search queries
- Component runtime with phased initialization (early/default/late)
- AppContainer.protectExistingBindings() to prevent module→core overwrites
- Architecture tests: ModuleStructureContractTest, CoreTemplateIsolationTest,
FrontendComponentRuntimeContractTest, AppContainerIsolationContractTest
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 22:19:56 +01:00
|
|
|
'href' => $slotHref,
|
|
|
|
|
'label' => t($slotLabel),
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
if ($canEditUser) {
|
|
|
|
|
$asideActions[] = [
|
|
|
|
|
'type' => 'form',
|
|
|
|
|
'method' => 'post',
|
|
|
|
|
'action' => 'admin/users/send-access/' . ($values['uuid'] ?? ''),
|
|
|
|
|
'confirm' => t('Send access email to this user?'),
|
|
|
|
|
'label' => t('Send access'),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
if ($canAccessPdf) {
|
|
|
|
|
$asideActions[] = [
|
|
|
|
|
'type' => 'form',
|
|
|
|
|
'method' => 'post',
|
|
|
|
|
'action' => 'admin/users/access-pdf',
|
|
|
|
|
'label' => t('Access PDF'),
|
|
|
|
|
'target' => '_blank',
|
|
|
|
|
'fields' => [
|
|
|
|
|
'uuid' => (string) ($values['uuid'] ?? ''),
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
$titlebarActions = [];
|
|
|
|
|
if ($canEditUser) {
|
|
|
|
|
$titlebarActions[] = [
|
|
|
|
|
'form' => 'user-form',
|
|
|
|
|
'name' => 'action',
|
|
|
|
|
'value' => 'save',
|
|
|
|
|
'class' => 'secondary outline',
|
|
|
|
|
'label' => t('Save'),
|
|
|
|
|
];
|
|
|
|
|
if (!$hideNavigation) {
|
|
|
|
|
$titlebarActions[] = [
|
|
|
|
|
'form' => 'user-form',
|
|
|
|
|
'name' => 'action',
|
|
|
|
|
'value' => 'save_close',
|
|
|
|
|
'class' => 'primary',
|
|
|
|
|
'label' => t('Save & close'),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$titlebar = [
|
|
|
|
|
'title' => $titleText,
|
|
|
|
|
'backHref' => $hideNavigation ? '' : 'admin/users',
|
|
|
|
|
'backTitle' => t('Cancel'),
|
|
|
|
|
'actions' => $titlebarActions,
|
|
|
|
|
];
|
|
|
|
|
require templatePath('partials/app-details-titlebar.phtml');
|
|
|
|
|
?>
|
2026-02-04 23:31:53 +01:00
|
|
|
|
2026-03-04 15:56:58 +01:00
|
|
|
<?php
|
|
|
|
|
$validationSummaryErrors = $validationSummaryErrors ?? ($errors ?? []);
|
|
|
|
|
require templatePath('partials/app-details-validation-summary.phtml');
|
|
|
|
|
?>
|
2026-02-04 23:31:53 +01:00
|
|
|
|
|
|
|
|
<?php
|
|
|
|
|
$passwordRequired = false;
|
|
|
|
|
$passwordLabel = t('New password (optional)');
|
|
|
|
|
$passwordLegend = t('Password');
|
|
|
|
|
$passwordConfirmLabel = t('Password (again)');
|
|
|
|
|
$showTenants = !empty($canEditAssignments);
|
|
|
|
|
$tenants = $tenants ?? [];
|
|
|
|
|
$selectedTenantIds = $selectedTenantIds ?? [];
|
|
|
|
|
$showRoles = !empty($canEditAssignments);
|
|
|
|
|
$roles = $roles ?? [];
|
|
|
|
|
$selectedRoleIds = $selectedRoleIds ?? [];
|
|
|
|
|
$showDepartments = !empty($canEditAssignments);
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
$departmentOptionsByTenant = $departmentOptionsByTenant ?? [];
|
2026-02-04 23:31:53 +01:00
|
|
|
$selectedDepartmentIds = $selectedDepartmentIds ?? [];
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
$isReadOnly = !$canEditUser;
|
2026-02-04 23:31:53 +01:00
|
|
|
$canEditAssignments = $canEditAssignments ?? false;
|
|
|
|
|
$permissionRows = $permissionRows ?? [];
|
2026-03-11 22:05:03 +01:00
|
|
|
$showPermissions = $canViewPermissionsTable;
|
2026-02-11 19:28:12 +01:00
|
|
|
$passwordResets = $passwordResets ?? [];
|
2026-03-11 22:05:03 +01:00
|
|
|
$showPasswordResets = $canViewSecurityArtifacts;
|
2026-02-11 19:28:12 +01:00
|
|
|
$rememberTokens = $rememberTokens ?? [];
|
2026-03-11 22:05:03 +01:00
|
|
|
$showRememberTokens = $canViewSecurityArtifacts;
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
$showDangerZone = $canDeleteUser;
|
|
|
|
|
$dangerZoneDeleteFormId = $showDangerZone ? 'user-delete-form' : '';
|
|
|
|
|
$dangerZoneWarning = t('This will permanently delete this user.');
|
|
|
|
|
$dangerZoneActionLabel = t('Delete user');
|
|
|
|
|
$showTokenDangerAction = $canEditUser;
|
|
|
|
|
$tokenDangerFormId = $showTokenDangerAction ? 'user-forget-tokens-form' : '';
|
|
|
|
|
$tokenDangerWarning = t('This will mark all remember-me tokens as expired. Users will need to sign in again.');
|
|
|
|
|
$tokenDangerActionLabel = t('Clear login tokens');
|
|
|
|
|
$showCustomFieldsTab = true;
|
|
|
|
|
$canEditCustomFieldValues = !empty($canEditCustomFieldValues);
|
|
|
|
|
$customFieldDefinitionsByTenant = $customFieldDefinitionsByTenant ?? [];
|
|
|
|
|
$customFieldValueMap = $customFieldValueMap ?? [];
|
|
|
|
|
$customFieldPostedValues = $customFieldPostedValues ?? [];
|
2026-02-23 12:58:19 +01:00
|
|
|
$passwordMinLength = $passwordMinLength ?? 12;
|
|
|
|
|
$passwordHints = $passwordHints ?? [];
|
2026-02-04 23:31:53 +01:00
|
|
|
require __DIR__ . '/_form.phtml';
|
|
|
|
|
?>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<?php if ($canManageApiTokens ?? false): ?>
|
|
|
|
|
<form id="api-token-create-form" method="post"
|
|
|
|
|
action="admin/users/api-token-create/<?php e($values['uuid'] ?? ''); ?>" hidden>
|
|
|
|
|
<?php Session::getCsrfInput(); ?>
|
|
|
|
|
</form>
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
<?php if ($showTokenDangerAction): ?>
|
|
|
|
|
<form
|
|
|
|
|
id="user-forget-tokens-form"
|
|
|
|
|
method="post"
|
|
|
|
|
action="admin/users/forget-tokens/<?php e($values['uuid'] ?? ''); ?>"
|
|
|
|
|
hidden
|
2026-03-04 15:56:58 +01:00
|
|
|
data-detail-confirm-message="<?php e(t('Clear all login tokens for this user?')); ?>"
|
|
|
|
|
data-detail-action-kind="danger"
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
>
|
|
|
|
|
<?php Session::getCsrfInput(); ?>
|
|
|
|
|
</form>
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
<?php if ($showDangerZone): ?>
|
|
|
|
|
<form
|
|
|
|
|
id="user-delete-form"
|
|
|
|
|
method="post"
|
|
|
|
|
action="admin/users/delete/<?php e($values['uuid'] ?? ''); ?>"
|
|
|
|
|
hidden
|
2026-03-04 15:56:58 +01:00
|
|
|
data-detail-confirm-message="<?php e(t('Delete this user?')); ?>"
|
|
|
|
|
data-detail-action-kind="delete"
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
>
|
|
|
|
|
<?php Session::getCsrfInput(); ?>
|
|
|
|
|
</form>
|
|
|
|
|
<?php endif; ?>
|
2026-02-04 23:31:53 +01:00
|
|
|
</section>
|
|
|
|
|
<aside id="app-details-aside-section">
|
|
|
|
|
<div class="app-details-aside-section">
|
|
|
|
|
<div class="user-avatar-block avatar-round">
|
|
|
|
|
<?php if ($hasAvatar): ?>
|
|
|
|
|
<a data-fslightbox="user-avatar" href="admin/users/avatar-file?uuid=<?php e($avatarUuid); ?>&size=256">
|
|
|
|
|
<img class="user-avatar-image" src="admin/users/avatar-file?uuid=<?php e($avatarUuid); ?>&size=128"
|
|
|
|
|
alt="<?php e(t('Profile image')); ?>">
|
|
|
|
|
</a>
|
|
|
|
|
<?php else: ?>
|
|
|
|
|
<?php
|
|
|
|
|
$initials = strtoupper(substr((string) ($values['first_name'] ?? ''), 0, 1) . substr((string) ($values['last_name'] ?? ''), 0, 1));
|
|
|
|
|
?>
|
|
|
|
|
<div class="user-avatar-placeholder"><?php e($initials ?: '?'); ?></div>
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
</div>
|
|
|
|
|
<hgroup>
|
|
|
|
|
<h2><?php e($values['first_name'] ?? ''); ?> <?php e($values['last_name'] ?? ''); ?></h2>
|
|
|
|
|
<p><?php e($values['email'] ?? ''); ?></p>
|
|
|
|
|
</hgroup>
|
|
|
|
|
<hr>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<?php if ($canEditUser): ?>
|
2026-02-04 23:31:53 +01:00
|
|
|
<details name="user-avatar">
|
|
|
|
|
<summary>
|
|
|
|
|
<?php e(t('Upload image')); ?>
|
|
|
|
|
</summary>
|
|
|
|
|
<hr>
|
|
|
|
|
<form class="user-avatar-form" method="post" action="admin/users/avatar/<?php e($avatarUuid); ?>"
|
|
|
|
|
enctype="multipart/form-data">
|
|
|
|
|
<label class="user-avatar-upload">
|
|
|
|
|
<input type="file" name="avatar" accept="image/*">
|
|
|
|
|
</label>
|
|
|
|
|
<div class="grid">
|
2026-03-22 16:48:57 +01:00
|
|
|
<button type="submit" class="app-action-success">
|
2026-02-04 23:31:53 +01:00
|
|
|
<?php e(t('Save')); ?>
|
|
|
|
|
</button>
|
|
|
|
|
<?php if ($hasAvatar): ?>
|
|
|
|
|
<button data-tooltip-pos="top" data-tooltip="<?php e(t('Remove image')); ?>" type="submit" class="danger" formaction="admin/users/avatar-delete/<?php e($avatarUuid); ?>"
|
|
|
|
|
formmethod="post">
|
|
|
|
|
<i class="bi bi-trash3-fill"></i>
|
|
|
|
|
</button>
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
</div>
|
|
|
|
|
<?php Session::getCsrfInput(); ?>
|
|
|
|
|
</form>
|
|
|
|
|
</details>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<hr>
|
2026-02-04 23:31:53 +01:00
|
|
|
<?php endif; ?>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<?php
|
|
|
|
|
if ($asideActions) {
|
|
|
|
|
require templatePath('partials/app-details-aside-actions.phtml');
|
|
|
|
|
}
|
|
|
|
|
?>
|
2026-02-11 19:28:12 +01:00
|
|
|
<?php if ($canViewUserMeta): ?>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<details name="user-meta">
|
2026-02-11 19:28:12 +01:00
|
|
|
<summary><?php e(t('Status & meta')); ?></summary>
|
|
|
|
|
<hr>
|
|
|
|
|
<div class="grid">
|
|
|
|
|
<div>
|
|
|
|
|
<small><?php e(t('ID')); ?></small>
|
|
|
|
|
<p>
|
|
|
|
|
<span class="badge" data-variant="neutral" data-copy="true"
|
|
|
|
|
data-copy-value="<?php e($values['id'] ?? ''); ?>">
|
|
|
|
|
<?php e($values['id'] ?? '-'); ?>
|
|
|
|
|
</span>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
<small><?php e(t('Status')); ?></small>
|
|
|
|
|
<p>
|
|
|
|
|
<?php if (!empty($values['active'])): ?>
|
|
|
|
|
<span class="badge" data-variant="success"><?php e(t('Active')); ?></span>
|
|
|
|
|
<?php else: ?>
|
|
|
|
|
<span class="badge" data-variant="danger"><?php e(t('Inactive')); ?></span>
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
2026-02-04 23:31:53 +01:00
|
|
|
</div>
|
2026-02-11 19:28:12 +01:00
|
|
|
<div>
|
|
|
|
|
<small><?php e(t('Email')); ?></small>
|
|
|
|
|
<p>
|
|
|
|
|
<?php if (!empty($values['email_verified_at'])): ?>
|
|
|
|
|
<span class="badge" data-variant="success"><?php e(t('Verified')); ?> <?php e(dt($values['email_verified_at'])); ?></span>
|
|
|
|
|
<?php else: ?>
|
|
|
|
|
<span class="badge" data-variant="warning"><?php e(t('Not verified')); ?></span>
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<div>
|
|
|
|
|
<small><?php e(t('Last login via')); ?></small>
|
|
|
|
|
<p>
|
|
|
|
|
<span class="badge" data-variant="<?php e($lastLoginProviderVariant); ?>">
|
|
|
|
|
<?php e($lastLoginProviderLabel); ?>
|
|
|
|
|
</span>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
2026-02-11 19:28:12 +01:00
|
|
|
<div>
|
|
|
|
|
<small>
|
|
|
|
|
<?php e(t('UUID')); ?>
|
|
|
|
|
</small>
|
|
|
|
|
<p>
|
|
|
|
|
<span class="badge" data-variant="neutral" data-copy="true"
|
|
|
|
|
data-copy-value="<?php e($values['uuid'] ?? ''); ?>">
|
|
|
|
|
<?php
|
|
|
|
|
$uuidValue = (string) ($values['uuid'] ?? '');
|
|
|
|
|
$uuidDisplay = $uuidValue !== '' ? substr($uuidValue, 0, 10) : '-';
|
|
|
|
|
e($uuidDisplay);
|
|
|
|
|
?>
|
|
|
|
|
</span>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
</details>
|
|
|
|
|
<hr>
|
|
|
|
|
<?php endif; ?>
|
2026-02-04 23:31:53 +01:00
|
|
|
<?php
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
$asideAuditDetailsName = 'user-audit';
|
|
|
|
|
$asideAuditCreated = (string) ($values['created'] ?? '');
|
|
|
|
|
$asideAuditCreatedByLabel = (string) ($values['created_by_label'] ?? '');
|
|
|
|
|
$asideAuditCreatedById = $values['created_by'] ?? null;
|
|
|
|
|
$asideAuditCreatedByUuid = (string) ($values['created_by_uuid'] ?? '');
|
|
|
|
|
$asideAuditModified = (string) ($values['modified'] ?? '');
|
|
|
|
|
$asideAuditModifiedByLabel = (string) ($values['modified_by_label'] ?? '');
|
|
|
|
|
$asideAuditModifiedById = $values['modified_by'] ?? null;
|
|
|
|
|
$asideAuditModifiedByUuid = (string) ($values['modified_by_uuid'] ?? '');
|
|
|
|
|
$asideAuditStatusChanged = (string) ($values['active_changed_at'] ?? '');
|
|
|
|
|
$asideAuditStatusChangedByLabel = (string) ($values['active_changed_by_label'] ?? '');
|
|
|
|
|
$asideAuditStatusChangedById = $values['active_changed_by'] ?? null;
|
|
|
|
|
$asideAuditStatusChangedByUuid = (string) ($values['active_changed_by_uuid'] ?? '');
|
2026-02-04 23:31:53 +01:00
|
|
|
?>
|
2026-02-11 19:28:12 +01:00
|
|
|
<?php if ($canViewUserAudit): ?>
|
add composer-unused, comprehensive docs, and project restructure
- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 15:27:35 +01:00
|
|
|
<?php require templatePath('partials/app-details-aside-audit.phtml'); ?>
|
2026-02-11 19:28:12 +01:00
|
|
|
<?php endif; ?>
|
2026-02-04 23:31:53 +01:00
|
|
|
</div>
|
|
|
|
|
</aside>
|
|
|
|
|
</div>
|