@atlashub/smartstack 3.21.0 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),m=require("react"),P=require("react-router-dom"),q=require("react-i18next"),o=require("lucide-react"),k=require("./index-2wUhd9Lu.js"),$=require("./applicationAnalyticsApi-Ce_1qOk-.js"),f=require("recharts"),D=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899"],z=({period:d=30,mode:l="access"})=>{const[s,n]=m.useState(null),[g,x]=m.useState(!0),[t,i]=m.useState(null);if(m.useEffect(()=>{(async()=>{try{x(!0);const c=await $.applicationAnalyticsApi.getTrendsByApplication(d);n(c),i(null)}catch(c){i(c instanceof Error?c.message:"Failed to load trends")}finally{x(!1)}})()},[d]),g)return e.jsx("div",{className:"flex items-center justify-center h-[300px]",children:e.jsx(o.Loader2,{className:"h-6 w-6 animate-spin text-[var(--color-primary-600)]"})});if(t||!s)return e.jsx("div",{className:"flex items-center justify-center h-[300px] text-[var(--text-secondary)]",children:t||"Aucune donnée disponible"});if(!s?.dailyData?.length||!s?.applications?.length)return e.jsx("div",{className:"flex items-center justify-center h-[300px] text-[var(--text-secondary)]",children:"Aucune donnée de tendance disponible"});const u=s.dailyData.map(a=>{const c={date:new Date(a.date).toLocaleDateString("fr-FR",{day:"2-digit",month:"short"})};return s.applications.forEach(j=>{l==="access"?c[j.name]=a.applicationCounts[j.name]||0:c[j.name]=a.applicationDurations?.[j.name]||0}),c}),h=(a,c)=>a.color||D[c%D.length];return e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{style:{width:"100%",height:300},children:e.jsx(f.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(f.LineChart,{data:u,margin:{top:5,right:30,left:20,bottom:5},children:[e.jsx(f.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(f.XAxis,{dataKey:"date",stroke:"var(--text-secondary)",style:{fontSize:"11px"},tick:{fill:"var(--text-secondary)"}}),e.jsx(f.YAxis,{stroke:"var(--text-secondary)",style:{fontSize:"11px"},tick:{fill:"var(--text-secondary)"},label:{value:l==="access"?"Accès":"Minutes",angle:-90,position:"insideLeft",style:{fill:"var(--text-secondary)",fontSize:"11px"}}}),e.jsx(f.Tooltip,{contentStyle:{backgroundColor:"var(--bg-card)",border:"1px solid var(--border-color)",borderRadius:"8px",color:"var(--text-primary)"},labelStyle:{color:"var(--text-primary)",fontWeight:"bold",marginBottom:"8px"},itemStyle:{color:"var(--text-secondary)"}}),e.jsx(f.Legend,{wrapperStyle:{paddingTop:"20px"},formatter:a=>e.jsx("span",{style:{color:"var(--text-secondary)",fontSize:"12px"},children:a})}),s.applications.map((a,c)=>e.jsx(f.Line,{type:"monotone",dataKey:a.name,stroke:h(a,c),strokeWidth:2,dot:{r:2,fill:h(a,c)},activeDot:{r:5,fill:h(a,c)}},a.name))]})})}),e.jsx("div",{className:"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4",children:s.applications.map((a,c)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-3 h-3 rounded-full",style:{backgroundColor:h(a,c)}}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:a.name}),e.jsx("span",{className:"text-sm font-semibold",style:{color:h(a,c)},children:l==="access"?a.totalAccess:`${a.totalDurationMinutes} min`})]},a.name))})]})},L=["#3b82f6","#8b5cf6","#22c55e","#f59e0b","#ef4444","#06b6d4","#ec4899","#10b981","#f97316","#6366f1"],I=({data:d,mode:l="access"})=>{if(!d||d.length===0)return e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"No module data available"});const s=t=>l==="access"?t.accessCount:t.totalDurationMinutes,n=l==="access"?"accès":"min",g=Math.max(...d.map(t=>s(t)),1),x=t=>{if(t<60)return`${t}s`;const i=Math.floor(t/60),u=t%60;return u>0?`${i}m ${u}s`:`${i}m`};return e.jsx("div",{className:"space-y-3",children:d.map((t,i)=>{const u=s(t),h=u/g*100;return e.jsxs("div",{className:"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4",style:{borderLeftColor:L[i%L.length]},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"text-xs text-[var(--text-tertiary)] mb-1 font-mono",children:[e.jsx("span",{className:"text-blue-500",children:"platform"}),e.jsx("span",{className:"mx-1",children:"›"}),e.jsx("span",{className:"text-green-500",children:t.applicationName}),e.jsx("span",{className:"mx-1",children:"›"}),e.jsx("span",{className:"text-purple-500",children:t.moduleName})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("h5",{className:"font-semibold text-[var(--text-primary)]",children:t.moduleName})})]}),e.jsxs("div",{className:"text-right",children:[e.jsx("div",{className:"text-xl font-bold",style:{color:L[i%L.length]},children:u.toLocaleString()}),e.jsx("div",{className:"text-xs text-[var(--text-secondary)]",children:n})]})]}),e.jsx("div",{className:"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${h}%`,backgroundColor:L[i%L.length]}})}),e.jsxs("div",{className:"flex items-center gap-4 text-xs text-[var(--text-secondary)]",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Users,{className:"w-3 h-3"}),e.jsxs("span",{children:[t.uniqueUsers," utilisateurs uniques"]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Clock,{className:"w-3 h-3"}),e.jsxs("span",{children:["Moy: ",x(t.avgDuration)]})]})]})]},t.moduleId)})})},M=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899","#f97316","#14b8a6","#6366f1"],U=d=>{const{cx:l=0,cy:s=0,midAngle:n=0,innerRadius:g=0,outerRadius:x=0,startAngle:t=0,endAngle:i=0,fill:u="#8884d8",payload:h,percent:a=0,value:c=0}=d;if(!h)return e.jsx("g",{});const j=Math.PI/180,y=Math.sin(-j*n),N=Math.cos(-j*n),v=l+(x+10)*N,S=s+(x+10)*y,C=l+(x+30)*N,A=s+(x+30)*y,b=C+(N>=0?1:-1)*22,p=A,r=N>=0?"start":"end";return e.jsxs("g",{children:[e.jsx("text",{x:l,y:s,dy:-10,textAnchor:"middle",fill:"var(--text-primary)",style:{fontSize:"14px",fontWeight:"bold"},children:h.applicationName}),e.jsxs("text",{x:l,y:s,dy:10,textAnchor:"middle",fill:"var(--text-secondary)",style:{fontSize:"12px"},children:[c.toLocaleString()," accès"]}),e.jsx(f.Sector,{cx:l,cy:s,innerRadius:g,outerRadius:x,startAngle:t,endAngle:i,fill:u}),e.jsx(f.Sector,{cx:l,cy:s,startAngle:t,endAngle:i,innerRadius:x+6,outerRadius:x+10,fill:u}),e.jsx("path",{d:`M${v},${S}L${C},${A}L${b},${p}`,stroke:u,fill:"none"}),e.jsx("circle",{cx:b,cy:p,r:2,fill:u,stroke:"none"}),e.jsx("text",{x:b+(N>=0?1:-1)*12,y:p,textAnchor:r,fill:"var(--text-primary)",style:{fontSize:"12px"},children:`${(a*100).toFixed(0)}%`})]})},F=({data:d})=>{const[l,s]=m.useState(0);if(!d||d.length===0)return e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--text-secondary)]",children:"Aucune donnée d'activité disponible"});const n=d.reduce((t,i)=>t+i.accessCount,0),g=d.map((t,i)=>({...t,name:t.applicationName,value:t.accessCount,fill:M[i%M.length]})),x=(t,i)=>{s(i)};return e.jsxs("div",{className:"flex flex-col",children:[e.jsx("div",{className:"flex items-center gap-2 text-sm h-[34px]",children:e.jsx("span",{className:"text-[var(--text-tertiary)]",children:"Vue globale des applications actives"})}),e.jsxs("div",{className:"flex items-center justify-center gap-2",children:[e.jsx("span",{className:"text-lg font-semibold text-green-600",children:"Applications"}),e.jsxs("span",{className:"text-[var(--text-secondary)]",children:["(",d.length," actives • ",n.toLocaleString()," accès total)"]})]}),e.jsx("div",{style:{width:"100%",height:350},children:e.jsx(f.ResponsiveContainer,{width:"100%",height:350,children:e.jsx(f.PieChart,{children:e.jsx(f.Pie,{activeIndex:l,activeShape:U,data:g,cx:"50%",cy:"50%",innerRadius:70,outerRadius:110,fill:"#8884d8",dataKey:"value",onMouseEnter:x,children:g.map(t=>e.jsx(f.Cell,{fill:t.fill},t.name))})})})}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto",children:g.map((t,i)=>e.jsxs("div",{onMouseEnter:()=>s(i),className:`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer ${l===i?"bg-[var(--bg-secondary)]":""}`,children:[e.jsx("div",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:t.fill}}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate text-[var(--text-primary)]",children:t.applicationName}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)]",children:[t.accessCount.toLocaleString()," accès"]})]})]},t.applicationId))})]})},T=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899","#f97316","#14b8a6","#6366f1"],O=["Application","Module"],E=["text-blue-500","text-green-500"],B=d=>l=>{const{cx:s=0,cy:n=0,midAngle:g=0,innerRadius:x=0,outerRadius:t=0,startAngle:i=0,endAngle:u=0,fill:h="#8884d8",payload:a,percent:c=0,value:j=0}=l;if(!a)return e.jsx("g",{});const y=Math.PI/180,N=Math.sin(-y*g),v=Math.cos(-y*g),S=s+(t+10)*v,C=n+(t+10)*N,A=s+(t+30)*v,b=n+(t+30)*N,p=A+(v>=0?1:-1)*22,r=b,w=v>=0?"start":"end";return e.jsxs("g",{children:[e.jsx("text",{x:s,y:n,dy:-10,textAnchor:"middle",fill:"var(--text-primary)",style:{fontSize:"14px",fontWeight:"bold"},children:a.name}),e.jsxs("text",{x:s,y:n,dy:10,textAnchor:"middle",fill:"var(--text-secondary)",style:{fontSize:"12px"},children:[j.toLocaleString()," ",d]}),e.jsx("text",{x:s,y:n,dy:28,textAnchor:"middle",fill:"var(--text-tertiary)",style:{fontSize:"11px"},children:a.hasChildren?"Cliquez pour explorer":""}),e.jsx(f.Sector,{cx:s,cy:n,innerRadius:x,outerRadius:t,startAngle:i,endAngle:u,fill:h}),e.jsx(f.Sector,{cx:s,cy:n,startAngle:i,endAngle:u,innerRadius:t+6,outerRadius:t+10,fill:h}),e.jsx("path",{d:`M${S},${C}L${A},${b}L${p},${r}`,stroke:h,fill:"none"}),e.jsx("circle",{cx:p,cy:r,r:2,fill:h,stroke:"none"}),e.jsx("text",{x:p+(v>=0?1:-1)*12,y:r,textAnchor:w,fill:"var(--text-primary)",style:{fontSize:"12px"},children:`${(c*100).toFixed(1)}%`}),e.jsx("text",{x:p+(v>=0?1:-1)*12,y:r,dy:14,textAnchor:w,fill:"var(--text-secondary)",style:{fontSize:"10px"},children:`${a.uniqueUsers} utilisateurs`})]})},V=({period:d,mode:l="access"})=>{const[s,n]=m.useState(null),[g,x]=m.useState(!0),[t,i]=m.useState(null),[u,h]=m.useState(0),[a,c]=m.useState(0),[j,y]=m.useState(),N=m.useCallback(async()=>{try{x(!0),i(null);const r=await $.applicationAnalyticsApi.getHierarchyData(a,j,d);n(r),h(0)}catch(r){i(r instanceof Error?r.message:"Failed to load data")}finally{x(!1)}},[a,j,d]);m.useEffect(()=>{N()},[N]);const v=r=>{r.hasChildren&&a===0&&(y(r.id),c(1))},S=()=>{a===1&&(y(void 0),c(0))},C=(r,w)=>{h(w)};if(g)return e.jsx("div",{className:"flex items-center justify-center h-[400px]",children:e.jsx(o.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-primary-600)]"})});if(t)return e.jsx("div",{className:"text-center py-8 text-red-500",children:t});if(!s?.items?.length)return e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"Aucune donnée disponible pour ce niveau"});const A=l==="access"?"accès":"min",b=s.items.map((r,w)=>({...r,value:l==="access"?r.accessCount:r.totalDurationMinutes,fill:T[w%T.length],valueLabel:A})),p=B(A);return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm flex-wrap",children:[e.jsxs("button",{onClick:()=>{c(0),y(void 0)},className:`flex items-center gap-1 px-2 py-1 rounded hover:bg-[var(--bg-secondary)] transition-colors ${a===0?"font-semibold text-blue-600":"text-[var(--text-secondary)]"}`,children:[e.jsx(o.Home,{className:"h-4 w-4"}),e.jsx("span",{children:"Applications"})]}),s.breadcrumb.map(r=>e.jsxs(m.Fragment,{children:[e.jsx(o.ChevronRight,{className:"h-4 w-4 text-[var(--text-tertiary)]"}),e.jsx("span",{className:`px-2 py-1 font-semibold ${E[1]}`,children:r.name})]},r.id)),a>0&&e.jsxs("button",{onClick:S,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)]",children:[e.jsx(o.ArrowLeft,{className:"h-4 w-4"}),"Retour"]})]}),e.jsxs("div",{className:"flex items-center justify-center gap-2",children:[e.jsxs("span",{className:`text-lg font-semibold ${E[a]}`,children:[O[a],"s"]}),e.jsxs("span",{className:"text-[var(--text-secondary)]",children:["(",s.items.length," éléments • ",l==="access"?`${s.totalAccess.toLocaleString()} accès total`:`${s.totalDurationMinutes.toLocaleString()} min total`,")"]})]}),e.jsx("div",{style:{width:"100%",height:350},children:e.jsx(f.ResponsiveContainer,{width:"100%",height:350,children:e.jsx(f.PieChart,{children:e.jsx(f.Pie,{activeIndex:u,activeShape:p,data:b,cx:"50%",cy:"50%",innerRadius:70,outerRadius:110,fill:"#8884d8",dataKey:"value",onMouseEnter:C,onClick:(r,w)=>v(b[w]),style:{cursor:b[u]?.hasChildren?"pointer":"default"},children:b.map(r=>e.jsx(f.Cell,{fill:r.fill},r.id))})})})}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto",children:b.map((r,w)=>e.jsxs("button",{onClick:()=>r.hasChildren&&v(r),onMouseEnter:()=>h(w),className:`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors text-left ${r.hasChildren?"cursor-pointer":"cursor-default"} ${u===w?"bg-[var(--bg-secondary)]":""}`,children:[e.jsx("div",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:r.fill}}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate text-[var(--text-primary)]",children:r.name}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)]",children:[r.value.toLocaleString()," ",A]})]}),r.hasChildren&&e.jsx(o.ChevronRight,{className:"h-4 w-4 text-[var(--text-tertiary)] flex-shrink-0"})]},r.id))})]})},R=({label:d,value:l,icon:s,color:n,subtitle:g})=>{const x={blue:"text-blue-500",green:"text-green-500",purple:"text-purple-500",orange:"text-orange-500",yellow:"text-yellow-500",red:"text-red-500"};return e.jsxs("div",{className:"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--text-secondary)]",children:d}),e.jsx("div",{className:x[n],children:s})]}),e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:typeof l=="number"?l.toLocaleString():l}),g&&e.jsx("div",{className:"text-xs text-[var(--text-tertiary)] mt-1",children:g})]})},_=()=>{const d=P.useNavigate(),{t:l}=q.useTranslation("admin"),{currentTenant:s}=k.useTenant(),[n,g]=m.useState(null),[x,t]=m.useState([]),[i,u]=m.useState(!0),[h,a]=m.useState(!1),[c,j]=m.useState(null),[y,N]=m.useState(30),[v,S]=m.useState("access"),C=m.useCallback(async()=>{try{j(null);const[p,r]=await Promise.all([$.applicationAnalyticsApi.getDashboardStats(),$.applicationAnalyticsApi.getTopModules(5,y)]);g(p),t(r)}catch(p){j(p instanceof Error?p.message:"Failed to load dashboard")}finally{u(!1),a(!1)}},[y,s?.id]);m.useEffect(()=>{C()},[C]);const A=()=>{a(!0),C()},b=p=>p<60?`${p}s`:`${Math.floor(p/60)}m`;return i?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)]"})}):c?e.jsx("div",{className:"space-y-6",children:e.jsxs("div",{className:"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3",children:[e.jsx(o.AlertTriangle,{className:"h-5 w-5 text-[var(--error-text)] flex-shrink-0"}),e.jsx("div",{className:"flex-1",children:e.jsx("p",{className:"text-[var(--error-text)] font-medium",children:c})}),e.jsx("button",{onClick:A,className:"text-[var(--error-text)] hover:opacity-80",children:e.jsx(o.RefreshCw,{className:"h-5 w-5"})})]})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(k.Breadcrumb,{items:[{label:l("header.title"),href:"/administration"},{label:l("dashboard.title","Dashboard")}]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2",children:[e.jsx(o.BarChart3,{className:"h-6 w-6"}),"Tableau de bord Applications"]}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:"Analyse d'utilisation par Context › Application › Module"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1",children:[e.jsx("button",{onClick:()=>S("access"),className:`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${v==="access"?"bg-[var(--color-primary-600)] text-white shadow-sm":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(o.Activity,{className:"w-3.5 h-3.5"}),"Accès"]})}),e.jsx("button",{onClick:()=>S("duration"),className:`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${v==="duration"?"bg-[var(--color-primary-600)] text-white shadow-sm":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(o.Clock,{className:"w-3.5 h-3.5"}),"Temps"]})})]}),e.jsxs("select",{value:y,onChange:p=>N(Number(p.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:7,children:"7 days"}),e.jsx("option",{value:30,children:"30 days"}),e.jsx("option",{value:90,children:"90 days"})]}),e.jsxs("button",{onClick:A,disabled:h,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",children:[e.jsx(o.RefreshCw,{className:`w-4 h-4 ${h?"animate-spin":""}`}),"Refresh"]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4",children:[e.jsx(R,{label:"Total Applications",value:n?.totalApplications||0,icon:e.jsx(o.BarChart3,{className:"h-5 w-5"}),color:"blue"}),e.jsx(R,{label:"Active Applications",value:n?.activeApplications||0,icon:e.jsx(o.Activity,{className:"h-5 w-5"}),color:"green"}),e.jsx(R,{label:"Total Users",value:n?.totalUsers||0,icon:e.jsx(o.Users,{className:"h-5 w-5"}),color:"purple"}),e.jsx(R,{label:"Active Today",value:n?.activeUsersToday||0,icon:e.jsx(o.TrendingUp,{className:"h-5 w-5"}),color:"orange"}),e.jsx(R,{label:"Avg Session",value:b(n?.avgSessionDuration||0),icon:e.jsx(o.Clock,{className:"h-5 w-5"}),color:"blue",subtitle:`${y} days`}),e.jsx(R,{label:"Growth Rate",value:`${n?.growthRate.toFixed(1)||0}%`,icon:e.jsx(o.TrendingUp,{className:"h-5 w-5"}),color:(n?.growthRate??0)>=0?"green":"red",subtitle:"vs previous period"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.PieChart,{className:"h-5 w-5 text-[var(--color-primary-600)]"}),v==="access"?"Activité":"Temps passé"," par Hiérarchie",e.jsx("span",{className:"text-xs font-normal text-[var(--text-secondary)] ml-2",children:"(Cliquez pour explorer)"})]}),e.jsx(V,{period:y,mode:v},`hierarchy-${s?.id??"global"}`)]}),e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.Activity,{className:"h-5 w-5 text-green-600"}),"Top Applications"]}),n?.mostPopularApps&&n.mostPopularApps.length>0?e.jsx(F,{data:n.mostPopularApps}):e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"Aucune donnée d'activité disponible"})]})]}),e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.TrendingUp,{className:"h-5 w-5"}),"Tendance ",v==="access"?"d'utilisation":"du temps passé"," par Application (",y," jours)"]}),e.jsx(z,{period:y,mode:v},`trends-${s?.id??"global"}`)]}),e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.Layers,{className:"h-5 w-5 text-purple-600"}),"Modules les plus ",v==="access"?"populaires":"utilisés",e.jsx("span",{className:"text-xs font-normal text-[var(--text-secondary)] ml-2",children:"(Context › Application › Module)"})]}),(x?.length??0)>0?e.jsx(I,{data:x,mode:v}):e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"Aucune donnée de module disponible"})]}),e.jsx("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",children:e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-bold text-[var(--text-primary)]",children:"Explorer toutes les Applications"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--text-secondary)]",children:"Voir les analyses détaillées pour chaque application et gérer les permissions"})]}),e.jsx("button",{onClick:()=>d("/administration/applications/list"),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",children:"Voir les Applications"})]})})]})};exports.ApplicationsDashboardPage=_;
2
- //# sourceMappingURL=ApplicationsDashboardPage-BBlLms2r.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),m=require("react"),P=require("react-router-dom"),q=require("react-i18next"),o=require("lucide-react"),k=require("./index-IgLVXPg8.js"),$=require("./applicationAnalyticsApi-CLBqRPfN.js"),f=require("recharts"),D=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899"],z=({period:d=30,mode:l="access"})=>{const[s,n]=m.useState(null),[g,x]=m.useState(!0),[t,i]=m.useState(null);if(m.useEffect(()=>{(async()=>{try{x(!0);const c=await $.applicationAnalyticsApi.getTrendsByApplication(d);n(c),i(null)}catch(c){i(c instanceof Error?c.message:"Failed to load trends")}finally{x(!1)}})()},[d]),g)return e.jsx("div",{className:"flex items-center justify-center h-[300px]",children:e.jsx(o.Loader2,{className:"h-6 w-6 animate-spin text-[var(--color-primary-600)]"})});if(t||!s)return e.jsx("div",{className:"flex items-center justify-center h-[300px] text-[var(--text-secondary)]",children:t||"Aucune donnée disponible"});if(!s?.dailyData?.length||!s?.applications?.length)return e.jsx("div",{className:"flex items-center justify-center h-[300px] text-[var(--text-secondary)]",children:"Aucune donnée de tendance disponible"});const u=s.dailyData.map(a=>{const c={date:new Date(a.date).toLocaleDateString("fr-FR",{day:"2-digit",month:"short"})};return s.applications.forEach(j=>{l==="access"?c[j.name]=a.applicationCounts[j.name]||0:c[j.name]=a.applicationDurations?.[j.name]||0}),c}),h=(a,c)=>a.color||D[c%D.length];return e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{style:{width:"100%",height:300},children:e.jsx(f.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(f.LineChart,{data:u,margin:{top:5,right:30,left:20,bottom:5},children:[e.jsx(f.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(f.XAxis,{dataKey:"date",stroke:"var(--text-secondary)",style:{fontSize:"11px"},tick:{fill:"var(--text-secondary)"}}),e.jsx(f.YAxis,{stroke:"var(--text-secondary)",style:{fontSize:"11px"},tick:{fill:"var(--text-secondary)"},label:{value:l==="access"?"Accès":"Minutes",angle:-90,position:"insideLeft",style:{fill:"var(--text-secondary)",fontSize:"11px"}}}),e.jsx(f.Tooltip,{contentStyle:{backgroundColor:"var(--bg-card)",border:"1px solid var(--border-color)",borderRadius:"8px",color:"var(--text-primary)"},labelStyle:{color:"var(--text-primary)",fontWeight:"bold",marginBottom:"8px"},itemStyle:{color:"var(--text-secondary)"}}),e.jsx(f.Legend,{wrapperStyle:{paddingTop:"20px"},formatter:a=>e.jsx("span",{style:{color:"var(--text-secondary)",fontSize:"12px"},children:a})}),s.applications.map((a,c)=>e.jsx(f.Line,{type:"monotone",dataKey:a.name,stroke:h(a,c),strokeWidth:2,dot:{r:2,fill:h(a,c)},activeDot:{r:5,fill:h(a,c)}},a.name))]})})}),e.jsx("div",{className:"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4",children:s.applications.map((a,c)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-3 h-3 rounded-full",style:{backgroundColor:h(a,c)}}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:a.name}),e.jsx("span",{className:"text-sm font-semibold",style:{color:h(a,c)},children:l==="access"?a.totalAccess:`${a.totalDurationMinutes} min`})]},a.name))})]})},L=["#3b82f6","#8b5cf6","#22c55e","#f59e0b","#ef4444","#06b6d4","#ec4899","#10b981","#f97316","#6366f1"],I=({data:d,mode:l="access"})=>{if(!d||d.length===0)return e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"No module data available"});const s=t=>l==="access"?t.accessCount:t.totalDurationMinutes,n=l==="access"?"accès":"min",g=Math.max(...d.map(t=>s(t)),1),x=t=>{if(t<60)return`${t}s`;const i=Math.floor(t/60),u=t%60;return u>0?`${i}m ${u}s`:`${i}m`};return e.jsx("div",{className:"space-y-3",children:d.map((t,i)=>{const u=s(t),h=u/g*100;return e.jsxs("div",{className:"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4",style:{borderLeftColor:L[i%L.length]},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"text-xs text-[var(--text-tertiary)] mb-1 font-mono",children:[e.jsx("span",{className:"text-blue-500",children:"platform"}),e.jsx("span",{className:"mx-1",children:"›"}),e.jsx("span",{className:"text-green-500",children:t.applicationName}),e.jsx("span",{className:"mx-1",children:"›"}),e.jsx("span",{className:"text-purple-500",children:t.moduleName})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("h5",{className:"font-semibold text-[var(--text-primary)]",children:t.moduleName})})]}),e.jsxs("div",{className:"text-right",children:[e.jsx("div",{className:"text-xl font-bold",style:{color:L[i%L.length]},children:u.toLocaleString()}),e.jsx("div",{className:"text-xs text-[var(--text-secondary)]",children:n})]})]}),e.jsx("div",{className:"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${h}%`,backgroundColor:L[i%L.length]}})}),e.jsxs("div",{className:"flex items-center gap-4 text-xs text-[var(--text-secondary)]",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Users,{className:"w-3 h-3"}),e.jsxs("span",{children:[t.uniqueUsers," utilisateurs uniques"]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Clock,{className:"w-3 h-3"}),e.jsxs("span",{children:["Moy: ",x(t.avgDuration)]})]})]})]},t.moduleId)})})},M=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899","#f97316","#14b8a6","#6366f1"],U=d=>{const{cx:l=0,cy:s=0,midAngle:n=0,innerRadius:g=0,outerRadius:x=0,startAngle:t=0,endAngle:i=0,fill:u="#8884d8",payload:h,percent:a=0,value:c=0}=d;if(!h)return e.jsx("g",{});const j=Math.PI/180,y=Math.sin(-j*n),N=Math.cos(-j*n),v=l+(x+10)*N,S=s+(x+10)*y,C=l+(x+30)*N,A=s+(x+30)*y,b=C+(N>=0?1:-1)*22,p=A,r=N>=0?"start":"end";return e.jsxs("g",{children:[e.jsx("text",{x:l,y:s,dy:-10,textAnchor:"middle",fill:"var(--text-primary)",style:{fontSize:"14px",fontWeight:"bold"},children:h.applicationName}),e.jsxs("text",{x:l,y:s,dy:10,textAnchor:"middle",fill:"var(--text-secondary)",style:{fontSize:"12px"},children:[c.toLocaleString()," accès"]}),e.jsx(f.Sector,{cx:l,cy:s,innerRadius:g,outerRadius:x,startAngle:t,endAngle:i,fill:u}),e.jsx(f.Sector,{cx:l,cy:s,startAngle:t,endAngle:i,innerRadius:x+6,outerRadius:x+10,fill:u}),e.jsx("path",{d:`M${v},${S}L${C},${A}L${b},${p}`,stroke:u,fill:"none"}),e.jsx("circle",{cx:b,cy:p,r:2,fill:u,stroke:"none"}),e.jsx("text",{x:b+(N>=0?1:-1)*12,y:p,textAnchor:r,fill:"var(--text-primary)",style:{fontSize:"12px"},children:`${(a*100).toFixed(0)}%`})]})},F=({data:d})=>{const[l,s]=m.useState(0);if(!d||d.length===0)return e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--text-secondary)]",children:"Aucune donnée d'activité disponible"});const n=d.reduce((t,i)=>t+i.accessCount,0),g=d.map((t,i)=>({...t,name:t.applicationName,value:t.accessCount,fill:M[i%M.length]})),x=(t,i)=>{s(i)};return e.jsxs("div",{className:"flex flex-col",children:[e.jsx("div",{className:"flex items-center gap-2 text-sm h-[34px]",children:e.jsx("span",{className:"text-[var(--text-tertiary)]",children:"Vue globale des applications actives"})}),e.jsxs("div",{className:"flex items-center justify-center gap-2",children:[e.jsx("span",{className:"text-lg font-semibold text-green-600",children:"Applications"}),e.jsxs("span",{className:"text-[var(--text-secondary)]",children:["(",d.length," actives • ",n.toLocaleString()," accès total)"]})]}),e.jsx("div",{style:{width:"100%",height:350},children:e.jsx(f.ResponsiveContainer,{width:"100%",height:350,children:e.jsx(f.PieChart,{children:e.jsx(f.Pie,{activeIndex:l,activeShape:U,data:g,cx:"50%",cy:"50%",innerRadius:70,outerRadius:110,fill:"#8884d8",dataKey:"value",onMouseEnter:x,children:g.map(t=>e.jsx(f.Cell,{fill:t.fill},t.name))})})})}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto",children:g.map((t,i)=>e.jsxs("div",{onMouseEnter:()=>s(i),className:`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer ${l===i?"bg-[var(--bg-secondary)]":""}`,children:[e.jsx("div",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:t.fill}}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate text-[var(--text-primary)]",children:t.applicationName}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)]",children:[t.accessCount.toLocaleString()," accès"]})]})]},t.applicationId))})]})},T=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899","#f97316","#14b8a6","#6366f1"],O=["Application","Module"],E=["text-blue-500","text-green-500"],B=d=>l=>{const{cx:s=0,cy:n=0,midAngle:g=0,innerRadius:x=0,outerRadius:t=0,startAngle:i=0,endAngle:u=0,fill:h="#8884d8",payload:a,percent:c=0,value:j=0}=l;if(!a)return e.jsx("g",{});const y=Math.PI/180,N=Math.sin(-y*g),v=Math.cos(-y*g),S=s+(t+10)*v,C=n+(t+10)*N,A=s+(t+30)*v,b=n+(t+30)*N,p=A+(v>=0?1:-1)*22,r=b,w=v>=0?"start":"end";return e.jsxs("g",{children:[e.jsx("text",{x:s,y:n,dy:-10,textAnchor:"middle",fill:"var(--text-primary)",style:{fontSize:"14px",fontWeight:"bold"},children:a.name}),e.jsxs("text",{x:s,y:n,dy:10,textAnchor:"middle",fill:"var(--text-secondary)",style:{fontSize:"12px"},children:[j.toLocaleString()," ",d]}),e.jsx("text",{x:s,y:n,dy:28,textAnchor:"middle",fill:"var(--text-tertiary)",style:{fontSize:"11px"},children:a.hasChildren?"Cliquez pour explorer":""}),e.jsx(f.Sector,{cx:s,cy:n,innerRadius:x,outerRadius:t,startAngle:i,endAngle:u,fill:h}),e.jsx(f.Sector,{cx:s,cy:n,startAngle:i,endAngle:u,innerRadius:t+6,outerRadius:t+10,fill:h}),e.jsx("path",{d:`M${S},${C}L${A},${b}L${p},${r}`,stroke:h,fill:"none"}),e.jsx("circle",{cx:p,cy:r,r:2,fill:h,stroke:"none"}),e.jsx("text",{x:p+(v>=0?1:-1)*12,y:r,textAnchor:w,fill:"var(--text-primary)",style:{fontSize:"12px"},children:`${(c*100).toFixed(1)}%`}),e.jsx("text",{x:p+(v>=0?1:-1)*12,y:r,dy:14,textAnchor:w,fill:"var(--text-secondary)",style:{fontSize:"10px"},children:`${a.uniqueUsers} utilisateurs`})]})},V=({period:d,mode:l="access"})=>{const[s,n]=m.useState(null),[g,x]=m.useState(!0),[t,i]=m.useState(null),[u,h]=m.useState(0),[a,c]=m.useState(0),[j,y]=m.useState(),N=m.useCallback(async()=>{try{x(!0),i(null);const r=await $.applicationAnalyticsApi.getHierarchyData(a,j,d);n(r),h(0)}catch(r){i(r instanceof Error?r.message:"Failed to load data")}finally{x(!1)}},[a,j,d]);m.useEffect(()=>{N()},[N]);const v=r=>{r.hasChildren&&a===0&&(y(r.id),c(1))},S=()=>{a===1&&(y(void 0),c(0))},C=(r,w)=>{h(w)};if(g)return e.jsx("div",{className:"flex items-center justify-center h-[400px]",children:e.jsx(o.Loader2,{className:"h-8 w-8 animate-spin text-[var(--color-primary-600)]"})});if(t)return e.jsx("div",{className:"text-center py-8 text-red-500",children:t});if(!s?.items?.length)return e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"Aucune donnée disponible pour ce niveau"});const A=l==="access"?"accès":"min",b=s.items.map((r,w)=>({...r,value:l==="access"?r.accessCount:r.totalDurationMinutes,fill:T[w%T.length],valueLabel:A})),p=B(A);return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm flex-wrap",children:[e.jsxs("button",{onClick:()=>{c(0),y(void 0)},className:`flex items-center gap-1 px-2 py-1 rounded hover:bg-[var(--bg-secondary)] transition-colors ${a===0?"font-semibold text-blue-600":"text-[var(--text-secondary)]"}`,children:[e.jsx(o.Home,{className:"h-4 w-4"}),e.jsx("span",{children:"Applications"})]}),s.breadcrumb.map(r=>e.jsxs(m.Fragment,{children:[e.jsx(o.ChevronRight,{className:"h-4 w-4 text-[var(--text-tertiary)]"}),e.jsx("span",{className:`px-2 py-1 font-semibold ${E[1]}`,children:r.name})]},r.id)),a>0&&e.jsxs("button",{onClick:S,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)]",children:[e.jsx(o.ArrowLeft,{className:"h-4 w-4"}),"Retour"]})]}),e.jsxs("div",{className:"flex items-center justify-center gap-2",children:[e.jsxs("span",{className:`text-lg font-semibold ${E[a]}`,children:[O[a],"s"]}),e.jsxs("span",{className:"text-[var(--text-secondary)]",children:["(",s.items.length," éléments • ",l==="access"?`${s.totalAccess.toLocaleString()} accès total`:`${s.totalDurationMinutes.toLocaleString()} min total`,")"]})]}),e.jsx("div",{style:{width:"100%",height:350},children:e.jsx(f.ResponsiveContainer,{width:"100%",height:350,children:e.jsx(f.PieChart,{children:e.jsx(f.Pie,{activeIndex:u,activeShape:p,data:b,cx:"50%",cy:"50%",innerRadius:70,outerRadius:110,fill:"#8884d8",dataKey:"value",onMouseEnter:C,onClick:(r,w)=>v(b[w]),style:{cursor:b[u]?.hasChildren?"pointer":"default"},children:b.map(r=>e.jsx(f.Cell,{fill:r.fill},r.id))})})})}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto",children:b.map((r,w)=>e.jsxs("button",{onClick:()=>r.hasChildren&&v(r),onMouseEnter:()=>h(w),className:`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors text-left ${r.hasChildren?"cursor-pointer":"cursor-default"} ${u===w?"bg-[var(--bg-secondary)]":""}`,children:[e.jsx("div",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:r.fill}}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate text-[var(--text-primary)]",children:r.name}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)]",children:[r.value.toLocaleString()," ",A]})]}),r.hasChildren&&e.jsx(o.ChevronRight,{className:"h-4 w-4 text-[var(--text-tertiary)] flex-shrink-0"})]},r.id))})]})},R=({label:d,value:l,icon:s,color:n,subtitle:g})=>{const x={blue:"text-blue-500",green:"text-green-500",purple:"text-purple-500",orange:"text-orange-500",yellow:"text-yellow-500",red:"text-red-500"};return e.jsxs("div",{className:"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--text-secondary)]",children:d}),e.jsx("div",{className:x[n],children:s})]}),e.jsx("div",{className:"text-2xl font-bold text-[var(--text-primary)]",children:typeof l=="number"?l.toLocaleString():l}),g&&e.jsx("div",{className:"text-xs text-[var(--text-tertiary)] mt-1",children:g})]})},_=()=>{const d=P.useNavigate(),{t:l}=q.useTranslation("admin"),{currentTenant:s}=k.useTenant(),[n,g]=m.useState(null),[x,t]=m.useState([]),[i,u]=m.useState(!0),[h,a]=m.useState(!1),[c,j]=m.useState(null),[y,N]=m.useState(30),[v,S]=m.useState("access"),C=m.useCallback(async()=>{try{j(null);const[p,r]=await Promise.all([$.applicationAnalyticsApi.getDashboardStats(),$.applicationAnalyticsApi.getTopModules(5,y)]);g(p),t(r)}catch(p){j(p instanceof Error?p.message:"Failed to load dashboard")}finally{u(!1),a(!1)}},[y,s?.id]);m.useEffect(()=>{C()},[C]);const A=()=>{a(!0),C()},b=p=>p<60?`${p}s`:`${Math.floor(p/60)}m`;return i?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)]"})}):c?e.jsx("div",{className:"space-y-6",children:e.jsxs("div",{className:"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3",children:[e.jsx(o.AlertTriangle,{className:"h-5 w-5 text-[var(--error-text)] flex-shrink-0"}),e.jsx("div",{className:"flex-1",children:e.jsx("p",{className:"text-[var(--error-text)] font-medium",children:c})}),e.jsx("button",{onClick:A,className:"text-[var(--error-text)] hover:opacity-80",children:e.jsx(o.RefreshCw,{className:"h-5 w-5"})})]})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(k.Breadcrumb,{items:[{label:l("header.title"),href:"/administration"},{label:l("dashboard.title","Dashboard")}]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2",children:[e.jsx(o.BarChart3,{className:"h-6 w-6"}),"Tableau de bord Applications"]}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:"Analyse d'utilisation par Context › Application › Module"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1",children:[e.jsx("button",{onClick:()=>S("access"),className:`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${v==="access"?"bg-[var(--color-primary-600)] text-white shadow-sm":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(o.Activity,{className:"w-3.5 h-3.5"}),"Accès"]})}),e.jsx("button",{onClick:()=>S("duration"),className:`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${v==="duration"?"bg-[var(--color-primary-600)] text-white shadow-sm":"text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]"}`,children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(o.Clock,{className:"w-3.5 h-3.5"}),"Temps"]})})]}),e.jsxs("select",{value:y,onChange:p=>N(Number(p.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:7,children:"7 days"}),e.jsx("option",{value:30,children:"30 days"}),e.jsx("option",{value:90,children:"90 days"})]}),e.jsxs("button",{onClick:A,disabled:h,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",children:[e.jsx(o.RefreshCw,{className:`w-4 h-4 ${h?"animate-spin":""}`}),"Refresh"]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4",children:[e.jsx(R,{label:"Total Applications",value:n?.totalApplications||0,icon:e.jsx(o.BarChart3,{className:"h-5 w-5"}),color:"blue"}),e.jsx(R,{label:"Active Applications",value:n?.activeApplications||0,icon:e.jsx(o.Activity,{className:"h-5 w-5"}),color:"green"}),e.jsx(R,{label:"Total Users",value:n?.totalUsers||0,icon:e.jsx(o.Users,{className:"h-5 w-5"}),color:"purple"}),e.jsx(R,{label:"Active Today",value:n?.activeUsersToday||0,icon:e.jsx(o.TrendingUp,{className:"h-5 w-5"}),color:"orange"}),e.jsx(R,{label:"Avg Session",value:b(n?.avgSessionDuration||0),icon:e.jsx(o.Clock,{className:"h-5 w-5"}),color:"blue",subtitle:`${y} days`}),e.jsx(R,{label:"Growth Rate",value:`${n?.growthRate.toFixed(1)||0}%`,icon:e.jsx(o.TrendingUp,{className:"h-5 w-5"}),color:(n?.growthRate??0)>=0?"green":"red",subtitle:"vs previous period"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.PieChart,{className:"h-5 w-5 text-[var(--color-primary-600)]"}),v==="access"?"Activité":"Temps passé"," par Hiérarchie",e.jsx("span",{className:"text-xs font-normal text-[var(--text-secondary)] ml-2",children:"(Cliquez pour explorer)"})]}),e.jsx(V,{period:y,mode:v},`hierarchy-${s?.id??"global"}`)]}),e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.Activity,{className:"h-5 w-5 text-green-600"}),"Top Applications"]}),n?.mostPopularApps&&n.mostPopularApps.length>0?e.jsx(F,{data:n.mostPopularApps}):e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"Aucune donnée d'activité disponible"})]})]}),e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.TrendingUp,{className:"h-5 w-5"}),"Tendance ",v==="access"?"d'utilisation":"du temps passé"," par Application (",y," jours)"]}),e.jsx(z,{period:y,mode:v},`trends-${s?.id??"global"}`)]}),e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4",children:[e.jsxs("h3",{className:"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]",children:[e.jsx(o.Layers,{className:"h-5 w-5 text-purple-600"}),"Modules les plus ",v==="access"?"populaires":"utilisés",e.jsx("span",{className:"text-xs font-normal text-[var(--text-secondary)] ml-2",children:"(Context › Application › Module)"})]}),(x?.length??0)>0?e.jsx(I,{data:x,mode:v}):e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:"Aucune donnée de module disponible"})]}),e.jsx("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",children:e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-bold text-[var(--text-primary)]",children:"Explorer toutes les Applications"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--text-secondary)]",children:"Voir les analyses détaillées pour chaque application et gérer les permissions"})]}),e.jsx("button",{onClick:()=>d("/administration/applications/list"),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",children:"Voir les Applications"})]})})]})};exports.ApplicationsDashboardPage=_;
2
+ //# sourceMappingURL=ApplicationsDashboardPage-B2MW8-Kc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsDashboardPage-BBlLms2r.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","iconColors","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-B2MW8-Kc.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","iconColors","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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"}
@@ -3,8 +3,8 @@ import G, { useState as g, useEffect as T, useCallback as V } from "react";
3
3
  import { useNavigate as X } from "react-router-dom";
4
4
  import { useTranslation as Y } from "react-i18next";
5
5
  import { Loader2 as P, Users as _, Clock as E, Home as J, ChevronRight as z, ArrowLeft as Q, AlertTriangle as Z, RefreshCw as I, BarChart3 as F, Activity as D, TrendingUp as M, PieChart as ee, Layers as te } from "lucide-react";
6
- import { a as ae, B as re } from "./index-CwSaRXXg.js";
7
- import { a as k } from "./applicationAnalyticsApi-B8AhFYLr.js";
6
+ import { a as ae, B as re } from "./index-lpIzhufD.js";
7
+ import { a as k } from "./applicationAnalyticsApi-Bwa75Fzd.js";
8
8
  import { ResponsiveContainer as j, LineChart as se, CartesianGrid as ne, XAxis as le, YAxis as ie, Tooltip as ce, Legend as oe, Line as de, PieChart as K, Pie as H, Cell as W, Sector as R } from "recharts";
9
9
  const U = [
10
10
  "#3b82f6",
@@ -802,4 +802,4 @@ const U = [
802
802
  export {
803
803
  Le as ApplicationsDashboardPage
804
804
  };
805
- //# sourceMappingURL=ApplicationsDashboardPage-DTWZxJJM.js.map
805
+ //# sourceMappingURL=ApplicationsDashboardPage-BDIjFIYZ.js.map