@atlashub/smartstack 3.29.0 → 3.30.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.
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CVq3qZoe.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CVq3qZoe.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DJb49NMA.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DJb49NMA.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-D_nk3gKj.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-D_nk3gKj.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-oHEi-sFh.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-oHEi-sFh.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-Cr0q2HnB.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-Cr0q2HnB.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-DX8buBkV.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-DX8buBkV.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-DN7sazvI.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-DN7sazvI.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-DqboIzZE.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-DqboIzZE.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage--9YwwS5A.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage--9YwwS5A.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-CCNjr64K.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-CCNjr64K.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-BSsHN3Yj.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-BSsHN3Yj.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-Bs-Xgca4.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-Bs-Xgca4.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-DDysNWJ5.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-s1WEzOXS.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-B3CSMiV0.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-B3CSMiV0.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-B6ZCecIl.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-B6ZCecIl.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-BBaiBM--.js} +2 -2
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-BBaiBM--.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-ztPwoAGt.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-ztPwoAGt.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-CK4L4rBO.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-CK4L4rBO.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-DFSVFFXr.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-DFSVFFXr.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-Bp7oQD7Q.js} +2 -2
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-Bp7oQD7Q.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-JCLpyg94.js} +2 -2
- package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-JCLpyg94.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-Bl9xlJ3h.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-Bl9xlJ3h.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-CzMHz4jy.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-CzMHz4jy.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-D_8T1vqV.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-D_8T1vqV.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-M7mJgXvn.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-M7mJgXvn.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-BNEGavlu.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-BNEGavlu.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-C2X2mfds.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-C2X2mfds.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-4oy2YqvT.js} +2 -2
- package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-4oy2YqvT.js.map} +1 -1
- package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CO-8B8EI.js} +3 -3
- package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CO-8B8EI.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-CPArUG-S.js} +2 -2
- package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-CPArUG-S.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-D5MRMxEV.js} +3 -3
- package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-D5MRMxEV.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-CwdnfJbJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-CwdnfJbJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-DnjLFXnL.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-DnjLFXnL.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-ZEIfyqwE.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-ZEIfyqwE.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-sh-3h_H9.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-sh-3h_H9.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-B4M6-xeM.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-B4M6-xeM.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-MIu-U7p0.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-MIu-U7p0.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-4XK3Bs_r.js} +5 -5
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-4XK3Bs_r.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-C-kvtd2T.js} +2 -2
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-C-kvtd2T.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-CP41FzHi.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-CP41FzHi.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-DzrXTrVi.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-DzrXTrVi.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CZRkMbh8.js} +2 -2
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CZRkMbh8.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-V_SwYio2.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-V_SwYio2.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DOUhaLal.js} +2 -2
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DOUhaLal.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-DnvAIeyr.js} +2 -2
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-DnvAIeyr.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DXvpLsbt.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DXvpLsbt.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-DfTa4jCG.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-DfTa4jCG.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D76MdAs-.js} +2 -2
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D76MdAs-.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-I1yCk7tk.js} +2 -2
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-I1yCk7tk.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-BRUzcl1A.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-BRUzcl1A.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-DtWUPCh3.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-DtWUPCh3.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-CUNKbl7t.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-CUNKbl7t.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-DJJGbXoX.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-DJJGbXoX.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-B8wmawPV.js} +2 -2
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-B8wmawPV.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-Dbjcctuh.js} +2 -2
- package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-Dbjcctuh.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BeNfBZmb.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BeNfBZmb.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-zii0ll57.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-zii0ll57.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-BCpuIGzv.js} +2 -2
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-BCpuIGzv.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-BmvrBaAD.js} +2 -2
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-BmvrBaAD.js.map} +1 -1
- package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-eowQd59_.js} +2 -2
- package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-eowQd59_.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-mf5wI0-n.js} +2 -2
- package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-mf5wI0-n.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-8UPgkVE8.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-8UPgkVE8.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-CLsaUNqA.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-CLsaUNqA.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-57X-ILDb.js} +2 -2
- package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-57X-ILDb.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-CNyHSbqs.js} +2 -2
- package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-CNyHSbqs.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-CyV8l-Zo.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-CyV8l-Zo.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-JW8-mh_k.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-JW8-mh_k.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-CjwE73NX.js} +2 -2
- package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-CjwE73NX.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-wddG59kg.js} +2 -2
- package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-wddG59kg.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CrioVHFI.js} +3 -3
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CrioVHFI.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TUOGR1ow.js} +2 -2
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TUOGR1ow.js.map} +1 -1
- package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-CAcols3D.js} +2 -2
- package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-CAcols3D.js.map} +1 -1
- package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-sJBWaNff.js} +2 -2
- package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-sJBWaNff.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-BPGRloOS.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-BPGRloOS.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-D5TRn7Ir.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-D5TRn7Ir.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-Dc2bWTzG.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-Dc2bWTzG.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-UXmYLrIq.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-UXmYLrIq.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-dmPlqqiD.js} +2 -2
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-dmPlqqiD.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-nTY85sNA.js} +2 -2
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-nTY85sNA.js.map} +1 -1
- package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-BUXfstRZ.js} +2 -2
- package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-BUXfstRZ.js.map} +1 -1
- package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BhT-31ls.js} +2 -2
- package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BhT-31ls.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-3_mzBLNI.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-3_mzBLNI.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-B-SRDR2R.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-B-SRDR2R.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-B4cR3rOC.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-B4cR3rOC.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-xN3wPnFL.js} +2 -2
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-xN3wPnFL.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-CkHgXSxU.js} +2 -2
- package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-CkHgXSxU.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-Dwi2xpMI.js} +2 -2
- package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-Dwi2xpMI.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-D2a3EOey.js} +3 -3
- package/dist/chunks/UserCreateTicketPage-D2a3EOey.js.map +1 -0
- package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-bcbSLglE.js} +48 -48
- package/dist/chunks/UserCreateTicketPage-bcbSLglE.js.map +1 -0
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-DwnDRNoW.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-DwnDRNoW.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-ZMsx8LWw.js} +2 -2
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-ZMsx8LWw.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-BRFowOFL.js} +2 -2
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-BRFowOFL.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-CZyV-zsg.js} +5 -5
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-CZyV-zsg.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-BstGk_BP.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-BstGk_BP.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-DzB_pELt.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-DzB_pELt.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-BygTv_kK.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-BygTv_kK.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-DTmhzttW.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-DTmhzttW.js.map} +1 -1
- package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-DcwLyMAX.js} +2 -2
- package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-DcwLyMAX.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-TIqSHgHj.js} +2 -2
- package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-TIqSHgHj.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-3FjMFbpa.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-3FjMFbpa.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-B6dsJzvH.js} +2 -2
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-B6dsJzvH.js.map} +1 -1
- package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-9G4wG_mT.js} +2 -2
- package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-9G4wG_mT.js.map} +1 -1
- package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-DXOdsoxr.js} +2 -2
- package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-DXOdsoxr.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-D0DEp9Y-.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-D0DEp9Y-.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-DhOd6idI.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-DhOd6idI.js.map} +1 -1
- package/dist/chunks/auth-Ca2Rn6on.js +2 -0
- package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
- package/dist/chunks/auth-ClNTDOqm.js +18 -0
- package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
- package/dist/chunks/auth-DECnMZjF.js +18 -0
- package/dist/chunks/auth-DECnMZjF.js.map +1 -0
- package/dist/chunks/auth-DPvxdqy4.js +18 -0
- package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
- package/dist/chunks/auth-HzvnTaOm.js +2 -0
- package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
- package/dist/chunks/auth-M6aNTKCH.js +2 -0
- package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
- package/dist/chunks/auth-UHnAu6_e.js +2 -0
- package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
- package/dist/chunks/auth-YrujJY7m.js +18 -0
- package/dist/chunks/auth-YrujJY7m.js.map +1 -0
- package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-Db8G2lLs.js} +2 -2
- package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-Db8G2lLs.js.map} +1 -1
- package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-lbxNsHFv.js} +2 -2
- package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-lbxNsHFv.js.map} +1 -1
- package/dist/chunks/{index-IJR_91Yt.js → index-BI2dc1FS.js} +2 -2
- package/dist/chunks/{index-IJR_91Yt.js.map → index-BI2dc1FS.js.map} +1 -1
- package/dist/chunks/{index-DIQ6Jmmq.js → index-Bn8HzILk.js} +4 -4
- package/dist/chunks/{index-DIQ6Jmmq.js.map → index-Bn8HzILk.js.map} +1 -1
- package/dist/chunks/{index-DA5VyW0k.js → index-CN2WRyg1.js} +2249 -2264
- package/dist/chunks/index-CN2WRyg1.js.map +1 -0
- package/dist/chunks/{index-Br2wsGE8.js → index-CTGSmYvs.js} +2 -2
- package/dist/chunks/{index-Br2wsGE8.js.map → index-CTGSmYvs.js.map} +1 -1
- package/dist/chunks/index-CUICSveU.js +2 -0
- package/dist/chunks/index-CUICSveU.js.map +1 -0
- package/dist/chunks/{index-S-X8qFYW.js → index-CgtbaFf5.js} +2 -2
- package/dist/chunks/{index-S-X8qFYW.js.map → index-CgtbaFf5.js.map} +1 -1
- package/dist/chunks/{index-_g82N2nb.js → index-D0HS542b.js} +2 -2
- package/dist/chunks/{index-_g82N2nb.js.map → index-D0HS542b.js.map} +1 -1
- package/dist/chunks/{index-BIqcvvbh.js → index-DEtq-xUL.js} +9 -8
- package/dist/chunks/index-DEtq-xUL.js.map +1 -0
- package/dist/chunks/{index-BOKR3bw6.js → index-DF93KQFR.js} +2 -2
- package/dist/chunks/{index-BOKR3bw6.js.map → index-DF93KQFR.js.map} +1 -1
- package/dist/chunks/{index-CxgEV-rT.js → index-DLekpNSE.js} +2 -2
- package/dist/chunks/{index-CxgEV-rT.js.map → index-DLekpNSE.js.map} +1 -1
- package/dist/chunks/{index-DEOBhXS_.js → index-DUS-tunb.js} +2 -2
- package/dist/chunks/{index-DEOBhXS_.js.map → index-DUS-tunb.js.map} +1 -1
- package/dist/chunks/{index-BMsjMCv9.js → index-DjC1u2hI.js} +3 -3
- package/dist/chunks/{index-BMsjMCv9.js.map → index-DjC1u2hI.js.map} +1 -1
- package/dist/chunks/{index-BxHVPJ-j.js → index-DqbVFB1H.js} +2 -2
- package/dist/chunks/{index-BxHVPJ-j.js.map → index-DqbVFB1H.js.map} +1 -1
- package/dist/chunks/{index-Djy4eIbB.js → index-DwqLhQ8S.js} +2 -2
- package/dist/chunks/{index-Djy4eIbB.js.map → index-DwqLhQ8S.js.map} +1 -1
- package/dist/chunks/{index-C1w97Ejz.js → index-HsAOBno4.js} +2 -2
- package/dist/chunks/{index-C1w97Ejz.js.map → index-HsAOBno4.js.map} +1 -1
- package/dist/chunks/{index-Czk12A3G.js → index-TiWOcC0g.js} +2 -2
- package/dist/chunks/{index-Czk12A3G.js.map → index-TiWOcC0g.js.map} +1 -1
- package/dist/chunks/{index-vXiLh35n.js → index-cAikSVW0.js} +13 -13
- package/dist/chunks/index-cAikSVW0.js.map +1 -0
- package/dist/chunks/{index-CNxx56kE.js → index-xhRXN1Jq.js} +2 -2
- package/dist/chunks/{index-CNxx56kE.js.map → index-xhRXN1Jq.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-CHeS7oLt.js} +2 -2
- package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-CHeS7oLt.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-__FKj6CN.js} +2 -2
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-__FKj6CN.js.map} +1 -1
- package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Cj239hYB.js} +2 -2
- package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Cj239hYB.js.map} +1 -1
- package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-DF4RwD_6.js} +2 -2
- package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-DF4RwD_6.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-CFam8zFR.js} +3 -3
- package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-CFam8zFR.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-CViOUwyF.js} +2 -2
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-CViOUwyF.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-B-Cs6NX1.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-B-Cs6NX1.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-CslSQeBJ.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-CslSQeBJ.js.map} +1 -1
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/pages/LoginPage.d.ts.map +1 -1
- package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
- package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
- package/dist/services/api/apiClient.d.ts.map +1 -1
- package/dist/services/support/ticketDraftService.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +6 -6
- package/dist/utils/permissions.generated.d.ts +288 -0
- package/dist/utils/permissions.generated.d.ts.map +1 -0
- package/dist/utils/uuid.d.ts +6 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
- package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
- package/dist/chunks/auth-B-hELPDB.js +0 -2
- package/dist/chunks/auth-B-hELPDB.js.map +0 -1
- package/dist/chunks/auth-BYaMuq7D.js +0 -16
- package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
- package/dist/chunks/auth-C5zpZ9k7.js +0 -2
- package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
- package/dist/chunks/auth-CDpRMVv1.js +0 -16
- package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
- package/dist/chunks/auth-CyPkCta2.js +0 -2
- package/dist/chunks/auth-CyPkCta2.js.map +0 -1
- package/dist/chunks/auth-DL47kvnl.js +0 -2
- package/dist/chunks/auth-DL47kvnl.js.map +0 -1
- package/dist/chunks/auth-Diiv90i1.js +0 -16
- package/dist/chunks/auth-Diiv90i1.js.map +0 -1
- package/dist/chunks/auth-rog9MvUr.js +0 -16
- package/dist/chunks/auth-rog9MvUr.js.map +0 -1
- package/dist/chunks/index-BIqcvvbh.js.map +0 -1
- package/dist/chunks/index-DA5VyW0k.js.map +0 -1
- package/dist/chunks/index-Dht6EQW1.js +0 -2
- package/dist/chunks/index-Dht6EQW1.js.map +0 -1
- package/dist/chunks/index-vXiLh35n.js.map +0 -1
|
@@ -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-Bs-Xgca4.js","sources":["../../src/components/dashboard/UsageTrendChart.tsx","../../src/components/dashboard/ModulePopularityChart.tsx","../../src/components/dashboard/ApplicationActivityPieChart.tsx","../../src/components/dashboard/HierarchyDrillDownChart.tsx","../../src/pages/platform/administration/applications/ApplicationsDashboardPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport {\r\n LineChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer\r\n} from 'recharts';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ApplicationTrendsDto, ApplicationSeriesDto } from '@/services/api/applicationAnalyticsApi';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\nexport type ChartMode = 'access' | 'duration';\r\n\r\ninterface UsageTrendChartProps {\r\n readonly period?: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst DEFAULT_COLORS = [\r\n '#3b82f6', // blue\r\n '#22c55e', // green\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#06b6d4', // cyan\r\n '#ec4899', // pink\r\n];\r\n\r\nexport const UsageTrendChart: React.FC<UsageTrendChartProps> = ({ period = 30, mode = 'access' }) => {\r\n const [data, setData] = useState<ApplicationTrendsDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const result = await applicationAnalyticsApi.getTrendsByApplication(period);\r\n setData(result);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load trends');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [period]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px]\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n {error || 'Aucune donnée disponible'}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.dailyData?.length || !data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n Aucune donnée de tendance disponible\r\n </div>\r\n );\r\n }\r\n\r\n // Transform data for Recharts based on mode\r\n const chartData = data.dailyData.map((day) => {\r\n const entry: Record<string, string | number> = {\r\n date: new Date(day.date).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: 'short'\r\n })\r\n };\r\n // Add each application's value based on mode\r\n data.applications.forEach((app) => {\r\n if (mode === 'access') {\r\n entry[app.name] = day.applicationCounts[app.name] || 0;\r\n } else {\r\n entry[app.name] = day.applicationDurations?.[app.name] || 0;\r\n }\r\n });\r\n return entry;\r\n });\r\n\r\n const getColor = (app: ApplicationSeriesDto, index: number): string => {\r\n return app.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Chart */}\r\n <div style={{ width: '100%', height: 300 }}>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart\r\n data={chartData}\r\n margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n >\r\n <CartesianGrid\r\n strokeDasharray=\"3 3\"\r\n stroke=\"var(--border-color)\"\r\n />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n label={{\r\n value: mode === 'access' ? 'Accès' : 'Minutes',\r\n angle: -90,\r\n position: 'insideLeft',\r\n style: { fill: 'var(--text-secondary)', fontSize: '11px' }\r\n }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)'\r\n }}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 'bold', marginBottom: '8px' }}\r\n itemStyle={{ color: 'var(--text-secondary)' }}\r\n />\r\n <Legend\r\n wrapperStyle={{\r\n paddingTop: '20px'\r\n }}\r\n formatter={(value) => (\r\n <span style={{ color: 'var(--text-secondary)', fontSize: '12px' }}>{value}</span>\r\n )}\r\n />\r\n {data.applications.map((app, index) => (\r\n <Line\r\n key={app.name}\r\n type=\"monotone\"\r\n dataKey={app.name}\r\n stroke={getColor(app, index)}\r\n strokeWidth={2}\r\n dot={{ r: 2, fill: getColor(app, index) }}\r\n activeDot={{ r: 5, fill: getColor(app, index) }}\r\n />\r\n ))}\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend with totals */}\r\n <div className=\"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4\">\r\n {data.applications.map((app, index) => (\r\n <div key={app.name} className=\"flex items-center gap-2\">\r\n <div\r\n className=\"w-3 h-3 rounded-full\"\r\n style={{ backgroundColor: getColor(app, index) }}\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{app.name}</span>\r\n <span className=\"text-sm font-semibold\" style={{ color: getColor(app, index) }}>\r\n {mode === 'access' ? app.totalAccess : `${app.totalDurationMinutes} min`}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Users, Clock } from 'lucide-react';\r\nimport type { ModuleAnalyticsDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface ModulePopularityChartProps {\r\n readonly data: ModuleAnalyticsDto[];\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst moduleColors = [\r\n '#3b82f6',\r\n '#8b5cf6',\r\n '#22c55e',\r\n '#f59e0b',\r\n '#ef4444',\r\n '#06b6d4',\r\n '#ec4899',\r\n '#10b981',\r\n '#f97316',\r\n '#6366f1'\r\n];\r\n\r\nexport const ModulePopularityChart: React.FC<ModulePopularityChartProps> = ({ data, mode = 'access' }) => {\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n No module data available\r\n </div>\r\n );\r\n }\r\n\r\n const getValue = (module: ModuleAnalyticsDto) =>\r\n mode === 'access' ? module.accessCount : module.totalDurationMinutes;\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n\r\n const maxCount = Math.max(...data.map(m => getValue(m)), 1);\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n const remainingSeconds = seconds % 60;\r\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {data.map((module, index) => {\r\n const value = getValue(module);\r\n const percentage = (value / maxCount) * 100;\r\n\r\n return (\r\n <div\r\n key={module.moduleId}\r\n className=\"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4\"\r\n style={{ borderLeftColor: moduleColors[index % moduleColors.length] }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className=\"flex-1\">\r\n {/* Full hierarchy path */}\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1 font-mono\">\r\n <span className=\"text-blue-500\">platform</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-green-500\">{module.applicationName}</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-purple-500\">{module.moduleName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <h5 className=\"font-semibold text-[var(--text-primary)]\">\r\n {module.moduleName}\r\n </h5>\r\n </div>\r\n </div>\r\n <div className=\"text-right\">\r\n <div className=\"text-xl font-bold\" style={{ color: moduleColors[index % moduleColors.length] }}>\r\n {value.toLocaleString()}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{valueLabel}</div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: moduleColors[index % moduleColors.length]\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 text-xs text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n <span>{module.uniqueUsers} utilisateurs uniques</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n <span>Moy: {formatDuration(module.avgDuration)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport type { PopularApplicationDto } from '@/services/api/applicationAnalyticsApi';\r\n\r\ninterface ApplicationActivityPieChartProps {\r\n readonly data: PopularApplicationDto[];\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst renderActiveShape = (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: { applicationName: string; accessCount: number };\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.applicationName}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} accès\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text x={ex + (cos >= 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill=\"var(--text-primary)\" style={{ fontSize: '12px' }}>\r\n {`${(percent * 100).toFixed(0)}%`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const ApplicationActivityPieChart: React.FC<ApplicationActivityPieChartProps> = ({ data }) => {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n );\r\n }\r\n\r\n const totalAccess = data.reduce((sum, app) => sum + app.accessCount, 0);\r\n\r\n const chartData = data.map((app, index) => ({\r\n ...app,\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n fill: COLORS[index % COLORS.length]\r\n }));\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n {/* Spacer row to match breadcrumb height in hierarchy chart */}\r\n <div className=\"flex items-center gap-2 text-sm h-[34px]\">\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n Vue globale des applications actives\r\n </span>\r\n </div>\r\n\r\n {/* Summary stats - at top to match hierarchy chart */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className=\"text-lg font-semibold text-green-600\">\r\n Applications\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.length} actives • {totalAccess.toLocaleString()} accès total)\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart - same height as hierarchy */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter\r\n } as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.name} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n {/* Tooltip disabled - activeShape already displays all info in center */}\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend - same style as hierarchy chart */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <div\r\n key={item.applicationId}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer ${\r\n activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''\r\n }`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.applicationName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.accessCount.toLocaleString()} accès\r\n </p>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport { ChevronRight, Home, Loader2, ArrowLeft } from 'lucide-react';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type { HierarchyDrillDownDto, HierarchyItemDto } from '@/services/api/applicationAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface HierarchyDrillDownChartProps {\r\n readonly period: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst LEVEL_LABELS = ['Application', 'Module'];\r\nconst LEVEL_COLORS = ['text-blue-500', 'text-green-500'];\r\n\r\ninterface ChartDataItem extends HierarchyItemDto {\r\n value: number;\r\n fill: string;\r\n valueLabel: string;\r\n}\r\n\r\nconst createRenderActiveShape = (valueLabel: string) => (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: ChartDataItem;\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.name}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} {valueLabel}\r\n </text>\r\n <text x={cx} y={cy} dy={28} textAnchor=\"middle\" fill=\"var(--text-tertiary)\" style={{ fontSize: '11px' }}>\r\n {payload.hasChildren ? 'Cliquez pour explorer' : ''}\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-primary)\"\r\n style={{ fontSize: '12px' }}\r\n >\r\n {`${(percent * 100).toFixed(1)}%`}\r\n </text>\r\n <text\r\n x={ex + (cos >= 0 ? 1 : -1) * 12}\r\n y={ey}\r\n dy={14}\r\n textAnchor={textAnchor}\r\n fill=\"var(--text-secondary)\"\r\n style={{ fontSize: '10px' }}\r\n >\r\n {`${payload.uniqueUsers} utilisateurs`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const HierarchyDrillDownChart: React.FC<HierarchyDrillDownChartProps> = ({ period, mode = 'access' }) => {\r\n const [data, setData] = useState<HierarchyDrillDownDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const [currentLevel, setCurrentLevel] = useState(0);\r\n const [applicationId, setApplicationId] = useState<string | undefined>();\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const result = await applicationAnalyticsApi.getHierarchyData(\r\n currentLevel,\r\n applicationId,\r\n period\r\n );\r\n setData(result);\r\n setActiveIndex(0);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load data');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [currentLevel, applicationId, period]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSliceClick = (item: HierarchyItemDto) => {\r\n if (!item.hasChildren) return;\r\n\r\n if (currentLevel === 0) {\r\n setApplicationId(item.id);\r\n setCurrentLevel(1);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if (currentLevel === 1) {\r\n setApplicationId(undefined);\r\n setCurrentLevel(0);\r\n }\r\n };\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[400px]\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"text-center py-8 text-red-500\">\r\n {error}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.items?.length) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée disponible pour ce niveau\r\n </div>\r\n );\r\n }\r\n\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n const chartData: ChartDataItem[] = data.items.map((item, index) => ({\r\n ...item,\r\n value: mode === 'access' ? item.accessCount : item.totalDurationMinutes,\r\n fill: COLORS[index % COLORS.length],\r\n valueLabel\r\n }));\r\n\r\n const renderActiveShape = createRenderActiveShape(valueLabel);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Breadcrumb Navigation */}\r\n <div className=\"flex items-center gap-2 text-sm flex-wrap\">\r\n <button\r\n onClick={() => { setCurrentLevel(0); setApplicationId(undefined); }}\r\n className={`flex items-center gap-1 px-2 py-1 rounded hover:bg-[var(--bg-secondary)] transition-colors ${\r\n currentLevel === 0 ? 'font-semibold text-blue-600' : 'text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Home className=\"h-4 w-4\" />\r\n <span>Applications</span>\r\n </button>\r\n\r\n {data.breadcrumb.map((item) => (\r\n <React.Fragment key={item.id}>\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)]\" />\r\n <span className={`px-2 py-1 font-semibold ${LEVEL_COLORS[1]}`}>\r\n {item.name}\r\n </span>\r\n </React.Fragment>\r\n ))}\r\n\r\n {currentLevel > 0 && (\r\n <button\r\n onClick={handleBack}\r\n className=\"ml-auto flex items-center gap-1 px-3 py-1 rounded-lg bg-[var(--bg-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors text-[var(--text-secondary)]\"\r\n >\r\n <ArrowLeft className=\"h-4 w-4\" />\r\n Retour\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Level indicator */}\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className={`text-lg font-semibold ${LEVEL_COLORS[currentLevel]}`}>\r\n {LEVEL_LABELS[currentLevel]}s\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.items.length} éléments • {mode === 'access'\r\n ? `${data.totalAccess.toLocaleString()} accès total`\r\n : `${data.totalDurationMinutes.toLocaleString()} min total`})\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter,\r\n onClick: (_: unknown, index: number) => handleSliceClick(chartData[index]),\r\n style: { cursor: chartData[activeIndex]?.hasChildren ? 'pointer' : 'default' }\r\n } as unknown as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.id} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend / List */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <button\r\n key={item.id}\r\n onClick={() => item.hasChildren && handleSliceClick(item)}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors text-left ${\r\n item.hasChildren ? 'cursor-pointer' : 'cursor-default'\r\n } ${activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.name}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {item.value.toLocaleString()} {valueLabel}\r\n </p>\r\n </div>\r\n {item.hasChildren && (\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AlertTriangle,\r\n BarChart3,\r\n Users,\r\n Activity,\r\n TrendingUp,\r\n Loader2,\r\n RefreshCw,\r\n Clock,\r\n Layers,\r\n PieChart\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { applicationAnalyticsApi } from '@/services/api/applicationAnalyticsApi';\r\nimport type {\r\n ApplicationDashboardStatsDto,\r\n ModuleAnalyticsDto\r\n} from '@/services/api/applicationAnalyticsApi';\r\nimport { UsageTrendChart, type ChartMode } from '@/components/dashboard/UsageTrendChart';\r\nimport { ModulePopularityChart } from '@/components/dashboard/ModulePopularityChart';\r\nimport { ApplicationActivityPieChart } from '@/components/dashboard/ApplicationActivityPieChart';\r\nimport { HierarchyDrillDownChart } from '@/components/dashboard/HierarchyDrillDownChart';\r\n\r\nconst KpiCard: React.FC<{\r\n label: string;\r\n value: number | string;\r\n icon: React.ReactNode;\r\n color: 'blue' | 'green' | 'purple' | 'orange' | 'yellow' | 'red';\r\n subtitle?: string;\r\n}> = ({ label, value, icon, color, subtitle }) => {\r\n const iconColors = {\r\n blue: 'text-blue-500',\r\n green: 'text-green-500',\r\n purple: 'text-purple-500',\r\n orange: 'text-orange-500',\r\n yellow: 'text-yellow-500',\r\n red: 'text-red-500'\r\n };\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">{label}</span>\r\n <div className={iconColors[color]}>{icon}</div>\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{typeof value === 'number' ? value.toLocaleString() : value}</div>\r\n {subtitle && <div className=\"text-xs text-[var(--text-tertiary)] mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport const ApplicationsDashboardPage: React.FC = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const { currentTenant } = useTenant();\r\n const [stats, setStats] = useState<ApplicationDashboardStatsDto | null>(null);\r\n const [topModules, setTopModules] = useState<ModuleAnalyticsDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [chartMode, setChartMode] = useState<ChartMode>('access');\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const [dashboardRes, modulesRes] = await Promise.all([\r\n applicationAnalyticsApi.getDashboardStats(),\r\n applicationAnalyticsApi.getTopModules(5, period)\r\n ]);\r\n\r\n setStats(dashboardRes);\r\n setTopModules(modulesRes);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, currentTenant?.id]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n return `${minutes}m`;\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-[var(--error-text)] font-medium\">{error}</p>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"text-[var(--error-text)] hover:opacity-80\"\r\n >\r\n <RefreshCw className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('dashboard.title', 'Dashboard') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <BarChart3 className=\"h-6 w-6\" />\r\n Tableau de bord Applications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n Analyse d'utilisation par Context › Application › Module\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n {/* Mode Toggle - Global */}\r\n <div className=\"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1\">\r\n <button\r\n onClick={() => setChartMode('access')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'access'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Activity className=\"w-3.5 h-3.5\" />\r\n Accès\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setChartMode('duration')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'duration'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Clock className=\"w-3.5 h-3.5\" />\r\n Temps\r\n </span>\r\n </button>\r\n </div>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value={7}>7 days</option>\r\n <option value={30}>30 days</option>\r\n <option value={90}>90 days</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"rounded-[var(--radius-button)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] flex items-center gap-2 transition-colors\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n Refresh\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards Grid (2x3) */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n label=\"Total Applications\"\r\n value={stats?.totalApplications || 0}\r\n icon={<BarChart3 className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n label=\"Active Applications\"\r\n value={stats?.activeApplications || 0}\r\n icon={<Activity className=\"h-5 w-5\" />}\r\n color=\"green\"\r\n />\r\n <KpiCard\r\n label=\"Total Users\"\r\n value={stats?.totalUsers || 0}\r\n icon={<Users className=\"h-5 w-5\" />}\r\n color=\"purple\"\r\n />\r\n <KpiCard\r\n label=\"Active Today\"\r\n value={stats?.activeUsersToday || 0}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color=\"orange\"\r\n />\r\n <KpiCard\r\n label=\"Avg Session\"\r\n value={formatDuration(stats?.avgSessionDuration || 0)}\r\n icon={<Clock className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n subtitle={`${period} days`}\r\n />\r\n <KpiCard\r\n label=\"Growth Rate\"\r\n value={`${stats?.growthRate.toFixed(1) || 0}%`}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color={(stats?.growthRate ?? 0) >= 0 ? 'green' : 'red'}\r\n subtitle=\"vs previous period\"\r\n />\r\n </div>\r\n\r\n {/* Two Column: Hierarchy Drill-Down + Top Applications */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Hierarchy Drill-Down Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <PieChart className=\"h-5 w-5 text-[var(--color-primary-600)]\" />\r\n {chartMode === 'access' ? 'Activité' : 'Temps passé'} par Hiérarchie\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Cliquez pour explorer)\r\n </span>\r\n </h3>\r\n <HierarchyDrillDownChart key={`hierarchy-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Application Activity Pie Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Activity className=\"h-5 w-5 text-green-600\" />\r\n Top Applications\r\n </h3>\r\n {stats?.mostPopularApps && stats.mostPopularApps.length > 0 ? (\r\n <ApplicationActivityPieChart data={stats.mostPopularApps} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Usage Trends Chart - Full Width with Application breakdown */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <TrendingUp className=\"h-5 w-5\" />\r\n Tendance {chartMode === 'access' ? \"d'utilisation\" : 'du temps passé'} par Application ({period} jours)\r\n </h3>\r\n <UsageTrendChart key={`trends-${currentTenant?.id ?? 'global'}`} period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Module Popularity - Full Width */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Layers className=\"h-5 w-5 text-purple-600\" />\r\n Modules les plus {chartMode === 'access' ? 'populaires' : 'utilisés'}\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n (Context › Application › Module)\r\n </span>\r\n </h3>\r\n {(topModules?.length ?? 0) > 0 ? (\r\n <ModulePopularityChart data={topModules} mode={chartMode} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée de module disponible\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Call to action */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-gradient-to-r from-[var(--color-primary-600)]/10 to-[var(--color-accent-500)]/10 p-6\">\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"font-bold text-[var(--text-primary)]\">Explorer toutes les Applications</h3>\r\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">\r\n Voir les analyses détaillées pour chaque application et gérer les permissions\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/applications/list')}\r\n className=\"whitespace-nowrap rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-4 py-2 font-medium text-white transition-all hover:shadow-md\"\r\n >\r\n Voir les Applications\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["DEFAULT_COLORS","UsageTrendChart","period","mode","data","setData","useState","loading","setLoading","error","setError","useEffect","result","applicationAnalyticsApi","err","jsx","Loader2","chartData","day","entry","app","getColor","index","jsxs","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","value","Line","moduleColors","ModulePopularityChart","getValue","module","valueLabel","maxCount","m","formatDuration","seconds","minutes","remainingSeconds","percentage","Users","Clock","COLORS","renderActiveShape","props","cx","cy","midAngle","innerRadius","outerRadius","startAngle","endAngle","fill","payload","percent","RADIAN","sin","cos","sx","sy","mx","my","ex","ey","textAnchor","Sector","ApplicationActivityPieChart","activeIndex","setActiveIndex","totalAccess","sum","onPieEnter","_","PieChart","Pie","Cell","item","LEVEL_LABELS","LEVEL_COLORS","createRenderActiveShape","HierarchyDrillDownChart","currentLevel","setCurrentLevel","applicationId","setApplicationId","loadData","useCallback","handleSliceClick","handleBack","Home","React","ChevronRight","ArrowLeft","KpiCard","label","icon","color","subtitle","ApplicationsDashboardPage","navigate","useNavigate","t","useTranslation","currentTenant","useTenant","stats","setStats","topModules","setTopModules","refreshing","setRefreshing","setPeriod","chartMode","setChartMode","dashboardRes","modulesRes","handleRefresh","AlertTriangle","RefreshCw","Breadcrumb","BarChart3","Activity","e","TrendingUp","Layers"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react-i18next"),c=require("lucide-react"),u=require("react-router-dom"),a=require("./index-
|
|
2
|
-
//# sourceMappingURL=ApplicationsGridPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),d=require("react-i18next"),c=require("lucide-react"),u=require("react-router-dom"),a=require("./index-cAikSVW0.js");function m(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(r,o,s.get?s:{enumerable:!0,get:()=>t[o]})}}return r.default=t,Object.freeze(r)}const x=m(c);function b(t){if(!t)return c.Box;const r=x;if(r[t])return r[t];const o=t.toLowerCase(),s=Object.keys(r).find(n=>n.toLowerCase()===o);return s?r[s]:c.Box}function v({module:t,buildUrl:r}){const{t:o}=d.useTranslation("admin"),s=b(t.icon),n=t.sections?.length??0;return e.jsx("div",{className:"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10",children:e.jsxs(u.Link,{to:t.route?r(t.route):"#",className:"block p-6",children:[e.jsx("div",{className:"flex items-start justify-between mb-4",children:e.jsx("div",{className:"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all",children:e.jsx(s,{className:"w-7 h-7 text-[var(--color-accent-500)]"})})}),e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-2",children:t.label}),n>0&&e.jsxs("p",{className:"text-sm text-[var(--text-secondary)] mb-4",children:[n," ",n===1?o("modules.sectionCount_one","section"):o("modules.sectionCount_other","sections")]}),e.jsxs("div",{className:"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity",children:[o("modules.open","Ouvrir"),e.jsx(c.ArrowRight,{className:"w-4 h-4"})]})]})})}function p(){const{t}=d.useTranslation("admin"),{getCurrentApplication:r,isLoading:o}=a.useNavigation(),s=a.useTenantUrl(),n=r(),i=n?.modules??[];return o?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx("div",{className:"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin"})}):e.jsxs("div",{className:"space-y-8",children:[e.jsx(a.Breadcrumb,{items:[{label:n?.label??t("modules.title","Modules")}]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:n?.label??t("modules.title","Modules")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:t("modules.subtitle","Sélectionnez un module pour commencer")})]}),e.jsx("section",{children:i.length>0?e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:i.map(l=>e.jsx(v,{module:l,buildUrl:s},l.id))}):e.jsxs("div",{className:"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]",children:[e.jsx(c.Box,{className:"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4"}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:t("modules.noModules","Aucun module disponible")})]})})]})}exports.ApplicationsGridPage=p;
|
|
2
|
+
//# sourceMappingURL=ApplicationsGridPage-DDysNWJ5.js.map
|
package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApplicationsGridPage-
|
|
1
|
+
{"version":3,"file":"ApplicationsGridPage-DDysNWJ5.js","sources":["../../src/pages/platform/administration/applications/ApplicationsGridPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n ArrowRight,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ModuleDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nfunction getIcon(iconName: string | null): LucideIcon {\r\n if (!iconName) return Box;\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n if (icons[iconName]) return icons[iconName];\r\n const lowerName = iconName.toLowerCase();\r\n const matchingKey = Object.keys(icons).find(key => key.toLowerCase() === lowerName);\r\n return matchingKey ? icons[matchingKey] : Box;\r\n}\r\n\r\ninterface ModuleCardProps {\r\n readonly module: ModuleDto;\r\n readonly buildUrl: (path: string) => string;\r\n}\r\n\r\nfunction ModuleCard({ module, buildUrl }: ModuleCardProps) {\r\n const { t } = useTranslation('admin');\r\n const Icon = getIcon(module.icon);\r\n const sectionCount = module.sections?.length ?? 0;\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10\">\r\n <Link\r\n to={module.route ? buildUrl(module.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {module.label}\r\n </h3>\r\n\r\n {sectionCount > 0 && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {sectionCount} {sectionCount === 1\r\n ? t('modules.sectionCount_one', 'section')\r\n : t('modules.sectionCount_other', 'sections')}\r\n </p>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('modules.open', 'Ouvrir')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n}\r\n\r\nexport function ApplicationsGridPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { getCurrentApplication, isLoading } = useNavigation();\r\n const buildUrl = useTenantUrl();\r\n\r\n const currentApp = getCurrentApplication();\r\n const modules = currentApp?.modules ?? [];\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <Breadcrumb\r\n items={[\r\n { label: currentApp?.label ?? t('modules.title', 'Modules') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {currentApp?.label ?? t('modules.title', 'Modules')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('modules.subtitle', 'Sélectionnez un module pour commencer')}\r\n </p>\r\n </div>\r\n\r\n <section>\r\n {modules.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {modules.map(module => (\r\n <ModuleCard\r\n key={module.id}\r\n module={module}\r\n buildUrl={buildUrl}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('modules.noModules', 'Aucun module disponible')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["getIcon","iconName","Box","icons","LucideIcons","lowerName","matchingKey","key","ModuleCard","module","buildUrl","t","useTranslation","Icon","sectionCount","jsx","jsxs","Link","ArrowRight","ApplicationsGridPage","getCurrentApplication","isLoading","useNavigation","useTenantUrl","currentApp","modules","Breadcrumb"],"mappings":"mgBAaA,SAASA,EAAQC,EAAqC,CACpD,GAAI,CAACA,EAAU,OAAOC,EAAAA,IACtB,MAAMC,EAAQC,EACd,GAAID,EAAMF,CAAQ,EAAG,OAAOE,EAAMF,CAAQ,EAC1C,MAAMI,EAAYJ,EAAS,YAAA,EACrBK,EAAc,OAAO,KAAKH,CAAK,EAAE,KAAKI,GAAOA,EAAI,YAAA,IAAkBF,CAAS,EAClF,OAAOC,EAAcH,EAAMG,CAAW,EAAIJ,EAAAA,GAC5C,CAOA,SAASM,EAAW,CAAE,OAAAC,EAAQ,SAAAC,GAA6B,CACzD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,OAAO,EAC9BC,EAAOb,EAAQS,EAAO,IAAI,EAC1BK,EAAeL,EAAO,UAAU,QAAU,EAEhD,OACEM,EAAAA,IAAC,MAAA,CAAI,UAAU,qOACb,SAAAC,EAAAA,KAACC,EAAAA,KAAA,CACC,GAAIR,EAAO,MAAQC,EAASD,EAAO,KAAK,EAAI,IAC5C,UAAU,YAEV,SAAA,CAAAM,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,qPACb,SAAAA,EAAAA,IAACF,EAAA,CAAK,UAAU,wCAAA,CAAyC,CAAA,CAC3D,EACF,EAEAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wDACX,WAAO,MACV,EAECD,EAAe,GACdE,OAAC,IAAA,CAAE,UAAU,4CACV,SAAA,CAAAF,EAAa,IAAEA,IAAiB,EAC7BH,EAAE,2BAA4B,SAAS,EACvCA,EAAE,6BAA8B,UAAU,CAAA,EAChD,EAGFK,EAAAA,KAAC,MAAA,CAAI,UAAU,kIACZ,SAAA,CAAAL,EAAE,eAAgB,QAAQ,EAC3BI,EAAAA,IAACG,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,CAAA,CAAA,CAClC,CAAA,CAAA,CAAA,EAEJ,CAEJ,CAEO,SAASC,GAAqC,CACnD,KAAM,CAAE,CAAA,EAAMP,EAAAA,eAAe,OAAO,EAC9B,CAAE,sBAAAQ,EAAuB,UAAAC,CAAA,EAAcC,gBAAA,EACvCZ,EAAWa,EAAAA,aAAA,EAEXC,EAAaJ,EAAA,EACbK,EAAUD,GAAY,SAAW,CAAA,EAEvC,OAAIH,EAEAN,MAAC,OAAI,UAAU,iDACb,eAAC,MAAA,CAAI,UAAU,mGAAmG,CAAA,CACpH,EAKFC,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAD,EAAAA,IAACW,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAOF,GAAY,OAAS,EAAE,gBAAiB,SAAS,CAAA,CAAE,CAC9D,CAAA,SAGD,MAAA,CACC,SAAA,CAAAT,EAAAA,IAAC,KAAA,CAAG,UAAU,gDACX,SAAAS,GAAY,OAAS,EAAE,gBAAiB,SAAS,CAAA,CACpD,QACC,IAAA,CAAE,UAAU,oCACV,SAAA,EAAE,mBAAoB,uCAAuC,CAAA,CAChE,CAAA,EACF,EAEAT,EAAAA,IAAC,UAAA,CACE,SAAAU,EAAQ,OAAS,EAChBV,EAAAA,IAAC,MAAA,CAAI,UAAU,sEACZ,SAAAU,EAAQ,IAAIhB,GACXM,EAAAA,IAACP,EAAA,CAEC,OAAAC,EACA,SAAAC,CAAA,EAFKD,EAAO,EAAA,CAIf,CAAA,CACH,EAEAO,OAAC,MAAA,CAAI,UAAU,wFACb,SAAA,CAAAD,EAAAA,IAACb,EAAAA,IAAA,CAAI,UAAU,oDAAA,CAAqD,QACnE,IAAA,CAAE,UAAU,+BACV,SAAA,EAAE,oBAAqB,yBAAyB,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EACF,CAEJ"}
|
|
@@ -3,7 +3,7 @@ import { useTranslation as d } from "react-i18next";
|
|
|
3
3
|
import * as m from "lucide-react";
|
|
4
4
|
import { Box as s, ArrowRight as u } from "lucide-react";
|
|
5
5
|
import { Link as v } from "react-router-dom";
|
|
6
|
-
import { u as h, b as p, B as b } from "./index-
|
|
6
|
+
import { u as h, b as p, B as b } from "./index-CN2WRyg1.js";
|
|
7
7
|
function x(r) {
|
|
8
8
|
if (!r) return s;
|
|
9
9
|
const o = m;
|
|
@@ -65,4 +65,4 @@ function j() {
|
|
|
65
65
|
export {
|
|
66
66
|
j as ApplicationsGridPage
|
|
67
67
|
};
|
|
68
|
-
//# sourceMappingURL=ApplicationsGridPage-
|
|
68
|
+
//# sourceMappingURL=ApplicationsGridPage-s1WEzOXS.js.map
|
package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApplicationsGridPage-
|
|
1
|
+
{"version":3,"file":"ApplicationsGridPage-s1WEzOXS.js","sources":["../../src/pages/platform/administration/applications/ApplicationsGridPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n ArrowRight,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ModuleDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nfunction getIcon(iconName: string | null): LucideIcon {\r\n if (!iconName) return Box;\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n if (icons[iconName]) return icons[iconName];\r\n const lowerName = iconName.toLowerCase();\r\n const matchingKey = Object.keys(icons).find(key => key.toLowerCase() === lowerName);\r\n return matchingKey ? icons[matchingKey] : Box;\r\n}\r\n\r\ninterface ModuleCardProps {\r\n readonly module: ModuleDto;\r\n readonly buildUrl: (path: string) => string;\r\n}\r\n\r\nfunction ModuleCard({ module, buildUrl }: ModuleCardProps) {\r\n const { t } = useTranslation('admin');\r\n const Icon = getIcon(module.icon);\r\n const sectionCount = module.sections?.length ?? 0;\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-500)]/50 transition-all duration-300 hover:shadow-lg hover:shadow-[var(--color-accent-500)]/10\">\r\n <Link\r\n to={module.route ? buildUrl(module.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-[var(--color-accent-500)]/20 to-[var(--color-accent-600)]/20 flex items-center justify-center group-hover:from-[var(--color-accent-500)]/30 group-hover:to-[var(--color-accent-600)]/30 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {module.label}\r\n </h3>\r\n\r\n {sectionCount > 0 && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {sectionCount} {sectionCount === 1\r\n ? t('modules.sectionCount_one', 'section')\r\n : t('modules.sectionCount_other', 'sections')}\r\n </p>\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('modules.open', 'Ouvrir')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n}\r\n\r\nexport function ApplicationsGridPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { getCurrentApplication, isLoading } = useNavigation();\r\n const buildUrl = useTenantUrl();\r\n\r\n const currentApp = getCurrentApplication();\r\n const modules = currentApp?.modules ?? [];\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <Breadcrumb\r\n items={[\r\n { label: currentApp?.label ?? t('modules.title', 'Modules') }\r\n ]}\r\n />\r\n\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {currentApp?.label ?? t('modules.title', 'Modules')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('modules.subtitle', 'Sélectionnez un module pour commencer')}\r\n </p>\r\n </div>\r\n\r\n <section>\r\n {modules.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {modules.map(module => (\r\n <ModuleCard\r\n key={module.id}\r\n module={module}\r\n buildUrl={buildUrl}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-2xl border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('modules.noModules', 'Aucun module disponible')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["getIcon","iconName","Box","icons","LucideIcons","lowerName","matchingKey","key","ModuleCard","module","buildUrl","t","useTranslation","Icon","sectionCount","jsx","jsxs","Link","ArrowRight","ApplicationsGridPage","getCurrentApplication","isLoading","useNavigation","useTenantUrl","currentApp","modules","Breadcrumb"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { useMemo as A, useState as d, useCallback as D, useEffect as $ } from "r
|
|
|
3
3
|
import { useNavigate as z } from "react-router-dom";
|
|
4
4
|
import { useTranslation as M } from "react-i18next";
|
|
5
5
|
import { Users as V, Clock as B, ChevronRight as E, Loader2 as G, AlertTriangle as P, Search as R, LayoutGrid as U, LayoutList as q } from "lucide-react";
|
|
6
|
-
import { a as H, k as _, B as I } from "./index-
|
|
6
|
+
import { a as H, k as _, B as I } from "./index-CN2WRyg1.js";
|
|
7
7
|
const J = ({
|
|
8
8
|
id: k,
|
|
9
9
|
name: r,
|
|
@@ -244,4 +244,4 @@ const J = ({
|
|
|
244
244
|
export {
|
|
245
245
|
Z as ApplicationsListPage
|
|
246
246
|
};
|
|
247
|
-
//# sourceMappingURL=ApplicationsListPage-
|
|
247
|
+
//# sourceMappingURL=ApplicationsListPage-B3CSMiV0.js.map
|