profileSyncFieldOptions(); $syncProfileFieldsRaw = $values['sync_profile_fields_list'] ?? ($values['sync_profile_fields'] ?? []); $syncProfileFields = $tenantSsoService->normalizeProfileSyncFields($syncProfileFieldsRaw); $tenantId = (int) ($values['id'] ?? 0); $ssoUiState = is_array($ssoUiState ?? null) ? $ssoUiState : $tenantSsoService->buildMicrosoftUiState($tenantId, $values); $ssoConfigComplete = !empty($ssoUiState['config_complete']); $ssoConfigErrorLabel = trim((string) ($ssoUiState['config_error_label'] ?? '')); $ssoPasswordMode = (string) ($ssoUiState['password_mode'] ?? ($microsoftEnforce ? 'microsoft_only' : ($microsoftEnabled ? 'local_and_microsoft' : 'local_only'))); $ssoCredentialSource = (string) ($ssoUiState['credential_source'] ?? ($useSharedApp ? 'shared' : 'override')); $ssoSyncNeedsGraph = !empty($ssoUiState['sync_needs_graph']); $ssoPasswordModeLabel = match ($ssoPasswordMode) { 'microsoft_only' => t('Microsoft only'), 'local_and_microsoft' => t('Local password + Microsoft'), default => t('Local password only'), }; $ssoCredentialSourceLabel = $ssoCredentialSource === 'shared' ? t('Shared app') : t('Tenant override'); $ssoStatusTiles = [ [ 'label' => t('Microsoft login'), 'value' => $microsoftEnabled ? t('Active') : t('Inactive'), 'tone' => $microsoftEnabled ? 'success' : 'neutral', ], [ 'label' => t('Configuration complete'), 'value' => $ssoConfigComplete ? t('Yes') : t('No'), 'tone' => $ssoConfigComplete ? 'success' : 'warning', ], [ 'label' => t('Password login mode'), 'value' => $ssoPasswordModeLabel, 'tone' => match ($ssoPasswordMode) { 'microsoft_only' => 'warning', 'local_and_microsoft' => 'info', default => 'neutral', }, ], [ 'label' => t('Credentials source'), 'value' => $ssoCredentialSourceLabel, 'tone' => $ssoCredentialSource === 'shared' ? 'info' : 'neutral', ], ]; $allowedDomainsList = preg_split('/[\s,;]+/', strtolower($allowedDomains), -1, PREG_SPLIT_NO_EMPTY); $allowedDomainsList = is_array($allowedDomainsList) ? array_values(array_unique($allowedDomainsList)) : []; $allowedDomainsCount = count($allowedDomainsList); $syncFieldCount = count($syncProfileFields); $ssoSetupBadgeVariant = $microsoftEnabled ? 'success' : 'neutral'; $ssoSetupBadgeLabel = sprintf( '%s: %s', t('Microsoft login'), $microsoftEnabled ? t('Active') : t('Inactive') ); $ssoShowConfigBadge = $microsoftEnabled; $ssoConfigBadgeVariant = $microsoftEnabled ? ($ssoConfigComplete ? 'success' : 'warning') : 'neutral'; $ssoConfigBadgeLabel = sprintf( '%s: %s', t('Configuration status'), $ssoConfigComplete ? t('Complete') : t('Incomplete') ); $ssoPolicyBadgeVariant = match ($ssoPasswordMode) { 'microsoft_only' => 'warning', 'local_and_microsoft' => 'info', default => 'neutral', }; $ssoSyncBadgeVariant = $syncProfileOnLogin ? 'info' : 'neutral'; $ssoSyncBadgeLabel = $syncProfileOnLogin ? t('Active') : t('Inactive'); $ssoDomainsBadgeVariant = $allowedDomainsCount > 0 ? 'info' : 'neutral'; $ssoDomainsBadgeLabel = $allowedDomainsCount > 0 ? sprintf('%d %s', $allowedDomainsCount, t('Allowed email domains')) : t('No domain restrictions'); $ssoCredentialsBadgeVariant = $ssoCredentialSource === 'shared' ? 'info' : 'warning'; $ssoCredentialsBadgeLabel = $ssoCredentialSourceLabel; $openSetupCard = $detailsOpenAll || !$microsoftEnabled || ($microsoftEnabled && !$ssoConfigComplete); $openPolicyCard = $detailsOpenAll || ($microsoftEnabled && $microsoftEnforce); $openAccessCard = $detailsOpenAll || ($microsoftEnabled && ($allowedDomainsCount > 0 || $syncProfileOnLogin)); $openOverrideCard = $detailsOpenAll; ?>
>

>

>
t('Save tenant first to manage custom fields'), 'size' => 'compact', ]; if (!$isReadOnly) { $emptyState['action'] = [ 'label' => t('Create'), 'form' => $formId, ]; } require templatePath('partials/app-empty-state.phtml'); ?>
t('No custom fields configured yet'), 'size' => 'compact', ]; require templatePath('partials/app-empty-state.phtml'); ?>


>

>

> : :


$syncFieldLabel): ?>

>
ldapProfileSyncFieldOptions(); $ldapSyncProfileFields = $tenantSsoService->normalizeLdapProfileSyncFields($values['ldap_sync_profile_fields'] ?? $ldapConfig['sync_profile_fields_list'] ?? []); $ldapAllowedDomains = trim((string) ($values['ldap_allowed_domains'] ?? $ldapConfig['allowed_domains'] ?? '')); $ldapNetworkTimeout = (int) ($values['ldap_network_timeout'] ?? $ldapConfig['network_timeout'] ?? 5); $ldapConfigComplete = !empty($ldapUiState['config_complete']); $ldapConfigErrorLabel = trim((string) ($ldapUiState['config_error_label'] ?? '')); $openLdapSetupCard = $detailsOpenAll || !$ldapEnabled || ($ldapEnabled && !$ldapConfigComplete); ?>

> :



>
>
'givenName', 'last_name' => 'sn', 'email' => 'mail', 'phone' => 'telephoneNumber', 'mobile' => 'mobile', ]; foreach ($defaultMap as $appField => $defaultLdapAttr): $currentLdapAttr = $ldapAttributeMap[$appField] ?? $defaultLdapAttr; ?>

$syncFieldLabel): ?>


t('Active'), 'inactive' => t('Inactive'), ]; $statusFieldHint = t('Inactive tenants are excluded from user access and tenant-scoped data.'); require templatePath('partials/app-visibility-status-field.phtml'); ?>