@atlashub/smartstack 3.29.0 → 3.31.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 (322) hide show
  1. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CDMhqrhE.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CDMhqrhE.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DcvOMm5k.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DcvOMm5k.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-DYBPNzjQ.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-DYBPNzjQ.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-YpJSDaWc.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-YpJSDaWc.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-9r1axtCg.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-9r1axtCg.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-TjCQ8_A8.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-TjCQ8_A8.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-COxazTnz.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-COxazTnz.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-QRysH0pT.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-QRysH0pT.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-Dbx01Ikm.js} +4 -4
  18. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-Dbx01Ikm.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage-jSHy3MPz.js} +2 -2
  20. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage-jSHy3MPz.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-CclKc0wI.js} +3 -3
  22. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-CclKc0wI.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-CxWmOc1x.js} +2 -2
  24. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-CxWmOc1x.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-BJXWXwyI.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-BJXWXwyI.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-D2l8cM3o.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-D2l8cM3o.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-CMosl3my.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-CMosl3my.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-Dc6NGQ61.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-Dc6NGQ61.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-DH7tpMlF.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-DH7tpMlF.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-DI-iMqoJ.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-DI-iMqoJ.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-B5UbujbZ.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-B5UbujbZ.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-E79QBSLb.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-E79QBSLb.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-CDFaL1gT.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-CDFaL1gT.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-CPeKJjyK.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-CPeKJjyK.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-BZ3Ocos5.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-BZ3Ocos5.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-Bml48QpH.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-Bml48QpH.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-DP1XPaKK.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-DP1XPaKK.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-DyzslZ06.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-DyzslZ06.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-Bz2KrMik.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-Bz2KrMik.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-hKjKM0Bh.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-hKjKM0Bh.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-B4nAd8Tj.js} +2 -2
  58. package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-B4nAd8Tj.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-C9qgPBS-.js} +3 -3
  60. package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-C9qgPBS-.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CjbNGMo1.js} +3 -3
  62. package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CjbNGMo1.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-rN7IFlTR.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-rN7IFlTR.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-CGv2L62M.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-CGv2L62M.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-DpYDmsgw.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-DpYDmsgw.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-CLI_fpF4.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-CLI_fpF4.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-Db6sOrZN.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-Db6sOrZN.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-BhMz2B6A.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-BhMz2B6A.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-D06arMXO.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-D06arMXO.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-BCM8KBCd.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-BCM8KBCd.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-CGMV3bWt.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-CGMV3bWt.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-BBrwEomx.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-BBrwEomx.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-CrlWe3gd.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-CrlWe3gd.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-BOV34_rJ.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-BOV34_rJ.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CK4-klmd.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CK4-klmd.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-CFZ1G4dG.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-CFZ1G4dG.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DuhpwhZx.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DuhpwhZx.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-BnNQRfBP.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-BnNQRfBP.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DdJxEoTZ.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DdJxEoTZ.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-BllOlagk.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-BllOlagk.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D1T_ozHl.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D1T_ozHl.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-CioLaCYz.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-CioLaCYz.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-CrAQt7qL.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-CrAQt7qL.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-BIG78-1-.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-BIG78-1-.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-CvPqugYu.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-CvPqugYu.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-CDSuc8vw.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-CDSuc8vw.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-XaOrGrPZ.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-XaOrGrPZ.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BsWVXkMe.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BsWVXkMe.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-oSD7oQhJ.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-oSD7oQhJ.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-DD0_XWdT.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-DD0_XWdT.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-ca2BOdoH.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-ca2BOdoH.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-Bex_JN5N.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-Bex_JN5N.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-C8tUIOnb.js} +2 -2
  124. package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-C8tUIOnb.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-B-FXS2ln.js} +2 -2
  126. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-B-FXS2ln.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-C8KZprkI.js} +3 -3
  128. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-C8KZprkI.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-BYt__zKJ.js} +2 -2
  130. package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-BYt__zKJ.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-MWcVu-LY.js} +2 -2
  132. package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-MWcVu-LY.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-DaJiMj5Z.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-DaJiMj5Z.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-rCLUIj_T.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-rCLUIj_T.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-DeuPnLWg.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-DeuPnLWg.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-j7Rp6apG.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-j7Rp6apG.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CLtZWX17.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CLtZWX17.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TGyGmLMM.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TGyGmLMM.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-C0c5G9e7.js} +2 -2
  146. package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-C0c5G9e7.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-Dm03fBBf.js} +2 -2
  148. package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-Dm03fBBf.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-B4WDzEKi.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-B4WDzEKi.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-Cwo9NwxH.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-Cwo9NwxH.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-CL12dFy-.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-CL12dFy-.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-CneIhl30.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-CneIhl30.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-DStKmwHT.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-DStKmwHT.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-X4Rrhs9p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-X4Rrhs9p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BUBYWtvR.js} +2 -2
  162. package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BUBYWtvR.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-CAgiB-NG.js} +2 -2
  164. package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-CAgiB-NG.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-B9vtpIZx.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-B9vtpIZx.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-BAoah-mL.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-BAoah-mL.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-BFcP4X8s.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-BFcP4X8s.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-D_Npnt4A.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-D_Npnt4A.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-DBP9kalU.js} +2 -2
  174. package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-DBP9kalU.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-p21DLhUb.js} +2 -2
  176. package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-p21DLhUb.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-DOwShnG8.js} +3 -3
  178. package/dist/chunks/UserCreateTicketPage-DOwShnG8.js.map +1 -0
  179. package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-lvlvp2u6.js} +48 -48
  180. package/dist/chunks/UserCreateTicketPage-lvlvp2u6.js.map +1 -0
  181. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-C_tm7Pld.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-C_tm7Pld.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-Dp6q6FEW.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-Dp6q6FEW.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-6grZ6gmV.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-6grZ6gmV.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-DXLxO7LF.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-DXLxO7LF.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-Ch9IfCPo.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-Ch9IfCPo.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-a4II5VEE.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-a4II5VEE.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-B7Er0V4l.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-B7Er0V4l.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-BeAv4QfV.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-BeAv4QfV.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-0M1FLqOe.js} +2 -2
  198. package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-0M1FLqOe.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-ZR9r9vvf.js} +2 -2
  200. package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-ZR9r9vvf.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-BJH8EE1K.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-BJH8EE1K.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-CBpF5d54.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-CBpF5d54.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-CkkWAvNB.js} +2 -2
  206. package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-CkkWAvNB.js.map} +1 -1
  207. package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-Dl7a2lWz.js} +2 -2
  208. package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-Dl7a2lWz.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-BwcSE_H1.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-BwcSE_H1.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-DKMmDvWk.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-DKMmDvWk.js.map} +1 -1
  213. package/dist/chunks/auth-Ca2Rn6on.js +2 -0
  214. package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
  215. package/dist/chunks/auth-ClNTDOqm.js +18 -0
  216. package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
  217. package/dist/chunks/auth-DECnMZjF.js +18 -0
  218. package/dist/chunks/auth-DECnMZjF.js.map +1 -0
  219. package/dist/chunks/auth-DPvxdqy4.js +18 -0
  220. package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
  221. package/dist/chunks/auth-HzvnTaOm.js +2 -0
  222. package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
  223. package/dist/chunks/auth-M6aNTKCH.js +2 -0
  224. package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
  225. package/dist/chunks/auth-UHnAu6_e.js +2 -0
  226. package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
  227. package/dist/chunks/auth-YrujJY7m.js +18 -0
  228. package/dist/chunks/auth-YrujJY7m.js.map +1 -0
  229. package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-BzDV3_Jc.js} +2 -2
  230. package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-BzDV3_Jc.js.map} +1 -1
  231. package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-CQ4vFMdP.js} +2 -2
  232. package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-CQ4vFMdP.js.map} +1 -1
  233. package/dist/chunks/{index-BIqcvvbh.js → index-BBmMbSZV.js} +9 -8
  234. package/dist/chunks/index-BBmMbSZV.js.map +1 -0
  235. package/dist/chunks/{index-_g82N2nb.js → index-BLlESTfA.js} +2 -2
  236. package/dist/chunks/{index-_g82N2nb.js.map → index-BLlESTfA.js.map} +1 -1
  237. package/dist/chunks/{index-DEOBhXS_.js → index-BPMjxWVx.js} +2 -2
  238. package/dist/chunks/{index-DEOBhXS_.js.map → index-BPMjxWVx.js.map} +1 -1
  239. package/dist/chunks/{index-Czk12A3G.js → index-CEbwdURd.js} +2 -2
  240. package/dist/chunks/{index-Czk12A3G.js.map → index-CEbwdURd.js.map} +1 -1
  241. package/dist/chunks/{index-BOKR3bw6.js → index-CUZygY5Q.js} +2 -2
  242. package/dist/chunks/{index-BOKR3bw6.js.map → index-CUZygY5Q.js.map} +1 -1
  243. package/dist/chunks/{index-IJR_91Yt.js → index-Ci1SqFiY.js} +2 -2
  244. package/dist/chunks/{index-IJR_91Yt.js.map → index-Ci1SqFiY.js.map} +1 -1
  245. package/dist/chunks/{index-Br2wsGE8.js → index-Cib93xtp.js} +2 -2
  246. package/dist/chunks/{index-Br2wsGE8.js.map → index-Cib93xtp.js.map} +1 -1
  247. package/dist/chunks/{index-BxHVPJ-j.js → index-CoHIgn5H.js} +2 -2
  248. package/dist/chunks/{index-BxHVPJ-j.js.map → index-CoHIgn5H.js.map} +1 -1
  249. package/dist/chunks/{index-DA5VyW0k.js → index-CpY95_ro.js} +2296 -2309
  250. package/dist/chunks/index-CpY95_ro.js.map +1 -0
  251. package/dist/chunks/{index-BMsjMCv9.js → index-D-2xSu5W.js} +3 -3
  252. package/dist/chunks/{index-BMsjMCv9.js.map → index-D-2xSu5W.js.map} +1 -1
  253. package/dist/chunks/{index-DIQ6Jmmq.js → index-D18t9DhC.js} +4 -4
  254. package/dist/chunks/{index-DIQ6Jmmq.js.map → index-D18t9DhC.js.map} +1 -1
  255. package/dist/chunks/index-DK5czlkn.js +48 -0
  256. package/dist/chunks/index-DK5czlkn.js.map +1 -0
  257. package/dist/chunks/{index-CxgEV-rT.js → index-DQd324n7.js} +2 -2
  258. package/dist/chunks/{index-CxgEV-rT.js.map → index-DQd324n7.js.map} +1 -1
  259. package/dist/chunks/{index-S-X8qFYW.js → index-Dbq-x5H9.js} +2 -2
  260. package/dist/chunks/{index-S-X8qFYW.js.map → index-Dbq-x5H9.js.map} +1 -1
  261. package/dist/chunks/{index-CNxx56kE.js → index-Det9dEaQ.js} +2 -2
  262. package/dist/chunks/{index-CNxx56kE.js.map → index-Det9dEaQ.js.map} +1 -1
  263. package/dist/chunks/{index-C1w97Ejz.js → index-bgT9XOKZ.js} +2 -2
  264. package/dist/chunks/{index-C1w97Ejz.js.map → index-bgT9XOKZ.js.map} +1 -1
  265. package/dist/chunks/index-h7ZrwrQg.js +2 -0
  266. package/dist/chunks/index-h7ZrwrQg.js.map +1 -0
  267. package/dist/chunks/{index-Djy4eIbB.js → index-k4USDz2P.js} +2 -2
  268. package/dist/chunks/{index-Djy4eIbB.js.map → index-k4USDz2P.js.map} +1 -1
  269. package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-7ihIWxAh.js} +2 -2
  270. package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-7ihIWxAh.js.map} +1 -1
  271. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-Dk6K-UTE.js} +2 -2
  272. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-Dk6K-UTE.js.map} +1 -1
  273. package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-BCMKkzlv.js} +2 -2
  274. package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-BCMKkzlv.js.map} +1 -1
  275. package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Dwn7pl5z.js} +2 -2
  276. package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Dwn7pl5z.js.map} +1 -1
  277. package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-Du7CvowE.js} +3 -3
  278. package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-Du7CvowE.js.map} +1 -1
  279. package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-gJ7yhWyi.js} +2 -2
  280. package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-gJ7yhWyi.js.map} +1 -1
  281. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-5wWea2Jg.js} +2 -2
  282. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-5wWea2Jg.js.map} +1 -1
  283. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-Bk_v8egy.js} +2 -2
  284. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-Bk_v8egy.js.map} +1 -1
  285. package/dist/components/routing/ProtectedRoute.d.ts.map +1 -1
  286. package/dist/contexts/AuthContext.d.ts.map +1 -1
  287. package/dist/pages/LoginPage.d.ts.map +1 -1
  288. package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
  289. package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
  290. package/dist/services/api/apiClient.d.ts.map +1 -1
  291. package/dist/services/support/ticketDraftService.d.ts.map +1 -1
  292. package/dist/smartstack.cjs +1 -1
  293. package/dist/smartstack.js +6 -6
  294. package/dist/utils/permissions.generated.d.ts +288 -0
  295. package/dist/utils/permissions.generated.d.ts.map +1 -0
  296. package/dist/utils/uuid.d.ts +6 -0
  297. package/dist/utils/uuid.d.ts.map +1 -0
  298. package/package.json +1 -1
  299. package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
  300. package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
  301. package/dist/chunks/auth-B-hELPDB.js +0 -2
  302. package/dist/chunks/auth-B-hELPDB.js.map +0 -1
  303. package/dist/chunks/auth-BYaMuq7D.js +0 -16
  304. package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
  305. package/dist/chunks/auth-C5zpZ9k7.js +0 -2
  306. package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
  307. package/dist/chunks/auth-CDpRMVv1.js +0 -16
  308. package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
  309. package/dist/chunks/auth-CyPkCta2.js +0 -2
  310. package/dist/chunks/auth-CyPkCta2.js.map +0 -1
  311. package/dist/chunks/auth-DL47kvnl.js +0 -2
  312. package/dist/chunks/auth-DL47kvnl.js.map +0 -1
  313. package/dist/chunks/auth-Diiv90i1.js +0 -16
  314. package/dist/chunks/auth-Diiv90i1.js.map +0 -1
  315. package/dist/chunks/auth-rog9MvUr.js +0 -16
  316. package/dist/chunks/auth-rog9MvUr.js.map +0 -1
  317. package/dist/chunks/index-BIqcvvbh.js.map +0 -1
  318. package/dist/chunks/index-DA5VyW0k.js.map +0 -1
  319. package/dist/chunks/index-Dht6EQW1.js +0 -2
  320. package/dist/chunks/index-Dht6EQW1.js.map +0 -1
  321. package/dist/chunks/index-vXiLh35n.js +0 -48
  322. package/dist/chunks/index-vXiLh35n.js.map +0 -1
@@ -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-DA5VyW0k.js";
7
- import { a as k } from "./applicationAnalyticsApi-BYoEJzSN.js";
6
+ import { a as ae, B as re } from "./index-CpY95_ro.js";
7
+ import { a as k } from "./applicationAnalyticsApi-DKMmDvWk.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-1V4iQ6eY.js.map
805
+ //# sourceMappingURL=ApplicationsDashboardPage-CclKc0wI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsDashboardPage-1V4iQ6eY.js","sources":["../../src/components/dashboard/UsageTrendChart.tsx","../../src/components/dashboard/ModulePopularityChart.tsx","../../src/components/dashboard/ApplicationActivityPieChart.tsx","../../src/components/dashboard/HierarchyDrillDownChart.tsx","../../src/pages/platform/administration/applications/ApplicationsDashboardPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport {\r\n LineChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer\r\n} from 'recharts';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ApplicationTrendsDto, ApplicationSeriesDto } from '@/services/api/applicationAnalyticsApi';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\nexport type ChartMode = 'access' | 'duration';\r\n\r\ninterface UsageTrendChartProps {\r\n readonly period?: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst DEFAULT_COLORS = [\r\n '#3b82f6', // blue\r\n '#22c55e', // green\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#06b6d4', // cyan\r\n '#ec4899', // pink\r\n];\r\n\r\nexport const UsageTrendChart: React.FC<UsageTrendChartProps> = ({ period = 30, mode = 'access' }) => {\r\n const [data, setData] = useState<ApplicationTrendsDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const result = await applicationAnalyticsApi.getTrendsByApplication(period);\r\n setData(result);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load trends');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [period]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px]\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n {error || 'Aucune donnée disponible'}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.dailyData?.length || !data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n Aucune donnée de tendance disponible\r\n </div>\r\n );\r\n }\r\n\r\n // Transform data for Recharts based on mode\r\n const chartData = data.dailyData.map((day) => {\r\n const entry: Record<string, string | number> = {\r\n date: new Date(day.date).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: 'short'\r\n })\r\n };\r\n // Add each application's value based on mode\r\n data.applications.forEach((app) => {\r\n if (mode === 'access') {\r\n entry[app.name] = day.applicationCounts[app.name] || 0;\r\n } else {\r\n entry[app.name] = day.applicationDurations?.[app.name] || 0;\r\n }\r\n });\r\n return entry;\r\n });\r\n\r\n const getColor = (app: ApplicationSeriesDto, index: number): string => {\r\n return app.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Chart */}\r\n <div style={{ width: '100%', height: 300 }}>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart\r\n data={chartData}\r\n margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n >\r\n <CartesianGrid\r\n strokeDasharray=\"3 3\"\r\n stroke=\"var(--border-color)\"\r\n />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n label={{\r\n value: mode === 'access' ? 'Accès' : 'Minutes',\r\n angle: -90,\r\n position: 'insideLeft',\r\n style: { fill: 'var(--text-secondary)', fontSize: '11px' }\r\n }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)'\r\n }}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 'bold', marginBottom: '8px' }}\r\n itemStyle={{ color: 'var(--text-secondary)' }}\r\n />\r\n <Legend\r\n wrapperStyle={{\r\n paddingTop: '20px'\r\n }}\r\n formatter={(value) => (\r\n <span style={{ color: 'var(--text-secondary)', fontSize: '12px' }}>{value}</span>\r\n )}\r\n />\r\n {data.applications.map((app, index) => (\r\n <Line\r\n key={app.name}\r\n type=\"monotone\"\r\n dataKey={app.name}\r\n stroke={getColor(app, index)}\r\n strokeWidth={2}\r\n dot={{ r: 2, fill: getColor(app, index) }}\r\n activeDot={{ r: 5, fill: getColor(app, index) }}\r\n />\r\n ))}\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend with totals */}\r\n <div className=\"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4\">\r\n {data.applications.map((app, index) => (\r\n <div key={app.name} className=\"flex items-center gap-2\">\r\n <div\r\n className=\"w-3 h-3 rounded-full\"\r\n style={{ backgroundColor: getColor(app, index) }}\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{app.name}</span>\r\n <span className=\"text-sm font-semibold\" style={{ color: getColor(app, index) }}>\r\n {mode === 'access' ? app.totalAccess : `${app.totalDurationMinutes} min`}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Users, Clock } from 'lucide-react';\r\nimport type { ModuleAnalyticsDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface ModulePopularityChartProps {\r\n readonly data: ModuleAnalyticsDto[];\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst moduleColors = [\r\n '#3b82f6',\r\n '#8b5cf6',\r\n '#22c55e',\r\n '#f59e0b',\r\n '#ef4444',\r\n '#06b6d4',\r\n '#ec4899',\r\n '#10b981',\r\n '#f97316',\r\n '#6366f1'\r\n];\r\n\r\nexport const ModulePopularityChart: React.FC<ModulePopularityChartProps> = ({ data, mode = 'access' }) => {\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n No module data available\r\n </div>\r\n );\r\n }\r\n\r\n const getValue = (module: ModuleAnalyticsDto) =>\r\n mode === 'access' ? module.accessCount : module.totalDurationMinutes;\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n\r\n const maxCount = Math.max(...data.map(m => getValue(m)), 1);\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n const remainingSeconds = seconds % 60;\r\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {data.map((module, index) => {\r\n const value = getValue(module);\r\n const percentage = (value / maxCount) * 100;\r\n\r\n return (\r\n <div\r\n key={module.moduleId}\r\n className=\"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4\"\r\n style={{ borderLeftColor: moduleColors[index % moduleColors.length] }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className=\"flex-1\">\r\n {/* Full hierarchy path */}\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1 font-mono\">\r\n <span className=\"text-blue-500\">platform</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-green-500\">{module.applicationName}</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-purple-500\">{module.moduleName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <h5 className=\"font-semibold text-[var(--text-primary)]\">\r\n {module.moduleName}\r\n </h5>\r\n </div>\r\n </div>\r\n <div className=\"text-right\">\r\n <div className=\"text-xl font-bold\" style={{ color: moduleColors[index % moduleColors.length] }}>\r\n {value.toLocaleString()}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{valueLabel}</div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: moduleColors[index % moduleColors.length]\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 text-xs text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n <span>{module.uniqueUsers} utilisateurs uniques</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n <span>Moy: {formatDuration(module.avgDuration)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport type { PopularApplicationDto } from '@/services/api/applicationAnalyticsApi';\r\n\r\ninterface ApplicationActivityPieChartProps {\r\n readonly data: PopularApplicationDto[];\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst renderActiveShape = (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: { applicationName: string; accessCount: number };\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.applicationName}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} accès\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text x={ex + (cos >= 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill=\"var(--text-primary)\" style={{ fontSize: '12px' }}>\r\n {`${(percent * 100).toFixed(0)}%`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const ApplicationActivityPieChart: React.FC<ApplicationActivityPieChartProps> = ({ data }) => {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n );\r\n }\r\n\r\n const totalAccess = data.reduce((sum, app) => sum + app.accessCount, 0);\r\n\r\n const chartData = data.map((app, index) => ({\r\n ...app,\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n fill: COLORS[index % COLORS.length]\r\n }));\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n {/* Spacer row to match breadcrumb height in hierarchy chart */}\r\n <div className=\"flex items-center gap-2 text-sm h-[34px]\">\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n Vue globale des applications actives\r\n </span>\r\n </div>\r\n\r\n {/* Summary stats - at top to match hierarchy chart */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className=\"text-lg font-semibold text-green-600\">\r\n Applications\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.length} actives • {totalAccess.toLocaleString()} accès total)\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart - same height as hierarchy */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter\r\n } as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.name} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n {/* Tooltip disabled - activeShape already displays all info in center */}\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend - same style as hierarchy chart */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <div\r\n key={item.applicationId}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer ${\r\n activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''\r\n }`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.applicationName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.accessCount.toLocaleString()} accès\r\n </p>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport { ChevronRight, Home, Loader2, ArrowLeft } from 'lucide-react';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { HierarchyDrillDownDto, HierarchyItemDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface HierarchyDrillDownChartProps {\r\n readonly period: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst LEVEL_LABELS = ['Application', 'Module'];\r\nconst LEVEL_COLORS = ['text-blue-500', 'text-green-500'];\r\n\r\ninterface ChartDataItem extends HierarchyItemDto {\r\n value: number;\r\n fill: string;\r\n valueLabel: string;\r\n}\r\n\r\nconst createRenderActiveShape = (valueLabel: string) => (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: ChartDataItem;\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.name}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} {valueLabel}\r\n </text>\r\n <text x={cx} y={cy} dy={28} textAnchor=\"middle\" fill=\"var(--text-tertiary)\" style={{ fontSize: '11px' }}>\r\n {payload.hasChildren ? 'Cliquez pour explorer' : ''}\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-primary)\"\r\n style={{ fontSize: '12px' }}\r\n >\r\n {`${(percent * 100).toFixed(1)}%`}\r\n </text>\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n dy={14}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-secondary)\"\r\n style={{ fontSize: '10px' }}\r\n >\r\n {`${payload.uniqueUsers} utilisateurs`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const HierarchyDrillDownChart: React.FC<HierarchyDrillDownChartProps> = ({ period, mode = 'access' }) => {\r\n const [data, setData] = useState<HierarchyDrillDownDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const [currentLevel, setCurrentLevel] = useState(0);\r\n const [applicationId, setApplicationId] = useState<string | undefined>();\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const result = await applicationAnalyticsApi.getHierarchyData(\r\n currentLevel,\r\n applicationId,\r\n period\r\n );\r\n setData(result);\r\n setActiveIndex(0);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load data');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [currentLevel, applicationId, period]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSliceClick = (item: HierarchyItemDto) => {\r\n if (!item.hasChildren) return;\r\n\r\n if (currentLevel === 0) {\r\n setApplicationId(item.id);\r\n setCurrentLevel(1);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if (currentLevel === 1) {\r\n setApplicationId(undefined);\r\n setCurrentLevel(0);\r\n }\r\n };\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[400px]\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"text-center py-8 text-red-500\">\r\n {error}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.items?.length) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée disponible pour ce niveau\r\n </div>\r\n );\r\n }\r\n\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n const chartData: ChartDataItem[] = data.items.map((item, index) => ({\r\n ...item,\r\n value: mode === 'access' ? item.accessCount : item.totalDurationMinutes,\r\n fill: COLORS[index % COLORS.length],\r\n valueLabel\r\n }));\r\n\r\n const renderActiveShape = createRenderActiveShape(valueLabel);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Breadcrumb Navigation */}\r\n <div className=\"flex items-center gap-2 text-sm flex-wrap\">\r\n <button\r\n onClick={() => { setCurrentLevel(0); setApplicationId(undefined); }}\r\n className={`flex items-center gap-1 px-2 py-1 rounded hover:bg-[var(--bg-secondary)] transition-colors ${\r\n currentLevel === 0 ? 'font-semibold text-blue-600' : 'text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Home className=\"h-4 w-4\" />\r\n <span>Applications</span>\r\n </button>\r\n\r\n {data.breadcrumb.map((item) => (\r\n <React.Fragment key={item.id}>\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className={`px-2 py-1 font-semibold ${LEVEL_COLORS[1]}`}>\r\n {item.name}\r\n </span>\r\n </React.Fragment>\r\n ))}\r\n\r\n {currentLevel > 0 && (\r\n <button\r\n onClick={handleBack}\r\n className=\"ml-auto flex items-center gap-1 px-3 py-1 rounded-lg bg-[var(--bg-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors text-[var(--text-secondary)]\"\r\n >\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n Retour\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Level indicator */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className={`text-lg font-semibold ${LEVEL_COLORS[currentLevel]}`}>\r\n {LEVEL_LABELS[currentLevel]}s\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.items.length} éléments • {mode === 'access'\r\n ? `${data.totalAccess.toLocaleString()} accès total`\r\n : `${data.totalDurationMinutes.toLocaleString()} min total`})\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter,\r\n onClick: (_: unknown, index: number) => handleSliceClick(chartData[index]),\r\n style: { cursor: chartData[activeIndex]?.hasChildren ? 'pointer' : 'default' }\r\n } as unknown as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.id} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend / List */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <button\r\n key={item.id}\r\n onClick={() => item.hasChildren && handleSliceClick(item)}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors text-left ${\r\n item.hasChildren ? 'cursor-pointer' : 'cursor-default'\r\n } ${activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.name}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.value.toLocaleString()} {valueLabel}\r\n </p>\r\n </div>\r\n {item.hasChildren && (\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AlertTriangle,\r\n BarChart3,\r\n Users,\r\n Activity,\r\n TrendingUp,\r\n Loader2,\r\n RefreshCw,\r\n Clock,\r\n Layers,\r\n PieChart\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type {\r\n ApplicationDashboardStatsDto,\r\n ModuleAnalyticsDto\r\n} from '@/services/api/applicationAnalyticsApi';\r\nimport { UsageTrendChart, type ChartMode } from '@/components/dashboard/UsageTrendChart';\r\nimport { ModulePopularityChart } from '@/components/dashboard/ModulePopularityChart';\r\nimport { ApplicationActivityPieChart } from '@/components/dashboard/ApplicationActivityPieChart';\r\nimport { HierarchyDrillDownChart } from '@/components/dashboard/HierarchyDrillDownChart';\r\n\r\nconst KpiCard: React.FC<{\r\n label: string;\r\n value: number | string;\r\n icon: React.ReactNode;\r\n color: 'blue' | 'green' | 'purple' | 'orange' | 'yellow' | 'red';\r\n subtitle?: string;\r\n}> = ({ label, value, icon, color, subtitle }) => {\r\n const iconColors = {\r\n blue: 'text-blue-500',\r\n green: 'text-green-500',\r\n purple: 'text-purple-500',\r\n orange: 'text-orange-500',\r\n yellow: 'text-yellow-500',\r\n red: 'text-red-500'\r\n };\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">{label}</span>\r\n <div className={iconColors[color]}>{icon}</div>\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{typeof value === 'number' ? value.toLocaleString() : value}</div>\r\n {subtitle && <div className=\"text-xs text-[var(--text-tertiary)] mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport const ApplicationsDashboardPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant } = useTenant();\r\n const [stats, setStats] = useState<ApplicationDashboardStatsDto | null>(null);\r\n const [topModules, setTopModules] = useState<ModuleAnalyticsDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [chartMode, setChartMode] = useState<ChartMode>('access');\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const [dashboardRes, modulesRes] = await Promise.all([\r\n applicationAnalyticsApi.getDashboardStats(),\r\n applicationAnalyticsApi.getTopModules(5, period)\r\n ]);\r\n\r\n setStats(dashboardRes);\r\n setTopModules(modulesRes);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, currentTenant?.id]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n return `${minutes}m`;\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-[var(--error-text)] font-medium\">{error}</p>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"text-[var(--error-text)] hover:opacity-80\"\r\n >\r\n <RefreshCw className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('dashboard.title', 'Dashboard') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <BarChart3 className=\"h-6 w-6\" />\r\n Tableau de bord Applications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n Analyse d'utilisation par Context › Application › Module\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n {/* Mode Toggle - Global */}\r\n <div className=\"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1\">\r\n <button\r\n onClick={() => setChartMode('access')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'access'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Activity className=\"w-3.5 h-3.5\" />\r\n Accès\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setChartMode('duration')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'duration'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Clock className=\"w-3.5 h-3.5\" />\r\n Temps\r\n </span>\r\n </button>\r\n </div>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value={7}>7 days</option>\r\n <option value={30}>30 days</option>\r\n <option value={90}>90 days</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"rounded-[var(--radius-button)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] flex items-center gap-2 transition-colors\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n Refresh\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards Grid (2x3) */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n label=\"Total Applications\"\r\n value={stats?.totalApplications || 0}\r\n icon={<BarChart3 className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n label=\"Active Applications\"\r\n value={stats?.activeApplications || 0}\r\n icon={<Activity className=\"h-5 w-5\" />}\r\n color=\"green\"\r\n />\r\n <KpiCard\r\n label=\"Total Users\"\r\n value={stats?.totalUsers || 0}\r\n icon={<Users className=\"h-5 w-5\" />}\r\n color=\"purple\"\r\n />\r\n <KpiCard\r\n label=\"Active Today\"\r\n value={stats?.activeUsersToday || 0}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color=\"orange\"\r\n />\r\n <KpiCard\r\n label=\"Avg Session\"\r\n value={formatDuration(stats?.avgSessionDuration || 0)}\r\n icon={<Clock className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n subtitle={`${period} days`}\r\n />\r\n <KpiCard\r\n label=\"Growth Rate\"\r\n value={`${stats?.growthRate.toFixed(1) || 0}%`}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color={(stats?.growthRate ?? 0) >= 0 ? 'green' : 'red'}\r\n subtitle=\"vs previous period\"\r\n />\r\n </div>\r\n\r\n {/* Two Column: Hierarchy Drill-Down + Top Applications */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Hierarchy Drill-Down Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <PieChart className=\"h-5 w-5 text-[var(--color-primary-600)]\" />\r\n {chartMode === 'access' ? 'Activité' : 'Temps passé'} par Hiérarchie\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Cliquez pour explorer)\r\n </span>\r\n </h3>\r\n <HierarchyDrillDownChart key={`hierarchy-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Application Activity Pie Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Activity className=\"h-5 w-5 text-green-600\" />\r\n Top Applications\r\n </h3>\r\n {stats?.mostPopularApps && stats.mostPopularApps.length > 0 ? (\r\n <ApplicationActivityPieChart data={stats.mostPopularApps} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Usage Trends Chart - Full Width with Application breakdown */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <TrendingUp className=\"h-5 w-5\" />\r\n Tendance {chartMode === 'access' ? \"d'utilisation\" : 'du temps passé'} par Application ({period} jours)\r\n </h3>\r\n <UsageTrendChart key={`trends-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Module Popularity - Full Width */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Layers className=\"h-5 w-5 text-purple-600\" />\r\n Modules les plus {chartMode === 'access' ? 'populaires' : 'utilisés'}\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Context › Application › Module)\r\n </span>\r\n </h3>\r\n {(topModules?.length ?? 0) > 0 ? (\r\n <ModulePopularityChart data={topModules} mode={chartMode} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée de module disponible\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Call to action */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-gradient-to-r from-[var(--color-primary-600)]/10 to-[var(--color-accent-500)]/10 p-6\">\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"font-bold text-[var(--text-primary)]\">Explorer toutes les Applications</h3>\r\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">\r\n Voir les analyses détaillées pour chaque application et gérer les permissions\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/applications/list')}\r\n className=\"whitespace-nowrap rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-4 py-2 font-medium text-white transition-all hover:shadow-md\"\r\n >\r\n Voir les Applications\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["DEFAULT_COLORS","UsageTrendChart","period","mode","data","setData","useState","loading","setLoading","error","setError","useEffect","result","applicationAnalyticsApi","err","jsx","Loader2","chartData","day","entry","app","getColor","index","jsxs","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","value","Line","moduleColors","ModulePopularityChart","getValue","module","valueLabel","maxCount","m","formatDuration","seconds","minutes","remainingSeconds","percentage","Users","Clock","COLORS","renderActiveShape","props","cx","cy","midAngle","innerRadius","outerRadius","startAngle","endAngle","fill","payload","percent","RADIAN","sin","cos","sx","sy","mx","my","ex","ey","textAnchor","Sector","ApplicationActivityPieChart","activeIndex","setActiveIndex","totalAccess","sum","onPieEnter","_","PieChart","Pie","Cell","item","LEVEL_LABELS","LEVEL_COLORS","createRenderActiveShape","HierarchyDrillDownChart","currentLevel","setCurrentLevel","applicationId","setApplicationId","loadData","useCallback","handleSliceClick","handleBack","Home","React","ChevronRight","ArrowLeft","KpiCard","label","icon","color","subtitle","ApplicationsDashboardPage","navigate","useNavigate","t","useTranslation","currentTenant","useTenant","stats","setStats","topModules","setTopModules","refreshing","setRefreshing","setPeriod","chartMode","setChartMode","dashboardRes","modulesRes","handleRefresh","AlertTriangle","RefreshCw","Breadcrumb","BarChart3","Activity","e","TrendingUp","Layers"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsDashboardPage-CclKc0wI.js","sources":["../../src/components/dashboard/UsageTrendChart.tsx","../../src/components/dashboard/ModulePopularityChart.tsx","../../src/components/dashboard/ApplicationActivityPieChart.tsx","../../src/components/dashboard/HierarchyDrillDownChart.tsx","../../src/pages/platform/administration/applications/ApplicationsDashboardPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport {\r\n LineChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer\r\n} from 'recharts';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ApplicationTrendsDto, ApplicationSeriesDto } from '@/services/api/applicationAnalyticsApi';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\nexport type ChartMode = 'access' | 'duration';\r\n\r\ninterface UsageTrendChartProps {\r\n readonly period?: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst DEFAULT_COLORS = [\r\n '#3b82f6', // blue\r\n '#22c55e', // green\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#06b6d4', // cyan\r\n '#ec4899', // pink\r\n];\r\n\r\nexport const UsageTrendChart: React.FC<UsageTrendChartProps> = ({ period = 30, mode = 'access' }) => {\r\n const [data, setData] = useState<ApplicationTrendsDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const result = await applicationAnalyticsApi.getTrendsByApplication(period);\r\n setData(result);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load trends');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [period]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px]\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n {error || 'Aucune donnée disponible'}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.dailyData?.length || !data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n Aucune donnée de tendance disponible\r\n </div>\r\n );\r\n }\r\n\r\n // Transform data for Recharts based on mode\r\n const chartData = data.dailyData.map((day) => {\r\n const entry: Record<string, string | number> = {\r\n date: new Date(day.date).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: 'short'\r\n })\r\n };\r\n // Add each application's value based on mode\r\n data.applications.forEach((app) => {\r\n if (mode === 'access') {\r\n entry[app.name] = day.applicationCounts[app.name] || 0;\r\n } else {\r\n entry[app.name] = day.applicationDurations?.[app.name] || 0;\r\n }\r\n });\r\n return entry;\r\n });\r\n\r\n const getColor = (app: ApplicationSeriesDto, index: number): string => {\r\n return app.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Chart */}\r\n <div style={{ width: '100%', height: 300 }}>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart\r\n data={chartData}\r\n margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n >\r\n <CartesianGrid\r\n strokeDasharray=\"3 3\"\r\n stroke=\"var(--border-color)\"\r\n />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n label={{\r\n value: mode === 'access' ? 'Accès' : 'Minutes',\r\n angle: -90,\r\n position: 'insideLeft',\r\n style: { fill: 'var(--text-secondary)', fontSize: '11px' }\r\n }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)'\r\n }}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 'bold', marginBottom: '8px' }}\r\n itemStyle={{ color: 'var(--text-secondary)' }}\r\n />\r\n <Legend\r\n wrapperStyle={{\r\n paddingTop: '20px'\r\n }}\r\n formatter={(value) => (\r\n <span style={{ color: 'var(--text-secondary)', fontSize: '12px' }}>{value}</span>\r\n )}\r\n />\r\n {data.applications.map((app, index) => (\r\n <Line\r\n key={app.name}\r\n type=\"monotone\"\r\n dataKey={app.name}\r\n stroke={getColor(app, index)}\r\n strokeWidth={2}\r\n dot={{ r: 2, fill: getColor(app, index) }}\r\n activeDot={{ r: 5, fill: getColor(app, index) }}\r\n />\r\n ))}\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend with totals */}\r\n <div className=\"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4\">\r\n {data.applications.map((app, index) => (\r\n <div key={app.name} className=\"flex items-center gap-2\">\r\n <div\r\n className=\"w-3 h-3 rounded-full\"\r\n style={{ backgroundColor: getColor(app, index) }}\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{app.name}</span>\r\n <span className=\"text-sm font-semibold\" style={{ color: getColor(app, index) }}>\r\n {mode === 'access' ? app.totalAccess : `${app.totalDurationMinutes} min`}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Users, Clock } from 'lucide-react';\r\nimport type { ModuleAnalyticsDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface ModulePopularityChartProps {\r\n readonly data: ModuleAnalyticsDto[];\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst moduleColors = [\r\n '#3b82f6',\r\n '#8b5cf6',\r\n '#22c55e',\r\n '#f59e0b',\r\n '#ef4444',\r\n '#06b6d4',\r\n '#ec4899',\r\n '#10b981',\r\n '#f97316',\r\n '#6366f1'\r\n];\r\n\r\nexport const ModulePopularityChart: React.FC<ModulePopularityChartProps> = ({ data, mode = 'access' }) => {\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n No module data available\r\n </div>\r\n );\r\n }\r\n\r\n const getValue = (module: ModuleAnalyticsDto) =>\r\n mode === 'access' ? module.accessCount : module.totalDurationMinutes;\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n\r\n const maxCount = Math.max(...data.map(m => getValue(m)), 1);\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n const remainingSeconds = seconds % 60;\r\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {data.map((module, index) => {\r\n const value = getValue(module);\r\n const percentage = (value / maxCount) * 100;\r\n\r\n return (\r\n <div\r\n key={module.moduleId}\r\n className=\"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4\"\r\n style={{ borderLeftColor: moduleColors[index % moduleColors.length] }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className=\"flex-1\">\r\n {/* Full hierarchy path */}\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1 font-mono\">\r\n <span className=\"text-blue-500\">platform</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-green-500\">{module.applicationName}</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-purple-500\">{module.moduleName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <h5 className=\"font-semibold text-[var(--text-primary)]\">\r\n {module.moduleName}\r\n </h5>\r\n </div>\r\n </div>\r\n <div className=\"text-right\">\r\n <div className=\"text-xl font-bold\" style={{ color: moduleColors[index % moduleColors.length] }}>\r\n {value.toLocaleString()}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{valueLabel}</div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: moduleColors[index % moduleColors.length]\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 text-xs text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n <span>{module.uniqueUsers} utilisateurs uniques</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n <span>Moy: {formatDuration(module.avgDuration)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport type { PopularApplicationDto } from '@/services/api/applicationAnalyticsApi';\r\n\r\ninterface ApplicationActivityPieChartProps {\r\n readonly data: PopularApplicationDto[];\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst renderActiveShape = (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: { applicationName: string; accessCount: number };\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.applicationName}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} accès\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text x={ex + (cos >= 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill=\"var(--text-primary)\" style={{ fontSize: '12px' }}>\r\n {`${(percent * 100).toFixed(0)}%`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const ApplicationActivityPieChart: React.FC<ApplicationActivityPieChartProps> = ({ data }) => {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n );\r\n }\r\n\r\n const totalAccess = data.reduce((sum, app) => sum + app.accessCount, 0);\r\n\r\n const chartData = data.map((app, index) => ({\r\n ...app,\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n fill: COLORS[index % COLORS.length]\r\n }));\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n {/* Spacer row to match breadcrumb height in hierarchy chart */}\r\n <div className=\"flex items-center gap-2 text-sm h-[34px]\">\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n Vue globale des applications actives\r\n </span>\r\n </div>\r\n\r\n {/* Summary stats - at top to match hierarchy chart */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className=\"text-lg font-semibold text-green-600\">\r\n Applications\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.length} actives • {totalAccess.toLocaleString()} accès total)\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart - same height as hierarchy */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter\r\n } as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.name} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n {/* Tooltip disabled - activeShape already displays all info in center */}\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend - same style as hierarchy chart */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <div\r\n key={item.applicationId}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer ${\r\n activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''\r\n }`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.applicationName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.accessCount.toLocaleString()} accès\r\n </p>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport { ChevronRight, Home, Loader2, ArrowLeft } from 'lucide-react';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { HierarchyDrillDownDto, HierarchyItemDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface HierarchyDrillDownChartProps {\r\n readonly period: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst LEVEL_LABELS = ['Application', 'Module'];\r\nconst LEVEL_COLORS = ['text-blue-500', 'text-green-500'];\r\n\r\ninterface ChartDataItem extends HierarchyItemDto {\r\n value: number;\r\n fill: string;\r\n valueLabel: string;\r\n}\r\n\r\nconst createRenderActiveShape = (valueLabel: string) => (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: ChartDataItem;\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.name}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} {valueLabel}\r\n </text>\r\n <text x={cx} y={cy} dy={28} textAnchor=\"middle\" fill=\"var(--text-tertiary)\" style={{ fontSize: '11px' }}>\r\n {payload.hasChildren ? 'Cliquez pour explorer' : ''}\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-primary)\"\r\n style={{ fontSize: '12px' }}\r\n >\r\n {`${(percent * 100).toFixed(1)}%`}\r\n </text>\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n dy={14}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-secondary)\"\r\n style={{ fontSize: '10px' }}\r\n >\r\n {`${payload.uniqueUsers} utilisateurs`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const HierarchyDrillDownChart: React.FC<HierarchyDrillDownChartProps> = ({ period, mode = 'access' }) => {\r\n const [data, setData] = useState<HierarchyDrillDownDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const [currentLevel, setCurrentLevel] = useState(0);\r\n const [applicationId, setApplicationId] = useState<string | undefined>();\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const result = await applicationAnalyticsApi.getHierarchyData(\r\n currentLevel,\r\n applicationId,\r\n period\r\n );\r\n setData(result);\r\n setActiveIndex(0);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load data');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [currentLevel, applicationId, period]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSliceClick = (item: HierarchyItemDto) => {\r\n if (!item.hasChildren) return;\r\n\r\n if (currentLevel === 0) {\r\n setApplicationId(item.id);\r\n setCurrentLevel(1);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if (currentLevel === 1) {\r\n setApplicationId(undefined);\r\n setCurrentLevel(0);\r\n }\r\n };\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[400px]\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"text-center py-8 text-red-500\">\r\n {error}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.items?.length) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée disponible pour ce niveau\r\n </div>\r\n );\r\n }\r\n\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n const chartData: ChartDataItem[] = data.items.map((item, index) => ({\r\n ...item,\r\n value: mode === 'access' ? item.accessCount : item.totalDurationMinutes,\r\n fill: COLORS[index % COLORS.length],\r\n valueLabel\r\n }));\r\n\r\n const renderActiveShape = createRenderActiveShape(valueLabel);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Breadcrumb Navigation */}\r\n <div className=\"flex items-center gap-2 text-sm flex-wrap\">\r\n <button\r\n onClick={() => { setCurrentLevel(0); setApplicationId(undefined); }}\r\n className={`flex items-center gap-1 px-2 py-1 rounded hover:bg-[var(--bg-secondary)] transition-colors ${\r\n currentLevel === 0 ? 'font-semibold text-blue-600' : 'text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Home className=\"h-4 w-4\" />\r\n <span>Applications</span>\r\n </button>\r\n\r\n {data.breadcrumb.map((item) => (\r\n <React.Fragment key={item.id}>\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className={`px-2 py-1 font-semibold ${LEVEL_COLORS[1]}`}>\r\n {item.name}\r\n </span>\r\n </React.Fragment>\r\n ))}\r\n\r\n {currentLevel > 0 && (\r\n <button\r\n onClick={handleBack}\r\n className=\"ml-auto flex items-center gap-1 px-3 py-1 rounded-lg bg-[var(--bg-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors text-[var(--text-secondary)]\"\r\n >\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n Retour\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Level indicator */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className={`text-lg font-semibold ${LEVEL_COLORS[currentLevel]}`}>\r\n {LEVEL_LABELS[currentLevel]}s\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.items.length} éléments • {mode === 'access'\r\n ? `${data.totalAccess.toLocaleString()} accès total`\r\n : `${data.totalDurationMinutes.toLocaleString()} min total`})\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter,\r\n onClick: (_: unknown, index: number) => handleSliceClick(chartData[index]),\r\n style: { cursor: chartData[activeIndex]?.hasChildren ? 'pointer' : 'default' }\r\n } as unknown as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.id} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend / List */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <button\r\n key={item.id}\r\n onClick={() => item.hasChildren && handleSliceClick(item)}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors text-left ${\r\n item.hasChildren ? 'cursor-pointer' : 'cursor-default'\r\n } ${activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.name}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.value.toLocaleString()} {valueLabel}\r\n </p>\r\n </div>\r\n {item.hasChildren && (\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AlertTriangle,\r\n BarChart3,\r\n Users,\r\n Activity,\r\n TrendingUp,\r\n Loader2,\r\n RefreshCw,\r\n Clock,\r\n Layers,\r\n PieChart\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type {\r\n ApplicationDashboardStatsDto,\r\n ModuleAnalyticsDto\r\n} from '@/services/api/applicationAnalyticsApi';\r\nimport { UsageTrendChart, type ChartMode } from '@/components/dashboard/UsageTrendChart';\r\nimport { ModulePopularityChart } from '@/components/dashboard/ModulePopularityChart';\r\nimport { ApplicationActivityPieChart } from '@/components/dashboard/ApplicationActivityPieChart';\r\nimport { HierarchyDrillDownChart } from '@/components/dashboard/HierarchyDrillDownChart';\r\n\r\nconst KpiCard: React.FC<{\r\n label: string;\r\n value: number | string;\r\n icon: React.ReactNode;\r\n color: 'blue' | 'green' | 'purple' | 'orange' | 'yellow' | 'red';\r\n subtitle?: string;\r\n}> = ({ label, value, icon, color, subtitle }) => {\r\n const iconColors = {\r\n blue: 'text-blue-500',\r\n green: 'text-green-500',\r\n purple: 'text-purple-500',\r\n orange: 'text-orange-500',\r\n yellow: 'text-yellow-500',\r\n red: 'text-red-500'\r\n };\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">{label}</span>\r\n <div className={iconColors[color]}>{icon}</div>\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{typeof value === 'number' ? value.toLocaleString() : value}</div>\r\n {subtitle && <div className=\"text-xs text-[var(--text-tertiary)] mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport const ApplicationsDashboardPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant } = useTenant();\r\n const [stats, setStats] = useState<ApplicationDashboardStatsDto | null>(null);\r\n const [topModules, setTopModules] = useState<ModuleAnalyticsDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [chartMode, setChartMode] = useState<ChartMode>('access');\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const [dashboardRes, modulesRes] = await Promise.all([\r\n applicationAnalyticsApi.getDashboardStats(),\r\n applicationAnalyticsApi.getTopModules(5, period)\r\n ]);\r\n\r\n setStats(dashboardRes);\r\n setTopModules(modulesRes);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, currentTenant?.id]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n return `${minutes}m`;\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-[var(--error-text)] font-medium\">{error}</p>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"text-[var(--error-text)] hover:opacity-80\"\r\n >\r\n <RefreshCw className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('dashboard.title', 'Dashboard') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <BarChart3 className=\"h-6 w-6\" />\r\n Tableau de bord Applications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n Analyse d'utilisation par Context › Application › Module\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n {/* Mode Toggle - Global */}\r\n <div className=\"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1\">\r\n <button\r\n onClick={() => setChartMode('access')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'access'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Activity className=\"w-3.5 h-3.5\" />\r\n Accès\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setChartMode('duration')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'duration'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Clock className=\"w-3.5 h-3.5\" />\r\n Temps\r\n </span>\r\n </button>\r\n </div>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value={7}>7 days</option>\r\n <option value={30}>30 days</option>\r\n <option value={90}>90 days</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"rounded-[var(--radius-button)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] flex items-center gap-2 transition-colors\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n Refresh\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards Grid (2x3) */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n label=\"Total Applications\"\r\n value={stats?.totalApplications || 0}\r\n icon={<BarChart3 className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n label=\"Active Applications\"\r\n value={stats?.activeApplications || 0}\r\n icon={<Activity className=\"h-5 w-5\" />}\r\n color=\"green\"\r\n />\r\n <KpiCard\r\n label=\"Total Users\"\r\n value={stats?.totalUsers || 0}\r\n icon={<Users className=\"h-5 w-5\" />}\r\n color=\"purple\"\r\n />\r\n <KpiCard\r\n label=\"Active Today\"\r\n value={stats?.activeUsersToday || 0}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color=\"orange\"\r\n />\r\n <KpiCard\r\n label=\"Avg Session\"\r\n value={formatDuration(stats?.avgSessionDuration || 0)}\r\n icon={<Clock className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n subtitle={`${period} days`}\r\n />\r\n <KpiCard\r\n label=\"Growth Rate\"\r\n value={`${stats?.growthRate.toFixed(1) || 0}%`}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color={(stats?.growthRate ?? 0) >= 0 ? 'green' : 'red'}\r\n subtitle=\"vs previous period\"\r\n />\r\n </div>\r\n\r\n {/* Two Column: Hierarchy Drill-Down + Top Applications */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Hierarchy Drill-Down Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <PieChart className=\"h-5 w-5 text-[var(--color-primary-600)]\" />\r\n {chartMode === 'access' ? 'Activité' : 'Temps passé'} par Hiérarchie\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Cliquez pour explorer)\r\n </span>\r\n </h3>\r\n <HierarchyDrillDownChart key={`hierarchy-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Application Activity Pie Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Activity className=\"h-5 w-5 text-green-600\" />\r\n Top Applications\r\n </h3>\r\n {stats?.mostPopularApps && stats.mostPopularApps.length > 0 ? (\r\n <ApplicationActivityPieChart data={stats.mostPopularApps} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Usage Trends Chart - Full Width with Application breakdown */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <TrendingUp className=\"h-5 w-5\" />\r\n Tendance {chartMode === 'access' ? \"d'utilisation\" : 'du temps passé'} par Application ({period} jours)\r\n </h3>\r\n <UsageTrendChart key={`trends-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Module Popularity - Full Width */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Layers className=\"h-5 w-5 text-purple-600\" />\r\n Modules les plus {chartMode === 'access' ? 'populaires' : 'utilisés'}\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Context › Application › Module)\r\n </span>\r\n </h3>\r\n {(topModules?.length ?? 0) > 0 ? (\r\n <ModulePopularityChart data={topModules} mode={chartMode} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée de module disponible\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Call to action */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-gradient-to-r from-[var(--color-primary-600)]/10 to-[var(--color-accent-500)]/10 p-6\">\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"font-bold text-[var(--text-primary)]\">Explorer toutes les Applications</h3>\r\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">\r\n Voir les analyses détaillées pour chaque application et gérer les permissions\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/applications/list')}\r\n className=\"whitespace-nowrap rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-4 py-2 font-medium text-white transition-all hover:shadow-md\"\r\n >\r\n Voir les Applications\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["DEFAULT_COLORS","UsageTrendChart","period","mode","data","setData","useState","loading","setLoading","error","setError","useEffect","result","applicationAnalyticsApi","err","jsx","Loader2","chartData","day","entry","app","getColor","index","jsxs","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","value","Line","moduleColors","ModulePopularityChart","getValue","module","valueLabel","maxCount","m","formatDuration","seconds","minutes","remainingSeconds","percentage","Users","Clock","COLORS","renderActiveShape","props","cx","cy","midAngle","innerRadius","outerRadius","startAngle","endAngle","fill","payload","percent","RADIAN","sin","cos","sx","sy","mx","my","ex","ey","textAnchor","Sector","ApplicationActivityPieChart","activeIndex","setActiveIndex","totalAccess","sum","onPieEnter","_","PieChart","Pie","Cell","item","LEVEL_LABELS","LEVEL_COLORS","createRenderActiveShape","HierarchyDrillDownChart","currentLevel","setCurrentLevel","applicationId","setApplicationId","loadData","useCallback","handleSliceClick","handleBack","Home","React","ChevronRight","ArrowLeft","KpiCard","label","icon","color","subtitle","ApplicationsDashboardPage","navigate","useNavigate","t","useTranslation","currentTenant","useTenant","stats","setStats","topModules","setTopModules","refreshing","setRefreshing","setPeriod","chartMode","setChartMode","dashboardRes","modulesRes","handleRefresh","AlertTriangle","RefreshCw","Breadcrumb","BarChart3","Activity","e","TrendingUp","Layers"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),m=require("react"),P=require("react-router-dom"),q=require("react-i18next"),o=require("lucide-react"),k=require("./index-vXiLh35n.js"),$=require("./applicationAnalyticsApi-D62lc6z4.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-DHmnjk2O.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-DK5czlkn.js"),$=require("./applicationAnalyticsApi-BwcSE_H1.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-CxWmOc1x.js.map