emilsoftware-utilities 2.0.0-dev.38 → 2.0.0-dev.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -102,7 +102,7 @@ button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-
102
102
  .card h1 { margin: 0 0 var(--s2); }
103
103
  .card > p { margin: 0 0 var(--s5); color: var(--muted); }
104
104
  .card form { gap: var(--s4); }
105
- .card form button, .card > button { width: 100%; }
105
+ .card form > button, .card > button { width: 100%; }
106
106
  .card > button { margin-top: var(--s3); }
107
107
 
108
108
  #console { display: grid; grid-template-columns: var(--sidebar-w) minmax(0, 1fr); gap: var(--gutter); align-items: start; }
@@ -555,12 +555,48 @@ article h3 { margin-bottom: var(--s2); }
555
555
  }
556
556
 
557
557
  /* Aiuto contestuale: icona "i" e popover con la miniguida del campo */
558
- .help-dot { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; min-height: 0; margin-left: var(--s1); padding: 0; border: 1px solid var(--line-strong); border-radius: 50%; color: var(--muted); font-size: 11px; font-weight: 700; line-height: 1; background: var(--surface); vertical-align: middle; cursor: pointer; }
559
- .help-dot:hover, .help-dot:focus-visible { color: var(--brand-strong); border-color: var(--brand-line); background: var(--brand-soft); }
560
- .help-popover { position: fixed; z-index: 3000; width: min(460px, 94vw); max-height: 72vh; overflow: auto; padding: var(--s4); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--surface); box-shadow: var(--shadow-md); }
558
+ /* Trigger "i": auto-contenuto, non eredita la forma dei bottoni applicativi. */
559
+ button.help-dot {
560
+ display: inline-flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ width: 1.125rem;
564
+ min-width: 1.125rem;
565
+ max-width: 1.125rem;
566
+ height: 1.125rem;
567
+ min-height: 1.125rem;
568
+ max-height: 1.125rem;
569
+ flex: 0 0 auto;
570
+ box-sizing: border-box;
571
+ margin: 0;
572
+ padding: 0;
573
+ border: 1px solid var(--line-strong);
574
+ border-radius: 50%;
575
+ color: var(--muted);
576
+ font-family: inherit;
577
+ font-size: .6875rem;
578
+ font-weight: 700;
579
+ line-height: 1;
580
+ background: var(--surface);
581
+ vertical-align: text-top;
582
+ cursor: pointer;
583
+ }
584
+ button.help-dot:hover,
585
+ button.help-dot:focus-visible { color: var(--brand-strong); border-color: var(--brand-line); background: var(--brand-soft); }
586
+ button.help-dot:focus-visible { outline: 2px solid var(--brand-line); outline-offset: 1px; }
587
+
588
+ /* Label "a blocchi" (caption + controllo): icona in alto a destra, senza rompere la griglia. */
589
+ label { position: relative; }
590
+ label:not(.check):not(.inline-field) > .help-dot { position: absolute; top: 0; right: 0; }
591
+ label:not(.check):not(.inline-field):has(> .help-dot) { padding-right: 1.625rem; }
592
+ /* Label flex: icona inline col testo. */
593
+ .check > .help-dot,
594
+ .inline-field > .help-dot { position: static; margin-left: var(--s1); }
595
+ .help-popover { position: fixed; z-index: 3000; width: min(460px, 94vw); max-height: 72vh; overflow: auto; overscroll-behavior: contain; padding: var(--s4); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--surface); box-shadow: var(--shadow-md); }
596
+ .help-popover:focus { outline: none; }
561
597
  .help-popover-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--s3); margin-bottom: var(--s3); }
562
598
  .help-popover-head h4 { margin: 0; color: var(--ink); font-size: var(--fs-md); }
563
- .help-close { width: 28px; min-height: 28px; padding: 0; font-size: var(--fs-lg); line-height: 1; }
599
+ .help-close { flex: 0 0 auto; width: 28px; min-width: 28px; min-height: 28px; padding: 0; font-size: var(--fs-lg); line-height: 1; }
564
600
  .help-popover-body { display: grid; gap: var(--s3); }
565
601
  .help-popover-body p { margin: 0; font-size: var(--fs-sm); line-height: 1.55; }
566
602
  .help-popover-body ul, .help-popover-body ol { display: grid; gap: var(--s1); margin: 0; padding-left: var(--s4); font-size: var(--fs-sm); }
@@ -2073,7 +2073,7 @@ function handleAction(action) {
2073
2073
  void action().catch((error) => showNotice(errorMessage(error), true));
2074
2074
  }
2075
2075
  function render(markup) {
2076
- closeHelp();
2076
+ closeHelp(false);
2077
2077
  byId("view").innerHTML = markup;
2078
2078
  }
2079
2079
  function setActiveNavigation(view) {
@@ -3028,7 +3028,8 @@ function bindCopyButtons(root) {
3028
3028
  });
3029
3029
  }
3030
3030
  function helpDot(key) {
3031
- return `<button type="button" class="help-dot" data-help="${escapeHtml(key)}" aria-label="Aiuto: ${escapeHtml(HELP[key]?.title ?? key)}">i</button>`;
3031
+ const title = HELP[key]?.title ?? key;
3032
+ return `<button type="button" class="help-dot" data-help="${escapeHtml(key)}" aria-haspopup="dialog" aria-expanded="false" aria-controls="accessi-help-popover" aria-label="Informazioni: ${escapeHtml(title)}" title="Informazioni">i</button>`;
3032
3033
  }
3033
3034
  var helpPopover = null;
3034
3035
  var helpAnchor = null;
@@ -3036,24 +3037,36 @@ function ensureHelpPopover() {
3036
3037
  if (!helpPopover) {
3037
3038
  helpPopover = document.createElement("div");
3038
3039
  helpPopover.className = "help-popover";
3040
+ helpPopover.id = "accessi-help-popover";
3039
3041
  helpPopover.hidden = true;
3040
3042
  helpPopover.setAttribute("role", "dialog");
3043
+ helpPopover.setAttribute("aria-modal", "false");
3044
+ helpPopover.tabIndex = -1;
3041
3045
  document.body.appendChild(helpPopover);
3042
3046
  }
3043
3047
  return helpPopover;
3044
3048
  }
3045
- function closeHelp() {
3046
- if (helpPopover) helpPopover.hidden = true;
3049
+ function closeHelp(restoreFocus = true) {
3050
+ if (!helpPopover) return;
3051
+ const wasOpen = !helpPopover.hidden;
3052
+ helpPopover.hidden = true;
3053
+ const anchor = helpAnchor;
3054
+ if (anchor) anchor.setAttribute("aria-expanded", "false");
3047
3055
  helpAnchor = null;
3056
+ if (restoreFocus && wasOpen && anchor && document.contains(anchor)) anchor.focus();
3048
3057
  }
3049
3058
  function positionHelp() {
3050
3059
  if (!helpPopover || !helpAnchor || helpPopover.hidden) return;
3051
3060
  const rect = helpAnchor.getBoundingClientRect();
3052
3061
  const width = helpPopover.offsetWidth;
3053
3062
  const height = helpPopover.offsetHeight;
3054
- const left = Math.max(8, Math.min(rect.right - width, window.innerWidth - width - 8));
3063
+ const margin = 8;
3064
+ const left = Math.max(margin, Math.min(rect.right - width, window.innerWidth - width - margin));
3055
3065
  let top = rect.bottom + 6;
3056
- if (top + height > window.innerHeight - 8) top = Math.max(8, rect.top - height - 6);
3066
+ if (top + height > window.innerHeight - margin) {
3067
+ const above = rect.top - height - 6;
3068
+ top = above >= margin ? above : Math.max(margin, window.innerHeight - height - margin);
3069
+ }
3057
3070
  helpPopover.style.left = `${left}px`;
3058
3071
  helpPopover.style.top = `${top}px`;
3059
3072
  }
@@ -3061,11 +3074,15 @@ function openHelp(anchor) {
3061
3074
  const entry = HELP[anchor.dataset.help ?? ""];
3062
3075
  if (!entry) return;
3063
3076
  const popover = ensureHelpPopover();
3064
- popover.innerHTML = `<div class="help-popover-head"><h4>${escapeHtml(entry.title)}</h4><button type="button" class="help-close" data-help-close aria-label="Chiudi">&times;</button></div><div class="help-popover-body">${entry.blocks.map(renderWikiBlock).join("")}</div>`;
3077
+ if (helpAnchor && helpAnchor !== anchor) helpAnchor.setAttribute("aria-expanded", "false");
3078
+ popover.innerHTML = `<div class="help-popover-head"><h4 id="accessi-help-title">${escapeHtml(entry.title)}</h4><button type="button" class="help-close" data-help-close aria-label="Chiudi">&times;</button></div><div class="help-popover-body">${entry.blocks.map(renderWikiBlock).join("")}</div>`;
3079
+ popover.setAttribute("aria-labelledby", "accessi-help-title");
3065
3080
  popover.hidden = false;
3066
3081
  helpAnchor = anchor;
3082
+ anchor.setAttribute("aria-expanded", "true");
3067
3083
  bindCopyButtons(popover);
3068
3084
  positionHelp();
3085
+ (popover.querySelector(".help-close") ?? popover).focus();
3069
3086
  }
3070
3087
  function wikiIndexMarkup(selectedId) {
3071
3088
  return wikiGroups().map(({ group, sections }) => `<div class="wiki-index-group"><span class="wiki-index-group-title">${escapeHtml(group)}</span><ul>${sections.map((section) => `<li><a href="#wiki-${escapeHtml(section.id)}" data-wiki="${escapeHtml(section.id)}"${section.id === selectedId ? ' aria-current="page"' : ""}>${escapeHtml(section.title)}</a></li>`).join("")}</ul></div>`).join("");
@@ -3293,7 +3310,11 @@ document.addEventListener("click", (event) => {
3293
3310
  const dot = target.closest("[data-help]");
3294
3311
  if (dot) {
3295
3312
  event.preventDefault();
3296
- openHelp(dot);
3313
+ if (helpAnchor === dot && helpPopover && !helpPopover.hidden) {
3314
+ closeHelp();
3315
+ } else {
3316
+ openHelp(dot);
3317
+ }
3297
3318
  return;
3298
3319
  }
3299
3320
  if (target.closest("[data-help-close]")) {
@@ -1 +1 @@
1
- {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/accessi-module/Console/console.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n assignPermissionsToUser,\n assignRolesToUser,\n bootstrapAdmin,\n createFederatedUser,\n createFederatedProvider,\n createManagedUser,\n createMenu,\n createMenuGroup,\n createMenuType,\n createRole,\n createServiceToken,\n createTipoFiltro,\n deleteFederatedIdentityPermanently,\n deleteFederatedProvider,\n deleteMenu,\n deleteMenuGroup,\n deleteMenuType,\n deleteRole,\n deleteTipoFiltro,\n deleteUser,\n getFederatedIdentities,\n getFederatedProviders,\n getFiltriUtente,\n getGroupsWithMenus,\n getMenuTypes,\n getRoles,\n getSchema,\n getServiceTokens,\n getTipiFiltro,\n getUserByToken,\n getUserRolesAndGrants,\n getUsers,\n linkFederatedIdentity,\n login,\n verifyTwoFactor,\n resendTwoFactor,\n revokeServiceToken,\n rotateServiceToken,\n saveFiltriUtente,\n setGroupEnabled,\n setMenuEnabled,\n setStatoRegistrazione,\n updateFederatedIdentity,\n updateFederatedProvider,\n updateMenu,\n updateMenuGroup,\n updateMenuType,\n updateRole,\n updateTipoFiltro,\n updateUtente,\n} from './generated/accessiApi';\nimport { setAccessiConsoleToken } from './accessiFetch';\nimport { WIKI_SECTIONS, wikiGroups, buildAiDigest } from './wiki';\nimport changelogMarkdown from './changelog.md';\nimport type { WikiBlock } from './wiki';\nimport { HELP } from './help';\nimport type {\n CreateFederatedUserRequest,\n CreateFederatedProviderRequest,\n AuthenticatedTokenPayloadDto,\n BootstrapAdminResultDto,\n FiltriUtente,\n FederatedProviderResponseDto,\n GroupWithMenusEntity,\n LoginResult,\n MenuEntity,\n MenuTypeEntity,\n Permission,\n RegisterRequest,\n Role,\n SchemaDdlResult,\n ServiceTokenDto,\n IssuedServiceTokenDto,\n TipoFiltro,\n UserDto,\n UpdateFederatedProviderRequest,\n} from './generated/model';\n\ntype UserRow = { utente: UserDto; userGrants?: { ruoli?: Array<{ codiceRuolo?: number; descrizioneRuolo?: string }> } };\ntype ConsoleUser = { codiceUtente: number; email?: string; flagSuper: boolean; flagAdmin: boolean };\ntype FederatedProvider = FederatedProviderResponseDto;\ntype ConsoleFederatedIdentity = { identityKey: string; provider: string; subject: string; active: boolean; note?: string };\ntype UserDetailTab = 'sso' | 'profile' | 'roles' | 'grants';\ntype ConsoleView =\n | 'users'\n | 'roles'\n | 'menuGroups'\n | 'menuItems'\n | 'menuTypes'\n | 'filterUser'\n | 'filterTypes'\n | 'ssoProviders'\n | 'ssoUsers'\n | 'tokens'\n | 'wiki'\n | 'changelog'\n | 'sql';\n\nconst routeSegment: Record<ConsoleView, string> = {\n users: 'utenti',\n roles: 'ruoli-e-grant',\n menuGroups: 'menu-e-gruppi/gruppi',\n menuItems: 'menu-e-gruppi/menu',\n menuTypes: 'menu-e-gruppi/tipi-menu',\n filterUser: 'filtri/utente',\n filterTypes: 'filtri/tipi',\n ssoProviders: 'sso/provider',\n ssoUsers: 'sso/utenti',\n tokens: 'token-di-servizio',\n wiki: 'wiki',\n changelog: 'changelog',\n sql: 'sql',\n};\nconst routeView = Object.fromEntries(Object.entries(routeSegment).map(([view, segment]) => [segment, view])) as Record<string, ConsoleView>;\n// I padri dei sottomenu hanno un URL proprio: senza figlio selezionato si apre la prima voce.\nconst parentDefaultView: Record<string, ConsoleView> = {\n 'menu-e-gruppi': 'menuGroups',\n filtri: 'filterUser',\n sso: 'ssoProviders',\n};\nconst consoleMarker = '/accessi/console';\nconst consoleMarkerIndex = window.location.pathname.indexOf(consoleMarker);\nconst consoleBasePath = consoleMarkerIndex >= 0\n ? window.location.pathname.slice(0, consoleMarkerIndex + consoleMarker.length)\n : `${window.location.pathname.replace(/\\/$/, '')}`;\n\nconst USERS_PAGE_SIZE = 25;\n\nlet token = sessionStorage.getItem('accessi-console-token');\nlet currentUser: ConsoleUser | null = null;\nlet federatedAuthenticationAvailable = false;\nlet usersPage = 0;\nlet usersTotal = 0;\nlet booting = true;\nlet pendingNetworkRequests = 0;\nlet loadingRevealTimer: number | undefined;\nlet loadingHideTimer: number | undefined;\nlet loaderVisibleSince = 0;\n\nconst byId = <T extends HTMLElement>(id: string) => document.getElementById(id) as T;\nconst escapeHtml = (value: unknown) => String(value ?? '').replace(/[&<>\"']/g, (char) => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;',\n}[char] as string));\nfunction result<T>(response: { data: object }): T {\n const body = response.data as { Result?: T; message?: string };\n if (body.Result === undefined) throw new Error(body.message ?? 'Risposta Accessi priva di dati.');\n return body.Result;\n}\n\nfunction showNotice(message: string, isError = false): void {\n // Un messaggio vuoto deve azzerare il contenitore, altrimenti resta visibile la barra di avviso.\n byId('notice').innerHTML = message ? `<span class=\"${isError ? 'error' : ''}\">${escapeHtml(message)}</span>` : '';\n}\n\n/** Renders operational menu metadata shared by the permissions and role views. */\nfunction menuMetadata(menu: MenuEntity): string {\n const details = [\n ['Codice', menu.codiceMenu],\n ['Ordine', String(menu.ordineMenu)],\n ['Tipo', menu.tipo],\n ['Pagina', menu.pagina],\n ['Icona', menu.icona],\n ['Stato', menu.enabled === false ? 'Disabilitato' : 'Abilitato'],\n ].filter(([, value]) => value);\n return `<dl class=\"entity-metadata\">${details.map(([label, value]) => `<div><dt>${escapeHtml(label)}</dt><dd>${escapeHtml(value)}</dd></div>`).join('')}</dl>${menu.note ? `<p class=\"entity-note\"><strong>Nota</strong>${escapeHtml(menu.note)}</p>` : ''}`;\n}\n\n/** Exposes only supported permission levels while preserving historical value 30 without data loss. */\nfunction permissionSelectOptions(currentLevel: number | undefined): string {\n return `<option value=\"10\" ${currentLevel === 10 ? 'selected' : ''}>Lettura</option><option value=\"20\" ${currentLevel === 20 ? 'selected' : ''}>Scrittura</option>${currentLevel === 30 ? '<option value=\"30\" selected>Valore legacy (30)</option>' : ''}`;\n}\n\n/** Renders the metadata that describes a menu group independently of its menus. */\nfunction groupMetadata(group: GroupWithMenusEntity): string {\n return `<dl class=\"entity-metadata\"><div><dt>Codice</dt><dd>${escapeHtml(group.codiceGruppo)}</dd></div><div><dt>Ordine</dt><dd>${escapeHtml(group.ordineGruppo)}</dd></div><div><dt>Stato</dt><dd>${group.enabled === false ? 'Disabilitato' : 'Abilitato'}</dd></div><div><dt>Menu</dt><dd>${group.menus.length}</dd></div></dl>`;\n}\n\n/** Builds the full-width, grouped direct-grant editor for an individual user. */\nfunction directGrantEditor(groups: GroupWithMenusEntity[], grants: Permission[] | undefined): string {\n return `<form id=\"grants\" class=\"user-editor-section grants-editor\" data-user-panel=\"grants\" role=\"tabpanel\" aria-labelledby=\"user-tab-grants\"><h3>Grant diretti ${helpDot('grant-direct')}</h3><p class=\"form-help\">Grant diretti, indipendenti dai ruoli. Seleziona <strong>nessuno</strong> per rimuoverli.</p><div class=\"grant-menu-groups\">${groups.map((group) => `<fieldset class=\"grant-menu-group\"><legend>${escapeHtml(group.descrizioneGruppo)}</legend>${groupMetadata(group)}<div class=\"grant-menu-options\">${group.menus.map((menu) => { const grant = (grants ?? []).find((item) => item.codiceMenu === menu.codiceMenu); return `<div class=\"grant-menu-option ${menu.enabled === false ? 'is-disabled' : ''}\"><div class=\"grant-menu-info\"><strong>${escapeHtml(menu.descrizioneMenu)}</strong>${menuMetadata(menu)}</div><label class=\"grant-level\">Livello di grant ${helpDot('grant-level')}<select name=\"grant:${escapeHtml(menu.codiceMenu)}\"><option value=\"\">nessuno</option>${permissionSelectOptions(grant?.tipoAbilitazione)}</select></label></div>`; }).join('') || '<p class=\"form-help\">Nessun menu configurato in questo gruppo.</p>'}</div></fieldset>`).join('')}</div><button>Salva grant</button></form>`;\n}\n\n/** Converts Accessi's persisted permission value into its documented label. */\nfunction permissionLevelLabel(value: number | undefined): string {\n return value === 10 ? 'Lettura' : value === 20 ? 'Scrittura' : value === 30 ? 'Valore legacy (30)' : `Livello ${value ?? 'non definito'}`;\n}\n\n/** Preserves incomplete legacy role data without rendering an invalid numeric label. */\nfunction rolePermissionLevel(value: unknown): string {\n return value === undefined || value === null || value === '' ? permissionLevelLabel(undefined) : permissionLevelLabel(Number(value));\n}\n\n/** Renders selectable roles together with their effective groups, menus and permission levels. */\nfunction roleAssignmentEditor(roles: Role[], assignedRoles: Array<{ codiceRuolo?: number }> | undefined, groups: GroupWithMenusEntity[]): string {\n const catalogMenus = new Map(groups.flatMap((group) => group.menus.map((menu) => [menu.codiceMenu, menu])));\n return `<form id=\"roles\" class=\"user-editor-section roles-editor\" data-user-panel=\"roles\" role=\"tabpanel\" aria-labelledby=\"user-tab-roles\"><h3>Ruoli ${helpDot('role-assignment')}</h3><p class=\"form-help\">Salvare sostituisce i ruoli dell'utente (non i grant diretti).</p><div class=\"role-assignment-list\">${roles.map((role) => { const roleMenus = role.menu ?? []; const assigned = (assignedRoles ?? []).some((current) => current.codiceRuolo === role.codiceRuolo); const groupedMenus = groups.map((group) => ({ group, entries: group.menus.map((menu) => ({ menu, assignment: roleMenus.find((item) => item.codiceMenu === menu.codiceMenu) })).filter((entry) => entry.assignment) })).filter((entry) => entry.entries.length > 0); const missingMenus = roleMenus.filter((item) => !catalogMenus.has(item.codiceMenu)); return `<article class=\"role-assignment-card\"><div class=\"role-assignment-heading\"><label class=\"check\"><input type=\"checkbox\" name=\"role\" value=\"${escapeHtml(role.codiceRuolo)}\" ${assigned ? 'checked' : ''}><span><strong>${escapeHtml(role.descrizioneRuolo)}</strong><small>Codice ruolo: ${escapeHtml(role.codiceRuolo)}</small></span></label><span class=\"role-menu-count\">${roleMenus.length} menu</span></div><div class=\"role-permission-groups\">${groupedMenus.map(({ group, entries }) => `<section class=\"role-permission-group\"><div class=\"role-permission-group-heading\"><strong>${escapeHtml(group.descrizioneGruppo)}</strong>${groupMetadata(group)}</div>${entries.map(({ menu, assignment }) => `<div class=\"role-permission-entry ${menu.enabled === false ? 'is-disabled' : ''}\"><div><strong>${escapeHtml(menu.descrizioneMenu)}</strong>${menuMetadata(menu)}</div><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(assignment?.tipoAbilitazione))}</span></div>`).join('')}</section>`).join('') || '<p class=\"form-help\">Questo ruolo non contiene menu attivi nel catalogo.</p>'}${missingMenus.length ? `<section class=\"role-permission-group missing-role-menus\"><strong>Menu non più presenti nel catalogo</strong>${missingMenus.map((menu) => `<div class=\"role-permission-entry\"><div><strong>${escapeHtml(menu.codiceMenu)}</strong><p class=\"entity-note\">Il menu è ancora associato al ruolo ma non è disponibile nel catalogo corrente.</p></div><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(menu.tipoAbilitazione))}</span></div>`).join('')}</section>` : ''}</div></article>`; }).join('')}</div><button>Salva ruoli</button></form>`;\n}\n\n/** Vista compatta di un ruolo: identità, azioni e albero delle abilitazioni su richiesta. */\nfunction roleOverview(role: Role, groups: GroupWithMenusEntity[]): string {\n const roleMenus = role.menu ?? [];\n const assignments = new Map(roleMenus.map((item) => [item.codiceMenu, item]));\n const knownMenus = new Set(groups.flatMap((group) => group.menus.map((menu) => menu.codiceMenu)));\n const tree = groups\n .map((group) => ({ group, entries: group.menus.filter((menu) => assignments.has(menu.codiceMenu)) }))\n .filter((node) => node.entries.length > 0);\n const orphans = roleMenus.filter((item) => !knownMenus.has(item.codiceMenu));\n\n const groupNodes = tree.map(({ group, entries }) => `<li class=\"role-tree-group ${group.enabled === false ? 'is-disabled' : ''}\"><div class=\"role-tree-group-head\"><strong>${escapeHtml(group.descrizioneGruppo)}</strong><span class=\"role-tree-count\">${entries.length}</span></div><ul class=\"role-tree-menus\">${entries.map((menu) => `<li class=\"role-tree-menu ${menu.enabled === false ? 'is-disabled' : ''}\"><span class=\"role-tree-menu-name\">${escapeHtml(menu.descrizioneMenu)}</span><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(assignments.get(menu.codiceMenu)?.tipoAbilitazione))}</span></li>`).join('')}</ul></li>`).join('');\n const orphanNode = orphans.length\n ? `<li class=\"role-tree-group is-orphan\"><div class=\"role-tree-group-head\"><strong>Menu non più nel catalogo</strong><span class=\"role-tree-count\">${orphans.length}</span></div><ul class=\"role-tree-menus\">${orphans.map((item) => `<li class=\"role-tree-menu\"><span class=\"role-tree-menu-name\"><code>${escapeHtml(item.codiceMenu)}</code></span><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(item.tipoAbilitazione))}</span></li>`).join('')}</ul></li>`\n : '';\n\n return `<article class=\"role-card\">\n <div class=\"role-card-head\">\n <div class=\"role-card-title\">\n <strong>${escapeHtml(role.descrizioneRuolo)}</strong>\n <span class=\"role-card-meta\">Codice ${escapeHtml(role.codiceRuolo)} &middot; ${roleMenus.length} menu</span>\n </div>\n <div class=\"role-card-actions\">\n <button type=\"button\" class=\"secondary\" data-role=\"${escapeHtml(role.codiceRuolo)}\">Modifica</button>\n <button type=\"button\" class=\"danger-button\" data-role-delete=\"${escapeHtml(role.codiceRuolo)}\">Elimina</button>\n </div>\n </div>\n ${roleMenus.length ? `<details class=\"role-card-menus\"><summary>Abilitazioni per menu (${roleMenus.length})</summary><ul class=\"role-tree\">${groupNodes}${orphanNode}</ul></details>` : '<p class=\"role-card-empty\">Nessun menu assegnato.</p>'}\n </article>`;\n}\n\n/** Editor compatto dei menu di un ruolo: inclusione e livello, raggruppati per gruppo. */\nfunction roleMenuEditorTable(group: GroupWithMenusEntity, role?: Role): string {\n const roleMenus = role?.menu ?? [];\n const options = group.menus.map((menu) => {\n const assignment = roleMenus.find((item) => item.codiceMenu === menu.codiceMenu);\n const level = assignment?.tipoAbilitazione ?? 10;\n return `<li class=\"role-menu-option ${menu.enabled === false ? 'is-disabled' : ''}\"><label class=\"check\"><input type=\"checkbox\" name=\"menu\" value=\"${escapeHtml(menu.codiceMenu)}\" ${assignment ? 'checked' : ''}><span>${escapeHtml(menu.descrizioneMenu)}</span></label><label class=\"role-menu-level\"><span class=\"sr-only\">Livello per ${escapeHtml(menu.descrizioneMenu)}</span><select name=\"menu-level:${escapeHtml(menu.codiceMenu)}\" ${assignment ? '' : 'disabled'}>${permissionSelectOptions(level)}</select></label></li>`;\n }).join('');\n return `<section class=\"role-menu-group ${group.enabled === false ? 'is-disabled' : ''}\">\n <div class=\"role-menu-group-head\"><strong>${escapeHtml(group.descrizioneGruppo)}</strong>${group.enabled === false ? '<span class=\"muted\">Gruppo disabilitato</span>' : ''}</div>\n <ul class=\"role-menu-options\">${options || '<li class=\"role-menu-empty muted\">Nessun menu in questo gruppo.</li>'}</ul>\n </section>`;\n}\n\n/**\n * Shows a delayed, concurrency-safe application loader for all Orval requests.\n * The delay avoids a distracting flash for fast operations; the minimum display\n * time makes visible operations feel intentional instead of flickering.\n */\nfunction updateLoadingState(active: boolean): void {\n pendingNetworkRequests = Math.max(0, pendingNetworkRequests + (active ? 1 : -1));\n // Durante il boot l'overlay è gestito manualmente (verifica sessione), non dalle richieste di rete.\n if (booting) {\n return;\n }\n const overlay = byId('loading-overlay');\n\n if (pendingNetworkRequests > 0) {\n if (loadingHideTimer !== undefined) {\n window.clearTimeout(loadingHideTimer);\n loadingHideTimer = undefined;\n }\n if (loadingRevealTimer === undefined && overlay.hidden) {\n loadingRevealTimer = window.setTimeout(() => {\n loadingRevealTimer = undefined;\n if (pendingNetworkRequests > 0) {\n overlay.hidden = false;\n loaderVisibleSince = Date.now();\n byId('app').setAttribute('aria-busy', 'true');\n }\n }, 140);\n }\n return;\n }\n\n if (loadingRevealTimer !== undefined) {\n window.clearTimeout(loadingRevealTimer);\n loadingRevealTimer = undefined;\n }\n\n const hide = () => {\n loadingHideTimer = undefined;\n overlay.hidden = true;\n byId('app').removeAttribute('aria-busy');\n };\n const remainingVisibleMs = 280 - (Date.now() - loaderVisibleSince);\n if (!overlay.hidden && remainingVisibleMs > 0) {\n loadingHideTimer = window.setTimeout(hide, remainingVisibleMs);\n } else {\n hide();\n }\n}\n\n/** Chiude la fase di boot e mostra login o console: evita il lampeggio del login a ogni reload. */\nfunction finishBoot(view: 'login' | 'console'): void {\n booting = false;\n const overlay = byId('loading-overlay');\n overlay.hidden = true;\n byId('app').removeAttribute('aria-busy');\n byId('login').hidden = view !== 'login';\n byId('console').hidden = view !== 'console';\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Operazione non riuscita.';\n}\n\n/** Evita rejection non gestite dagli eventi del browser e conserva la vista corrente. */\nfunction handleAction(action: () => Promise<void>): void {\n void action().catch((error) => showNotice(errorMessage(error), true));\n}\n\nfunction render(markup: string): void {\n closeHelp();\n byId('view').innerHTML = markup;\n}\n\n/** Keeps the selected console area visible to sighted and assistive-technology users. */\nfunction setActiveNavigation(view: ConsoleView): void {\n document.querySelectorAll<HTMLElement>('#nav [data-view]').forEach((link) => {\n if (link.dataset.view === view) {\n link.setAttribute('aria-current', 'page');\n } else {\n link.removeAttribute('aria-current');\n }\n });\n // Apre il ramo dell'albero che contiene la voce attiva.\n document.querySelectorAll<HTMLDetailsElement>('#nav details[data-nav-group]').forEach((branch) => {\n if (branch.querySelector(`[data-view=\"${view}\"]`)) branch.open = true;\n });\n}\n\n/** Returns the canonical browser path for a top-level console section. */\nfunction routePath(view: ConsoleView): string {\n return `${consoleBasePath}/${routeSegment[view]}`;\n}\n\n/** Resolves a console section from the current pathname, defaulting to users. */\nfunction viewFromLocation(): ConsoleView {\n const relativePath = window.location.pathname.slice(consoleBasePath.length).replace(/^\\/+|\\/+$/g, '');\n const decoded = decodeURIComponent(relativePath);\n return routeView[decoded] ?? parentDefaultView[decoded] ?? 'users';\n}\n\n/** Navigates through the browser history and renders the requested SPA section. */\nasync function navigate(view: ConsoleView, replace = false): Promise<void> {\n if (!isViewAllowed(view)) {\n view = 'users';\n replace = true;\n }\n const destination = routePath(view);\n if (window.location.pathname !== destination) {\n window.history[replace ? 'replaceState' : 'pushState']({ view }, '', destination);\n }\n // Tornando alla sezione utenti dal menu si riparte dalla prima pagina.\n if (view === 'users') usersPage = 0;\n await show(view);\n}\n\nfunction requireConsoleAccess(): void {\n if (!currentUser?.flagSuper && !currentUser?.flagAdmin) {\n throw new Error('La console richiede un superutente o un admin Accessi.');\n }\n}\n\n/**\n * Un admin accede a tutte le sezioni. Un superutente (senza admin) gestisce solo gli Utenti.\n */\nfunction isViewAllowed(view: ConsoleView): boolean {\n if (!currentUser) return false;\n if (currentUser.flagAdmin) return true;\n return view === 'users';\n}\n\n/** Mostra/nasconde le voci di navigazione in base ai flag dell'utente connesso. */\nfunction applyRoleNavigation(): void {\n document.querySelectorAll<HTMLElement>('#nav [data-view]').forEach((link) => {\n const view = link.dataset.view as ConsoleView;\n const item = link.closest('li') ?? link;\n item.hidden = !isViewAllowed(view);\n });\n document.querySelectorAll<HTMLElement>('#nav details[data-nav-group]').forEach((branch) => {\n const hasVisible = Array.from(branch.querySelectorAll<HTMLElement>('[data-view]')).some((link) => !link.closest('li')!.hidden);\n branch.hidden = !hasVisible;\n });\n}\n\nfunction formValues(form: HTMLFormElement): Record<string, string> {\n return Object.fromEntries(new FormData(form).entries()) as Record<string, string>;\n}\n\nfunction eventForm(event: Event): HTMLFormElement {\n return event.currentTarget as HTMLFormElement;\n}\n\n/** Shared identity fields: values are verified by the hosting backend, never by this console. */\nfunction federatedIdentityFields(providers: FederatedProvider[]): string {\n return `<label>Provider ${helpDot('sso-provider')}<select name=\"provider\" required><option value=\"\">Seleziona un provider</option>${providers.filter((provider) => provider.active).map((provider) => `<option value=\"${escapeHtml(provider.provider)}\">${escapeHtml(provider.description)} (${escapeHtml(provider.provider)})</option>`).join('')}</select><span class=\"form-help\">Deve corrispondere alla configurazione del backend.</span></label>\n <label>ID utente del provider (subject) ${helpDot('sso-subject')}<input name=\"subject\" required><span class=\"form-help\">Identificatore stabile (es. <code>oid</code> Azure, <code>sub</code> Google/OIDC, <code>NameID</code> SAML). Mai l'email: apri la guida.</span></label>\n <label>Nota ${helpDot('sso-note')}<input name=\"note\"><span class=\"form-help\">Nota interna, non inviata al provider.</span></label>`;\n}\n\n/** Renders high-priority SSO identity management for one Accessi user. */\nfunction federatedIdentitySection(identities: ConsoleFederatedIdentity[], providers: FederatedProvider[]): string {\n return `<section class=\"user-editor-section sso-identity-section\" data-user-panel=\"sso\" role=\"tabpanel\" aria-labelledby=\"user-tab-sso\"><div class=\"section-heading\"><div><p class=\"eyebrow\">Autenticazione esterna</p><h3>Identità SSO</h3></div><span class=\"muted\">Collegamenti verificati dal backend</span></div><p class=\"form-help\">Disabilita conserva lo storico; elimina rimuove il collegamento (l'utente resta).</p><div class=\"sso-identity-list\">${identities.map((identity) => `<article class=\"sso-identity-item ${identity.active ? '' : 'is-disabled'}\"><div class=\"sso-identity-data\"><strong>${escapeHtml(identity.provider)}</strong><dl class=\"entity-metadata\"><div><dt>Subject</dt><dd>${escapeHtml(identity.subject)}</dd></div><div><dt>Stato</dt><dd>${identity.active ? 'Abilitata' : 'Disabilitata'}</dd></div></dl>${identity.note ? `<p class=\"entity-note\"><strong>Nota</strong>${escapeHtml(identity.note)}</p>` : ''}</div><div class=\"sso-identity-actions\"><button type=\"button\" class=\"secondary\" data-identity-toggle=\"${escapeHtml(identity.identityKey)}\" data-active=\"${String(!identity.active)}\">${identity.active ? 'Disabilita' : 'Abilita'}</button><button type=\"button\" class=\"icon-button danger-button\" data-identity-delete=\"${escapeHtml(identity.identityKey)}\" aria-label=\"Elimina definitivamente il collegamento SSO ${escapeHtml(identity.provider)}\" title=\"Elimina definitivamente il collegamento SSO\"><span aria-hidden=\"true\">&#128465;</span></button></div></article>`).join('') || '<p class=\"muted\">Nessun collegamento SSO.</p>'}</div>${providers.some((provider) => provider.active) ? `<form id=\"link-sso\" class=\"sso-link-form\">${federatedIdentityFields(providers)}<button>Collega SSO verificato</button></form>` : '<p class=\"form-help\">Non ci sono provider SSO attivi. Censiscine uno nella sezione SSO prima di creare collegamenti.</p>'}</section>`;\n}\n\n/** Builds the tab list for user administration without coupling it to a framework router. */\nfunction userDetailTabs(hasSso: boolean): string {\n const tabs: Array<{ id: UserDetailTab; label: string }> = [\n ...(hasSso ? [{ id: 'sso' as const, label: 'Identità SSO' }] : []),\n { id: 'profile', label: 'Profilo e accesso' },\n { id: 'roles', label: 'Ruoli' },\n { id: 'grants', label: 'Grant diretti' },\n ];\n return `<div class=\"user-tabs\" role=\"tablist\" aria-label=\"Sezioni utente\">${tabs.map((tab) => `<button id=\"user-tab-${tab.id}\" type=\"button\" role=\"tab\" aria-controls=\"user-panel-${tab.id}\" data-user-tab=\"${tab.id}\">${tab.label}</button>`).join('')}</div>`;\n}\n\n/** Activates one user-management panel while keeping ARIA state in sync with the visible tab. */\nfunction activateUserTab(tab: UserDetailTab): void {\n document.querySelectorAll<HTMLButtonElement>('[data-user-tab]').forEach((button) => {\n const selected = button.dataset.userTab === tab;\n button.setAttribute('aria-selected', String(selected));\n button.tabIndex = selected ? 0 : -1;\n });\n document.querySelectorAll<HTMLElement>('[data-user-panel]').forEach((panel) => {\n const selected = panel.dataset.userPanel === tab;\n panel.hidden = !selected;\n // Keep form IDs stable: the save handlers bind to profile/roles/grants.\n if (!panel.id) panel.id = `user-panel-${panel.dataset.userPanel}`;\n document.querySelector(`[data-user-tab=\"${panel.dataset.userPanel}\"]`)?.setAttribute('aria-controls', panel.id);\n });\n}\n\nfunction selectedNumbers(form: HTMLFormElement, name: string): number[] {\n return Array.from(new FormData(form).getAll(name), (value) => Number(value));\n}\n\n/** Carica tutti gli utenti (usato da SSO e filtri, che popolano selettori completi). */\nasync function loadUsers(): Promise<UserRow[]> {\n return result(await getUsers({ includeGrants: true })) as UserRow[];\n}\n\n/** Carica la pagina corrente della lista utenti e il totale (header X-Total-Count). */\nasync function loadUsersPage(): Promise<{ users: UserRow[]; total: number }> {\n const response = await getUsers({\n includeGrants: true,\n limit: USERS_PAGE_SIZE,\n offset: usersPage * USERS_PAGE_SIZE,\n });\n const users = result<UserRow[]>(response);\n const headers = (response as unknown as { headers?: Headers }).headers;\n const totalHeader = headers?.get?.('X-Total-Count') ?? null;\n const parsed = totalHeader !== null && totalHeader !== '' ? Number(totalHeader) : Number.NaN;\n const total = Number.isFinite(parsed) ? parsed : usersPage * USERS_PAGE_SIZE + users.length;\n return { users, total };\n}\n\n/** Numeri di pagina da mostrare, con ellissi quando le pagine sono molte. */\nfunction pageNumbers(current: number, total: number): Array<number | 'gap'> {\n if (total <= 7) {\n return Array.from({ length: total }, (_, index) => index + 1);\n }\n const wanted = new Set<number>([1, total, current, current - 1, current + 1]);\n const sorted = Array.from(wanted).filter((page) => page >= 1 && page <= total).sort((a, b) => a - b);\n const result: Array<number | 'gap'> = [];\n let previous = 0;\n for (const page of sorted) {\n if (previous !== 0 && page - previous > 1) {\n result.push('gap');\n }\n result.push(page);\n previous = page;\n }\n return result;\n}\n\n/** Paginatore orizzontale con numeri di pagina (troncati) e riepilogo del contesto. */\nfunction pagerMarkup(totalPages: number): string {\n const context = `<span class=\"pager-context\">${usersTotal} utent${usersTotal === 1 ? 'e' : 'i'}${totalPages > 1 ? ` · pagina ${usersPage + 1} di ${totalPages}` : ''}</span>`;\n if (totalPages <= 1) {\n return `<nav class=\"pager\" aria-label=\"Paginazione utenti\">${context}</nav>`;\n }\n\n const numbers = pageNumbers(usersPage + 1, totalPages).map((page) => page === 'gap'\n ? '<span class=\"pager-gap\" aria-hidden=\"true\">&hellip;</span>'\n : `<button type=\"button\" class=\"pager-item\" data-goto=\"${page}\"${page === usersPage + 1 ? ' aria-current=\"page\"' : ''}>${page}</button>`).join('');\n\n const controls = `<span class=\"pager-controls\">`\n + `<button type=\"button\" class=\"pager-item pager-nav\" data-goto=\"prev\"${usersPage === 0 ? ' disabled' : ''} aria-label=\"Pagina precedente\">&lsaquo;</button>`\n + numbers\n + `<button type=\"button\" class=\"pager-item pager-nav\" data-goto=\"next\"${usersPage >= totalPages - 1 ? ' disabled' : ''} aria-label=\"Pagina successiva\">&rsaquo;</button>`\n + '</span>';\n\n return `<nav class=\"pager\" aria-label=\"Paginazione utenti\">${controls}${context}</nav>`;\n}\n\n/** Cella ruoli con etichette; se sono molte mostra \"altre N\" che espande la riga chiudendo le altre. */\nfunction rolesCell(codiceUtente: number, userGrants?: UserRow['userGrants']): string {\n const labels = (userGrants?.ruoli ?? [])\n .map((role) => role.descrizioneRuolo?.trim() || (role.codiceRuolo ? `#${role.codiceRuolo}` : ''))\n .filter((label): label is string => label.length > 0);\n if (labels.length === 0) {\n return '<span class=\"muted\">&mdash;</span>';\n }\n\n const limit = 2;\n if (labels.length <= limit) {\n return `<span class=\"roles-list\">${labels.map(escapeHtml).join(', ')}</span>`;\n }\n\n const hiddenCount = labels.length - limit;\n return `<span class=\"roles-cell\" data-roles-cell=\"${codiceUtente}\">`\n + `<span class=\"roles-list\" data-roles-collapsed>${labels.slice(0, limit).map(escapeHtml).join(', ')}</span>`\n + `<span class=\"roles-list\" data-roles-full hidden>${labels.map(escapeHtml).join(', ')}</span>`\n + `<button type=\"button\" class=\"link-button\" data-roles-toggle=\"${codiceUtente}\" data-roles-more=\"${hiddenCount}\" aria-expanded=\"false\">altre ${hiddenCount}</button>`\n + '</span>';\n}\n\nfunction setRolesExpanded(cell: HTMLElement, expanded: boolean): void {\n cell.querySelector<HTMLElement>('[data-roles-collapsed]')?.toggleAttribute('hidden', expanded);\n cell.querySelector<HTMLElement>('[data-roles-full]')?.toggleAttribute('hidden', !expanded);\n const button = cell.querySelector<HTMLButtonElement>('[data-roles-toggle]');\n if (button) {\n button.setAttribute('aria-expanded', String(expanded));\n button.textContent = expanded ? 'mostra meno' : `altre ${button.dataset.rolesMore ?? ''}`;\n }\n}\n\n/** Espande una riga alla volta, chiudendo le altre. */\nfunction bindRolesToggles(): void {\n document.querySelectorAll<HTMLButtonElement>('[data-roles-toggle]').forEach((button) => {\n button.onclick = () => {\n const cell = button.closest<HTMLElement>('[data-roles-cell]');\n if (!cell) return;\n const willExpand = button.getAttribute('aria-expanded') !== 'true';\n document.querySelectorAll<HTMLElement>('[data-roles-cell]').forEach((other) => {\n if (other !== cell) setRolesExpanded(other, false);\n });\n setRolesExpanded(cell, willExpand);\n };\n });\n}\n\nasync function detectFederatedAuthentication(): Promise<void> {\n if (!currentUser) return;\n try {\n await getFederatedIdentities(currentUser.codiceUtente);\n federatedAuthenticationAvailable = true;\n } catch {\n federatedAuthenticationAvailable = false;\n }\n}\n\nasync function loginView(event: SubmitEvent): Promise<void> {\n event.preventDefault();\n try {\n const values = formValues(event.currentTarget as HTMLFormElement);\n byId('login-error').textContent = '';\n const response = result<LoginResult>(await login({ email: values.email ?? '', password: values.password || undefined }));\n await completeLoginStep(response);\n } catch (error) {\n byId('login-error').textContent = error instanceof Error ? error.message : 'Login non riuscito.';\n }\n}\n\nlet pendingChallenge: string | null = null;\nlet resendTimer: ReturnType<typeof setInterval> | undefined;\n\nfunction resetLogin(): void {\n pendingChallenge = null;\n if (resendTimer) clearInterval(resendTimer);\n byId<HTMLFormElement>('login-form').reset();\n byId<HTMLFormElement>('two-factor-form').reset();\n byId('login-form').hidden = false;\n byId('two-factor-form').hidden = true;\n byId('password-field').hidden = true;\n byId('password-field').querySelector('input')!.disabled = true;\n byId('restart-login').hidden = true;\n byId('login-submit').textContent = 'Continua';\n byId('login-error').textContent = '';\n}\n\nfunction showTwoFactor(challenge: { challengeId: string; expiresAt?: string; resendAfterSeconds: number }): void {\n pendingChallenge = challenge.challengeId;\n byId('login-form').hidden = true;\n const password = byId('password-field').querySelector('input')!;\n password.value = '';\n password.disabled = true;\n byId('two-factor-form').hidden = false;\n byId('restart-login').hidden = false;\n byId<HTMLFormElement>('two-factor-form').reset();\n byId('two-factor-form').querySelector<HTMLInputElement>('input')!.focus();\n const expires = challenge.expiresAt ? new Date(challenge.expiresAt).toLocaleTimeString() : '';\n byId('two-factor-status').textContent = expires ? `Codice inviato. Scade alle ${expires}.` : 'Codice inviato. Controlla la tua email.';\n if (resendTimer) clearInterval(resendTimer);\n const availableAt = Date.now() + challenge.resendAfterSeconds * 1000;\n const update = () => {\n const seconds = Math.max(0, Math.ceil((availableAt - Date.now()) / 1000));\n const button = byId<HTMLButtonElement>('resend-code');\n button.disabled = seconds > 0;\n button.textContent = seconds ? `Reinvia tra ${seconds}s` : 'Invia un nuovo codice';\n if (!seconds && resendTimer) clearInterval(resendTimer);\n };\n update();\n resendTimer = setInterval(update, 1000);\n}\n\nasync function completeLoginStep(response: LoginResult): Promise<void> {\n if (response.challenge) {\n showTwoFactor(response.challenge);\n return;\n }\n if (response.passwordRequired) {\n byId('password-field').hidden = false;\n const input = byId('password-field').querySelector('input')!;\n input.disabled = false;\n input.required = true;\n input.focus();\n byId('restart-login').hidden = false;\n byId('login-submit').textContent = 'Accedi';\n return;\n }\n if (!response.token?.value) throw new Error('Risposta di autenticazione incompleta.');\n token = response.token.value;\n sessionStorage.setItem('accessi-console-token', token);\n setAccessiConsoleToken(token);\n resetLogin();\n await bootstrap();\n}\n\nasync function bootstrap(): Promise<void> {\n try {\n setAccessiConsoleToken(token);\n if (!token) throw new Error('Inserisci le credenziali amministrative.');\n const payload = result<AuthenticatedTokenPayloadDto>(await getUserByToken({ token }));\n currentUser = payload.userData;\n requireConsoleAccess();\n applyRoleNavigation();\n await detectFederatedAuthentication();\n const roleLabel = currentUser.flagSuper && currentUser.flagAdmin ? 'super + admin' : currentUser.flagAdmin ? 'admin' : 'superutente';\n byId('who').textContent = `${currentUser.email} - ${roleLabel}`;\n byId<HTMLButtonElement>('sso-navigation').hidden = !federatedAuthenticationAvailable;\n finishBoot('console');\n await navigate(viewFromLocation(), window.location.pathname === consoleBasePath);\n } catch (error) {\n token = null;\n currentUser = null;\n setAccessiConsoleToken(null);\n federatedAuthenticationAvailable = false;\n sessionStorage.removeItem('accessi-console-token');\n finishBoot('login');\n byId('login-error').textContent = error instanceof Error ? error.message : 'Sessione non valida.';\n }\n}\n\nasync function showUsers(): Promise<void> {\n const { users, total } = await loadUsersPage();\n usersTotal = total;\n const totalPages = Math.max(1, Math.ceil(total / USERS_PAGE_SIZE));\n if (usersPage >= totalPages) usersPage = totalPages - 1;\n\n render(`<div class=\"toolbar\"><button id=\"new-local\">Nuovo utente locale</button>${federatedAuthenticationAvailable ? '<button id=\"new-sso\">Nuovo utente SSO</button>' : ''}<button id=\"reload-users\" class=\"secondary\">Aggiorna</button></div>\n <div class=\"pager-row pager-row-top\">${pagerMarkup(totalPages)}</div>\n <table><thead><tr><th>Utente</th><th>Stato</th><th>Accesso</th><th>2FA</th><th>Ruoli</th><th></th></tr></thead><tbody>\n ${users.map(({ utente, userGrants }) => `<tr><td>${escapeHtml(utente.email)}<br><span class=\"muted\">${escapeHtml(utente.nome)} ${escapeHtml(utente.cognome)}</span></td><td>${escapeHtml(utente.statoRegistrazione)}</td><td>${utente.passwordlessLoginEnabled ? 'codice email' : utente.passwordLoginEnabled === false ? 'solo SSO' : 'password'}</td><td>${utente.flagDueFattori ? 'Attiva' : 'Disattiva'}</td><td class=\"roles-col\">${rolesCell(utente.codiceUtente, userGrants)}</td><td><button data-user=\"${utente.codiceUtente}\">Gestisci</button></td></tr>`).join('') || '<tr><td colspan=\"6\" class=\"muted\">Nessun utente.</td></tr>'}\n </tbody></table><div class=\"pager-row pager-row-bottom\">${pagerMarkup(totalPages)}</div>`);\n\n byId('new-local').onclick = () => showLocalUserForm();\n if (federatedAuthenticationAvailable) byId('new-sso').onclick = () => handleAction(showSsoUserForm);\n byId('reload-users').onclick = () => handleAction(() => show('users'));\n document.querySelectorAll<HTMLButtonElement>('[data-goto]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n const target = button.dataset.goto;\n const nextPage = target === 'prev' ? usersPage - 1 : target === 'next' ? usersPage + 1 : Number(target) - 1;\n if (!Number.isInteger(nextPage) || nextPage < 0 || nextPage >= totalPages || nextPage === usersPage) return;\n usersPage = nextPage;\n await show('users');\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-user]').forEach((button) => {\n button.onclick = () => handleAction(() => showUser(button.dataset.user ?? ''));\n });\n bindRolesToggles();\n}\n\nfunction authenticationPolicyFields(user: UserDto): string {\n return `<fieldset><legend>Verifica dell'accesso (opzionale)</legend>\n <label class=\"check\"><input name=\"flagDueFattori\" type=\"checkbox\" ${user.flagDueFattori ? 'checked' : ''}> Richiedi un codice via email (2FA) ${helpDot('user-2fa')}</label>\n <p class=\"form-help\">Se attiva, il codice è richiesto dopo password o SSO.</p>\n <label class=\"check\"><input name=\"passwordlessLoginEnabled\" type=\"checkbox\" ${user.passwordlessLoginEnabled ? 'checked' : ''} ${user.flagDueFattori ? '' : 'disabled'}> Consenti accesso con il solo codice email ${helpDot('user-passwordless')}</label>\n <p class=\"form-help\">Accesso senza password (richiede il codice email).</p>\n </fieldset>`;\n}\n\nfunction showLocalUserForm(): void {\n render(`<button id=\"back\">Indietro</button><h2>Nuovo utente locale</h2><p class=\"muted\">Viene inviata l'e-mail per impostare la password.</p>\n <form id=\"local-user\"><label>Email ${helpDot('user-email')}<input name=\"email\" type=\"email\" required><span class=\"form-help\">Identificativo di accesso; riceverà l'email per la password.</span></label><label>Nome ${helpDot('user-name')}<input name=\"nome\"></label><label>Cognome ${helpDot('user-name')}<input name=\"cognome\"></label><button>Crea utente</button></form>`);\n byId('back').onclick = () => show('users');\n const localUserForm = document.getElementById('local-user') as HTMLFormElement | null;\n if (localUserForm) localUserForm.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n await createManagedUser(formValues(eventForm(event)) as unknown as RegisterRequest);\n showNotice('Utente creato; inviata la procedura di impostazione password.');\n await show('users');\n });\n };\n}\n\nasync function showSsoUserForm(): Promise<void> {\n const providers = result<FederatedProvider[]>(await getFederatedProviders());\n if (!providers.some((provider) => provider.active)) {\n throw new Error('Prima di creare un utente SSO, censisci e abilita almeno un provider SSO.');\n }\n render(`<button id=\"back\">Indietro</button><h2>Nuovo utente SSO</h2><p class=\"muted\">Salva solo collegamenti già verificati dal backend.</p>\n <form id=\"sso-user\"><label>Email ${helpDot('user-email')}<input name=\"email\" type=\"email\" required><span class=\"form-help\">Email di contatto e identificativo Accessi dell'utente.</span></label><label>Nome ${helpDot('user-name')}<input name=\"nome\"></label><label>Cognome ${helpDot('user-name')}<input name=\"cognome\"></label>${federatedIdentityFields(providers)}<label class=\"check\"><input name=\"passwordLoginEnabled\" type=\"checkbox\"> Abilita anche la password locale ${helpDot('user-password-login')}</label><span class=\"form-help\">Se disattivato, l'utente accede solo via SSO.</span><button>Crea utente SSO</button></form>`);\n byId('back').onclick = () => show('ssoUsers');\n const ssoUserForm = document.getElementById('sso-user') as HTMLFormElement | null;\n if (ssoUserForm) ssoUserForm.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const form = eventForm(event);\n const values = formValues(form);\n const request: CreateFederatedUserRequest = {\n provider: values.provider ?? '',\n subject: values.subject ?? '',\n note: values.note || undefined,\n passwordLoginEnabled: new FormData(form).has('passwordLoginEnabled'),\n user: { email: values.email ?? '', nome: values.nome || undefined, cognome: values.cognome || undefined },\n };\n await createFederatedUser(request);\n showNotice('Utente SSO creato e collegamento registrato.');\n await show('ssoUsers');\n });\n };\n}\n\n/** Catalogo dei provider SSO: elenco, censimento, modifica ed eliminazione. */\nasync function showSsoProviders(): Promise<void> {\n if (!federatedAuthenticationAvailable) throw new Error('SSO non è abilitato in questa istanza Accessi.');\n const providerList = result<FederatedProvider[]>(await getFederatedProviders());\n render(`<div class=\"toolbar\"><button id=\"new-provider\">Nuovo provider</button><button id=\"reload-providers\" class=\"secondary\">Aggiorna</button></div>\n <h2>Provider SSO</h2><p class=\"muted\">La validazione di token, issuer e segreti resta nel backend. Un provider si elimina solo se nessuna identità è collegata.</p>\n <div class=\"menu-table-wrap\"><table><thead><tr><th>Provider</th><th>Descrizione</th><th>Stato</th><th></th></tr></thead><tbody>${providerList.map((provider) => `<tr class=\"${provider.active ? '' : 'is-disabled'}\"><td><code>${escapeHtml(provider.provider)}</code></td><td>${escapeHtml(provider.description)}</td><td>${provider.active ? 'Attivo' : 'Disabilitato'}</td><td class=\"row-actions\"><button data-provider=\"${escapeHtml(provider.provider)}\">Gestisci</button></td></tr>`).join('') || '<tr><td colspan=\"4\" class=\"muted\">Nessun provider censito.</td></tr>'}</tbody></table></div>`);\n byId('new-provider').onclick = () => showProviderForm();\n byId('reload-providers').onclick = () => handleAction(showSsoProviders);\n document.querySelectorAll<HTMLButtonElement>('[data-provider]').forEach((button) => {\n button.onclick = () => showProviderForm(providerList.find((provider) => provider.provider === button.dataset.provider));\n });\n}\n\n/** Utenti e identità SSO: elenco e collegamento delle identità. */\nasync function showSsoUsers(): Promise<void> {\n if (!federatedAuthenticationAvailable) throw new Error('SSO non è abilitato in questa istanza Accessi.');\n const users = await loadUsers();\n render(`<div class=\"toolbar\"><button id=\"new-sso\">Nuovo utente SSO</button><button id=\"reload-sso-users\" class=\"secondary\">Aggiorna</button></div>\n <h2>Utenti e identità SSO</h2><p class=\"muted\">Gestisci i collegamenti provider/subject già verificati dal backend.</p>\n <div class=\"menu-table-wrap\"><table><thead><tr><th>Utente</th><th>Accesso</th><th></th></tr></thead><tbody>${users.map(({ utente }) => `<tr><td>${escapeHtml(utente.email)}</td><td>${utente.passwordLoginEnabled === false ? 'solo SSO' : 'password e SSO'}</td><td class=\"row-actions\"><button data-sso-user=\"${utente.codiceUtente}\">Gestisci identità</button></td></tr>`).join('') || '<tr><td colspan=\"3\" class=\"muted\">Nessun utente.</td></tr>'}</tbody></table></div>`);\n byId('new-sso').onclick = () => handleAction(showSsoUserForm);\n byId('reload-sso-users').onclick = () => handleAction(showSsoUsers);\n document.querySelectorAll<HTMLButtonElement>('[data-sso-user]').forEach((button) => {\n button.onclick = () => handleAction(() => showUser(button.dataset.ssoUser ?? ''));\n });\n}\n\n/** Creates or updates catalog metadata; the provider key is immutable once identities reference it. */\nfunction showProviderForm(provider?: FederatedProvider): void {\n const isExisting = provider !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><div class=\"page-header\"><div><p class=\"eyebrow\">Catalogo SSO</p><h2>${isExisting ? 'Gestisci provider' : 'Nuovo provider'}</h2></div><span class=\"muted\">Le configurazioni tecniche restano nel backend</span></div><form id=\"provider-form\"><label>Chiave provider ${helpDot('provider-key')}<input name=\"provider\" value=\"${escapeHtml(provider?.provider)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Chiave usata dal backend nel payload SSO (es. <code>azure-ad-acme-prod</code>). Non modificabile dopo il censimento.</span></label><label>Descrizione ${helpDot('provider-description')}<input name=\"description\" value=\"${escapeHtml(provider?.description)}\" required><span class=\"form-help\">Nome leggibile per gli amministratori.</span></label><label>Nota ${helpDot('provider-note')}<input name=\"note\" value=\"${escapeHtml(provider?.note)}\"><span class=\"form-help\">Non inserire segreti o dati personali.</span></label>${isExisting ? `<label class=\"check\"><input name=\"active\" type=\"checkbox\" ${provider.active ? 'checked' : ''}> Provider attivo ${helpDot('provider-active')}</label><span class=\"form-help\">Blocca nuovi login e collegamenti; lo storico resta.</span>` : ''}<button>${isExisting ? 'Salva provider' : 'Censisci provider'}</button>${isExisting ? '<button type=\"button\" id=\"delete-provider\" class=\"danger-button\">Elimina provider</button>' : ''}</form>`);\n byId('back').onclick = () => show('ssoProviders');\n const deleteProviderButton = document.getElementById('delete-provider') as HTMLButtonElement | null;\n if (deleteProviderButton && provider) {\n deleteProviderButton.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il provider ${provider.provider}? Operazione possibile solo se nessuna identita e collegata.`)) return;\n await deleteFederatedProvider(provider.provider);\n showNotice('Provider SSO eliminato.');\n await show('ssoProviders');\n });\n }\n const providerForm = document.getElementById('provider-form') as HTMLFormElement | null;\n if (providerForm) providerForm.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const form = eventForm(event);\n const values = formValues(form);\n if (provider) {\n const request: UpdateFederatedProviderRequest = {\n description: values.description,\n note: values.note || undefined,\n active: new FormData(form).has('active'),\n };\n await updateFederatedProvider(provider.provider, request);\n } else {\n const request: CreateFederatedProviderRequest = {\n provider: values.provider ?? '',\n description: values.description ?? '',\n note: values.note || undefined,\n };\n await createFederatedProvider(request);\n }\n showNotice(isExisting ? 'Provider SSO aggiornato.' : 'Provider SSO censito.');\n await show('ssoProviders');\n });\n };\n}\n\n/** Opzioni dello stato di registrazione Accessi (UTENTI.STAREG). */\nfunction registrationStateOptions(current: unknown): string {\n const states: Array<[number, string]> = [\n [0, 'Non definito'], [5, 'Inserito'], [10, 'Invitato'], [20, 'Confermato'], [50, 'Eliminato'], [99, 'Bloccato'],\n ];\n const currentValue = Number(current);\n return states.map(([value, label]) => `<option value=\"${value}\" ${currentValue === value ? 'selected' : ''}>${label} (${value})</option>`).join('');\n}\n\nasync function showUser(rawCode: string): Promise<void> {\n const codiceUtente = Number(rawCode);\n const [users, roles, grants, groups, providers] = await Promise.all([\n getUsers({ codiceUtente, includeGrants: true }),\n getRoles(),\n getUserRolesAndGrants(codiceUtente),\n getGroupsWithMenus({ includeDisabled: true }),\n federatedAuthenticationAvailable ? getFederatedProviders() : Promise.resolve(null),\n ]);\n const userRow = (result(users) as UserRow[])[0];\n if (!userRow?.utente) throw new Error('Utente non trovato.');\n const user = userRow.utente;\n const allRoles = result(roles) as Role[];\n const userGrants = result(grants) as { ruoli?: Array<{ codiceRuolo?: number }>; abilitazioni?: Permission[] };\n const menuGroups = result(groups) as GroupWithMenusEntity[];\n const providerList = providers ? result<FederatedProvider[]>(providers) : [];\n const linked = federatedAuthenticationAvailable\n ? result<ConsoleFederatedIdentity[]>(await getFederatedIdentities(codiceUtente))\n : [];\n const identitySection = federatedAuthenticationAvailable ? federatedIdentitySection(linked, providerList) : '';\n const defaultUserTab: UserDetailTab = federatedAuthenticationAvailable ? 'sso' : 'profile';\n render(`<div class=\"user-action-bar\"><button id=\"back\" type=\"button\" class=\"secondary\">Indietro</button><label class=\"inline-field\">Stato registrazione ${helpDot('user-state')}<select id=\"user-state\">${registrationStateOptions(user.statoRegistrazione)}</select></label><button id=\"save-state\" type=\"button\" class=\"secondary\">Aggiorna stato</button><button id=\"disable-user\" type=\"button\" class=\"danger-button\">Imposta stato eliminato</button>${helpDot('user-delete')}</div><div class=\"page-header\"><div><p class=\"eyebrow\">Utente ${codiceUtente}</p><h2>${escapeHtml(user.email)}</h2></div><span class=\"muted\">Gestione profilo, ruoli e autorizzazioni</span></div>${userDetailTabs(federatedAuthenticationAvailable)}<div class=\"user-editor\">\n ${identitySection}\n <form id=\"profile\" data-user-panel=\"profile\" role=\"tabpanel\" aria-labelledby=\"user-tab-profile\"><h3>Profilo e accesso</h3><label>Nome ${helpDot('user-name')}<input name=\"nome\" value=\"${escapeHtml(user.nome)}\"></label><label>Cognome ${helpDot('user-name')}<input name=\"cognome\" value=\"${escapeHtml(user.cognome)}\"></label><label>Email ${helpDot('user-email')}<input name=\"email\" type=\"email\" value=\"${escapeHtml(user.email)}\" required><span class=\"form-help\">Identificativo di accesso e recapito.</span></label>${federatedAuthenticationAvailable ? `<label class=\"check\"><input name=\"passwordLoginEnabled\" type=\"checkbox\" ${user.passwordLoginEnabled !== false ? 'checked' : ''}> Login con password ${helpDot('user-password-login')}</label><span class=\"form-help\">Se disabilitato, il login con email e password restituisce un errore esplicito; restano valide le identità SSO attive.</span>` : ''}${authenticationPolicyFields(user)}<button>Salva</button></form>\n ${roleAssignmentEditor(allRoles, userGrants.ruoli, menuGroups)}\n ${directGrantEditor(menuGroups, userGrants.abilitazioni)}\n </div>`);\n byId('back').onclick = () => show('users');\n const userTabButtons = Array.from(document.querySelectorAll<HTMLButtonElement>('[data-user-tab]'));\n userTabButtons.forEach((button, index) => {\n button.onclick = () => activateUserTab(button.dataset.userTab as UserDetailTab);\n button.onkeydown = (event) => {\n const targetIndex = event.key === 'ArrowRight' ? (index + 1) % userTabButtons.length\n : event.key === 'ArrowLeft' ? (index - 1 + userTabButtons.length) % userTabButtons.length\n : event.key === 'Home' ? 0 : event.key === 'End' ? userTabButtons.length - 1 : -1;\n if (targetIndex < 0) return;\n event.preventDefault();\n const targetTab = userTabButtons[targetIndex];\n if (!targetTab) return;\n targetTab.focus();\n activateUserTab(targetTab.dataset.userTab as UserDetailTab);\n };\n });\n activateUserTab(defaultUserTab);\n const profileForm = document.getElementById('profile') as HTMLFormElement | null;\n if (profileForm) {\n const twoFactor = profileForm.elements.namedItem('flagDueFattori') as HTMLInputElement;\n const passwordless = profileForm.elements.namedItem('passwordlessLoginEnabled') as HTMLInputElement;\n twoFactor.onchange = () => {\n passwordless.disabled = !twoFactor.checked;\n if (!twoFactor.checked) passwordless.checked = false;\n };\n profileForm.onsubmit = event => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const fields = new FormData(eventForm(event));\n await updateUtente(codiceUtente, {\n codiceUtente, email: values.email ?? '', nome: values.nome || undefined, cognome: values.cognome || undefined,\n flagDueFattori: fields.has('flagDueFattori'),\n passwordlessLoginEnabled: fields.has('passwordlessLoginEnabled'),\n ...(federatedAuthenticationAvailable ? { passwordLoginEnabled: fields.has('passwordLoginEnabled') } : {}),\n } as UserDto);\n if (codiceUtente === currentUser?.codiceUtente && (\n fields.has('flagDueFattori') !== Boolean(user.flagDueFattori) ||\n fields.has('passwordlessLoginEnabled') !== Boolean(user.passwordlessLoginEnabled)\n )) {\n token = null;\n sessionStorage.removeItem('accessi-console-token');\n setAccessiConsoleToken(null);\n resetLogin();\n await bootstrap();\n byId('login-error').textContent = 'Policy aggiornata. Accedi di nuovo con la nuova configurazione.';\n return;\n }\n await showUser(String(codiceUtente));\n activateUserTab('profile');\n showNotice('Profilo e policy aggiornati.');\n });\n };\n }\n\n const rolesForm = document.getElementById('roles') as HTMLFormElement | null;\n if (rolesForm) rolesForm.onsubmit = (event) => { event.preventDefault(); handleAction(async () => { await assignRolesToUser(codiceUtente, { roles: selectedNumbers(eventForm(event), 'role') }); showNotice('Ruoli aggiornati.'); }); };\n const grantsForm = document.getElementById('grants') as HTMLFormElement | null;\n if (grantsForm) grantsForm.onsubmit = (event) => { event.preventDefault(); handleAction(async () => { const permissions: Permission[] = []; new FormData(eventForm(event)).forEach((value, key) => { if (key.startsWith('grant:') && value) permissions.push({ codiceMenu: key.slice(6), tipoAbilitazione: Number(value) }); }); await assignPermissionsToUser(codiceUtente, { permissions }); showNotice('Grant aggiornati.'); }); };\n if (federatedAuthenticationAvailable) {\n const linkForm = document.getElementById('link-sso') as HTMLFormElement | null;\n if (linkForm) linkForm.onsubmit = (event) => { event.preventDefault(); handleAction(async () => { const values = formValues(eventForm(event)); await linkFederatedIdentity(codiceUtente, { provider: values.provider ?? '', subject: values.subject ?? '', note: values.note || undefined }); await showUser(String(codiceUtente)); }); };\n document.querySelectorAll<HTMLButtonElement>('[data-identity-toggle]').forEach((button) => { button.onclick = () => handleAction(async () => { await updateFederatedIdentity(button.dataset.identityToggle ?? '', { active: button.dataset.active === 'true' }); await showUser(String(codiceUtente)); }); });\n document.querySelectorAll<HTMLButtonElement>('[data-identity-delete]').forEach((button) => { button.onclick = () => handleAction(async () => { if (!window.confirm('Eliminare definitivamente questo collegamento SSO? L’utente Accessi non verrà eliminato.')) return; await deleteFederatedIdentityPermanently(codiceUtente, button.dataset.identityDelete ?? ''); showNotice('Collegamento SSO eliminato definitivamente.'); await showUser(String(codiceUtente)); }); });\n }\n byId('save-state').onclick = () => handleAction(async () => {\n const stateSelect = document.getElementById('user-state') as HTMLSelectElement | null;\n const statoRegistrazione = Number(stateSelect?.value ?? 0) as 0 | 5 | 10 | 20 | 50 | 99;\n await setStatoRegistrazione({ codiceUtente, statoRegistrazione });\n showNotice('Stato registrazione aggiornato.');\n await showUser(String(codiceUtente));\n });\n byId('disable-user').onclick = () => handleAction(async () => { await deleteUser(codiceUtente); showNotice('Utente impostato come eliminato.'); await show('users'); });\n}\n\nasync function showRoles(): Promise<void> {\n const [rolesResponse, groupsResponse] = await Promise.all([getRoles(), getGroupsWithMenus({ includeDisabled: true })]);\n const roles = result(rolesResponse) as Role[];\n const groups = result(groupsResponse) as GroupWithMenusEntity[];\n render(`<div class=\"toolbar\"><button id=\"new-role\">Nuovo ruolo</button></div><h2>Ruoli</h2><p class=\"form-help\">Definisci i ruoli e i menu che concedono. L'assegnazione agli utenti si gestisce dalla scheda utente.</p><div class=\"role-overview-list\">${roles.map((role) => roleOverview(role, groups)).join('') || '<p class=\"muted\">Nessun ruolo configurato.</p>'}</div>`);\n const roleForm = (role?: Role) => {\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${role ? 'Modifica' : 'Nuovo'} ruolo</h2><form id=\"role-form\"><label>Descrizione ${helpDot('role-description')}<input name=\"descrizione\" value=\"${escapeHtml(role?.descrizioneRuolo)}\" required><span class=\"form-help\">Nome del ruolo.</span></label><p class=\"form-help\">Seleziona i menu e il livello ${helpDot('role-level')}; il salvataggio sostituisce la configurazione del ruolo.</p><div class=\"role-menu-groups\">${groups.map((group) => roleMenuEditorTable(group, role)).join('')}</div><button>Salva ruolo</button></form>`);\n byId('back').onclick = () => show('roles');\n document.querySelectorAll<HTMLInputElement>('#role-form input[name=\"menu\"]').forEach((checkbox) => {\n checkbox.onchange = () => {\n const option = checkbox.closest('li');\n const level = option?.querySelector<HTMLSelectElement>('select[name^=\"menu-level:\"]');\n if (level) level.disabled = !checkbox.checked;\n };\n });\n const roleFormElement = document.getElementById('role-form') as HTMLFormElement | null;\n if (roleFormElement) roleFormElement.onsubmit = async (event) => { event.preventDefault(); const form = eventForm(event); const data = new FormData(form); const request: Role = { descrizioneRuolo: formValues(form).descrizione ?? '', menu: Array.from(data.getAll('menu'), (codiceMenu) => ({ codiceMenu: String(codiceMenu), tipoAbilitazione: Number(data.get(`menu-level:${codiceMenu}`) ?? 10) as Role['menu'][number]['tipoAbilitazione'] })) }; if (role?.codiceRuolo) await updateRole(role.codiceRuolo, request); else await createRole(request); await show('roles'); };\n };\n byId('new-role').onclick = () => roleForm();\n document.querySelectorAll<HTMLButtonElement>('[data-role]').forEach((button) => button.onclick = () => roleForm(roles.find((role) => role.codiceRuolo === Number(button.dataset.role))));\n document.querySelectorAll<HTMLButtonElement>('[data-role-delete]').forEach((button) => button.onclick = () => handleAction(async () => {\n if (!window.confirm('Eliminare definitivamente questo ruolo? Le assegnazioni agli utenti verranno rimosse.')) return;\n await deleteRole(Number(button.dataset.roleDelete));\n showNotice('Ruolo eliminato.');\n await show('roles');\n }));\n}\n\n/** Tabella dei gruppi menu con toggle, conteggio menu e azioni. */\nfunction menuGroupsTable(groups: GroupWithMenusEntity[]): string {\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Codice</th><th>Descrizione</th><th>Ordine</th><th>Menu</th><th>Stato</th><th></th></tr></thead><tbody>${groups.map((group) => `<tr class=\"${group.enabled === false ? 'is-disabled' : ''}\"><td><code>${escapeHtml(group.codiceGruppo)}</code></td><td><strong>${escapeHtml(group.descrizioneGruppo)}</strong></td><td>${escapeHtml(group.ordineGruppo)}</td><td>${group.menus.length}</td><td><label class=\"table-toggle\"><input type=\"checkbox\" data-group=\"${escapeHtml(group.codiceGruppo)}\" ${group.enabled !== false ? 'checked' : ''}><span>${group.enabled === false ? 'Disabilitato' : 'Abilitato'}</span></label></td><td class=\"row-actions\"><button type=\"button\" data-group-edit=\"${escapeHtml(group.codiceGruppo)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-group-delete=\"${escapeHtml(group.codiceGruppo)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"6\" class=\"muted\">Nessun gruppo configurato.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Tabella piatta di tutti i menu con gruppo, tipo e azioni; filtrabile per gruppo. */\nfunction menusTable(entries: Array<{ menu: MenuEntity; group: GroupWithMenusEntity }>, menuTypes: MenuTypeEntity[]): string {\n const typeLabel = (codice?: string) => {\n if (!codice) return 'Non indicato';\n return menuTypes.find((type) => type.codiceTipo === codice)?.descrizioneTipo || codice;\n };\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Stato</th><th>Menu</th><th>Codice</th><th>Gruppo</th><th>Ordine</th><th>Tipo</th><th>Pagina</th><th></th></tr></thead><tbody>${entries.map(({ menu, group }) => `<tr class=\"${menu.enabled === false ? 'is-disabled' : ''}\" data-menu-group=\"${escapeHtml(group.codiceGruppo)}\"><td><label class=\"table-toggle\"><input type=\"checkbox\" data-menu=\"${escapeHtml(menu.codiceMenu)}\" ${menu.enabled !== false ? 'checked' : ''}><span>${menu.enabled === false ? 'Disabilitato' : 'Abilitato'}</span></label></td><td><strong>${escapeHtml(menu.descrizioneMenu)}</strong>${menu.note ? `<br><span class=\"muted\">${escapeHtml(menu.note)}</span>` : ''}</td><td><code>${escapeHtml(menu.codiceMenu)}</code></td><td>${escapeHtml(group.descrizioneGruppo)}</td><td>${escapeHtml(menu.ordineMenu)}</td><td>${escapeHtml(typeLabel(menu.tipo))}</td><td>${menu.pagina ? `<code>${escapeHtml(menu.pagina)}</code>` : '<span class=\"muted\">Non indicata</span>'}</td><td class=\"row-actions\"><button type=\"button\" data-menu-edit=\"${escapeHtml(menu.codiceMenu)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-menu-delete=\"${escapeHtml(menu.codiceMenu)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"8\" class=\"muted\">Nessun menu configurato.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Tabella del catalogo tipi menu con azioni di modifica ed eliminazione. */\nfunction menuTypeTable(types: MenuTypeEntity[]): string {\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Codice</th><th>Descrizione</th><th></th></tr></thead><tbody>${types.map((type) => `<tr><td><code>${escapeHtml(type.codiceTipo)}</code></td><td>${escapeHtml(type.descrizioneTipo || '\\u2014')}</td><td class=\"row-actions\"><button type=\"button\" data-type-edit=\"${escapeHtml(type.codiceTipo)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-type-delete=\"${escapeHtml(type.codiceTipo)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"3\" class=\"muted\">Nessun tipo menu.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Gestione dei gruppi: elenco, creazione, modifica, eliminazione e toggle. */\nasync function showMenuGroups(): Promise<void> {\n const groups = result(await getGroupsWithMenus({ includeDisabled: true })) as GroupWithMenusEntity[];\n render(`<div class=\"toolbar\"><button id=\"new-group\">Nuovo gruppo</button><button id=\"reload-groups\" class=\"secondary\">Aggiorna</button></div>\n <h2>Gruppi di menu</h2><p class=\"form-help\">Raggruppano i menu nella navigazione e ne definiscono l'ordine. Un gruppo si elimina solo se non contiene menu.</p>\n ${menuGroupsTable(groups)}`);\n byId('new-group').onclick = () => showMenuGroupForm();\n byId('reload-groups').onclick = () => handleAction(showMenuGroups);\n document.querySelectorAll<HTMLInputElement>('[data-group]').forEach((input) => {\n input.onchange = () => handleAction(async () => {\n await setGroupEnabled(input.dataset.group ?? '', { enabled: input.checked });\n showNotice('Gruppo aggiornato.');\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-group-edit]').forEach((button) => {\n button.onclick = () => showMenuGroupForm(groups.find((group) => group.codiceGruppo === button.dataset.groupEdit));\n });\n document.querySelectorAll<HTMLButtonElement>('[data-group-delete]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il gruppo ${button.dataset.groupDelete}? Operazione possibile solo se non contiene menu.`)) return;\n await deleteMenuGroup(button.dataset.groupDelete ?? '');\n showNotice('Gruppo eliminato.');\n await showMenuGroups();\n });\n });\n}\n\n/** Gestione dei menu: elenco piatto filtrabile, creazione, modifica, eliminazione e toggle. */\nasync function showMenuItems(): Promise<void> {\n const [groupsResponse, typesResponse] = await Promise.all([\n getGroupsWithMenus({ includeDisabled: true }),\n getMenuTypes(),\n ]);\n const groups = result(groupsResponse) as GroupWithMenusEntity[];\n const menuTypes = result(typesResponse) as MenuTypeEntity[];\n const entries = groups.flatMap((group) => group.menus.map((menu) => ({ menu, group })));\n render(`<div class=\"toolbar\"><button id=\"new-menu\">Nuovo menu</button><button id=\"reload-menus\" class=\"secondary\">Aggiorna</button><label class=\"inline-field\">Filtra per gruppo<select id=\"menu-group-filter\"><option value=\"\">Tutti i gruppi</option>${groups.map((group) => `<option value=\"${escapeHtml(group.codiceGruppo)}\">${escapeHtml(group.descrizioneGruppo)}</option>`).join('')}</select></label></div>\n <h2>Menu</h2><p class=\"form-help\">Voci di navigazione. L'eliminazione rimuove anche i grant utente e le associazioni ai ruoli.</p>\n ${menusTable(entries, menuTypes)}`);\n byId('new-menu').onclick = () => showMenuForm(undefined, groups, menuTypes);\n byId('reload-menus').onclick = () => handleAction(showMenuItems);\n const groupFilter = document.getElementById('menu-group-filter') as HTMLSelectElement | null;\n if (groupFilter) {\n groupFilter.onchange = () => {\n const selected = groupFilter.value;\n document.querySelectorAll<HTMLTableRowElement>('[data-menu-group]').forEach((row) => {\n row.hidden = selected !== '' && row.dataset.menuGroup !== selected;\n });\n };\n }\n document.querySelectorAll<HTMLInputElement>('[data-menu]').forEach((input) => {\n input.onchange = () => handleAction(async () => {\n await setMenuEnabled(input.dataset.menu ?? '', { enabled: input.checked });\n showNotice('Menu aggiornato.');\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-menu-edit]').forEach((button) => {\n button.onclick = () => showMenuForm(entries.find((entry) => entry.menu.codiceMenu === button.dataset.menuEdit)?.menu, groups, menuTypes);\n });\n document.querySelectorAll<HTMLButtonElement>('[data-menu-delete]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il menu ${button.dataset.menuDelete}? Verranno rimossi anche i grant utente e le associazioni ai ruoli.`)) return;\n await deleteMenu(button.dataset.menuDelete ?? '');\n showNotice('Menu eliminato.');\n await showMenuItems();\n });\n });\n}\n\n/** Gestione dei tipi menu: elenco, creazione, modifica ed eliminazione. */\nasync function showMenuTypes(): Promise<void> {\n const menuTypes = result(await getMenuTypes()) as MenuTypeEntity[];\n render(`<div class=\"toolbar\"><button id=\"new-menu-type\">Nuovo tipo menu</button><button id=\"reload-menu-types\" class=\"secondary\">Aggiorna</button></div>\n <h2>Tipi menu</h2><p class=\"form-help\">Classificano i menu (es. amministrazione, operatività). Un tipo si elimina solo se non è usato da alcun menu.</p>\n ${menuTypeTable(menuTypes)}`);\n byId('new-menu-type').onclick = () => showMenuTypeForm();\n byId('reload-menu-types').onclick = () => handleAction(showMenuTypes);\n document.querySelectorAll<HTMLButtonElement>('[data-type-edit]').forEach((button) => {\n button.onclick = () => showMenuTypeForm(menuTypes.find((type) => type.codiceTipo === button.dataset.typeEdit));\n });\n document.querySelectorAll<HTMLButtonElement>('[data-type-delete]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il tipo menu ${button.dataset.typeDelete}? Operazione possibile solo se nessun menu lo utilizza.`)) return;\n await deleteMenuType(button.dataset.typeDelete ?? '');\n showNotice('Tipo menu eliminato.');\n await showMenuTypes();\n });\n });\n}\n\n/** Form di creazione/modifica di un gruppo menu. */\nfunction showMenuGroupForm(group?: GroupWithMenusEntity): void {\n const isExisting = group !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} gruppo menu</h2>\n <form id=\"group-form\">\n <label>Codice gruppo ${helpDot('menu-group-code')}<input name=\"codiceGruppo\" maxlength=\"1\" value=\"${escapeHtml(group?.codiceGruppo)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Un solo carattere, es. <code>A</code>. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"descrizioneGruppo\" maxlength=\"100\" value=\"${escapeHtml(group?.descrizioneGruppo)}\" required></label>\n <label>Ordine ${helpDot('menu-group-order')}<input name=\"ordineGruppo\" type=\"number\" value=\"${group?.ordineGruppo ?? ''}\"><span class=\"form-help\">Usato per ordinare i gruppi nella navigazione.</span></label>\n <label class=\"check\"><input name=\"enabled\" type=\"checkbox\" ${group?.enabled !== false ? 'checked' : ''}> Gruppo abilitato ${helpDot('menu-group-enabled')}</label>\n <button>${isExisting ? 'Salva gruppo' : 'Crea gruppo'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showMenuGroups);\n const form = document.getElementById('group-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const payload = {\n descrizioneGruppo: values.descrizioneGruppo || undefined,\n ordineGruppo: values.ordineGruppo ? Number(values.ordineGruppo) : undefined,\n enabled: new FormData(eventForm(event)).has('enabled'),\n };\n if (isExisting) await updateMenuGroup(group!.codiceGruppo, payload);\n else await createMenuGroup({ codiceGruppo: values.codiceGruppo ?? '', ...payload });\n showNotice(isExisting ? 'Gruppo aggiornato.' : 'Gruppo creato.');\n await showMenuGroups();\n });\n };\n }\n}\n\n/** Form di creazione/modifica di un menu, con selettori di gruppo e tipo. */\nfunction showMenuForm(menu: MenuEntity | undefined, groups: GroupWithMenusEntity[], menuTypes: MenuTypeEntity[]): void {\n const isExisting = menu !== undefined;\n const groupOptions = groups.map((group) => `<option value=\"${escapeHtml(group.codiceGruppo)}\" ${menu?.codiceGruppo === group.codiceGruppo ? 'selected' : ''}>${escapeHtml(group.codiceGruppo)} \\u2013 ${escapeHtml(group.descrizioneGruppo)}</option>`).join('');\n const typeOptions = `<option value=\"\">Nessun tipo</option>${menuTypes.map((type) => `<option value=\"${escapeHtml(type.codiceTipo)}\" ${menu?.tipo === type.codiceTipo ? 'selected' : ''}>${escapeHtml(type.codiceTipo)} \\u2013 ${escapeHtml(type.descrizioneTipo || '')}</option>`).join('')}`;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} menu</h2>\n <form id=\"menu-form\">\n <label>Codice menu ${helpDot('menu-code')}<input name=\"codiceMenu\" maxlength=\"20\" value=\"${escapeHtml(menu?.codiceMenu)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Chiave tecnica, es. <code>MNU001</code>. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"descrizioneMenu\" maxlength=\"100\" value=\"${escapeHtml(menu?.descrizioneMenu)}\" required></label>\n <label>Gruppo ${helpDot('menu-group-select')}<select name=\"codiceGruppo\" required>${groupOptions}</select><span class=\"form-help\">Crea prima un gruppo se non ne esistono.</span></label>\n <label>Tipo menu ${helpDot('menu-type-select')}<select name=\"tipo\">${typeOptions}</select></label>\n <label>Icona ${helpDot('menu-icon')}<input name=\"icona\" maxlength=\"50\" value=\"${escapeHtml(menu?.icona)}\"><span class=\"form-help\">Identificatore icona usato dalla UI host.</span></label>\n <label>Pagina ${helpDot('menu-page')}<input name=\"pagina\" maxlength=\"50\" value=\"${escapeHtml(menu?.pagina)}\"><span class=\"form-help\">Percorso o pagina associata al menu.</span></label>\n <label>Ordine ${helpDot('menu-order')}<input name=\"ordineMenu\" type=\"number\" value=\"${menu?.ordineMenu ?? ''}\"></label>\n <label>Menu di riferimento ${helpDot('menu-rifmenu')}<input name=\"rifMenu\" maxlength=\"20\" value=\"${escapeHtml((menu as (MenuEntity & { rifMenu?: string }) | undefined)?.rifMenu)}\"><span class=\"form-help\">Codice di un menu padre, opzionale.</span></label>\n <label>Nota ${helpDot('menu-note')}<textarea name=\"note\" rows=\"3\" maxlength=\"1000\">${escapeHtml(menu?.note)}</textarea></label>\n <label class=\"check\"><input name=\"enabled\" type=\"checkbox\" ${menu?.enabled !== false ? 'checked' : ''}> Menu abilitato ${helpDot('menu-enabled')}</label>\n <button>${isExisting ? 'Salva menu' : 'Crea menu'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showMenuItems);\n const form = document.getElementById('menu-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const payload = {\n descrizioneMenu: values.descrizioneMenu || undefined,\n codiceGruppo: values.codiceGruppo ?? '',\n tipo: values.tipo || undefined,\n icona: values.icona || undefined,\n pagina: values.pagina || undefined,\n ordineMenu: values.ordineMenu ? Number(values.ordineMenu) : undefined,\n rifMenu: values.rifMenu || undefined,\n note: values.note || undefined,\n enabled: new FormData(eventForm(event)).has('enabled'),\n };\n if (isExisting) await updateMenu(menu!.codiceMenu, payload);\n else await createMenu({ codiceMenu: values.codiceMenu ?? '', ...payload });\n showNotice(isExisting ? 'Menu aggiornato.' : 'Menu creato.');\n await showMenuItems();\n });\n };\n }\n}\n\n/** Form di creazione/modifica di un tipo menu. */\nfunction showMenuTypeForm(type?: MenuTypeEntity): void {\n const isExisting = type !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} tipo menu</h2>\n <form id=\"menu-type-form\">\n <label>Codice tipo ${helpDot('menu-type-code')}<input name=\"codiceTipo\" maxlength=\"1\" value=\"${escapeHtml(type?.codiceTipo)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Un solo carattere, es. <code>A</code>. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"descrizioneTipo\" maxlength=\"20\" value=\"${escapeHtml(type?.descrizioneTipo)}\"></label>\n <button>${isExisting ? 'Salva tipo' : 'Crea tipo'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showMenuTypes);\n const form = document.getElementById('menu-type-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n if (isExisting) await updateMenuType(type!.codiceTipo, { descrizioneTipo: values.descrizioneTipo || undefined });\n else await createMenuType({ codiceTipo: values.codiceTipo ?? '', descrizioneTipo: values.descrizioneTipo || undefined });\n showNotice(isExisting ? 'Tipo menu aggiornato.' : 'Tipo menu creato.');\n await showMenuTypes();\n });\n };\n }\n}\n\n/** Tabella del catalogo tipi filtro con azioni di modifica ed eliminazione. */\nfunction filterTypeRows(types: TipoFiltro[]): string {\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Codice</th><th>Descrizione</th><th>Campo</th><th>Abilitato</th><th></th></tr></thead><tbody>${types.map((type) => `<tr class=\"${type.flgEnabled === 0 ? 'is-disabled' : ''}\"><td><code>${escapeHtml(type.tipFil)}</code></td><td>${escapeHtml(type.desFil || '\\u2014')}</td><td>${escapeHtml(type.fldFil || '\\u2014')}</td><td>${type.flgEnabled === 0 ? 'No' : 'Si'}</td><td class=\"row-actions\"><button type=\"button\" data-filter-type-edit=\"${escapeHtml(type.tipFil)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-filter-type-delete=\"${escapeHtml(type.tipFil)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"5\" class=\"muted\">Nessun tipo filtro.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Filtri utente: lettura e salvataggio dei filtri applicativi per singolo utente. */\nasync function showFilters(): Promise<void> {\n const users = await loadUsers();\n render(`<h2>Filtri utente</h2><p class=\"form-help\">Filtri applicativi salvati per singolo utente.</p><form id=\"filters\"><label>Utente ${helpDot('filters-user')}<select name=\"codUte\">${users.map(({ utente }) => `<option value=\"${utente.codiceUtente}\">${escapeHtml(utente.email)}</option>`).join('')}</select><span class=\"form-help\">Salvati per l'utente selezionato.</span></label><label>Filtro JSON ${helpDot('filters-json')}<textarea name=\"json\" rows=\"12\">{}</textarea><span class=\"form-help\">Usa Carica per partire dalla struttura esistente.</span></label><button name=\"action\" value=\"load\">Carica</button><button name=\"action\" value=\"save\">Salva</button></form>`);\n const filtersForm = document.getElementById('filters') as HTMLFormElement | null;\n if (filtersForm) filtersForm.onsubmit = async (event) => { event.preventDefault(); const form = eventForm(event); const action = (event.submitter as HTMLButtonElement | null)?.value; const code = Number(formValues(form).codUte); if (action === 'load') { const filters = result<FiltriUtente[]>(await getFiltriUtente({ codUte: code })); (form.elements.namedItem('json') as HTMLTextAreaElement).value = JSON.stringify(filters[0] ?? { codUte: code }, null, 2); } else { const parsed = JSON.parse(formValues(form).json ?? '{}') as Omit<FiltriUtente, 'codUte'>; await saveFiltriUtente({ ...parsed, codUte: code }); showNotice('Filtri salvati.'); } };\n}\n\n/** Tipi filtro: catalogo dei tipi con creazione, modifica ed eliminazione. */\nasync function showFilterTypes(): Promise<void> {\n const filterTypes = result(await getTipiFiltro()) as TipoFiltro[];\n render(`<div class=\"toolbar\"><button id=\"new-filter-type\">Nuovo tipo filtro</button><button id=\"reload-filter-types\" class=\"secondary\">Aggiorna</button></div>\n <h2>Tipi filtro</h2><p class=\"form-help\">Catalogo dei tipi usati dai filtri utente. Un tipo si elimina solo se nessun filtro lo utilizza.</p>\n ${filterTypeRows(filterTypes)}`);\n byId('new-filter-type').onclick = () => showFilterTypeForm();\n byId('reload-filter-types').onclick = () => handleAction(showFilterTypes);\n document.querySelectorAll<HTMLButtonElement>('[data-filter-type-edit]').forEach((button) => button.onclick = () => showFilterTypeForm(filterTypes.find((type) => String(type.tipFil) === button.dataset.filterTypeEdit)));\n document.querySelectorAll<HTMLButtonElement>('[data-filter-type-delete]').forEach((button) => button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il tipo filtro ${button.dataset.filterTypeDelete}? Operazione possibile solo se nessun filtro lo utilizza.`)) return;\n await deleteTipoFiltro(Number(button.dataset.filterTypeDelete));\n showNotice('Tipo filtro eliminato.');\n await showFilterTypes();\n }));\n}\n\n/** Form di creazione/modifica di un tipo filtro. */\nfunction showFilterTypeForm(type?: TipoFiltro): void {\n const isExisting = type !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} tipo filtro</h2>\n <form id=\"filter-type-form\">\n <label>Codice ${helpDot('filter-type-code')}<input name=\"tipFil\" type=\"number\" value=\"${escapeHtml(type?.tipFil)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Identificativo numerico. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"desFil\" maxlength=\"20\" value=\"${escapeHtml(type?.desFil)}\"></label>\n <label>Campo ${helpDot('filter-type-field')}<input name=\"fldFil\" maxlength=\"20\" value=\"${escapeHtml(type?.fldFil)}\"><span class=\"form-help\">Nome del campo applicativo associato al filtro.</span></label>\n <label class=\"check\"><input name=\"flgEnabled\" type=\"checkbox\" ${type?.flgEnabled !== 0 ? 'checked' : ''}> Abilitato ${helpDot('filter-type-enabled')}</label>\n <button>${isExisting ? 'Salva tipo' : 'Crea tipo'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showFilterTypes);\n const form = document.getElementById('filter-type-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const payload = {\n desFil: values.desFil || undefined,\n fldFil: values.fldFil || undefined,\n flgEnabled: (new FormData(eventForm(event)).has('flgEnabled') ? 1 : 0) as 0 | 1,\n };\n if (isExisting) await updateTipoFiltro(type!.tipFil, payload);\n else await createTipoFiltro({ tipFil: Number(values.tipFil), ...payload });\n showNotice(isExisting ? 'Tipo filtro aggiornato.' : 'Tipo filtro creato.');\n await showFilterTypes();\n });\n };\n }\n}\n\nfunction scopeList(scopes: string[] | undefined): string {\n return (scopes ?? []).join(', ') || 'nessuno';\n}\n\nfunction serviceTokenExpiry(token: ServiceTokenDto): string {\n if (!token.expiresAt) return 'nessuna';\n const date = new Date(token.expiresAt);\n const days = Math.ceil((date.getTime() - Date.now()) / 86_400_000);\n const label = escapeHtml(date.toLocaleString());\n if (days < 0) return `${label}<br><span class=\"error\">scaduto</span>`;\n if (days <= 7) return `${label}<br><span class=\"error\">scade tra ${days} g</span>`;\n return label;\n}\n\nfunction serviceTokenRows(tokens: ServiceTokenDto[], includeRevoked: boolean): string {\n const lastUsed = (token: ServiceTokenDto) => token.lastUsedAt\n ? `<span title=\"${escapeHtml(token.lastUsedIp ?? '')}\">${escapeHtml(new Date(token.lastUsedAt).toLocaleString())}</span>${token.lastUsedIp ? `<br><span class=\"muted\">${escapeHtml(token.lastUsedIp)}</span>` : ''}`\n : 'mai';\n const status = (token: ServiceTokenDto) => token.revoked\n ? `Revocato${token.revokedBy ? ` da #${escapeHtml(token.revokedBy)}` : ''}${token.revokedAt ? `<br><span class=\"muted\">${escapeHtml(new Date(token.revokedAt).toLocaleString())}</span>` : ''}`\n : 'Attivo';\n return tokens.map((token) => `<tr class=\"${token.revoked ? 'is-disabled' : ''}\"><td><strong>${escapeHtml(token.label)}</strong><br><code>${escapeHtml(token.tokenId)}</code></td><td>${escapeHtml(scopeList(token.scopes))}</td><td>${escapeHtml(token.createdAt ? new Date(token.createdAt).toLocaleString() : '')}</td><td>${serviceTokenExpiry(token)}</td><td>${lastUsed(token)}</td><td>${status(token)}</td><td>${token.revoked ? '' : `<button type=\"button\" data-rotate=\"${escapeHtml(token.tokenId)}\">Ruota</button> <button type=\"button\" class=\"danger-button\" data-revoke=\"${escapeHtml(token.tokenId)}\">Revoca</button>`}</td></tr>`).join('') || `<tr><td colspan=\"7\">Nessun token ${includeRevoked ? '' : 'attivo'}.</td></tr>`;\n}\n\n/** Gestione dei token di servizio: elenco, creazione, rotazione e revoca. */\nasync function showServiceTokens(includeRevoked = false): Promise<void> {\n const tokens = result<ServiceTokenDto[]>(await getServiceTokens({ includeRevoked }));\n render(`<div class=\"toolbar\"><button id=\"new-token\">Nuovo token</button><button id=\"toggle-revoked\" class=\"secondary\">${includeRevoked ? 'Nascondi revocati' : 'Mostra revocati'}</button></div><h2>Token di servizio</h2><p class=\"form-help\">Credenziali macchina-a-macchina per chiamate tecniche, non legate a un utente. Il segreto e mostrato <strong>una sola volta</strong> alla creazione: conservalo come variabile d'ambiente/secret. Autenticazione: <code>Authorization: Bearer &lt;token&gt;</code>.</p><table><thead><tr><th>Token</th><th>Scope</th><th>Creato</th><th>Scade</th><th>Ultimo uso</th><th>Stato</th><th></th></tr></thead><tbody>${serviceTokenRows(tokens, includeRevoked)}</tbody></table>`);\n byId('new-token').onclick = () => showServiceTokenForm();\n byId('toggle-revoked').onclick = () => handleAction(() => showServiceTokens(!includeRevoked));\n document.querySelectorAll<HTMLButtonElement>('[data-revoke]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm('Revocare definitivamente questo token? Le integrazioni che lo usano smetteranno di funzionare.')) return;\n await revokeServiceToken(button.dataset.revoke ?? '');\n showNotice('Token di servizio revocato.');\n await showServiceTokens(includeRevoked);\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-rotate]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n const issued = result<IssuedServiceTokenDto>(await rotateServiceToken(button.dataset.rotate ?? ''));\n showIssuedServiceToken(issued);\n });\n });\n}\n\nfunction showServiceTokenForm(): void {\n render(`<button id=\"back\" type=\"button\" class=\"secondary\">Indietro</button><h2>Nuovo token di servizio</h2><form id=\"token-form\"><label>Descrizione ${helpDot('token-label')}<input name=\"label\" required maxlength=\"100\"><span class=\"form-help\">Identifica l'integrazione, ad esempio \"IA - produzione\".</span></label><label>Scope ${helpDot('token-scopes')}<input name=\"scopes\" placeholder=\"ia, chat\"><span class=\"form-help\">Separati da virgola (lettere, numeri, ':', '_', '-'). Definiscono cosa può fare il token.</span></label><label>Durata in giorni ${helpDot('token-ttl')}<input name=\"ttlDays\" type=\"number\" min=\"1\" step=\"1\"><span class=\"form-help\">Opzionale. Lascia vuoto per un token senza scadenza.</span></label><button>Crea token</button></form>`);\n byId('back').onclick = () => void show('tokens');\n const form = document.getElementById('token-form') as HTMLFormElement | null;\n if (form) form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const scopes = (values.scopes ?? '').split(',').map((scope) => scope.trim()).filter(Boolean);\n const ttlDays = values.ttlDays ? Number(values.ttlDays) : undefined;\n const issued = result<IssuedServiceTokenDto>(await createServiceToken({\n label: values.label ?? '',\n scopes: scopes.length ? scopes : undefined,\n ttlDays: Number.isFinite(ttlDays) ? ttlDays : undefined,\n }));\n showIssuedServiceToken(issued);\n });\n };\n}\n\nfunction showIssuedServiceToken(issued: IssuedServiceTokenDto): void {\n render(`<h2>Token creato</h2><p class=\"form-help\">Copia ora il token: <strong>non sara piu mostrato</strong>. Salvalo come variabile d'ambiente/secret del servizio chiamante e non inserirlo nel body delle richieste.</p><div class=\"token-reveal\"><code id=\"issued-token\">${escapeHtml(issued.token)}</code><button id=\"copy-token\" type=\"button\">Copia</button></div><dl class=\"entity-metadata\"><div><dt>Descrizione</dt><dd>${escapeHtml(issued.label)}</dd></div><div><dt>Scope</dt><dd>${escapeHtml(scopeList(issued.scopes))}</dd></div><div><dt>Scade</dt><dd>${issued.expiresAt ? escapeHtml(new Date(issued.expiresAt).toLocaleString()) : 'nessuna'}</dd></div></dl><button id=\"done-token\">Ho copiato, chiudi</button>`);\n byId('copy-token').onclick = () => handleAction(async () => { await navigator.clipboard.writeText(issued.token); showNotice('Token copiato negli appunti.'); });\n byId('done-token').onclick = () => void show('tokens');\n}\n\n/** Rende un singolo blocco della wiki in HTML sicuro. */\nfunction renderWikiBlock(block: WikiBlock): string {\n switch (block.kind) {\n case 'p':\n return `<p>${escapeHtml(block.text)}</p>`;\n case 'h':\n return `<h3>${escapeHtml(block.text)}</h3>`;\n case 'list': {\n const tag = block.ordered ? 'ol' : 'ul';\n return `<${tag}>${block.items.map((item) => `<li>${escapeHtml(item)}</li>`).join('')}</${tag}>`;\n }\n case 'code': {\n const variant = block.variant ? ` is-${block.variant}` : '';\n const title = block.title ? `<span class=\"wiki-code-title\">${escapeHtml(block.title)}</span>` : '';\n return `<figure class=\"wiki-code${variant}\"><figcaption class=\"wiki-code-head\">${title}<span class=\"wiki-code-lang\">${escapeHtml(block.language)}</span><button type=\"button\" class=\"wiki-copy\" data-wiki-copy aria-label=\"Copia il codice\">Copia</button></figcaption><pre><code>${escapeHtml(block.code)}</code></pre></figure>`;\n }\n case 'callout':\n return `<div class=\"wiki-callout is-${block.tone}\">${block.title ? `<strong>${escapeHtml(block.title)}</strong>` : ''}<p>${escapeHtml(block.text)}</p></div>`;\n case 'table':\n return `<div class=\"wiki-table-wrap\"><table><thead><tr>${block.head.map((cell) => `<th>${escapeHtml(cell)}</th>`).join('')}</tr></thead><tbody>${block.rows.map((row) => `<tr>${row.map((cell) => `<td>${escapeHtml(cell)}</td>`).join('')}</tr>`).join('')}</tbody></table></div>`;\n default:\n return '';\n }\n}\n\n/** Collega i pulsanti \"Copia\" dei blocchi di codice contenuti in `root`. */\nfunction bindCopyButtons(root: ParentNode): void {\n root.querySelectorAll<HTMLButtonElement>('[data-wiki-copy]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n const codeEl = button.closest('.wiki-code')?.querySelector('code');\n await navigator.clipboard.writeText(codeEl?.textContent ?? '');\n showNotice('Codice copiato negli appunti.');\n });\n });\n}\n\n/** Icona \"i\" che apre la miniguida contestuale del campo. */\nfunction helpDot(key: string): string {\n return `<button type=\"button\" class=\"help-dot\" data-help=\"${escapeHtml(key)}\" aria-label=\"Aiuto: ${escapeHtml(HELP[key]?.title ?? key)}\">i</button>`;\n}\n\nlet helpPopover: HTMLElement | null = null;\nlet helpAnchor: HTMLElement | null = null;\n\nfunction ensureHelpPopover(): HTMLElement {\n if (!helpPopover) {\n helpPopover = document.createElement('div');\n helpPopover.className = 'help-popover';\n helpPopover.hidden = true;\n helpPopover.setAttribute('role', 'dialog');\n document.body.appendChild(helpPopover);\n }\n return helpPopover;\n}\n\nfunction closeHelp(): void {\n if (helpPopover) helpPopover.hidden = true;\n helpAnchor = null;\n}\n\n/** Posiziona il popover sotto l'icona, correggendo i bordi dello schermo. */\nfunction positionHelp(): void {\n if (!helpPopover || !helpAnchor || helpPopover.hidden) return;\n const rect = helpAnchor.getBoundingClientRect();\n const width = helpPopover.offsetWidth;\n const height = helpPopover.offsetHeight;\n const left = Math.max(8, Math.min(rect.right - width, window.innerWidth - width - 8));\n let top = rect.bottom + 6;\n if (top + height > window.innerHeight - 8) top = Math.max(8, rect.top - height - 6);\n helpPopover.style.left = `${left}px`;\n helpPopover.style.top = `${top}px`;\n}\n\nfunction openHelp(anchor: HTMLElement): void {\n const entry = HELP[anchor.dataset.help ?? ''];\n if (!entry) return;\n const popover = ensureHelpPopover();\n popover.innerHTML = `<div class=\"help-popover-head\"><h4>${escapeHtml(entry.title)}</h4><button type=\"button\" class=\"help-close\" data-help-close aria-label=\"Chiudi\">&times;</button></div><div class=\"help-popover-body\">${entry.blocks.map(renderWikiBlock).join('')}</div>`;\n popover.hidden = false;\n helpAnchor = anchor;\n bindCopyButtons(popover);\n positionHelp();\n}\n\n/** Indice laterale della wiki, raggruppato per area. */\nfunction wikiIndexMarkup(selectedId: string): string {\n return wikiGroups().map(({ group, sections }) => `<div class=\"wiki-index-group\"><span class=\"wiki-index-group-title\">${escapeHtml(group)}</span><ul>${sections.map((section) => `<li><a href=\"#wiki-${escapeHtml(section.id)}\" data-wiki=\"${escapeHtml(section.id)}\"${section.id === selectedId ? ' aria-current=\"page\"' : ''}>${escapeHtml(section.title)}</a></li>`).join('')}</ul></div>`).join('');\n}\n\n/** Wiki integrata: indice, contenuti e copia del digest per l'IA. */\nasync function showWiki(sectionId?: string): Promise<void> {\n const hashId = /^#wiki-([a-z0-9-]+)$/.exec(window.location.hash)?.[1];\n const requested = sectionId ?? hashId;\n const selected = WIKI_SECTIONS.find((section) => section.id === requested) ?? WIKI_SECTIONS[0];\n if (!selected) return;\n\n render(`<div class=\"wiki\">\n <aside class=\"wiki-index\">\n <div class=\"wiki-index-head\"><strong>Indice</strong><button type=\"button\" id=\"wiki-copy-ai\">Copia per AI</button></div>\n ${wikiIndexMarkup(selected.id)}\n </aside>\n <article class=\"wiki-content\">\n <header class=\"wiki-section-head\"><h2>${escapeHtml(selected.title)}</h2><p>${escapeHtml(selected.summary)}</p></header>\n ${selected.blocks.map(renderWikiBlock).join('')}\n </article>\n </div>`);\n\n document.querySelectorAll<HTMLAnchorElement>('[data-wiki]').forEach((link) => {\n link.onclick = (event) => {\n event.preventDefault();\n const id = link.dataset.wiki ?? '';\n window.history.replaceState(null, '', `${routePath('wiki')}#wiki-${id}`);\n showWiki(id);\n };\n });\n bindCopyButtons(document);\n byId('wiki-copy-ai').onclick = () => handleAction(async () => {\n await navigator.clipboard.writeText(buildAiDigest());\n showNotice('Documentazione per AI copiata negli appunti.');\n });\n}\n\n/** Rendering minimale di Markdown (heading, liste, codice, grassetto/code inline). */\nfunction inlineMarkdown(text: string): string {\n return escapeHtml(text)\n .replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/`([^`]+)`/g, '<code>$1</code>');\n}\n\nfunction renderMarkdown(markdown: string): string {\n const lines = markdown.replace(/\\r\\n/g, '\\n').split('\\n');\n const html: string[] = [];\n let inList = false;\n let inCode = false;\n const closeList = () => { if (inList) { html.push('</ul>'); inList = false; } };\n\n for (const line of lines) {\n if (line.startsWith('```')) {\n closeList();\n html.push(inCode ? '</code></pre>' : '<pre class=\"markdown-code\"><code>');\n inCode = !inCode;\n continue;\n }\n if (inCode) { html.push(escapeHtml(line)); continue; }\n\n const heading = /^(#{1,4})\\s+(.*)$/.exec(line);\n if (heading) { closeList(); const level = (heading[1] ?? '').length; html.push(`<h${level}>${inlineMarkdown(heading[2] ?? '')}</h${level}>`); continue; }\n\n const bullet = /^\\s*[-*]\\s+(.*)$/.exec(line);\n if (bullet) { if (!inList) { html.push('<ul>'); inList = true; } html.push(`<li>${inlineMarkdown(bullet[1] ?? '')}</li>`); continue; }\n\n if (line.trim() === '') { closeList(); continue; }\n closeList();\n html.push(`<p>${inlineMarkdown(line)}</p>`);\n }\n\n if (inCode) html.push('</code></pre>');\n closeList();\n return html.join('');\n}\n\nasync function showChangelog(): Promise<void> {\n render(`<div class=\"wiki\"><article class=\"wiki-content markdown-body\">\n <header class=\"wiki-section-head\"><h2>Changelog</h2><p>Novita e modifiche rilevanti del modulo Accessi.</p></header>\n ${renderMarkdown(changelogMarkdown)}\n </article></div>`);\n}\n\nfunction downloadTextFile(fileName: string, content: string): void {\n const blob = new Blob([content], { type: 'text/plain;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n}\n\nasync function showSql(): Promise<void> {\n const schema = result<SchemaDdlResult>(await getSchema());\n const copy = (text: string, notice: string) => () => handleAction(async () => {\n await navigator.clipboard.writeText(text);\n showNotice(notice);\n });\n\n render(`<div class=\"toolbar\"><button id=\"sql-copy-all\">Copia tutto</button><button id=\"sql-download\" class=\"secondary\">Scarica .sql</button><button id=\"sql-reload\" class=\"secondary\">Aggiorna</button></div>\n <h2>SQL dello schema</h2>\n <p class=\"form-help\">DDL generato dallo schema Accessi <strong>${escapeHtml(schema.version)}</strong>. Usalo per creare le entita su una nuova installazione (database vuoto).</p>\n <div class=\"entity-summary\">\n <span><strong>${schema.presentTables.length}</strong> tabelle presenti</span>\n <span><strong>${schema.presentGenerators.length}</strong> generatori</span>\n <span><strong>${schema.extraTables.length}</strong> tabelle extra fuori schema Accessi</span>\n </div>\n ${schema.extraTables.length ? `<p class=\"form-help\">Tabelle presenti non gestite da Accessi: <code>${schema.extraTables.map((name) => escapeHtml(name)).join(', ')}</code></p>` : ''}\n ${schema.sections.map((section) => `<section class=\"sql-section\"><div class=\"sql-section-head\"><h3>${escapeHtml(section.title)}</h3><button type=\"button\" class=\"secondary\" data-sql-copy=\"${escapeHtml(section.id)}\">Copia sezione</button></div><pre class=\"markdown-code\"><code>${escapeHtml(section.sql)}</code></pre></section>`).join('')}`);\n\n byId('sql-copy-all').onclick = copy(schema.script, 'Script SQL completo copiato.');\n byId('sql-download').onclick = () => downloadTextFile(`accessi-schema-${schema.version}.sql`, schema.script);\n byId('sql-reload').onclick = () => handleAction(showSql);\n document.querySelectorAll<HTMLButtonElement>('[data-sql-copy]').forEach((button) => {\n const section = schema.sections.find((entry) => entry.id === button.dataset.sqlCopy);\n if (section) button.onclick = copy(section.sql, `Sezione \"${section.title}\" copiata.`);\n });\n}\n\nasync function show(view: ConsoleView): Promise<void> {\n try {\n showNotice('');\n const views: Record<string, () => Promise<void>> = {\n users: showUsers,\n roles: showRoles,\n menuGroups: showMenuGroups,\n menuItems: showMenuItems,\n menuTypes: showMenuTypes,\n filterUser: showFilters,\n filterTypes: showFilterTypes,\n ssoProviders: showSsoProviders,\n ssoUsers: showSsoUsers,\n tokens: showServiceTokens,\n wiki: showWiki,\n changelog: showChangelog,\n sql: showSql,\n };\n setActiveNavigation(view);\n const renderView = views[view];\n if (!renderView) throw new Error('Sezione console non valida.');\n await renderView();\n } catch (error) {\n render('');\n showNotice(error instanceof Error ? error.message : 'Operazione non riuscita.', true);\n }\n}\n\nconst loginForm = document.getElementById('login-form') as HTMLFormElement | null;\nif (loginForm) loginForm.onsubmit = loginView;\nbyId('restart-login').onclick = resetLogin;\nconst bootstrapAdminForm = document.getElementById('bootstrap-admin-form') as HTMLFormElement | null;\nif (bootstrapAdminForm) {\n bootstrapAdminForm.onsubmit = async (event) => {\n event.preventDefault();\n const status = document.getElementById('bootstrap-admin-status');\n try {\n if (status) status.textContent = '';\n const values = formValues(bootstrapAdminForm);\n const fields = new FormData(bootstrapAdminForm);\n const created = result<BootstrapAdminResultDto>(await bootstrapAdmin({\n token: values.token ?? '',\n email: values.email ?? '',\n nome: values.nome || undefined,\n cognome: values.cognome || undefined,\n password: values.password || undefined,\n superUser: fields.has('superUser'),\n }));\n const generated = created.password ? ` Password generata (copiala ora): ${created.password}` : '';\n if (status) status.textContent = `Utente admin creato: ${created.email}.${generated} Ora accedi dal form principale.`;\n bootstrapAdminForm.reset();\n } catch (error) {\n if (status) status.textContent = error instanceof Error ? error.message : 'Creazione non riuscita.';\n }\n };\n}\nbyId<HTMLFormElement>('two-factor-form').onsubmit = async event => {\n event.preventDefault();\n if (!pendingChallenge) return;\n try {\n byId('login-error').textContent = '';\n const values = formValues(event.currentTarget as HTMLFormElement);\n await completeLoginStep(result<LoginResult>(await verifyTwoFactor({ challengeId: pendingChallenge, code: values.code ?? '' })));\n } catch (error) {\n byId('login-error').textContent = error instanceof Error ? error.message : 'Verifica non riuscita.';\n }\n};\nbyId('resend-code').onclick = async () => {\n if (!pendingChallenge) return;\n try {\n byId('login-error').textContent = '';\n await completeLoginStep(result<LoginResult>(await resendTwoFactor({ challengeId: pendingChallenge })));\n } catch (error) {\n byId('login-error').textContent = error instanceof Error ? error.message : 'Reinvio non riuscito.';\n }\n};\nbyId('logout').onclick = () => {\n resetLogin();\n token = null;\n currentUser = null;\n setAccessiConsoleToken(null);\n sessionStorage.removeItem('accessi-console-token');\n window.history.replaceState(null, '', consoleBasePath);\n void bootstrap();\n};\nbyId('nav').onclick = (event) => {\n const link = (event.target as HTMLElement).closest<HTMLAnchorElement>('a[data-view]');\n if (!link) return;\n event.preventDefault();\n handleAction(() => navigate(link.dataset.view as ConsoleView));\n};\nwindow.addEventListener('popstate', () => {\n if (token && currentUser) handleAction(() => show(viewFromLocation()));\n});\nwindow.addEventListener('accessi-console-network', (event: Event) => {\n updateLoadingState((event as CustomEvent<{ active: boolean }>).detail.active);\n});\n// Tooltip di aiuto: apertura dall'icona \"i\", chiusura su click esterno o Esc.\ndocument.addEventListener('click', (event) => {\n const target = event.target as HTMLElement;\n const dot = target.closest<HTMLElement>('[data-help]');\n if (dot) {\n event.preventDefault();\n openHelp(dot);\n return;\n }\n if (target.closest('[data-help-close]')) {\n closeHelp();\n return;\n }\n if (helpPopover && !helpPopover.hidden && !target.closest('.help-popover')) closeHelp();\n});\nwindow.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') closeHelp();\n});\nwindow.addEventListener('resize', positionHelp);\nwindow.addEventListener('scroll', positionHelp, true);\n// Optional handoff from the hosting backend after its SSO callback. The fragment\n// contains only an opaque challenge id, never an access token or provider token.\nconst ssoChallenge = /^#two-factor=([a-f0-9]{64})$/.exec(window.location.hash)?.[1];\nif (ssoChallenge) {\n token = null;\n setAccessiConsoleToken(null);\n sessionStorage.removeItem('accessi-console-token');\n window.history.replaceState(null, '', window.location.pathname);\n finishBoot('login');\n showTwoFactor({ challengeId: ssoChallenge, resendAfterSeconds: 60 });\n} else if (token) {\n void bootstrap();\n} else {\n finishBoot('login');\n}\n\n"]}
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/accessi-module/Console/console.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n assignPermissionsToUser,\n assignRolesToUser,\n bootstrapAdmin,\n createFederatedUser,\n createFederatedProvider,\n createManagedUser,\n createMenu,\n createMenuGroup,\n createMenuType,\n createRole,\n createServiceToken,\n createTipoFiltro,\n deleteFederatedIdentityPermanently,\n deleteFederatedProvider,\n deleteMenu,\n deleteMenuGroup,\n deleteMenuType,\n deleteRole,\n deleteTipoFiltro,\n deleteUser,\n getFederatedIdentities,\n getFederatedProviders,\n getFiltriUtente,\n getGroupsWithMenus,\n getMenuTypes,\n getRoles,\n getSchema,\n getServiceTokens,\n getTipiFiltro,\n getUserByToken,\n getUserRolesAndGrants,\n getUsers,\n linkFederatedIdentity,\n login,\n verifyTwoFactor,\n resendTwoFactor,\n revokeServiceToken,\n rotateServiceToken,\n saveFiltriUtente,\n setGroupEnabled,\n setMenuEnabled,\n setStatoRegistrazione,\n updateFederatedIdentity,\n updateFederatedProvider,\n updateMenu,\n updateMenuGroup,\n updateMenuType,\n updateRole,\n updateTipoFiltro,\n updateUtente,\n} from './generated/accessiApi';\nimport { setAccessiConsoleToken } from './accessiFetch';\nimport { WIKI_SECTIONS, wikiGroups, buildAiDigest } from './wiki';\nimport changelogMarkdown from './changelog.md';\nimport type { WikiBlock } from './wiki';\nimport { HELP } from './help';\nimport type {\n CreateFederatedUserRequest,\n CreateFederatedProviderRequest,\n AuthenticatedTokenPayloadDto,\n BootstrapAdminResultDto,\n FiltriUtente,\n FederatedProviderResponseDto,\n GroupWithMenusEntity,\n LoginResult,\n MenuEntity,\n MenuTypeEntity,\n Permission,\n RegisterRequest,\n Role,\n SchemaDdlResult,\n ServiceTokenDto,\n IssuedServiceTokenDto,\n TipoFiltro,\n UserDto,\n UpdateFederatedProviderRequest,\n} from './generated/model';\n\ntype UserRow = { utente: UserDto; userGrants?: { ruoli?: Array<{ codiceRuolo?: number; descrizioneRuolo?: string }> } };\ntype ConsoleUser = { codiceUtente: number; email?: string; flagSuper: boolean; flagAdmin: boolean };\ntype FederatedProvider = FederatedProviderResponseDto;\ntype ConsoleFederatedIdentity = { identityKey: string; provider: string; subject: string; active: boolean; note?: string };\ntype UserDetailTab = 'sso' | 'profile' | 'roles' | 'grants';\ntype ConsoleView =\n | 'users'\n | 'roles'\n | 'menuGroups'\n | 'menuItems'\n | 'menuTypes'\n | 'filterUser'\n | 'filterTypes'\n | 'ssoProviders'\n | 'ssoUsers'\n | 'tokens'\n | 'wiki'\n | 'changelog'\n | 'sql';\n\nconst routeSegment: Record<ConsoleView, string> = {\n users: 'utenti',\n roles: 'ruoli-e-grant',\n menuGroups: 'menu-e-gruppi/gruppi',\n menuItems: 'menu-e-gruppi/menu',\n menuTypes: 'menu-e-gruppi/tipi-menu',\n filterUser: 'filtri/utente',\n filterTypes: 'filtri/tipi',\n ssoProviders: 'sso/provider',\n ssoUsers: 'sso/utenti',\n tokens: 'token-di-servizio',\n wiki: 'wiki',\n changelog: 'changelog',\n sql: 'sql',\n};\nconst routeView = Object.fromEntries(Object.entries(routeSegment).map(([view, segment]) => [segment, view])) as Record<string, ConsoleView>;\n// I padri dei sottomenu hanno un URL proprio: senza figlio selezionato si apre la prima voce.\nconst parentDefaultView: Record<string, ConsoleView> = {\n 'menu-e-gruppi': 'menuGroups',\n filtri: 'filterUser',\n sso: 'ssoProviders',\n};\nconst consoleMarker = '/accessi/console';\nconst consoleMarkerIndex = window.location.pathname.indexOf(consoleMarker);\nconst consoleBasePath = consoleMarkerIndex >= 0\n ? window.location.pathname.slice(0, consoleMarkerIndex + consoleMarker.length)\n : `${window.location.pathname.replace(/\\/$/, '')}`;\n\nconst USERS_PAGE_SIZE = 25;\n\nlet token = sessionStorage.getItem('accessi-console-token');\nlet currentUser: ConsoleUser | null = null;\nlet federatedAuthenticationAvailable = false;\nlet usersPage = 0;\nlet usersTotal = 0;\nlet booting = true;\nlet pendingNetworkRequests = 0;\nlet loadingRevealTimer: number | undefined;\nlet loadingHideTimer: number | undefined;\nlet loaderVisibleSince = 0;\n\nconst byId = <T extends HTMLElement>(id: string) => document.getElementById(id) as T;\nconst escapeHtml = (value: unknown) => String(value ?? '').replace(/[&<>\"']/g, (char) => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;',\n}[char] as string));\nfunction result<T>(response: { data: object }): T {\n const body = response.data as { Result?: T; message?: string };\n if (body.Result === undefined) throw new Error(body.message ?? 'Risposta Accessi priva di dati.');\n return body.Result;\n}\n\nfunction showNotice(message: string, isError = false): void {\n // Un messaggio vuoto deve azzerare il contenitore, altrimenti resta visibile la barra di avviso.\n byId('notice').innerHTML = message ? `<span class=\"${isError ? 'error' : ''}\">${escapeHtml(message)}</span>` : '';\n}\n\n/** Renders operational menu metadata shared by the permissions and role views. */\nfunction menuMetadata(menu: MenuEntity): string {\n const details = [\n ['Codice', menu.codiceMenu],\n ['Ordine', String(menu.ordineMenu)],\n ['Tipo', menu.tipo],\n ['Pagina', menu.pagina],\n ['Icona', menu.icona],\n ['Stato', menu.enabled === false ? 'Disabilitato' : 'Abilitato'],\n ].filter(([, value]) => value);\n return `<dl class=\"entity-metadata\">${details.map(([label, value]) => `<div><dt>${escapeHtml(label)}</dt><dd>${escapeHtml(value)}</dd></div>`).join('')}</dl>${menu.note ? `<p class=\"entity-note\"><strong>Nota</strong>${escapeHtml(menu.note)}</p>` : ''}`;\n}\n\n/** Exposes only supported permission levels while preserving historical value 30 without data loss. */\nfunction permissionSelectOptions(currentLevel: number | undefined): string {\n return `<option value=\"10\" ${currentLevel === 10 ? 'selected' : ''}>Lettura</option><option value=\"20\" ${currentLevel === 20 ? 'selected' : ''}>Scrittura</option>${currentLevel === 30 ? '<option value=\"30\" selected>Valore legacy (30)</option>' : ''}`;\n}\n\n/** Renders the metadata that describes a menu group independently of its menus. */\nfunction groupMetadata(group: GroupWithMenusEntity): string {\n return `<dl class=\"entity-metadata\"><div><dt>Codice</dt><dd>${escapeHtml(group.codiceGruppo)}</dd></div><div><dt>Ordine</dt><dd>${escapeHtml(group.ordineGruppo)}</dd></div><div><dt>Stato</dt><dd>${group.enabled === false ? 'Disabilitato' : 'Abilitato'}</dd></div><div><dt>Menu</dt><dd>${group.menus.length}</dd></div></dl>`;\n}\n\n/** Builds the full-width, grouped direct-grant editor for an individual user. */\nfunction directGrantEditor(groups: GroupWithMenusEntity[], grants: Permission[] | undefined): string {\n return `<form id=\"grants\" class=\"user-editor-section grants-editor\" data-user-panel=\"grants\" role=\"tabpanel\" aria-labelledby=\"user-tab-grants\"><h3>Grant diretti ${helpDot('grant-direct')}</h3><p class=\"form-help\">Grant diretti, indipendenti dai ruoli. Seleziona <strong>nessuno</strong> per rimuoverli.</p><div class=\"grant-menu-groups\">${groups.map((group) => `<fieldset class=\"grant-menu-group\"><legend>${escapeHtml(group.descrizioneGruppo)}</legend>${groupMetadata(group)}<div class=\"grant-menu-options\">${group.menus.map((menu) => { const grant = (grants ?? []).find((item) => item.codiceMenu === menu.codiceMenu); return `<div class=\"grant-menu-option ${menu.enabled === false ? 'is-disabled' : ''}\"><div class=\"grant-menu-info\"><strong>${escapeHtml(menu.descrizioneMenu)}</strong>${menuMetadata(menu)}</div><label class=\"grant-level\">Livello di grant ${helpDot('grant-level')}<select name=\"grant:${escapeHtml(menu.codiceMenu)}\"><option value=\"\">nessuno</option>${permissionSelectOptions(grant?.tipoAbilitazione)}</select></label></div>`; }).join('') || '<p class=\"form-help\">Nessun menu configurato in questo gruppo.</p>'}</div></fieldset>`).join('')}</div><button>Salva grant</button></form>`;\n}\n\n/** Converts Accessi's persisted permission value into its documented label. */\nfunction permissionLevelLabel(value: number | undefined): string {\n return value === 10 ? 'Lettura' : value === 20 ? 'Scrittura' : value === 30 ? 'Valore legacy (30)' : `Livello ${value ?? 'non definito'}`;\n}\n\n/** Preserves incomplete legacy role data without rendering an invalid numeric label. */\nfunction rolePermissionLevel(value: unknown): string {\n return value === undefined || value === null || value === '' ? permissionLevelLabel(undefined) : permissionLevelLabel(Number(value));\n}\n\n/** Renders selectable roles together with their effective groups, menus and permission levels. */\nfunction roleAssignmentEditor(roles: Role[], assignedRoles: Array<{ codiceRuolo?: number }> | undefined, groups: GroupWithMenusEntity[]): string {\n const catalogMenus = new Map(groups.flatMap((group) => group.menus.map((menu) => [menu.codiceMenu, menu])));\n return `<form id=\"roles\" class=\"user-editor-section roles-editor\" data-user-panel=\"roles\" role=\"tabpanel\" aria-labelledby=\"user-tab-roles\"><h3>Ruoli ${helpDot('role-assignment')}</h3><p class=\"form-help\">Salvare sostituisce i ruoli dell'utente (non i grant diretti).</p><div class=\"role-assignment-list\">${roles.map((role) => { const roleMenus = role.menu ?? []; const assigned = (assignedRoles ?? []).some((current) => current.codiceRuolo === role.codiceRuolo); const groupedMenus = groups.map((group) => ({ group, entries: group.menus.map((menu) => ({ menu, assignment: roleMenus.find((item) => item.codiceMenu === menu.codiceMenu) })).filter((entry) => entry.assignment) })).filter((entry) => entry.entries.length > 0); const missingMenus = roleMenus.filter((item) => !catalogMenus.has(item.codiceMenu)); return `<article class=\"role-assignment-card\"><div class=\"role-assignment-heading\"><label class=\"check\"><input type=\"checkbox\" name=\"role\" value=\"${escapeHtml(role.codiceRuolo)}\" ${assigned ? 'checked' : ''}><span><strong>${escapeHtml(role.descrizioneRuolo)}</strong><small>Codice ruolo: ${escapeHtml(role.codiceRuolo)}</small></span></label><span class=\"role-menu-count\">${roleMenus.length} menu</span></div><div class=\"role-permission-groups\">${groupedMenus.map(({ group, entries }) => `<section class=\"role-permission-group\"><div class=\"role-permission-group-heading\"><strong>${escapeHtml(group.descrizioneGruppo)}</strong>${groupMetadata(group)}</div>${entries.map(({ menu, assignment }) => `<div class=\"role-permission-entry ${menu.enabled === false ? 'is-disabled' : ''}\"><div><strong>${escapeHtml(menu.descrizioneMenu)}</strong>${menuMetadata(menu)}</div><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(assignment?.tipoAbilitazione))}</span></div>`).join('')}</section>`).join('') || '<p class=\"form-help\">Questo ruolo non contiene menu attivi nel catalogo.</p>'}${missingMenus.length ? `<section class=\"role-permission-group missing-role-menus\"><strong>Menu non più presenti nel catalogo</strong>${missingMenus.map((menu) => `<div class=\"role-permission-entry\"><div><strong>${escapeHtml(menu.codiceMenu)}</strong><p class=\"entity-note\">Il menu è ancora associato al ruolo ma non è disponibile nel catalogo corrente.</p></div><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(menu.tipoAbilitazione))}</span></div>`).join('')}</section>` : ''}</div></article>`; }).join('')}</div><button>Salva ruoli</button></form>`;\n}\n\n/** Vista compatta di un ruolo: identità, azioni e albero delle abilitazioni su richiesta. */\nfunction roleOverview(role: Role, groups: GroupWithMenusEntity[]): string {\n const roleMenus = role.menu ?? [];\n const assignments = new Map(roleMenus.map((item) => [item.codiceMenu, item]));\n const knownMenus = new Set(groups.flatMap((group) => group.menus.map((menu) => menu.codiceMenu)));\n const tree = groups\n .map((group) => ({ group, entries: group.menus.filter((menu) => assignments.has(menu.codiceMenu)) }))\n .filter((node) => node.entries.length > 0);\n const orphans = roleMenus.filter((item) => !knownMenus.has(item.codiceMenu));\n\n const groupNodes = tree.map(({ group, entries }) => `<li class=\"role-tree-group ${group.enabled === false ? 'is-disabled' : ''}\"><div class=\"role-tree-group-head\"><strong>${escapeHtml(group.descrizioneGruppo)}</strong><span class=\"role-tree-count\">${entries.length}</span></div><ul class=\"role-tree-menus\">${entries.map((menu) => `<li class=\"role-tree-menu ${menu.enabled === false ? 'is-disabled' : ''}\"><span class=\"role-tree-menu-name\">${escapeHtml(menu.descrizioneMenu)}</span><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(assignments.get(menu.codiceMenu)?.tipoAbilitazione))}</span></li>`).join('')}</ul></li>`).join('');\n const orphanNode = orphans.length\n ? `<li class=\"role-tree-group is-orphan\"><div class=\"role-tree-group-head\"><strong>Menu non più nel catalogo</strong><span class=\"role-tree-count\">${orphans.length}</span></div><ul class=\"role-tree-menus\">${orphans.map((item) => `<li class=\"role-tree-menu\"><span class=\"role-tree-menu-name\"><code>${escapeHtml(item.codiceMenu)}</code></span><span class=\"permission-level\">${escapeHtml(rolePermissionLevel(item.tipoAbilitazione))}</span></li>`).join('')}</ul></li>`\n : '';\n\n return `<article class=\"role-card\">\n <div class=\"role-card-head\">\n <div class=\"role-card-title\">\n <strong>${escapeHtml(role.descrizioneRuolo)}</strong>\n <span class=\"role-card-meta\">Codice ${escapeHtml(role.codiceRuolo)} &middot; ${roleMenus.length} menu</span>\n </div>\n <div class=\"role-card-actions\">\n <button type=\"button\" class=\"secondary\" data-role=\"${escapeHtml(role.codiceRuolo)}\">Modifica</button>\n <button type=\"button\" class=\"danger-button\" data-role-delete=\"${escapeHtml(role.codiceRuolo)}\">Elimina</button>\n </div>\n </div>\n ${roleMenus.length ? `<details class=\"role-card-menus\"><summary>Abilitazioni per menu (${roleMenus.length})</summary><ul class=\"role-tree\">${groupNodes}${orphanNode}</ul></details>` : '<p class=\"role-card-empty\">Nessun menu assegnato.</p>'}\n </article>`;\n}\n\n/** Editor compatto dei menu di un ruolo: inclusione e livello, raggruppati per gruppo. */\nfunction roleMenuEditorTable(group: GroupWithMenusEntity, role?: Role): string {\n const roleMenus = role?.menu ?? [];\n const options = group.menus.map((menu) => {\n const assignment = roleMenus.find((item) => item.codiceMenu === menu.codiceMenu);\n const level = assignment?.tipoAbilitazione ?? 10;\n return `<li class=\"role-menu-option ${menu.enabled === false ? 'is-disabled' : ''}\"><label class=\"check\"><input type=\"checkbox\" name=\"menu\" value=\"${escapeHtml(menu.codiceMenu)}\" ${assignment ? 'checked' : ''}><span>${escapeHtml(menu.descrizioneMenu)}</span></label><label class=\"role-menu-level\"><span class=\"sr-only\">Livello per ${escapeHtml(menu.descrizioneMenu)}</span><select name=\"menu-level:${escapeHtml(menu.codiceMenu)}\" ${assignment ? '' : 'disabled'}>${permissionSelectOptions(level)}</select></label></li>`;\n }).join('');\n return `<section class=\"role-menu-group ${group.enabled === false ? 'is-disabled' : ''}\">\n <div class=\"role-menu-group-head\"><strong>${escapeHtml(group.descrizioneGruppo)}</strong>${group.enabled === false ? '<span class=\"muted\">Gruppo disabilitato</span>' : ''}</div>\n <ul class=\"role-menu-options\">${options || '<li class=\"role-menu-empty muted\">Nessun menu in questo gruppo.</li>'}</ul>\n </section>`;\n}\n\n/**\n * Shows a delayed, concurrency-safe application loader for all Orval requests.\n * The delay avoids a distracting flash for fast operations; the minimum display\n * time makes visible operations feel intentional instead of flickering.\n */\nfunction updateLoadingState(active: boolean): void {\n pendingNetworkRequests = Math.max(0, pendingNetworkRequests + (active ? 1 : -1));\n // Durante il boot l'overlay è gestito manualmente (verifica sessione), non dalle richieste di rete.\n if (booting) {\n return;\n }\n const overlay = byId('loading-overlay');\n\n if (pendingNetworkRequests > 0) {\n if (loadingHideTimer !== undefined) {\n window.clearTimeout(loadingHideTimer);\n loadingHideTimer = undefined;\n }\n if (loadingRevealTimer === undefined && overlay.hidden) {\n loadingRevealTimer = window.setTimeout(() => {\n loadingRevealTimer = undefined;\n if (pendingNetworkRequests > 0) {\n overlay.hidden = false;\n loaderVisibleSince = Date.now();\n byId('app').setAttribute('aria-busy', 'true');\n }\n }, 140);\n }\n return;\n }\n\n if (loadingRevealTimer !== undefined) {\n window.clearTimeout(loadingRevealTimer);\n loadingRevealTimer = undefined;\n }\n\n const hide = () => {\n loadingHideTimer = undefined;\n overlay.hidden = true;\n byId('app').removeAttribute('aria-busy');\n };\n const remainingVisibleMs = 280 - (Date.now() - loaderVisibleSince);\n if (!overlay.hidden && remainingVisibleMs > 0) {\n loadingHideTimer = window.setTimeout(hide, remainingVisibleMs);\n } else {\n hide();\n }\n}\n\n/** Chiude la fase di boot e mostra login o console: evita il lampeggio del login a ogni reload. */\nfunction finishBoot(view: 'login' | 'console'): void {\n booting = false;\n const overlay = byId('loading-overlay');\n overlay.hidden = true;\n byId('app').removeAttribute('aria-busy');\n byId('login').hidden = view !== 'login';\n byId('console').hidden = view !== 'console';\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Operazione non riuscita.';\n}\n\n/** Evita rejection non gestite dagli eventi del browser e conserva la vista corrente. */\nfunction handleAction(action: () => Promise<void>): void {\n void action().catch((error) => showNotice(errorMessage(error), true));\n}\n\nfunction render(markup: string): void {\n closeHelp(false);\n byId('view').innerHTML = markup;\n}\n\n/** Keeps the selected console area visible to sighted and assistive-technology users. */\nfunction setActiveNavigation(view: ConsoleView): void {\n document.querySelectorAll<HTMLElement>('#nav [data-view]').forEach((link) => {\n if (link.dataset.view === view) {\n link.setAttribute('aria-current', 'page');\n } else {\n link.removeAttribute('aria-current');\n }\n });\n // Apre il ramo dell'albero che contiene la voce attiva.\n document.querySelectorAll<HTMLDetailsElement>('#nav details[data-nav-group]').forEach((branch) => {\n if (branch.querySelector(`[data-view=\"${view}\"]`)) branch.open = true;\n });\n}\n\n/** Returns the canonical browser path for a top-level console section. */\nfunction routePath(view: ConsoleView): string {\n return `${consoleBasePath}/${routeSegment[view]}`;\n}\n\n/** Resolves a console section from the current pathname, defaulting to users. */\nfunction viewFromLocation(): ConsoleView {\n const relativePath = window.location.pathname.slice(consoleBasePath.length).replace(/^\\/+|\\/+$/g, '');\n const decoded = decodeURIComponent(relativePath);\n return routeView[decoded] ?? parentDefaultView[decoded] ?? 'users';\n}\n\n/** Navigates through the browser history and renders the requested SPA section. */\nasync function navigate(view: ConsoleView, replace = false): Promise<void> {\n if (!isViewAllowed(view)) {\n view = 'users';\n replace = true;\n }\n const destination = routePath(view);\n if (window.location.pathname !== destination) {\n window.history[replace ? 'replaceState' : 'pushState']({ view }, '', destination);\n }\n // Tornando alla sezione utenti dal menu si riparte dalla prima pagina.\n if (view === 'users') usersPage = 0;\n await show(view);\n}\n\nfunction requireConsoleAccess(): void {\n if (!currentUser?.flagSuper && !currentUser?.flagAdmin) {\n throw new Error('La console richiede un superutente o un admin Accessi.');\n }\n}\n\n/**\n * Un admin accede a tutte le sezioni. Un superutente (senza admin) gestisce solo gli Utenti.\n */\nfunction isViewAllowed(view: ConsoleView): boolean {\n if (!currentUser) return false;\n if (currentUser.flagAdmin) return true;\n return view === 'users';\n}\n\n/** Mostra/nasconde le voci di navigazione in base ai flag dell'utente connesso. */\nfunction applyRoleNavigation(): void {\n document.querySelectorAll<HTMLElement>('#nav [data-view]').forEach((link) => {\n const view = link.dataset.view as ConsoleView;\n const item = link.closest('li') ?? link;\n item.hidden = !isViewAllowed(view);\n });\n document.querySelectorAll<HTMLElement>('#nav details[data-nav-group]').forEach((branch) => {\n const hasVisible = Array.from(branch.querySelectorAll<HTMLElement>('[data-view]')).some((link) => !link.closest('li')!.hidden);\n branch.hidden = !hasVisible;\n });\n}\n\nfunction formValues(form: HTMLFormElement): Record<string, string> {\n return Object.fromEntries(new FormData(form).entries()) as Record<string, string>;\n}\n\nfunction eventForm(event: Event): HTMLFormElement {\n return event.currentTarget as HTMLFormElement;\n}\n\n/** Shared identity fields: values are verified by the hosting backend, never by this console. */\nfunction federatedIdentityFields(providers: FederatedProvider[]): string {\n return `<label>Provider ${helpDot('sso-provider')}<select name=\"provider\" required><option value=\"\">Seleziona un provider</option>${providers.filter((provider) => provider.active).map((provider) => `<option value=\"${escapeHtml(provider.provider)}\">${escapeHtml(provider.description)} (${escapeHtml(provider.provider)})</option>`).join('')}</select><span class=\"form-help\">Deve corrispondere alla configurazione del backend.</span></label>\n <label>ID utente del provider (subject) ${helpDot('sso-subject')}<input name=\"subject\" required><span class=\"form-help\">Identificatore stabile (es. <code>oid</code> Azure, <code>sub</code> Google/OIDC, <code>NameID</code> SAML). Mai l'email: apri la guida.</span></label>\n <label>Nota ${helpDot('sso-note')}<input name=\"note\"><span class=\"form-help\">Nota interna, non inviata al provider.</span></label>`;\n}\n\n/** Renders high-priority SSO identity management for one Accessi user. */\nfunction federatedIdentitySection(identities: ConsoleFederatedIdentity[], providers: FederatedProvider[]): string {\n return `<section class=\"user-editor-section sso-identity-section\" data-user-panel=\"sso\" role=\"tabpanel\" aria-labelledby=\"user-tab-sso\"><div class=\"section-heading\"><div><p class=\"eyebrow\">Autenticazione esterna</p><h3>Identità SSO</h3></div><span class=\"muted\">Collegamenti verificati dal backend</span></div><p class=\"form-help\">Disabilita conserva lo storico; elimina rimuove il collegamento (l'utente resta).</p><div class=\"sso-identity-list\">${identities.map((identity) => `<article class=\"sso-identity-item ${identity.active ? '' : 'is-disabled'}\"><div class=\"sso-identity-data\"><strong>${escapeHtml(identity.provider)}</strong><dl class=\"entity-metadata\"><div><dt>Subject</dt><dd>${escapeHtml(identity.subject)}</dd></div><div><dt>Stato</dt><dd>${identity.active ? 'Abilitata' : 'Disabilitata'}</dd></div></dl>${identity.note ? `<p class=\"entity-note\"><strong>Nota</strong>${escapeHtml(identity.note)}</p>` : ''}</div><div class=\"sso-identity-actions\"><button type=\"button\" class=\"secondary\" data-identity-toggle=\"${escapeHtml(identity.identityKey)}\" data-active=\"${String(!identity.active)}\">${identity.active ? 'Disabilita' : 'Abilita'}</button><button type=\"button\" class=\"icon-button danger-button\" data-identity-delete=\"${escapeHtml(identity.identityKey)}\" aria-label=\"Elimina definitivamente il collegamento SSO ${escapeHtml(identity.provider)}\" title=\"Elimina definitivamente il collegamento SSO\"><span aria-hidden=\"true\">&#128465;</span></button></div></article>`).join('') || '<p class=\"muted\">Nessun collegamento SSO.</p>'}</div>${providers.some((provider) => provider.active) ? `<form id=\"link-sso\" class=\"sso-link-form\">${federatedIdentityFields(providers)}<button>Collega SSO verificato</button></form>` : '<p class=\"form-help\">Non ci sono provider SSO attivi. Censiscine uno nella sezione SSO prima di creare collegamenti.</p>'}</section>`;\n}\n\n/** Builds the tab list for user administration without coupling it to a framework router. */\nfunction userDetailTabs(hasSso: boolean): string {\n const tabs: Array<{ id: UserDetailTab; label: string }> = [\n ...(hasSso ? [{ id: 'sso' as const, label: 'Identità SSO' }] : []),\n { id: 'profile', label: 'Profilo e accesso' },\n { id: 'roles', label: 'Ruoli' },\n { id: 'grants', label: 'Grant diretti' },\n ];\n return `<div class=\"user-tabs\" role=\"tablist\" aria-label=\"Sezioni utente\">${tabs.map((tab) => `<button id=\"user-tab-${tab.id}\" type=\"button\" role=\"tab\" aria-controls=\"user-panel-${tab.id}\" data-user-tab=\"${tab.id}\">${tab.label}</button>`).join('')}</div>`;\n}\n\n/** Activates one user-management panel while keeping ARIA state in sync with the visible tab. */\nfunction activateUserTab(tab: UserDetailTab): void {\n document.querySelectorAll<HTMLButtonElement>('[data-user-tab]').forEach((button) => {\n const selected = button.dataset.userTab === tab;\n button.setAttribute('aria-selected', String(selected));\n button.tabIndex = selected ? 0 : -1;\n });\n document.querySelectorAll<HTMLElement>('[data-user-panel]').forEach((panel) => {\n const selected = panel.dataset.userPanel === tab;\n panel.hidden = !selected;\n // Keep form IDs stable: the save handlers bind to profile/roles/grants.\n if (!panel.id) panel.id = `user-panel-${panel.dataset.userPanel}`;\n document.querySelector(`[data-user-tab=\"${panel.dataset.userPanel}\"]`)?.setAttribute('aria-controls', panel.id);\n });\n}\n\nfunction selectedNumbers(form: HTMLFormElement, name: string): number[] {\n return Array.from(new FormData(form).getAll(name), (value) => Number(value));\n}\n\n/** Carica tutti gli utenti (usato da SSO e filtri, che popolano selettori completi). */\nasync function loadUsers(): Promise<UserRow[]> {\n return result(await getUsers({ includeGrants: true })) as UserRow[];\n}\n\n/** Carica la pagina corrente della lista utenti e il totale (header X-Total-Count). */\nasync function loadUsersPage(): Promise<{ users: UserRow[]; total: number }> {\n const response = await getUsers({\n includeGrants: true,\n limit: USERS_PAGE_SIZE,\n offset: usersPage * USERS_PAGE_SIZE,\n });\n const users = result<UserRow[]>(response);\n const headers = (response as unknown as { headers?: Headers }).headers;\n const totalHeader = headers?.get?.('X-Total-Count') ?? null;\n const parsed = totalHeader !== null && totalHeader !== '' ? Number(totalHeader) : Number.NaN;\n const total = Number.isFinite(parsed) ? parsed : usersPage * USERS_PAGE_SIZE + users.length;\n return { users, total };\n}\n\n/** Numeri di pagina da mostrare, con ellissi quando le pagine sono molte. */\nfunction pageNumbers(current: number, total: number): Array<number | 'gap'> {\n if (total <= 7) {\n return Array.from({ length: total }, (_, index) => index + 1);\n }\n const wanted = new Set<number>([1, total, current, current - 1, current + 1]);\n const sorted = Array.from(wanted).filter((page) => page >= 1 && page <= total).sort((a, b) => a - b);\n const result: Array<number | 'gap'> = [];\n let previous = 0;\n for (const page of sorted) {\n if (previous !== 0 && page - previous > 1) {\n result.push('gap');\n }\n result.push(page);\n previous = page;\n }\n return result;\n}\n\n/** Paginatore orizzontale con numeri di pagina (troncati) e riepilogo del contesto. */\nfunction pagerMarkup(totalPages: number): string {\n const context = `<span class=\"pager-context\">${usersTotal} utent${usersTotal === 1 ? 'e' : 'i'}${totalPages > 1 ? ` · pagina ${usersPage + 1} di ${totalPages}` : ''}</span>`;\n if (totalPages <= 1) {\n return `<nav class=\"pager\" aria-label=\"Paginazione utenti\">${context}</nav>`;\n }\n\n const numbers = pageNumbers(usersPage + 1, totalPages).map((page) => page === 'gap'\n ? '<span class=\"pager-gap\" aria-hidden=\"true\">&hellip;</span>'\n : `<button type=\"button\" class=\"pager-item\" data-goto=\"${page}\"${page === usersPage + 1 ? ' aria-current=\"page\"' : ''}>${page}</button>`).join('');\n\n const controls = `<span class=\"pager-controls\">`\n + `<button type=\"button\" class=\"pager-item pager-nav\" data-goto=\"prev\"${usersPage === 0 ? ' disabled' : ''} aria-label=\"Pagina precedente\">&lsaquo;</button>`\n + numbers\n + `<button type=\"button\" class=\"pager-item pager-nav\" data-goto=\"next\"${usersPage >= totalPages - 1 ? ' disabled' : ''} aria-label=\"Pagina successiva\">&rsaquo;</button>`\n + '</span>';\n\n return `<nav class=\"pager\" aria-label=\"Paginazione utenti\">${controls}${context}</nav>`;\n}\n\n/** Cella ruoli con etichette; se sono molte mostra \"altre N\" che espande la riga chiudendo le altre. */\nfunction rolesCell(codiceUtente: number, userGrants?: UserRow['userGrants']): string {\n const labels = (userGrants?.ruoli ?? [])\n .map((role) => role.descrizioneRuolo?.trim() || (role.codiceRuolo ? `#${role.codiceRuolo}` : ''))\n .filter((label): label is string => label.length > 0);\n if (labels.length === 0) {\n return '<span class=\"muted\">&mdash;</span>';\n }\n\n const limit = 2;\n if (labels.length <= limit) {\n return `<span class=\"roles-list\">${labels.map(escapeHtml).join(', ')}</span>`;\n }\n\n const hiddenCount = labels.length - limit;\n return `<span class=\"roles-cell\" data-roles-cell=\"${codiceUtente}\">`\n + `<span class=\"roles-list\" data-roles-collapsed>${labels.slice(0, limit).map(escapeHtml).join(', ')}</span>`\n + `<span class=\"roles-list\" data-roles-full hidden>${labels.map(escapeHtml).join(', ')}</span>`\n + `<button type=\"button\" class=\"link-button\" data-roles-toggle=\"${codiceUtente}\" data-roles-more=\"${hiddenCount}\" aria-expanded=\"false\">altre ${hiddenCount}</button>`\n + '</span>';\n}\n\nfunction setRolesExpanded(cell: HTMLElement, expanded: boolean): void {\n cell.querySelector<HTMLElement>('[data-roles-collapsed]')?.toggleAttribute('hidden', expanded);\n cell.querySelector<HTMLElement>('[data-roles-full]')?.toggleAttribute('hidden', !expanded);\n const button = cell.querySelector<HTMLButtonElement>('[data-roles-toggle]');\n if (button) {\n button.setAttribute('aria-expanded', String(expanded));\n button.textContent = expanded ? 'mostra meno' : `altre ${button.dataset.rolesMore ?? ''}`;\n }\n}\n\n/** Espande una riga alla volta, chiudendo le altre. */\nfunction bindRolesToggles(): void {\n document.querySelectorAll<HTMLButtonElement>('[data-roles-toggle]').forEach((button) => {\n button.onclick = () => {\n const cell = button.closest<HTMLElement>('[data-roles-cell]');\n if (!cell) return;\n const willExpand = button.getAttribute('aria-expanded') !== 'true';\n document.querySelectorAll<HTMLElement>('[data-roles-cell]').forEach((other) => {\n if (other !== cell) setRolesExpanded(other, false);\n });\n setRolesExpanded(cell, willExpand);\n };\n });\n}\n\nasync function detectFederatedAuthentication(): Promise<void> {\n if (!currentUser) return;\n try {\n await getFederatedIdentities(currentUser.codiceUtente);\n federatedAuthenticationAvailable = true;\n } catch {\n federatedAuthenticationAvailable = false;\n }\n}\n\nasync function loginView(event: SubmitEvent): Promise<void> {\n event.preventDefault();\n try {\n const values = formValues(event.currentTarget as HTMLFormElement);\n byId('login-error').textContent = '';\n const response = result<LoginResult>(await login({ email: values.email ?? '', password: values.password || undefined }));\n await completeLoginStep(response);\n } catch (error) {\n byId('login-error').textContent = error instanceof Error ? error.message : 'Login non riuscito.';\n }\n}\n\nlet pendingChallenge: string | null = null;\nlet resendTimer: ReturnType<typeof setInterval> | undefined;\n\nfunction resetLogin(): void {\n pendingChallenge = null;\n if (resendTimer) clearInterval(resendTimer);\n byId<HTMLFormElement>('login-form').reset();\n byId<HTMLFormElement>('two-factor-form').reset();\n byId('login-form').hidden = false;\n byId('two-factor-form').hidden = true;\n byId('password-field').hidden = true;\n byId('password-field').querySelector('input')!.disabled = true;\n byId('restart-login').hidden = true;\n byId('login-submit').textContent = 'Continua';\n byId('login-error').textContent = '';\n}\n\nfunction showTwoFactor(challenge: { challengeId: string; expiresAt?: string; resendAfterSeconds: number }): void {\n pendingChallenge = challenge.challengeId;\n byId('login-form').hidden = true;\n const password = byId('password-field').querySelector('input')!;\n password.value = '';\n password.disabled = true;\n byId('two-factor-form').hidden = false;\n byId('restart-login').hidden = false;\n byId<HTMLFormElement>('two-factor-form').reset();\n byId('two-factor-form').querySelector<HTMLInputElement>('input')!.focus();\n const expires = challenge.expiresAt ? new Date(challenge.expiresAt).toLocaleTimeString() : '';\n byId('two-factor-status').textContent = expires ? `Codice inviato. Scade alle ${expires}.` : 'Codice inviato. Controlla la tua email.';\n if (resendTimer) clearInterval(resendTimer);\n const availableAt = Date.now() + challenge.resendAfterSeconds * 1000;\n const update = () => {\n const seconds = Math.max(0, Math.ceil((availableAt - Date.now()) / 1000));\n const button = byId<HTMLButtonElement>('resend-code');\n button.disabled = seconds > 0;\n button.textContent = seconds ? `Reinvia tra ${seconds}s` : 'Invia un nuovo codice';\n if (!seconds && resendTimer) clearInterval(resendTimer);\n };\n update();\n resendTimer = setInterval(update, 1000);\n}\n\nasync function completeLoginStep(response: LoginResult): Promise<void> {\n if (response.challenge) {\n showTwoFactor(response.challenge);\n return;\n }\n if (response.passwordRequired) {\n byId('password-field').hidden = false;\n const input = byId('password-field').querySelector('input')!;\n input.disabled = false;\n input.required = true;\n input.focus();\n byId('restart-login').hidden = false;\n byId('login-submit').textContent = 'Accedi';\n return;\n }\n if (!response.token?.value) throw new Error('Risposta di autenticazione incompleta.');\n token = response.token.value;\n sessionStorage.setItem('accessi-console-token', token);\n setAccessiConsoleToken(token);\n resetLogin();\n await bootstrap();\n}\n\nasync function bootstrap(): Promise<void> {\n try {\n setAccessiConsoleToken(token);\n if (!token) throw new Error('Inserisci le credenziali amministrative.');\n const payload = result<AuthenticatedTokenPayloadDto>(await getUserByToken({ token }));\n currentUser = payload.userData;\n requireConsoleAccess();\n applyRoleNavigation();\n await detectFederatedAuthentication();\n const roleLabel = currentUser.flagSuper && currentUser.flagAdmin ? 'super + admin' : currentUser.flagAdmin ? 'admin' : 'superutente';\n byId('who').textContent = `${currentUser.email} - ${roleLabel}`;\n byId<HTMLButtonElement>('sso-navigation').hidden = !federatedAuthenticationAvailable;\n finishBoot('console');\n await navigate(viewFromLocation(), window.location.pathname === consoleBasePath);\n } catch (error) {\n token = null;\n currentUser = null;\n setAccessiConsoleToken(null);\n federatedAuthenticationAvailable = false;\n sessionStorage.removeItem('accessi-console-token');\n finishBoot('login');\n byId('login-error').textContent = error instanceof Error ? error.message : 'Sessione non valida.';\n }\n}\n\nasync function showUsers(): Promise<void> {\n const { users, total } = await loadUsersPage();\n usersTotal = total;\n const totalPages = Math.max(1, Math.ceil(total / USERS_PAGE_SIZE));\n if (usersPage >= totalPages) usersPage = totalPages - 1;\n\n render(`<div class=\"toolbar\"><button id=\"new-local\">Nuovo utente locale</button>${federatedAuthenticationAvailable ? '<button id=\"new-sso\">Nuovo utente SSO</button>' : ''}<button id=\"reload-users\" class=\"secondary\">Aggiorna</button></div>\n <div class=\"pager-row pager-row-top\">${pagerMarkup(totalPages)}</div>\n <table><thead><tr><th>Utente</th><th>Stato</th><th>Accesso</th><th>2FA</th><th>Ruoli</th><th></th></tr></thead><tbody>\n ${users.map(({ utente, userGrants }) => `<tr><td>${escapeHtml(utente.email)}<br><span class=\"muted\">${escapeHtml(utente.nome)} ${escapeHtml(utente.cognome)}</span></td><td>${escapeHtml(utente.statoRegistrazione)}</td><td>${utente.passwordlessLoginEnabled ? 'codice email' : utente.passwordLoginEnabled === false ? 'solo SSO' : 'password'}</td><td>${utente.flagDueFattori ? 'Attiva' : 'Disattiva'}</td><td class=\"roles-col\">${rolesCell(utente.codiceUtente, userGrants)}</td><td><button data-user=\"${utente.codiceUtente}\">Gestisci</button></td></tr>`).join('') || '<tr><td colspan=\"6\" class=\"muted\">Nessun utente.</td></tr>'}\n </tbody></table><div class=\"pager-row pager-row-bottom\">${pagerMarkup(totalPages)}</div>`);\n\n byId('new-local').onclick = () => showLocalUserForm();\n if (federatedAuthenticationAvailable) byId('new-sso').onclick = () => handleAction(showSsoUserForm);\n byId('reload-users').onclick = () => handleAction(() => show('users'));\n document.querySelectorAll<HTMLButtonElement>('[data-goto]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n const target = button.dataset.goto;\n const nextPage = target === 'prev' ? usersPage - 1 : target === 'next' ? usersPage + 1 : Number(target) - 1;\n if (!Number.isInteger(nextPage) || nextPage < 0 || nextPage >= totalPages || nextPage === usersPage) return;\n usersPage = nextPage;\n await show('users');\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-user]').forEach((button) => {\n button.onclick = () => handleAction(() => showUser(button.dataset.user ?? ''));\n });\n bindRolesToggles();\n}\n\nfunction authenticationPolicyFields(user: UserDto): string {\n return `<fieldset><legend>Verifica dell'accesso (opzionale)</legend>\n <label class=\"check\"><input name=\"flagDueFattori\" type=\"checkbox\" ${user.flagDueFattori ? 'checked' : ''}> Richiedi un codice via email (2FA) ${helpDot('user-2fa')}</label>\n <p class=\"form-help\">Se attiva, il codice è richiesto dopo password o SSO.</p>\n <label class=\"check\"><input name=\"passwordlessLoginEnabled\" type=\"checkbox\" ${user.passwordlessLoginEnabled ? 'checked' : ''} ${user.flagDueFattori ? '' : 'disabled'}> Consenti accesso con il solo codice email ${helpDot('user-passwordless')}</label>\n <p class=\"form-help\">Accesso senza password (richiede il codice email).</p>\n </fieldset>`;\n}\n\nfunction showLocalUserForm(): void {\n render(`<button id=\"back\">Indietro</button><h2>Nuovo utente locale</h2><p class=\"muted\">Viene inviata l'e-mail per impostare la password.</p>\n <form id=\"local-user\"><label>Email ${helpDot('user-email')}<input name=\"email\" type=\"email\" required><span class=\"form-help\">Identificativo di accesso; riceverà l'email per la password.</span></label><label>Nome ${helpDot('user-name')}<input name=\"nome\"></label><label>Cognome ${helpDot('user-name')}<input name=\"cognome\"></label><button>Crea utente</button></form>`);\n byId('back').onclick = () => show('users');\n const localUserForm = document.getElementById('local-user') as HTMLFormElement | null;\n if (localUserForm) localUserForm.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n await createManagedUser(formValues(eventForm(event)) as unknown as RegisterRequest);\n showNotice('Utente creato; inviata la procedura di impostazione password.');\n await show('users');\n });\n };\n}\n\nasync function showSsoUserForm(): Promise<void> {\n const providers = result<FederatedProvider[]>(await getFederatedProviders());\n if (!providers.some((provider) => provider.active)) {\n throw new Error('Prima di creare un utente SSO, censisci e abilita almeno un provider SSO.');\n }\n render(`<button id=\"back\">Indietro</button><h2>Nuovo utente SSO</h2><p class=\"muted\">Salva solo collegamenti già verificati dal backend.</p>\n <form id=\"sso-user\"><label>Email ${helpDot('user-email')}<input name=\"email\" type=\"email\" required><span class=\"form-help\">Email di contatto e identificativo Accessi dell'utente.</span></label><label>Nome ${helpDot('user-name')}<input name=\"nome\"></label><label>Cognome ${helpDot('user-name')}<input name=\"cognome\"></label>${federatedIdentityFields(providers)}<label class=\"check\"><input name=\"passwordLoginEnabled\" type=\"checkbox\"> Abilita anche la password locale ${helpDot('user-password-login')}</label><span class=\"form-help\">Se disattivato, l'utente accede solo via SSO.</span><button>Crea utente SSO</button></form>`);\n byId('back').onclick = () => show('ssoUsers');\n const ssoUserForm = document.getElementById('sso-user') as HTMLFormElement | null;\n if (ssoUserForm) ssoUserForm.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const form = eventForm(event);\n const values = formValues(form);\n const request: CreateFederatedUserRequest = {\n provider: values.provider ?? '',\n subject: values.subject ?? '',\n note: values.note || undefined,\n passwordLoginEnabled: new FormData(form).has('passwordLoginEnabled'),\n user: { email: values.email ?? '', nome: values.nome || undefined, cognome: values.cognome || undefined },\n };\n await createFederatedUser(request);\n showNotice('Utente SSO creato e collegamento registrato.');\n await show('ssoUsers');\n });\n };\n}\n\n/** Catalogo dei provider SSO: elenco, censimento, modifica ed eliminazione. */\nasync function showSsoProviders(): Promise<void> {\n if (!federatedAuthenticationAvailable) throw new Error('SSO non è abilitato in questa istanza Accessi.');\n const providerList = result<FederatedProvider[]>(await getFederatedProviders());\n render(`<div class=\"toolbar\"><button id=\"new-provider\">Nuovo provider</button><button id=\"reload-providers\" class=\"secondary\">Aggiorna</button></div>\n <h2>Provider SSO</h2><p class=\"muted\">La validazione di token, issuer e segreti resta nel backend. Un provider si elimina solo se nessuna identità è collegata.</p>\n <div class=\"menu-table-wrap\"><table><thead><tr><th>Provider</th><th>Descrizione</th><th>Stato</th><th></th></tr></thead><tbody>${providerList.map((provider) => `<tr class=\"${provider.active ? '' : 'is-disabled'}\"><td><code>${escapeHtml(provider.provider)}</code></td><td>${escapeHtml(provider.description)}</td><td>${provider.active ? 'Attivo' : 'Disabilitato'}</td><td class=\"row-actions\"><button data-provider=\"${escapeHtml(provider.provider)}\">Gestisci</button></td></tr>`).join('') || '<tr><td colspan=\"4\" class=\"muted\">Nessun provider censito.</td></tr>'}</tbody></table></div>`);\n byId('new-provider').onclick = () => showProviderForm();\n byId('reload-providers').onclick = () => handleAction(showSsoProviders);\n document.querySelectorAll<HTMLButtonElement>('[data-provider]').forEach((button) => {\n button.onclick = () => showProviderForm(providerList.find((provider) => provider.provider === button.dataset.provider));\n });\n}\n\n/** Utenti e identità SSO: elenco e collegamento delle identità. */\nasync function showSsoUsers(): Promise<void> {\n if (!federatedAuthenticationAvailable) throw new Error('SSO non è abilitato in questa istanza Accessi.');\n const users = await loadUsers();\n render(`<div class=\"toolbar\"><button id=\"new-sso\">Nuovo utente SSO</button><button id=\"reload-sso-users\" class=\"secondary\">Aggiorna</button></div>\n <h2>Utenti e identità SSO</h2><p class=\"muted\">Gestisci i collegamenti provider/subject già verificati dal backend.</p>\n <div class=\"menu-table-wrap\"><table><thead><tr><th>Utente</th><th>Accesso</th><th></th></tr></thead><tbody>${users.map(({ utente }) => `<tr><td>${escapeHtml(utente.email)}</td><td>${utente.passwordLoginEnabled === false ? 'solo SSO' : 'password e SSO'}</td><td class=\"row-actions\"><button data-sso-user=\"${utente.codiceUtente}\">Gestisci identità</button></td></tr>`).join('') || '<tr><td colspan=\"3\" class=\"muted\">Nessun utente.</td></tr>'}</tbody></table></div>`);\n byId('new-sso').onclick = () => handleAction(showSsoUserForm);\n byId('reload-sso-users').onclick = () => handleAction(showSsoUsers);\n document.querySelectorAll<HTMLButtonElement>('[data-sso-user]').forEach((button) => {\n button.onclick = () => handleAction(() => showUser(button.dataset.ssoUser ?? ''));\n });\n}\n\n/** Creates or updates catalog metadata; the provider key is immutable once identities reference it. */\nfunction showProviderForm(provider?: FederatedProvider): void {\n const isExisting = provider !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><div class=\"page-header\"><div><p class=\"eyebrow\">Catalogo SSO</p><h2>${isExisting ? 'Gestisci provider' : 'Nuovo provider'}</h2></div><span class=\"muted\">Le configurazioni tecniche restano nel backend</span></div><form id=\"provider-form\"><label>Chiave provider ${helpDot('provider-key')}<input name=\"provider\" value=\"${escapeHtml(provider?.provider)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Chiave usata dal backend nel payload SSO (es. <code>azure-ad-acme-prod</code>). Non modificabile dopo il censimento.</span></label><label>Descrizione ${helpDot('provider-description')}<input name=\"description\" value=\"${escapeHtml(provider?.description)}\" required><span class=\"form-help\">Nome leggibile per gli amministratori.</span></label><label>Nota ${helpDot('provider-note')}<input name=\"note\" value=\"${escapeHtml(provider?.note)}\"><span class=\"form-help\">Non inserire segreti o dati personali.</span></label>${isExisting ? `<label class=\"check\"><input name=\"active\" type=\"checkbox\" ${provider.active ? 'checked' : ''}> Provider attivo ${helpDot('provider-active')}</label><span class=\"form-help\">Blocca nuovi login e collegamenti; lo storico resta.</span>` : ''}<button>${isExisting ? 'Salva provider' : 'Censisci provider'}</button>${isExisting ? '<button type=\"button\" id=\"delete-provider\" class=\"danger-button\">Elimina provider</button>' : ''}</form>`);\n byId('back').onclick = () => show('ssoProviders');\n const deleteProviderButton = document.getElementById('delete-provider') as HTMLButtonElement | null;\n if (deleteProviderButton && provider) {\n deleteProviderButton.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il provider ${provider.provider}? Operazione possibile solo se nessuna identita e collegata.`)) return;\n await deleteFederatedProvider(provider.provider);\n showNotice('Provider SSO eliminato.');\n await show('ssoProviders');\n });\n }\n const providerForm = document.getElementById('provider-form') as HTMLFormElement | null;\n if (providerForm) providerForm.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const form = eventForm(event);\n const values = formValues(form);\n if (provider) {\n const request: UpdateFederatedProviderRequest = {\n description: values.description,\n note: values.note || undefined,\n active: new FormData(form).has('active'),\n };\n await updateFederatedProvider(provider.provider, request);\n } else {\n const request: CreateFederatedProviderRequest = {\n provider: values.provider ?? '',\n description: values.description ?? '',\n note: values.note || undefined,\n };\n await createFederatedProvider(request);\n }\n showNotice(isExisting ? 'Provider SSO aggiornato.' : 'Provider SSO censito.');\n await show('ssoProviders');\n });\n };\n}\n\n/** Opzioni dello stato di registrazione Accessi (UTENTI.STAREG). */\nfunction registrationStateOptions(current: unknown): string {\n const states: Array<[number, string]> = [\n [0, 'Non definito'], [5, 'Inserito'], [10, 'Invitato'], [20, 'Confermato'], [50, 'Eliminato'], [99, 'Bloccato'],\n ];\n const currentValue = Number(current);\n return states.map(([value, label]) => `<option value=\"${value}\" ${currentValue === value ? 'selected' : ''}>${label} (${value})</option>`).join('');\n}\n\nasync function showUser(rawCode: string): Promise<void> {\n const codiceUtente = Number(rawCode);\n const [users, roles, grants, groups, providers] = await Promise.all([\n getUsers({ codiceUtente, includeGrants: true }),\n getRoles(),\n getUserRolesAndGrants(codiceUtente),\n getGroupsWithMenus({ includeDisabled: true }),\n federatedAuthenticationAvailable ? getFederatedProviders() : Promise.resolve(null),\n ]);\n const userRow = (result(users) as UserRow[])[0];\n if (!userRow?.utente) throw new Error('Utente non trovato.');\n const user = userRow.utente;\n const allRoles = result(roles) as Role[];\n const userGrants = result(grants) as { ruoli?: Array<{ codiceRuolo?: number }>; abilitazioni?: Permission[] };\n const menuGroups = result(groups) as GroupWithMenusEntity[];\n const providerList = providers ? result<FederatedProvider[]>(providers) : [];\n const linked = federatedAuthenticationAvailable\n ? result<ConsoleFederatedIdentity[]>(await getFederatedIdentities(codiceUtente))\n : [];\n const identitySection = federatedAuthenticationAvailable ? federatedIdentitySection(linked, providerList) : '';\n const defaultUserTab: UserDetailTab = federatedAuthenticationAvailable ? 'sso' : 'profile';\n render(`<div class=\"user-action-bar\"><button id=\"back\" type=\"button\" class=\"secondary\">Indietro</button><label class=\"inline-field\">Stato registrazione ${helpDot('user-state')}<select id=\"user-state\">${registrationStateOptions(user.statoRegistrazione)}</select></label><button id=\"save-state\" type=\"button\" class=\"secondary\">Aggiorna stato</button><button id=\"disable-user\" type=\"button\" class=\"danger-button\">Imposta stato eliminato</button>${helpDot('user-delete')}</div><div class=\"page-header\"><div><p class=\"eyebrow\">Utente ${codiceUtente}</p><h2>${escapeHtml(user.email)}</h2></div><span class=\"muted\">Gestione profilo, ruoli e autorizzazioni</span></div>${userDetailTabs(federatedAuthenticationAvailable)}<div class=\"user-editor\">\n ${identitySection}\n <form id=\"profile\" data-user-panel=\"profile\" role=\"tabpanel\" aria-labelledby=\"user-tab-profile\"><h3>Profilo e accesso</h3><label>Nome ${helpDot('user-name')}<input name=\"nome\" value=\"${escapeHtml(user.nome)}\"></label><label>Cognome ${helpDot('user-name')}<input name=\"cognome\" value=\"${escapeHtml(user.cognome)}\"></label><label>Email ${helpDot('user-email')}<input name=\"email\" type=\"email\" value=\"${escapeHtml(user.email)}\" required><span class=\"form-help\">Identificativo di accesso e recapito.</span></label>${federatedAuthenticationAvailable ? `<label class=\"check\"><input name=\"passwordLoginEnabled\" type=\"checkbox\" ${user.passwordLoginEnabled !== false ? 'checked' : ''}> Login con password ${helpDot('user-password-login')}</label><span class=\"form-help\">Se disabilitato, il login con email e password restituisce un errore esplicito; restano valide le identità SSO attive.</span>` : ''}${authenticationPolicyFields(user)}<button>Salva</button></form>\n ${roleAssignmentEditor(allRoles, userGrants.ruoli, menuGroups)}\n ${directGrantEditor(menuGroups, userGrants.abilitazioni)}\n </div>`);\n byId('back').onclick = () => show('users');\n const userTabButtons = Array.from(document.querySelectorAll<HTMLButtonElement>('[data-user-tab]'));\n userTabButtons.forEach((button, index) => {\n button.onclick = () => activateUserTab(button.dataset.userTab as UserDetailTab);\n button.onkeydown = (event) => {\n const targetIndex = event.key === 'ArrowRight' ? (index + 1) % userTabButtons.length\n : event.key === 'ArrowLeft' ? (index - 1 + userTabButtons.length) % userTabButtons.length\n : event.key === 'Home' ? 0 : event.key === 'End' ? userTabButtons.length - 1 : -1;\n if (targetIndex < 0) return;\n event.preventDefault();\n const targetTab = userTabButtons[targetIndex];\n if (!targetTab) return;\n targetTab.focus();\n activateUserTab(targetTab.dataset.userTab as UserDetailTab);\n };\n });\n activateUserTab(defaultUserTab);\n const profileForm = document.getElementById('profile') as HTMLFormElement | null;\n if (profileForm) {\n const twoFactor = profileForm.elements.namedItem('flagDueFattori') as HTMLInputElement;\n const passwordless = profileForm.elements.namedItem('passwordlessLoginEnabled') as HTMLInputElement;\n twoFactor.onchange = () => {\n passwordless.disabled = !twoFactor.checked;\n if (!twoFactor.checked) passwordless.checked = false;\n };\n profileForm.onsubmit = event => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const fields = new FormData(eventForm(event));\n await updateUtente(codiceUtente, {\n codiceUtente, email: values.email ?? '', nome: values.nome || undefined, cognome: values.cognome || undefined,\n flagDueFattori: fields.has('flagDueFattori'),\n passwordlessLoginEnabled: fields.has('passwordlessLoginEnabled'),\n ...(federatedAuthenticationAvailable ? { passwordLoginEnabled: fields.has('passwordLoginEnabled') } : {}),\n } as UserDto);\n if (codiceUtente === currentUser?.codiceUtente && (\n fields.has('flagDueFattori') !== Boolean(user.flagDueFattori) ||\n fields.has('passwordlessLoginEnabled') !== Boolean(user.passwordlessLoginEnabled)\n )) {\n token = null;\n sessionStorage.removeItem('accessi-console-token');\n setAccessiConsoleToken(null);\n resetLogin();\n await bootstrap();\n byId('login-error').textContent = 'Policy aggiornata. Accedi di nuovo con la nuova configurazione.';\n return;\n }\n await showUser(String(codiceUtente));\n activateUserTab('profile');\n showNotice('Profilo e policy aggiornati.');\n });\n };\n }\n\n const rolesForm = document.getElementById('roles') as HTMLFormElement | null;\n if (rolesForm) rolesForm.onsubmit = (event) => { event.preventDefault(); handleAction(async () => { await assignRolesToUser(codiceUtente, { roles: selectedNumbers(eventForm(event), 'role') }); showNotice('Ruoli aggiornati.'); }); };\n const grantsForm = document.getElementById('grants') as HTMLFormElement | null;\n if (grantsForm) grantsForm.onsubmit = (event) => { event.preventDefault(); handleAction(async () => { const permissions: Permission[] = []; new FormData(eventForm(event)).forEach((value, key) => { if (key.startsWith('grant:') && value) permissions.push({ codiceMenu: key.slice(6), tipoAbilitazione: Number(value) }); }); await assignPermissionsToUser(codiceUtente, { permissions }); showNotice('Grant aggiornati.'); }); };\n if (federatedAuthenticationAvailable) {\n const linkForm = document.getElementById('link-sso') as HTMLFormElement | null;\n if (linkForm) linkForm.onsubmit = (event) => { event.preventDefault(); handleAction(async () => { const values = formValues(eventForm(event)); await linkFederatedIdentity(codiceUtente, { provider: values.provider ?? '', subject: values.subject ?? '', note: values.note || undefined }); await showUser(String(codiceUtente)); }); };\n document.querySelectorAll<HTMLButtonElement>('[data-identity-toggle]').forEach((button) => { button.onclick = () => handleAction(async () => { await updateFederatedIdentity(button.dataset.identityToggle ?? '', { active: button.dataset.active === 'true' }); await showUser(String(codiceUtente)); }); });\n document.querySelectorAll<HTMLButtonElement>('[data-identity-delete]').forEach((button) => { button.onclick = () => handleAction(async () => { if (!window.confirm('Eliminare definitivamente questo collegamento SSO? L’utente Accessi non verrà eliminato.')) return; await deleteFederatedIdentityPermanently(codiceUtente, button.dataset.identityDelete ?? ''); showNotice('Collegamento SSO eliminato definitivamente.'); await showUser(String(codiceUtente)); }); });\n }\n byId('save-state').onclick = () => handleAction(async () => {\n const stateSelect = document.getElementById('user-state') as HTMLSelectElement | null;\n const statoRegistrazione = Number(stateSelect?.value ?? 0) as 0 | 5 | 10 | 20 | 50 | 99;\n await setStatoRegistrazione({ codiceUtente, statoRegistrazione });\n showNotice('Stato registrazione aggiornato.');\n await showUser(String(codiceUtente));\n });\n byId('disable-user').onclick = () => handleAction(async () => { await deleteUser(codiceUtente); showNotice('Utente impostato come eliminato.'); await show('users'); });\n}\n\nasync function showRoles(): Promise<void> {\n const [rolesResponse, groupsResponse] = await Promise.all([getRoles(), getGroupsWithMenus({ includeDisabled: true })]);\n const roles = result(rolesResponse) as Role[];\n const groups = result(groupsResponse) as GroupWithMenusEntity[];\n render(`<div class=\"toolbar\"><button id=\"new-role\">Nuovo ruolo</button></div><h2>Ruoli</h2><p class=\"form-help\">Definisci i ruoli e i menu che concedono. L'assegnazione agli utenti si gestisce dalla scheda utente.</p><div class=\"role-overview-list\">${roles.map((role) => roleOverview(role, groups)).join('') || '<p class=\"muted\">Nessun ruolo configurato.</p>'}</div>`);\n const roleForm = (role?: Role) => {\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${role ? 'Modifica' : 'Nuovo'} ruolo</h2><form id=\"role-form\"><label>Descrizione ${helpDot('role-description')}<input name=\"descrizione\" value=\"${escapeHtml(role?.descrizioneRuolo)}\" required><span class=\"form-help\">Nome del ruolo.</span></label><p class=\"form-help\">Seleziona i menu e il livello ${helpDot('role-level')}; il salvataggio sostituisce la configurazione del ruolo.</p><div class=\"role-menu-groups\">${groups.map((group) => roleMenuEditorTable(group, role)).join('')}</div><button>Salva ruolo</button></form>`);\n byId('back').onclick = () => show('roles');\n document.querySelectorAll<HTMLInputElement>('#role-form input[name=\"menu\"]').forEach((checkbox) => {\n checkbox.onchange = () => {\n const option = checkbox.closest('li');\n const level = option?.querySelector<HTMLSelectElement>('select[name^=\"menu-level:\"]');\n if (level) level.disabled = !checkbox.checked;\n };\n });\n const roleFormElement = document.getElementById('role-form') as HTMLFormElement | null;\n if (roleFormElement) roleFormElement.onsubmit = async (event) => { event.preventDefault(); const form = eventForm(event); const data = new FormData(form); const request: Role = { descrizioneRuolo: formValues(form).descrizione ?? '', menu: Array.from(data.getAll('menu'), (codiceMenu) => ({ codiceMenu: String(codiceMenu), tipoAbilitazione: Number(data.get(`menu-level:${codiceMenu}`) ?? 10) as Role['menu'][number]['tipoAbilitazione'] })) }; if (role?.codiceRuolo) await updateRole(role.codiceRuolo, request); else await createRole(request); await show('roles'); };\n };\n byId('new-role').onclick = () => roleForm();\n document.querySelectorAll<HTMLButtonElement>('[data-role]').forEach((button) => button.onclick = () => roleForm(roles.find((role) => role.codiceRuolo === Number(button.dataset.role))));\n document.querySelectorAll<HTMLButtonElement>('[data-role-delete]').forEach((button) => button.onclick = () => handleAction(async () => {\n if (!window.confirm('Eliminare definitivamente questo ruolo? Le assegnazioni agli utenti verranno rimosse.')) return;\n await deleteRole(Number(button.dataset.roleDelete));\n showNotice('Ruolo eliminato.');\n await show('roles');\n }));\n}\n\n/** Tabella dei gruppi menu con toggle, conteggio menu e azioni. */\nfunction menuGroupsTable(groups: GroupWithMenusEntity[]): string {\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Codice</th><th>Descrizione</th><th>Ordine</th><th>Menu</th><th>Stato</th><th></th></tr></thead><tbody>${groups.map((group) => `<tr class=\"${group.enabled === false ? 'is-disabled' : ''}\"><td><code>${escapeHtml(group.codiceGruppo)}</code></td><td><strong>${escapeHtml(group.descrizioneGruppo)}</strong></td><td>${escapeHtml(group.ordineGruppo)}</td><td>${group.menus.length}</td><td><label class=\"table-toggle\"><input type=\"checkbox\" data-group=\"${escapeHtml(group.codiceGruppo)}\" ${group.enabled !== false ? 'checked' : ''}><span>${group.enabled === false ? 'Disabilitato' : 'Abilitato'}</span></label></td><td class=\"row-actions\"><button type=\"button\" data-group-edit=\"${escapeHtml(group.codiceGruppo)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-group-delete=\"${escapeHtml(group.codiceGruppo)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"6\" class=\"muted\">Nessun gruppo configurato.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Tabella piatta di tutti i menu con gruppo, tipo e azioni; filtrabile per gruppo. */\nfunction menusTable(entries: Array<{ menu: MenuEntity; group: GroupWithMenusEntity }>, menuTypes: MenuTypeEntity[]): string {\n const typeLabel = (codice?: string) => {\n if (!codice) return 'Non indicato';\n return menuTypes.find((type) => type.codiceTipo === codice)?.descrizioneTipo || codice;\n };\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Stato</th><th>Menu</th><th>Codice</th><th>Gruppo</th><th>Ordine</th><th>Tipo</th><th>Pagina</th><th></th></tr></thead><tbody>${entries.map(({ menu, group }) => `<tr class=\"${menu.enabled === false ? 'is-disabled' : ''}\" data-menu-group=\"${escapeHtml(group.codiceGruppo)}\"><td><label class=\"table-toggle\"><input type=\"checkbox\" data-menu=\"${escapeHtml(menu.codiceMenu)}\" ${menu.enabled !== false ? 'checked' : ''}><span>${menu.enabled === false ? 'Disabilitato' : 'Abilitato'}</span></label></td><td><strong>${escapeHtml(menu.descrizioneMenu)}</strong>${menu.note ? `<br><span class=\"muted\">${escapeHtml(menu.note)}</span>` : ''}</td><td><code>${escapeHtml(menu.codiceMenu)}</code></td><td>${escapeHtml(group.descrizioneGruppo)}</td><td>${escapeHtml(menu.ordineMenu)}</td><td>${escapeHtml(typeLabel(menu.tipo))}</td><td>${menu.pagina ? `<code>${escapeHtml(menu.pagina)}</code>` : '<span class=\"muted\">Non indicata</span>'}</td><td class=\"row-actions\"><button type=\"button\" data-menu-edit=\"${escapeHtml(menu.codiceMenu)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-menu-delete=\"${escapeHtml(menu.codiceMenu)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"8\" class=\"muted\">Nessun menu configurato.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Tabella del catalogo tipi menu con azioni di modifica ed eliminazione. */\nfunction menuTypeTable(types: MenuTypeEntity[]): string {\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Codice</th><th>Descrizione</th><th></th></tr></thead><tbody>${types.map((type) => `<tr><td><code>${escapeHtml(type.codiceTipo)}</code></td><td>${escapeHtml(type.descrizioneTipo || '\\u2014')}</td><td class=\"row-actions\"><button type=\"button\" data-type-edit=\"${escapeHtml(type.codiceTipo)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-type-delete=\"${escapeHtml(type.codiceTipo)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"3\" class=\"muted\">Nessun tipo menu.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Gestione dei gruppi: elenco, creazione, modifica, eliminazione e toggle. */\nasync function showMenuGroups(): Promise<void> {\n const groups = result(await getGroupsWithMenus({ includeDisabled: true })) as GroupWithMenusEntity[];\n render(`<div class=\"toolbar\"><button id=\"new-group\">Nuovo gruppo</button><button id=\"reload-groups\" class=\"secondary\">Aggiorna</button></div>\n <h2>Gruppi di menu</h2><p class=\"form-help\">Raggruppano i menu nella navigazione e ne definiscono l'ordine. Un gruppo si elimina solo se non contiene menu.</p>\n ${menuGroupsTable(groups)}`);\n byId('new-group').onclick = () => showMenuGroupForm();\n byId('reload-groups').onclick = () => handleAction(showMenuGroups);\n document.querySelectorAll<HTMLInputElement>('[data-group]').forEach((input) => {\n input.onchange = () => handleAction(async () => {\n await setGroupEnabled(input.dataset.group ?? '', { enabled: input.checked });\n showNotice('Gruppo aggiornato.');\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-group-edit]').forEach((button) => {\n button.onclick = () => showMenuGroupForm(groups.find((group) => group.codiceGruppo === button.dataset.groupEdit));\n });\n document.querySelectorAll<HTMLButtonElement>('[data-group-delete]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il gruppo ${button.dataset.groupDelete}? Operazione possibile solo se non contiene menu.`)) return;\n await deleteMenuGroup(button.dataset.groupDelete ?? '');\n showNotice('Gruppo eliminato.');\n await showMenuGroups();\n });\n });\n}\n\n/** Gestione dei menu: elenco piatto filtrabile, creazione, modifica, eliminazione e toggle. */\nasync function showMenuItems(): Promise<void> {\n const [groupsResponse, typesResponse] = await Promise.all([\n getGroupsWithMenus({ includeDisabled: true }),\n getMenuTypes(),\n ]);\n const groups = result(groupsResponse) as GroupWithMenusEntity[];\n const menuTypes = result(typesResponse) as MenuTypeEntity[];\n const entries = groups.flatMap((group) => group.menus.map((menu) => ({ menu, group })));\n render(`<div class=\"toolbar\"><button id=\"new-menu\">Nuovo menu</button><button id=\"reload-menus\" class=\"secondary\">Aggiorna</button><label class=\"inline-field\">Filtra per gruppo<select id=\"menu-group-filter\"><option value=\"\">Tutti i gruppi</option>${groups.map((group) => `<option value=\"${escapeHtml(group.codiceGruppo)}\">${escapeHtml(group.descrizioneGruppo)}</option>`).join('')}</select></label></div>\n <h2>Menu</h2><p class=\"form-help\">Voci di navigazione. L'eliminazione rimuove anche i grant utente e le associazioni ai ruoli.</p>\n ${menusTable(entries, menuTypes)}`);\n byId('new-menu').onclick = () => showMenuForm(undefined, groups, menuTypes);\n byId('reload-menus').onclick = () => handleAction(showMenuItems);\n const groupFilter = document.getElementById('menu-group-filter') as HTMLSelectElement | null;\n if (groupFilter) {\n groupFilter.onchange = () => {\n const selected = groupFilter.value;\n document.querySelectorAll<HTMLTableRowElement>('[data-menu-group]').forEach((row) => {\n row.hidden = selected !== '' && row.dataset.menuGroup !== selected;\n });\n };\n }\n document.querySelectorAll<HTMLInputElement>('[data-menu]').forEach((input) => {\n input.onchange = () => handleAction(async () => {\n await setMenuEnabled(input.dataset.menu ?? '', { enabled: input.checked });\n showNotice('Menu aggiornato.');\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-menu-edit]').forEach((button) => {\n button.onclick = () => showMenuForm(entries.find((entry) => entry.menu.codiceMenu === button.dataset.menuEdit)?.menu, groups, menuTypes);\n });\n document.querySelectorAll<HTMLButtonElement>('[data-menu-delete]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il menu ${button.dataset.menuDelete}? Verranno rimossi anche i grant utente e le associazioni ai ruoli.`)) return;\n await deleteMenu(button.dataset.menuDelete ?? '');\n showNotice('Menu eliminato.');\n await showMenuItems();\n });\n });\n}\n\n/** Gestione dei tipi menu: elenco, creazione, modifica ed eliminazione. */\nasync function showMenuTypes(): Promise<void> {\n const menuTypes = result(await getMenuTypes()) as MenuTypeEntity[];\n render(`<div class=\"toolbar\"><button id=\"new-menu-type\">Nuovo tipo menu</button><button id=\"reload-menu-types\" class=\"secondary\">Aggiorna</button></div>\n <h2>Tipi menu</h2><p class=\"form-help\">Classificano i menu (es. amministrazione, operatività). Un tipo si elimina solo se non è usato da alcun menu.</p>\n ${menuTypeTable(menuTypes)}`);\n byId('new-menu-type').onclick = () => showMenuTypeForm();\n byId('reload-menu-types').onclick = () => handleAction(showMenuTypes);\n document.querySelectorAll<HTMLButtonElement>('[data-type-edit]').forEach((button) => {\n button.onclick = () => showMenuTypeForm(menuTypes.find((type) => type.codiceTipo === button.dataset.typeEdit));\n });\n document.querySelectorAll<HTMLButtonElement>('[data-type-delete]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il tipo menu ${button.dataset.typeDelete}? Operazione possibile solo se nessun menu lo utilizza.`)) return;\n await deleteMenuType(button.dataset.typeDelete ?? '');\n showNotice('Tipo menu eliminato.');\n await showMenuTypes();\n });\n });\n}\n\n/** Form di creazione/modifica di un gruppo menu. */\nfunction showMenuGroupForm(group?: GroupWithMenusEntity): void {\n const isExisting = group !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} gruppo menu</h2>\n <form id=\"group-form\">\n <label>Codice gruppo ${helpDot('menu-group-code')}<input name=\"codiceGruppo\" maxlength=\"1\" value=\"${escapeHtml(group?.codiceGruppo)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Un solo carattere, es. <code>A</code>. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"descrizioneGruppo\" maxlength=\"100\" value=\"${escapeHtml(group?.descrizioneGruppo)}\" required></label>\n <label>Ordine ${helpDot('menu-group-order')}<input name=\"ordineGruppo\" type=\"number\" value=\"${group?.ordineGruppo ?? ''}\"><span class=\"form-help\">Usato per ordinare i gruppi nella navigazione.</span></label>\n <label class=\"check\"><input name=\"enabled\" type=\"checkbox\" ${group?.enabled !== false ? 'checked' : ''}> Gruppo abilitato ${helpDot('menu-group-enabled')}</label>\n <button>${isExisting ? 'Salva gruppo' : 'Crea gruppo'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showMenuGroups);\n const form = document.getElementById('group-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const payload = {\n descrizioneGruppo: values.descrizioneGruppo || undefined,\n ordineGruppo: values.ordineGruppo ? Number(values.ordineGruppo) : undefined,\n enabled: new FormData(eventForm(event)).has('enabled'),\n };\n if (isExisting) await updateMenuGroup(group!.codiceGruppo, payload);\n else await createMenuGroup({ codiceGruppo: values.codiceGruppo ?? '', ...payload });\n showNotice(isExisting ? 'Gruppo aggiornato.' : 'Gruppo creato.');\n await showMenuGroups();\n });\n };\n }\n}\n\n/** Form di creazione/modifica di un menu, con selettori di gruppo e tipo. */\nfunction showMenuForm(menu: MenuEntity | undefined, groups: GroupWithMenusEntity[], menuTypes: MenuTypeEntity[]): void {\n const isExisting = menu !== undefined;\n const groupOptions = groups.map((group) => `<option value=\"${escapeHtml(group.codiceGruppo)}\" ${menu?.codiceGruppo === group.codiceGruppo ? 'selected' : ''}>${escapeHtml(group.codiceGruppo)} \\u2013 ${escapeHtml(group.descrizioneGruppo)}</option>`).join('');\n const typeOptions = `<option value=\"\">Nessun tipo</option>${menuTypes.map((type) => `<option value=\"${escapeHtml(type.codiceTipo)}\" ${menu?.tipo === type.codiceTipo ? 'selected' : ''}>${escapeHtml(type.codiceTipo)} \\u2013 ${escapeHtml(type.descrizioneTipo || '')}</option>`).join('')}`;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} menu</h2>\n <form id=\"menu-form\">\n <label>Codice menu ${helpDot('menu-code')}<input name=\"codiceMenu\" maxlength=\"20\" value=\"${escapeHtml(menu?.codiceMenu)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Chiave tecnica, es. <code>MNU001</code>. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"descrizioneMenu\" maxlength=\"100\" value=\"${escapeHtml(menu?.descrizioneMenu)}\" required></label>\n <label>Gruppo ${helpDot('menu-group-select')}<select name=\"codiceGruppo\" required>${groupOptions}</select><span class=\"form-help\">Crea prima un gruppo se non ne esistono.</span></label>\n <label>Tipo menu ${helpDot('menu-type-select')}<select name=\"tipo\">${typeOptions}</select></label>\n <label>Icona ${helpDot('menu-icon')}<input name=\"icona\" maxlength=\"50\" value=\"${escapeHtml(menu?.icona)}\"><span class=\"form-help\">Identificatore icona usato dalla UI host.</span></label>\n <label>Pagina ${helpDot('menu-page')}<input name=\"pagina\" maxlength=\"50\" value=\"${escapeHtml(menu?.pagina)}\"><span class=\"form-help\">Percorso o pagina associata al menu.</span></label>\n <label>Ordine ${helpDot('menu-order')}<input name=\"ordineMenu\" type=\"number\" value=\"${menu?.ordineMenu ?? ''}\"></label>\n <label>Menu di riferimento ${helpDot('menu-rifmenu')}<input name=\"rifMenu\" maxlength=\"20\" value=\"${escapeHtml((menu as (MenuEntity & { rifMenu?: string }) | undefined)?.rifMenu)}\"><span class=\"form-help\">Codice di un menu padre, opzionale.</span></label>\n <label>Nota ${helpDot('menu-note')}<textarea name=\"note\" rows=\"3\" maxlength=\"1000\">${escapeHtml(menu?.note)}</textarea></label>\n <label class=\"check\"><input name=\"enabled\" type=\"checkbox\" ${menu?.enabled !== false ? 'checked' : ''}> Menu abilitato ${helpDot('menu-enabled')}</label>\n <button>${isExisting ? 'Salva menu' : 'Crea menu'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showMenuItems);\n const form = document.getElementById('menu-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const payload = {\n descrizioneMenu: values.descrizioneMenu || undefined,\n codiceGruppo: values.codiceGruppo ?? '',\n tipo: values.tipo || undefined,\n icona: values.icona || undefined,\n pagina: values.pagina || undefined,\n ordineMenu: values.ordineMenu ? Number(values.ordineMenu) : undefined,\n rifMenu: values.rifMenu || undefined,\n note: values.note || undefined,\n enabled: new FormData(eventForm(event)).has('enabled'),\n };\n if (isExisting) await updateMenu(menu!.codiceMenu, payload);\n else await createMenu({ codiceMenu: values.codiceMenu ?? '', ...payload });\n showNotice(isExisting ? 'Menu aggiornato.' : 'Menu creato.');\n await showMenuItems();\n });\n };\n }\n}\n\n/** Form di creazione/modifica di un tipo menu. */\nfunction showMenuTypeForm(type?: MenuTypeEntity): void {\n const isExisting = type !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} tipo menu</h2>\n <form id=\"menu-type-form\">\n <label>Codice tipo ${helpDot('menu-type-code')}<input name=\"codiceTipo\" maxlength=\"1\" value=\"${escapeHtml(type?.codiceTipo)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Un solo carattere, es. <code>A</code>. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"descrizioneTipo\" maxlength=\"20\" value=\"${escapeHtml(type?.descrizioneTipo)}\"></label>\n <button>${isExisting ? 'Salva tipo' : 'Crea tipo'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showMenuTypes);\n const form = document.getElementById('menu-type-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n if (isExisting) await updateMenuType(type!.codiceTipo, { descrizioneTipo: values.descrizioneTipo || undefined });\n else await createMenuType({ codiceTipo: values.codiceTipo ?? '', descrizioneTipo: values.descrizioneTipo || undefined });\n showNotice(isExisting ? 'Tipo menu aggiornato.' : 'Tipo menu creato.');\n await showMenuTypes();\n });\n };\n }\n}\n\n/** Tabella del catalogo tipi filtro con azioni di modifica ed eliminazione. */\nfunction filterTypeRows(types: TipoFiltro[]): string {\n return `<div class=\"menu-table-wrap\"><table><thead><tr><th>Codice</th><th>Descrizione</th><th>Campo</th><th>Abilitato</th><th></th></tr></thead><tbody>${types.map((type) => `<tr class=\"${type.flgEnabled === 0 ? 'is-disabled' : ''}\"><td><code>${escapeHtml(type.tipFil)}</code></td><td>${escapeHtml(type.desFil || '\\u2014')}</td><td>${escapeHtml(type.fldFil || '\\u2014')}</td><td>${type.flgEnabled === 0 ? 'No' : 'Si'}</td><td class=\"row-actions\"><button type=\"button\" data-filter-type-edit=\"${escapeHtml(type.tipFil)}\">Modifica</button><button type=\"button\" class=\"danger-button\" data-filter-type-delete=\"${escapeHtml(type.tipFil)}\">Elimina</button></td></tr>`).join('') || '<tr><td colspan=\"5\" class=\"muted\">Nessun tipo filtro.</td></tr>'}</tbody></table></div>`;\n}\n\n/** Filtri utente: lettura e salvataggio dei filtri applicativi per singolo utente. */\nasync function showFilters(): Promise<void> {\n const users = await loadUsers();\n render(`<h2>Filtri utente</h2><p class=\"form-help\">Filtri applicativi salvati per singolo utente.</p><form id=\"filters\"><label>Utente ${helpDot('filters-user')}<select name=\"codUte\">${users.map(({ utente }) => `<option value=\"${utente.codiceUtente}\">${escapeHtml(utente.email)}</option>`).join('')}</select><span class=\"form-help\">Salvati per l'utente selezionato.</span></label><label>Filtro JSON ${helpDot('filters-json')}<textarea name=\"json\" rows=\"12\">{}</textarea><span class=\"form-help\">Usa Carica per partire dalla struttura esistente.</span></label><button name=\"action\" value=\"load\">Carica</button><button name=\"action\" value=\"save\">Salva</button></form>`);\n const filtersForm = document.getElementById('filters') as HTMLFormElement | null;\n if (filtersForm) filtersForm.onsubmit = async (event) => { event.preventDefault(); const form = eventForm(event); const action = (event.submitter as HTMLButtonElement | null)?.value; const code = Number(formValues(form).codUte); if (action === 'load') { const filters = result<FiltriUtente[]>(await getFiltriUtente({ codUte: code })); (form.elements.namedItem('json') as HTMLTextAreaElement).value = JSON.stringify(filters[0] ?? { codUte: code }, null, 2); } else { const parsed = JSON.parse(formValues(form).json ?? '{}') as Omit<FiltriUtente, 'codUte'>; await saveFiltriUtente({ ...parsed, codUte: code }); showNotice('Filtri salvati.'); } };\n}\n\n/** Tipi filtro: catalogo dei tipi con creazione, modifica ed eliminazione. */\nasync function showFilterTypes(): Promise<void> {\n const filterTypes = result(await getTipiFiltro()) as TipoFiltro[];\n render(`<div class=\"toolbar\"><button id=\"new-filter-type\">Nuovo tipo filtro</button><button id=\"reload-filter-types\" class=\"secondary\">Aggiorna</button></div>\n <h2>Tipi filtro</h2><p class=\"form-help\">Catalogo dei tipi usati dai filtri utente. Un tipo si elimina solo se nessun filtro lo utilizza.</p>\n ${filterTypeRows(filterTypes)}`);\n byId('new-filter-type').onclick = () => showFilterTypeForm();\n byId('reload-filter-types').onclick = () => handleAction(showFilterTypes);\n document.querySelectorAll<HTMLButtonElement>('[data-filter-type-edit]').forEach((button) => button.onclick = () => showFilterTypeForm(filterTypes.find((type) => String(type.tipFil) === button.dataset.filterTypeEdit)));\n document.querySelectorAll<HTMLButtonElement>('[data-filter-type-delete]').forEach((button) => button.onclick = () => handleAction(async () => {\n if (!window.confirm(`Eliminare il tipo filtro ${button.dataset.filterTypeDelete}? Operazione possibile solo se nessun filtro lo utilizza.`)) return;\n await deleteTipoFiltro(Number(button.dataset.filterTypeDelete));\n showNotice('Tipo filtro eliminato.');\n await showFilterTypes();\n }));\n}\n\n/** Form di creazione/modifica di un tipo filtro. */\nfunction showFilterTypeForm(type?: TipoFiltro): void {\n const isExisting = type !== undefined;\n render(`<button id=\"back\" type=\"button\">Indietro</button><h2>${isExisting ? 'Modifica' : 'Nuovo'} tipo filtro</h2>\n <form id=\"filter-type-form\">\n <label>Codice ${helpDot('filter-type-code')}<input name=\"tipFil\" type=\"number\" value=\"${escapeHtml(type?.tipFil)}\" ${isExisting ? 'readonly' : ''} required><span class=\"form-help\">Identificativo numerico. Immutabile dopo la creazione.</span></label>\n <label>Descrizione<input name=\"desFil\" maxlength=\"20\" value=\"${escapeHtml(type?.desFil)}\"></label>\n <label>Campo ${helpDot('filter-type-field')}<input name=\"fldFil\" maxlength=\"20\" value=\"${escapeHtml(type?.fldFil)}\"><span class=\"form-help\">Nome del campo applicativo associato al filtro.</span></label>\n <label class=\"check\"><input name=\"flgEnabled\" type=\"checkbox\" ${type?.flgEnabled !== 0 ? 'checked' : ''}> Abilitato ${helpDot('filter-type-enabled')}</label>\n <button>${isExisting ? 'Salva tipo' : 'Crea tipo'}</button>\n </form>`);\n byId('back').onclick = () => handleAction(showFilterTypes);\n const form = document.getElementById('filter-type-form') as HTMLFormElement | null;\n if (form) {\n form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const payload = {\n desFil: values.desFil || undefined,\n fldFil: values.fldFil || undefined,\n flgEnabled: (new FormData(eventForm(event)).has('flgEnabled') ? 1 : 0) as 0 | 1,\n };\n if (isExisting) await updateTipoFiltro(type!.tipFil, payload);\n else await createTipoFiltro({ tipFil: Number(values.tipFil), ...payload });\n showNotice(isExisting ? 'Tipo filtro aggiornato.' : 'Tipo filtro creato.');\n await showFilterTypes();\n });\n };\n }\n}\n\nfunction scopeList(scopes: string[] | undefined): string {\n return (scopes ?? []).join(', ') || 'nessuno';\n}\n\nfunction serviceTokenExpiry(token: ServiceTokenDto): string {\n if (!token.expiresAt) return 'nessuna';\n const date = new Date(token.expiresAt);\n const days = Math.ceil((date.getTime() - Date.now()) / 86_400_000);\n const label = escapeHtml(date.toLocaleString());\n if (days < 0) return `${label}<br><span class=\"error\">scaduto</span>`;\n if (days <= 7) return `${label}<br><span class=\"error\">scade tra ${days} g</span>`;\n return label;\n}\n\nfunction serviceTokenRows(tokens: ServiceTokenDto[], includeRevoked: boolean): string {\n const lastUsed = (token: ServiceTokenDto) => token.lastUsedAt\n ? `<span title=\"${escapeHtml(token.lastUsedIp ?? '')}\">${escapeHtml(new Date(token.lastUsedAt).toLocaleString())}</span>${token.lastUsedIp ? `<br><span class=\"muted\">${escapeHtml(token.lastUsedIp)}</span>` : ''}`\n : 'mai';\n const status = (token: ServiceTokenDto) => token.revoked\n ? `Revocato${token.revokedBy ? ` da #${escapeHtml(token.revokedBy)}` : ''}${token.revokedAt ? `<br><span class=\"muted\">${escapeHtml(new Date(token.revokedAt).toLocaleString())}</span>` : ''}`\n : 'Attivo';\n return tokens.map((token) => `<tr class=\"${token.revoked ? 'is-disabled' : ''}\"><td><strong>${escapeHtml(token.label)}</strong><br><code>${escapeHtml(token.tokenId)}</code></td><td>${escapeHtml(scopeList(token.scopes))}</td><td>${escapeHtml(token.createdAt ? new Date(token.createdAt).toLocaleString() : '')}</td><td>${serviceTokenExpiry(token)}</td><td>${lastUsed(token)}</td><td>${status(token)}</td><td>${token.revoked ? '' : `<button type=\"button\" data-rotate=\"${escapeHtml(token.tokenId)}\">Ruota</button> <button type=\"button\" class=\"danger-button\" data-revoke=\"${escapeHtml(token.tokenId)}\">Revoca</button>`}</td></tr>`).join('') || `<tr><td colspan=\"7\">Nessun token ${includeRevoked ? '' : 'attivo'}.</td></tr>`;\n}\n\n/** Gestione dei token di servizio: elenco, creazione, rotazione e revoca. */\nasync function showServiceTokens(includeRevoked = false): Promise<void> {\n const tokens = result<ServiceTokenDto[]>(await getServiceTokens({ includeRevoked }));\n render(`<div class=\"toolbar\"><button id=\"new-token\">Nuovo token</button><button id=\"toggle-revoked\" class=\"secondary\">${includeRevoked ? 'Nascondi revocati' : 'Mostra revocati'}</button></div><h2>Token di servizio</h2><p class=\"form-help\">Credenziali macchina-a-macchina per chiamate tecniche, non legate a un utente. Il segreto e mostrato <strong>una sola volta</strong> alla creazione: conservalo come variabile d'ambiente/secret. Autenticazione: <code>Authorization: Bearer &lt;token&gt;</code>.</p><table><thead><tr><th>Token</th><th>Scope</th><th>Creato</th><th>Scade</th><th>Ultimo uso</th><th>Stato</th><th></th></tr></thead><tbody>${serviceTokenRows(tokens, includeRevoked)}</tbody></table>`);\n byId('new-token').onclick = () => showServiceTokenForm();\n byId('toggle-revoked').onclick = () => handleAction(() => showServiceTokens(!includeRevoked));\n document.querySelectorAll<HTMLButtonElement>('[data-revoke]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n if (!window.confirm('Revocare definitivamente questo token? Le integrazioni che lo usano smetteranno di funzionare.')) return;\n await revokeServiceToken(button.dataset.revoke ?? '');\n showNotice('Token di servizio revocato.');\n await showServiceTokens(includeRevoked);\n });\n });\n document.querySelectorAll<HTMLButtonElement>('[data-rotate]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n const issued = result<IssuedServiceTokenDto>(await rotateServiceToken(button.dataset.rotate ?? ''));\n showIssuedServiceToken(issued);\n });\n });\n}\n\nfunction showServiceTokenForm(): void {\n render(`<button id=\"back\" type=\"button\" class=\"secondary\">Indietro</button><h2>Nuovo token di servizio</h2><form id=\"token-form\"><label>Descrizione ${helpDot('token-label')}<input name=\"label\" required maxlength=\"100\"><span class=\"form-help\">Identifica l'integrazione, ad esempio \"IA - produzione\".</span></label><label>Scope ${helpDot('token-scopes')}<input name=\"scopes\" placeholder=\"ia, chat\"><span class=\"form-help\">Separati da virgola (lettere, numeri, ':', '_', '-'). Definiscono cosa può fare il token.</span></label><label>Durata in giorni ${helpDot('token-ttl')}<input name=\"ttlDays\" type=\"number\" min=\"1\" step=\"1\"><span class=\"form-help\">Opzionale. Lascia vuoto per un token senza scadenza.</span></label><button>Crea token</button></form>`);\n byId('back').onclick = () => void show('tokens');\n const form = document.getElementById('token-form') as HTMLFormElement | null;\n if (form) form.onsubmit = (event) => {\n event.preventDefault();\n handleAction(async () => {\n const values = formValues(eventForm(event));\n const scopes = (values.scopes ?? '').split(',').map((scope) => scope.trim()).filter(Boolean);\n const ttlDays = values.ttlDays ? Number(values.ttlDays) : undefined;\n const issued = result<IssuedServiceTokenDto>(await createServiceToken({\n label: values.label ?? '',\n scopes: scopes.length ? scopes : undefined,\n ttlDays: Number.isFinite(ttlDays) ? ttlDays : undefined,\n }));\n showIssuedServiceToken(issued);\n });\n };\n}\n\nfunction showIssuedServiceToken(issued: IssuedServiceTokenDto): void {\n render(`<h2>Token creato</h2><p class=\"form-help\">Copia ora il token: <strong>non sara piu mostrato</strong>. Salvalo come variabile d'ambiente/secret del servizio chiamante e non inserirlo nel body delle richieste.</p><div class=\"token-reveal\"><code id=\"issued-token\">${escapeHtml(issued.token)}</code><button id=\"copy-token\" type=\"button\">Copia</button></div><dl class=\"entity-metadata\"><div><dt>Descrizione</dt><dd>${escapeHtml(issued.label)}</dd></div><div><dt>Scope</dt><dd>${escapeHtml(scopeList(issued.scopes))}</dd></div><div><dt>Scade</dt><dd>${issued.expiresAt ? escapeHtml(new Date(issued.expiresAt).toLocaleString()) : 'nessuna'}</dd></div></dl><button id=\"done-token\">Ho copiato, chiudi</button>`);\n byId('copy-token').onclick = () => handleAction(async () => { await navigator.clipboard.writeText(issued.token); showNotice('Token copiato negli appunti.'); });\n byId('done-token').onclick = () => void show('tokens');\n}\n\n/** Rende un singolo blocco della wiki in HTML sicuro. */\nfunction renderWikiBlock(block: WikiBlock): string {\n switch (block.kind) {\n case 'p':\n return `<p>${escapeHtml(block.text)}</p>`;\n case 'h':\n return `<h3>${escapeHtml(block.text)}</h3>`;\n case 'list': {\n const tag = block.ordered ? 'ol' : 'ul';\n return `<${tag}>${block.items.map((item) => `<li>${escapeHtml(item)}</li>`).join('')}</${tag}>`;\n }\n case 'code': {\n const variant = block.variant ? ` is-${block.variant}` : '';\n const title = block.title ? `<span class=\"wiki-code-title\">${escapeHtml(block.title)}</span>` : '';\n return `<figure class=\"wiki-code${variant}\"><figcaption class=\"wiki-code-head\">${title}<span class=\"wiki-code-lang\">${escapeHtml(block.language)}</span><button type=\"button\" class=\"wiki-copy\" data-wiki-copy aria-label=\"Copia il codice\">Copia</button></figcaption><pre><code>${escapeHtml(block.code)}</code></pre></figure>`;\n }\n case 'callout':\n return `<div class=\"wiki-callout is-${block.tone}\">${block.title ? `<strong>${escapeHtml(block.title)}</strong>` : ''}<p>${escapeHtml(block.text)}</p></div>`;\n case 'table':\n return `<div class=\"wiki-table-wrap\"><table><thead><tr>${block.head.map((cell) => `<th>${escapeHtml(cell)}</th>`).join('')}</tr></thead><tbody>${block.rows.map((row) => `<tr>${row.map((cell) => `<td>${escapeHtml(cell)}</td>`).join('')}</tr>`).join('')}</tbody></table></div>`;\n default:\n return '';\n }\n}\n\n/** Collega i pulsanti \"Copia\" dei blocchi di codice contenuti in `root`. */\nfunction bindCopyButtons(root: ParentNode): void {\n root.querySelectorAll<HTMLButtonElement>('[data-wiki-copy]').forEach((button) => {\n button.onclick = () => handleAction(async () => {\n const codeEl = button.closest('.wiki-code')?.querySelector('code');\n await navigator.clipboard.writeText(codeEl?.textContent ?? '');\n showNotice('Codice copiato negli appunti.');\n });\n });\n}\n\n/** Icona \"i\" che apre la miniguida contestuale del campo (trigger di popover non-modale). */\nfunction helpDot(key: string): string {\n const title = HELP[key]?.title ?? key;\n return `<button type=\"button\" class=\"help-dot\" data-help=\"${escapeHtml(key)}\" aria-haspopup=\"dialog\" aria-expanded=\"false\" aria-controls=\"accessi-help-popover\" aria-label=\"Informazioni: ${escapeHtml(title)}\" title=\"Informazioni\">i</button>`;\n}\n\nlet helpPopover: HTMLElement | null = null;\nlet helpAnchor: HTMLElement | null = null;\n\nfunction ensureHelpPopover(): HTMLElement {\n if (!helpPopover) {\n helpPopover = document.createElement('div');\n helpPopover.className = 'help-popover';\n helpPopover.id = 'accessi-help-popover';\n helpPopover.hidden = true;\n helpPopover.setAttribute('role', 'dialog');\n helpPopover.setAttribute('aria-modal', 'false');\n helpPopover.tabIndex = -1;\n document.body.appendChild(helpPopover);\n }\n return helpPopover;\n}\n\n/** Chiude il popover; `restoreFocus` riporta il focus al trigger quando la chiusura e esplicita. */\nfunction closeHelp(restoreFocus = true): void {\n if (!helpPopover) return;\n const wasOpen = !helpPopover.hidden;\n helpPopover.hidden = true;\n const anchor = helpAnchor;\n if (anchor) anchor.setAttribute('aria-expanded', 'false');\n helpAnchor = null;\n if (restoreFocus && wasOpen && anchor && document.contains(anchor)) anchor.focus();\n}\n\n/** Posiziona il popover sotto l'icona, correggendo i bordi dello schermo. */\nfunction positionHelp(): void {\n if (!helpPopover || !helpAnchor || helpPopover.hidden) return;\n const rect = helpAnchor.getBoundingClientRect();\n const width = helpPopover.offsetWidth;\n const height = helpPopover.offsetHeight;\n const margin = 8;\n const left = Math.max(margin, Math.min(rect.right - width, window.innerWidth - width - margin));\n let top = rect.bottom + 6;\n if (top + height > window.innerHeight - margin) {\n const above = rect.top - height - 6;\n top = above >= margin ? above : Math.max(margin, window.innerHeight - height - margin);\n }\n helpPopover.style.left = `${left}px`;\n helpPopover.style.top = `${top}px`;\n}\n\nfunction openHelp(anchor: HTMLElement): void {\n const entry = HELP[anchor.dataset.help ?? ''];\n if (!entry) return;\n const popover = ensureHelpPopover();\n if (helpAnchor && helpAnchor !== anchor) helpAnchor.setAttribute('aria-expanded', 'false');\n popover.innerHTML = `<div class=\"help-popover-head\"><h4 id=\"accessi-help-title\">${escapeHtml(entry.title)}</h4><button type=\"button\" class=\"help-close\" data-help-close aria-label=\"Chiudi\">&times;</button></div><div class=\"help-popover-body\">${entry.blocks.map(renderWikiBlock).join('')}</div>`;\n popover.setAttribute('aria-labelledby', 'accessi-help-title');\n popover.hidden = false;\n helpAnchor = anchor;\n anchor.setAttribute('aria-expanded', 'true');\n bindCopyButtons(popover);\n positionHelp();\n (popover.querySelector<HTMLElement>('.help-close') ?? popover).focus();\n}\n\n/** Indice laterale della wiki, raggruppato per area. */\nfunction wikiIndexMarkup(selectedId: string): string {\n return wikiGroups().map(({ group, sections }) => `<div class=\"wiki-index-group\"><span class=\"wiki-index-group-title\">${escapeHtml(group)}</span><ul>${sections.map((section) => `<li><a href=\"#wiki-${escapeHtml(section.id)}\" data-wiki=\"${escapeHtml(section.id)}\"${section.id === selectedId ? ' aria-current=\"page\"' : ''}>${escapeHtml(section.title)}</a></li>`).join('')}</ul></div>`).join('');\n}\n\n/** Wiki integrata: indice, contenuti e copia del digest per l'IA. */\nasync function showWiki(sectionId?: string): Promise<void> {\n const hashId = /^#wiki-([a-z0-9-]+)$/.exec(window.location.hash)?.[1];\n const requested = sectionId ?? hashId;\n const selected = WIKI_SECTIONS.find((section) => section.id === requested) ?? WIKI_SECTIONS[0];\n if (!selected) return;\n\n render(`<div class=\"wiki\">\n <aside class=\"wiki-index\">\n <div class=\"wiki-index-head\"><strong>Indice</strong><button type=\"button\" id=\"wiki-copy-ai\">Copia per AI</button></div>\n ${wikiIndexMarkup(selected.id)}\n </aside>\n <article class=\"wiki-content\">\n <header class=\"wiki-section-head\"><h2>${escapeHtml(selected.title)}</h2><p>${escapeHtml(selected.summary)}</p></header>\n ${selected.blocks.map(renderWikiBlock).join('')}\n </article>\n </div>`);\n\n document.querySelectorAll<HTMLAnchorElement>('[data-wiki]').forEach((link) => {\n link.onclick = (event) => {\n event.preventDefault();\n const id = link.dataset.wiki ?? '';\n window.history.replaceState(null, '', `${routePath('wiki')}#wiki-${id}`);\n showWiki(id);\n };\n });\n bindCopyButtons(document);\n byId('wiki-copy-ai').onclick = () => handleAction(async () => {\n await navigator.clipboard.writeText(buildAiDigest());\n showNotice('Documentazione per AI copiata negli appunti.');\n });\n}\n\n/** Rendering minimale di Markdown (heading, liste, codice, grassetto/code inline). */\nfunction inlineMarkdown(text: string): string {\n return escapeHtml(text)\n .replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/`([^`]+)`/g, '<code>$1</code>');\n}\n\nfunction renderMarkdown(markdown: string): string {\n const lines = markdown.replace(/\\r\\n/g, '\\n').split('\\n');\n const html: string[] = [];\n let inList = false;\n let inCode = false;\n const closeList = () => { if (inList) { html.push('</ul>'); inList = false; } };\n\n for (const line of lines) {\n if (line.startsWith('```')) {\n closeList();\n html.push(inCode ? '</code></pre>' : '<pre class=\"markdown-code\"><code>');\n inCode = !inCode;\n continue;\n }\n if (inCode) { html.push(escapeHtml(line)); continue; }\n\n const heading = /^(#{1,4})\\s+(.*)$/.exec(line);\n if (heading) { closeList(); const level = (heading[1] ?? '').length; html.push(`<h${level}>${inlineMarkdown(heading[2] ?? '')}</h${level}>`); continue; }\n\n const bullet = /^\\s*[-*]\\s+(.*)$/.exec(line);\n if (bullet) { if (!inList) { html.push('<ul>'); inList = true; } html.push(`<li>${inlineMarkdown(bullet[1] ?? '')}</li>`); continue; }\n\n if (line.trim() === '') { closeList(); continue; }\n closeList();\n html.push(`<p>${inlineMarkdown(line)}</p>`);\n }\n\n if (inCode) html.push('</code></pre>');\n closeList();\n return html.join('');\n}\n\nasync function showChangelog(): Promise<void> {\n render(`<div class=\"wiki\"><article class=\"wiki-content markdown-body\">\n <header class=\"wiki-section-head\"><h2>Changelog</h2><p>Novita e modifiche rilevanti del modulo Accessi.</p></header>\n ${renderMarkdown(changelogMarkdown)}\n </article></div>`);\n}\n\nfunction downloadTextFile(fileName: string, content: string): void {\n const blob = new Blob([content], { type: 'text/plain;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n}\n\nasync function showSql(): Promise<void> {\n const schema = result<SchemaDdlResult>(await getSchema());\n const copy = (text: string, notice: string) => () => handleAction(async () => {\n await navigator.clipboard.writeText(text);\n showNotice(notice);\n });\n\n render(`<div class=\"toolbar\"><button id=\"sql-copy-all\">Copia tutto</button><button id=\"sql-download\" class=\"secondary\">Scarica .sql</button><button id=\"sql-reload\" class=\"secondary\">Aggiorna</button></div>\n <h2>SQL dello schema</h2>\n <p class=\"form-help\">DDL generato dallo schema Accessi <strong>${escapeHtml(schema.version)}</strong>. Usalo per creare le entita su una nuova installazione (database vuoto).</p>\n <div class=\"entity-summary\">\n <span><strong>${schema.presentTables.length}</strong> tabelle presenti</span>\n <span><strong>${schema.presentGenerators.length}</strong> generatori</span>\n <span><strong>${schema.extraTables.length}</strong> tabelle extra fuori schema Accessi</span>\n </div>\n ${schema.extraTables.length ? `<p class=\"form-help\">Tabelle presenti non gestite da Accessi: <code>${schema.extraTables.map((name) => escapeHtml(name)).join(', ')}</code></p>` : ''}\n ${schema.sections.map((section) => `<section class=\"sql-section\"><div class=\"sql-section-head\"><h3>${escapeHtml(section.title)}</h3><button type=\"button\" class=\"secondary\" data-sql-copy=\"${escapeHtml(section.id)}\">Copia sezione</button></div><pre class=\"markdown-code\"><code>${escapeHtml(section.sql)}</code></pre></section>`).join('')}`);\n\n byId('sql-copy-all').onclick = copy(schema.script, 'Script SQL completo copiato.');\n byId('sql-download').onclick = () => downloadTextFile(`accessi-schema-${schema.version}.sql`, schema.script);\n byId('sql-reload').onclick = () => handleAction(showSql);\n document.querySelectorAll<HTMLButtonElement>('[data-sql-copy]').forEach((button) => {\n const section = schema.sections.find((entry) => entry.id === button.dataset.sqlCopy);\n if (section) button.onclick = copy(section.sql, `Sezione \"${section.title}\" copiata.`);\n });\n}\n\nasync function show(view: ConsoleView): Promise<void> {\n try {\n showNotice('');\n const views: Record<string, () => Promise<void>> = {\n users: showUsers,\n roles: showRoles,\n menuGroups: showMenuGroups,\n menuItems: showMenuItems,\n menuTypes: showMenuTypes,\n filterUser: showFilters,\n filterTypes: showFilterTypes,\n ssoProviders: showSsoProviders,\n ssoUsers: showSsoUsers,\n tokens: showServiceTokens,\n wiki: showWiki,\n changelog: showChangelog,\n sql: showSql,\n };\n setActiveNavigation(view);\n const renderView = views[view];\n if (!renderView) throw new Error('Sezione console non valida.');\n await renderView();\n } catch (error) {\n render('');\n showNotice(error instanceof Error ? error.message : 'Operazione non riuscita.', true);\n }\n}\n\nconst loginForm = document.getElementById('login-form') as HTMLFormElement | null;\nif (loginForm) loginForm.onsubmit = loginView;\nbyId('restart-login').onclick = resetLogin;\nconst bootstrapAdminForm = document.getElementById('bootstrap-admin-form') as HTMLFormElement | null;\nif (bootstrapAdminForm) {\n bootstrapAdminForm.onsubmit = async (event) => {\n event.preventDefault();\n const status = document.getElementById('bootstrap-admin-status');\n try {\n if (status) status.textContent = '';\n const values = formValues(bootstrapAdminForm);\n const fields = new FormData(bootstrapAdminForm);\n const created = result<BootstrapAdminResultDto>(await bootstrapAdmin({\n token: values.token ?? '',\n email: values.email ?? '',\n nome: values.nome || undefined,\n cognome: values.cognome || undefined,\n password: values.password || undefined,\n superUser: fields.has('superUser'),\n }));\n const generated = created.password ? ` Password generata (copiala ora): ${created.password}` : '';\n if (status) status.textContent = `Utente admin creato: ${created.email}.${generated} Ora accedi dal form principale.`;\n bootstrapAdminForm.reset();\n } catch (error) {\n if (status) status.textContent = error instanceof Error ? error.message : 'Creazione non riuscita.';\n }\n };\n}\nbyId<HTMLFormElement>('two-factor-form').onsubmit = async event => {\n event.preventDefault();\n if (!pendingChallenge) return;\n try {\n byId('login-error').textContent = '';\n const values = formValues(event.currentTarget as HTMLFormElement);\n await completeLoginStep(result<LoginResult>(await verifyTwoFactor({ challengeId: pendingChallenge, code: values.code ?? '' })));\n } catch (error) {\n byId('login-error').textContent = error instanceof Error ? error.message : 'Verifica non riuscita.';\n }\n};\nbyId('resend-code').onclick = async () => {\n if (!pendingChallenge) return;\n try {\n byId('login-error').textContent = '';\n await completeLoginStep(result<LoginResult>(await resendTwoFactor({ challengeId: pendingChallenge })));\n } catch (error) {\n byId('login-error').textContent = error instanceof Error ? error.message : 'Reinvio non riuscito.';\n }\n};\nbyId('logout').onclick = () => {\n resetLogin();\n token = null;\n currentUser = null;\n setAccessiConsoleToken(null);\n sessionStorage.removeItem('accessi-console-token');\n window.history.replaceState(null, '', consoleBasePath);\n void bootstrap();\n};\nbyId('nav').onclick = (event) => {\n const link = (event.target as HTMLElement).closest<HTMLAnchorElement>('a[data-view]');\n if (!link) return;\n event.preventDefault();\n handleAction(() => navigate(link.dataset.view as ConsoleView));\n};\nwindow.addEventListener('popstate', () => {\n if (token && currentUser) handleAction(() => show(viewFromLocation()));\n});\nwindow.addEventListener('accessi-console-network', (event: Event) => {\n updateLoadingState((event as CustomEvent<{ active: boolean }>).detail.active);\n});\n// Tooltip di aiuto: apertura/chiusura dall'icona \"i\", chiusura su click esterno o Esc.\ndocument.addEventListener('click', (event) => {\n const target = event.target as HTMLElement;\n const dot = target.closest<HTMLElement>('[data-help]');\n if (dot) {\n event.preventDefault();\n if (helpAnchor === dot && helpPopover && !helpPopover.hidden) {\n closeHelp();\n } else {\n openHelp(dot);\n }\n return;\n }\n if (target.closest('[data-help-close]')) {\n closeHelp();\n return;\n }\n if (helpPopover && !helpPopover.hidden && !target.closest('.help-popover')) closeHelp();\n});\nwindow.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') closeHelp();\n});\nwindow.addEventListener('resize', positionHelp);\nwindow.addEventListener('scroll', positionHelp, true);\n// Optional handoff from the hosting backend after its SSO callback. The fragment\n// contains only an opaque challenge id, never an access token or provider token.\nconst ssoChallenge = /^#two-factor=([a-f0-9]{64})$/.exec(window.location.hash)?.[1];\nif (ssoChallenge) {\n token = null;\n setAccessiConsoleToken(null);\n sessionStorage.removeItem('accessi-console-token');\n window.history.replaceState(null, '', window.location.pathname);\n finishBoot('login');\n showTwoFactor({ challengeId: ssoChallenge, resendAfterSeconds: 60 });\n} else if (token) {\n void bootstrap();\n} else {\n finishBoot('login');\n}\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emilsoftware-utilities",
3
- "version": "2.0.0-dev.38",
3
+ "version": "2.0.0-dev.39",
4
4
  "description": "Utilities for EmilSoftware",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",