@atlashub/smartstack 3.21.0 → 3.25.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
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsDashboardPage-DTWZxJJM.js","sources":["../../src/components/dashboard/UsageTrendChart.tsx","../../src/components/dashboard/ModulePopularityChart.tsx","../../src/components/dashboard/ApplicationActivityPieChart.tsx","../../src/components/dashboard/HierarchyDrillDownChart.tsx","../../src/pages/platform/administration/applications/ApplicationsDashboardPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport {\r\n LineChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer\r\n} from 'recharts';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ApplicationTrendsDto, ApplicationSeriesDto } from '@/services/api/applicationAnalyticsApi';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\nexport type ChartMode = 'access' | 'duration';\r\n\r\ninterface UsageTrendChartProps {\r\n readonly period?: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst DEFAULT_COLORS = [\r\n '#3b82f6', // blue\r\n '#22c55e', // green\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#06b6d4', // cyan\r\n '#ec4899', // pink\r\n];\r\n\r\nexport const UsageTrendChart: React.FC<UsageTrendChartProps> = ({ period = 30, mode = 'access' }) => {\r\n const [data, setData] = useState<ApplicationTrendsDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const result = await applicationAnalyticsApi.getTrendsByApplication(period);\r\n setData(result);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load trends');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [period]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px]\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n {error || 'Aucune donnée disponible'}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.dailyData?.length || !data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n Aucune donnée de tendance disponible\r\n </div>\r\n );\r\n }\r\n\r\n // Transform data for Recharts based on mode\r\n const chartData = data.dailyData.map((day) => {\r\n const entry: Record<string, string | number> = {\r\n date: new Date(day.date).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: 'short'\r\n })\r\n };\r\n // Add each application's value based on mode\r\n data.applications.forEach((app) => {\r\n if (mode === 'access') {\r\n entry[app.name] = day.applicationCounts[app.name] || 0;\r\n } else {\r\n entry[app.name] = day.applicationDurations?.[app.name] || 0;\r\n }\r\n });\r\n return entry;\r\n });\r\n\r\n const getColor = (app: ApplicationSeriesDto, index: number): string => {\r\n return app.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Chart */}\r\n <div style={{ width: '100%', height: 300 }}>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart\r\n data={chartData}\r\n margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n >\r\n <CartesianGrid\r\n strokeDasharray=\"3 3\"\r\n stroke=\"var(--border-color)\"\r\n />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n label={{\r\n value: mode === 'access' ? 'Accès' : 'Minutes',\r\n angle: -90,\r\n position: 'insideLeft',\r\n style: { fill: 'var(--text-secondary)', fontSize: '11px' }\r\n }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)'\r\n }}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 'bold', marginBottom: '8px' }}\r\n itemStyle={{ color: 'var(--text-secondary)' }}\r\n />\r\n <Legend\r\n wrapperStyle={{\r\n paddingTop: '20px'\r\n }}\r\n formatter={(value) => (\r\n <span style={{ color: 'var(--text-secondary)', fontSize: '12px' }}>{value}</span>\r\n )}\r\n />\r\n {data.applications.map((app, index) => (\r\n <Line\r\n key={app.name}\r\n type=\"monotone\"\r\n dataKey={app.name}\r\n stroke={getColor(app, index)}\r\n strokeWidth={2}\r\n dot={{ r: 2, fill: getColor(app, index) }}\r\n activeDot={{ r: 5, fill: getColor(app, index) }}\r\n />\r\n ))}\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend with totals */}\r\n <div className=\"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4\">\r\n {data.applications.map((app, index) => (\r\n <div key={app.name} className=\"flex items-center gap-2\">\r\n <div\r\n className=\"w-3 h-3 rounded-full\"\r\n style={{ backgroundColor: getColor(app, index) }}\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{app.name}</span>\r\n <span className=\"text-sm font-semibold\" style={{ color: getColor(app, index) }}>\r\n {mode === 'access' ? app.totalAccess : `${app.totalDurationMinutes} min`}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Users, Clock } from 'lucide-react';\r\nimport type { ModuleAnalyticsDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface ModulePopularityChartProps {\r\n readonly data: ModuleAnalyticsDto[];\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst moduleColors = [\r\n '#3b82f6',\r\n '#8b5cf6',\r\n '#22c55e',\r\n '#f59e0b',\r\n '#ef4444',\r\n '#06b6d4',\r\n '#ec4899',\r\n '#10b981',\r\n '#f97316',\r\n '#6366f1'\r\n];\r\n\r\nexport const ModulePopularityChart: React.FC<ModulePopularityChartProps> = ({ data, mode = 'access' }) => {\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n No module data available\r\n </div>\r\n );\r\n }\r\n\r\n const getValue = (module: ModuleAnalyticsDto) =>\r\n mode === 'access' ? module.accessCount : module.totalDurationMinutes;\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n\r\n const maxCount = Math.max(...data.map(m => getValue(m)), 1);\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n const remainingSeconds = seconds % 60;\r\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {data.map((module, index) => {\r\n const value = getValue(module);\r\n const percentage = (value / maxCount) * 100;\r\n\r\n return (\r\n <div\r\n key={module.moduleId}\r\n className=\"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4\"\r\n style={{ borderLeftColor: moduleColors[index % moduleColors.length] }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className=\"flex-1\">\r\n {/* Full hierarchy path */}\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1 font-mono\">\r\n <span className=\"text-blue-500\">platform</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-green-500\">{module.applicationName}</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-purple-500\">{module.moduleName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <h5 className=\"font-semibold text-[var(--text-primary)]\">\r\n {module.moduleName}\r\n </h5>\r\n </div>\r\n </div>\r\n <div className=\"text-right\">\r\n <div className=\"text-xl font-bold\" style={{ color: moduleColors[index % moduleColors.length] }}>\r\n {value.toLocaleString()}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{valueLabel}</div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: moduleColors[index % moduleColors.length]\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 text-xs text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n <span>{module.uniqueUsers} utilisateurs uniques</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n <span>Moy: {formatDuration(module.avgDuration)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport type { PopularApplicationDto } from '@/services/api/applicationAnalyticsApi';\r\n\r\ninterface ApplicationActivityPieChartProps {\r\n readonly data: PopularApplicationDto[];\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst renderActiveShape = (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: { applicationName: string; accessCount: number };\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.applicationName}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} accès\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text x={ex + (cos >= 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill=\"var(--text-primary)\" style={{ fontSize: '12px' }}>\r\n {`${(percent * 100).toFixed(0)}%`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const ApplicationActivityPieChart: React.FC<ApplicationActivityPieChartProps> = ({ data }) => {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n );\r\n }\r\n\r\n const totalAccess = data.reduce((sum, app) => sum + app.accessCount, 0);\r\n\r\n const chartData = data.map((app, index) => ({\r\n ...app,\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n fill: COLORS[index % COLORS.length]\r\n }));\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n {/* Spacer row to match breadcrumb height in hierarchy chart */}\r\n <div className=\"flex items-center gap-2 text-sm h-[34px]\">\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n Vue globale des applications actives\r\n </span>\r\n </div>\r\n\r\n {/* Summary stats - at top to match hierarchy chart */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className=\"text-lg font-semibold text-green-600\">\r\n Applications\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.length} actives • {totalAccess.toLocaleString()} accès total)\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart - same height as hierarchy */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter\r\n } as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.name} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n {/* Tooltip disabled - activeShape already displays all info in center */}\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend - same style as hierarchy chart */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <div\r\n key={item.applicationId}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer ${\r\n activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''\r\n }`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.applicationName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.accessCount.toLocaleString()} accès\r\n </p>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport { ChevronRight, Home, Loader2, ArrowLeft } from 'lucide-react';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { HierarchyDrillDownDto, HierarchyItemDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface HierarchyDrillDownChartProps {\r\n readonly period: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst LEVEL_LABELS = ['Application', 'Module'];\r\nconst LEVEL_COLORS = ['text-blue-500', 'text-green-500'];\r\n\r\ninterface ChartDataItem extends HierarchyItemDto {\r\n value: number;\r\n fill: string;\r\n valueLabel: string;\r\n}\r\n\r\nconst createRenderActiveShape = (valueLabel: string) => (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: ChartDataItem;\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.name}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} {valueLabel}\r\n </text>\r\n <text x={cx} y={cy} dy={28} textAnchor=\"middle\" fill=\"var(--text-tertiary)\" style={{ fontSize: '11px' }}>\r\n {payload.hasChildren ? 'Cliquez pour explorer' : ''}\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-primary)\"\r\n style={{ fontSize: '12px' }}\r\n >\r\n {`${(percent * 100).toFixed(1)}%`}\r\n </text>\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n dy={14}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-secondary)\"\r\n style={{ fontSize: '10px' }}\r\n >\r\n {`${payload.uniqueUsers} utilisateurs`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const HierarchyDrillDownChart: React.FC<HierarchyDrillDownChartProps> = ({ period, mode = 'access' }) => {\r\n const [data, setData] = useState<HierarchyDrillDownDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const [currentLevel, setCurrentLevel] = useState(0);\r\n const [applicationId, setApplicationId] = useState<string | undefined>();\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const result = await applicationAnalyticsApi.getHierarchyData(\r\n currentLevel,\r\n applicationId,\r\n period\r\n );\r\n setData(result);\r\n setActiveIndex(0);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load data');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [currentLevel, applicationId, period]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSliceClick = (item: HierarchyItemDto) => {\r\n if (!item.hasChildren) return;\r\n\r\n if (currentLevel === 0) {\r\n setApplicationId(item.id);\r\n setCurrentLevel(1);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if (currentLevel === 1) {\r\n setApplicationId(undefined);\r\n setCurrentLevel(0);\r\n }\r\n };\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[400px]\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"text-center py-8 text-red-500\">\r\n {error}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.items?.length) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée disponible pour ce niveau\r\n </div>\r\n );\r\n }\r\n\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n const chartData: ChartDataItem[] = data.items.map((item, index) => ({\r\n ...item,\r\n value: mode === 'access' ? item.accessCount : item.totalDurationMinutes,\r\n fill: COLORS[index % COLORS.length],\r\n valueLabel\r\n }));\r\n\r\n const renderActiveShape = createRenderActiveShape(valueLabel);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Breadcrumb Navigation */}\r\n <div className=\"flex items-center gap-2 text-sm flex-wrap\">\r\n <button\r\n onClick={() => { setCurrentLevel(0); setApplicationId(undefined); }}\r\n className={`flex items-center gap-1 px-2 py-1 rounded hover:bg-[var(--bg-secondary)] transition-colors ${\r\n currentLevel === 0 ? 'font-semibold text-blue-600' : 'text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Home className=\"h-4 w-4\" />\r\n <span>Applications</span>\r\n </button>\r\n\r\n {data.breadcrumb.map((item) => (\r\n <React.Fragment key={item.id}>\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className={`px-2 py-1 font-semibold ${LEVEL_COLORS[1]}`}>\r\n {item.name}\r\n </span>\r\n </React.Fragment>\r\n ))}\r\n\r\n {currentLevel > 0 && (\r\n <button\r\n onClick={handleBack}\r\n className=\"ml-auto flex items-center gap-1 px-3 py-1 rounded-lg bg-[var(--bg-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors text-[var(--text-secondary)]\"\r\n >\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n Retour\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Level indicator */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className={`text-lg font-semibold ${LEVEL_COLORS[currentLevel]}`}>\r\n {LEVEL_LABELS[currentLevel]}s\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.items.length} éléments • {mode === 'access'\r\n ? `${data.totalAccess.toLocaleString()} accès total`\r\n : `${data.totalDurationMinutes.toLocaleString()} min total`})\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter,\r\n onClick: (_: unknown, index: number) => handleSliceClick(chartData[index]),\r\n style: { cursor: chartData[activeIndex]?.hasChildren ? 'pointer' : 'default' }\r\n } as unknown as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.id} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend / List */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <button\r\n key={item.id}\r\n onClick={() => item.hasChildren && handleSliceClick(item)}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors text-left ${\r\n item.hasChildren ? 'cursor-pointer' : 'cursor-default'\r\n } ${activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.name}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.value.toLocaleString()} {valueLabel}\r\n </p>\r\n </div>\r\n {item.hasChildren && (\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AlertTriangle,\r\n BarChart3,\r\n Users,\r\n Activity,\r\n TrendingUp,\r\n Loader2,\r\n RefreshCw,\r\n Clock,\r\n Layers,\r\n PieChart\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type {\r\n ApplicationDashboardStatsDto,\r\n ModuleAnalyticsDto\r\n} from '@/services/api/applicationAnalyticsApi';\r\nimport { UsageTrendChart, type ChartMode } from '@/components/dashboard/UsageTrendChart';\r\nimport { ModulePopularityChart } from '@/components/dashboard/ModulePopularityChart';\r\nimport { ApplicationActivityPieChart } from '@/components/dashboard/ApplicationActivityPieChart';\r\nimport { HierarchyDrillDownChart } from '@/components/dashboard/HierarchyDrillDownChart';\r\n\r\nconst KpiCard: React.FC<{\r\n label: string;\r\n value: number | string;\r\n icon: React.ReactNode;\r\n color: 'blue' | 'green' | 'purple' | 'orange' | 'yellow' | 'red';\r\n subtitle?: string;\r\n}> = ({ label, value, icon, color, subtitle }) => {\r\n const iconColors = {\r\n blue: 'text-blue-500',\r\n green: 'text-green-500',\r\n purple: 'text-purple-500',\r\n orange: 'text-orange-500',\r\n yellow: 'text-yellow-500',\r\n red: 'text-red-500'\r\n };\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">{label}</span>\r\n <div className={iconColors[color]}>{icon}</div>\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{typeof value === 'number' ? value.toLocaleString() : value}</div>\r\n {subtitle && <div className=\"text-xs text-[var(--text-tertiary)] mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport const ApplicationsDashboardPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant } = useTenant();\r\n const [stats, setStats] = useState<ApplicationDashboardStatsDto | null>(null);\r\n const [topModules, setTopModules] = useState<ModuleAnalyticsDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [chartMode, setChartMode] = useState<ChartMode>('access');\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const [dashboardRes, modulesRes] = await Promise.all([\r\n applicationAnalyticsApi.getDashboardStats(),\r\n applicationAnalyticsApi.getTopModules(5, period)\r\n ]);\r\n\r\n setStats(dashboardRes);\r\n setTopModules(modulesRes);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, currentTenant?.id]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n return `${minutes}m`;\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-[var(--error-text)] font-medium\">{error}</p>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"text-[var(--error-text)] hover:opacity-80\"\r\n >\r\n <RefreshCw className=\"h-5 w-5\" />\r\n </button>\r\n </div>\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('dashboard.title', 'Dashboard') }\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)] flex items-center gap-2\">\r\n <BarChart3 className=\"h-6 w-6\" />\r\n Tableau de bord Applications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n Analyse d'utilisation par Context › Application › Module\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n {/* Mode Toggle - Global */}\r\n <div className=\"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1\">\r\n <button\r\n onClick={() => setChartMode('access')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'access'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Activity className=\"w-3.5 h-3.5\" />\r\n Accès\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setChartMode('duration')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'duration'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Clock className=\"w-3.5 h-3.5\" />\r\n Temps\r\n </span>\r\n </button>\r\n </div>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value={7}>7 days</option>\r\n <option value={30}>30 days</option>\r\n <option value={90}>90 days</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"rounded-[var(--radius-button)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] flex items-center gap-2 transition-colors\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n Refresh\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards Grid (2x3) */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n label=\"Total Applications\"\r\n value={stats?.totalApplications || 0}\r\n icon={<BarChart3 className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n label=\"Active Applications\"\r\n value={stats?.activeApplications || 0}\r\n icon={<Activity className=\"h-5 w-5\" />}\r\n color=\"green\"\r\n />\r\n <KpiCard\r\n label=\"Total Users\"\r\n value={stats?.totalUsers || 0}\r\n icon={<Users className=\"h-5 w-5\" />}\r\n color=\"purple\"\r\n />\r\n <KpiCard\r\n label=\"Active Today\"\r\n value={stats?.activeUsersToday || 0}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color=\"orange\"\r\n />\r\n <KpiCard\r\n label=\"Avg Session\"\r\n value={formatDuration(stats?.avgSessionDuration || 0)}\r\n icon={<Clock className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n subtitle={`${period} days`}\r\n />\r\n <KpiCard\r\n label=\"Growth Rate\"\r\n value={`${stats?.growthRate.toFixed(1) || 0}%`}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color={(stats?.growthRate ?? 0) >= 0 ? 'green' : 'red'}\r\n subtitle=\"vs previous period\"\r\n />\r\n </div>\r\n\r\n {/* Two Column: Hierarchy Drill-Down + Top Applications */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Hierarchy Drill-Down Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <PieChart className=\"h-5 w-5 text-[var(--color-primary-600)]\" />\r\n {chartMode === 'access' ? 'Activité' : 'Temps passé'} par Hiérarchie\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Cliquez pour explorer)\r\n </span>\r\n </h3>\r\n <HierarchyDrillDownChart key={`hierarchy-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Application Activity Pie Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Activity className=\"h-5 w-5 text-green-600\" />\r\n Top Applications\r\n </h3>\r\n {stats?.mostPopularApps && stats.mostPopularApps.length > 0 ? (\r\n <ApplicationActivityPieChart data={stats.mostPopularApps} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Usage Trends Chart - Full Width with Application breakdown */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <TrendingUp className=\"h-5 w-5\" />\r\n Tendance {chartMode === 'access' ? \"d'utilisation\" : 'du temps passé'} par Application ({period} jours)\r\n </h3>\r\n <UsageTrendChart key={`trends-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Module Popularity - Full Width */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Layers className=\"h-5 w-5 text-purple-600\" />\r\n Modules les plus {chartMode === 'access' ? 'populaires' : 'utilisés'}\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Context › Application › Module)\r\n </span>\r\n </h3>\r\n {(topModules?.length ?? 0) > 0 ? (\r\n <ModulePopularityChart data={topModules} mode={chartMode} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée de module disponible\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Call to action */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-gradient-to-r from-[var(--color-primary-600)]/10 to-[var(--color-accent-500)]/10 p-6\">\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"font-bold text-[var(--text-primary)]\">Explorer toutes les Applications</h3>\r\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">\r\n Voir les analyses détaillées pour chaque application et gérer les permissions\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/applications/list')}\r\n className=\"whitespace-nowrap rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-4 py-2 font-medium text-white transition-all hover:shadow-md\"\r\n >\r\n Voir les Applications\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["DEFAULT_COLORS","UsageTrendChart","period","mode","data","setData","useState","loading","setLoading","error","setError","useEffect","result","applicationAnalyticsApi","err","jsx","Loader2","chartData","day","entry","app","getColor","index","jsxs","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","value","Line","moduleColors","ModulePopularityChart","getValue","module","valueLabel","maxCount","m","formatDuration","seconds","minutes","remainingSeconds","percentage","Users","Clock","COLORS","renderActiveShape","props","cx","cy","midAngle","innerRadius","outerRadius","startAngle","endAngle","fill","payload","percent","RADIAN","sin","cos","sx","sy","mx","my","ex","ey","textAnchor","Sector","ApplicationActivityPieChart","activeIndex","setActiveIndex","totalAccess","sum","onPieEnter","_","PieChart","Pie","Cell","item","LEVEL_LABELS","LEVEL_COLORS","createRenderActiveShape","HierarchyDrillDownChart","currentLevel","setCurrentLevel","applicationId","setApplicationId","loadData","useCallback","handleSliceClick","handleBack","Home","React","ChevronRight","ArrowLeft","KpiCard","label","icon","color","subtitle","ApplicationsDashboardPage","navigate","useNavigate","t","useTranslation","currentTenant","useTenant","stats","setStats","topModules","setTopModules","refreshing","setRefreshing","setPeriod","chartMode","setChartMode","dashboardRes","modulesRes","handleRefresh","AlertTriangle","RefreshCw","Breadcrumb","BarChart3","Activity","e","TrendingUp","Layers"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsDashboardPage-BDIjFIYZ.js","sources":["../../src/components/dashboard/UsageTrendChart.tsx","../../src/components/dashboard/ModulePopularityChart.tsx","../../src/components/dashboard/ApplicationActivityPieChart.tsx","../../src/components/dashboard/HierarchyDrillDownChart.tsx","../../src/pages/platform/administration/applications/ApplicationsDashboardPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport {\r\n LineChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer\r\n} from 'recharts';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ApplicationTrendsDto, ApplicationSeriesDto } from '@/services/api/applicationAnalyticsApi';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\nexport type ChartMode = 'access' | 'duration';\r\n\r\ninterface UsageTrendChartProps {\r\n readonly period?: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst DEFAULT_COLORS = [\r\n '#3b82f6', // blue\r\n '#22c55e', // green\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#06b6d4', // cyan\r\n '#ec4899', // pink\r\n];\r\n\r\nexport const UsageTrendChart: React.FC<UsageTrendChartProps> = ({ period = 30, mode = 'access' }) => {\r\n const [data, setData] = useState<ApplicationTrendsDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const result = await applicationAnalyticsApi.getTrendsByApplication(period);\r\n setData(result);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load trends');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [period]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px]\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n {error || 'Aucune donnée disponible'}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.dailyData?.length || !data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n Aucune donnée de tendance disponible\r\n </div>\r\n );\r\n }\r\n\r\n // Transform data for Recharts based on mode\r\n const chartData = data.dailyData.map((day) => {\r\n const entry: Record<string, string | number> = {\r\n date: new Date(day.date).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: 'short'\r\n })\r\n };\r\n // Add each application's value based on mode\r\n data.applications.forEach((app) => {\r\n if (mode === 'access') {\r\n entry[app.name] = day.applicationCounts[app.name] || 0;\r\n } else {\r\n entry[app.name] = day.applicationDurations?.[app.name] || 0;\r\n }\r\n });\r\n return entry;\r\n });\r\n\r\n const getColor = (app: ApplicationSeriesDto, index: number): string => {\r\n return app.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Chart */}\r\n <div style={{ width: '100%', height: 300 }}>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart\r\n data={chartData}\r\n margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n >\r\n <CartesianGrid\r\n strokeDasharray=\"3 3\"\r\n stroke=\"var(--border-color)\"\r\n />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n label={{\r\n value: mode === 'access' ? 'Accès' : 'Minutes',\r\n angle: -90,\r\n position: 'insideLeft',\r\n style: { fill: 'var(--text-secondary)', fontSize: '11px' }\r\n }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)'\r\n }}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 'bold', marginBottom: '8px' }}\r\n itemStyle={{ color: 'var(--text-secondary)' }}\r\n />\r\n <Legend\r\n wrapperStyle={{\r\n paddingTop: '20px'\r\n }}\r\n formatter={(value) => (\r\n <span style={{ color: 'var(--text-secondary)', fontSize: '12px' }}>{value}</span>\r\n )}\r\n />\r\n {data.applications.map((app, index) => (\r\n <Line\r\n key={app.name}\r\n type=\"monotone\"\r\n dataKey={app.name}\r\n stroke={getColor(app, index)}\r\n strokeWidth={2}\r\n dot={{ r: 2, fill: getColor(app, index) }}\r\n activeDot={{ r: 5, fill: getColor(app, index) }}\r\n />\r\n ))}\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend with totals */}\r\n <div className=\"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4\">\r\n {data.applications.map((app, index) => (\r\n <div key={app.name} className=\"flex items-center gap-2\">\r\n <div\r\n className=\"w-3 h-3 rounded-full\"\r\n style={{ backgroundColor: getColor(app, index) }}\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{app.name}</span>\r\n <span className=\"text-sm font-semibold\" style={{ color: getColor(app, index) }}>\r\n {mode === 'access' ? app.totalAccess : `${app.totalDurationMinutes} min`}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Users, Clock } from 'lucide-react';\r\nimport type { ModuleAnalyticsDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface ModulePopularityChartProps {\r\n readonly data: ModuleAnalyticsDto[];\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst moduleColors = [\r\n '#3b82f6',\r\n '#8b5cf6',\r\n '#22c55e',\r\n '#f59e0b',\r\n '#ef4444',\r\n '#06b6d4',\r\n '#ec4899',\r\n '#10b981',\r\n '#f97316',\r\n '#6366f1'\r\n];\r\n\r\nexport const ModulePopularityChart: React.FC<ModulePopularityChartProps> = ({ data, mode = 'access' }) => {\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n No module data available\r\n </div>\r\n );\r\n }\r\n\r\n const getValue = (module: ModuleAnalyticsDto) =>\r\n mode === 'access' ? module.accessCount : module.totalDurationMinutes;\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n\r\n const maxCount = Math.max(...data.map(m => getValue(m)), 1);\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n const remainingSeconds = seconds % 60;\r\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {data.map((module, index) => {\r\n const value = getValue(module);\r\n const percentage = (value / maxCount) * 100;\r\n\r\n return (\r\n <div\r\n key={module.moduleId}\r\n className=\"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4\"\r\n style={{ borderLeftColor: moduleColors[index % moduleColors.length] }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className=\"flex-1\">\r\n {/* Full hierarchy path */}\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1 font-mono\">\r\n <span className=\"text-blue-500\">platform</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-green-500\">{module.applicationName}</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-purple-500\">{module.moduleName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <h5 className=\"font-semibold text-[var(--text-primary)]\">\r\n {module.moduleName}\r\n </h5>\r\n </div>\r\n </div>\r\n <div className=\"text-right\">\r\n <div className=\"text-xl font-bold\" style={{ color: moduleColors[index % moduleColors.length] }}>\r\n {value.toLocaleString()}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{valueLabel}</div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: moduleColors[index % moduleColors.length]\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 text-xs text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n <span>{module.uniqueUsers} utilisateurs uniques</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n <span>Moy: {formatDuration(module.avgDuration)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport type { PopularApplicationDto } from '@/services/api/applicationAnalyticsApi';\r\n\r\ninterface ApplicationActivityPieChartProps {\r\n readonly data: PopularApplicationDto[];\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst renderActiveShape = (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: { applicationName: string; accessCount: number };\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.applicationName}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} accès\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text x={ex + (cos >= 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill=\"var(--text-primary)\" style={{ fontSize: '12px' }}>\r\n {`${(percent * 100).toFixed(0)}%`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const ApplicationActivityPieChart: React.FC<ApplicationActivityPieChartProps> = ({ data }) => {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n );\r\n }\r\n\r\n const totalAccess = data.reduce((sum, app) => sum + app.accessCount, 0);\r\n\r\n const chartData = data.map((app, index) => ({\r\n ...app,\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n fill: COLORS[index % COLORS.length]\r\n }));\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n {/* Spacer row to match breadcrumb height in hierarchy chart */}\r\n <div className=\"flex items-center gap-2 text-sm h-[34px]\">\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n Vue globale des applications actives\r\n </span>\r\n </div>\r\n\r\n {/* Summary stats - at top to match hierarchy chart */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className=\"text-lg font-semibold text-green-600\">\r\n Applications\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.length} actives • {totalAccess.toLocaleString()} accès total)\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart - same height as hierarchy */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter\r\n } as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.name} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n {/* Tooltip disabled - activeShape already displays all info in center */}\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend - same style as hierarchy chart */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <div\r\n key={item.applicationId}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer ${\r\n activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''\r\n }`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.applicationName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.accessCount.toLocaleString()} accès\r\n </p>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport { ChevronRight, Home, Loader2, ArrowLeft } from 'lucide-react';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { HierarchyDrillDownDto, HierarchyItemDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface HierarchyDrillDownChartProps {\r\n readonly period: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst LEVEL_LABELS = ['Application', 'Module'];\r\nconst LEVEL_COLORS = ['text-blue-500', 'text-green-500'];\r\n\r\ninterface ChartDataItem extends HierarchyItemDto {\r\n value: number;\r\n fill: string;\r\n valueLabel: string;\r\n}\r\n\r\nconst createRenderActiveShape = (valueLabel: string) => (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: ChartDataItem;\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.name}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} {valueLabel}\r\n </text>\r\n <text x={cx} y={cy} dy={28} textAnchor=\"middle\" fill=\"var(--text-tertiary)\" style={{ fontSize: '11px' }}>\r\n {payload.hasChildren ? 'Cliquez pour explorer' : ''}\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-primary)\"\r\n style={{ fontSize: '12px' }}\r\n >\r\n {`${(percent * 100).toFixed(1)}%`}\r\n </text>\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n dy={14}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-secondary)\"\r\n style={{ fontSize: '10px' }}\r\n >\r\n {`${payload.uniqueUsers} utilisateurs`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const HierarchyDrillDownChart: React.FC<HierarchyDrillDownChartProps> = ({ period, mode = 'access' }) => {\r\n const [data, setData] = useState<HierarchyDrillDownDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const [currentLevel, setCurrentLevel] = useState(0);\r\n const [applicationId, setApplicationId] = useState<string | undefined>();\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const result = await applicationAnalyticsApi.getHierarchyData(\r\n currentLevel,\r\n applicationId,\r\n period\r\n );\r\n setData(result);\r\n setActiveIndex(0);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load data');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [currentLevel, applicationId, period]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSliceClick = (item: HierarchyItemDto) => {\r\n if (!item.hasChildren) return;\r\n\r\n if (currentLevel === 0) {\r\n setApplicationId(item.id);\r\n setCurrentLevel(1);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if (currentLevel === 1) {\r\n setApplicationId(undefined);\r\n setCurrentLevel(0);\r\n }\r\n };\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[400px]\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"text-center py-8 text-red-500\">\r\n {error}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.items?.length) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée disponible pour ce niveau\r\n </div>\r\n );\r\n }\r\n\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n const chartData: ChartDataItem[] = data.items.map((item, index) => ({\r\n ...item,\r\n value: mode === 'access' ? item.accessCount : item.totalDurationMinutes,\r\n fill: COLORS[index % COLORS.length],\r\n valueLabel\r\n }));\r\n\r\n const renderActiveShape = createRenderActiveShape(valueLabel);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Breadcrumb Navigation */}\r\n <div className=\"flex items-center gap-2 text-sm flex-wrap\">\r\n <button\r\n onClick={() => { setCurrentLevel(0); setApplicationId(undefined); }}\r\n className={`flex items-center gap-1 px-2 py-1 rounded hover:bg-[var(--bg-secondary)] transition-colors ${\r\n currentLevel === 0 ? 'font-semibold text-blue-600' : 'text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Home className=\"h-4 w-4\" />\r\n <span>Applications</span>\r\n </button>\r\n\r\n {data.breadcrumb.map((item) => (\r\n <React.Fragment key={item.id}>\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className={`px-2 py-1 font-semibold ${LEVEL_COLORS[1]}`}>\r\n {item.name}\r\n </span>\r\n </React.Fragment>\r\n ))}\r\n\r\n {currentLevel > 0 && (\r\n <button\r\n onClick={handleBack}\r\n className=\"ml-auto flex items-center gap-1 px-3 py-1 rounded-lg bg-[var(--bg-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors text-[var(--text-secondary)]\"\r\n >\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n Retour\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Level indicator */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className={`text-lg font-semibold ${LEVEL_COLORS[currentLevel]}`}>\r\n {LEVEL_LABELS[currentLevel]}s\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.items.length} éléments • {mode === 'access'\r\n ? `${data.totalAccess.toLocaleString()} accès total`\r\n : `${data.totalDurationMinutes.toLocaleString()} min total`})\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter,\r\n onClick: (_: unknown, index: number) => handleSliceClick(chartData[index]),\r\n style: { cursor: chartData[activeIndex]?.hasChildren ? 'pointer' : 'default' }\r\n } as unknown as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.id} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend / List */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <button\r\n key={item.id}\r\n onClick={() => item.hasChildren && handleSliceClick(item)}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors text-left ${\r\n item.hasChildren ? 'cursor-pointer' : 'cursor-default'\r\n } ${activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.name}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.value.toLocaleString()} {valueLabel}\r\n </p>\r\n </div>\r\n {item.hasChildren && (\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AlertTriangle,\r\n BarChart3,\r\n Users,\r\n Activity,\r\n TrendingUp,\r\n Loader2,\r\n RefreshCw,\r\n Clock,\r\n Layers,\r\n PieChart\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type {\r\n ApplicationDashboardStatsDto,\r\n ModuleAnalyticsDto\r\n} from '@/services/api/applicationAnalyticsApi';\r\nimport { UsageTrendChart, type ChartMode } from '@/components/dashboard/UsageTrendChart';\r\nimport { ModulePopularityChart } from '@/components/dashboard/ModulePopularityChart';\r\nimport { ApplicationActivityPieChart } from '@/components/dashboard/ApplicationActivityPieChart';\r\nimport { HierarchyDrillDownChart } from '@/components/dashboard/HierarchyDrillDownChart';\r\n\r\nconst KpiCard: React.FC<{\r\n label: string;\r\n value: number | string;\r\n icon: React.ReactNode;\r\n color: 'blue' | 'green' | 'purple' | 'orange' | 'yellow' | 'red';\r\n subtitle?: string;\r\n}> = ({ label, value, icon, color, subtitle }) => {\r\n const iconColors = {\r\n blue: 'text-blue-500',\r\n green: 'text-green-500',\r\n purple: 'text-purple-500',\r\n orange: 'text-orange-500',\r\n yellow: 'text-yellow-500',\r\n red: 'text-red-500'\r\n };\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">{label}</span>\r\n <div className={iconColors[color]}>{icon}</div>\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{typeof value === 'number' ? value.toLocaleString() : value}</div>\r\n {subtitle && <div className=\"text-xs text-[var(--text-tertiary)] mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport const ApplicationsDashboardPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant } = useTenant();\r\n const [stats, setStats] = useState<ApplicationDashboardStatsDto | null>(null);\r\n const [topModules, setTopModules] = useState<ModuleAnalyticsDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [chartMode, setChartMode] = useState<ChartMode>('access');\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const [dashboardRes, modulesRes] = await Promise.all([\r\n applicationAnalyticsApi.getDashboardStats(),\r\n applicationAnalyticsApi.getTopModules(5, period)\r\n ]);\r\n\r\n setStats(dashboardRes);\r\n setTopModules(modulesRes);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, currentTenant?.id]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n return `${minutes}m`;\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-[var(--error-text)] font-medium\">{error}</p>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"text-[var(--error-text)] hover:opacity-80\"\r\n >\r\n <RefreshCw className=\"h-5 w-5\" />\r\n </button>\r\n </div>\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('dashboard.title', 'Dashboard') }\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)] flex items-center gap-2\">\r\n <BarChart3 className=\"h-6 w-6\" />\r\n Tableau de bord Applications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n Analyse d'utilisation par Context › Application › Module\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n {/* Mode Toggle - Global */}\r\n <div className=\"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1\">\r\n <button\r\n onClick={() => setChartMode('access')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'access'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Activity className=\"w-3.5 h-3.5\" />\r\n Accès\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setChartMode('duration')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'duration'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Clock className=\"w-3.5 h-3.5\" />\r\n Temps\r\n </span>\r\n </button>\r\n </div>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value={7}>7 days</option>\r\n <option value={30}>30 days</option>\r\n <option value={90}>90 days</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"rounded-[var(--radius-button)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] flex items-center gap-2 transition-colors\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n Refresh\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards Grid (2x3) */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n label=\"Total Applications\"\r\n value={stats?.totalApplications || 0}\r\n icon={<BarChart3 className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n label=\"Active Applications\"\r\n value={stats?.activeApplications || 0}\r\n icon={<Activity className=\"h-5 w-5\" />}\r\n color=\"green\"\r\n />\r\n <KpiCard\r\n label=\"Total Users\"\r\n value={stats?.totalUsers || 0}\r\n icon={<Users className=\"h-5 w-5\" />}\r\n color=\"purple\"\r\n />\r\n <KpiCard\r\n label=\"Active Today\"\r\n value={stats?.activeUsersToday || 0}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color=\"orange\"\r\n />\r\n <KpiCard\r\n label=\"Avg Session\"\r\n value={formatDuration(stats?.avgSessionDuration || 0)}\r\n icon={<Clock className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n subtitle={`${period} days`}\r\n />\r\n <KpiCard\r\n label=\"Growth Rate\"\r\n value={`${stats?.growthRate.toFixed(1) || 0}%`}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color={(stats?.growthRate ?? 0) >= 0 ? 'green' : 'red'}\r\n subtitle=\"vs previous period\"\r\n />\r\n </div>\r\n\r\n {/* Two Column: Hierarchy Drill-Down + Top Applications */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Hierarchy Drill-Down Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <PieChart className=\"h-5 w-5 text-[var(--color-primary-600)]\" />\r\n {chartMode === 'access' ? 'Activité' : 'Temps passé'} par Hiérarchie\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Cliquez pour explorer)\r\n </span>\r\n </h3>\r\n <HierarchyDrillDownChart key={`hierarchy-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Application Activity Pie Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Activity className=\"h-5 w-5 text-green-600\" />\r\n Top Applications\r\n </h3>\r\n {stats?.mostPopularApps && stats.mostPopularApps.length > 0 ? (\r\n <ApplicationActivityPieChart data={stats.mostPopularApps} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Usage Trends Chart - Full Width with Application breakdown */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <TrendingUp className=\"h-5 w-5\" />\r\n Tendance {chartMode === 'access' ? \"d'utilisation\" : 'du temps passé'} par Application ({period} jours)\r\n </h3>\r\n <UsageTrendChart key={`trends-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Module Popularity - Full Width */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Layers className=\"h-5 w-5 text-purple-600\" />\r\n Modules les plus {chartMode === 'access' ? 'populaires' : 'utilisés'}\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Context › Application › Module)\r\n </span>\r\n </h3>\r\n {(topModules?.length ?? 0) > 0 ? (\r\n <ModulePopularityChart data={topModules} mode={chartMode} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée de module disponible\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Call to action */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-gradient-to-r from-[var(--color-primary-600)]/10 to-[var(--color-accent-500)]/10 p-6\">\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"font-bold text-[var(--text-primary)]\">Explorer toutes les Applications</h3>\r\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">\r\n Voir les analyses détaillées pour chaque application et gérer les permissions\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/applications/list')}\r\n className=\"whitespace-nowrap rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-4 py-2 font-medium text-white transition-all hover:shadow-md\"\r\n >\r\n Voir les Applications\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["DEFAULT_COLORS","UsageTrendChart","period","mode","data","setData","useState","loading","setLoading","error","setError","useEffect","result","applicationAnalyticsApi","err","jsx","Loader2","chartData","day","entry","app","getColor","index","jsxs","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","value","Line","moduleColors","ModulePopularityChart","getValue","module","valueLabel","maxCount","m","formatDuration","seconds","minutes","remainingSeconds","percentage","Users","Clock","COLORS","renderActiveShape","props","cx","cy","midAngle","innerRadius","outerRadius","startAngle","endAngle","fill","payload","percent","RADIAN","sin","cos","sx","sy","mx","my","ex","ey","textAnchor","Sector","ApplicationActivityPieChart","activeIndex","setActiveIndex","totalAccess","sum","onPieEnter","_","PieChart","Pie","Cell","item","LEVEL_LABELS","LEVEL_COLORS","createRenderActiveShape","HierarchyDrillDownChart","currentLevel","setCurrentLevel","applicationId","setApplicationId","loadData","useCallback","handleSliceClick","handleBack","Home","React","ChevronRight","ArrowLeft","KpiCard","label","icon","color","subtitle","ApplicationsDashboardPage","navigate","useNavigate","t","useTranslation","currentTenant","useTenant","stats","setStats","topModules","setTopModules","refreshing","setRefreshing","setPeriod","chartMode","setChartMode","dashboardRes","modulesRes","handleRefresh","AlertTriangle","RefreshCw","Breadcrumb","BarChart3","Activity","e","TrendingUp","Layers"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react-i18next"),c=require("lucide-react"),u=require("react-router-dom"),a=require("./index-2wUhd9Lu.js");function m(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(r,o,s.get?s:{enumerable:!0,get:()=>t[o]})}}return r.default=t,Object.freeze(r)}const x=m(c);function b(t){if(!t)return c.Box;const r=x;if(r[t])return r[t];const o=t.toLowerCase(),s=Object.keys(r).find(n=>n.toLowerCase()===o);return s?r[s]:c.Box}function v({module:t,buildUrl:r}){const{t:o}=d.useTranslation("admin"),s=b(t.icon),n=t.sections?.length??0;return e.jsx("div",{className:"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10",children:e.jsxs(u.Link,{to:t.route?r(t.route):"#",className:"block p-6",children:[e.jsx("div",{className:"flex items-start justify-between mb-4",children:e.jsx("div",{className:"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all",children:e.jsx(s,{className:"w-7 h-7 text-[var(--color-accent-500)]"})})}),e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-2",children:t.label}),n>0&&e.jsxs("p",{className:"text-sm text-[var(--text-secondary)] mb-4",children:[n," ",n===1?o("modules.sectionCount_one","section"):o("modules.sectionCount_other","sections")]}),e.jsxs("div",{className:"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity",children:[o("modules.open","Ouvrir"),e.jsx(c.ArrowRight,{className:"w-4 h-4"})]})]})})}function p(){const{t}=d.useTranslation("admin"),{getCurrentApplication:r,isLoading:o}=a.useNavigation(),s=a.useTenantUrl(),n=r(),i=n?.modules??[];return o?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx("div",{className:"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin"})}):e.jsxs("div",{className:"space-y-8",children:[e.jsx(a.Breadcrumb,{items:[{label:n?.label??t("modules.title","Modules")}]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:n?.label??t("modules.title","Modules")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:t("modules.subtitle","Sélectionnez un module pour commencer")})]}),e.jsx("section",{children:i.length>0?e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:i.map(l=>e.jsx(v,{module:l,buildUrl:s},l.id))}):e.jsxs("div",{className:"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]",children:[e.jsx(c.Box,{className:"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4"}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:t("modules.noModules","Aucun module disponible")})]})})]})}exports.ApplicationsGridPage=p;
2
- //# sourceMappingURL=ApplicationsGridPage-BQaMsK1K.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react-i18next"),c=require("lucide-react"),u=require("react-router-dom"),a=require("./index-IgLVXPg8.js");function m(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(r,o,s.get?s:{enumerable:!0,get:()=>t[o]})}}return r.default=t,Object.freeze(r)}const x=m(c);function b(t){if(!t)return c.Box;const r=x;if(r[t])return r[t];const o=t.toLowerCase(),s=Object.keys(r).find(n=>n.toLowerCase()===o);return s?r[s]:c.Box}function v({module:t,buildUrl:r}){const{t:o}=d.useTranslation("admin"),s=b(t.icon),n=t.sections?.length??0;return e.jsx("div",{className:"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10",children:e.jsxs(u.Link,{to:t.route?r(t.route):"#",className:"block p-6",children:[e.jsx("div",{className:"flex items-start justify-between mb-4",children:e.jsx("div",{className:"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all",children:e.jsx(s,{className:"w-7 h-7 text-[var(--color-accent-500)]"})})}),e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-2",children:t.label}),n>0&&e.jsxs("p",{className:"text-sm text-[var(--text-secondary)] mb-4",children:[n," ",n===1?o("modules.sectionCount_one","section"):o("modules.sectionCount_other","sections")]}),e.jsxs("div",{className:"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity",children:[o("modules.open","Ouvrir"),e.jsx(c.ArrowRight,{className:"w-4 h-4"})]})]})})}function p(){const{t}=d.useTranslation("admin"),{getCurrentApplication:r,isLoading:o}=a.useNavigation(),s=a.useTenantUrl(),n=r(),i=n?.modules??[];return o?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx("div",{className:"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin"})}):e.jsxs("div",{className:"space-y-8",children:[e.jsx(a.Breadcrumb,{items:[{label:n?.label??t("modules.title","Modules")}]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:n?.label??t("modules.title","Modules")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:t("modules.subtitle","Sélectionnez un module pour commencer")})]}),e.jsx("section",{children:i.length>0?e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:i.map(l=>e.jsx(v,{module:l,buildUrl:s},l.id))}):e.jsxs("div",{className:"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]",children:[e.jsx(c.Box,{className:"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4"}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:t("modules.noModules","Aucun module disponible")})]})})]})}exports.ApplicationsGridPage=p;
2
+ //# sourceMappingURL=ApplicationsGridPage-DV-FihKj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsGridPage-BQaMsK1K.js","sources":["../../src/pages/platform/administration/applications/ApplicationsGridPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n ArrowRight,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ModuleDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nfunction getIcon(iconName: string | null): LucideIcon {\r\n if (!iconName) return Box;\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n if (icons[iconName]) return icons[iconName];\r\n const lowerName = iconName.toLowerCase();\r\n const matchingKey = Object.keys(icons).find(key => key.toLowerCase() === lowerName);\r\n return matchingKey ? icons[matchingKey] : Box;\r\n}\r\n\r\ninterface ModuleCardProps {\r\n readonly module: ModuleDto;\r\n readonly buildUrl: (path: string) => string;\r\n}\r\n\r\nfunction ModuleCard({ module, buildUrl }: ModuleCardProps) {\r\n const { t } = useTranslation('admin');\r\n const Icon = getIcon(module.icon);\r\n const sectionCount = module.sections?.length ?? 0;\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10\">\r\n <Link\r\n to={module.route ? buildUrl(module.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {module.label}\r\n </h3>\r\n\r\n {sectionCount > 0 && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {sectionCount} {sectionCount === 1\r\n ? t('modules.sectionCount_one', 'section')\r\n : t('modules.sectionCount_other', 'sections')}\r\n </p>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('modules.open', 'Ouvrir')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n}\r\n\r\nexport function ApplicationsGridPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { getCurrentApplication, isLoading } = useNavigation();\r\n const buildUrl = useTenantUrl();\r\n\r\n const currentApp = getCurrentApplication();\r\n const modules = currentApp?.modules ?? [];\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <Breadcrumb\r\n items={[\r\n { label: currentApp?.label ?? t('modules.title', 'Modules') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {currentApp?.label ?? t('modules.title', 'Modules')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('modules.subtitle', 'Sélectionnez un module pour commencer')}\r\n </p>\r\n </div>\r\n\r\n <section>\r\n {modules.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {modules.map(module => (\r\n <ModuleCard\r\n key={module.id}\r\n module={module}\r\n buildUrl={buildUrl}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('modules.noModules', 'Aucun module disponible')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["getIcon","iconName","Box","icons","LucideIcons","lowerName","matchingKey","key","ModuleCard","module","buildUrl","t","useTranslation","Icon","sectionCount","jsx","jsxs","Link","ArrowRight","ApplicationsGridPage","getCurrentApplication","isLoading","useNavigation","useTenantUrl","currentApp","modules","Breadcrumb"],"mappings":"mgBAaA,SAASA,EAAQC,EAAqC,CACpD,GAAI,CAACA,EAAU,OAAOC,EAAAA,IACtB,MAAMC,EAAQC,EACd,GAAID,EAAMF,CAAQ,EAAG,OAAOE,EAAMF,CAAQ,EAC1C,MAAMI,EAAYJ,EAAS,YAAA,EACrBK,EAAc,OAAO,KAAKH,CAAK,EAAE,KAAKI,GAAOA,EAAI,YAAA,IAAkBF,CAAS,EAClF,OAAOC,EAAcH,EAAMG,CAAW,EAAIJ,EAAAA,GAC5C,CAOA,SAASM,EAAW,CAAE,OAAAC,EAAQ,SAAAC,GAA6B,CACzD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,OAAO,EAC9BC,EAAOb,EAAQS,EAAO,IAAI,EAC1BK,EAAeL,EAAO,UAAU,QAAU,EAEhD,OACEM,EAAAA,IAAC,MAAA,CAAI,UAAU,qOACb,SAAAC,EAAAA,KAACC,EAAAA,KAAA,CACC,GAAIR,EAAO,MAAQC,EAASD,EAAO,KAAK,EAAI,IAC5C,UAAU,YAEV,SAAA,CAAAM,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,qPACb,SAAAA,EAAAA,IAACF,EAAA,CAAK,UAAU,wCAAA,CAAyC,CAAA,CAC3D,EACF,EAEAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wDACX,WAAO,MACV,EAECD,EAAe,GACdE,OAAC,IAAA,CAAE,UAAU,4CACV,SAAA,CAAAF,EAAa,IAAEA,IAAiB,EAC7BH,EAAE,2BAA4B,SAAS,EACvCA,EAAE,6BAA8B,UAAU,CAAA,EAChD,EAGFK,EAAAA,KAAC,MAAA,CAAI,UAAU,kIACZ,SAAA,CAAAL,EAAE,eAAgB,QAAQ,EAC3BI,EAAAA,IAACG,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,CAAA,CAAA,CAClC,CAAA,CAAA,CAAA,EAEJ,CAEJ,CAEO,SAASC,GAAqC,CACnD,KAAM,CAAE,CAAA,EAAMP,EAAAA,eAAe,OAAO,EAC9B,CAAE,sBAAAQ,EAAuB,UAAAC,CAAA,EAAcC,gBAAA,EACvCZ,EAAWa,EAAAA,aAAA,EAEXC,EAAaJ,EAAA,EACbK,EAAUD,GAAY,SAAW,CAAA,EAEvC,OAAIH,EAEAN,MAAC,OAAI,UAAU,iDACb,eAAC,MAAA,CAAI,UAAU,mGAAmG,CAAA,CACpH,EAKFC,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAD,EAAAA,IAACW,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOF,GAAY,OAAS,EAAE,gBAAiB,SAAS,CAAA,CAAE,CAC9D,CAAA,SAGD,MAAA,CACC,SAAA,CAAAT,EAAAA,IAAC,KAAA,CAAG,UAAU,gDACX,SAAAS,GAAY,OAAS,EAAE,gBAAiB,SAAS,CAAA,CACpD,QACC,IAAA,CAAE,UAAU,oCACV,SAAA,EAAE,mBAAoB,uCAAuC,CAAA,CAChE,CAAA,EACF,EAEAT,EAAAA,IAAC,UAAA,CACE,SAAAU,EAAQ,OAAS,EAChBV,EAAAA,IAAC,MAAA,CAAI,UAAU,sEACZ,SAAAU,EAAQ,IAAIhB,GACXM,EAAAA,IAACP,EAAA,CAEC,OAAAC,EACA,SAAAC,CAAA,EAFKD,EAAO,EAAA,CAIf,CAAA,CACH,EAEAO,OAAC,MAAA,CAAI,UAAU,wFACb,SAAA,CAAAD,EAAAA,IAACb,EAAAA,IAAA,CAAI,UAAU,oDAAA,CAAqD,QACnE,IAAA,CAAE,UAAU,+BACV,SAAA,EAAE,oBAAqB,yBAAyB,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"ApplicationsGridPage-DV-FihKj.js","sources":["../../src/pages/platform/administration/applications/ApplicationsGridPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n ArrowRight,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ModuleDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nfunction getIcon(iconName: string | null): LucideIcon {\r\n if (!iconName) return Box;\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n if (icons[iconName]) return icons[iconName];\r\n const lowerName = iconName.toLowerCase();\r\n const matchingKey = Object.keys(icons).find(key => key.toLowerCase() === lowerName);\r\n return matchingKey ? icons[matchingKey] : Box;\r\n}\r\n\r\ninterface ModuleCardProps {\r\n readonly module: ModuleDto;\r\n readonly buildUrl: (path: string) => string;\r\n}\r\n\r\nfunction ModuleCard({ module, buildUrl }: ModuleCardProps) {\r\n const { t } = useTranslation('admin');\r\n const Icon = getIcon(module.icon);\r\n const sectionCount = module.sections?.length ?? 0;\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10\">\r\n <Link\r\n to={module.route ? buildUrl(module.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {module.label}\r\n </h3>\r\n\r\n {sectionCount > 0 && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {sectionCount} {sectionCount === 1\r\n ? t('modules.sectionCount_one', 'section')\r\n : t('modules.sectionCount_other', 'sections')}\r\n </p>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('modules.open', 'Ouvrir')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n}\r\n\r\nexport function ApplicationsGridPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { getCurrentApplication, isLoading } = useNavigation();\r\n const buildUrl = useTenantUrl();\r\n\r\n const currentApp = getCurrentApplication();\r\n const modules = currentApp?.modules ?? [];\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <Breadcrumb\r\n items={[\r\n { label: currentApp?.label ?? t('modules.title', 'Modules') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {currentApp?.label ?? t('modules.title', 'Modules')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('modules.subtitle', 'Sélectionnez un module pour commencer')}\r\n </p>\r\n </div>\r\n\r\n <section>\r\n {modules.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {modules.map(module => (\r\n <ModuleCard\r\n key={module.id}\r\n module={module}\r\n buildUrl={buildUrl}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('modules.noModules', 'Aucun module disponible')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["getIcon","iconName","Box","icons","LucideIcons","lowerName","matchingKey","key","ModuleCard","module","buildUrl","t","useTranslation","Icon","sectionCount","jsx","jsxs","Link","ArrowRight","ApplicationsGridPage","getCurrentApplication","isLoading","useNavigation","useTenantUrl","currentApp","modules","Breadcrumb"],"mappings":"mgBAaA,SAASA,EAAQC,EAAqC,CACpD,GAAI,CAACA,EAAU,OAAOC,EAAAA,IACtB,MAAMC,EAAQC,EACd,GAAID,EAAMF,CAAQ,EAAG,OAAOE,EAAMF,CAAQ,EAC1C,MAAMI,EAAYJ,EAAS,YAAA,EACrBK,EAAc,OAAO,KAAKH,CAAK,EAAE,KAAKI,GAAOA,EAAI,YAAA,IAAkBF,CAAS,EAClF,OAAOC,EAAcH,EAAMG,CAAW,EAAIJ,EAAAA,GAC5C,CAOA,SAASM,EAAW,CAAE,OAAAC,EAAQ,SAAAC,GAA6B,CACzD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,OAAO,EAC9BC,EAAOb,EAAQS,EAAO,IAAI,EAC1BK,EAAeL,EAAO,UAAU,QAAU,EAEhD,OACEM,EAAAA,IAAC,MAAA,CAAI,UAAU,qOACb,SAAAC,EAAAA,KAACC,EAAAA,KAAA,CACC,GAAIR,EAAO,MAAQC,EAASD,EAAO,KAAK,EAAI,IAC5C,UAAU,YAEV,SAAA,CAAAM,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,qPACb,SAAAA,EAAAA,IAACF,EAAA,CAAK,UAAU,wCAAA,CAAyC,CAAA,CAC3D,EACF,EAEAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wDACX,WAAO,MACV,EAECD,EAAe,GACdE,OAAC,IAAA,CAAE,UAAU,4CACV,SAAA,CAAAF,EAAa,IAAEA,IAAiB,EAC7BH,EAAE,2BAA4B,SAAS,EACvCA,EAAE,6BAA8B,UAAU,CAAA,EAChD,EAGFK,EAAAA,KAAC,MAAA,CAAI,UAAU,kIACZ,SAAA,CAAAL,EAAE,eAAgB,QAAQ,EAC3BI,EAAAA,IAACG,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,CAAA,CAAA,CAClC,CAAA,CAAA,CAAA,EAEJ,CAEJ,CAEO,SAASC,GAAqC,CACnD,KAAM,CAAE,CAAA,EAAMP,EAAAA,eAAe,OAAO,EAC9B,CAAE,sBAAAQ,EAAuB,UAAAC,CAAA,EAAcC,gBAAA,EACvCZ,EAAWa,EAAAA,aAAA,EAEXC,EAAaJ,EAAA,EACbK,EAAUD,GAAY,SAAW,CAAA,EAEvC,OAAIH,EAEAN,MAAC,OAAI,UAAU,iDACb,eAAC,MAAA,CAAI,UAAU,mGAAmG,CAAA,CACpH,EAKFC,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAD,EAAAA,IAACW,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOF,GAAY,OAAS,EAAE,gBAAiB,SAAS,CAAA,CAAE,CAC9D,CAAA,SAGD,MAAA,CACC,SAAA,CAAAT,EAAAA,IAAC,KAAA,CAAG,UAAU,gDACX,SAAAS,GAAY,OAAS,EAAE,gBAAiB,SAAS,CAAA,CACpD,QACC,IAAA,CAAE,UAAU,oCACV,SAAA,EAAE,mBAAoB,uCAAuC,CAAA,CAChE,CAAA,EACF,EAEAT,EAAAA,IAAC,UAAA,CACE,SAAAU,EAAQ,OAAS,EAChBV,EAAAA,IAAC,MAAA,CAAI,UAAU,sEACZ,SAAAU,EAAQ,IAAIhB,GACXM,EAAAA,IAACP,EAAA,CAEC,OAAAC,EACA,SAAAC,CAAA,EAFKD,EAAO,EAAA,CAIf,CAAA,CACH,EAEAO,OAAC,MAAA,CAAI,UAAU,wFACb,SAAA,CAAAD,EAAAA,IAACb,EAAAA,IAAA,CAAI,UAAU,oDAAA,CAAqD,QACnE,IAAA,CAAE,UAAU,+BACV,SAAA,EAAE,oBAAqB,yBAAyB,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EACF,CAEJ"}
@@ -3,7 +3,7 @@ import { useTranslation as d } from "react-i18next";
3
3
  import * as m from "lucide-react";
4
4
  import { Box as s, ArrowRight as u } from "lucide-react";
5
5
  import { Link as v } from "react-router-dom";
6
- import { u as h, b as p, B as b } from "./index-CwSaRXXg.js";
6
+ import { u as h, b as p, B as b } from "./index-lpIzhufD.js";
7
7
  function x(r) {
8
8
  if (!r) return s;
9
9
  const o = m;
@@ -65,4 +65,4 @@ function j() {
65
65
  export {
66
66
  j as ApplicationsGridPage
67
67
  };
68
- //# sourceMappingURL=ApplicationsGridPage-DbVcvezt.js.map
68
+ //# sourceMappingURL=ApplicationsGridPage-DXsTfXPI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsGridPage-DbVcvezt.js","sources":["../../src/pages/platform/administration/applications/ApplicationsGridPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n ArrowRight,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ModuleDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nfunction getIcon(iconName: string | null): LucideIcon {\r\n if (!iconName) return Box;\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n if (icons[iconName]) return icons[iconName];\r\n const lowerName = iconName.toLowerCase();\r\n const matchingKey = Object.keys(icons).find(key => key.toLowerCase() === lowerName);\r\n return matchingKey ? icons[matchingKey] : Box;\r\n}\r\n\r\ninterface ModuleCardProps {\r\n readonly module: ModuleDto;\r\n readonly buildUrl: (path: string) => string;\r\n}\r\n\r\nfunction ModuleCard({ module, buildUrl }: ModuleCardProps) {\r\n const { t } = useTranslation('admin');\r\n const Icon = getIcon(module.icon);\r\n const sectionCount = module.sections?.length ?? 0;\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10\">\r\n <Link\r\n to={module.route ? buildUrl(module.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {module.label}\r\n </h3>\r\n\r\n {sectionCount > 0 && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {sectionCount} {sectionCount === 1\r\n ? t('modules.sectionCount_one', 'section')\r\n : t('modules.sectionCount_other', 'sections')}\r\n </p>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('modules.open', 'Ouvrir')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n}\r\n\r\nexport function ApplicationsGridPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { getCurrentApplication, isLoading } = useNavigation();\r\n const buildUrl = useTenantUrl();\r\n\r\n const currentApp = getCurrentApplication();\r\n const modules = currentApp?.modules ?? [];\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <Breadcrumb\r\n items={[\r\n { label: currentApp?.label ?? t('modules.title', 'Modules') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {currentApp?.label ?? t('modules.title', 'Modules')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('modules.subtitle', 'Sélectionnez un module pour commencer')}\r\n </p>\r\n </div>\r\n\r\n <section>\r\n {modules.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {modules.map(module => (\r\n <ModuleCard\r\n key={module.id}\r\n module={module}\r\n buildUrl={buildUrl}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('modules.noModules', 'Aucun module disponible')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["getIcon","iconName","Box","icons","LucideIcons","lowerName","matchingKey","key","ModuleCard","module","buildUrl","t","useTranslation","Icon","sectionCount","jsx","jsxs","Link","ArrowRight","ApplicationsGridPage","getCurrentApplication","isLoading","useNavigation","useTenantUrl","currentApp","modules","Breadcrumb"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsGridPage-DXsTfXPI.js","sources":["../../src/pages/platform/administration/applications/ApplicationsGridPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n ArrowRight,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ModuleDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nfunction getIcon(iconName: string | null): LucideIcon {\r\n if (!iconName) return Box;\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n if (icons[iconName]) return icons[iconName];\r\n const lowerName = iconName.toLowerCase();\r\n const matchingKey = Object.keys(icons).find(key => key.toLowerCase() === lowerName);\r\n return matchingKey ? icons[matchingKey] : Box;\r\n}\r\n\r\ninterface ModuleCardProps {\r\n readonly module: ModuleDto;\r\n readonly buildUrl: (path: string) => string;\r\n}\r\n\r\nfunction ModuleCard({ module, buildUrl }: ModuleCardProps) {\r\n const { t } = useTranslation('admin');\r\n const Icon = getIcon(module.icon);\r\n const sectionCount = module.sections?.length ?? 0;\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10\">\r\n <Link\r\n to={module.route ? buildUrl(module.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {module.label}\r\n </h3>\r\n\r\n {sectionCount > 0 && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {sectionCount} {sectionCount === 1\r\n ? t('modules.sectionCount_one', 'section')\r\n : t('modules.sectionCount_other', 'sections')}\r\n </p>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('modules.open', 'Ouvrir')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n}\r\n\r\nexport function ApplicationsGridPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { getCurrentApplication, isLoading } = useNavigation();\r\n const buildUrl = useTenantUrl();\r\n\r\n const currentApp = getCurrentApplication();\r\n const modules = currentApp?.modules ?? [];\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <Breadcrumb\r\n items={[\r\n { label: currentApp?.label ?? t('modules.title', 'Modules') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {currentApp?.label ?? t('modules.title', 'Modules')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('modules.subtitle', 'Sélectionnez un module pour commencer')}\r\n </p>\r\n </div>\r\n\r\n <section>\r\n {modules.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {modules.map(module => (\r\n <ModuleCard\r\n key={module.id}\r\n module={module}\r\n buildUrl={buildUrl}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('modules.noModules', 'Aucun module disponible')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["getIcon","iconName","Box","icons","LucideIcons","lowerName","matchingKey","key","ModuleCard","module","buildUrl","t","useTranslation","Icon","sectionCount","jsx","jsxs","Link","ArrowRight","ApplicationsGridPage","getCurrentApplication","isLoading","useNavigation","useTenantUrl","currentApp","modules","Breadcrumb"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),q=require("react-router-dom"),k=require("react-i18next"),o=require("lucide-react"),C=require("./index-2wUhd9Lu.js"),F=({id:A,name:s,description:b,icon:u,isActive:d,userCount:v,lastAccessedAt:f,onClick:j})=>{const{t:a}=k.useTranslation("admin"),h=r.useMemo(()=>{const n=["from-blue-500 to-cyan-500","from-purple-500 to-pink-500","from-green-500 to-emerald-500","from-orange-500 to-red-500","from-indigo-500 to-blue-500","from-teal-500 to-green-500"],i=s.split("").reduce((y,c)=>y+c.charCodeAt(0),0);return n[i%n.length]},[s]),x=n=>{if(!n)return a("applications.card.never");const i=new Date(n),c=new Date().getTime()-i.getTime(),m=Math.floor(c/6e4),l=Math.floor(m/60),N=Math.floor(l/24);return m<1?a("applications.card.justNow"):m<60?a("applications.card.minutesAgo",{count:m}):l<24?a("applications.card.hoursAgo",{count:l}):N<7?a("applications.card.daysAgo",{count:N}):i.toLocaleDateString()};return e.jsxs("button",{onClick:j,className:"group relative overflow-hidden rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-6 text-left shadow-sm transition-all duration-300 hover:shadow-md hover:scale-105 hover:border-[var(--color-primary-600)]",children:[e.jsx("div",{className:"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-5",children:e.jsx("div",{className:`absolute inset-0 bg-gradient-to-br ${h}`})}),e.jsxs("div",{className:"relative z-10",children:[e.jsxs("div",{className:"mb-4 flex items-start justify-between",children:[e.jsx("div",{className:`flex h-12 w-12 items-center justify-center rounded-[var(--radius-button)] bg-gradient-to-br ${h} text-white text-lg font-bold`,children:u&&u.length<=2?u:s.charAt(0).toUpperCase()}),e.jsxs("div",{className:"flex items-center gap-2",children:[d&&e.jsxs("div",{className:"flex items-center gap-1 rounded-full bg-[var(--success-bg)] px-2 py-1",children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--success-text)]"}),e.jsx("span",{className:"text-xs font-medium text-[var(--success-text)]",children:a("applications.card.active")})]}),!d&&e.jsxs("div",{className:"flex items-center gap-1 rounded-full bg-[var(--warning-bg)] px-2 py-1",children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--warning-text)]"}),e.jsx("span",{className:"text-xs font-medium text-[var(--warning-text)]",children:a("applications.card.inactive")})]})]})]}),e.jsx("h3",{className:"mb-2 text-lg font-bold text-[var(--text-primary)]",children:s}),b&&e.jsx("p",{className:"mb-4 line-clamp-2 text-sm text-[var(--text-secondary)]",children:b}),e.jsxs("div",{className:"mb-4 flex items-center gap-4 text-xs text-[var(--text-tertiary)]",children:[v!==void 0&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Users,{className:"h-4 w-4"}),e.jsxs("span",{children:[v," ",a(v!==1?"applications.card.users":"applications.card.user")]})]}),f&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Clock,{className:"h-4 w-4"}),e.jsx("span",{children:x(f)})]})]}),e.jsxs("div",{className:"inline-flex items-center gap-2 rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-3 py-2 text-xs font-medium text-white transition-all duration-200 group-hover:gap-3",children:[a("applications.card.viewDetails"),e.jsx(o.ChevronRight,{className:"h-4 w-4"})]})]})]})},D=()=>{const A=q.useNavigate(),{t:s}=k.useTranslation("admin"),{currentTenant:b,isGlobalView:u}=C.useTenant(),[d,v]=r.useState([]),[f,j]=r.useState(!0),[a,h]=r.useState(null),[x,n]=r.useState("cards"),[i,y]=r.useState(""),[c,m]=r.useState(""),[l,N]=r.useState("all"),S=r.useCallback(async()=>{try{j(!0);const t=await C.adminApi.applications.getAll();v(t),h(null)}catch(t){h(t instanceof Error?t.message:"Failed to load applications")}finally{j(!1)}},[b?.id,u]);r.useEffect(()=>{S()},[S]);const L=r.useMemo(()=>{const t=new Set(d.map(g=>g.zone));return Array.from(t).filter(Boolean)},[d]),p=r.useMemo(()=>d.filter(t=>{const g=t.label.toLowerCase().includes(i.toLowerCase())||(t.description?.toLowerCase().includes(i.toLowerCase())??!1),M=!c||t.zone===c,T=l==="all"||l==="active"&&t.isActive||l==="inactive"&&!t.isActive;return g&&M&&T}),[d,i,c,l]),w=t=>{A(`/administration/applications/${t}`)};return f?e.jsx("div",{className:"flex h-96 items-center justify-center",children:e.jsx(o.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-primary-600)]"})}):a?e.jsx("div",{className:"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(o.AlertTriangle,{className:"h-5 w-5 text-[var(--error-text)]"}),e.jsx("p",{className:"text-[var(--error-text)]",children:a})]})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(C.Breadcrumb,{items:[{label:s("header.title"),href:"/administration"},{label:s("applications.title","Applications")}]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold text-[var(--text-primary)]",children:s("applications.list.heading")}),e.jsx("p",{className:"mt-2 text-[var(--text-secondary)]",children:s("applications.list.description")})]}),e.jsxs("div",{className:"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-center",children:[e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(o.Search,{className:"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]"}),e.jsx("input",{type:"text",placeholder:s("applications.list.search"),value:i,onChange:t=>y(t.target.value),className:"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none"})]}),e.jsxs("select",{value:c,onChange:t=>m(t.target.value),className:"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none",children:[e.jsx("option",{value:"",children:s("applications.list.allContexts")}),L.map(t=>e.jsx("option",{value:t,children:t},t))]}),e.jsxs("select",{value:l,onChange:t=>N(t.target.value),className:"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none",children:[e.jsx("option",{value:"all",children:s("applications.list.allStatus")}),e.jsx("option",{value:"active",children:s("applications.list.active")}),e.jsx("option",{value:"inactive",children:s("applications.list.inactive")})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:()=>n("cards"),className:`rounded-lg p-2 transition-all ${x==="cards"?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]"}`,title:s("applications.list.cardView"),children:e.jsx(o.LayoutGrid,{className:"h-5 w-5"})}),e.jsx("button",{onClick:()=>n("table"),className:`rounded-lg p-2 transition-all ${x==="table"?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]"}`,title:s("applications.list.tableView"),children:e.jsx(o.LayoutList,{className:"h-5 w-5"})}),e.jsx("span",{className:"ml-auto text-sm text-[var(--text-tertiary)]",children:s("applications.list.count",{count:p.length})})]})]}),p.length===0&&e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center",children:e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("applications.list.noResults")})}),p.length>0&&x==="cards"&&e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:p.map(t=>e.jsx(F,{id:t.id,name:t.label,description:t.description??void 0,icon:t.icon??void 0,isActive:t.isActive,onClick:()=>w(t.id)},t.id))}),p.length>0&&x!=="cards"&&e.jsx("div",{className:"card overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("applications.list.columns.application")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell",children:s("applications.list.columns.context")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:s("applications.list.columns.modules")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("applications.list.columns.status")}),e.jsx("th",{className:"w-24 px-4 py-3"})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:p.map(t=>e.jsxs("tr",{className:"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group",onClick:()=>w(t.id),children:[e.jsxs("td",{className:"px-4 py-3",children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors",children:t.label}),t.description&&e.jsx("p",{className:"mt-0.5 text-xs text-[var(--text-tertiary)]",children:t.description})]}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)] hidden md:table-cell",children:t.zone}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell",children:t.modulesCount||0}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium",children:t.isActive?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--success-text)]"}),e.jsx("span",{className:"text-[var(--success-text)]",children:s("applications.list.active")})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--warning-text)]"}),e.jsx("span",{className:"text-[var(--warning-text)]",children:s("applications.list.inactive")})]})})}),e.jsx("td",{className:"px-4 py-3",onClick:g=>g.stopPropagation(),children:e.jsx("button",{onClick:()=>w(t.id),className:"inline-flex items-center justify-center rounded-lg bg-[var(--color-primary-600)] p-2 text-white transition-all hover:shadow-md",children:e.jsx("span",{className:"text-xs font-medium",children:s("applications.list.view")})})})]},t.id))})]})})]})};exports.ApplicationsListPage=D;
2
- //# sourceMappingURL=ApplicationsListPage-DYKM2Yeo.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),q=require("react-router-dom"),k=require("react-i18next"),o=require("lucide-react"),C=require("./index-IgLVXPg8.js"),F=({id:A,name:s,description:b,icon:u,isActive:d,userCount:v,lastAccessedAt:f,onClick:j})=>{const{t:a}=k.useTranslation("admin"),h=r.useMemo(()=>{const n=["from-blue-500 to-cyan-500","from-purple-500 to-pink-500","from-green-500 to-emerald-500","from-orange-500 to-red-500","from-indigo-500 to-blue-500","from-teal-500 to-green-500"],i=s.split("").reduce((y,c)=>y+c.charCodeAt(0),0);return n[i%n.length]},[s]),x=n=>{if(!n)return a("applications.card.never");const i=new Date(n),c=new Date().getTime()-i.getTime(),m=Math.floor(c/6e4),l=Math.floor(m/60),N=Math.floor(l/24);return m<1?a("applications.card.justNow"):m<60?a("applications.card.minutesAgo",{count:m}):l<24?a("applications.card.hoursAgo",{count:l}):N<7?a("applications.card.daysAgo",{count:N}):i.toLocaleDateString()};return e.jsxs("button",{onClick:j,className:"group relative overflow-hidden rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-6 text-left shadow-sm transition-all duration-300 hover:shadow-md hover:scale-105 hover:border-[var(--color-primary-600)]",children:[e.jsx("div",{className:"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-5",children:e.jsx("div",{className:`absolute inset-0 bg-gradient-to-br ${h}`})}),e.jsxs("div",{className:"relative z-10",children:[e.jsxs("div",{className:"mb-4 flex items-start justify-between",children:[e.jsx("div",{className:`flex h-12 w-12 items-center justify-center rounded-[var(--radius-button)] bg-gradient-to-br ${h} text-white text-lg font-bold`,children:u&&u.length<=2?u:s.charAt(0).toUpperCase()}),e.jsxs("div",{className:"flex items-center gap-2",children:[d&&e.jsxs("div",{className:"flex items-center gap-1 rounded-full bg-[var(--success-bg)] px-2 py-1",children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--success-text)]"}),e.jsx("span",{className:"text-xs font-medium text-[var(--success-text)]",children:a("applications.card.active")})]}),!d&&e.jsxs("div",{className:"flex items-center gap-1 rounded-full bg-[var(--warning-bg)] px-2 py-1",children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--warning-text)]"}),e.jsx("span",{className:"text-xs font-medium text-[var(--warning-text)]",children:a("applications.card.inactive")})]})]})]}),e.jsx("h3",{className:"mb-2 text-lg font-bold text-[var(--text-primary)]",children:s}),b&&e.jsx("p",{className:"mb-4 line-clamp-2 text-sm text-[var(--text-secondary)]",children:b}),e.jsxs("div",{className:"mb-4 flex items-center gap-4 text-xs text-[var(--text-tertiary)]",children:[v!==void 0&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Users,{className:"h-4 w-4"}),e.jsxs("span",{children:[v," ",a(v!==1?"applications.card.users":"applications.card.user")]})]}),f&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Clock,{className:"h-4 w-4"}),e.jsx("span",{children:x(f)})]})]}),e.jsxs("div",{className:"inline-flex items-center gap-2 rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-3 py-2 text-xs font-medium text-white transition-all duration-200 group-hover:gap-3",children:[a("applications.card.viewDetails"),e.jsx(o.ChevronRight,{className:"h-4 w-4"})]})]})]})},D=()=>{const A=q.useNavigate(),{t:s}=k.useTranslation("admin"),{currentTenant:b,isGlobalView:u}=C.useTenant(),[d,v]=r.useState([]),[f,j]=r.useState(!0),[a,h]=r.useState(null),[x,n]=r.useState("cards"),[i,y]=r.useState(""),[c,m]=r.useState(""),[l,N]=r.useState("all"),S=r.useCallback(async()=>{try{j(!0);const t=await C.adminApi.applications.getAll();v(t),h(null)}catch(t){h(t instanceof Error?t.message:"Failed to load applications")}finally{j(!1)}},[b?.id,u]);r.useEffect(()=>{S()},[S]);const L=r.useMemo(()=>{const t=new Set(d.map(g=>g.zone));return Array.from(t).filter(Boolean)},[d]),p=r.useMemo(()=>d.filter(t=>{const g=t.label.toLowerCase().includes(i.toLowerCase())||(t.description?.toLowerCase().includes(i.toLowerCase())??!1),M=!c||t.zone===c,T=l==="all"||l==="active"&&t.isActive||l==="inactive"&&!t.isActive;return g&&M&&T}),[d,i,c,l]),w=t=>{A(`/administration/applications/${t}`)};return f?e.jsx("div",{className:"flex h-96 items-center justify-center",children:e.jsx(o.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-primary-600)]"})}):a?e.jsx("div",{className:"rounded-lg border border-[var(--error-border)] bg-[var(--error-bg)] p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(o.AlertTriangle,{className:"h-5 w-5 text-[var(--error-text)]"}),e.jsx("p",{className:"text-[var(--error-text)]",children:a})]})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(C.Breadcrumb,{items:[{label:s("header.title"),href:"/administration"},{label:s("applications.title","Applications")}]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold text-[var(--text-primary)]",children:s("applications.list.heading")}),e.jsx("p",{className:"mt-2 text-[var(--text-secondary)]",children:s("applications.list.description")})]}),e.jsxs("div",{className:"space-y-4 rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-center",children:[e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(o.Search,{className:"absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[var(--text-tertiary)]"}),e.jsx("input",{type:"text",placeholder:s("applications.list.search"),value:i,onChange:t=>y(t.target.value),className:"w-full rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] py-2 pl-10 pr-4 text-[var(--text-primary)] placeholder-[var(--text-tertiary)] focus:border-[var(--color-primary-600)] focus:outline-none"})]}),e.jsxs("select",{value:c,onChange:t=>m(t.target.value),className:"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none",children:[e.jsx("option",{value:"",children:s("applications.list.allContexts")}),L.map(t=>e.jsx("option",{value:t,children:t},t))]}),e.jsxs("select",{value:l,onChange:t=>N(t.target.value),className:"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none",children:[e.jsx("option",{value:"all",children:s("applications.list.allStatus")}),e.jsx("option",{value:"active",children:s("applications.list.active")}),e.jsx("option",{value:"inactive",children:s("applications.list.inactive")})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:()=>n("cards"),className:`rounded-lg p-2 transition-all ${x==="cards"?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]"}`,title:s("applications.list.cardView"),children:e.jsx(o.LayoutGrid,{className:"h-5 w-5"})}),e.jsx("button",{onClick:()=>n("table"),className:`rounded-lg p-2 transition-all ${x==="table"?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)] text-[var(--text-tertiary)] hover:text-[var(--text-primary)]"}`,title:s("applications.list.tableView"),children:e.jsx(o.LayoutList,{className:"h-5 w-5"})}),e.jsx("span",{className:"ml-auto text-sm text-[var(--text-tertiary)]",children:s("applications.list.count",{count:p.length})})]})]}),p.length===0&&e.jsx("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-12 text-center",children:e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("applications.list.noResults")})}),p.length>0&&x==="cards"&&e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:p.map(t=>e.jsx(F,{id:t.id,name:t.label,description:t.description??void 0,icon:t.icon??void 0,isActive:t.isActive,onClick:()=>w(t.id)},t.id))}),p.length>0&&x!=="cards"&&e.jsx("div",{className:"card overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("applications.list.columns.application")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell",children:s("applications.list.columns.context")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell",children:s("applications.list.columns.modules")}),e.jsx("th",{className:"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider",children:s("applications.list.columns.status")}),e.jsx("th",{className:"w-24 px-4 py-3"})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:p.map(t=>e.jsxs("tr",{className:"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group",onClick:()=>w(t.id),children:[e.jsxs("td",{className:"px-4 py-3",children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors",children:t.label}),t.description&&e.jsx("p",{className:"mt-0.5 text-xs text-[var(--text-tertiary)]",children:t.description})]}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)] hidden md:table-cell",children:t.zone}),e.jsx("td",{className:"px-4 py-3 text-sm text-[var(--text-secondary)] hidden lg:table-cell",children:t.modulesCount||0}),e.jsx("td",{className:"px-4 py-3",children:e.jsx("div",{className:"inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-xs font-medium",children:t.isActive?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--success-text)]"}),e.jsx("span",{className:"text-[var(--success-text)]",children:s("applications.list.active")})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 w-2 rounded-full bg-[var(--warning-text)]"}),e.jsx("span",{className:"text-[var(--warning-text)]",children:s("applications.list.inactive")})]})})}),e.jsx("td",{className:"px-4 py-3",onClick:g=>g.stopPropagation(),children:e.jsx("button",{onClick:()=>w(t.id),className:"inline-flex items-center justify-center rounded-lg bg-[var(--color-primary-600)] p-2 text-white transition-all hover:shadow-md",children:e.jsx("span",{className:"text-xs font-medium",children:s("applications.list.view")})})})]},t.id))})]})})]})};exports.ApplicationsListPage=D;
2
+ //# sourceMappingURL=ApplicationsListPage--CGkyBuJ.js.map