@atlashub/smartstack 3.29.0 → 3.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CDMhqrhE.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CDMhqrhE.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DcvOMm5k.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DcvOMm5k.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-DYBPNzjQ.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-DYBPNzjQ.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-YpJSDaWc.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-YpJSDaWc.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-9r1axtCg.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-9r1axtCg.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-TjCQ8_A8.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-TjCQ8_A8.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-COxazTnz.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-COxazTnz.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-QRysH0pT.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-QRysH0pT.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-Dbx01Ikm.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-Dbx01Ikm.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage-jSHy3MPz.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage-jSHy3MPz.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-CclKc0wI.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-CclKc0wI.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-CxWmOc1x.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-CxWmOc1x.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-BJXWXwyI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-BJXWXwyI.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-D2l8cM3o.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-D2l8cM3o.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-CMosl3my.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-CMosl3my.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-Dc6NGQ61.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-Dc6NGQ61.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-DH7tpMlF.js} +2 -2
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-DH7tpMlF.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-DI-iMqoJ.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-DI-iMqoJ.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-B5UbujbZ.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-B5UbujbZ.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-E79QBSLb.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-E79QBSLb.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-CDFaL1gT.js} +2 -2
- package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-CDFaL1gT.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-CPeKJjyK.js} +2 -2
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-CPeKJjyK.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-BZ3Ocos5.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-BZ3Ocos5.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-Bml48QpH.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-Bml48QpH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-DP1XPaKK.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-DP1XPaKK.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-DyzslZ06.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-DyzslZ06.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-Bz2KrMik.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-Bz2KrMik.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-hKjKM0Bh.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-hKjKM0Bh.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-B4nAd8Tj.js} +2 -2
- package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-B4nAd8Tj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-C9qgPBS-.js} +3 -3
- package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-C9qgPBS-.js.map} +1 -1
- package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CjbNGMo1.js} +3 -3
- package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CjbNGMo1.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-rN7IFlTR.js} +2 -2
- package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-rN7IFlTR.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-CGv2L62M.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-CGv2L62M.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-DpYDmsgw.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-DpYDmsgw.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-CLI_fpF4.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-CLI_fpF4.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-Db6sOrZN.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-Db6sOrZN.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-BhMz2B6A.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-BhMz2B6A.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-D06arMXO.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-D06arMXO.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-BCM8KBCd.js} +5 -5
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-BCM8KBCd.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-CGMV3bWt.js} +2 -2
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-CGMV3bWt.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-BBrwEomx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-BBrwEomx.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-CrlWe3gd.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-CrlWe3gd.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-BOV34_rJ.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-BOV34_rJ.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CK4-klmd.js} +2 -2
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CK4-klmd.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-CFZ1G4dG.js} +2 -2
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-CFZ1G4dG.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DuhpwhZx.js} +2 -2
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DuhpwhZx.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-BnNQRfBP.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-BnNQRfBP.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DdJxEoTZ.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DdJxEoTZ.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-BllOlagk.js} +2 -2
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-BllOlagk.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D1T_ozHl.js} +2 -2
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D1T_ozHl.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-CioLaCYz.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-CioLaCYz.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-CrAQt7qL.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-CrAQt7qL.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-BIG78-1-.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-BIG78-1-.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-CvPqugYu.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-CvPqugYu.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-CDSuc8vw.js} +2 -2
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-CDSuc8vw.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-XaOrGrPZ.js} +2 -2
- package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-XaOrGrPZ.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BsWVXkMe.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BsWVXkMe.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-oSD7oQhJ.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-oSD7oQhJ.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-DD0_XWdT.js} +2 -2
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-DD0_XWdT.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-ca2BOdoH.js} +2 -2
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-ca2BOdoH.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-Bex_JN5N.js} +2 -2
- package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-Bex_JN5N.js.map} +1 -1
- package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-C8tUIOnb.js} +2 -2
- package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-C8tUIOnb.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-B-FXS2ln.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-B-FXS2ln.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-C8KZprkI.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-C8KZprkI.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-BYt__zKJ.js} +2 -2
- package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-BYt__zKJ.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-MWcVu-LY.js} +2 -2
- package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-MWcVu-LY.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-DaJiMj5Z.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-DaJiMj5Z.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-rCLUIj_T.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-rCLUIj_T.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-DeuPnLWg.js} +2 -2
- package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-DeuPnLWg.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-j7Rp6apG.js} +2 -2
- package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-j7Rp6apG.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CLtZWX17.js} +3 -3
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CLtZWX17.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TGyGmLMM.js} +2 -2
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TGyGmLMM.js.map} +1 -1
- package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-C0c5G9e7.js} +2 -2
- package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-C0c5G9e7.js.map} +1 -1
- package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-Dm03fBBf.js} +2 -2
- package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-Dm03fBBf.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-B4WDzEKi.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-B4WDzEKi.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-Cwo9NwxH.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-Cwo9NwxH.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-CL12dFy-.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-CL12dFy-.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-CneIhl30.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-CneIhl30.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-DStKmwHT.js} +2 -2
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-DStKmwHT.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-X4Rrhs9p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-X4Rrhs9p.js.map} +1 -1
- package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BUBYWtvR.js} +2 -2
- package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BUBYWtvR.js.map} +1 -1
- package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-CAgiB-NG.js} +2 -2
- package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-CAgiB-NG.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-B9vtpIZx.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-B9vtpIZx.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-BAoah-mL.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-BAoah-mL.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-BFcP4X8s.js} +2 -2
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-BFcP4X8s.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-D_Npnt4A.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-D_Npnt4A.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-DBP9kalU.js} +2 -2
- package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-DBP9kalU.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-p21DLhUb.js} +2 -2
- package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-p21DLhUb.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-DOwShnG8.js} +3 -3
- package/dist/chunks/UserCreateTicketPage-DOwShnG8.js.map +1 -0
- package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-lvlvp2u6.js} +48 -48
- package/dist/chunks/UserCreateTicketPage-lvlvp2u6.js.map +1 -0
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-C_tm7Pld.js} +2 -2
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-C_tm7Pld.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-Dp6q6FEW.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-Dp6q6FEW.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-6grZ6gmV.js} +5 -5
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-6grZ6gmV.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-DXLxO7LF.js} +2 -2
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-DXLxO7LF.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-Ch9IfCPo.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-Ch9IfCPo.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-a4II5VEE.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-a4II5VEE.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-B7Er0V4l.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-B7Er0V4l.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-BeAv4QfV.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-BeAv4QfV.js.map} +1 -1
- package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-0M1FLqOe.js} +2 -2
- package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-0M1FLqOe.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-ZR9r9vvf.js} +2 -2
- package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-ZR9r9vvf.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-BJH8EE1K.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-BJH8EE1K.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-CBpF5d54.js} +2 -2
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-CBpF5d54.js.map} +1 -1
- package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-CkkWAvNB.js} +2 -2
- package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-CkkWAvNB.js.map} +1 -1
- package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-Dl7a2lWz.js} +2 -2
- package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-Dl7a2lWz.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-BwcSE_H1.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-BwcSE_H1.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-DKMmDvWk.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-DKMmDvWk.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-BzDV3_Jc.js} +2 -2
- package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-BzDV3_Jc.js.map} +1 -1
- package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-CQ4vFMdP.js} +2 -2
- package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-CQ4vFMdP.js.map} +1 -1
- package/dist/chunks/{index-BIqcvvbh.js → index-BBmMbSZV.js} +9 -8
- package/dist/chunks/index-BBmMbSZV.js.map +1 -0
- package/dist/chunks/{index-_g82N2nb.js → index-BLlESTfA.js} +2 -2
- package/dist/chunks/{index-_g82N2nb.js.map → index-BLlESTfA.js.map} +1 -1
- package/dist/chunks/{index-DEOBhXS_.js → index-BPMjxWVx.js} +2 -2
- package/dist/chunks/{index-DEOBhXS_.js.map → index-BPMjxWVx.js.map} +1 -1
- package/dist/chunks/{index-Czk12A3G.js → index-CEbwdURd.js} +2 -2
- package/dist/chunks/{index-Czk12A3G.js.map → index-CEbwdURd.js.map} +1 -1
- package/dist/chunks/{index-BOKR3bw6.js → index-CUZygY5Q.js} +2 -2
- package/dist/chunks/{index-BOKR3bw6.js.map → index-CUZygY5Q.js.map} +1 -1
- package/dist/chunks/{index-IJR_91Yt.js → index-Ci1SqFiY.js} +2 -2
- package/dist/chunks/{index-IJR_91Yt.js.map → index-Ci1SqFiY.js.map} +1 -1
- package/dist/chunks/{index-Br2wsGE8.js → index-Cib93xtp.js} +2 -2
- package/dist/chunks/{index-Br2wsGE8.js.map → index-Cib93xtp.js.map} +1 -1
- package/dist/chunks/{index-BxHVPJ-j.js → index-CoHIgn5H.js} +2 -2
- package/dist/chunks/{index-BxHVPJ-j.js.map → index-CoHIgn5H.js.map} +1 -1
- package/dist/chunks/{index-DA5VyW0k.js → index-CpY95_ro.js} +2296 -2309
- package/dist/chunks/index-CpY95_ro.js.map +1 -0
- package/dist/chunks/{index-BMsjMCv9.js → index-D-2xSu5W.js} +3 -3
- package/dist/chunks/{index-BMsjMCv9.js.map → index-D-2xSu5W.js.map} +1 -1
- package/dist/chunks/{index-DIQ6Jmmq.js → index-D18t9DhC.js} +4 -4
- package/dist/chunks/{index-DIQ6Jmmq.js.map → index-D18t9DhC.js.map} +1 -1
- package/dist/chunks/index-DK5czlkn.js +48 -0
- package/dist/chunks/index-DK5czlkn.js.map +1 -0
- package/dist/chunks/{index-CxgEV-rT.js → index-DQd324n7.js} +2 -2
- package/dist/chunks/{index-CxgEV-rT.js.map → index-DQd324n7.js.map} +1 -1
- package/dist/chunks/{index-S-X8qFYW.js → index-Dbq-x5H9.js} +2 -2
- package/dist/chunks/{index-S-X8qFYW.js.map → index-Dbq-x5H9.js.map} +1 -1
- package/dist/chunks/{index-CNxx56kE.js → index-Det9dEaQ.js} +2 -2
- package/dist/chunks/{index-CNxx56kE.js.map → index-Det9dEaQ.js.map} +1 -1
- package/dist/chunks/{index-C1w97Ejz.js → index-bgT9XOKZ.js} +2 -2
- package/dist/chunks/{index-C1w97Ejz.js.map → index-bgT9XOKZ.js.map} +1 -1
- package/dist/chunks/index-h7ZrwrQg.js +2 -0
- package/dist/chunks/index-h7ZrwrQg.js.map +1 -0
- package/dist/chunks/{index-Djy4eIbB.js → index-k4USDz2P.js} +2 -2
- package/dist/chunks/{index-Djy4eIbB.js.map → index-k4USDz2P.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-7ihIWxAh.js} +2 -2
- package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-7ihIWxAh.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-Dk6K-UTE.js} +2 -2
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-Dk6K-UTE.js.map} +1 -1
- package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-BCMKkzlv.js} +2 -2
- package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-BCMKkzlv.js.map} +1 -1
- package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Dwn7pl5z.js} +2 -2
- package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Dwn7pl5z.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-Du7CvowE.js} +3 -3
- package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-Du7CvowE.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-gJ7yhWyi.js} +2 -2
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-gJ7yhWyi.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-5wWea2Jg.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-5wWea2Jg.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-Bk_v8egy.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-Bk_v8egy.js.map} +1 -1
- package/dist/components/routing/ProtectedRoute.d.ts.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 +0 -48
- package/dist/chunks/index-vXiLh35n.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserDashboardPage-BMYrtF3o.js","sources":["../../src/components/dashboard/SessionAnalyticsChart.tsx","../../src/components/dashboard/LoginErrorsTable.tsx","../../src/components/dashboard/CurrentSessionCard.tsx","../../src/components/dashboard/DeviceStatsCard.tsx","../../src/components/dashboard/WeeklyUsageChart.tsx","../../src/components/dashboard/HourlyUsageChart.tsx","../../src/components/dashboard/ApplicationUsageChart.tsx","../../src/pages/personal/myspace/UserDashboardPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DailySessionStatsDto } from '@/services/api/userApi';\r\n\r\ninterface SessionAnalyticsChartProps {\r\n readonly data: DailySessionStatsDto[];\r\n}\r\n\r\nexport function SessionAnalyticsChart({ data }: SessionAnalyticsChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.sessionAnalytics.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.map(item => ({\r\n date: new Date(item.date).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit' }),\r\n loginCount: item.loginCount,\r\n avgDuration: Math.round(item.avgDuration),\r\n }));\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n yAxisId=\"left\"\r\n stroke=\"var(--color-accent-500)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.connections'), angle: -90, position: 'insideLeft', fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n yAxisId=\"right\"\r\n orientation=\"right\"\r\n stroke=\"#22c55e\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.avgDuration'), angle: 90, position: 'insideRight', fill: 'var(--text-secondary)' }}\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: 'var(--radius-card)',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name: string | undefined) => {\r\n if (name === 'loginCount') return [value, t('dashboard.sessionAnalytics.connections')];\r\n if (name === 'avgDuration') return [`${value} min`, t('dashboard.sessionAnalytics.avgDuration')];\r\n return [value, name || ''];\r\n }}\r\n />\r\n <Legend\r\n wrapperStyle={{ color: 'var(--text-secondary)' }}\r\n formatter={(value: string) => {\r\n if (value === 'loginCount') return t('dashboard.sessionAnalytics.connections');\r\n if (value === 'avgDuration') return t('dashboard.sessionAnalytics.avgDurationMin');\r\n return value;\r\n }}\r\n />\r\n <Line\r\n yAxisId=\"left\"\r\n type=\"monotone\"\r\n dataKey=\"loginCount\"\r\n stroke=\"var(--color-accent-500)\"\r\n strokeWidth={2}\r\n dot={{ fill: 'var(--color-accent-500)', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n <Line\r\n yAxisId=\"right\"\r\n type=\"monotone\"\r\n dataKey=\"avgDuration\"\r\n stroke=\"#22c55e\"\r\n strokeWidth={2}\r\n dot={{ fill: '#22c55e', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n </LineChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { AlertTriangle, MapPin, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { LoginErrorDto } from '@/services/api/userApi';\r\n\r\ninterface LoginErrorsTableProps {\r\n readonly errors: LoginErrorDto[];\r\n}\r\n\r\nexport function LoginErrorsTable({ errors }: LoginErrorsTableProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!Array.isArray(errors) || errors.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mb-3 text-green-500\" />\r\n <p className=\"font-medium\">{t('dashboard.loginErrors.noErrors')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.loginErrors.accountSecure')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const isRecent = (loginAt: string) => {\r\n const errorDate = new Date(loginAt);\r\n const now = new Date();\r\n const hoursDiff = (now.getTime() - errorDate.getTime()) / (1000 * 60 * 60);\r\n return hoursDiff < 24;\r\n };\r\n\r\n return (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.datetime')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.reason')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.ipAddress')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.location')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {errors.map((error) => {\r\n const recent = isRecent(error.loginAt);\r\n return (\r\n <tr\r\n key={error.loginAt}\r\n className={`border-b border-[var(--border-color)] hover:bg-[var(--bg-secondary)] ${\r\n recent ? 'bg-red-50/50 dark:bg-red-900/10' : ''\r\n }`}\r\n >\r\n <td className=\"p-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {recent && (\r\n <span className=\"w-2 h-2 rounded-full bg-red-500 animate-pulse\" title={t('dashboard.loginErrors.recentLabel')} />\r\n )}\r\n <span className=\"text-sm\">\r\n {new Date(error.loginAt).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n })}\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-3\">\r\n <span\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\"\r\n style={{ borderRadius: 'var(--radius-badge)' }}\r\n >\r\n <AlertTriangle className=\"w-3 h-3\" />\r\n {error.failureReason}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n <span className=\"text-sm font-mono text-[var(--text-secondary)]\">\r\n {error.ipAddress || 'N/A'}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n {error.city || error.country ? (\r\n <div className=\"flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n {error.city && (\r\n <>\r\n <MapPin className=\"w-3 h-3\" />\r\n <span>{error.city}</span>\r\n </>\r\n )}\r\n {error.country && (\r\n <>\r\n <Globe className=\"w-3 h-3\" />\r\n <span>{error.country}</span>\r\n </>\r\n )}\r\n </div>\r\n ) : (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">{t('dashboard.loginErrors.notAvailable')}</span>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Clock, MapPin, Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { CurrentSessionDto } from '@/services/api/userApi';\r\n\r\ninterface CurrentSessionCardProps {\r\n readonly session: CurrentSessionDto | null;\r\n}\r\n\r\nexport function CurrentSessionCard({ session }: CurrentSessionCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!session) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <Monitor className=\"w-12 h-12 mb-3 opacity-50\" />\r\n <p className=\"font-medium\">{t('dashboard.currentSession.noActiveSession')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.currentSession.pleaseReconnect')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const formatDuration = (minutes: number): string => {\r\n if (minutes < 1) return \"< 1 minute\";\r\n if (minutes < 60) return `${Math.round(minutes)} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = Math.round(minutes % 60);\r\n if (mins === 0) return `${hours}h`;\r\n return `${hours}h ${mins}min`;\r\n };\r\n\r\n const extractBrowserName = (userAgent: string | null): string => {\r\n if (!userAgent) return t('dashboard.browsers.unknown');\r\n\r\n if (userAgent.includes('Edg/')) return t('dashboard.browsers.edge');\r\n if (userAgent.includes('Chrome/')) return t('dashboard.browsers.chrome');\r\n if (userAgent.includes('Firefox/')) return t('dashboard.browsers.firefox');\r\n if (userAgent.includes('Safari/') && !userAgent.includes('Chrome')) return t('dashboard.browsers.safari');\r\n if (userAgent.includes('OPR/') || userAgent.includes('Opera/')) return t('dashboard.browsers.opera');\r\n\r\n return t('dashboard.browsers.other');\r\n };\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Clock className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.duration')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {formatDuration(session.durationMinutes)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('dashboard.currentSession.since')} {new Date(session.loginAt).toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-blue-500/10 text-blue-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Monitor className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.device')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {extractBrowserName(session.userAgent)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1 font-mono\">\r\n {session.ipAddress || t('dashboard.currentSession.ipNotAvailable')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {(session.city || session.country) && (\r\n <div className=\"md:col-span-2 flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-green-500/10 text-green-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Globe className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.location')}</p>\r\n <div className=\"flex items-center gap-3 mt-1\">\r\n {session.city && (\r\n <div className=\"flex items-center gap-1\">\r\n <MapPin className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{session.city}</span>\r\n </div>\r\n )}\r\n {session.country && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{session.country}</span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DeviceStatsDto } from '@/services/api/userApi';\r\n\r\ninterface DeviceStatsCardProps {\r\n readonly stats: DeviceStatsDto | null;\r\n}\r\n\r\nexport function DeviceStatsCard({ stats }: DeviceStatsCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!stats) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <p>{t('dashboard.deviceStats.noData')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const browserColors = ['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444'];\r\n const countryColors = ['#06b6d4', '#ec4899', '#10b981', '#f97316', '#6366f1'];\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Monitor className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.browsersUsed')}\r\n </h4>\r\n {stats.byBrowser?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byBrowser.map((item, index) => {\r\n const maxCount = Math.max(...stats.byBrowser.map(b => b.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.browser} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.browser}>\r\n {item.browser}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: browserColors[index % browserColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.noData')}</p>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.connectionCountries')}\r\n </h4>\r\n {stats.byCountry?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byCountry.map((item, index) => {\r\n const maxCount = Math.max(...stats.byCountry.map(c => c.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.country} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.country}>\r\n {item.country}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: countryColors[index % countryColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.locationNotAvailable')}</p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ReferenceLine } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { WeeklyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface WeeklyUsageChartProps {\r\n readonly data: WeeklyStatsDto | null;\r\n}\r\n\r\nexport function WeeklyUsageChart({ data }: WeeklyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.dayStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.weeklyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.dayStats.map(item => ({\r\n day: t(`dashboard.days.${item.dayName.toLowerCase()}`),\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n }));\r\n\r\n // Calculate average of averages for the reference line\r\n const avgDurationPerSession = chartData.filter(d => d.sessionCount > 0).length > 0\r\n ? chartData.filter(d => d.sessionCount > 0).reduce((acc, d) => acc + d.duration, 0) / chartData.filter(d => d.sessionCount > 0).length\r\n : 0;\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"day\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.weeklyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <ReferenceLine\r\n y={avgDurationPerSession}\r\n stroke=\"#f59e0b\"\r\n strokeDasharray=\"5 5\"\r\n label={{\r\n value: `${t('dashboard.weeklyUsage.average')}: ${formatDuration(Math.round(avgDurationPerSession))}`,\r\n position: 'right',\r\n fill: '#f59e0b',\r\n fontSize: 11,\r\n }}\r\n />\r\n <Bar\r\n dataKey=\"duration\"\r\n fill=\"var(--color-accent-500)\"\r\n radius={[4, 4, 0, 0]}\r\n />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Cell } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { HourlyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface HourlyUsageChartProps {\r\n readonly data: HourlyStatsDto | null;\r\n}\r\n\r\nexport function HourlyUsageChart({ data }: HourlyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.hourStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.hourlyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const formatHour = (hour: number) => {\r\n return `${hour.toString().padStart(2, '0')}:00`;\r\n };\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.hourStats.map(item => ({\r\n hour: formatHour(item.hour),\r\n hourNum: item.hour,\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n isPeak: item.hour === data.peakHour,\r\n }));\r\n\r\n return (\r\n <div>\r\n <div className=\"flex items-center justify-end mb-2 text-xs text-[var(--text-secondary)]\">\r\n <span className=\"inline-block w-3 h-3 rounded-sm bg-[var(--color-accent-600)] mr-1\" />\r\n {t('dashboard.hourlyUsage.peakHour')}: {formatHour(data.peakHour)}\r\n </div>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 10, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"hour\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 11 }}\r\n interval={0}\r\n angle={-45}\r\n textAnchor=\"end\"\r\n height={60}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.hourlyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <Bar dataKey=\"duration\" radius={[4, 4, 0, 0]}>\r\n {chartData.map((entry, index) => (\r\n <Cell\r\n key={`${entry.hour}-${index}`}\r\n fill={entry.isPeak ? 'var(--color-accent-600)' : 'var(--color-accent-400)'}\r\n />\r\n ))}\r\n </Bar>\r\n </BarChart>\r\n </ResponsiveContainer>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { PieChart, Pie, Cell, Tooltip, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { ApplicationUsageDto } from '@/services/api/userApi';\r\n\r\ninterface ApplicationUsageChartProps {\r\n readonly data: ApplicationUsageDto | null;\r\n}\r\n\r\nconst COLORS = ['#3b82f6', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16', '#f97316', '#6366f1'];\r\n\r\nexport function ApplicationUsageChart({ data }: ApplicationUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.applicationUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.applications.map(app => ({\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n duration: app.totalDurationSeconds,\r\n percentage: app.percentage,\r\n }));\r\n\r\n const formatDuration = (seconds: number) => {\r\n if (seconds < 60) return `${seconds}s`;\r\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`;\r\n return `${Math.round(seconds / 3600)}h`;\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col md:flex-row items-center gap-6\">\r\n <div className=\"w-full md:w-1/2\">\r\n <ResponsiveContainer width=\"100%\" height={280}>\r\n <PieChart>\r\n <Pie\r\n data={chartData}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={60}\r\n outerRadius={90}\r\n dataKey=\"value\"\r\n label={({ name, percent }) => `${name} (${((percent ?? 0) * 100).toFixed(0)}%)`}\r\n labelLine={false}\r\n >\r\n {chartData.map((item, index) => (\r\n <Cell key={`${item.name}-${index}`} fill={COLORS[index % COLORS.length]} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value, _name, props) => [\r\n `${value} ${t('dashboard.applicationUsage.accesses')} (${formatDuration(props.payload.duration)})`,\r\n null,\r\n ]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n <div className=\"w-full md:w-1/2\">\r\n <div className=\"text-sm text-[var(--text-secondary)] mb-3\">\r\n {t('dashboard.applicationUsage.totalAccess')}: <span className=\"font-semibold text-[var(--text-primary)]\">{data.totalAccess}</span>\r\n </div>\r\n <div className=\"space-y-2 max-h-[240px] overflow-y-auto\">\r\n {data.applications.map((app, index) => (\r\n <div\r\n key={app.applicationId}\r\n className=\"flex items-center gap-3 p-2 rounded-[var(--radius-card)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\r\n style={{ backgroundColor: COLORS[index % COLORS.length] }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"text-sm font-medium text-[var(--text-primary)] truncate\">\r\n {app.applicationName}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {app.accessCount} {t('dashboard.applicationUsage.accesses')} - {formatDuration(app.totalDurationSeconds)}\r\n </div>\r\n </div>\r\n <div className=\"text-sm font-semibold text-[var(--text-primary)]\">\r\n {app.percentage}%\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Activity,\r\n TrendingUp,\r\n AlertTriangle,\r\n Monitor,\r\n BarChart3,\r\n Loader2,\r\n Calendar,\r\n Clock,\r\n AppWindow,\r\n Star,\r\n Settings,\r\n Building2,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation } from '@/contexts/NavigationContext';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport type {\r\n SessionAnalyticsDto,\r\n LoginErrorDto,\r\n CurrentSessionDto,\r\n DeviceStatsDto,\r\n WeeklyStatsDto,\r\n HourlyStatsDto,\r\n ApplicationUsageDto,\r\n} from '@/services/api/userApi';\r\nimport { SessionAnalyticsChart } from '@/components/dashboard/SessionAnalyticsChart';\r\nimport { LoginErrorsTable } from '@/components/dashboard/LoginErrorsTable';\r\nimport { CurrentSessionCard } from '@/components/dashboard/CurrentSessionCard';\r\nimport { DeviceStatsCard } from '@/components/dashboard/DeviceStatsCard';\r\nimport { WeeklyUsageChart } from '@/components/dashboard/WeeklyUsageChart';\r\nimport { HourlyUsageChart } from '@/components/dashboard/HourlyUsageChart';\r\nimport { ApplicationUsageChart } from '@/components/dashboard/ApplicationUsageChart';\r\n\r\n// Dynamic icon component\r\nfunction DynamicIcon({ name, className }: { name: string; className?: string }) {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) {\r\n return <Star className={className} />;\r\n }\r\n return <IconComponent className={className} />;\r\n}\r\n\r\nexport function UserDashboardPage(): ReactElement {\r\n const { t } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { user } = useAuth();\r\n const { currentTenant } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, loading: favoritesLoading, triggerExpand } = useFavoriteModules();\r\n const [period, setPeriod] = useState<7 | 30 | 90>(30);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const [analytics, setAnalytics] = useState<SessionAnalyticsDto | null>(null);\r\n const [errors, setErrors] = useState<LoginErrorDto[]>([]);\r\n const [currentSession, setCurrentSession] = useState<CurrentSessionDto | null>(null);\r\n const [deviceStats, setDeviceStats] = useState<DeviceStatsDto | null>(null);\r\n const [weeklyStats, setWeeklyStats] = useState<WeeklyStatsDto | null>(null);\r\n const [hourlyStats, setHourlyStats] = useState<HourlyStatsDto | null>(null);\r\n const [appUsage, setAppUsage] = useState<ApplicationUsageDto | null>(null);\r\n\r\n // Resolve favorite route to first section if module has sections (same as FavoritesBar)\r\n const resolveRoute = (module: FavoriteModule): string => {\r\n if (menu) {\r\n for (const app of menu.applications) {\r\n const navModule = app.modules.find(m => m.id === module.id);\r\n if (navModule?.sections?.length) {\r\n const firstSection = [...navModule.sections].sort((a, b) => a.displayOrder - b.displayOrder)[0];\r\n if (firstSection.route) return firstSection.route;\r\n }\r\n }\r\n }\r\n return module.route;\r\n };\r\n\r\n const handleModuleClick = (module: FavoriteModule) => {\r\n const route = resolveRoute(module);\r\n if (route) {\r\n triggerExpand();\r\n navigate(route);\r\n }\r\n };\r\n\r\n const displayName = user?.firstName && user?.lastName\r\n ? `${user.firstName} ${user.lastName}`\r\n : user?.email || 'Utilisateur';\r\n\r\n const loadDashboardData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n // Use aggregated endpoint: 1 API call instead of 7\r\n const data = await userApi.dashboard.getAll(period, 10);\r\n\r\n setAnalytics(data.sessionAnalytics);\r\n setErrors(data.loginErrors ?? []);\r\n setCurrentSession(data.currentSession);\r\n setDeviceStats(data.deviceStats);\r\n setWeeklyStats(data.weeklyStats);\r\n setHourlyStats(data.hourlyStats);\r\n setAppUsage(data.applicationUsage);\r\n } catch {\r\n setAnalytics(null);\r\n setErrors([]);\r\n setCurrentSession(null);\r\n setDeviceStats(null);\r\n setWeeklyStats(null);\r\n setHourlyStats(null);\r\n setAppUsage(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [period]);\r\n\r\n useEffect(() => {\r\n loadDashboardData();\r\n }, [period, loadDashboardData]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('navigation:dashboard.welcome')}, {displayName}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('navigation:breadcrumb.myspace')}</p>\r\n </div>\r\n\r\n {/* Quick Access Favorites */}\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <Star className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n {currentTenant && (\r\n <span className=\"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] px-2 py-1 bg-[var(--bg-secondary)] border border-[var(--border-color)]\" style={{ borderRadius: 'var(--radius-button)' }}>\r\n <Building2 className=\"w-3.5 h-3.5\" />\r\n {currentTenant.name}\r\n </span>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('common:favorites.manage')}\r\n </button>\r\n </div>\r\n\r\n {favoritesLoading && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length === 0 && (\r\n <div className=\"text-center py-8\">\r\n <Star className=\"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('common:favorites.noFavorites')}</p>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"px-4 py-2 bg-[var(--color-accent-600)] text-white font-medium hover:bg-[var(--color-accent-700)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('common:favorites.configureFavorites')}\r\n </button>\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length > 0 && (\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-3\">\r\n {favorites.map((module) => (\r\n <button\r\n key={module.id}\r\n onClick={() => handleModuleClick(module)}\r\n className=\"flex flex-col items-center gap-2 p-4 bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)] transition-all group\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div\r\n className=\"w-12 h-12 flex items-center justify-center bg-[var(--color-accent-100)] text-[var(--color-accent-600)] group-hover:bg-[var(--color-accent-600)] group-hover:text-white transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-6 h-6\" />\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)] text-center\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">{module.applicationLabel}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <StatCard\r\n title={t('navigation:dashboard.stats.totalSessions')}\r\n value={analytics?.totalSessions ?? 0}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n subtitle={`${period} ${t('navigation:dashboard.stats.lastDays')}`}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.avgDuration')}\r\n value={`${Math.round(analytics?.avgSessionDuration ?? 0)} min`}\r\n icon={<TrendingUp className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.perSession')}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.connectionErrors')}\r\n value={(errors ?? []).length}\r\n icon={<AlertTriangle className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.recent')}\r\n color={(errors ?? []).length > 0 ? 'red' : 'green'}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Calendar className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.weeklyUsage.title')}</h2>\r\n </div>\r\n <WeeklyUsageChart data={weeklyStats} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Clock className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.hourlyUsage.title')}</h2>\r\n </div>\r\n <HourlyUsageChart data={hourlyStats} />\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AppWindow className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.applicationUsage.title')}</h2>\r\n </div>\r\n <ApplicationUsageChart data={appUsage} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div className=\"flex items-center gap-3\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.sessionAnalytics.title')}</h2>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {([7, 30, 90] as const).map((p) => (\r\n <button\r\n key={p}\r\n onClick={() => setPeriod(p)}\r\n className={`px-3 py-1 text-sm font-medium transition-colors ${\r\n period === p\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t(`navigation:dashboard.sessionAnalytics.period.${p}days`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <SessionAnalyticsChart data={analytics?.dailyStats ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Monitor className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.currentSession.title')}</h2>\r\n </div>\r\n <CurrentSessionCard session={currentSession} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.loginErrors.title')}</h2>\r\n </div>\r\n <LoginErrorsTable errors={errors ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.deviceStats.title')}</h2>\r\n </div>\r\n <DeviceStatsCard stats={deviceStats} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatCard({\r\n title,\r\n value,\r\n icon,\r\n subtitle,\r\n color = 'blue',\r\n}: {\r\n title: string;\r\n value: string | number;\r\n icon: React.ReactNode;\r\n subtitle?: string;\r\n color?: 'blue' | 'green' | 'red';\r\n}) {\r\n const colorClasses = {\r\n blue: 'bg-blue-50 text-blue-600 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800',\r\n green: 'bg-green-50 text-green-600 border-green-200 dark:bg-green-900/20 dark:border-green-800',\r\n red: 'bg-red-50 text-red-600 border-red-200 dark:bg-red-900/20 dark:border-red-800',\r\n };\r\n\r\n return (\r\n <div\r\n className={`p-4 border ${colorClasses[color]}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {subtitle && <div className=\"text-xs opacity-70 mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n}\r\n"],"names":["SessionAnalyticsChart","data","t","useTranslation","chartData","item","jsx","ResponsiveContainer","jsxs","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","value","name","Legend","Line","LoginErrorsTable","errors","AlertTriangle","isRecent","loginAt","errorDate","error","recent","Fragment","MapPin","Globe","CurrentSessionCard","session","Monitor","formatDuration","minutes","hours","mins","extractBrowserName","userAgent","Clock","DeviceStatsCard","stats","browserColors","countryColors","index","maxCount","b","percentage","c","WeeklyUsageChart","avgDurationPerSession","d","acc","BarChart","ReferenceLine","Bar","HourlyUsageChart","formatHour","hour","entry","Cell","COLORS","ApplicationUsageChart","app","seconds","PieChart","Pie","percent","_name","props","DynamicIcon","className","IconComponent","LucideIcons","Star","UserDashboardPage","navigate","useNavigate","user","useAuth","currentTenant","useTenant","menu","useNavigation","favorites","favoritesLoading","triggerExpand","useFavoriteModules","period","setPeriod","useState","loading","setLoading","analytics","setAnalytics","setErrors","currentSession","setCurrentSession","deviceStats","setDeviceStats","weeklyStats","setWeeklyStats","hourlyStats","setHourlyStats","appUsage","setAppUsage","resolveRoute","module","navModule","m","firstSection","a","handleModuleClick","route","displayName","loadDashboardData","useCallback","userApi","useEffect","Loader2","Building2","Settings","StatCard","Activity","TrendingUp","Calendar","AppWindow","BarChart3","p","title","icon","subtitle","color"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserDashboardPage-Dp6q6FEW.js","sources":["../../src/components/dashboard/SessionAnalyticsChart.tsx","../../src/components/dashboard/LoginErrorsTable.tsx","../../src/components/dashboard/CurrentSessionCard.tsx","../../src/components/dashboard/DeviceStatsCard.tsx","../../src/components/dashboard/WeeklyUsageChart.tsx","../../src/components/dashboard/HourlyUsageChart.tsx","../../src/components/dashboard/ApplicationUsageChart.tsx","../../src/pages/personal/myspace/UserDashboardPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DailySessionStatsDto } from '@/services/api/userApi';\r\n\r\ninterface SessionAnalyticsChartProps {\r\n readonly data: DailySessionStatsDto[];\r\n}\r\n\r\nexport function SessionAnalyticsChart({ data }: SessionAnalyticsChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.sessionAnalytics.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.map(item => ({\r\n date: new Date(item.date).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit' }),\r\n loginCount: item.loginCount,\r\n avgDuration: Math.round(item.avgDuration),\r\n }));\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n yAxisId=\"left\"\r\n stroke=\"var(--color-accent-500)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.connections'), angle: -90, position: 'insideLeft', fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n yAxisId=\"right\"\r\n orientation=\"right\"\r\n stroke=\"#22c55e\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.avgDuration'), angle: 90, position: 'insideRight', fill: 'var(--text-secondary)' }}\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: 'var(--radius-card)',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name: string | undefined) => {\r\n if (name === 'loginCount') return [value, t('dashboard.sessionAnalytics.connections')];\r\n if (name === 'avgDuration') return [`${value} min`, t('dashboard.sessionAnalytics.avgDuration')];\r\n return [value, name || ''];\r\n }}\r\n />\r\n <Legend\r\n wrapperStyle={{ color: 'var(--text-secondary)' }}\r\n formatter={(value: string) => {\r\n if (value === 'loginCount') return t('dashboard.sessionAnalytics.connections');\r\n if (value === 'avgDuration') return t('dashboard.sessionAnalytics.avgDurationMin');\r\n return value;\r\n }}\r\n />\r\n <Line\r\n yAxisId=\"left\"\r\n type=\"monotone\"\r\n dataKey=\"loginCount\"\r\n stroke=\"var(--color-accent-500)\"\r\n strokeWidth={2}\r\n dot={{ fill: 'var(--color-accent-500)', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n <Line\r\n yAxisId=\"right\"\r\n type=\"monotone\"\r\n dataKey=\"avgDuration\"\r\n stroke=\"#22c55e\"\r\n strokeWidth={2}\r\n dot={{ fill: '#22c55e', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n </LineChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { AlertTriangle, MapPin, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { LoginErrorDto } from '@/services/api/userApi';\r\n\r\ninterface LoginErrorsTableProps {\r\n readonly errors: LoginErrorDto[];\r\n}\r\n\r\nexport function LoginErrorsTable({ errors }: LoginErrorsTableProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!Array.isArray(errors) || errors.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mb-3 text-green-500\" />\r\n <p className=\"font-medium\">{t('dashboard.loginErrors.noErrors')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.loginErrors.accountSecure')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const isRecent = (loginAt: string) => {\r\n const errorDate = new Date(loginAt);\r\n const now = new Date();\r\n const hoursDiff = (now.getTime() - errorDate.getTime()) / (1000 * 60 * 60);\r\n return hoursDiff < 24;\r\n };\r\n\r\n return (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.datetime')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.reason')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.ipAddress')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.location')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {errors.map((error) => {\r\n const recent = isRecent(error.loginAt);\r\n return (\r\n <tr\r\n key={error.loginAt}\r\n className={`border-b border-[var(--border-color)] hover:bg-[var(--bg-secondary)] ${\r\n recent ? 'bg-red-50/50 dark:bg-red-900/10' : ''\r\n }`}\r\n >\r\n <td className=\"p-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {recent && (\r\n <span className=\"w-2 h-2 rounded-full bg-red-500 animate-pulse\" title={t('dashboard.loginErrors.recentLabel')} />\r\n )}\r\n <span className=\"text-sm\">\r\n {new Date(error.loginAt).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n })}\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-3\">\r\n <span\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\"\r\n style={{ borderRadius: 'var(--radius-badge)' }}\r\n >\r\n <AlertTriangle className=\"w-3 h-3\" />\r\n {error.failureReason}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n <span className=\"text-sm font-mono text-[var(--text-secondary)]\">\r\n {error.ipAddress || 'N/A'}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n {error.city || error.country ? (\r\n <div className=\"flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n {error.city && (\r\n <>\r\n <MapPin className=\"w-3 h-3\" />\r\n <span>{error.city}</span>\r\n </>\r\n )}\r\n {error.country && (\r\n <>\r\n <Globe className=\"w-3 h-3\" />\r\n <span>{error.country}</span>\r\n </>\r\n )}\r\n </div>\r\n ) : (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">{t('dashboard.loginErrors.notAvailable')}</span>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Clock, MapPin, Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { CurrentSessionDto } from '@/services/api/userApi';\r\n\r\ninterface CurrentSessionCardProps {\r\n readonly session: CurrentSessionDto | null;\r\n}\r\n\r\nexport function CurrentSessionCard({ session }: CurrentSessionCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!session) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <Monitor className=\"w-12 h-12 mb-3 opacity-50\" />\r\n <p className=\"font-medium\">{t('dashboard.currentSession.noActiveSession')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.currentSession.pleaseReconnect')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const formatDuration = (minutes: number): string => {\r\n if (minutes < 1) return \"< 1 minute\";\r\n if (minutes < 60) return `${Math.round(minutes)} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = Math.round(minutes % 60);\r\n if (mins === 0) return `${hours}h`;\r\n return `${hours}h ${mins}min`;\r\n };\r\n\r\n const extractBrowserName = (userAgent: string | null): string => {\r\n if (!userAgent) return t('dashboard.browsers.unknown');\r\n\r\n if (userAgent.includes('Edg/')) return t('dashboard.browsers.edge');\r\n if (userAgent.includes('Chrome/')) return t('dashboard.browsers.chrome');\r\n if (userAgent.includes('Firefox/')) return t('dashboard.browsers.firefox');\r\n if (userAgent.includes('Safari/') && !userAgent.includes('Chrome')) return t('dashboard.browsers.safari');\r\n if (userAgent.includes('OPR/') || userAgent.includes('Opera/')) return t('dashboard.browsers.opera');\r\n\r\n return t('dashboard.browsers.other');\r\n };\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Clock className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.duration')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {formatDuration(session.durationMinutes)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('dashboard.currentSession.since')} {new Date(session.loginAt).toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-blue-500/10 text-blue-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Monitor className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.device')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {extractBrowserName(session.userAgent)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1 font-mono\">\r\n {session.ipAddress || t('dashboard.currentSession.ipNotAvailable')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {(session.city || session.country) && (\r\n <div className=\"md:col-span-2 flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-green-500/10 text-green-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Globe className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.location')}</p>\r\n <div className=\"flex items-center gap-3 mt-1\">\r\n {session.city && (\r\n <div className=\"flex items-center gap-1\">\r\n <MapPin className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{session.city}</span>\r\n </div>\r\n )}\r\n {session.country && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{session.country}</span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DeviceStatsDto } from '@/services/api/userApi';\r\n\r\ninterface DeviceStatsCardProps {\r\n readonly stats: DeviceStatsDto | null;\r\n}\r\n\r\nexport function DeviceStatsCard({ stats }: DeviceStatsCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!stats) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <p>{t('dashboard.deviceStats.noData')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const browserColors = ['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444'];\r\n const countryColors = ['#06b6d4', '#ec4899', '#10b981', '#f97316', '#6366f1'];\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Monitor className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.browsersUsed')}\r\n </h4>\r\n {stats.byBrowser?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byBrowser.map((item, index) => {\r\n const maxCount = Math.max(...stats.byBrowser.map(b => b.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.browser} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.browser}>\r\n {item.browser}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: browserColors[index % browserColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.noData')}</p>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.connectionCountries')}\r\n </h4>\r\n {stats.byCountry?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byCountry.map((item, index) => {\r\n const maxCount = Math.max(...stats.byCountry.map(c => c.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.country} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.country}>\r\n {item.country}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: countryColors[index % countryColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.locationNotAvailable')}</p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ReferenceLine } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { WeeklyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface WeeklyUsageChartProps {\r\n readonly data: WeeklyStatsDto | null;\r\n}\r\n\r\nexport function WeeklyUsageChart({ data }: WeeklyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.dayStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.weeklyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.dayStats.map(item => ({\r\n day: t(`dashboard.days.${item.dayName.toLowerCase()}`),\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n }));\r\n\r\n // Calculate average of averages for the reference line\r\n const avgDurationPerSession = chartData.filter(d => d.sessionCount > 0).length > 0\r\n ? chartData.filter(d => d.sessionCount > 0).reduce((acc, d) => acc + d.duration, 0) / chartData.filter(d => d.sessionCount > 0).length\r\n : 0;\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"day\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.weeklyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <ReferenceLine\r\n y={avgDurationPerSession}\r\n stroke=\"#f59e0b\"\r\n strokeDasharray=\"5 5\"\r\n label={{\r\n value: `${t('dashboard.weeklyUsage.average')}: ${formatDuration(Math.round(avgDurationPerSession))}`,\r\n position: 'right',\r\n fill: '#f59e0b',\r\n fontSize: 11,\r\n }}\r\n />\r\n <Bar\r\n dataKey=\"duration\"\r\n fill=\"var(--color-accent-500)\"\r\n radius={[4, 4, 0, 0]}\r\n />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Cell } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { HourlyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface HourlyUsageChartProps {\r\n readonly data: HourlyStatsDto | null;\r\n}\r\n\r\nexport function HourlyUsageChart({ data }: HourlyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.hourStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.hourlyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const formatHour = (hour: number) => {\r\n return `${hour.toString().padStart(2, '0')}:00`;\r\n };\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.hourStats.map(item => ({\r\n hour: formatHour(item.hour),\r\n hourNum: item.hour,\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n isPeak: item.hour === data.peakHour,\r\n }));\r\n\r\n return (\r\n <div>\r\n <div className=\"flex items-center justify-end mb-2 text-xs text-[var(--text-secondary)]\">\r\n <span className=\"inline-block w-3 h-3 rounded-sm bg-[var(--color-accent-600)] mr-1\" />\r\n {t('dashboard.hourlyUsage.peakHour')}: {formatHour(data.peakHour)}\r\n </div>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 10, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"hour\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 11 }}\r\n interval={0}\r\n angle={-45}\r\n textAnchor=\"end\"\r\n height={60}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.hourlyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <Bar dataKey=\"duration\" radius={[4, 4, 0, 0]}>\r\n {chartData.map((entry, index) => (\r\n <Cell\r\n key={`${entry.hour}-${index}`}\r\n fill={entry.isPeak ? 'var(--color-accent-600)' : 'var(--color-accent-400)'}\r\n />\r\n ))}\r\n </Bar>\r\n </BarChart>\r\n </ResponsiveContainer>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { PieChart, Pie, Cell, Tooltip, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { ApplicationUsageDto } from '@/services/api/userApi';\r\n\r\ninterface ApplicationUsageChartProps {\r\n readonly data: ApplicationUsageDto | null;\r\n}\r\n\r\nconst COLORS = ['#3b82f6', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16', '#f97316', '#6366f1'];\r\n\r\nexport function ApplicationUsageChart({ data }: ApplicationUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.applicationUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.applications.map(app => ({\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n duration: app.totalDurationSeconds,\r\n percentage: app.percentage,\r\n }));\r\n\r\n const formatDuration = (seconds: number) => {\r\n if (seconds < 60) return `${seconds}s`;\r\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`;\r\n return `${Math.round(seconds / 3600)}h`;\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col md:flex-row items-center gap-6\">\r\n <div className=\"w-full md:w-1/2\">\r\n <ResponsiveContainer width=\"100%\" height={280}>\r\n <PieChart>\r\n <Pie\r\n data={chartData}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={60}\r\n outerRadius={90}\r\n dataKey=\"value\"\r\n label={({ name, percent }) => `${name} (${((percent ?? 0) * 100).toFixed(0)}%)`}\r\n labelLine={false}\r\n >\r\n {chartData.map((item, index) => (\r\n <Cell key={`${item.name}-${index}`} fill={COLORS[index % COLORS.length]} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value, _name, props) => [\r\n `${value} ${t('dashboard.applicationUsage.accesses')} (${formatDuration(props.payload.duration)})`,\r\n null,\r\n ]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n <div className=\"w-full md:w-1/2\">\r\n <div className=\"text-sm text-[var(--text-secondary)] mb-3\">\r\n {t('dashboard.applicationUsage.totalAccess')}: <span className=\"font-semibold text-[var(--text-primary)]\">{data.totalAccess}</span>\r\n </div>\r\n <div className=\"space-y-2 max-h-[240px] overflow-y-auto\">\r\n {data.applications.map((app, index) => (\r\n <div\r\n key={app.applicationId}\r\n className=\"flex items-center gap-3 p-2 rounded-[var(--radius-card)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\r\n style={{ backgroundColor: COLORS[index % COLORS.length] }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"text-sm font-medium text-[var(--text-primary)] truncate\">\r\n {app.applicationName}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {app.accessCount} {t('dashboard.applicationUsage.accesses')} - {formatDuration(app.totalDurationSeconds)}\r\n </div>\r\n </div>\r\n <div className=\"text-sm font-semibold text-[var(--text-primary)]\">\r\n {app.percentage}%\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Activity,\r\n TrendingUp,\r\n AlertTriangle,\r\n Monitor,\r\n BarChart3,\r\n Loader2,\r\n Calendar,\r\n Clock,\r\n AppWindow,\r\n Star,\r\n Settings,\r\n Building2,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation } from '@/contexts/NavigationContext';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport type {\r\n SessionAnalyticsDto,\r\n LoginErrorDto,\r\n CurrentSessionDto,\r\n DeviceStatsDto,\r\n WeeklyStatsDto,\r\n HourlyStatsDto,\r\n ApplicationUsageDto,\r\n} from '@/services/api/userApi';\r\nimport { SessionAnalyticsChart } from '@/components/dashboard/SessionAnalyticsChart';\r\nimport { LoginErrorsTable } from '@/components/dashboard/LoginErrorsTable';\r\nimport { CurrentSessionCard } from '@/components/dashboard/CurrentSessionCard';\r\nimport { DeviceStatsCard } from '@/components/dashboard/DeviceStatsCard';\r\nimport { WeeklyUsageChart } from '@/components/dashboard/WeeklyUsageChart';\r\nimport { HourlyUsageChart } from '@/components/dashboard/HourlyUsageChart';\r\nimport { ApplicationUsageChart } from '@/components/dashboard/ApplicationUsageChart';\r\n\r\n// Dynamic icon component\r\nfunction DynamicIcon({ name, className }: { name: string; className?: string }) {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) {\r\n return <Star className={className} />;\r\n }\r\n return <IconComponent className={className} />;\r\n}\r\n\r\nexport function UserDashboardPage(): ReactElement {\r\n const { t } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { user } = useAuth();\r\n const { currentTenant } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, loading: favoritesLoading, triggerExpand } = useFavoriteModules();\r\n const [period, setPeriod] = useState<7 | 30 | 90>(30);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const [analytics, setAnalytics] = useState<SessionAnalyticsDto | null>(null);\r\n const [errors, setErrors] = useState<LoginErrorDto[]>([]);\r\n const [currentSession, setCurrentSession] = useState<CurrentSessionDto | null>(null);\r\n const [deviceStats, setDeviceStats] = useState<DeviceStatsDto | null>(null);\r\n const [weeklyStats, setWeeklyStats] = useState<WeeklyStatsDto | null>(null);\r\n const [hourlyStats, setHourlyStats] = useState<HourlyStatsDto | null>(null);\r\n const [appUsage, setAppUsage] = useState<ApplicationUsageDto | null>(null);\r\n\r\n // Resolve favorite route to first section if module has sections (same as FavoritesBar)\r\n const resolveRoute = (module: FavoriteModule): string => {\r\n if (menu) {\r\n for (const app of menu.applications) {\r\n const navModule = app.modules.find(m => m.id === module.id);\r\n if (navModule?.sections?.length) {\r\n const firstSection = [...navModule.sections].sort((a, b) => a.displayOrder - b.displayOrder)[0];\r\n if (firstSection.route) return firstSection.route;\r\n }\r\n }\r\n }\r\n return module.route;\r\n };\r\n\r\n const handleModuleClick = (module: FavoriteModule) => {\r\n const route = resolveRoute(module);\r\n if (route) {\r\n triggerExpand();\r\n navigate(route);\r\n }\r\n };\r\n\r\n const displayName = user?.firstName && user?.lastName\r\n ? `${user.firstName} ${user.lastName}`\r\n : user?.email || 'Utilisateur';\r\n\r\n const loadDashboardData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n // Use aggregated endpoint: 1 API call instead of 7\r\n const data = await userApi.dashboard.getAll(period, 10);\r\n\r\n setAnalytics(data.sessionAnalytics);\r\n setErrors(data.loginErrors ?? []);\r\n setCurrentSession(data.currentSession);\r\n setDeviceStats(data.deviceStats);\r\n setWeeklyStats(data.weeklyStats);\r\n setHourlyStats(data.hourlyStats);\r\n setAppUsage(data.applicationUsage);\r\n } catch {\r\n setAnalytics(null);\r\n setErrors([]);\r\n setCurrentSession(null);\r\n setDeviceStats(null);\r\n setWeeklyStats(null);\r\n setHourlyStats(null);\r\n setAppUsage(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [period]);\r\n\r\n useEffect(() => {\r\n loadDashboardData();\r\n }, [period, loadDashboardData]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('navigation:dashboard.welcome')}, {displayName}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('navigation:breadcrumb.myspace')}</p>\r\n </div>\r\n\r\n {/* Quick Access Favorites */}\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <Star className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n {currentTenant && (\r\n <span className=\"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] px-2 py-1 bg-[var(--bg-secondary)] border border-[var(--border-color)]\" style={{ borderRadius: 'var(--radius-button)' }}>\r\n <Building2 className=\"w-3.5 h-3.5\" />\r\n {currentTenant.name}\r\n </span>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('common:favorites.manage')}\r\n </button>\r\n </div>\r\n\r\n {favoritesLoading && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length === 0 && (\r\n <div className=\"text-center py-8\">\r\n <Star className=\"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('common:favorites.noFavorites')}</p>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"px-4 py-2 bg-[var(--color-accent-600)] text-white font-medium hover:bg-[var(--color-accent-700)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('common:favorites.configureFavorites')}\r\n </button>\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length > 0 && (\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-3\">\r\n {favorites.map((module) => (\r\n <button\r\n key={module.id}\r\n onClick={() => handleModuleClick(module)}\r\n className=\"flex flex-col items-center gap-2 p-4 bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)] transition-all group\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div\r\n className=\"w-12 h-12 flex items-center justify-center bg-[var(--color-accent-100)] text-[var(--color-accent-600)] group-hover:bg-[var(--color-accent-600)] group-hover:text-white transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-6 h-6\" />\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)] text-center\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">{module.applicationLabel}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <StatCard\r\n title={t('navigation:dashboard.stats.totalSessions')}\r\n value={analytics?.totalSessions ?? 0}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n subtitle={`${period} ${t('navigation:dashboard.stats.lastDays')}`}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.avgDuration')}\r\n value={`${Math.round(analytics?.avgSessionDuration ?? 0)} min`}\r\n icon={<TrendingUp className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.perSession')}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.connectionErrors')}\r\n value={(errors ?? []).length}\r\n icon={<AlertTriangle className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.recent')}\r\n color={(errors ?? []).length > 0 ? 'red' : 'green'}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Calendar className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.weeklyUsage.title')}</h2>\r\n </div>\r\n <WeeklyUsageChart data={weeklyStats} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Clock className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.hourlyUsage.title')}</h2>\r\n </div>\r\n <HourlyUsageChart data={hourlyStats} />\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AppWindow className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.applicationUsage.title')}</h2>\r\n </div>\r\n <ApplicationUsageChart data={appUsage} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div className=\"flex items-center gap-3\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.sessionAnalytics.title')}</h2>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {([7, 30, 90] as const).map((p) => (\r\n <button\r\n key={p}\r\n onClick={() => setPeriod(p)}\r\n className={`px-3 py-1 text-sm font-medium transition-colors ${\r\n period === p\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t(`navigation:dashboard.sessionAnalytics.period.${p}days`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <SessionAnalyticsChart data={analytics?.dailyStats ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Monitor className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.currentSession.title')}</h2>\r\n </div>\r\n <CurrentSessionCard session={currentSession} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.loginErrors.title')}</h2>\r\n </div>\r\n <LoginErrorsTable errors={errors ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.deviceStats.title')}</h2>\r\n </div>\r\n <DeviceStatsCard stats={deviceStats} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatCard({\r\n title,\r\n value,\r\n icon,\r\n subtitle,\r\n color = 'blue',\r\n}: {\r\n title: string;\r\n value: string | number;\r\n icon: React.ReactNode;\r\n subtitle?: string;\r\n color?: 'blue' | 'green' | 'red';\r\n}) {\r\n const colorClasses = {\r\n blue: 'bg-blue-50 text-blue-600 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800',\r\n green: 'bg-green-50 text-green-600 border-green-200 dark:bg-green-900/20 dark:border-green-800',\r\n red: 'bg-red-50 text-red-600 border-red-200 dark:bg-red-900/20 dark:border-red-800',\r\n };\r\n\r\n return (\r\n <div\r\n className={`p-4 border ${colorClasses[color]}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {subtitle && <div className=\"text-xs opacity-70 mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n}\r\n"],"names":["SessionAnalyticsChart","data","t","useTranslation","chartData","item","jsx","ResponsiveContainer","jsxs","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","value","name","Legend","Line","LoginErrorsTable","errors","AlertTriangle","isRecent","loginAt","errorDate","error","recent","Fragment","MapPin","Globe","CurrentSessionCard","session","Monitor","formatDuration","minutes","hours","mins","extractBrowserName","userAgent","Clock","DeviceStatsCard","stats","browserColors","countryColors","index","maxCount","b","percentage","c","WeeklyUsageChart","avgDurationPerSession","d","acc","BarChart","ReferenceLine","Bar","HourlyUsageChart","formatHour","hour","entry","Cell","COLORS","ApplicationUsageChart","app","seconds","PieChart","Pie","percent","_name","props","DynamicIcon","className","IconComponent","LucideIcons","Star","UserDashboardPage","navigate","useNavigate","user","useAuth","currentTenant","useTenant","menu","useNavigation","favorites","favoritesLoading","triggerExpand","useFavoriteModules","period","setPeriod","useState","loading","setLoading","analytics","setAnalytics","setErrors","currentSession","setCurrentSession","deviceStats","setDeviceStats","weeklyStats","setWeeklyStats","hourlyStats","setHourlyStats","appUsage","setAppUsage","resolveRoute","module","navModule","m","firstSection","a","handleModuleClick","route","displayName","loadDashboardData","useCallback","userApi","useEffect","Loader2","Building2","Settings","StatCard","Activity","TrendingUp","Calendar","AppWindow","BarChart3","p","title","icon","subtitle","color"],"mappings":"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"}
|
|
@@ -4,13 +4,13 @@ import { Link as Lt, useNavigate as Ge, useParams as er, useSearchParams as tr }
|
|
|
4
4
|
import { useTranslation as B } from "react-i18next";
|
|
5
5
|
import * as rr from "lucide-react";
|
|
6
6
|
import { AlertCircle as et, X as Ae, Search as ze, ChevronDown as tt, Plus as pe, Loader2 as K, Lock as $t, Users as me, Globe as It, Building2 as xe, Trash2 as Pe, Filter as Ct, Shield as ae, Check as Dt, Star as Ze, Eye as rt, Ban as ar, Info as ft, ChevronRight as yt, FolderOpen as sr, UserCheck as At, User as ye, Database as nr, FileText as ir, Box as lr, Play as or, UserPlus as cr, Edit as dr, LayoutGrid as mr, Table2 as ur, RefreshCw as Oe, AlertTriangle as Nt, CheckCircle as lt, Cloud as Ce, Save as Et, Briefcase as zt, Phone as Vt, MapPin as ot, AtSign as pr, Key as Ve, Edit3 as Gt, Mail as Ot, XCircle as Ut, Bug as xr, EyeOff as hr, Copy as vr, UserX as br, LogOut as ct, Unlock as Tt, Activity as at, Smartphone as kt, Calendar as gr, Monitor as st, Link2 as fr, Crown as yr, History as wt, RotateCcw as Rt, ShieldX as Nr, Boxes as Pt, Layers as wr, AppWindow as Cr, ArrowLeft as Dr } from "lucide-react";
|
|
7
|
-
import { k as M, r as Ar, s as kr, D as Bt, U as Ee, t as Ht, v as Sr, a as Tr, o as Rr, B as Pr, S as pt } from "./index-
|
|
8
|
-
import { T as jr, u as Fr } from "./TenantScopeSelector-
|
|
7
|
+
import { k as M, r as Ar, s as kr, D as Bt, U as Ee, t as Ht, v as Sr, a as Tr, o as Rr, B as Pr, S as pt } from "./index-CpY95_ro.js";
|
|
8
|
+
import { T as jr, u as Fr } from "./TenantScopeSelector-BAoah-mL.js";
|
|
9
9
|
import { g as nt } from "./roleUtils-DlOIxLsd.js";
|
|
10
10
|
import { c as Mr, g as Lr, a as $r, P as Ir, b as Er, d as zr } from "./PermissionPopover-CR6SD8ch.js";
|
|
11
|
-
import { g as xt } from "./groupsApi-
|
|
11
|
+
import { g as xt } from "./groupsApi-BzDV3_Jc.js";
|
|
12
12
|
import { f as ht } from "./formatPhone-CUNTVwt7.js";
|
|
13
|
-
import { T as vt } from "./TenantCard-
|
|
13
|
+
import { T as vt } from "./TenantCard-BUBYWtvR.js";
|
|
14
14
|
const qt = {
|
|
15
15
|
Global: { bg: "bg-[var(--accent-bg)]", text: "text-[var(--color-accent-500)]" },
|
|
16
16
|
Admin: { bg: "bg-[var(--error-bg)]", text: "text-[var(--error-text)]" },
|
|
@@ -4124,4 +4124,4 @@ function Ga() {
|
|
|
4124
4124
|
export {
|
|
4125
4125
|
Ga as UserDetailPage
|
|
4126
4126
|
};
|
|
4127
|
-
//# sourceMappingURL=UserDetailPage-
|
|
4127
|
+
//# sourceMappingURL=UserDetailPage-6grZ6gmV.js.map
|