@atlashub/smartstack 3.21.0 → 3.24.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-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as r, Fragment as D } from "react/jsx-runtime";
2
2
  import { useState as j, useCallback as K, useEffect as H } from "react";
3
3
  import { useTranslation as E } from "react-i18next";
4
4
  import { useNavigate as q, useLocation as O, Outlet as W, useOutletContext as L } from "react-router-dom";
5
- import { k as Y, B as U } from "./index-CwSaRXXg.js";
5
+ import { k as Y, B as U } from "./index-lpIzhufD.js";
6
6
  import { Loader2 as G, Info as J, Server as R, Shield as Q, FileText as B, Mail as P, Cloud as V, Database as z, HardDrive as F, CheckCircle2 as k, CircleSlash as S, Key as X, Clock as Z, Monitor as _, BarChart3 as M, Send as ee, RefreshCw as te } from "lucide-react";
7
7
  const T = [
8
8
  { id: "infrastructure", labelKey: "appsettings.tabs.infrastructure", icon: R, route: "/administration/configuration/appsettings/infrastructure" },
@@ -582,4 +582,4 @@ export {
582
582
  ge as InfrastructureSection,
583
583
  pe as LoggingSection
584
584
  };
585
- //# sourceMappingURL=index-B9fS7ir6.js.map
585
+ //# sourceMappingURL=index-B7qZTuQ-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-B9fS7ir6.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-B7qZTuQ-.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,7 +3,7 @@ import Ne, { useState as u, useCallback as J, useEffect as W, useMemo as ae, use
3
3
  import { useNavigate as se, useParams as we } from "react-router-dom";
4
4
  import { useTranslation as R } from "react-i18next";
5
5
  import { Loader2 as $, AlertTriangle as K, Plus as B, Search as re, LayoutGrid as ke, LayoutList as Se, Plug as oe, ArrowLeft as ue, CheckCircle as z, Copy as H, Save as xe, Shield as V, Key as ee, RefreshCw as Ce, Trash2 as ne, ChevronUp as Te, ChevronDown as Ie, Globe as De, Clock as he, ChevronLeft as Pe, ChevronRight as Ee, Database as ve, AlertCircle as be, Activity as Re, X as Ue, BookOpen as Le, ToggleRight as de, ToggleLeft as pe, PenLine as $e, Gauge as Me, BarChart3 as qe, Check as Fe, Info as je, CheckSquare as ze, Square as We, Settings as Oe, Terminal as He, FileText as Ge, PowerOff as Be, Power as _e } from "lucide-react";
6
- import { o as G, G as Je, a as ge, k as D, B as ie } from "./index-CwSaRXXg.js";
6
+ import { o as G, G as Je, a as ge, k as D, B as ie } from "./index-lpIzhufD.js";
7
7
  import { u as Ke } from "./useTabNavigation-Bsbskz0i.js";
8
8
  import { C as _ } from "./ConfirmModal-BEfzLWOz.js";
9
9
  function Ve({
@@ -2174,4 +2174,4 @@ export {
2174
2174
  wt as ExternalAppDetailPage,
2175
2175
  Nt as ExternalAppsListPage
2176
2176
  };
2177
- //# sourceMappingURL=index-CdjBY7L8.js.map
2177
+ //# sourceMappingURL=index-Bedzmqr-.js.map