@atlashub/smartstack 3.30.0 → 3.32.0

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 (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-DJb49NMA.js → AgentSkillsPage-BMxOA-nm.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-DJb49NMA.js.map → AgentSkillsPage-BMxOA-nm.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-CVq3qZoe.js → AgentSkillsPage-DSwfoazB.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-CVq3qZoe.js.map → AgentSkillsPage-DSwfoazB.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-oHEi-sFh.js → AgentWorkloadPage-B_emq8kd.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-oHEi-sFh.js.map → AgentWorkloadPage-B_emq8kd.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D_nk3gKj.js → AgentWorkloadPage-_USTeYWz.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D_nk3gKj.js.map → AgentWorkloadPage-_USTeYWz.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-Cr0q2HnB.js → ApiCatalogDetailPage-BC_HxVu5.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-Cr0q2HnB.js.map → ApiCatalogDetailPage-BC_HxVu5.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-DX8buBkV.js → ApiCatalogDetailPage-BI7zyZAd.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-DX8buBkV.js.map → ApiCatalogDetailPage-BI7zyZAd.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-DqboIzZE.js → ApiCatalogPage-CutaHo5K.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-DqboIzZE.js.map → ApiCatalogPage-CutaHo5K.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-DN7sazvI.js → ApiCatalogPage-M80MorHU.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-DN7sazvI.js.map → ApiCatalogPage-M80MorHU.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage--9YwwS5A.js → ApplicationDetailPage-DVY0wua0.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage--9YwwS5A.js.map → ApplicationDetailPage-DVY0wua0.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CCNjr64K.js → ApplicationDetailPage-DzszwaIZ.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-CCNjr64K.js.map → ApplicationDetailPage-DzszwaIZ.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-Bs-Xgca4.js → ApplicationsDashboardPage-B3ptvnJz.js} +3 -3
  22. package/dist/chunks/{ApplicationsDashboardPage-Bs-Xgca4.js.map → ApplicationsDashboardPage-B3ptvnJz.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-BSsHN3Yj.js → ApplicationsDashboardPage-D0pxqbEc.js} +2 -2
  24. package/dist/chunks/{ApplicationsDashboardPage-BSsHN3Yj.js.map → ApplicationsDashboardPage-D0pxqbEc.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-DDysNWJ5.js → ApplicationsGridPage-Ca23FBSP.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-DDysNWJ5.js.map → ApplicationsGridPage-Ca23FBSP.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-s1WEzOXS.js → ApplicationsGridPage-qi2UCD24.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-s1WEzOXS.js.map → ApplicationsGridPage-qi2UCD24.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-B3CSMiV0.js → ApplicationsListPage-CEUmBXN0.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-B3CSMiV0.js.map → ApplicationsListPage-CEUmBXN0.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-B6ZCecIl.js → ApplicationsListPage-cE82bv8j.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-B6ZCecIl.js.map → ApplicationsListPage-cE82bv8j.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-ztPwoAGt.js → ApplicationsPage-DW1BrVVN.js} +4 -4
  34. package/dist/chunks/{ApplicationsPage-ztPwoAGt.js.map → ApplicationsPage-DW1BrVVN.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-BBaiBM--.js → ApplicationsPage-RAqTs5HI.js} +2 -2
  36. package/dist/chunks/{ApplicationsPage-BBaiBM--.js.map → ApplicationsPage-RAqTs5HI.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-CK4L4rBO.js → AssignmentRulesPage-C0qnk3oR.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-CK4L4rBO.js.map → AssignmentRulesPage-C0qnk3oR.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-DFSVFFXr.js → AssignmentRulesPage-CVgFmhEs.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-DFSVFFXr.js.map → AssignmentRulesPage-CVgFmhEs.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-JCLpyg94.js → AssignmentsPage-Bv9HYtYN.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-JCLpyg94.js.map → AssignmentsPage-Bv9HYtYN.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-Bp7oQD7Q.js → AssignmentsPage-z1q1C9Uz.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-Bp7oQD7Q.js.map → AssignmentsPage-z1q1C9Uz.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-Bl9xlJ3h.js → AuthCallbackPage-CcteN6Kv.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-Bl9xlJ3h.js.map → AuthCallbackPage-CcteN6Kv.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-CzMHz4jy.js → AuthCallbackPage-DL5PJUYJ.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-CzMHz4jy.js.map → AuthCallbackPage-DL5PJUYJ.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-D_8T1vqV.js → ConfirmEmailPage-BP8VUz-A.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-D_8T1vqV.js.map → ConfirmEmailPage-BP8VUz-A.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-M7mJgXvn.js → ConfirmEmailPage-CeflKXpN.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-M7mJgXvn.js.map → ConfirmEmailPage-CeflKXpN.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-BNEGavlu.js → CreateSupportTicketPage-BAdvWb_8.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-BNEGavlu.js.map → CreateSupportTicketPage-BAdvWb_8.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-C2X2mfds.js → CreateSupportTicketPage-DDiv79-p.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-C2X2mfds.js.map → CreateSupportTicketPage-DDiv79-p.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-4oy2YqvT.js → DashboardPage-B_uyyRRE.js} +2 -2
  58. package/dist/chunks/{DashboardPage-4oy2YqvT.js.map → DashboardPage-B_uyyRRE.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CPArUG-S.js → DashboardPage-CpoduSu7.js} +2 -2
  60. package/dist/chunks/{DashboardPage-CPArUG-S.js.map → DashboardPage-CpoduSu7.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-CO-8B8EI.js → DashboardPage-D4pyUgdM.js} +3 -3
  62. package/dist/chunks/{DashboardPage-CO-8B8EI.js.map → DashboardPage-D4pyUgdM.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-D5MRMxEV.js → DashboardPage-Kp-MCxW4.js} +3 -3
  64. package/dist/chunks/{DashboardPage-D5MRMxEV.js.map → DashboardPage-Kp-MCxW4.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-DnjLFXnL.js → EscalationConfigPage-D-WCN6YS.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-DnjLFXnL.js.map → EscalationConfigPage-D-WCN6YS.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CwdnfJbJ.js → EscalationConfigPage-UrLJarSI.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CwdnfJbJ.js.map → EscalationConfigPage-UrLJarSI.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-sh-3h_H9.js → ForceChangePasswordPage-BIh1SF5C.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-sh-3h_H9.js.map → ForceChangePasswordPage-BIh1SF5C.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-ZEIfyqwE.js → ForceChangePasswordPage-FFZZRpU7.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-ZEIfyqwE.js.map → ForceChangePasswordPage-FFZZRpU7.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-B4M6-xeM.js → ForgotPasswordPage-BKqRF7SF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-B4M6-xeM.js.map → ForgotPasswordPage-BKqRF7SF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-MIu-U7p0.js → ForgotPasswordPage-BXp8qQUX.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-MIu-U7p0.js.map → ForgotPasswordPage-BXp8qQUX.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-4XK3Bs_r.js → GroupDetailPage-a0hBx-LO.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-4XK3Bs_r.js.map → GroupDetailPage-a0hBx-LO.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-C-kvtd2T.js → GroupDetailPage-eGGJCqgq.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-C-kvtd2T.js.map → GroupDetailPage-eGGJCqgq.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-CP41FzHi.js → MyAccessRequestsPage-BgQSyy5d.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-CP41FzHi.js.map → MyAccessRequestsPage-BgQSyy5d.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-DzrXTrVi.js → MyAccessRequestsPage-Dmb0rUHO.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-DzrXTrVi.js.map → MyAccessRequestsPage-Dmb0rUHO.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-V_SwYio2.js → MyTenantsPage-BZTeqyDr.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-V_SwYio2.js.map → MyTenantsPage-BZTeqyDr.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-CZRkMbh8.js → MyTenantsPage-kCHBF2uA.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-CZRkMbh8.js.map → MyTenantsPage-kCHBF2uA.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DOUhaLal.js → MyTicketsPage-BwNIqpCE.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DOUhaLal.js.map → MyTicketsPage-BwNIqpCE.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DnvAIeyr.js → MyTicketsPage-CTpjkA5t.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DnvAIeyr.js.map → MyTicketsPage-CTpjkA5t.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-DfTa4jCG.js → NavigationAppsPage-DO5bTibb.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-DfTa4jCG.js.map → NavigationAppsPage-DO5bTibb.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-DXvpLsbt.js → NavigationAppsPage-vx_n07SD.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-DXvpLsbt.js.map → NavigationAppsPage-vx_n07SD.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-I1yCk7tk.js → NotificationsPage-Br9sb9AQ.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-I1yCk7tk.js.map → NotificationsPage-Br9sb9AQ.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-D76MdAs-.js → NotificationsPage-CRhd752L.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-D76MdAs-.js.map → NotificationsPage-CRhd752L.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DtWUPCh3.js → OnboardingWizardPage-BIl3Usew.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DtWUPCh3.js.map → OnboardingWizardPage-BIl3Usew.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BRUzcl1A.js → OnboardingWizardPage-CjqxWX7h.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BRUzcl1A.js.map → OnboardingWizardPage-CjqxWX7h.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-DJJGbXoX.js → PermissionDetailPage-COIuJXH-.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-DJJGbXoX.js.map → PermissionDetailPage-COIuJXH-.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-CUNKbl7t.js → PermissionDetailPage-P_d6xnY0.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-CUNKbl7t.js.map → PermissionDetailPage-P_d6xnY0.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-B8wmawPV.js → PermissionsPage-BhjnMyFY.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-B8wmawPV.js.map → PermissionsPage-BhjnMyFY.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-Dbjcctuh.js → PermissionsPage-CHYy8XFr.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-Dbjcctuh.js.map → PermissionsPage-CHYy8XFr.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-zii0ll57.js → PortalDashboardPage-BwQ4NQrH.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-zii0ll57.js.map → PortalDashboardPage-BwQ4NQrH.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-BeNfBZmb.js → PortalDashboardPage-hLJcfGnT.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-BeNfBZmb.js.map → PortalDashboardPage-hLJcfGnT.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BmvrBaAD.js → PreferencesPage-DYYqisR0.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BmvrBaAD.js.map → PreferencesPage-DYYqisR0.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-BCpuIGzv.js → PreferencesPage-DzpM-lpD.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-BCpuIGzv.js.map → PreferencesPage-DzpM-lpD.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-eowQd59_.js → ProfilePage-D98bvXeT.js} +2 -2
  122. package/dist/chunks/{ProfilePage-eowQd59_.js.map → ProfilePage-D98bvXeT.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-mf5wI0-n.js → ProfilePage-DWRDN0fo.js} +2 -2
  124. package/dist/chunks/{ProfilePage-mf5wI0-n.js.map → ProfilePage-DWRDN0fo.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-CLsaUNqA.js → ReferencesManagementPage-B0Cq9BHS.js} +2 -2
  126. package/dist/chunks/{ReferencesManagementPage-CLsaUNqA.js.map → ReferencesManagementPage-B0Cq9BHS.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-8UPgkVE8.js → ReferencesManagementPage-CxbfOBs2.js} +3 -3
  128. package/dist/chunks/{ReferencesManagementPage-8UPgkVE8.js.map → ReferencesManagementPage-CxbfOBs2.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-57X-ILDb.js → RegisterPage-DMeq3GzW.js} +2 -2
  130. package/dist/chunks/{RegisterPage-57X-ILDb.js.map → RegisterPage-DMeq3GzW.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-CNyHSbqs.js → RegisterPage-DvG2Php7.js} +2 -2
  132. package/dist/chunks/{RegisterPage-CNyHSbqs.js.map → RegisterPage-DvG2Php7.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-JW8-mh_k.js → ResetPasswordPage-DOTswepm.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-JW8-mh_k.js.map → ResetPasswordPage-DOTswepm.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CyV8l-Zo.js → ResetPasswordPage-ntMMFvDo.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CyV8l-Zo.js.map → ResetPasswordPage-ntMMFvDo.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-wddG59kg.js → ResolutionModal-CKt73sIZ.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-wddG59kg.js.map → ResolutionModal-CKt73sIZ.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-CjwE73NX.js → ResolutionModal-XGHCELez.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-CjwE73NX.js.map → ResolutionModal-XGHCELez.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-CrioVHFI.js → RoleDetailPage-BtnYTVN6.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-CrioVHFI.js.map → RoleDetailPage-BtnYTVN6.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-TUOGR1ow.js → RoleDetailPage-DAp65p0d.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-TUOGR1ow.js.map → RoleDetailPage-DAp65p0d.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-CAcols3D.js → RolesPage-DyEhJHxw.js} +2 -2
  146. package/dist/chunks/{RolesPage-CAcols3D.js.map → RolesPage-DyEhJHxw.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-sJBWaNff.js → RolesPage-FmZCLEYo.js} +2 -2
  148. package/dist/chunks/{RolesPage-sJBWaNff.js.map → RolesPage-FmZCLEYo.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-BPGRloOS.js → SlaConfigPage-DTtP2Q4t.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-BPGRloOS.js.map → SlaConfigPage-DTtP2Q4t.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-D5TRn7Ir.js → SlaConfigPage-LpVD_ai4.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-D5TRn7Ir.js.map → SlaConfigPage-LpVD_ai4.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-UXmYLrIq.js → SupportPermissionsPage-BV8F_Tl3.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-UXmYLrIq.js.map → SupportPermissionsPage-BV8F_Tl3.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-Dc2bWTzG.js → SupportPermissionsPage-Bzfq6pKf.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-Dc2bWTzG.js.map → SupportPermissionsPage-Bzfq6pKf.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-nTY85sNA.js → TemplatesPage-CYHH5WlP.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-nTY85sNA.js.map → TemplatesPage-CYHH5WlP.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-dmPlqqiD.js → TemplatesPage-czt_RH5f.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-dmPlqqiD.js.map → TemplatesPage-czt_RH5f.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BhT-31ls.js → TenantCard-Bqh5PGJx.js} +2 -2
  162. package/dist/chunks/{TenantCard-BhT-31ls.js.map → TenantCard-Bqh5PGJx.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-BUXfstRZ.js → TenantCard-C6qKD480.js} +2 -2
  164. package/dist/chunks/{TenantCard-BUXfstRZ.js.map → TenantCard-C6qKD480.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-B-SRDR2R.js → TenantScopeSelector-DWUP8Le7.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-B-SRDR2R.js.map → TenantScopeSelector-DWUP8Le7.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-3_mzBLNI.js → TenantScopeSelector-DxQ7HNbh.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-3_mzBLNI.js.map → TenantScopeSelector-DxQ7HNbh.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-xN3wPnFL.js → TicketDetailPage-BuxXLcJi.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-xN3wPnFL.js.map → TicketDetailPage-BuxXLcJi.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-B4cR3rOC.js → TicketDetailPage-Dy4pg33-.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-B4cR3rOC.js.map → TicketDetailPage-Dy4pg33-.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-CkHgXSxU.js → TicketsPage-Ck-HUgte.js} +2 -2
  174. package/dist/chunks/{TicketsPage-CkHgXSxU.js.map → TicketsPage-Ck-HUgte.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-Dwi2xpMI.js → TicketsPage-jlN9JDzm.js} +2 -2
  176. package/dist/chunks/{TicketsPage-Dwi2xpMI.js.map → TicketsPage-jlN9JDzm.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-D2a3EOey.js → UserCreateTicketPage-BrRZyXMn.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-D2a3EOey.js.map → UserCreateTicketPage-BrRZyXMn.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-bcbSLglE.js → UserCreateTicketPage-D58Ro4Nb.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-bcbSLglE.js.map → UserCreateTicketPage-D58Ro4Nb.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-DwnDRNoW.js → UserDashboardPage-C5ulSzaI.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-DwnDRNoW.js.map → UserDashboardPage-C5ulSzaI.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-ZMsx8LWw.js → UserDashboardPage-CjAx5OHh.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-ZMsx8LWw.js.map → UserDashboardPage-CjAx5OHh.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-BRFowOFL.js → UserDetailPage-Bhpry9xq.js} +2 -2
  186. package/dist/chunks/{UserDetailPage-BRFowOFL.js.map → UserDetailPage-Bhpry9xq.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CZyV-zsg.js → UserDetailPage-DUu2mA_n.js} +5 -5
  188. package/dist/chunks/{UserDetailPage-CZyV-zsg.js.map → UserDetailPage-DUu2mA_n.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-DzB_pELt.js → UserTicketDetailPage-DpFFjIso.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-DzB_pELt.js.map → UserTicketDetailPage-DpFFjIso.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-BstGk_BP.js → UserTicketDetailPage-YJvBWFEu.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-BstGk_BP.js.map → UserTicketDetailPage-YJvBWFEu.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-DTmhzttW.js → UsersGroupsPage-b2PTQX_m.js} +2 -2
  194. package/dist/chunks/{UsersGroupsPage-DTmhzttW.js.map → UsersGroupsPage-b2PTQX_m.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BygTv_kK.js → UsersGroupsPage-l33K3Nca.js} +3 -3
  196. package/dist/chunks/{UsersGroupsPage-BygTv_kK.js.map → UsersGroupsPage-l33K3Nca.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-TIqSHgHj.js → UsersPage-BjC5ZqTa.js} +2 -2
  198. package/dist/chunks/{UsersPage-TIqSHgHj.js.map → UsersPage-BjC5ZqTa.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-DcwLyMAX.js → UsersPage-NsTukS8m.js} +2 -2
  200. package/dist/chunks/{UsersPage-DcwLyMAX.js.map → UsersPage-NsTukS8m.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-B6dsJzvH.js → accessRequestsApi-C2usKVGJ.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-B6dsJzvH.js.map → accessRequestsApi-C2usKVGJ.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-3FjMFbpa.js → accessRequestsApi-LuovcP6l.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-3FjMFbpa.js.map → accessRequestsApi-LuovcP6l.js.map} +1 -1
  205. package/dist/chunks/{aiApi-DXOdsoxr.js → aiApi-B03u3zUH.js} +2 -2
  206. package/dist/chunks/{aiApi-DXOdsoxr.js.map → aiApi-B03u3zUH.js.map} +1 -1
  207. package/dist/chunks/{aiApi-9G4wG_mT.js → aiApi-Cwg0B8PJ.js} +2 -2
  208. package/dist/chunks/{aiApi-9G4wG_mT.js.map → aiApi-Cwg0B8PJ.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-DhOd6idI.js → applicationAnalyticsApi-BobBdehV.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-DhOd6idI.js.map → applicationAnalyticsApi-BobBdehV.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-D0DEp9Y-.js → applicationAnalyticsApi-jCZhWKOx.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-D0DEp9Y-.js.map → applicationAnalyticsApi-jCZhWKOx.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-Db8G2lLs.js → groupsApi-CoxnW9vH.js} +2 -2
  214. package/dist/chunks/{groupsApi-Db8G2lLs.js.map → groupsApi-CoxnW9vH.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-lbxNsHFv.js → groupsApi-D2lFFcgu.js} +2 -2
  216. package/dist/chunks/{groupsApi-lbxNsHFv.js.map → groupsApi-D2lFFcgu.js.map} +1 -1
  217. package/dist/chunks/{index-xhRXN1Jq.js → index-B5U_Jp0-.js} +2 -2
  218. package/dist/chunks/{index-xhRXN1Jq.js.map → index-B5U_Jp0-.js.map} +1 -1
  219. package/dist/chunks/{index-Bn8HzILk.js → index-BDB_a-p7.js} +4 -4
  220. package/dist/chunks/{index-Bn8HzILk.js.map → index-BDB_a-p7.js.map} +1 -1
  221. package/dist/chunks/{index-DF93KQFR.js → index-BbHRJz-n.js} +2 -2
  222. package/dist/chunks/{index-DF93KQFR.js.map → index-BbHRJz-n.js.map} +1 -1
  223. package/dist/chunks/{index-DqbVFB1H.js → index-CI2WU5ZZ.js} +2 -2
  224. package/dist/chunks/{index-DqbVFB1H.js.map → index-CI2WU5ZZ.js.map} +1 -1
  225. package/dist/chunks/{index-DjC1u2hI.js → index-CLk9ClC2.js} +3 -3
  226. package/dist/chunks/{index-DjC1u2hI.js.map → index-CLk9ClC2.js.map} +1 -1
  227. package/dist/chunks/{index-CgtbaFf5.js → index-CmTKGOa_.js} +2 -2
  228. package/dist/chunks/{index-CgtbaFf5.js.map → index-CmTKGOa_.js.map} +1 -1
  229. package/dist/chunks/{index-DwqLhQ8S.js → index-D5oIr6PO.js} +2 -2
  230. package/dist/chunks/{index-DwqLhQ8S.js.map → index-D5oIr6PO.js.map} +1 -1
  231. package/dist/chunks/{index-CTGSmYvs.js → index-DC6TBJV_.js} +2 -2
  232. package/dist/chunks/{index-CTGSmYvs.js.map → index-DC6TBJV_.js.map} +1 -1
  233. package/dist/chunks/{index-CN2WRyg1.js → index-DN97bp_f.js} +1145 -1108
  234. package/dist/chunks/index-DN97bp_f.js.map +1 -0
  235. package/dist/chunks/{index-DUS-tunb.js → index-DRW5qV_L.js} +2 -2
  236. package/dist/chunks/{index-DUS-tunb.js.map → index-DRW5qV_L.js.map} +1 -1
  237. package/dist/chunks/{index-DLekpNSE.js → index-DcLZao1q.js} +2 -2
  238. package/dist/chunks/{index-DLekpNSE.js.map → index-DcLZao1q.js.map} +1 -1
  239. package/dist/chunks/{index-HsAOBno4.js → index-DcMOmGtX.js} +2 -2
  240. package/dist/chunks/{index-HsAOBno4.js.map → index-DcMOmGtX.js.map} +1 -1
  241. package/dist/chunks/{index-cAikSVW0.js → index-DnML-nfd.js} +10 -10
  242. package/dist/chunks/index-DnML-nfd.js.map +1 -0
  243. package/dist/chunks/{index-DEtq-xUL.js → index-Drd59qAP.js} +8 -8
  244. package/dist/chunks/{index-DEtq-xUL.js.map → index-Drd59qAP.js.map} +1 -1
  245. package/dist/chunks/{index-TiWOcC0g.js → index-EiIHjIgi.js} +2 -2
  246. package/dist/chunks/{index-TiWOcC0g.js.map → index-EiIHjIgi.js.map} +1 -1
  247. package/dist/chunks/{index-D0HS542b.js → index-axYz6ptj.js} +2 -2
  248. package/dist/chunks/{index-D0HS542b.js.map → index-axYz6ptj.js.map} +1 -1
  249. package/dist/chunks/{index-BI2dc1FS.js → index-lXrXnhFc.js} +2 -2
  250. package/dist/chunks/{index-BI2dc1FS.js.map → index-lXrXnhFc.js.map} +1 -1
  251. package/dist/chunks/{index-CUICSveU.js → index-rI-1r6c2.js} +2 -2
  252. package/dist/chunks/{index-CUICSveU.js.map → index-rI-1r6c2.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-__FKj6CN.js → tenantIconMap-B4wAYGWP.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-__FKj6CN.js.map → tenantIconMap-B4wAYGWP.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-CHeS7oLt.js → tenantIconMap-Cfm15HwB.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-CHeS7oLt.js.map → tenantIconMap-Cfm15HwB.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-DF4RwD_6.js → ticketingApi-CLMAPZDw.js} +2 -2
  258. package/dist/chunks/{ticketingApi-DF4RwD_6.js.map → ticketingApi-CLMAPZDw.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-Cj239hYB.js → ticketingApi-CTap4NdE.js} +2 -2
  260. package/dist/chunks/{ticketingApi-Cj239hYB.js.map → ticketingApi-CTap4NdE.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-CViOUwyF.js → useAccessRequests-CBpDkq9o.js} +2 -2
  262. package/dist/chunks/{useAccessRequests-CViOUwyF.js.map → useAccessRequests-CBpDkq9o.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-CFam8zFR.js → useAccessRequests-Cj2-OoAW.js} +3 -3
  264. package/dist/chunks/{useAccessRequests-CFam8zFR.js.map → useAccessRequests-Cj2-OoAW.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-CslSQeBJ.js → useUserAccessRequests-C6l2VMe1.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-CslSQeBJ.js.map → useUserAccessRequests-C6l2VMe1.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-B-Cs6NX1.js → useUserAccessRequests-Ds3K-ENU.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-B-Cs6NX1.js.map → useUserAccessRequests-Ds3K-ENU.js.map} +1 -1
  269. package/dist/components/routing/DynamicRouter.d.ts.map +1 -1
  270. package/dist/contexts/AuthContext.d.ts.map +1 -1
  271. package/dist/contexts/NavigationContext.d.ts.map +1 -1
  272. package/dist/extensions/PageRegistry.d.ts +2 -0
  273. package/dist/extensions/PageRegistry.d.ts.map +1 -1
  274. package/dist/services/api/adminApi/settings.d.ts +8 -3
  275. package/dist/services/api/adminApi/settings.d.ts.map +1 -1
  276. package/dist/smartstack.cjs +1 -1
  277. package/dist/smartstack.js +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-CN2WRyg1.js.map +0 -1
  280. package/dist/chunks/index-cAikSVW0.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-xhRXN1Jq.js","sources":["../../src/pages/platform/administration/configuration/appsettings/AppSettingsPage.tsx","../../src/pages/platform/administration/configuration/appsettings/InfrastructureSection.tsx","../../src/pages/platform/administration/configuration/appsettings/AuthenticationSection.tsx","../../src/pages/platform/administration/configuration/appsettings/LoggingSection.tsx","../../src/pages/platform/administration/configuration/appsettings/EmailSection.tsx","../../src/pages/platform/administration/configuration/appsettings/EntraSection.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useLocation, Outlet } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { Server, Shield, FileText, Mail, Cloud, Loader2, Info } from 'lucide-react';\r\nimport { adminApi, type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface TabConfig {\r\n id: string;\r\n labelKey: string;\r\n icon: React.ElementType;\r\n route: string;\r\n}\r\n\r\nconst TABS: TabConfig[] = [\r\n { id: 'infrastructure', labelKey: 'appsettings.tabs.infrastructure', icon: Server, route: '/administration/configuration/appsettings/infrastructure' },\r\n { id: 'authentication', labelKey: 'appsettings.tabs.authentication', icon: Shield, route: '/administration/configuration/appsettings/authentication' },\r\n { id: 'logging', labelKey: 'appsettings.tabs.logging', icon: FileText, route: '/administration/configuration/appsettings/logging' },\r\n { id: 'email', labelKey: 'appsettings.tabs.email', icon: Mail, route: '/administration/configuration/appsettings/email' },\r\n { id: 'entra', labelKey: 'appsettings.tabs.entra', icon: Cloud, route: '/administration/configuration/appsettings/entra' }\r\n];\r\n\r\nexport function AppSettingsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const [settings, setSettings] = useState<SettingViewModel[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const loadSettings = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.settings.getAll();\r\n // Filter only AppSettings and Environment sources (readonly)\r\n const readonlySettings = result.filter(s =>\r\n s.source === 'AppSettings' || s.source === 'Environment' || s.source === 'Computed'\r\n );\r\n setSettings(readonlySettings);\r\n } catch (err) {\r\n console.error('Failed to load settings:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadSettings();\r\n }, [loadSettings]);\r\n\r\n const getCurrentTab = () => {\r\n const path = location.pathname;\r\n const tab = TABS.find(t => path.includes(t.id));\r\n return tab?.id || 'infrastructure';\r\n };\r\n\r\n const handleTabChange = (tabId: string) => {\r\n const tab = TABS.find(t => t.id === tabId);\r\n if (tab) {\r\n navigate(tab.route);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('appsettings.title', 'Application Settings') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('appsettings.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('appsettings.subtitle')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Info Banner */}\r\n <div className=\"bg-[var(--info-bg)] border border-[var(--info-border)] rounded-[var(--radius-card)] p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n <Info className=\"w-5 h-5 text-[var(--info-text)] flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <h4 className=\"font-medium text-[var(--info-text)]\">\r\n {t('appsettings.readonlyBannerTitle')}\r\n </h4>\r\n <p className=\"text-sm text-[var(--info-text)] opacity-90 mt-1\">\r\n {t('appsettings.readonlyBannerDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <nav className=\"-mb-px flex space-x-8\" aria-label=\"Tabs\">\r\n {TABS.map((tab) => {\r\n const Icon = tab.icon;\r\n const isActive = getCurrentTab() === tab.id;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => handleTabChange(tab.id)}\r\n className={`\r\n group inline-flex items-center py-4 px-1 border-b-2 font-medium text-sm transition-colors\r\n ${isActive\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }\r\n `}\r\n >\r\n <Icon className={`mr-2 h-5 w-5 ${isActive ? 'text-[var(--color-accent-500)]' : 'text-[var(--text-tertiary)] group-hover:text-[var(--text-secondary)]'}`} />\r\n {t(tab.labelKey)}\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Content */}\r\n <Outlet context={{ settings, refreshSettings: loadSettings }} />\r\n </div>\r\n );\r\n}\r\n\r\nexport default AppSettingsPage;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Database, HardDrive, Cloud, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function InfrastructureSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter infrastructure settings\r\n const databaseSettings = settings.filter(s => s.category === 'Database');\r\n const storageSettings = settings.filter(s => s.category === 'Storage');\r\n const localStorageSettings = storageSettings.filter(s => s.key.startsWith('Local') || s.key === 'Provider');\r\n const azureStorageSettings = storageSettings.filter(s => s.key.startsWith('Azure'));\r\n\r\n // Determine active providers\r\n const storageProvider = storageSettings.find(s => s.key === 'Provider')?.value;\r\n const databaseServer = databaseSettings.find(s => s.key === 'Server')?.value;\r\n const databaseName = databaseSettings.find(s => s.key === 'DatabaseName')?.value;\r\n\r\n const isAzureActive = storageProvider === 'Azure';\r\n const isLocalActive = storageProvider === 'Local' || storageProvider === 'FileSystem';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral',\r\n statusLabel?: string\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.active', 'Actif')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.notUsed', 'Non utilisé')}\r\n </span>\r\n )}\r\n {statusLabel && (\r\n <span className=\"text-xs text-[var(--text-secondary)] ml-1\">\r\n ({statusLabel})\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Summary Cards */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.sections.database', 'Database')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Database className=\"w-5 h-5 text-cyan-500\" />\r\n {databaseName || 'N/A'}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {databaseServer}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Storage.Provider', 'Storage Provider')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {isAzureActive ? <Cloud className=\"w-5 h-5 text-sky-500\" /> : <HardDrive className=\"w-5 h-5 text-blue-500\" />}\r\n {storageProvider || 'N/A'}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Database Section */}\r\n {renderSection(\r\n t('appsettings.sections.database', 'Database'),\r\n t('appsettings.sections.databaseDescription', 'SQL Server database configuration'),\r\n databaseSettings,\r\n Database,\r\n 'from-cyan-500/10 to-cyan-600/5',\r\n 'bg-cyan-500/20 text-cyan-600',\r\n 'active'\r\n )}\r\n\r\n {/* Local Storage Section */}\r\n {renderSection(\r\n t('appsettings.sections.localStorage', 'Local Storage'),\r\n t('appsettings.sections.localStorageDescription', 'File system storage configuration'),\r\n localStorageSettings.filter(s => s.key !== 'Provider'),\r\n HardDrive,\r\n isLocalActive ? 'from-green-500/10 to-green-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n isLocalActive ? 'bg-green-500/20 text-green-600' : 'bg-gray-500/20 text-gray-500',\r\n isLocalActive ? 'active' : 'inactive',\r\n isLocalActive ? storageProvider : undefined\r\n )}\r\n\r\n {/* Azure Storage Section */}\r\n {renderSection(\r\n t('appsettings.sections.azureStorage', 'Azure Blob Storage'),\r\n t('appsettings.sections.azureStorageDescription', 'Cloud storage configuration'),\r\n azureStorageSettings,\r\n Cloud,\r\n isAzureActive ? 'from-green-500/10 to-green-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n isAzureActive ? 'bg-green-500/20 text-green-600' : 'bg-gray-500/20 text-gray-500',\r\n isAzureActive ? 'active' : 'inactive',\r\n isAzureActive ? 'Azure' : undefined\r\n )}\r\n\r\n {databaseSettings.length === 0 && storageSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default InfrastructureSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Key, Clock, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\n// Microsoft and Google icons as inline SVG\r\nconst MicrosoftIcon = () => (\r\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M11.4 24H0V12.6h11.4V24zM24 24H12.6V12.6H24V24zM11.4 11.4H0V0h11.4v11.4zm12.6 0H12.6V0H24v11.4z\"/>\r\n </svg>\r\n);\r\n\r\nconst GoogleIcon = () => (\r\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"/>\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/>\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/>\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/>\r\n </svg>\r\n);\r\n\r\nexport function AuthenticationSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter authentication settings\r\n const authSettings = settings.filter(s => s.category === 'Authentication');\r\n const sessionSettings = settings.filter(s => s.category === 'Session');\r\n\r\n // JWT settings\r\n const jwtSettings = authSettings.filter(s =>\r\n s.key.startsWith('Jwt') || s.key.includes('Token')\r\n );\r\n\r\n // OAuth providers\r\n const microsoftConfigured = authSettings.find(s => s.key === 'MicrosoftOAuth')?.value === 'true';\r\n const googleConfigured = authSettings.find(s => s.key === 'GoogleOAuth')?.value === 'true';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Authentication.${setting.key}`, { defaultValue: setting.key })}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Authentication.${setting.key}`, { defaultValue: setting.description })}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral',\r\n statusLabel?: string\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.configured', 'Configuré')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.notConfigured', 'Non configuré')}\r\n </span>\r\n )}\r\n {statusLabel && (\r\n <span className=\"text-xs text-[var(--text-secondary)] ml-1\">\r\n ({statusLabel})\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n // Custom OAuth provider card\r\n const renderOAuthCard = (\r\n name: string,\r\n isConfigured: boolean,\r\n IconComponent: React.FC,\r\n color: string\r\n ) => {\r\n return (\r\n <div className={`rounded-lg border ${isConfigured ? 'border-green-500/50 ring-1 ring-green-500/20' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${color}`}>\r\n <IconComponent />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-semibold text-[var(--text-primary)]\">{name}</span>\r\n {isConfigured ? (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.configured', 'Configuré')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.notConfigured', 'Non configuré')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {isConfigured\r\n ? t('appsettings.oauthConfiguredDesc', 'OAuth authentication is enabled')\r\n : t('appsettings.oauthNotConfiguredDesc', 'ClientId not configured in appsettings.json')\r\n }\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* OAuth Providers Summary */}\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('appsettings.sections.oauthProviders', 'OAuth Providers')}\r\n </h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {renderOAuthCard('Microsoft', microsoftConfigured, MicrosoftIcon, 'bg-blue-500/20 text-blue-600')}\r\n {renderOAuthCard('Google', googleConfigured, GoogleIcon, 'bg-red-500/20 text-red-600')}\r\n </div>\r\n </div>\r\n\r\n {/* JWT Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.jwt', 'JWT Configuration'),\r\n t('appsettings.sections.jwtDescription', 'JSON Web Token settings for authentication'),\r\n jwtSettings,\r\n Key,\r\n 'from-violet-500/10 to-violet-600/5',\r\n 'bg-violet-500/20 text-violet-600',\r\n 'active'\r\n )}\r\n\r\n {/* Session Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.session', 'Session'),\r\n t('appsettings.sections.sessionDescription', 'User session timeout and validation settings'),\r\n sessionSettings,\r\n Clock,\r\n 'from-amber-500/10 to-amber-600/5',\r\n 'bg-amber-500/20 text-amber-600',\r\n 'active'\r\n )}\r\n\r\n {authSettings.length === 0 && sessionSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default AuthenticationSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { FileText, Monitor, Database, BarChart3, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function LoggingSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter logging settings\r\n const loggingSettings = settings.filter(s => s.category === 'Logging');\r\n\r\n // Categorize logging settings\r\n const fileSettings = loggingSettings.filter(s =>\r\n s.key.includes('File') || s.key.includes('Rolling') || s.key.includes('Retention')\r\n );\r\n const seqSettings = loggingSettings.filter(s => s.key.includes('Seq'));\r\n const appInsightsSettings = loggingSettings.filter(s => s.key.includes('AppInsights'));\r\n const levelSettings = loggingSettings.filter(s => s.key.includes('Level') || s.key.includes('Minimum'));\r\n\r\n // Check which sinks are enabled\r\n const consoleEnabled = loggingSettings.find(s => s.key === 'ConsoleEnabled')?.value === 'true';\r\n const fileEnabled = loggingSettings.find(s => s.key === 'FileEnabled')?.value === 'true';\r\n const seqEnabled = loggingSettings.find(s => s.key === 'SeqEnabled')?.value === 'true';\r\n const appInsightsEnabled = loggingSettings.find(s => s.key === 'AppInsightsEnabled')?.value === 'true';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Logging.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Logging.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral'\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n // Summary cards for sinks\r\n const renderSinkCard = (\r\n name: string,\r\n enabled: boolean,\r\n icon: React.ElementType,\r\n color: string\r\n ) => {\r\n const Icon = icon;\r\n return (\r\n <div className={`rounded-lg border ${enabled ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${color}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <span className=\"font-semibold text-[var(--text-primary)]\">{name}</span>\r\n {enabled ? (\r\n <span className=\"ml-2 inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n ) : (\r\n <span className=\"ml-2 inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Sinks Summary */}\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('appsettings.sections.loggingSinks', 'Logging Sinks')}\r\n </h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n {renderSinkCard('Console', consoleEnabled, Monitor, 'bg-gray-500/20 text-gray-600')}\r\n {renderSinkCard('File', fileEnabled, FileText, 'bg-violet-500/20 text-violet-600')}\r\n {renderSinkCard('Seq', seqEnabled, Database, 'bg-blue-500/20 text-blue-600')}\r\n {renderSinkCard('App Insights', appInsightsEnabled, BarChart3, 'bg-purple-500/20 text-purple-600')}\r\n </div>\r\n </div>\r\n\r\n {/* Log Levels */}\r\n {renderSection(\r\n t('appsettings.sections.logLevels', 'Log Levels'),\r\n t('appsettings.sections.logLevelsDescription', 'Minimum log level configuration'),\r\n levelSettings,\r\n BarChart3,\r\n 'from-emerald-500/10 to-emerald-600/5',\r\n 'bg-emerald-500/20 text-emerald-600',\r\n 'neutral'\r\n )}\r\n\r\n {/* File Logging */}\r\n {renderSection(\r\n t('appsettings.sections.fileLogging', 'File Logging'),\r\n t('appsettings.sections.fileLoggingDescription', 'File-based log output configuration'),\r\n fileSettings,\r\n FileText,\r\n fileEnabled ? 'from-violet-500/10 to-violet-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n fileEnabled ? 'bg-violet-500/20 text-violet-600' : 'bg-gray-500/20 text-gray-500',\r\n fileEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {/* Seq Logging */}\r\n {seqSettings.length > 0 && renderSection(\r\n t('appsettings.sections.seqLogging', 'Seq'),\r\n t('appsettings.sections.seqLoggingDescription', 'Seq structured logging server'),\r\n seqSettings,\r\n Database,\r\n seqEnabled ? 'from-blue-500/10 to-blue-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n seqEnabled ? 'bg-blue-500/20 text-blue-600' : 'bg-gray-500/20 text-gray-500',\r\n seqEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {/* App Insights */}\r\n {appInsightsSettings.length > 0 && renderSection(\r\n t('appsettings.sections.appInsights', 'Application Insights'),\r\n t('appsettings.sections.appInsightsDescription', 'Azure Application Insights telemetry'),\r\n appInsightsSettings,\r\n BarChart3,\r\n appInsightsEnabled ? 'from-purple-500/10 to-purple-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n appInsightsEnabled ? 'bg-purple-500/20 text-purple-600' : 'bg-gray-500/20 text-gray-500',\r\n appInsightsEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {loggingSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default LoggingSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Mail, Send, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function EmailSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter email settings\r\n const emailSettings = settings.filter(s => s.category === 'Email');\r\n\r\n // Check status\r\n const emailEnabled = emailSettings.find(s => s.key === 'Enabled')?.value === 'true';\r\n const emailProvider = emailSettings.find(s => s.key === 'Provider')?.value;\r\n const fromEmail = emailSettings.find(s => s.key === 'FromEmail')?.value;\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Email.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Email.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral'\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Summary Card */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <div className={`rounded-lg border ${emailEnabled ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.status', 'Status')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {emailEnabled ? (\r\n <>\r\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </>\r\n ) : (\r\n <>\r\n <CircleSlash className=\"w-5 h-5 text-gray-500\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Email.Provider', 'Provider')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Send className=\"w-5 h-5 text-amber-500\" />\r\n {emailProvider || 'N/A'}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Email.FromEmail', 'From Email')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Mail className=\"w-5 h-5 text-amber-500\" />\r\n <span className=\"truncate\">{fromEmail || 'N/A'}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Email Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.emailConfiguration', 'Email Configuration'),\r\n t('appsettings.sections.emailConfigurationDescription', 'SMTP and email provider settings'),\r\n emailSettings,\r\n Mail,\r\n emailEnabled ? 'from-amber-500/10 to-amber-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n emailEnabled ? 'bg-amber-500/20 text-amber-600' : 'bg-gray-500/20 text-gray-500',\r\n emailEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {emailSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default EmailSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Cloud, RefreshCw, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function EntraSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter Entra settings\r\n const entraSettings = settings.filter(s => s.category === 'Entra');\r\n\r\n // Check status\r\n const syncEnabled = entraSettings.find(s => s.key === 'SyncEnabled')?.value === 'true';\r\n const isConfigured = entraSettings.find(s => s.key === 'Configured')?.value === 'true';\r\n const syncInterval = entraSettings.find(s => s.key === 'SyncIntervalMinutes')?.value;\r\n const useDeltaSync = entraSettings.find(s => s.key === 'UseDeltaSync')?.value === 'true';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Entra.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Entra.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral'\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Summary Cards */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\r\n <div className={`rounded-lg border ${isConfigured ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.configuration', 'Configuration')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {isConfigured ? (\r\n <>\r\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\r\n {t('appsettings.configured', 'Configuré')}\r\n </>\r\n ) : (\r\n <>\r\n <CircleSlash className=\"w-5 h-5 text-gray-500\" />\r\n {t('appsettings.notConfigured', 'Non configuré')}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className={`rounded-lg border ${syncEnabled ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Entra.SyncEnabled', 'Sync Status')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <RefreshCw className={`w-5 h-5 ${syncEnabled ? 'text-green-500' : 'text-gray-500'}`} />\r\n {syncEnabled ? t('appsettings.enabled', 'Activé') : t('appsettings.disabled', 'Désactivé')}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Entra.SyncIntervalMinutes', 'Sync Interval')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Cloud className=\"w-5 h-5 text-sky-500\" />\r\n {syncInterval ? `${syncInterval} min` : 'N/A'}\r\n </div>\r\n </div>\r\n <div className={`rounded-lg border ${useDeltaSync ? 'border-green-500/50' : 'border-[var(--border-color)]'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Entra.UseDeltaSync', 'Delta Sync')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {useDeltaSync ? (\r\n <>\r\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\r\n {t('common.yes', 'Oui')}\r\n </>\r\n ) : (\r\n <>\r\n <CircleSlash className=\"w-5 h-5 text-gray-500\" />\r\n {t('common.no', 'Non')}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Entra Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.entraConfiguration', 'Microsoft Entra ID'),\r\n t('appsettings.sections.entraConfigurationDescription', 'Azure AD synchronization settings'),\r\n entraSettings,\r\n Cloud,\r\n isConfigured ? 'from-sky-500/10 to-sky-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n isConfigured ? 'bg-sky-500/20 text-sky-600' : 'bg-gray-500/20 text-gray-500',\r\n isConfigured ? 'active' : 'inactive'\r\n )}\r\n\r\n {entraSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default EntraSection;\r\n"],"names":["TABS","Server","Shield","FileText","Mail","Cloud","AppSettingsPage","useTranslation","navigate","useNavigate","location","useLocation","settings","setSettings","useState","loading","setLoading","loadSettings","useCallback","readonlySettings","adminApi","s","err","useEffect","getCurrentTab","path","t","handleTabChange","tabId","tab","jsx","Loader2","jsxs","Breadcrumb","Info","Icon","isActive","Outlet","InfrastructureSection","useOutletContext","databaseSettings","storageSettings","localStorageSettings","azureStorageSettings","storageProvider","databaseServer","databaseName","isAzureActive","isLocalActive","renderSetting","setting","editKey","getDisplayValue","displayVal","renderSection","title","description","items","icon","gradientFrom","iconColor","status","statusLabel","isInactive","borderClass","CheckCircle2","CircleSlash","Database","HardDrive","MicrosoftIcon","GoogleIcon","AuthenticationSection","authSettings","sessionSettings","jwtSettings","microsoftConfigured","googleConfigured","renderOAuthCard","name","isConfigured","IconComponent","color","Key","Clock","LoggingSection","loggingSettings","fileSettings","seqSettings","appInsightsSettings","levelSettings","consoleEnabled","fileEnabled","seqEnabled","appInsightsEnabled","renderSinkCard","enabled","Monitor","BarChart3","EmailSection","emailSettings","emailEnabled","emailProvider","fromEmail","Fragment","Send","EntraSection","entraSettings","syncEnabled","syncInterval","useDeltaSync","RefreshCw"],"mappings":"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"}
1
+ {"version":3,"file":"index-B5U_Jp0-.js","sources":["../../src/pages/platform/administration/configuration/appsettings/AppSettingsPage.tsx","../../src/pages/platform/administration/configuration/appsettings/InfrastructureSection.tsx","../../src/pages/platform/administration/configuration/appsettings/AuthenticationSection.tsx","../../src/pages/platform/administration/configuration/appsettings/LoggingSection.tsx","../../src/pages/platform/administration/configuration/appsettings/EmailSection.tsx","../../src/pages/platform/administration/configuration/appsettings/EntraSection.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useLocation, Outlet } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { Server, Shield, FileText, Mail, Cloud, Loader2, Info } from 'lucide-react';\r\nimport { adminApi, type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface TabConfig {\r\n id: string;\r\n labelKey: string;\r\n icon: React.ElementType;\r\n route: string;\r\n}\r\n\r\nconst TABS: TabConfig[] = [\r\n { id: 'infrastructure', labelKey: 'appsettings.tabs.infrastructure', icon: Server, route: '/administration/configuration/appsettings/infrastructure' },\r\n { id: 'authentication', labelKey: 'appsettings.tabs.authentication', icon: Shield, route: '/administration/configuration/appsettings/authentication' },\r\n { id: 'logging', labelKey: 'appsettings.tabs.logging', icon: FileText, route: '/administration/configuration/appsettings/logging' },\r\n { id: 'email', labelKey: 'appsettings.tabs.email', icon: Mail, route: '/administration/configuration/appsettings/email' },\r\n { id: 'entra', labelKey: 'appsettings.tabs.entra', icon: Cloud, route: '/administration/configuration/appsettings/entra' }\r\n];\r\n\r\nexport function AppSettingsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const [settings, setSettings] = useState<SettingViewModel[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const loadSettings = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.settings.getAll();\r\n // Filter only AppSettings and Environment sources (readonly)\r\n const readonlySettings = result.filter(s =>\r\n s.source === 'AppSettings' || s.source === 'Environment' || s.source === 'Computed'\r\n );\r\n setSettings(readonlySettings);\r\n } catch (err) {\r\n console.error('Failed to load settings:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadSettings();\r\n }, [loadSettings]);\r\n\r\n const getCurrentTab = () => {\r\n const path = location.pathname;\r\n const tab = TABS.find(t => path.includes(t.id));\r\n return tab?.id || 'infrastructure';\r\n };\r\n\r\n const handleTabChange = (tabId: string) => {\r\n const tab = TABS.find(t => t.id === tabId);\r\n if (tab) {\r\n navigate(tab.route);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('appsettings.title', 'Application Settings') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('appsettings.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('appsettings.subtitle')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Info Banner */}\r\n <div className=\"bg-[var(--info-bg)] border border-[var(--info-border)] rounded-[var(--radius-card)] p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n <Info className=\"w-5 h-5 text-[var(--info-text)] flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <h4 className=\"font-medium text-[var(--info-text)]\">\r\n {t('appsettings.readonlyBannerTitle')}\r\n </h4>\r\n <p className=\"text-sm text-[var(--info-text)] opacity-90 mt-1\">\r\n {t('appsettings.readonlyBannerDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <nav className=\"-mb-px flex space-x-8\" aria-label=\"Tabs\">\r\n {TABS.map((tab) => {\r\n const Icon = tab.icon;\r\n const isActive = getCurrentTab() === tab.id;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => handleTabChange(tab.id)}\r\n className={`\r\n group inline-flex items-center py-4 px-1 border-b-2 font-medium text-sm transition-colors\r\n ${isActive\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }\r\n `}\r\n >\r\n <Icon className={`mr-2 h-5 w-5 ${isActive ? 'text-[var(--color-accent-500)]' : 'text-[var(--text-tertiary)] group-hover:text-[var(--text-secondary)]'}`} />\r\n {t(tab.labelKey)}\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Content */}\r\n <Outlet context={{ settings, refreshSettings: loadSettings }} />\r\n </div>\r\n );\r\n}\r\n\r\nexport default AppSettingsPage;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Database, HardDrive, Cloud, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function InfrastructureSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter infrastructure settings\r\n const databaseSettings = settings.filter(s => s.category === 'Database');\r\n const storageSettings = settings.filter(s => s.category === 'Storage');\r\n const localStorageSettings = storageSettings.filter(s => s.key.startsWith('Local') || s.key === 'Provider');\r\n const azureStorageSettings = storageSettings.filter(s => s.key.startsWith('Azure'));\r\n\r\n // Determine active providers\r\n const storageProvider = storageSettings.find(s => s.key === 'Provider')?.value;\r\n const databaseServer = databaseSettings.find(s => s.key === 'Server')?.value;\r\n const databaseName = databaseSettings.find(s => s.key === 'DatabaseName')?.value;\r\n\r\n const isAzureActive = storageProvider === 'Azure';\r\n const isLocalActive = storageProvider === 'Local' || storageProvider === 'FileSystem';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral',\r\n statusLabel?: string\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.active', 'Actif')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.notUsed', 'Non utilisé')}\r\n </span>\r\n )}\r\n {statusLabel && (\r\n <span className=\"text-xs text-[var(--text-secondary)] ml-1\">\r\n ({statusLabel})\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Summary Cards */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.sections.database', 'Database')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Database className=\"w-5 h-5 text-cyan-500\" />\r\n {databaseName || 'N/A'}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {databaseServer}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Storage.Provider', 'Storage Provider')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {isAzureActive ? <Cloud className=\"w-5 h-5 text-sky-500\" /> : <HardDrive className=\"w-5 h-5 text-blue-500\" />}\r\n {storageProvider || 'N/A'}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Database Section */}\r\n {renderSection(\r\n t('appsettings.sections.database', 'Database'),\r\n t('appsettings.sections.databaseDescription', 'SQL Server database configuration'),\r\n databaseSettings,\r\n Database,\r\n 'from-cyan-500/10 to-cyan-600/5',\r\n 'bg-cyan-500/20 text-cyan-600',\r\n 'active'\r\n )}\r\n\r\n {/* Local Storage Section */}\r\n {renderSection(\r\n t('appsettings.sections.localStorage', 'Local Storage'),\r\n t('appsettings.sections.localStorageDescription', 'File system storage configuration'),\r\n localStorageSettings.filter(s => s.key !== 'Provider'),\r\n HardDrive,\r\n isLocalActive ? 'from-green-500/10 to-green-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n isLocalActive ? 'bg-green-500/20 text-green-600' : 'bg-gray-500/20 text-gray-500',\r\n isLocalActive ? 'active' : 'inactive',\r\n isLocalActive ? storageProvider : undefined\r\n )}\r\n\r\n {/* Azure Storage Section */}\r\n {renderSection(\r\n t('appsettings.sections.azureStorage', 'Azure Blob Storage'),\r\n t('appsettings.sections.azureStorageDescription', 'Cloud storage configuration'),\r\n azureStorageSettings,\r\n Cloud,\r\n isAzureActive ? 'from-green-500/10 to-green-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n isAzureActive ? 'bg-green-500/20 text-green-600' : 'bg-gray-500/20 text-gray-500',\r\n isAzureActive ? 'active' : 'inactive',\r\n isAzureActive ? 'Azure' : undefined\r\n )}\r\n\r\n {databaseSettings.length === 0 && storageSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default InfrastructureSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Key, Clock, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\n// Microsoft and Google icons as inline SVG\r\nconst MicrosoftIcon = () => (\r\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M11.4 24H0V12.6h11.4V24zM24 24H12.6V12.6H24V24zM11.4 11.4H0V0h11.4v11.4zm12.6 0H12.6V0H24v11.4z\"/>\r\n </svg>\r\n);\r\n\r\nconst GoogleIcon = () => (\r\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"/>\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/>\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/>\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/>\r\n </svg>\r\n);\r\n\r\nexport function AuthenticationSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter authentication settings\r\n const authSettings = settings.filter(s => s.category === 'Authentication');\r\n const sessionSettings = settings.filter(s => s.category === 'Session');\r\n\r\n // JWT settings\r\n const jwtSettings = authSettings.filter(s =>\r\n s.key.startsWith('Jwt') || s.key.includes('Token')\r\n );\r\n\r\n // OAuth providers\r\n const microsoftConfigured = authSettings.find(s => s.key === 'MicrosoftOAuth')?.value === 'true';\r\n const googleConfigured = authSettings.find(s => s.key === 'GoogleOAuth')?.value === 'true';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Authentication.${setting.key}`, { defaultValue: setting.key })}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Authentication.${setting.key}`, { defaultValue: setting.description })}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral',\r\n statusLabel?: string\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.configured', 'Configuré')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.notConfigured', 'Non configuré')}\r\n </span>\r\n )}\r\n {statusLabel && (\r\n <span className=\"text-xs text-[var(--text-secondary)] ml-1\">\r\n ({statusLabel})\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n // Custom OAuth provider card\r\n const renderOAuthCard = (\r\n name: string,\r\n isConfigured: boolean,\r\n IconComponent: React.FC,\r\n color: string\r\n ) => {\r\n return (\r\n <div className={`rounded-lg border ${isConfigured ? 'border-green-500/50 ring-1 ring-green-500/20' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${color}`}>\r\n <IconComponent />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-semibold text-[var(--text-primary)]\">{name}</span>\r\n {isConfigured ? (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.configured', 'Configuré')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.notConfigured', 'Non configuré')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {isConfigured\r\n ? t('appsettings.oauthConfiguredDesc', 'OAuth authentication is enabled')\r\n : t('appsettings.oauthNotConfiguredDesc', 'ClientId not configured in appsettings.json')\r\n }\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* OAuth Providers Summary */}\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('appsettings.sections.oauthProviders', 'OAuth Providers')}\r\n </h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {renderOAuthCard('Microsoft', microsoftConfigured, MicrosoftIcon, 'bg-blue-500/20 text-blue-600')}\r\n {renderOAuthCard('Google', googleConfigured, GoogleIcon, 'bg-red-500/20 text-red-600')}\r\n </div>\r\n </div>\r\n\r\n {/* JWT Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.jwt', 'JWT Configuration'),\r\n t('appsettings.sections.jwtDescription', 'JSON Web Token settings for authentication'),\r\n jwtSettings,\r\n Key,\r\n 'from-violet-500/10 to-violet-600/5',\r\n 'bg-violet-500/20 text-violet-600',\r\n 'active'\r\n )}\r\n\r\n {/* Session Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.session', 'Session'),\r\n t('appsettings.sections.sessionDescription', 'User session timeout and validation settings'),\r\n sessionSettings,\r\n Clock,\r\n 'from-amber-500/10 to-amber-600/5',\r\n 'bg-amber-500/20 text-amber-600',\r\n 'active'\r\n )}\r\n\r\n {authSettings.length === 0 && sessionSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default AuthenticationSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { FileText, Monitor, Database, BarChart3, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function LoggingSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter logging settings\r\n const loggingSettings = settings.filter(s => s.category === 'Logging');\r\n\r\n // Categorize logging settings\r\n const fileSettings = loggingSettings.filter(s =>\r\n s.key.includes('File') || s.key.includes('Rolling') || s.key.includes('Retention')\r\n );\r\n const seqSettings = loggingSettings.filter(s => s.key.includes('Seq'));\r\n const appInsightsSettings = loggingSettings.filter(s => s.key.includes('AppInsights'));\r\n const levelSettings = loggingSettings.filter(s => s.key.includes('Level') || s.key.includes('Minimum'));\r\n\r\n // Check which sinks are enabled\r\n const consoleEnabled = loggingSettings.find(s => s.key === 'ConsoleEnabled')?.value === 'true';\r\n const fileEnabled = loggingSettings.find(s => s.key === 'FileEnabled')?.value === 'true';\r\n const seqEnabled = loggingSettings.find(s => s.key === 'SeqEnabled')?.value === 'true';\r\n const appInsightsEnabled = loggingSettings.find(s => s.key === 'AppInsightsEnabled')?.value === 'true';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Logging.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Logging.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral'\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n // Summary cards for sinks\r\n const renderSinkCard = (\r\n name: string,\r\n enabled: boolean,\r\n icon: React.ElementType,\r\n color: string\r\n ) => {\r\n const Icon = icon;\r\n return (\r\n <div className={`rounded-lg border ${enabled ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${color}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <span className=\"font-semibold text-[var(--text-primary)]\">{name}</span>\r\n {enabled ? (\r\n <span className=\"ml-2 inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n ) : (\r\n <span className=\"ml-2 inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Sinks Summary */}\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('appsettings.sections.loggingSinks', 'Logging Sinks')}\r\n </h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n {renderSinkCard('Console', consoleEnabled, Monitor, 'bg-gray-500/20 text-gray-600')}\r\n {renderSinkCard('File', fileEnabled, FileText, 'bg-violet-500/20 text-violet-600')}\r\n {renderSinkCard('Seq', seqEnabled, Database, 'bg-blue-500/20 text-blue-600')}\r\n {renderSinkCard('App Insights', appInsightsEnabled, BarChart3, 'bg-purple-500/20 text-purple-600')}\r\n </div>\r\n </div>\r\n\r\n {/* Log Levels */}\r\n {renderSection(\r\n t('appsettings.sections.logLevels', 'Log Levels'),\r\n t('appsettings.sections.logLevelsDescription', 'Minimum log level configuration'),\r\n levelSettings,\r\n BarChart3,\r\n 'from-emerald-500/10 to-emerald-600/5',\r\n 'bg-emerald-500/20 text-emerald-600',\r\n 'neutral'\r\n )}\r\n\r\n {/* File Logging */}\r\n {renderSection(\r\n t('appsettings.sections.fileLogging', 'File Logging'),\r\n t('appsettings.sections.fileLoggingDescription', 'File-based log output configuration'),\r\n fileSettings,\r\n FileText,\r\n fileEnabled ? 'from-violet-500/10 to-violet-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n fileEnabled ? 'bg-violet-500/20 text-violet-600' : 'bg-gray-500/20 text-gray-500',\r\n fileEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {/* Seq Logging */}\r\n {seqSettings.length > 0 && renderSection(\r\n t('appsettings.sections.seqLogging', 'Seq'),\r\n t('appsettings.sections.seqLoggingDescription', 'Seq structured logging server'),\r\n seqSettings,\r\n Database,\r\n seqEnabled ? 'from-blue-500/10 to-blue-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n seqEnabled ? 'bg-blue-500/20 text-blue-600' : 'bg-gray-500/20 text-gray-500',\r\n seqEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {/* App Insights */}\r\n {appInsightsSettings.length > 0 && renderSection(\r\n t('appsettings.sections.appInsights', 'Application Insights'),\r\n t('appsettings.sections.appInsightsDescription', 'Azure Application Insights telemetry'),\r\n appInsightsSettings,\r\n BarChart3,\r\n appInsightsEnabled ? 'from-purple-500/10 to-purple-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n appInsightsEnabled ? 'bg-purple-500/20 text-purple-600' : 'bg-gray-500/20 text-gray-500',\r\n appInsightsEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {loggingSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default LoggingSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Mail, Send, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function EmailSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter email settings\r\n const emailSettings = settings.filter(s => s.category === 'Email');\r\n\r\n // Check status\r\n const emailEnabled = emailSettings.find(s => s.key === 'Enabled')?.value === 'true';\r\n const emailProvider = emailSettings.find(s => s.key === 'Provider')?.value;\r\n const fromEmail = emailSettings.find(s => s.key === 'FromEmail')?.value;\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Email.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Email.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral'\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Summary Card */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <div className={`rounded-lg border ${emailEnabled ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.status', 'Status')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {emailEnabled ? (\r\n <>\r\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </>\r\n ) : (\r\n <>\r\n <CircleSlash className=\"w-5 h-5 text-gray-500\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Email.Provider', 'Provider')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Send className=\"w-5 h-5 text-amber-500\" />\r\n {emailProvider || 'N/A'}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Email.FromEmail', 'From Email')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Mail className=\"w-5 h-5 text-amber-500\" />\r\n <span className=\"truncate\">{fromEmail || 'N/A'}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Email Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.emailConfiguration', 'Email Configuration'),\r\n t('appsettings.sections.emailConfigurationDescription', 'SMTP and email provider settings'),\r\n emailSettings,\r\n Mail,\r\n emailEnabled ? 'from-amber-500/10 to-amber-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n emailEnabled ? 'bg-amber-500/20 text-amber-600' : 'bg-gray-500/20 text-gray-500',\r\n emailEnabled ? 'active' : 'inactive'\r\n )}\r\n\r\n {emailSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default EmailSection;\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Cloud, RefreshCw, CheckCircle2, CircleSlash } from 'lucide-react';\r\nimport { type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\ntype SectionStatus = 'active' | 'inactive' | 'neutral';\r\n\r\nexport function EntraSection(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { settings } = useOutletContext<SettingsContext>();\r\n\r\n // Filter Entra settings\r\n const entraSettings = settings.filter(s => s.category === 'Entra');\r\n\r\n // Check status\r\n const syncEnabled = entraSettings.find(s => s.key === 'SyncEnabled')?.value === 'true';\r\n const isConfigured = entraSettings.find(s => s.key === 'Configured')?.value === 'true';\r\n const syncInterval = entraSettings.find(s => s.key === 'SyncIntervalMinutes')?.value;\r\n const useDeltaSync = entraSettings.find(s => s.key === 'UseDeltaSync')?.value === 'true';\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n\r\n const getDisplayValue = () => {\r\n if (setting.isSensitive) return '********';\r\n const displayVal = setting.displayValue || setting.value;\r\n if (setting.valueType === 'Bool') {\r\n return displayVal === 'true' || displayVal === 'Yes' ? t('common.yes') : t('common.no');\r\n }\r\n return displayVal;\r\n };\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-3 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`appsettings.keys.Entra.${setting.key}`, setting.key)}\r\n </span>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`appsettings.descriptions.Entra.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"text-right max-w-[50%]\">\r\n <span className={`font-mono text-sm break-all ${\r\n setting.isSensitive\r\n ? 'text-[var(--text-tertiary)]'\r\n : 'text-[var(--text-primary)]'\r\n }`}>\r\n {getDisplayValue()}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderSection = (\r\n title: string,\r\n description: string,\r\n items: SettingViewModel[],\r\n icon: React.ElementType,\r\n gradientFrom: string,\r\n iconColor: string,\r\n status: SectionStatus = 'neutral'\r\n ) => {\r\n const Icon = icon;\r\n if (items.length === 0) return null;\r\n\r\n const isInactive = status === 'inactive';\r\n const isActive = status === 'active';\r\n\r\n let borderClass = 'border-[var(--border-color)]';\r\n if (isActive) borderClass = 'border-green-500/50 ring-1 ring-green-500/20';\r\n else if (isInactive) borderClass = 'border-gray-400/30';\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border ${borderClass} bg-[var(--bg-card)] overflow-hidden shadow-sm ${isInactive ? 'opacity-50' : ''}`}>\r\n <div className={`px-6 py-4 bg-gradient-to-r ${gradientFrom} border-b border-[var(--border-color)]`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`p-2 rounded-lg ${iconColor}`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {title}\r\n </h3>\r\n {isActive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-green-500/20 text-green-700 dark:text-green-400 border border-green-500/30\">\r\n <CheckCircle2 className=\"w-3 h-3\" />\r\n {t('appsettings.enabled', 'Activé')}\r\n </span>\r\n )}\r\n {isInactive && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-gray-500/20 text-gray-600 dark:text-gray-400 border border-gray-500/30\">\r\n <CircleSlash className=\"w-3 h-3\" />\r\n {t('appsettings.disabled', 'Désactivé')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {description}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {items.map(renderSetting)}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Summary Cards */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\r\n <div className={`rounded-lg border ${isConfigured ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.configuration', 'Configuration')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {isConfigured ? (\r\n <>\r\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\r\n {t('appsettings.configured', 'Configuré')}\r\n </>\r\n ) : (\r\n <>\r\n <CircleSlash className=\"w-5 h-5 text-gray-500\" />\r\n {t('appsettings.notConfigured', 'Non configuré')}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className={`rounded-lg border ${syncEnabled ? 'border-green-500/50' : 'border-gray-400/30 opacity-50'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Entra.SyncEnabled', 'Sync Status')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <RefreshCw className={`w-5 h-5 ${syncEnabled ? 'text-green-500' : 'text-gray-500'}`} />\r\n {syncEnabled ? t('appsettings.enabled', 'Activé') : t('appsettings.disabled', 'Désactivé')}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg border border-[var(--border-color)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Entra.SyncIntervalMinutes', 'Sync Interval')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Cloud className=\"w-5 h-5 text-sky-500\" />\r\n {syncInterval ? `${syncInterval} min` : 'N/A'}\r\n </div>\r\n </div>\r\n <div className={`rounded-lg border ${useDeltaSync ? 'border-green-500/50' : 'border-[var(--border-color)]'} bg-[var(--bg-card)] p-4`}>\r\n <div className=\"text-xs text-[var(--text-secondary)] uppercase tracking-wider mb-1\">\r\n {t('appsettings.keys.Entra.UseDeltaSync', 'Delta Sync')}\r\n </div>\r\n <div className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n {useDeltaSync ? (\r\n <>\r\n <CheckCircle2 className=\"w-5 h-5 text-green-500\" />\r\n {t('common.yes', 'Oui')}\r\n </>\r\n ) : (\r\n <>\r\n <CircleSlash className=\"w-5 h-5 text-gray-500\" />\r\n {t('common.no', 'Non')}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Entra Configuration */}\r\n {renderSection(\r\n t('appsettings.sections.entraConfiguration', 'Microsoft Entra ID'),\r\n t('appsettings.sections.entraConfigurationDescription', 'Azure AD synchronization settings'),\r\n entraSettings,\r\n Cloud,\r\n isConfigured ? 'from-sky-500/10 to-sky-600/5' : 'from-gray-500/10 to-gray-600/5',\r\n isConfigured ? 'bg-sky-500/20 text-sky-600' : 'bg-gray-500/20 text-gray-500',\r\n isConfigured ? 'active' : 'inactive'\r\n )}\r\n\r\n {entraSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('appsettings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default EntraSection;\r\n"],"names":["TABS","Server","Shield","FileText","Mail","Cloud","AppSettingsPage","useTranslation","navigate","useNavigate","location","useLocation","settings","setSettings","useState","loading","setLoading","loadSettings","useCallback","readonlySettings","adminApi","s","err","useEffect","getCurrentTab","path","t","handleTabChange","tabId","tab","jsx","Loader2","jsxs","Breadcrumb","Info","Icon","isActive","Outlet","InfrastructureSection","useOutletContext","databaseSettings","storageSettings","localStorageSettings","azureStorageSettings","storageProvider","databaseServer","databaseName","isAzureActive","isLocalActive","renderSetting","setting","editKey","getDisplayValue","displayVal","renderSection","title","description","items","icon","gradientFrom","iconColor","status","statusLabel","isInactive","borderClass","CheckCircle2","CircleSlash","Database","HardDrive","MicrosoftIcon","GoogleIcon","AuthenticationSection","authSettings","sessionSettings","jwtSettings","microsoftConfigured","googleConfigured","renderOAuthCard","name","isConfigured","IconComponent","color","Key","Clock","LoggingSection","loggingSettings","fileSettings","seqSettings","appInsightsSettings","levelSettings","consoleEnabled","fileEnabled","seqEnabled","appInsightsEnabled","renderSinkCard","enabled","Monitor","BarChart3","EmailSection","emailSettings","emailEnabled","emailProvider","fromEmail","Fragment","Send","EntraSection","entraSettings","syncEnabled","syncInterval","useDeltaSync","RefreshCw"],"mappings":"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"}
@@ -3,8 +3,8 @@ import { useState as d, useCallback as V, useEffect as X, useMemo as ie, memo as
3
3
  import { useTranslation as Y } from "react-i18next";
4
4
  import { Loader2 as H, AlertTriangle as re, RefreshCw as Ye, Brain as Tt, DollarSign as ye, Zap as Ve, Activity as Ke, CheckCircle as ue, Clock as Fe, Server as Rt, TrendingUp as Kt, TrendingDown as Vt, X as je, Save as Ue, BookOpen as We, Pencil as qt, XCircle as Ce, Trash2 as Z, Pin as Ut, PinOff as zt, Building2 as xe, AlertCircle as ze, Key as At, ToggleRight as Gt, ToggleLeft as _t, Plus as se, Layers as tt, Globe as Me, KeyRound as Wt, ShieldCheck as Jt, ExternalLink as Ht, Search as Ge, EyeOff as Qt, Eye as oe, Shield as _e, LayoutGrid as Xt, List as Yt, Filter as Zt, ImagePlus as ea, Mic as ta, Volume2 as aa, Radio as sa, Terminal as ra, Cpu as la, AlertOctagon as Dt, ArrowDownUp as na, ArrowUpDown as ia, Settings as at, Play as Ie, Coins as Pt, Check as ca, Copy as qe, ChevronUp as st, ChevronDown as Se, FileText as ce, Tag as Ze, Blocks as ee, Edit2 as de, ArrowLeft as ne, Calendar as $t, User as Ft, GripVertical as Mt, ChevronRight as rt, Lock as fe, Sparkles as lt, ListChecks as nt, MessageSquare as it, Target as ct, Code as oa, Hash as da, Users as ma, Bot as we, Workflow as ke, Timer as ha } from "lucide-react";
5
5
  import { ResponsiveContainer as Ae, AreaChart as pa, CartesianGrid as Je, XAxis as He, YAxis as Le, Tooltip as De, Legend as Qe, Area as xa, PieChart as pt, Pie as xt, Cell as ut, BarChart as ua, Bar as Xe, ComposedChart as ga, Line as va } from "recharts";
6
- import { B as le, k as ba, z as fa, a as It, V as ot, P as dt, p as me } from "./index-CN2WRyg1.js";
7
- import { aiApi as L } from "./aiApi-9G4wG_mT.js";
6
+ import { B as le, k as ba, z as fa, a as It, V as ot, P as dt, p as me } from "./index-DN97bp_f.js";
7
+ import { aiApi as L } from "./aiApi-Cwg0B8PJ.js";
8
8
  import { C as ya } from "./ConfirmModal-BEfzLWOz.js";
9
9
  import { u as jt } from "./useTabNavigation-Bsbskz0i.js";
10
10
  import { useNavigate as he, useParams as Te } from "react-router-dom";
@@ -1009,7 +1009,7 @@ function Ma({
1009
1009
  sublabel: R.slug || void 0
1010
1010
  }));
1011
1011
  }, [r]), q = V(async (j) => {
1012
- const { aiApi: T } = await import("./aiApi-9G4wG_mT.js"), B = await T.skills.getAll(), R = new Set(r?.skills?.map((U) => U.skillId) || []);
1012
+ const { aiApi: T } = await import("./aiApi-Cwg0B8PJ.js"), B = await T.skills.getAll(), R = new Set(r?.skills?.map((U) => U.skillId) || []);
1013
1013
  return B.filter((U) => !R.has(U.id) && (U.name.toLowerCase().includes(j.toLowerCase()) || U.code.toLowerCase().includes(j.toLowerCase()))).slice(0, 10).map((U) => ({
1014
1014
  id: U.id,
1015
1015
  label: U.name,
@@ -6024,4 +6024,4 @@ export {
6024
6024
  ps as AiSkillsEditPage,
6025
6025
  ms as AiSkillsListPage
6026
6026
  };
6027
- //# sourceMappingURL=index-Bn8HzILk.js.map
6027
+ //# sourceMappingURL=index-BDB_a-p7.js.map