emilsoftware-utilities 2.0.0-dev.22 → 2.0.0-dev.23

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.
Files changed (379) hide show
  1. package/dist/DailyFileTransport.d.ts +15 -0
  2. package/dist/DailyFileTransport.js +67 -0
  3. package/dist/DailyFileTransport.js.map +1 -0
  4. package/dist/DatabaseUpdater.js +0 -2
  5. package/dist/DatabaseUpdater.js.map +1 -1
  6. package/dist/ExecutionTimeLogger.js +2 -2
  7. package/dist/ExecutionTimeLogger.js.map +1 -1
  8. package/dist/Logger.d.ts +0 -2
  9. package/dist/Logger.js +6 -70
  10. package/dist/Logger.js.map +1 -1
  11. package/dist/Utilities.d.ts +8 -3
  12. package/dist/Utilities.js +61 -16
  13. package/dist/Utilities.js.map +1 -1
  14. package/dist/accessi-module/AccessiModule.d.ts +60 -0
  15. package/dist/accessi-module/AccessiModule.js +21 -5
  16. package/dist/accessi-module/AccessiModule.js.map +1 -1
  17. package/dist/accessi-module/Console/accessiFetch.d.ts +7 -0
  18. package/dist/accessi-module/Console/accessiFetch.js +59 -0
  19. package/dist/accessi-module/Console/accessiFetch.js.map +1 -0
  20. package/dist/accessi-module/Console/console.css +370 -0
  21. package/dist/accessi-module/Console/console.d.ts +1 -0
  22. package/dist/accessi-module/Console/console.js +1105 -0
  23. package/dist/accessi-module/Console/console.js.map +1 -0
  24. package/dist/accessi-module/Console/generated/accessiApi.d.ts +376 -0
  25. package/dist/accessi-module/Console/generated/accessiApi.js +363 -0
  26. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -0
  27. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.d.ts +27 -0
  28. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js +3 -0
  29. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js.map +1 -0
  30. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.d.ts +16 -0
  31. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.js +17 -0
  32. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.js.map +1 -0
  33. package/dist/accessi-module/Console/generated/model/actionResponse.d.ts +12 -0
  34. package/dist/accessi-module/Console/generated/model/actionResponse.js +9 -0
  35. package/dist/accessi-module/Console/generated/model/actionResponse.js.map +1 -0
  36. package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.d.ts +11 -0
  37. package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.js +3 -0
  38. package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.js.map +1 -0
  39. package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.d.ts +10 -0
  40. package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.js +9 -0
  41. package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.js.map +1 -0
  42. package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.d.ts +10 -0
  43. package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.js +3 -0
  44. package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.js.map +1 -0
  45. package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.d.ts +19 -0
  46. package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.js +9 -0
  47. package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.js.map +1 -0
  48. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.d.ts +14 -0
  49. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js +9 -0
  50. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +1 -0
  51. package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.d.ts +13 -0
  52. package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.js +9 -0
  53. package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.js.map +1 -0
  54. package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.d.ts +13 -0
  55. package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.js +9 -0
  56. package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.js.map +1 -0
  57. package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.d.ts +18 -0
  58. package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.js +3 -0
  59. package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.js.map +1 -0
  60. package/dist/accessi-module/Console/generated/model/errorResponse.d.ts +18 -0
  61. package/dist/accessi-module/Console/generated/model/errorResponse.js +9 -0
  62. package/dist/accessi-module/Console/generated/model/errorResponse.js.map +1 -0
  63. package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.d.ts +14 -0
  64. package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.js +3 -0
  65. package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.js.map +1 -0
  66. package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.d.ts +14 -0
  67. package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.js +3 -0
  68. package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.js.map +1 -0
  69. package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.d.ts +23 -0
  70. package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.js +9 -0
  71. package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.js.map +1 -0
  72. package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.d.ts +14 -0
  73. package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.js +3 -0
  74. package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.js.map +1 -0
  75. package/dist/accessi-module/Console/generated/model/federatedProviderResponse.d.ts +14 -0
  76. package/dist/accessi-module/Console/generated/model/federatedProviderResponse.js +3 -0
  77. package/dist/accessi-module/Console/generated/model/federatedProviderResponse.js.map +1 -0
  78. package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.d.ts +13 -0
  79. package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.js +9 -0
  80. package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.js.map +1 -0
  81. package/dist/accessi-module/Console/generated/model/filtriUtente.d.ts +32 -0
  82. package/dist/accessi-module/Console/generated/model/filtriUtente.js +9 -0
  83. package/dist/accessi-module/Console/generated/model/filtriUtente.js.map +1 -0
  84. package/dist/accessi-module/Console/generated/model/getFiltriResponse.d.ts +14 -0
  85. package/dist/accessi-module/Console/generated/model/getFiltriResponse.js +3 -0
  86. package/dist/accessi-module/Console/generated/model/getFiltriResponse.js.map +1 -0
  87. package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.d.ts +12 -0
  88. package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.js +9 -0
  89. package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.js.map +1 -0
  90. package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.d.ts +14 -0
  91. package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.js +3 -0
  92. package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.js.map +1 -0
  93. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.d.ts +12 -0
  94. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.js +9 -0
  95. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.js.map +1 -0
  96. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.d.ts +14 -0
  97. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.js +3 -0
  98. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.js.map +1 -0
  99. package/dist/accessi-module/Console/generated/model/getMenusResponse.d.ts +14 -0
  100. package/dist/accessi-module/Console/generated/model/getMenusResponse.js +3 -0
  101. package/dist/accessi-module/Console/generated/model/getMenusResponse.js.map +1 -0
  102. package/dist/accessi-module/Console/generated/model/getRolesResponse.d.ts +14 -0
  103. package/dist/accessi-module/Console/generated/model/getRolesResponse.js +3 -0
  104. package/dist/accessi-module/Console/generated/model/getRolesResponse.js.map +1 -0
  105. package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.d.ts +10 -0
  106. package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.js +9 -0
  107. package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.js.map +1 -0
  108. package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.d.ts +14 -0
  109. package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.js +3 -0
  110. package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.js.map +1 -0
  111. package/dist/accessi-module/Console/generated/model/getUsersParams.d.ts +24 -0
  112. package/dist/accessi-module/Console/generated/model/getUsersParams.js +9 -0
  113. package/dist/accessi-module/Console/generated/model/getUsersParams.js.map +1 -0
  114. package/dist/accessi-module/Console/generated/model/getUsersResponse.d.ts +14 -0
  115. package/dist/accessi-module/Console/generated/model/getUsersResponse.js +3 -0
  116. package/dist/accessi-module/Console/generated/model/getUsersResponse.js.map +1 -0
  117. package/dist/accessi-module/Console/generated/model/getUsersResult.d.ts +17 -0
  118. package/dist/accessi-module/Console/generated/model/getUsersResult.js +3 -0
  119. package/dist/accessi-module/Console/generated/model/getUsersResult.js.map +1 -0
  120. package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.d.ts +12 -0
  121. package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.js +9 -0
  122. package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.js.map +1 -0
  123. package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.d.ts +19 -0
  124. package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.js +3 -0
  125. package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.js.map +1 -0
  126. package/dist/accessi-module/Console/generated/model/index.d.ts +75 -0
  127. package/dist/accessi-module/Console/generated/model/index.js +92 -0
  128. package/dist/accessi-module/Console/generated/model/index.js.map +1 -0
  129. package/dist/accessi-module/Console/generated/model/loginRequest.d.ts +12 -0
  130. package/dist/accessi-module/Console/generated/model/loginRequest.js +9 -0
  131. package/dist/accessi-module/Console/generated/model/loginRequest.js.map +1 -0
  132. package/dist/accessi-module/Console/generated/model/loginResponse.d.ts +14 -0
  133. package/dist/accessi-module/Console/generated/model/loginResponse.js +3 -0
  134. package/dist/accessi-module/Console/generated/model/loginResponse.js.map +1 -0
  135. package/dist/accessi-module/Console/generated/model/loginResult.d.ts +32 -0
  136. package/dist/accessi-module/Console/generated/model/loginResult.js +3 -0
  137. package/dist/accessi-module/Console/generated/model/loginResult.js.map +1 -0
  138. package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.d.ts +12 -0
  139. package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.js +9 -0
  140. package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.js.map +1 -0
  141. package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.d.ts +13 -0
  142. package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.js +14 -0
  143. package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.js.map +1 -0
  144. package/dist/accessi-module/Console/generated/model/menuEntity.d.ts +32 -0
  145. package/dist/accessi-module/Console/generated/model/menuEntity.js +9 -0
  146. package/dist/accessi-module/Console/generated/model/menuEntity.js.map +1 -0
  147. package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.d.ts +12 -0
  148. package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.js +9 -0
  149. package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.js.map +1 -0
  150. package/dist/accessi-module/Console/generated/model/permission.d.ts +12 -0
  151. package/dist/accessi-module/Console/generated/model/permission.js +9 -0
  152. package/dist/accessi-module/Console/generated/model/permission.js.map +1 -0
  153. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.d.ts +51 -0
  154. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.js +9 -0
  155. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.js.map +1 -0
  156. package/dist/accessi-module/Console/generated/model/registerRequest.d.ts +62 -0
  157. package/dist/accessi-module/Console/generated/model/registerRequest.js +3 -0
  158. package/dist/accessi-module/Console/generated/model/registerRequest.js.map +1 -0
  159. package/dist/accessi-module/Console/generated/model/registerResponse.d.ts +14 -0
  160. package/dist/accessi-module/Console/generated/model/registerResponse.js +3 -0
  161. package/dist/accessi-module/Console/generated/model/registerResponse.js.map +1 -0
  162. package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.d.ts +13 -0
  163. package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.js +9 -0
  164. package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.js.map +1 -0
  165. package/dist/accessi-module/Console/generated/model/role.d.ts +15 -0
  166. package/dist/accessi-module/Console/generated/model/role.js +3 -0
  167. package/dist/accessi-module/Console/generated/model/role.js.map +1 -0
  168. package/dist/accessi-module/Console/generated/model/ruoliMenu.d.ts +15 -0
  169. package/dist/accessi-module/Console/generated/model/ruoliMenu.js +3 -0
  170. package/dist/accessi-module/Console/generated/model/ruoliMenu.js.map +1 -0
  171. package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.d.ts +16 -0
  172. package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.js +17 -0
  173. package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.js.map +1 -0
  174. package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.d.ts +12 -0
  175. package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.js +9 -0
  176. package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.js.map +1 -0
  177. package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.d.ts +12 -0
  178. package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.js +9 -0
  179. package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.js.map +1 -0
  180. package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.d.ts +10 -0
  181. package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.js +9 -0
  182. package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.js.map +1 -0
  183. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.d.ts +13 -0
  184. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.js +3 -0
  185. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.js.map +1 -0
  186. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.d.ts +18 -0
  187. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js +19 -0
  188. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js.map +1 -0
  189. package/dist/accessi-module/Console/generated/model/status.d.ts +12 -0
  190. package/dist/accessi-module/Console/generated/model/status.js +9 -0
  191. package/dist/accessi-module/Console/generated/model/status.js.map +1 -0
  192. package/dist/accessi-module/Console/generated/model/tipoFiltro.d.ts +23 -0
  193. package/dist/accessi-module/Console/generated/model/tipoFiltro.js +3 -0
  194. package/dist/accessi-module/Console/generated/model/tipoFiltro.js.map +1 -0
  195. package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.d.ts +14 -0
  196. package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.js +15 -0
  197. package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.js.map +1 -0
  198. package/dist/accessi-module/Console/generated/model/tokenResult.d.ts +15 -0
  199. package/dist/accessi-module/Console/generated/model/tokenResult.js +3 -0
  200. package/dist/accessi-module/Console/generated/model/tokenResult.js.map +1 -0
  201. package/dist/accessi-module/Console/generated/model/tokenResultType.d.ts +14 -0
  202. package/dist/accessi-module/Console/generated/model/tokenResultType.js +15 -0
  203. package/dist/accessi-module/Console/generated/model/tokenResultType.js.map +1 -0
  204. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.d.ts +18 -0
  205. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.js +3 -0
  206. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.js.map +1 -0
  207. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.d.ts +10 -0
  208. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.js +14 -0
  209. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.js.map +1 -0
  210. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.d.ts +13 -0
  211. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js +14 -0
  212. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js.map +1 -0
  213. package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.d.ts +10 -0
  214. package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.js +9 -0
  215. package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.js.map +1 -0
  216. package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.d.ts +11 -0
  217. package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.js +9 -0
  218. package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.js.map +1 -0
  219. package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.d.ts +12 -0
  220. package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.js +9 -0
  221. package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.js.map +1 -0
  222. package/dist/accessi-module/Console/generated/model/userDto.d.ts +88 -0
  223. package/dist/accessi-module/Console/generated/model/userDto.js +3 -0
  224. package/dist/accessi-module/Console/generated/model/userDto.js.map +1 -0
  225. package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.d.ts +18 -0
  226. package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.js +19 -0
  227. package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.js.map +1 -0
  228. package/dist/accessi-module/Console/generated/model/userGrantsDto.d.ts +16 -0
  229. package/dist/accessi-module/Console/generated/model/userGrantsDto.js +3 -0
  230. package/dist/accessi-module/Console/generated/model/userGrantsDto.js.map +1 -0
  231. package/dist/accessi-module/Console/generated/model/userGrantsResponse.d.ts +14 -0
  232. package/dist/accessi-module/Console/generated/model/userGrantsResponse.js +3 -0
  233. package/dist/accessi-module/Console/generated/model/userGrantsResponse.js.map +1 -0
  234. package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.d.ts +18 -0
  235. package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.js +9 -0
  236. package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.js.map +1 -0
  237. package/dist/accessi-module/Console/index.html +59 -0
  238. package/dist/accessi-module/Controllers/AccessiConsoleController.d.ts +11 -0
  239. package/dist/accessi-module/Controllers/AccessiConsoleController.js +74 -0
  240. package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +1 -0
  241. package/dist/accessi-module/Controllers/AuthController.d.ts +4 -1
  242. package/dist/accessi-module/Controllers/AuthController.js +86 -47
  243. package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
  244. package/dist/accessi-module/Controllers/ConfiguratorController.d.ts +1 -1
  245. package/dist/accessi-module/Controllers/ConfiguratorController.js +3 -1
  246. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  247. package/dist/accessi-module/Controllers/EmailController.d.ts +1 -1
  248. package/dist/accessi-module/Controllers/EmailController.js +3 -1
  249. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  250. package/dist/accessi-module/Controllers/FiltriController.d.ts +1 -1
  251. package/dist/accessi-module/Controllers/FiltriController.js +3 -1
  252. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  253. package/dist/accessi-module/Controllers/PermissionController.d.ts +1 -1
  254. package/dist/accessi-module/Controllers/PermissionController.js +9 -5
  255. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  256. package/dist/accessi-module/Controllers/UserController.d.ts +3 -1
  257. package/dist/accessi-module/Controllers/UserController.js +40 -2
  258. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  259. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js +1 -1
  260. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  261. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.d.ts +3 -0
  262. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js +18 -0
  263. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +1 -1
  264. package/dist/accessi-module/Dtos/BaseResponse.d.ts +2 -0
  265. package/dist/accessi-module/Dtos/BaseResponse.js +21 -2
  266. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  267. package/dist/accessi-module/Dtos/FederatedIdentityDtos.d.ts +69 -0
  268. package/dist/accessi-module/Dtos/FederatedIdentityDtos.js +236 -0
  269. package/dist/accessi-module/Dtos/FederatedIdentityDtos.js.map +1 -0
  270. package/dist/accessi-module/Dtos/FiltriUtente.js +4 -1
  271. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  272. package/dist/accessi-module/Dtos/LoginRequest.d.ts +1 -1
  273. package/dist/accessi-module/Dtos/LoginRequest.js +3 -2
  274. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  275. package/dist/accessi-module/Dtos/LoginResponse.d.ts +5 -1
  276. package/dist/accessi-module/Dtos/LoginResponse.js +19 -6
  277. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  278. package/dist/accessi-module/Dtos/Permission.d.ts +1 -0
  279. package/dist/accessi-module/Dtos/Permission.js +1 -0
  280. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  281. package/dist/accessi-module/Dtos/PublicRegisterRequest.d.ts +1 -1
  282. package/dist/accessi-module/Dtos/PublicRegisterRequest.js +1 -0
  283. package/dist/accessi-module/Dtos/PublicRegisterRequest.js.map +1 -1
  284. package/dist/accessi-module/Dtos/RegisterRequest.js +1 -0
  285. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  286. package/dist/accessi-module/Dtos/Role.d.ts +4 -0
  287. package/dist/accessi-module/Dtos/Role.js +4 -0
  288. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  289. package/dist/accessi-module/Dtos/TipoAbilitazione.d.ts +4 -0
  290. package/dist/accessi-module/Dtos/TipoAbilitazione.js +4 -0
  291. package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
  292. package/dist/accessi-module/Dtos/TwoFactorDtos.d.ts +13 -0
  293. package/dist/accessi-module/Dtos/TwoFactorDtos.js +60 -0
  294. package/dist/accessi-module/Dtos/TwoFactorDtos.js.map +1 -0
  295. package/dist/accessi-module/Dtos/UserDto.d.ts +7 -0
  296. package/dist/accessi-module/Dtos/UserDto.js +22 -0
  297. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  298. package/dist/accessi-module/Dtos/index.d.ts +2 -0
  299. package/dist/accessi-module/Dtos/index.js +2 -0
  300. package/dist/accessi-module/Dtos/index.js.map +1 -1
  301. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +39 -4
  302. package/dist/accessi-module/Services/AuthService/AuthService.js +184 -32
  303. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  304. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.d.ts +3 -1
  305. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js +5 -1
  306. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
  307. package/dist/accessi-module/Services/EmailService/EmailService.d.ts +7 -1
  308. package/dist/accessi-module/Services/EmailService/EmailService.js +23 -5
  309. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  310. package/dist/accessi-module/Services/FiltriService/FiltriService.d.ts +9 -1
  311. package/dist/accessi-module/Services/FiltriService/FiltriService.js +29 -4
  312. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  313. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +29 -1
  314. package/dist/accessi-module/Services/PermissionService/PermissionService.js +38 -7
  315. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  316. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.d.ts +27 -0
  317. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js +179 -0
  318. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js.map +1 -0
  319. package/dist/accessi-module/Services/UserService/UserService.d.ts +26 -2
  320. package/dist/accessi-module/Services/UserService/UserService.js +124 -30
  321. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  322. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +38 -10
  323. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +368 -184
  324. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  325. package/dist/accessi-module/database-updates/accessiSchema.d.ts +45 -0
  326. package/dist/accessi-module/database-updates/accessiSchema.js +79 -0
  327. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -0
  328. package/dist/accessi-module/database-updates/optionalColumns.d.ts +5 -0
  329. package/dist/accessi-module/database-updates/optionalColumns.js +26 -0
  330. package/dist/accessi-module/database-updates/optionalColumns.js.map +1 -0
  331. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +11 -6
  332. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  333. package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +23 -0
  334. package/dist/accessi-module/federated-auth/FederatedAuthController.js +307 -0
  335. package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +1 -0
  336. package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +94 -0
  337. package/dist/accessi-module/federated-auth/FederatedAuthService.js +424 -0
  338. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +1 -0
  339. package/dist/accessi-module/federated-auth/FederatedAuthTypes.d.ts +53 -0
  340. package/dist/accessi-module/federated-auth/FederatedAuthTypes.js +3 -0
  341. package/dist/accessi-module/federated-auth/FederatedAuthTypes.js.map +1 -0
  342. package/dist/accessi-module/index.d.ts +14 -0
  343. package/dist/accessi-module/index.js +18 -10
  344. package/dist/accessi-module/index.js.map +1 -1
  345. package/dist/accessi-module/jwt/jwt.strategy.d.ts +1 -1
  346. package/dist/accessi-module/jwt/jwt.strategy.js +10 -4
  347. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  348. package/dist/accessi-module/middleware/accessiRequirements.d.ts +22 -0
  349. package/dist/accessi-module/middleware/accessiRequirements.js +7 -0
  350. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  351. package/dist/accessi-module/middleware/authenticateGen.d.ts +16 -1
  352. package/dist/accessi-module/middleware/authenticateGen.js +54 -20
  353. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  354. package/dist/accessi-module/security/AccessiHttpExceptionFilter.d.ts +12 -0
  355. package/dist/accessi-module/security/AccessiHttpExceptionFilter.js +74 -0
  356. package/dist/accessi-module/security/AccessiHttpExceptionFilter.js.map +1 -0
  357. package/dist/accessi-module/security/accessControl.d.ts +11 -0
  358. package/dist/accessi-module/security/accessControl.js +11 -1
  359. package/dist/accessi-module/security/accessControl.js.map +1 -1
  360. package/dist/accessi-module/security/accessiValidation.d.ts +9 -0
  361. package/dist/accessi-module/security/accessiValidation.js +41 -0
  362. package/dist/accessi-module/security/accessiValidation.js.map +1 -0
  363. package/dist/accessi-module/security/authenticatedToken.d.ts +14 -0
  364. package/dist/accessi-module/security/authenticatedToken.js +30 -4
  365. package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
  366. package/dist/accessi-module/security/passwordResetToken.d.ts +5 -1
  367. package/dist/accessi-module/security/passwordResetToken.js +5 -1
  368. package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
  369. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +2 -2
  370. package/dist/accessi-module/security/publicAuthRateLimit.js +2 -0
  371. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  372. package/dist/emilsoftware-utilities-2.0.0-dev.23.tgz +0 -0
  373. package/dist/initEmilsoftwareModule.js +7 -0
  374. package/dist/initEmilsoftwareModule.js.map +1 -1
  375. package/dist/scripts/generateAccessiOpenApi.d.ts +1 -0
  376. package/dist/scripts/generateAccessiOpenApi.js +57 -0
  377. package/dist/scripts/generateAccessiOpenApi.js.map +1 -0
  378. package/package.json +13 -4
  379. package/dist/emilsoftware-utilities-2.0.0-dev.22.tgz +0 -0
@@ -0,0 +1,1105 @@
1
+ // src/accessi-module/Console/accessiFetch.ts
2
+ var accessToken = null;
3
+ var loadingEventName = "accessi-console-network";
4
+ function notifyNetworkActivity(active) {
5
+ if (typeof window !== "undefined") {
6
+ window.dispatchEvent(new CustomEvent(loadingEventName, { detail: { active } }));
7
+ }
8
+ }
9
+ function setAccessiConsoleToken(token2) {
10
+ accessToken = token2;
11
+ }
12
+ async function accessiFetch(url, options) {
13
+ const headers = new Headers(options.headers);
14
+ headers.set("Accept", "application/json");
15
+ if (options.body !== void 0 && !headers.has("Content-Type")) {
16
+ headers.set("Content-Type", "application/json");
17
+ }
18
+ if (accessToken) headers.set("Authorization", `Bearer ${accessToken}`);
19
+ notifyNetworkActivity(true);
20
+ try {
21
+ const response = await fetch(url, { ...options, headers });
22
+ const payload = await response.json().catch(() => void 0);
23
+ if (!response.ok) {
24
+ const message = payload?.message ?? payload?.error ?? `Errore HTTP ${response.status}`;
25
+ throw new Error(message);
26
+ }
27
+ return {
28
+ data: payload,
29
+ status: response.status,
30
+ headers: response.headers
31
+ };
32
+ } finally {
33
+ notifyNetworkActivity(false);
34
+ }
35
+ }
36
+
37
+ // src/accessi-module/Console/generated/accessiApi.ts
38
+ var getGetUserByTokenUrl = () => {
39
+ return `/api/accessi/auth/get-user-by-token`;
40
+ };
41
+ var getUserByToken = async (getUserByTokenRequest, options) => {
42
+ return accessiFetch(
43
+ getGetUserByTokenUrl(),
44
+ {
45
+ ...options,
46
+ method: "POST",
47
+ body: JSON.stringify(
48
+ getUserByTokenRequest
49
+ )
50
+ }
51
+ );
52
+ };
53
+ var getLoginUrl = () => {
54
+ return `/api/accessi/auth/login`;
55
+ };
56
+ var login = async (loginRequest, options) => {
57
+ return accessiFetch(
58
+ getLoginUrl(),
59
+ {
60
+ ...options,
61
+ method: "POST",
62
+ body: JSON.stringify(
63
+ loginRequest
64
+ )
65
+ }
66
+ );
67
+ };
68
+ var getVerifyTwoFactorUrl = () => {
69
+ return `/api/accessi/auth/two-factor/verify`;
70
+ };
71
+ var verifyTwoFactor = async (verifyTwoFactorRequest, options) => {
72
+ return accessiFetch(
73
+ getVerifyTwoFactorUrl(),
74
+ {
75
+ ...options,
76
+ method: "POST",
77
+ body: JSON.stringify(
78
+ verifyTwoFactorRequest
79
+ )
80
+ }
81
+ );
82
+ };
83
+ var getResendTwoFactorUrl = () => {
84
+ return `/api/accessi/auth/two-factor/resend`;
85
+ };
86
+ var resendTwoFactor = async (resendTwoFactorRequest, options) => {
87
+ return accessiFetch(
88
+ getResendTwoFactorUrl(),
89
+ {
90
+ ...options,
91
+ method: "POST",
92
+ body: JSON.stringify(
93
+ resendTwoFactorRequest
94
+ )
95
+ }
96
+ );
97
+ };
98
+ var getGetRolesUrl = () => {
99
+ return `/api/accessi/permission/roles`;
100
+ };
101
+ var getRoles = async (options) => {
102
+ return accessiFetch(
103
+ getGetRolesUrl(),
104
+ {
105
+ ...options,
106
+ method: "GET"
107
+ }
108
+ );
109
+ };
110
+ var getUpdateRoleUrl = (codiceRuolo) => {
111
+ return `/api/accessi/permission/update-role/${codiceRuolo}`;
112
+ };
113
+ var updateRole = async (codiceRuolo, role, options) => {
114
+ return accessiFetch(
115
+ getUpdateRoleUrl(codiceRuolo),
116
+ {
117
+ ...options,
118
+ method: "PUT",
119
+ body: JSON.stringify(
120
+ role
121
+ )
122
+ }
123
+ );
124
+ };
125
+ var getCreateRoleUrl = () => {
126
+ return `/api/accessi/permission/create-role`;
127
+ };
128
+ var createRole = async (role, options) => {
129
+ return accessiFetch(
130
+ getCreateRoleUrl(),
131
+ {
132
+ ...options,
133
+ method: "POST",
134
+ body: JSON.stringify(
135
+ role
136
+ )
137
+ }
138
+ );
139
+ };
140
+ var getAssignRolesToUserUrl = (codiceUtente) => {
141
+ return `/api/accessi/permission/assign-roles/${codiceUtente}`;
142
+ };
143
+ var assignRolesToUser = async (codiceUtente, assignRolesToUserRequest, options) => {
144
+ return accessiFetch(
145
+ getAssignRolesToUserUrl(codiceUtente),
146
+ {
147
+ ...options,
148
+ method: "POST",
149
+ body: JSON.stringify(
150
+ assignRolesToUserRequest
151
+ )
152
+ }
153
+ );
154
+ };
155
+ var getAssignPermissionsToUserUrl = (codiceUtente) => {
156
+ return `/api/accessi/permission/assign-permissions/${codiceUtente}`;
157
+ };
158
+ var assignPermissionsToUser = async (codiceUtente, assignPermissionsToUserRequest, options) => {
159
+ return accessiFetch(
160
+ getAssignPermissionsToUserUrl(codiceUtente),
161
+ {
162
+ ...options,
163
+ method: "POST",
164
+ body: JSON.stringify(
165
+ assignPermissionsToUserRequest
166
+ )
167
+ }
168
+ );
169
+ };
170
+ var getGetGroupsWithMenusUrl = (params) => {
171
+ const normalizedParams = new URLSearchParams();
172
+ Object.entries(params || {}).forEach(([key, value]) => {
173
+ if (value === null) {
174
+ normalizedParams.append(key, "null");
175
+ } else if (value !== void 0) {
176
+ normalizedParams.append(key, value.toString());
177
+ }
178
+ });
179
+ return `/api/accessi/permission/groups-with-menus?${normalizedParams.toString()}`;
180
+ };
181
+ var getGroupsWithMenus = async (params, options) => {
182
+ return accessiFetch(
183
+ getGetGroupsWithMenusUrl(params),
184
+ {
185
+ ...options,
186
+ method: "GET"
187
+ }
188
+ );
189
+ };
190
+ var getGetUserRolesAndGrantsUrl = (codiceUtente) => {
191
+ return `/api/accessi/permission/grants/${codiceUtente}`;
192
+ };
193
+ var getUserRolesAndGrants = async (codiceUtente, options) => {
194
+ return accessiFetch(
195
+ getGetUserRolesAndGrantsUrl(codiceUtente),
196
+ {
197
+ ...options,
198
+ method: "GET"
199
+ }
200
+ );
201
+ };
202
+ var getGetUsersUrl = (params) => {
203
+ const normalizedParams = new URLSearchParams();
204
+ Object.entries(params || {}).forEach(([key, value]) => {
205
+ if (value === null) {
206
+ normalizedParams.append(key, "null");
207
+ } else if (value !== void 0) {
208
+ normalizedParams.append(key, value.toString());
209
+ }
210
+ });
211
+ return `/api/accessi/user/get-users?${normalizedParams.toString()}`;
212
+ };
213
+ var getUsers = async (params, options) => {
214
+ return accessiFetch(
215
+ getGetUsersUrl(params),
216
+ {
217
+ ...options,
218
+ method: "GET"
219
+ }
220
+ );
221
+ };
222
+ var getDeleteUserUrl = (codiceUtente) => {
223
+ return `/api/accessi/user/delete-user/${codiceUtente}`;
224
+ };
225
+ var deleteUser = async (codiceUtente, options) => {
226
+ return accessiFetch(
227
+ getDeleteUserUrl(codiceUtente),
228
+ {
229
+ ...options,
230
+ method: "DELETE"
231
+ }
232
+ );
233
+ };
234
+ var getCreateManagedUserUrl = () => {
235
+ return `/api/accessi/user/create-managed-user`;
236
+ };
237
+ var createManagedUser = async (registerRequest, options) => {
238
+ return accessiFetch(
239
+ getCreateManagedUserUrl(),
240
+ {
241
+ ...options,
242
+ method: "POST",
243
+ body: JSON.stringify(
244
+ registerRequest
245
+ )
246
+ }
247
+ );
248
+ };
249
+ var getUpdateUtenteUrl = (codiceUtente) => {
250
+ return `/api/accessi/user/update-user/${codiceUtente}`;
251
+ };
252
+ var updateUtente = async (codiceUtente, userDto, options) => {
253
+ return accessiFetch(
254
+ getUpdateUtenteUrl(codiceUtente),
255
+ {
256
+ ...options,
257
+ method: "PUT",
258
+ body: JSON.stringify(
259
+ userDto
260
+ )
261
+ }
262
+ );
263
+ };
264
+ var getGetFiltriUtenteUrl = (params) => {
265
+ const normalizedParams = new URLSearchParams();
266
+ Object.entries(params || {}).forEach(([key, value]) => {
267
+ if (value === null) {
268
+ normalizedParams.append(key, "null");
269
+ } else if (value !== void 0) {
270
+ normalizedParams.append(key, value.toString());
271
+ }
272
+ });
273
+ return `/api/accessi/filtri/utente?${normalizedParams.toString()}`;
274
+ };
275
+ var getFiltriUtente = async (params, options) => {
276
+ return accessiFetch(
277
+ getGetFiltriUtenteUrl(params),
278
+ {
279
+ ...options,
280
+ method: "GET"
281
+ }
282
+ );
283
+ };
284
+ var getSaveFiltriUtenteUrl = () => {
285
+ return `/api/accessi/filtri/utente`;
286
+ };
287
+ var saveFiltriUtente = async (filtriUtente, options) => {
288
+ return accessiFetch(
289
+ getSaveFiltriUtenteUrl(),
290
+ {
291
+ ...options,
292
+ method: "POST",
293
+ body: JSON.stringify(
294
+ filtriUtente
295
+ )
296
+ }
297
+ );
298
+ };
299
+ var getSetMenuEnabledUrl = (codiceMenu) => {
300
+ return `/api/accessi/configurator/menus/${codiceMenu}/enabled`;
301
+ };
302
+ var setMenuEnabled = async (codiceMenu, updateEnabledStatusRequest, options) => {
303
+ return accessiFetch(
304
+ getSetMenuEnabledUrl(codiceMenu),
305
+ {
306
+ ...options,
307
+ method: "PATCH",
308
+ body: JSON.stringify(
309
+ updateEnabledStatusRequest
310
+ )
311
+ }
312
+ );
313
+ };
314
+ var getSetGroupEnabledUrl = (codiceGruppo) => {
315
+ return `/api/accessi/configurator/groups/${codiceGruppo}/enabled`;
316
+ };
317
+ var setGroupEnabled = async (codiceGruppo, updateEnabledStatusRequest, options) => {
318
+ return accessiFetch(
319
+ getSetGroupEnabledUrl(codiceGruppo),
320
+ {
321
+ ...options,
322
+ method: "PATCH",
323
+ body: JSON.stringify(
324
+ updateEnabledStatusRequest
325
+ )
326
+ }
327
+ );
328
+ };
329
+ var getGetFederatedProvidersUrl = () => {
330
+ return `/api/accessi/federated-auth/providers`;
331
+ };
332
+ var getFederatedProviders = async (options) => {
333
+ return accessiFetch(
334
+ getGetFederatedProvidersUrl(),
335
+ {
336
+ ...options,
337
+ method: "GET"
338
+ }
339
+ );
340
+ };
341
+ var getCreateFederatedProviderUrl = () => {
342
+ return `/api/accessi/federated-auth/providers`;
343
+ };
344
+ var createFederatedProvider = async (createFederatedProviderRequest, options) => {
345
+ return accessiFetch(
346
+ getCreateFederatedProviderUrl(),
347
+ {
348
+ ...options,
349
+ method: "POST",
350
+ body: JSON.stringify(
351
+ createFederatedProviderRequest
352
+ )
353
+ }
354
+ );
355
+ };
356
+ var getUpdateFederatedProviderUrl = (provider) => {
357
+ return `/api/accessi/federated-auth/providers/${provider}`;
358
+ };
359
+ var updateFederatedProvider = async (provider, updateFederatedProviderRequest, options) => {
360
+ return accessiFetch(
361
+ getUpdateFederatedProviderUrl(provider),
362
+ {
363
+ ...options,
364
+ method: "PATCH",
365
+ body: JSON.stringify(
366
+ updateFederatedProviderRequest
367
+ )
368
+ }
369
+ );
370
+ };
371
+ var getGetFederatedIdentitiesUrl = (codiceUtente) => {
372
+ return `/api/accessi/federated-auth/users/${codiceUtente}/identities`;
373
+ };
374
+ var getFederatedIdentities = async (codiceUtente, options) => {
375
+ return accessiFetch(
376
+ getGetFederatedIdentitiesUrl(codiceUtente),
377
+ {
378
+ ...options,
379
+ method: "GET"
380
+ }
381
+ );
382
+ };
383
+ var getLinkFederatedIdentityUrl = (codiceUtente) => {
384
+ return `/api/accessi/federated-auth/users/${codiceUtente}/identities`;
385
+ };
386
+ var linkFederatedIdentity = async (codiceUtente, createFederatedIdentityRequest, options) => {
387
+ return accessiFetch(
388
+ getLinkFederatedIdentityUrl(codiceUtente),
389
+ {
390
+ ...options,
391
+ method: "POST",
392
+ body: JSON.stringify(
393
+ createFederatedIdentityRequest
394
+ )
395
+ }
396
+ );
397
+ };
398
+ var getCreateFederatedUserUrl = () => {
399
+ return `/api/accessi/federated-auth/users`;
400
+ };
401
+ var createFederatedUser = async (createFederatedUserRequest, options) => {
402
+ return accessiFetch(
403
+ getCreateFederatedUserUrl(),
404
+ {
405
+ ...options,
406
+ method: "POST",
407
+ body: JSON.stringify(
408
+ createFederatedUserRequest
409
+ )
410
+ }
411
+ );
412
+ };
413
+ var getUpdateFederatedIdentityUrl = (identityKey) => {
414
+ return `/api/accessi/federated-auth/identities/${identityKey}`;
415
+ };
416
+ var updateFederatedIdentity = async (identityKey, updateFederatedIdentityRequest, options) => {
417
+ return accessiFetch(
418
+ getUpdateFederatedIdentityUrl(identityKey),
419
+ {
420
+ ...options,
421
+ method: "PATCH",
422
+ body: JSON.stringify(
423
+ updateFederatedIdentityRequest
424
+ )
425
+ }
426
+ );
427
+ };
428
+ var getDeleteFederatedIdentityPermanentlyUrl = (codiceUtente, identityKey) => {
429
+ return `/api/accessi/federated-auth/users/${codiceUtente}/identities/${identityKey}`;
430
+ };
431
+ var deleteFederatedIdentityPermanently = async (codiceUtente, identityKey, options) => {
432
+ return accessiFetch(
433
+ getDeleteFederatedIdentityPermanentlyUrl(codiceUtente, identityKey),
434
+ {
435
+ ...options,
436
+ method: "DELETE"
437
+ }
438
+ );
439
+ };
440
+
441
+ // src/accessi-module/Console/console.ts
442
+ var routeSegment = {
443
+ users: "utenti",
444
+ roles: "ruoli-e-grant",
445
+ menus: "menu-e-gruppi",
446
+ filters: "filtri",
447
+ sso: "sso"
448
+ };
449
+ var routeView = Object.fromEntries(Object.entries(routeSegment).map(([view, segment]) => [segment, view]));
450
+ var consoleMarker = "/accessi/console";
451
+ var consoleMarkerIndex = window.location.pathname.indexOf(consoleMarker);
452
+ var consoleBasePath = consoleMarkerIndex >= 0 ? window.location.pathname.slice(0, consoleMarkerIndex + consoleMarker.length) : `${window.location.pathname.replace(/\/$/, "")}`;
453
+ var token = sessionStorage.getItem("accessi-console-token");
454
+ var currentUser = null;
455
+ var federatedAuthenticationAvailable = false;
456
+ var pendingNetworkRequests = 0;
457
+ var loadingRevealTimer;
458
+ var loadingHideTimer;
459
+ var loaderVisibleSince = 0;
460
+ var byId = (id) => document.getElementById(id);
461
+ var escapeHtml = (value) => String(value ?? "").replace(/[&<>"']/g, (char) => ({
462
+ "&": "&amp;",
463
+ "<": "&lt;",
464
+ ">": "&gt;",
465
+ '"': "&quot;",
466
+ "'": "&#39;"
467
+ })[char]);
468
+ function result(response) {
469
+ const body = response.data;
470
+ if (body.Result === void 0) throw new Error(body.message ?? "Risposta Accessi priva di dati.");
471
+ return body.Result;
472
+ }
473
+ function showNotice(message, isError = false) {
474
+ byId("notice").innerHTML = `<span class="${isError ? "error" : ""}">${escapeHtml(message)}</span>`;
475
+ }
476
+ function menuMetadata(menu) {
477
+ const details = [
478
+ ["Codice", menu.codiceMenu],
479
+ ["Ordine", String(menu.ordineMenu)],
480
+ ["Tipo", menu.tipo],
481
+ ["Pagina", menu.pagina],
482
+ ["Icona", menu.icona],
483
+ ["Stato", menu.enabled === false ? "Disabilitato" : "Abilitato"]
484
+ ].filter(([, value]) => value);
485
+ 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>` : ""}`;
486
+ }
487
+ function permissionSelectOptions(currentLevel) {
488
+ 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>' : ""}`;
489
+ }
490
+ function groupMetadata(group) {
491
+ 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>`;
492
+ }
493
+ function directGrantEditor(groups, grants) {
494
+ return `<form id="grants" class="user-editor-section grants-editor" data-user-panel="grants" role="tabpanel" aria-labelledby="user-tab-grants"><h3>Grant diretti</h3><p class="form-help">Abilitazioni assegnate direttamente all'utente, indipendenti dai ruoli. Seleziona <strong>nessuno</strong> per rimuoverle. Le voci disabilitate restano visibili per non perdere grant esistenti al salvataggio.</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) => {
495
+ const grant = (grants ?? []).find((item) => item.codiceMenu === menu.codiceMenu);
496
+ 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<select name="grant:${escapeHtml(menu.codiceMenu)}"><option value="">nessuno</option>${permissionSelectOptions(grant?.tipoAbilitazione)}</select></label></div>`;
497
+ }).join("") || '<p class="form-help">Nessun menu configurato in questo gruppo.</p>'}</div></fieldset>`).join("")}</div><button>Salva grant</button></form>`;
498
+ }
499
+ function permissionLevelLabel(value) {
500
+ return value === 10 ? "Lettura" : value === 20 ? "Scrittura" : value === 30 ? "Valore legacy (30)" : `Livello ${value ?? "non definito"}`;
501
+ }
502
+ function rolePermissionLevel(value) {
503
+ return value === void 0 || value === null || value === "" ? permissionLevelLabel(void 0) : permissionLevelLabel(Number(value));
504
+ }
505
+ function roleAssignmentEditor(roles, assignedRoles, groups) {
506
+ const catalogMenus = new Map(groups.flatMap((group) => group.menus.map((menu) => [menu.codiceMenu, menu])));
507
+ return `<form id="roles" class="user-editor-section roles-editor" data-user-panel="roles" role="tabpanel" aria-labelledby="user-tab-roles"><h3>Ruoli</h3><p class="form-help">Ogni ruolo assegna i menu elencati sotto con il relativo livello. Salvare sostituisce la selezione dei ruoli dell'utente, non i grant diretti.</p><div class="role-assignment-list">${roles.map((role) => {
508
+ const roleMenus = role.menu ?? [];
509
+ const assigned = (assignedRoles ?? []).some((current) => current.codiceRuolo === role.codiceRuolo);
510
+ 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);
511
+ const missingMenus = roleMenus.filter((item) => !catalogMenus.has(item.codiceMenu));
512
+ 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\xF9 presenti nel catalogo</strong>${missingMenus.map((menu) => `<div class="role-permission-entry"><div><strong>${escapeHtml(menu.codiceMenu)}</strong><p class="entity-note">Il menu \xE8 ancora associato al ruolo ma non \xE8 disponibile nel catalogo corrente.</p></div><span class="permission-level">${escapeHtml(rolePermissionLevel(menu.tipoAbilitazione))}</span></div>`).join("")}</section>` : ""}</div></article>`;
513
+ }).join("")}</div><button>Salva ruoli</button></form>`;
514
+ }
515
+ function roleOverview(role, groups) {
516
+ const roleMenus = role.menu ?? [];
517
+ const catalogMenus = new Map(groups.flatMap((group) => group.menus.map((menu) => [menu.codiceMenu, menu])));
518
+ 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);
519
+ const missingMenus = roleMenus.filter((item) => !catalogMenus.has(item.codiceMenu));
520
+ return `<article class="role-assignment-card role-overview-card"><details class="role-overview-details"><summary class="role-assignment-heading"><div class="role-identity"><span class="role-kind">Ruolo</span><strong>${escapeHtml(role.descrizioneRuolo)}</strong><span class="role-code">Codice ruolo: ${escapeHtml(role.codiceRuolo)}</span></div><div class="role-overview-actions"><span class="role-menu-count">${roleMenus.length} menu</span><span class="role-expand-hint"><span class="when-closed">Mostra menu</span><span class="when-open">Nascondi menu</span></span></div></summary><div class="role-permission-groups">${groupedMenus.map(({ group, entries }) => `<section class="role-permission-group"><div class="role-permission-group-heading"><div><span class="group-kind">Gruppo</span><strong>${escapeHtml(group.descrizioneGruppo)}</strong></div>${groupMetadata(group)}</div>${entries.map(({ menu, assignment }) => `<div class="role-permission-entry ${menu.enabled === false ? "is-disabled" : ""}"><div><span class="menu-kind">Menu</span><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\xF9 presenti nel catalogo</strong>${missingMenus.map((menu) => `<div class="role-permission-entry"><div><strong>${escapeHtml(menu.codiceMenu)}</strong><p class="entity-note">Il menu \xE8 ancora associato al ruolo ma non \xE8 disponibile nel catalogo corrente.</p></div><span class="permission-level">${escapeHtml(rolePermissionLevel(menu.tipoAbilitazione))}</span></div>`).join("")}</section>` : ""}</div></details><button type="button" class="role-edit-button" data-role="${escapeHtml(role.codiceRuolo)}">Modifica</button></article>`;
521
+ }
522
+ function menuGroupTable(group) {
523
+ return `<article class="menu-group-card ${group.enabled === false ? "is-disabled" : ""}"><div class="menu-group-header"><label class="check"><input type="checkbox" data-group="${escapeHtml(group.codiceGruppo)}" ${group.enabled !== false ? "checked" : ""}><span><strong>${escapeHtml(group.descrizioneGruppo)}</strong><small>Gruppo di menu</small></span></label>${groupMetadata(group)}</div><div class="menu-table-wrap"><table class="menu-table"><thead><tr><th>Stato</th><th>Menu</th><th>Codice</th><th>Ordine</th><th>Tipo</th><th>Pagina</th><th>Icona</th><th>Nota</th></tr></thead><tbody>${group.menus.map((menu) => `<tr class="${menu.enabled === false ? "is-disabled" : ""}"><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></td><td><code>${escapeHtml(menu.codiceMenu)}</code></td><td>${escapeHtml(menu.ordineMenu)}</td><td>${escapeHtml(menu.tipo || "Non indicato")}</td><td>${menu.pagina ? `<code>${escapeHtml(menu.pagina)}</code>` : '<span class="muted">Non indicata</span>'}</td><td>${menu.icona ? `<code>${escapeHtml(menu.icona)}</code>` : '<span class="muted">Non indicata</span>'}</td><td>${escapeHtml(menu.note || "Nessuna nota")}</td></tr>`).join("") || '<tr><td colspan="8" class="muted">Nessun menu configurato in questo gruppo.</td></tr>'}</tbody></table></div></article>`;
524
+ }
525
+ function roleMenuEditorTable(group, role) {
526
+ const roleMenus = role?.menu ?? [];
527
+ return `<article class="role-menu-group ${group.enabled === false ? "is-disabled" : ""}"><div class="menu-group-header"><div><strong>${escapeHtml(group.descrizioneGruppo)}</strong><small>Gruppo di menu</small></div>${groupMetadata(group)}</div><div class="menu-table-wrap"><table class="menu-table role-menu-table"><thead><tr><th scope="col">Incluso</th><th scope="col">Menu</th><th scope="col">Codice</th><th scope="col">Ordine</th><th scope="col">Tipo</th><th scope="col">Pagina</th><th scope="col">Icona</th><th scope="col">Stato</th><th scope="col">Abilitazione</th><th scope="col">Nota</th></tr></thead><tbody>${group.menus.map((menu) => {
528
+ const assignment = roleMenus.find((item) => item.codiceMenu === menu.codiceMenu);
529
+ const level = assignment?.tipoAbilitazione ?? 10;
530
+ return `<tr class="${menu.enabled === false ? "is-disabled" : ""}"><td><label class="table-toggle"><input type="checkbox" name="menu" value="${escapeHtml(menu.codiceMenu)}" ${assignment ? "checked" : ""} aria-label="Includi ${escapeHtml(menu.descrizioneMenu)}"><span>${assignment ? "Incluso" : "Escluso"}</span></label></td><td><strong>${escapeHtml(menu.descrizioneMenu)}</strong></td><td><code>${escapeHtml(menu.codiceMenu)}</code></td><td>${escapeHtml(menu.ordineMenu)}</td><td>${escapeHtml(menu.tipo || "Non indicato")}</td><td>${menu.pagina ? `<code>${escapeHtml(menu.pagina)}</code>` : '<span class="muted">Non indicata</span>'}</td><td>${menu.icona ? `<code>${escapeHtml(menu.icona)}</code>` : '<span class="muted">Non indicata</span>'}</td><td><span class="status-label ${menu.enabled === false ? "status-disabled" : "status-enabled"}">${menu.enabled === false ? "Disabilitato" : "Abilitato"}</span></td><td><label class="table-select"><span class="sr-only">Abilitazione per ${escapeHtml(menu.descrizioneMenu)}</span><select name="menu-level:${escapeHtml(menu.codiceMenu)}" ${assignment ? "" : "disabled"}>${permissionSelectOptions(level)}</select></label></td><td>${escapeHtml(menu.note || "Nessuna nota")}</td></tr>`;
531
+ }).join("") || '<tr><td colspan="10" class="muted">Nessun menu configurato in questo gruppo.</td></tr>'}</tbody></table></div></article>`;
532
+ }
533
+ function updateLoadingState(active) {
534
+ pendingNetworkRequests = Math.max(0, pendingNetworkRequests + (active ? 1 : -1));
535
+ const overlay = byId("loading-overlay");
536
+ if (pendingNetworkRequests > 0) {
537
+ if (loadingHideTimer !== void 0) {
538
+ window.clearTimeout(loadingHideTimer);
539
+ loadingHideTimer = void 0;
540
+ }
541
+ if (loadingRevealTimer === void 0 && overlay.hidden) {
542
+ loadingRevealTimer = window.setTimeout(() => {
543
+ loadingRevealTimer = void 0;
544
+ if (pendingNetworkRequests > 0) {
545
+ overlay.hidden = false;
546
+ loaderVisibleSince = Date.now();
547
+ byId("app").setAttribute("aria-busy", "true");
548
+ }
549
+ }, 140);
550
+ }
551
+ return;
552
+ }
553
+ if (loadingRevealTimer !== void 0) {
554
+ window.clearTimeout(loadingRevealTimer);
555
+ loadingRevealTimer = void 0;
556
+ }
557
+ const hide = () => {
558
+ loadingHideTimer = void 0;
559
+ overlay.hidden = true;
560
+ byId("app").removeAttribute("aria-busy");
561
+ };
562
+ const remainingVisibleMs = 280 - (Date.now() - loaderVisibleSince);
563
+ if (!overlay.hidden && remainingVisibleMs > 0) {
564
+ loadingHideTimer = window.setTimeout(hide, remainingVisibleMs);
565
+ } else {
566
+ hide();
567
+ }
568
+ }
569
+ function errorMessage(error) {
570
+ return error instanceof Error ? error.message : "Operazione non riuscita.";
571
+ }
572
+ function handleAction(action) {
573
+ void action().catch((error) => showNotice(errorMessage(error), true));
574
+ }
575
+ function render(markup) {
576
+ byId("view").innerHTML = markup;
577
+ }
578
+ function setActiveNavigation(view) {
579
+ document.querySelectorAll("#nav [data-view]").forEach((link) => {
580
+ if (link.dataset.view === view) {
581
+ link.setAttribute("aria-current", "page");
582
+ } else {
583
+ link.removeAttribute("aria-current");
584
+ }
585
+ });
586
+ }
587
+ function routePath(view) {
588
+ return `${consoleBasePath}/${routeSegment[view]}`;
589
+ }
590
+ function viewFromLocation() {
591
+ const relativePath = window.location.pathname.slice(consoleBasePath.length).replace(/^\/+|\/+$/g, "");
592
+ return routeView[decodeURIComponent(relativePath)] ?? "users";
593
+ }
594
+ async function navigate(view, replace = false) {
595
+ const destination = routePath(view);
596
+ if (window.location.pathname !== destination) {
597
+ window.history[replace ? "replaceState" : "pushState"]({ view }, "", destination);
598
+ }
599
+ await show(view);
600
+ }
601
+ function requireAdmin() {
602
+ if (!currentUser?.flagSuper) throw new Error("La console richiede un superutente Accessi.");
603
+ }
604
+ function formValues(form) {
605
+ return Object.fromEntries(new FormData(form).entries());
606
+ }
607
+ function eventForm(event) {
608
+ return event.currentTarget;
609
+ }
610
+ function federatedIdentityFields(providers) {
611
+ return `<label>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">Catalogo Accessi dei sistemi SSO disponibili. La chiave selezionata deve corrispondere alla configurazione del backend; per Azure deve distinguere tenant e ambiente.</span></label>
612
+ <label>ID utente del provider (subject)<input name="subject" required><span class="form-help">Identifica in modo stabile la singola persona nel provider. Il backend lo estrae dopo la verifica: per esempio <code>oid</code> Azure, <code>sub</code> OpenID Connect/Google/Apple o <code>NameID</code> SAML persistente. \xC8 necessario perch\xE9 il provider da solo non identifica l'utente. Non usare l'email: pu\xF2 cambiare.</span></label>
613
+ <label>Nota<input name="note"><span class="form-help">Annotazione interna per gli amministratori. Non viene inviata al provider e non assegna autorizzazioni.</span></label>`;
614
+ }
615
+ function federatedIdentitySection(identities, providers) {
616
+ 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\xE0 SSO</h3></div><span class="muted">Collegamenti verificati dal backend</span></div><p class="form-help">Ogni collegamento riconosce l'utente presso un provider. Disabilita conserva lo storico e blocca il login; elimina rimuove definitivamente il collegamento, senza eliminare l'utente Accessi.</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>`;
617
+ }
618
+ function userDetailTabs(hasSso) {
619
+ const tabs = [
620
+ ...hasSso ? [{ id: "sso", label: "Identit\xE0 SSO" }] : [],
621
+ { id: "profile", label: "Profilo e accesso" },
622
+ { id: "roles", label: "Ruoli" },
623
+ { id: "grants", label: "Grant diretti" }
624
+ ];
625
+ 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>`;
626
+ }
627
+ function activateUserTab(tab) {
628
+ document.querySelectorAll("[data-user-tab]").forEach((button) => {
629
+ const selected = button.dataset.userTab === tab;
630
+ button.setAttribute("aria-selected", String(selected));
631
+ button.tabIndex = selected ? 0 : -1;
632
+ });
633
+ document.querySelectorAll("[data-user-panel]").forEach((panel) => {
634
+ const selected = panel.dataset.userPanel === tab;
635
+ panel.hidden = !selected;
636
+ if (!panel.id) panel.id = `user-panel-${panel.dataset.userPanel}`;
637
+ document.querySelector(`[data-user-tab="${panel.dataset.userPanel}"]`)?.setAttribute("aria-controls", panel.id);
638
+ });
639
+ }
640
+ function selectedNumbers(form, name) {
641
+ return Array.from(new FormData(form).getAll(name), (value) => Number(value));
642
+ }
643
+ async function loadUsers() {
644
+ return result(await getUsers({ includeGrants: true }));
645
+ }
646
+ async function detectFederatedAuthentication() {
647
+ if (!currentUser) return;
648
+ try {
649
+ await getFederatedIdentities(currentUser.codiceUtente);
650
+ federatedAuthenticationAvailable = true;
651
+ } catch {
652
+ federatedAuthenticationAvailable = false;
653
+ }
654
+ }
655
+ async function loginView(event) {
656
+ event.preventDefault();
657
+ try {
658
+ const values = formValues(event.currentTarget);
659
+ byId("login-error").textContent = "";
660
+ const response = result(await login({ email: values.email, password: values.password || void 0 }));
661
+ await completeLoginStep(response);
662
+ } catch (error) {
663
+ byId("login-error").textContent = error instanceof Error ? error.message : "Login non riuscito.";
664
+ }
665
+ }
666
+ var pendingChallenge = null;
667
+ var resendTimer;
668
+ function resetLogin() {
669
+ pendingChallenge = null;
670
+ if (resendTimer) clearInterval(resendTimer);
671
+ byId("login-form").reset();
672
+ byId("two-factor-form").reset();
673
+ byId("login-form").hidden = false;
674
+ byId("two-factor-form").hidden = true;
675
+ byId("password-field").hidden = true;
676
+ byId("password-field").querySelector("input").disabled = true;
677
+ byId("restart-login").hidden = true;
678
+ byId("login-submit").textContent = "Continua";
679
+ byId("login-error").textContent = "";
680
+ }
681
+ function showTwoFactor(challenge) {
682
+ pendingChallenge = challenge.challengeId;
683
+ byId("login-form").hidden = true;
684
+ const password = byId("password-field").querySelector("input");
685
+ password.value = "";
686
+ password.disabled = true;
687
+ byId("two-factor-form").hidden = false;
688
+ byId("restart-login").hidden = false;
689
+ byId("two-factor-form").reset();
690
+ byId("two-factor-form").querySelector("input").focus();
691
+ const expires = challenge.expiresAt ? new Date(challenge.expiresAt).toLocaleTimeString() : "";
692
+ byId("two-factor-status").textContent = expires ? `Codice inviato. Scade alle ${expires}.` : "Codice inviato. Controlla la tua email.";
693
+ if (resendTimer) clearInterval(resendTimer);
694
+ const availableAt = Date.now() + challenge.resendAfterSeconds * 1e3;
695
+ const update = () => {
696
+ const seconds = Math.max(0, Math.ceil((availableAt - Date.now()) / 1e3));
697
+ const button = byId("resend-code");
698
+ button.disabled = seconds > 0;
699
+ button.textContent = seconds ? `Reinvia tra ${seconds}s` : "Invia un nuovo codice";
700
+ if (!seconds && resendTimer) clearInterval(resendTimer);
701
+ };
702
+ update();
703
+ resendTimer = setInterval(update, 1e3);
704
+ }
705
+ async function completeLoginStep(response) {
706
+ if (response.challenge) {
707
+ showTwoFactor(response.challenge);
708
+ return;
709
+ }
710
+ if (response.passwordRequired) {
711
+ byId("password-field").hidden = false;
712
+ const input = byId("password-field").querySelector("input");
713
+ input.disabled = false;
714
+ input.required = true;
715
+ input.focus();
716
+ byId("restart-login").hidden = false;
717
+ byId("login-submit").textContent = "Accedi";
718
+ return;
719
+ }
720
+ if (!response.token?.value) throw new Error("Risposta di autenticazione incompleta.");
721
+ token = response.token.value;
722
+ sessionStorage.setItem("accessi-console-token", token);
723
+ setAccessiConsoleToken(token);
724
+ resetLogin();
725
+ await bootstrap();
726
+ }
727
+ async function bootstrap() {
728
+ try {
729
+ setAccessiConsoleToken(token);
730
+ if (!token) throw new Error("Inserisci le credenziali amministrative.");
731
+ const payload = result(await getUserByToken({ token }));
732
+ currentUser = payload.userData;
733
+ requireAdmin();
734
+ await detectFederatedAuthentication();
735
+ byId("login").hidden = true;
736
+ byId("console").hidden = false;
737
+ byId("who").textContent = `${currentUser.email} - superutente`;
738
+ byId("sso-navigation").hidden = !federatedAuthenticationAvailable;
739
+ await navigate(viewFromLocation(), window.location.pathname === consoleBasePath);
740
+ } catch (error) {
741
+ token = null;
742
+ currentUser = null;
743
+ setAccessiConsoleToken(null);
744
+ federatedAuthenticationAvailable = false;
745
+ sessionStorage.removeItem("accessi-console-token");
746
+ byId("login").hidden = false;
747
+ byId("console").hidden = true;
748
+ byId("login-error").textContent = error instanceof Error ? error.message : "Sessione non valida.";
749
+ }
750
+ }
751
+ async function showUsers() {
752
+ const users = await loadUsers();
753
+ 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>
754
+ <h2>Utenti</h2><table><thead><tr><th>Utente</th><th>Stato</th><th>Accesso</th><th>2FA</th><th>Ruoli</th><th></th></tr></thead><tbody>
755
+ ${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>${(userGrants?.ruoli ?? []).map((role) => role.codiceRuolo).join(", ")}</td><td><button data-user="${utente.codiceUtente}">Gestisci</button></td></tr>`).join("")}
756
+ </tbody></table>`);
757
+ byId("new-local").onclick = () => showLocalUserForm();
758
+ if (federatedAuthenticationAvailable) byId("new-sso").onclick = () => handleAction(showSsoUserForm);
759
+ byId("reload-users").onclick = () => handleAction(() => show("users"));
760
+ document.querySelectorAll("[data-user]").forEach((button) => {
761
+ button.onclick = () => handleAction(() => showUser(button.dataset.user ?? ""));
762
+ });
763
+ }
764
+ function authenticationPolicyFields(user) {
765
+ return `<fieldset><legend>Verifica dell'accesso (opzionale)</legend>
766
+ <label class="check"><input name="flagDueFattori" type="checkbox" ${user.flagDueFattori ? "checked" : ""}> Richiedi un codice via email (2FA)</label>
767
+ <p class="form-help">Disattiva per impostazione predefinita. Se attiva, il codice viene richiesto dopo la password o dopo l'accesso SSO.</p>
768
+ <label class="check"><input name="passwordlessLoginEnabled" type="checkbox" ${user.passwordlessLoginEnabled ? "checked" : ""} ${user.flagDueFattori ? "" : "disabled"}> Consenti accesso con il solo codice email</label>
769
+ <p class="form-help">Permette di accedere senza password. Richiede il codice email attivo; i collegamenti SSO restano disponibili. Questo accesso usa il solo possesso della casella email.</p>
770
+ </fieldset>`;
771
+ }
772
+ function showLocalUserForm() {
773
+ render(`<button id="back">Indietro</button><h2>Nuovo utente locale</h2><p class="muted">Viene inviata l'e-mail per impostare la password.</p>
774
+ <form id="local-user"><label>Email<input name="email" type="email" required><span class="form-help">Sar\xE0 l'identificativo di accesso dell'utente e ricever\xE0 il messaggio per impostare la password.</span></label><label>Nome<input name="nome"></label><label>Cognome<input name="cognome"></label><button>Crea utente</button></form>`);
775
+ byId("back").onclick = () => show("users");
776
+ const localUserForm = document.getElementById("local-user");
777
+ if (localUserForm) localUserForm.onsubmit = (event) => {
778
+ event.preventDefault();
779
+ handleAction(async () => {
780
+ await createManagedUser(formValues(eventForm(event)));
781
+ showNotice("Utente creato; inviata la procedura di impostazione password.");
782
+ await show("users");
783
+ });
784
+ };
785
+ }
786
+ async function showSsoUserForm() {
787
+ const providers = result(await getFederatedProviders());
788
+ if (!providers.some((provider) => provider.active)) {
789
+ throw new Error("Prima di creare un utente SSO, censisci e abilita almeno un provider SSO.");
790
+ }
791
+ render(`<button id="back">Indietro</button><h2>Nuovo utente SSO</h2><p class="muted">La console salva solo un collegamento gi\xE0 verificato dal backend; non accetta e non verifica token esterni.</p>
792
+ <form id="sso-user"><label>Email<input name="email" type="email" required><span class="form-help">Email di contatto e identificativo Accessi dell'utente.</span></label><label>Nome<input name="nome"></label><label>Cognome<input name="cognome"></label>${federatedIdentityFields(providers)}<label class="check"><input name="passwordLoginEnabled" type="checkbox"> Abilita anche la password locale</label><span class="form-help">Se non selezionato, l'utente acceder\xE0 esclusivamente con una delle identit\xE0 SSO attive.</span><button>Crea utente SSO</button></form>`);
793
+ byId("back").onclick = () => show("users");
794
+ const ssoUserForm = document.getElementById("sso-user");
795
+ if (ssoUserForm) ssoUserForm.onsubmit = (event) => {
796
+ event.preventDefault();
797
+ handleAction(async () => {
798
+ const form = eventForm(event);
799
+ const values = formValues(form);
800
+ const request = {
801
+ provider: values.provider,
802
+ subject: values.subject,
803
+ note: values.note || void 0,
804
+ passwordLoginEnabled: new FormData(form).has("passwordLoginEnabled"),
805
+ user: { email: values.email, nome: values.nome || void 0, cognome: values.cognome || void 0 }
806
+ };
807
+ await createFederatedUser(request);
808
+ showNotice("Utente SSO creato e collegamento registrato.");
809
+ await show("users");
810
+ });
811
+ };
812
+ }
813
+ async function showSso() {
814
+ if (!federatedAuthenticationAvailable) throw new Error("SSO non \xE8 abilitato in questa istanza Accessi.");
815
+ const [users, providers] = await Promise.all([loadUsers(), getFederatedProviders()]);
816
+ const providerList = result(providers);
817
+ render(`<div class="toolbar"><button id="new-sso">Nuovo utente SSO</button><button id="new-provider" class="secondary">Nuovo provider</button></div><h2>Configurazione SSO</h2><p class="muted">Il catalogo definisce le chiavi provider ammesse da Accessi. La validazione dei token, issuer, audience e segreti restano nel backend.</p><h3>Provider censiti</h3><table><thead><tr><th>Provider</th><th>Descrizione</th><th>Stato</th><th></th></tr></thead><tbody>${providerList.map((provider) => `<tr><td><code>${escapeHtml(provider.provider)}</code></td><td>${escapeHtml(provider.description)}</td><td>${provider.active ? "Attivo" : "Disabilitato"}</td><td><button data-provider="${escapeHtml(provider.provider)}">Gestisci</button></td></tr>`).join("") || '<tr><td colspan="4">Nessun provider censito.</td></tr>'}</tbody></table><h3>Utenti e identit\xE0</h3><table><thead><tr><th>Utente</th><th>Identit\xE0 collegate</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><button data-sso-user="${utente.codiceUtente}">Gestisci identit\xE0</button></td></tr>`).join("")}</tbody></table>`);
818
+ byId("new-sso").onclick = () => handleAction(showSsoUserForm);
819
+ byId("new-provider").onclick = () => showProviderForm();
820
+ document.querySelectorAll("[data-provider]").forEach((button) => {
821
+ button.onclick = () => showProviderForm(providerList.find((provider) => provider.provider === button.dataset.provider));
822
+ });
823
+ document.querySelectorAll("[data-sso-user]").forEach((button) => {
824
+ button.onclick = () => handleAction(() => showUser(button.dataset.ssoUser ?? ""));
825
+ });
826
+ }
827
+ function showProviderForm(provider) {
828
+ const isExisting = provider !== void 0;
829
+ 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<input name="provider" value="${escapeHtml(provider?.provider)}" ${isExisting ? "readonly" : ""} required><span class="form-help">Chiave stabile usata dal backend nel payload SSO. Per Azure includi tenant e ambiente, ad esempio <code>azure-ad-acme-produzione</code>. Non \xE8 modificabile dopo il censimento.</span></label><label>Descrizione<input name="description" value="${escapeHtml(provider?.description)}" required><span class="form-help">Nome leggibile per gli amministratori della console.</span></label><label>Nota<input name="note" value="${escapeHtml(provider?.note)}"><span class="form-help">Annotazione interna. Non inserire segreti, issuer, token o dati personali non necessari.</span></label>${isExisting ? `<label class="check"><input name="active" type="checkbox" ${provider.active ? "checked" : ""}> Provider attivo</label><span class="form-help">Disabilitare il provider blocca nuovi login SSO e nuovi collegamenti, ma conserva lo storico delle identit\xE0.</span>` : ""}<button>${isExisting ? "Salva provider" : "Censisci provider"}</button></form>`);
830
+ byId("back").onclick = () => show("sso");
831
+ const providerForm = document.getElementById("provider-form");
832
+ if (providerForm) providerForm.onsubmit = (event) => {
833
+ event.preventDefault();
834
+ handleAction(async () => {
835
+ const form = eventForm(event);
836
+ const values = formValues(form);
837
+ if (provider) {
838
+ const request = {
839
+ description: values.description,
840
+ note: values.note || void 0,
841
+ active: new FormData(form).has("active")
842
+ };
843
+ await updateFederatedProvider(provider.provider, request);
844
+ } else {
845
+ const request = {
846
+ provider: values.provider,
847
+ description: values.description,
848
+ note: values.note || void 0
849
+ };
850
+ await createFederatedProvider(request);
851
+ }
852
+ showNotice(isExisting ? "Provider SSO aggiornato." : "Provider SSO censito.");
853
+ await show("sso");
854
+ });
855
+ };
856
+ }
857
+ async function showUser(rawCode) {
858
+ const codiceUtente = Number(rawCode);
859
+ const [users, roles, grants, groups, providers] = await Promise.all([
860
+ getUsers({ codiceUtente, includeGrants: true }),
861
+ getRoles(),
862
+ getUserRolesAndGrants(codiceUtente),
863
+ getGroupsWithMenus({ includeDisabled: true }),
864
+ federatedAuthenticationAvailable ? getFederatedProviders() : Promise.resolve(null)
865
+ ]);
866
+ const user = result(users)[0].utente;
867
+ const allRoles = result(roles);
868
+ const userGrants = result(grants);
869
+ const menuGroups = result(groups);
870
+ const providerList = providers ? result(providers) : [];
871
+ const linked = federatedAuthenticationAvailable ? result(await getFederatedIdentities(codiceUtente)) : [];
872
+ const identitySection = federatedAuthenticationAvailable ? federatedIdentitySection(linked, providerList) : "";
873
+ const defaultUserTab = federatedAuthenticationAvailable ? "sso" : "profile";
874
+ render(`<div class="user-action-bar"><button id="back" type="button" class="secondary">Indietro</button><button id="disable-user" type="button" class="danger-button">Imposta stato eliminato</button></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">
875
+ ${identitySection}
876
+ <form id="profile" data-user-panel="profile" role="tabpanel" aria-labelledby="user-tab-profile"><h3>Profilo e accesso</h3><label>Nome<input name="nome" value="${escapeHtml(user.nome)}"></label><label>Cognome<input name="cognome" value="${escapeHtml(user.cognome)}"></label><label>Email<input name="email" type="email" value="${escapeHtml(user.email)}" required><span class="form-help">Identificativo di accesso locale e recapito per le comunicazioni Accessi.</span></label>${federatedAuthenticationAvailable ? `<label class="check"><input name="passwordLoginEnabled" type="checkbox" ${user.passwordLoginEnabled !== false ? "checked" : ""}> Login con password</label><span class="form-help">Se disabilitato, il login con email e password restituisce un errore esplicito; restano valide le identit\xE0 SSO attive.</span>` : ""}${authenticationPolicyFields(user)}<button>Salva</button></form>
877
+ ${roleAssignmentEditor(allRoles, userGrants.ruoli, menuGroups)}
878
+ ${directGrantEditor(menuGroups, userGrants.abilitazioni)}
879
+ </div>`);
880
+ byId("back").onclick = () => show("users");
881
+ const userTabButtons = Array.from(document.querySelectorAll("[data-user-tab]"));
882
+ userTabButtons.forEach((button, index) => {
883
+ button.onclick = () => activateUserTab(button.dataset.userTab);
884
+ button.onkeydown = (event) => {
885
+ const targetIndex = event.key === "ArrowRight" ? (index + 1) % userTabButtons.length : event.key === "ArrowLeft" ? (index - 1 + userTabButtons.length) % userTabButtons.length : event.key === "Home" ? 0 : event.key === "End" ? userTabButtons.length - 1 : -1;
886
+ if (targetIndex < 0) return;
887
+ event.preventDefault();
888
+ userTabButtons[targetIndex].focus();
889
+ activateUserTab(userTabButtons[targetIndex].dataset.userTab);
890
+ };
891
+ });
892
+ activateUserTab(defaultUserTab);
893
+ const profileForm = document.getElementById("profile");
894
+ if (profileForm) {
895
+ const twoFactor = profileForm.elements.namedItem("flagDueFattori");
896
+ const passwordless = profileForm.elements.namedItem("passwordlessLoginEnabled");
897
+ twoFactor.onchange = () => {
898
+ passwordless.disabled = !twoFactor.checked;
899
+ if (!twoFactor.checked) passwordless.checked = false;
900
+ };
901
+ profileForm.onsubmit = (event) => {
902
+ event.preventDefault();
903
+ handleAction(async () => {
904
+ const values = formValues(eventForm(event));
905
+ const fields = new FormData(eventForm(event));
906
+ await updateUtente(codiceUtente, {
907
+ codiceUtente,
908
+ email: values.email,
909
+ nome: values.nome || void 0,
910
+ cognome: values.cognome || void 0,
911
+ flagDueFattori: fields.has("flagDueFattori"),
912
+ passwordlessLoginEnabled: fields.has("passwordlessLoginEnabled"),
913
+ ...federatedAuthenticationAvailable ? { passwordLoginEnabled: fields.has("passwordLoginEnabled") } : {}
914
+ });
915
+ if (codiceUtente === currentUser?.codiceUtente && (fields.has("flagDueFattori") !== Boolean(user.flagDueFattori) || fields.has("passwordlessLoginEnabled") !== Boolean(user.passwordlessLoginEnabled))) {
916
+ token = null;
917
+ sessionStorage.removeItem("accessi-console-token");
918
+ setAccessiConsoleToken(null);
919
+ resetLogin();
920
+ await bootstrap();
921
+ byId("login-error").textContent = "Policy aggiornata. Accedi di nuovo con la nuova configurazione.";
922
+ return;
923
+ }
924
+ await showUser(String(codiceUtente));
925
+ activateUserTab("profile");
926
+ showNotice("Profilo e policy aggiornati.");
927
+ });
928
+ };
929
+ }
930
+ const rolesForm = document.getElementById("roles");
931
+ if (rolesForm) rolesForm.onsubmit = (event) => {
932
+ event.preventDefault();
933
+ handleAction(async () => {
934
+ await assignRolesToUser(codiceUtente, { roles: selectedNumbers(eventForm(event), "role") });
935
+ showNotice("Ruoli aggiornati.");
936
+ });
937
+ };
938
+ const grantsForm = document.getElementById("grants");
939
+ if (grantsForm) grantsForm.onsubmit = (event) => {
940
+ event.preventDefault();
941
+ handleAction(async () => {
942
+ const permissions = [];
943
+ new FormData(eventForm(event)).forEach((value, key) => {
944
+ if (key.startsWith("grant:") && value) permissions.push({ codiceMenu: key.slice(6), tipoAbilitazione: Number(value) });
945
+ });
946
+ await assignPermissionsToUser(codiceUtente, { permissions });
947
+ showNotice("Grant aggiornati.");
948
+ });
949
+ };
950
+ if (federatedAuthenticationAvailable) {
951
+ const linkForm = document.getElementById("link-sso");
952
+ if (linkForm) linkForm.onsubmit = (event) => {
953
+ event.preventDefault();
954
+ handleAction(async () => {
955
+ const values = formValues(eventForm(event));
956
+ await linkFederatedIdentity(codiceUtente, { provider: values.provider, subject: values.subject, note: values.note || void 0 });
957
+ await showUser(String(codiceUtente));
958
+ });
959
+ };
960
+ document.querySelectorAll("[data-identity-toggle]").forEach((button) => {
961
+ button.onclick = () => handleAction(async () => {
962
+ await updateFederatedIdentity(button.dataset.identityToggle ?? "", { active: button.dataset.active === "true" });
963
+ await showUser(String(codiceUtente));
964
+ });
965
+ });
966
+ document.querySelectorAll("[data-identity-delete]").forEach((button) => {
967
+ button.onclick = () => handleAction(async () => {
968
+ if (!window.confirm("Eliminare definitivamente questo collegamento SSO? L\u2019utente Accessi non verr\xE0 eliminato.")) return;
969
+ await deleteFederatedIdentityPermanently(codiceUtente, button.dataset.identityDelete ?? "");
970
+ showNotice("Collegamento SSO eliminato definitivamente.");
971
+ await showUser(String(codiceUtente));
972
+ });
973
+ });
974
+ }
975
+ byId("disable-user").onclick = () => handleAction(async () => {
976
+ await deleteUser(codiceUtente);
977
+ showNotice("Utente impostato come eliminato.");
978
+ await show("users");
979
+ });
980
+ }
981
+ async function showRoles() {
982
+ const [rolesResponse, groupsResponse] = await Promise.all([getRoles(), getGroupsWithMenus({ includeDisabled: true })]);
983
+ const roles = result(rolesResponse);
984
+ const groups = result(groupsResponse);
985
+ render(`<div class="toolbar"><button id="new-role">Nuovo ruolo</button></div><h2>Ruoli e grant</h2><p class="form-help">Panoramica completa dei menu inclusi in ogni ruolo. Il livello indica l'abilitazione assegnata dal ruolo per quello specifico menu.</p><div class="role-overview-list">${roles.map((role) => roleOverview(role, groups)).join("") || '<p class="muted">Nessun ruolo configurato.</p>'}</div>`);
986
+ const roleForm = (role) => {
987
+ render(`<button id="back" type="button">Indietro</button><h2>${role ? "Modifica" : "Nuovo"} ruolo</h2><form id="role-form"><label>Descrizione<input name="descrizione" value="${escapeHtml(role?.descrizioneRuolo)}" required><span class="form-help">Nome mostrato agli amministratori per identificare questo insieme di autorizzazioni.</span></label><p class="form-help">Ogni gruppo presenta una riga per menu. Seleziona i menu da includere e imposta il livello di abilitazione. Il salvataggio sostituisce integralmente la configurazione corrente del ruolo.</p><div class="role-menu-groups">${groups.map((group) => roleMenuEditorTable(group, role)).join("")}</div><button>Salva ruolo</button></form>`);
988
+ byId("back").onclick = () => show("roles");
989
+ document.querySelectorAll('#role-form input[name="menu"]').forEach((checkbox) => {
990
+ checkbox.onchange = () => {
991
+ const row = checkbox.closest("tr");
992
+ const status = checkbox.parentElement?.querySelector("span");
993
+ const level = row?.querySelector('select[name^="menu-level:"]');
994
+ if (status) status.textContent = checkbox.checked ? "Incluso" : "Escluso";
995
+ if (level) level.disabled = !checkbox.checked;
996
+ };
997
+ });
998
+ const roleFormElement = document.getElementById("role-form");
999
+ if (roleFormElement) roleFormElement.onsubmit = async (event) => {
1000
+ event.preventDefault();
1001
+ const form = eventForm(event);
1002
+ const data = new FormData(form);
1003
+ const request = { descrizioneRuolo: formValues(form).descrizione, menu: Array.from(data.getAll("menu"), (codiceMenu) => ({ codiceMenu: String(codiceMenu), tipoAbilitazione: Number(data.get(`menu-level:${codiceMenu}`) ?? 10) })) };
1004
+ if (role?.codiceRuolo) await updateRole(role.codiceRuolo, request);
1005
+ else await createRole(request);
1006
+ await show("roles");
1007
+ };
1008
+ };
1009
+ byId("new-role").onclick = () => roleForm();
1010
+ document.querySelectorAll("[data-role]").forEach((button) => button.onclick = () => roleForm(roles.find((role) => role.codiceRuolo === Number(button.dataset.role))));
1011
+ }
1012
+ async function showMenus() {
1013
+ const groups = result(await getGroupsWithMenus({ includeDisabled: true }));
1014
+ render(`<h2>Menu e gruppi</h2><p class="form-help">Attiva o disattiva gruppi e menu. Ogni riga riporta i dati necessari per individuare l'uso tecnico del menu.</p><div class="menu-group-list">${groups.map(menuGroupTable).join("")}</div>`);
1015
+ document.querySelectorAll("[data-group]").forEach((input) => input.onchange = async () => {
1016
+ await setGroupEnabled(input.dataset.group ?? "", { enabled: input.checked });
1017
+ showNotice("Gruppo aggiornato.");
1018
+ });
1019
+ document.querySelectorAll("[data-menu]").forEach((input) => input.onchange = async () => {
1020
+ await setMenuEnabled(input.dataset.menu ?? "", { enabled: input.checked });
1021
+ showNotice("Menu aggiornato.");
1022
+ });
1023
+ }
1024
+ async function showFilters() {
1025
+ const users = await loadUsers();
1026
+ render(`<h2>Filtri utente</h2><form id="filters"><label>Utente<select name="codUte">${users.map(({ utente }) => `<option value="${utente.codiceUtente}">${escapeHtml(utente.email)}</option>`).join("")}</select><span class="form-help">I filtri vengono letti e salvati esclusivamente per l'utente selezionato.</span></label><label>Filtro JSON<textarea name="json" rows="12">{}</textarea><span class="form-help">Configurazione tecnica del filtro. Usa Carica per partire dalla struttura esistente e mantieni il JSON valido prima di salvare.</span></label><button name="action" value="load">Carica</button><button name="action" value="save">Salva</button></form>`);
1027
+ const filtersForm = document.getElementById("filters");
1028
+ if (filtersForm) filtersForm.onsubmit = async (event) => {
1029
+ event.preventDefault();
1030
+ const form = eventForm(event);
1031
+ const action = event.submitter?.value;
1032
+ const code = Number(formValues(form).codUte);
1033
+ if (action === "load") {
1034
+ const filters = result(await getFiltriUtente({ codUte: code }));
1035
+ form.elements.namedItem("json").value = JSON.stringify(filters[0] ?? { codUte: code }, null, 2);
1036
+ } else {
1037
+ const parsed = JSON.parse(formValues(form).json);
1038
+ await saveFiltriUtente({ ...parsed, codUte: code });
1039
+ showNotice("Filtri salvati.");
1040
+ }
1041
+ };
1042
+ }
1043
+ async function show(view) {
1044
+ try {
1045
+ showNotice("");
1046
+ const views = { users: showUsers, roles: showRoles, menus: showMenus, filters: showFilters, sso: showSso };
1047
+ setActiveNavigation(view);
1048
+ await views[view]();
1049
+ } catch (error) {
1050
+ render("");
1051
+ showNotice(error instanceof Error ? error.message : "Operazione non riuscita.", true);
1052
+ }
1053
+ }
1054
+ var loginForm = document.getElementById("login-form");
1055
+ if (loginForm) loginForm.onsubmit = loginView;
1056
+ byId("restart-login").onclick = resetLogin;
1057
+ byId("two-factor-form").onsubmit = async (event) => {
1058
+ event.preventDefault();
1059
+ if (!pendingChallenge) return;
1060
+ try {
1061
+ byId("login-error").textContent = "";
1062
+ const values = formValues(event.currentTarget);
1063
+ await completeLoginStep(result(await verifyTwoFactor({ challengeId: pendingChallenge, code: values.code })));
1064
+ } catch (error) {
1065
+ byId("login-error").textContent = error instanceof Error ? error.message : "Verifica non riuscita.";
1066
+ }
1067
+ };
1068
+ byId("resend-code").onclick = async () => {
1069
+ if (!pendingChallenge) return;
1070
+ try {
1071
+ byId("login-error").textContent = "";
1072
+ await completeLoginStep(result(await resendTwoFactor({ challengeId: pendingChallenge })));
1073
+ } catch (error) {
1074
+ byId("login-error").textContent = error instanceof Error ? error.message : "Reinvio non riuscito.";
1075
+ }
1076
+ };
1077
+ byId("logout").onclick = () => {
1078
+ resetLogin();
1079
+ token = null;
1080
+ currentUser = null;
1081
+ setAccessiConsoleToken(null);
1082
+ sessionStorage.removeItem("accessi-console-token");
1083
+ window.history.replaceState(null, "", consoleBasePath);
1084
+ void bootstrap();
1085
+ };
1086
+ byId("nav").onclick = (event) => {
1087
+ const link = event.target.closest("a[data-view]");
1088
+ if (!link) return;
1089
+ event.preventDefault();
1090
+ handleAction(() => navigate(link.dataset.view));
1091
+ };
1092
+ window.addEventListener("popstate", () => {
1093
+ if (token && currentUser) handleAction(() => show(viewFromLocation()));
1094
+ });
1095
+ window.addEventListener("accessi-console-network", (event) => {
1096
+ updateLoadingState(event.detail.active);
1097
+ });
1098
+ var ssoChallenge = /^#two-factor=([a-f0-9]{64})$/.exec(window.location.hash)?.[1];
1099
+ if (ssoChallenge) {
1100
+ token = null;
1101
+ setAccessiConsoleToken(null);
1102
+ sessionStorage.removeItem("accessi-console-token");
1103
+ window.history.replaceState(null, "", window.location.pathname);
1104
+ showTwoFactor({ challengeId: ssoChallenge, resendAfterSeconds: 60 });
1105
+ } else if (token) void bootstrap();