@atlashub/smartstack 3.21.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserDashboardPage-B53C8fUq.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","colorClasses"],"mappings":"4iBASO,SAASA,EAAsB,CAAE,KAAAC,GAAkD,CACxF,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,YAAY,EAEzC,GAAI,CAACF,GAAQA,EAAK,SAAW,EAC3B,aACG,MAAA,CAAI,UAAU,qEACZ,SAAAC,EAAE,mCAAmC,EACxC,EAIJ,MAAME,EAAYH,EAAK,IAAII,IAAS,CAClC,KAAM,IAAI,KAAKA,EAAK,IAAI,EAAE,mBAAmB,QAAS,CAAE,IAAK,UAAW,MAAO,UAAW,EAC1F,WAAYA,EAAK,WACjB,YAAa,KAAK,MAAMA,EAAK,WAAW,CAAA,EACxC,EAEF,OACEC,MAACC,EAAAA,qBAAoB,MAAM,OAAO,OAAQ,IACxC,SAAAC,OAACC,EAAAA,WAAU,KAAML,EAAW,OAAQ,CAAE,IAAK,EAAG,MAAO,GAAI,KAAM,GAAI,OAAQ,GACzE,SAAA,CAAAE,EAAAA,IAACI,EAAAA,cAAA,CAAc,gBAAgB,MAAM,OAAO,sBAAsB,EAClEJ,EAAAA,IAACK,EAAAA,MAAA,CACC,QAAQ,OACR,OAAO,wBACP,KAAM,CAAE,KAAM,wBAAyB,SAAU,EAAA,CAAG,CAAA,EAEtDL,EAAAA,IAACM,EAAAA,MAAA,CACC,QAAQ,OACR,OAAO,0BACP,KAAM,CAAE,KAAM,wBAAyB,SAAU,EAAA,EACjD,MAAO,CAAE,MAAOV,EAAE,wCAAwC,EAAG,MAAO,IAAK,SAAU,aAAc,KAAM,uBAAA,CAAwB,CAAA,EAEjII,EAAAA,IAACM,EAAAA,MAAA,CACC,QAAQ,QACR,YAAY,QACZ,OAAO,UACP,KAAM,CAAE,KAAM,wBAAyB,SAAU,EAAA,EACjD,MAAO,CAAE,MAAOV,EAAE,wCAAwC,EAAG,MAAO,GAAI,SAAU,cAAe,KAAM,uBAAA,CAAwB,CAAA,EAEjII,EAAAA,IAACO,EAAAA,QAAA,CACC,aAAc,CACZ,gBAAiB,iBACjB,OAAQ,gCACR,aAAc,qBACd,MAAO,qBAAA,EAET,UAAW,CAACC,EAA2BC,IACjCA,IAAS,aAAqB,CAACD,EAAOZ,EAAE,wCAAwC,CAAC,EACjFa,IAAS,cAAsB,CAAC,GAAGD,CAAK,OAAQZ,EAAE,wCAAwC,CAAC,EACxF,CAACY,EAAOC,GAAQ,EAAE,CAC3B,CAAA,EAEFT,EAAAA,IAACU,EAAAA,OAAA,CACC,aAAc,CAAE,MAAO,uBAAA,EACvB,UAAYF,GACNA,IAAU,aAAqBZ,EAAE,wCAAwC,EACzEY,IAAU,cAAsBZ,EAAE,2CAA2C,EAC1EY,CACT,CAAA,EAEFR,EAAAA,IAACW,EAAAA,KAAA,CACC,QAAQ,OACR,KAAK,WACL,QAAQ,aACR,OAAO,0BACP,YAAa,EACb,IAAK,CAAE,KAAM,0BAA2B,EAAG,CAAA,EAC3C,UAAW,CAAE,EAAG,CAAA,CAAE,CAAA,EAEpBX,EAAAA,IAACW,EAAAA,KAAA,CACC,QAAQ,QACR,KAAK,WACL,QAAQ,cACR,OAAO,UACP,YAAa,EACb,IAAK,CAAE,KAAM,UAAW,EAAG,CAAA,EAC3B,UAAW,CAAE,EAAG,CAAA,CAAE,CAAA,CACpB,CAAA,CACF,CAAA,CACF,CAEJ,CCjFO,SAASC,EAAiB,CAAE,OAAAC,GAA+C,CAChF,KAAM,CAAE,EAAAjB,CAAA,EAAMC,EAAAA,eAAe,YAAY,EAEzC,GAAI,CAAC,MAAM,QAAQgB,CAAM,GAAKA,EAAO,SAAW,EAC9C,OACEX,EAAAA,KAAC,MAAA,CAAI,UAAU,8EACb,SAAA,CAAAF,EAAAA,IAACc,EAAAA,cAAA,CAAc,UAAU,+BAAA,CAAgC,QACxD,IAAA,CAAE,UAAU,cAAe,SAAAlB,EAAE,gCAAgC,EAAE,QAC/D,IAAA,CAAE,UAAU,eAAgB,SAAAA,EAAE,qCAAqC,CAAA,CAAE,CAAA,EACxE,EAIJ,MAAMmB,EAAYC,GAAoB,CACpC,MAAMC,EAAY,IAAI,KAAKD,CAAO,EAGlC,WAFgB,KAAA,EACO,QAAA,EAAYC,EAAU,YAAc,IAAO,GAAK,IACpD,EACrB,EAEA,aACG,MAAA,CAAI,UAAU,kBACb,SAAAf,EAAAA,KAAC,QAAA,CAAM,UAAU,SACf,SAAA,CAAAF,MAAC,QAAA,CACC,SAAAE,EAAAA,KAAC,KAAA,CAAG,UAAU,wCACZ,SAAA,CAAAF,MAAC,KAAA,CAAG,UAAU,iEAAkE,SAAAJ,EAAE,wCAAwC,EAAE,QAC3H,KAAA,CAAG,UAAU,iEAAkE,SAAAA,EAAE,sCAAsC,EAAE,QACzH,KAAA,CAAG,UAAU,iEAAkE,SAAAA,EAAE,yCAAyC,EAAE,QAC5H,KAAA,CAAG,UAAU,iEAAkE,SAAAA,EAAE,wCAAwC,CAAA,CAAE,CAAA,CAAA,CAC9H,CAAA,CACF,EACAI,EAAAA,IAAC,QAAA,CACE,SAAAa,EAAO,IAAKK,GAAU,CACrB,MAAMC,EAASJ,EAASG,EAAM,OAAO,EACrC,OACEhB,EAAAA,KAAC,KAAA,CAEC,UAAW,wEACTiB,EAAS,kCAAoC,EAC/C,GAEA,SAAA,CAAAnB,EAAAA,IAAC,MAAG,UAAU,MACZ,SAAAE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAiB,SACE,OAAA,CAAK,UAAU,gDAAgD,MAAOvB,EAAE,mCAAmC,EAAG,EAEjHI,EAAAA,IAAC,OAAA,CAAK,UAAU,UACb,SAAA,IAAI,KAAKkB,EAAM,OAAO,EAAE,mBAAmB,QAAS,CACnD,IAAK,UACL,MAAO,UACP,KAAM,UACN,KAAM,UACN,OAAQ,SAAA,CACT,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,EACAlB,EAAAA,IAAC,KAAA,CAAG,UAAU,MACZ,SAAAE,EAAAA,KAAC,OAAA,CACC,UAAU,4HACV,MAAO,CAAE,aAAc,qBAAA,EAEvB,SAAA,CAAAF,EAAAA,IAACc,EAAAA,cAAA,CAAc,UAAU,SAAA,CAAU,EAClCI,EAAM,aAAA,CAAA,CAAA,EAEX,EACAlB,EAAAA,IAAC,KAAA,CAAG,UAAU,MACZ,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,iDACb,SAAAkB,EAAM,WAAa,KAAA,CACtB,EACF,EACAlB,EAAAA,IAAC,KAAA,CAAG,UAAU,MACX,SAAAkB,EAAM,MAAQA,EAAM,QACnBhB,EAAAA,KAAC,MAAA,CAAI,UAAU,+DACZ,SAAA,CAAAgB,EAAM,MACLhB,EAAAA,KAAAkB,EAAAA,SAAA,CACE,SAAA,CAAApB,EAAAA,IAACqB,EAAAA,OAAA,CAAO,UAAU,SAAA,CAAU,EAC5BrB,EAAAA,IAAC,OAAA,CAAM,SAAAkB,EAAM,IAAA,CAAK,CAAA,EACpB,EAEDA,EAAM,SACLhB,EAAAA,KAAAkB,EAAAA,SAAA,CACE,SAAA,CAAApB,EAAAA,IAACsB,EAAAA,MAAA,CAAM,UAAU,SAAA,CAAU,EAC3BtB,EAAAA,IAAC,OAAA,CAAM,SAAAkB,EAAM,OAAA,CAAQ,CAAA,CAAA,CACvB,CAAA,CAAA,CAEJ,QAEC,OAAA,CAAK,UAAU,sCAAuC,SAAAtB,EAAE,oCAAoC,EAAE,CAAA,CAEnG,CAAA,CAAA,EAtDKsB,EAAM,OAAA,CAyDjB,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CClGO,SAASK,EAAmB,CAAE,QAAAC,GAAkD,CACrF,KAAM,CAAE,EAAA5B,CAAA,EAAMC,EAAAA,eAAe,YAAY,EAEzC,GAAI,CAAC2B,EACH,OACEtB,EAAAA,KAAC,MAAA,CAAI,UAAU,8EACb,SAAA,CAAAF,EAAAA,IAACyB,EAAAA,QAAA,CAAQ,UAAU,2BAAA,CAA4B,QAC9C,IAAA,CAAE,UAAU,cAAe,SAAA7B,EAAE,0CAA0C,EAAE,QACzE,IAAA,CAAE,UAAU,eAAgB,SAAAA,EAAE,0CAA0C,CAAA,CAAE,CAAA,EAC7E,EAIJ,MAAM8B,EAAkBC,GAA4B,CAClD,GAAIA,EAAU,EAAG,MAAO,aACxB,GAAIA,EAAU,GAAI,MAAO,GAAG,KAAK,MAAMA,CAAO,CAAC,WAC/C,MAAMC,EAAQ,KAAK,MAAMD,EAAU,EAAE,EAC/BE,EAAO,KAAK,MAAMF,EAAU,EAAE,EACpC,OAAIE,IAAS,EAAU,GAAGD,CAAK,IACxB,GAAGA,CAAK,KAAKC,CAAI,KAC1B,EAEMC,EAAsBC,GACrBA,EAEDA,EAAU,SAAS,MAAM,EAAUnC,EAAE,yBAAyB,EAC9DmC,EAAU,SAAS,SAAS,EAAUnC,EAAE,2BAA2B,EACnEmC,EAAU,SAAS,UAAU,EAAUnC,EAAE,4BAA4B,EACrEmC,EAAU,SAAS,SAAS,GAAK,CAACA,EAAU,SAAS,QAAQ,EAAUnC,EAAE,2BAA2B,EACpGmC,EAAU,SAAS,MAAM,GAAKA,EAAU,SAAS,QAAQ,EAAUnC,EAAE,0BAA0B,EAE5FA,EAAE,0BAA0B,EARZA,EAAE,4BAA4B,EAWvD,OACEM,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,OAAC,OAAI,UAAU,sDAAsD,MAAO,CAAE,aAAc,sBAC1F,SAAA,CAAAF,EAAAA,IAAC,MAAA,CACC,UAAU,2DACV,MAAO,CAAE,aAAc,sBAAA,EAEvB,SAAAA,EAAAA,IAACgC,EAAAA,MAAA,CAAM,UAAU,SAAA,CAAU,CAAA,CAAA,EAE7B9B,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAF,MAAC,IAAA,CAAE,UAAU,8DAA+D,SAAAJ,EAAE,mCAAmC,EAAE,QAClH,IAAA,CAAE,UAAU,oDACV,SAAA8B,EAAeF,EAAQ,eAAe,EACzC,EACAtB,EAAAA,KAAC,IAAA,CAAE,UAAU,4CACV,SAAA,CAAAN,EAAE,gCAAgC,EAAE,IAAE,IAAI,KAAK4B,EAAQ,OAAO,EAAE,mBAAmB,QAAS,CAAE,KAAM,UAAW,OAAQ,SAAA,CAAW,CAAA,CAAA,CACrI,CAAA,CAAA,CACF,CAAA,EACF,EAEAtB,OAAC,OAAI,UAAU,sDAAsD,MAAO,CAAE,aAAc,sBAC1F,SAAA,CAAAF,EAAAA,IAAC,MAAA,CACC,UAAU,mCACV,MAAO,CAAE,aAAc,sBAAA,EAEvB,SAAAA,EAAAA,IAACyB,EAAAA,QAAA,CAAQ,UAAU,SAAA,CAAU,CAAA,CAAA,EAE/BvB,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAF,MAAC,IAAA,CAAE,UAAU,8DAA+D,SAAAJ,EAAE,iCAAiC,EAAE,QAChH,IAAA,CAAE,UAAU,oDACV,SAAAkC,EAAmBN,EAAQ,SAAS,EACvC,EACAxB,MAAC,KAAE,UAAU,sDACV,WAAQ,WAAaJ,EAAE,yCAAyC,CAAA,CACnE,CAAA,CAAA,CACF,CAAA,EACF,GAEE4B,EAAQ,MAAQA,EAAQ,UACxBtB,EAAAA,KAAC,MAAA,CAAI,UAAU,oEAAoE,MAAO,CAAE,aAAc,oBAAA,EACxG,SAAA,CAAAF,EAAAA,IAAC,MAAA,CACC,UAAU,qCACV,MAAO,CAAE,aAAc,sBAAA,EAEvB,SAAAA,EAAAA,IAACsB,EAAAA,MAAA,CAAM,UAAU,SAAA,CAAU,CAAA,CAAA,EAE7BpB,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAF,MAAC,IAAA,CAAE,UAAU,8DAA+D,SAAAJ,EAAE,mCAAmC,EAAE,EACnHM,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAsB,EAAQ,MACPtB,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAF,EAAAA,IAACqB,EAAAA,OAAA,CAAO,UAAU,sCAAA,CAAuC,EACzDrB,EAAAA,IAAC,OAAA,CAAK,UAAU,iDAAkD,WAAQ,IAAA,CAAK,CAAA,EACjF,EAEDwB,EAAQ,SACPxB,EAAAA,IAAC,QAAK,UAAU,uCAAwC,WAAQ,OAAA,CAAQ,CAAA,CAAA,CAE5E,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,CClGO,SAASiC,EAAgB,CAAE,MAAAC,GAA6C,CAC7E,KAAM,CAAE,EAAAtC,CAAA,EAAMC,EAAAA,eAAe,YAAY,EAEzC,GAAI,CAACqC,EACH,OACElC,EAAAA,IAAC,OAAI,UAAU,qEACb,eAAC,IAAA,CAAG,SAAAJ,EAAE,8BAA8B,CAAA,CAAE,CAAA,CACxC,EAIJ,MAAMuC,EAAgB,CAAC,UAAW,UAAW,UAAW,UAAW,SAAS,EACtEC,EAAgB,CAAC,UAAW,UAAW,UAAW,UAAW,SAAS,EAE5E,OACElC,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,gFACZ,SAAA,CAAAF,EAAAA,IAACyB,EAAAA,QAAA,CAAQ,UAAU,SAAA,CAAU,EAC5B7B,EAAE,oCAAoC,CAAA,EACzC,EACCsC,EAAM,WAAW,OAChBlC,EAAAA,IAAC,MAAA,CAAI,UAAU,YACZ,SAAAkC,EAAM,UAAU,IAAI,CAACnC,EAAMsC,IAAU,CACpC,MAAMC,EAAW,KAAK,IAAI,GAAGJ,EAAM,UAAU,IAAIK,GAAKA,EAAE,KAAK,EAAG,CAAC,EAC3DC,EAAczC,EAAK,MAAQuC,EAAY,IAC7C,OACEpC,EAAAA,KAAC,MAAA,CAAuB,UAAU,0BAChC,SAAA,CAAAF,EAAAA,IAAC,OAAI,UAAU,mDAAmD,MAAOD,EAAK,QAC3E,WAAK,OAAA,CACR,EACAC,EAAAA,IAAC,MAAA,CAAI,UAAU,mEACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,kDACV,MAAO,CACL,MAAO,GAAGwC,CAAU,IACpB,gBAAiBL,EAAcE,EAAQF,EAAc,MAAM,CAAA,CAC7D,CAAA,EAEJ,EACAnC,EAAAA,IAAC,MAAA,CAAI,UAAU,yDACZ,WAAK,KAAA,CACR,CAAA,CAAA,EAfQD,EAAK,OAgBf,CAEJ,CAAC,EACH,EAEAC,EAAAA,IAAC,KAAE,UAAU,uCAAwC,SAAAJ,EAAE,8BAA8B,CAAA,CAAE,CAAA,EAE3F,SAEC,MAAA,CACC,SAAA,CAAAM,EAAAA,KAAC,KAAA,CAAG,UAAU,gFACZ,SAAA,CAAAF,EAAAA,IAACsB,EAAAA,MAAA,CAAM,UAAU,SAAA,CAAU,EAC1B1B,EAAE,2CAA2C,CAAA,EAChD,EACCsC,EAAM,WAAW,OAChBlC,EAAAA,IAAC,MAAA,CAAI,UAAU,YACZ,SAAAkC,EAAM,UAAU,IAAI,CAACnC,EAAMsC,IAAU,CACpC,MAAMC,EAAW,KAAK,IAAI,GAAGJ,EAAM,UAAU,IAAIO,GAAKA,EAAE,KAAK,EAAG,CAAC,EAC3DD,EAAczC,EAAK,MAAQuC,EAAY,IAC7C,OACEpC,EAAAA,KAAC,MAAA,CAAuB,UAAU,0BAChC,SAAA,CAAAF,EAAAA,IAAC,OAAI,UAAU,mDAAmD,MAAOD,EAAK,QAC3E,WAAK,OAAA,CACR,EACAC,EAAAA,IAAC,MAAA,CAAI,UAAU,mEACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,kDACV,MAAO,CACL,MAAO,GAAGwC,CAAU,IACpB,gBAAiBJ,EAAcC,EAAQD,EAAc,MAAM,CAAA,CAC7D,CAAA,EAEJ,EACApC,EAAAA,IAAC,MAAA,CAAI,UAAU,yDACZ,WAAK,KAAA,CACR,CAAA,CAAA,EAfQD,EAAK,OAgBf,CAEJ,CAAC,EACH,EAEAC,EAAAA,IAAC,KAAE,UAAU,uCAAwC,SAAAJ,EAAE,4CAA4C,CAAA,CAAE,CAAA,CAAA,CAEzG,CAAA,EACF,CAEJ,CCzFO,SAAS8C,EAAiB,CAAE,KAAA/C,GAA6C,CAC9E,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,YAAY,EAEzC,GAAI,CAACF,GAAM,UAAU,OACnB,aACG,MAAA,CAAI,UAAU,qEACZ,SAAAC,EAAE,8BAA8B,EACnC,EAKJ,MAAME,EAAYH,EAAK,SAAS,IAAII,IAAS,CAC3C,IAAKH,EAAE,kBAAkBG,EAAK,QAAQ,YAAA,CAAa,EAAE,EACrD,SAAUA,EAAK,aAAe,EAC1B,KAAK,MAAMA,EAAK,cAAgBA,EAAK,YAAY,EACjD,EACJ,aAAcA,EAAK,YAAA,EACnB,EAGI4C,EAAwB7C,EAAU,OAAO8C,GAAKA,EAAE,aAAe,CAAC,EAAE,OAAS,EAC7E9C,EAAU,OAAO8C,GAAKA,EAAE,aAAe,CAAC,EAAE,OAAO,CAACC,EAAK,IAAMA,EAAM,EAAE,SAAU,CAAC,EAAI/C,EAAU,OAAO8C,GAAKA,EAAE,aAAe,CAAC,EAAE,OAC9H,EAEElB,EAAkBC,GAAoB,CAC1C,GAAIA,EAAU,GAAI,MAAO,GAAGA,CAAO,OACnC,MAAMC,EAAQ,KAAK,MAAMD,EAAU,EAAE,EAC/BE,EAAOF,EAAU,GACvB,OAAOE,EAAO,EAAI,GAAGD,CAAK,KAAKC,CAAI,IAAM,GAAGD,CAAK,GACnD,EAEA,OACE5B,MAACC,EAAAA,qBAAoB,MAAM,OAAO,OAAQ,IACxC,SAAAC,OAAC4C,EAAAA,UAAS,KAAMhD,EAAW,OAAQ,CAAE,IAAK,GAAI,MAAO,GAAI,KAAM,GAAI,OAAQ,GACzE,SAAA,CAAAE,EAAAA,IAACI,EAAAA,cAAA,CAAc,gBAAgB,MAAM,OAAO,sBAAsB,EAClEJ,EAAAA,IAACK,EAAAA,MAAA,CACC,QAAQ,MACR,OAAO,wBACP,KAAM,CAAE,KAAM,wBAAyB,SAAU,EAAA,CAAG,CAAA,EAEtDL,EAAAA,IAACM,EAAAA,MAAA,CACC,OAAO,wBACP,KAAM,CAAE,KAAM,wBAAyB,SAAU,EAAA,EACjD,MAAO,CACL,MAAOV,EAAE,gCAAgC,EACzC,MAAO,IACP,SAAU,aACV,KAAM,uBAAA,CACR,CAAA,EAEFI,EAAAA,IAACO,EAAAA,QAAA,CACC,OAAQ,CAAE,KAAM,aAAA,EAChB,aAAc,CACZ,gBAAiB,qBACjB,OAAQ,OACR,aAAc,qBACd,UAAW,iCACX,QAAS,UAAA,EAEX,UAAYC,GAAU,CAACkB,EAAelB,CAAe,EAAG,IAAI,EAC5D,WAAY,CAAE,MAAO,sBAAuB,WAAY,IAAK,aAAc,CAAA,EAC3E,UAAW,CAAE,MAAO,wBAAyB,QAAS,CAAA,EACtD,UAAU,EAAA,CAAA,EAEZR,EAAAA,IAAC+C,EAAAA,cAAA,CACC,EAAGJ,EACH,OAAO,UACP,gBAAgB,MAChB,MAAO,CACL,MAAO,GAAG/C,EAAE,+BAA+B,CAAC,KAAK8B,EAAe,KAAK,MAAMiB,CAAqB,CAAC,CAAC,GAClG,SAAU,QACV,KAAM,UACN,SAAU,EAAA,CACZ,CAAA,EAEF3C,EAAAA,IAACgD,EAAAA,IAAA,CACC,QAAQ,WACR,KAAK,0BACL,OAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,CAAA,CAAA,CACrB,CAAA,CACF,CAAA,CACF,CAEJ,CCpFO,SAASC,EAAiB,CAAE,KAAAtD,GAA6C,CAC9E,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,YAAY,EAEzC,GAAI,CAACF,GAAM,WAAW,OACpB,aACG,MAAA,CAAI,UAAU,qEACZ,SAAAC,EAAE,8BAA8B,EACnC,EAIJ,MAAMsD,EAAcC,GACX,GAAGA,EAAK,SAAA,EAAW,SAAS,EAAG,GAAG,CAAC,MAGtCzB,EAAkBC,GAAoB,CAC1C,GAAIA,EAAU,GAAI,MAAO,GAAGA,CAAO,OACnC,MAAMC,EAAQ,KAAK,MAAMD,EAAU,EAAE,EAC/BE,EAAOF,EAAU,GACvB,OAAOE,EAAO,EAAI,GAAGD,CAAK,KAAKC,CAAI,IAAM,GAAGD,CAAK,GACnD,EAGM9B,EAAYH,EAAK,UAAU,IAAII,IAAS,CAC5C,KAAMmD,EAAWnD,EAAK,IAAI,EAC1B,QAASA,EAAK,KACd,SAAUA,EAAK,aAAe,EAC1B,KAAK,MAAMA,EAAK,cAAgBA,EAAK,YAAY,EACjD,EACJ,aAAcA,EAAK,aACnB,OAAQA,EAAK,OAASJ,EAAK,QAAA,EAC3B,EAEF,cACG,MAAA,CACC,SAAA,CAAAO,EAAAA,KAAC,MAAA,CAAI,UAAU,0EACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,mEAAA,CAAoE,EACnFJ,EAAE,gCAAgC,EAAE,KAAGsD,EAAWvD,EAAK,QAAQ,CAAA,EAClE,EACAK,EAAAA,IAACC,EAAAA,qBAAoB,MAAM,OAAO,OAAQ,IACxC,SAAAC,EAAAA,KAAC4C,EAAAA,UAAS,KAAMhD,EAAW,OAAQ,CAAE,IAAK,GAAI,MAAO,GAAI,KAAM,GAAI,OAAQ,GACzE,SAAA,CAAAE,EAAAA,IAACI,EAAAA,cAAA,CAAc,gBAAgB,MAAM,OAAO,sBAAsB,EAClEJ,EAAAA,IAACK,EAAAA,MAAA,CACC,QAAQ,OACR,OAAO,wBACP,KAAM,CAAE,KAAM,wBAAyB,SAAU,EAAA,EACjD,SAAU,EACV,MAAO,IACP,WAAW,MACX,OAAQ,EAAA,CAAA,EAEVL,EAAAA,IAACM,EAAAA,MAAA,CACC,OAAO,wBACP,KAAM,CAAE,KAAM,wBAAyB,SAAU,EAAA,EACjD,MAAO,CACL,MAAOV,EAAE,gCAAgC,EACzC,MAAO,IACP,SAAU,aACV,KAAM,uBAAA,CACR,CAAA,EAEFI,EAAAA,IAACO,EAAAA,QAAA,CACC,OAAQ,CAAE,KAAM,aAAA,EAChB,aAAc,CACZ,gBAAiB,qBACjB,OAAQ,OACR,aAAc,qBACd,UAAW,iCACX,QAAS,UAAA,EAEX,UAAYC,GAAU,CAACkB,EAAelB,CAAe,EAAG,IAAI,EAC5D,WAAY,CAAE,MAAO,sBAAuB,WAAY,IAAK,aAAc,CAAA,EAC3E,UAAW,CAAE,MAAO,wBAAyB,QAAS,CAAA,EACtD,UAAU,EAAA,CAAA,EAEZR,EAAAA,IAACgD,EAAAA,IAAA,CAAI,QAAQ,WAAW,OAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,EACxC,SAAAlD,EAAU,IAAI,CAACsD,EAAOf,IACrBrC,EAAAA,IAACqD,EAAAA,KAAA,CAEC,KAAMD,EAAM,OAAS,0BAA4B,yBAAA,EAD5C,GAAGA,EAAM,IAAI,IAAIf,CAAK,EAAA,CAG9B,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ,CCvFA,MAAMiB,EAAS,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAErH,SAASC,EAAsB,CAAE,KAAA5D,GAAkD,CACxF,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,YAAY,EAEzC,GAAI,CAACF,GAAM,cAAc,OACvB,aACG,MAAA,CAAI,UAAU,qEACZ,SAAAC,EAAE,mCAAmC,EACxC,EAIJ,MAAME,EAAYH,EAAK,aAAa,IAAI6D,IAAQ,CAC9C,KAAMA,EAAI,gBACV,MAAOA,EAAI,YACX,SAAUA,EAAI,qBACd,WAAYA,EAAI,UAAA,EAChB,EAEI9B,EAAkB+B,GAClBA,EAAU,GAAW,GAAGA,CAAO,IAC/BA,EAAU,KAAa,GAAG,KAAK,MAAMA,EAAU,EAAE,CAAC,IAC/C,GAAG,KAAK,MAAMA,EAAU,IAAI,CAAC,IAGtC,OACEvD,EAAAA,KAAC,MAAA,CAAI,UAAU,+CACb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,kBACb,SAAAA,EAAAA,IAACC,sBAAA,CAAoB,MAAM,OAAO,OAAQ,IACxC,SAAAC,EAAAA,KAACwD,EAAAA,SAAA,CACC,SAAA,CAAA1D,EAAAA,IAAC2D,EAAAA,IAAA,CACC,KAAM7D,EACN,GAAG,MACH,GAAG,MACH,YAAa,GACb,YAAa,GACb,QAAQ,QACR,MAAO,CAAC,CAAE,KAAAW,EAAM,QAAAmD,KAAc,GAAGnD,CAAI,OAAOmD,GAAW,GAAK,KAAK,QAAQ,CAAC,CAAC,KAC3E,UAAW,GAEV,WAAU,IAAI,CAAC7D,EAAMsC,IACpBrC,EAAAA,IAACqD,QAAmC,KAAMC,EAAOjB,EAAQiB,EAAO,MAAM,GAA3D,GAAGvD,EAAK,IAAI,IAAIsC,CAAK,EAAyC,CAC1E,CAAA,CAAA,EAEHrC,EAAAA,IAACO,EAAAA,QAAA,CACC,aAAc,CACZ,gBAAiB,qBACjB,OAAQ,OACR,aAAc,qBACd,UAAW,iCACX,QAAS,UAAA,EAEX,UAAW,CAACC,EAAOqD,EAAOC,IAAU,CAClC,GAAGtD,CAAK,IAAIZ,EAAE,qCAAqC,CAAC,KAAK8B,EAAeoC,EAAM,QAAQ,QAAQ,CAAC,IAC/F,IAAA,EAEF,WAAY,CAAE,MAAO,sBAAuB,WAAY,IAAK,aAAc,CAAA,EAC3E,UAAW,CAAE,MAAO,wBAAyB,QAAS,CAAA,EACtD,UAAU,EAAA,CAAA,CACZ,CAAA,CACF,EACF,EACF,EAEA5D,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACZ,SAAA,CAAAN,EAAE,wCAAwC,EAAE,KAAEI,EAAAA,IAAC,OAAA,CAAK,UAAU,2CAA4C,WAAK,WAAA,CAAY,CAAA,EAC9H,EACAA,EAAAA,IAAC,OAAI,UAAU,0CACZ,WAAK,aAAa,IAAI,CAACwD,EAAKnB,IAC3BnC,EAAAA,KAAC,MAAA,CAEC,UAAU,wGAEV,SAAA,CAAAF,EAAAA,IAAC,MAAA,CACC,UAAU,mCACV,MAAO,CAAE,gBAAiBsD,EAAOjB,EAAQiB,EAAO,MAAM,CAAA,CAAE,CAAA,EAE1DpD,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,0DACZ,SAAAwD,EAAI,gBACP,EACAtD,EAAAA,KAAC,MAAA,CAAI,UAAU,uCACZ,SAAA,CAAAsD,EAAI,YAAY,IAAE5D,EAAE,qCAAqC,EAAE,MAAI8B,EAAe8B,EAAI,oBAAoB,CAAA,CAAA,CACzG,CAAA,EACF,EACAtD,EAAAA,KAAC,MAAA,CAAI,UAAU,mDACZ,SAAA,CAAAsD,EAAI,WAAW,GAAA,CAAA,CAClB,CAAA,CAAA,EAjBKA,EAAI,aAAA,CAmBZ,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CC9DA,SAASO,GAAY,CAAE,KAAAtD,EAAM,UAAAuD,GAAmD,CAE9E,MAAMC,EADQC,EACczD,CAAI,EAChC,OAAKwD,EAGEjE,MAACiE,GAAc,UAAAD,EAAsB,EAFnChE,MAACmE,EAAAA,MAAK,UAAAH,EAAsB,CAGvC,CAEO,SAASI,IAAkC,CAChD,KAAM,CAAE,CAAA,EAAMvE,EAAAA,eAAe,CAAC,aAAc,QAAQ,CAAC,EAC/CwE,EAAWC,EAAAA,YAAA,EACX,CAAE,KAAAC,CAAA,EAASC,UAAA,EACX,CAAE,cAAAC,CAAA,EAAkBC,YAAA,EACpB,CAAE,KAAAC,CAAA,EAASC,gBAAA,EACX,CAAE,UAAAC,EAAW,QAASC,EAAkB,cAAAC,CAAA,EAAkBC,EAAAA,aAAA,EAC1D,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAsB,EAAE,EAC9C,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAI,EAErC,CAACG,EAAWC,CAAY,EAAIJ,EAAAA,SAAqC,IAAI,EACrE,CAACtE,EAAQ2E,CAAS,EAAIL,EAAAA,SAA0B,CAAA,CAAE,EAClD,CAACM,EAAgBC,CAAiB,EAAIP,EAAAA,SAAmC,IAAI,EAC7E,CAACQ,EAAaC,CAAc,EAAIT,EAAAA,SAAgC,IAAI,EACpE,CAACU,EAAaC,CAAc,EAAIX,EAAAA,SAAgC,IAAI,EACpE,CAACY,EAAaC,CAAc,EAAIb,EAAAA,SAAgC,IAAI,EACpE,CAACc,EAAUC,CAAW,EAAIf,EAAAA,SAAqC,IAAI,EAGnEgB,EAAgBC,GAAmC,CACvD,GAAIzB,EACF,UAAWnB,KAAOmB,EAAK,aAAc,CACnC,MAAM0B,EAAY7C,EAAI,QAAQ,QAAU8C,EAAE,KAAOF,EAAO,EAAE,EAC1D,GAAIC,GAAW,UAAU,OAAQ,CAC/B,MAAME,EAAe,CAAC,GAAGF,EAAU,QAAQ,EAAE,KAAK,CAACG,EAAGjE,IAAMiE,EAAE,aAAejE,EAAE,YAAY,EAAE,CAAC,EAC9F,GAAIgE,EAAa,MAAO,OAAOA,EAAa,KAC9C,CACF,CAEF,OAAOH,EAAO,KAChB,EAEMK,EAAqBL,GAA2B,CACpD,MAAMM,EAAQP,EAAaC,CAAM,EAC7BM,IACF3B,EAAA,EACAV,EAASqC,CAAK,EAElB,EAEMC,EAAcpC,GAAM,WAAaA,GAAM,SACzC,GAAGA,EAAK,SAAS,IAAIA,EAAK,QAAQ,GAClCA,GAAM,OAAS,cAEbqC,EAAoBC,EAAAA,YAAY,SAAY,CAChD,GAAI,CACFxB,EAAW,EAAI,EAEf,MAAM1F,EAAO,MAAMmH,EAAAA,QAAQ,UAAU,OAAO7B,EAAQ,EAAE,EAEtDM,EAAa5F,EAAK,gBAAgB,EAClC6F,EAAU7F,EAAK,aAAe,EAAE,EAChC+F,EAAkB/F,EAAK,cAAc,EACrCiG,EAAejG,EAAK,WAAW,EAC/BmG,EAAenG,EAAK,WAAW,EAC/BqG,EAAerG,EAAK,WAAW,EAC/BuG,EAAYvG,EAAK,gBAAgB,CACnC,MAAQ,CACN4F,EAAa,IAAI,EACjBC,EAAU,CAAA,CAAE,EACZE,EAAkB,IAAI,EACtBE,EAAe,IAAI,EACnBE,EAAe,IAAI,EACnBE,EAAe,IAAI,EACnBE,EAAY,IAAI,CAClB,QAAA,CACEb,EAAW,EAAK,CAClB,CACF,EAAG,CAACJ,CAAM,CAAC,EAMX,OAJA8B,EAAAA,UAAU,IAAM,CACdH,EAAA,CACF,EAAG,CAAC3B,EAAQ2B,CAAiB,CAAC,EAE1BxB,EAEApF,MAAC,OAAI,UAAU,iDACb,eAACgH,EAAAA,QAAA,CAAQ,UAAU,sDAAsD,CAAA,CAC3E,EAKF9G,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,gDACX,SAAA,CAAA,EAAE,8BAA8B,EAAE,KAAGyG,CAAA,EACxC,QACC,IAAA,CAAE,UAAU,oCAAqC,SAAA,EAAE,+BAA+B,CAAA,CAAE,CAAA,EACvF,EAGAzG,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAF,EAAAA,IAACmE,EAAAA,KAAA,CAAK,UAAU,wCAAA,CAAyC,QACxD,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,8BAA8B,EAAE,EAC3FM,UACE,OAAA,CAAK,UAAU,uIAAuI,MAAO,CAAE,aAAc,sBAAA,EAC5K,SAAA,CAAAzE,EAAAA,IAACiH,EAAAA,UAAA,CAAU,UAAU,aAAA,CAAc,EAClCxC,EAAc,IAAA,CAAA,CACjB,CAAA,EAEJ,EACAvE,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMmE,EAAS,oCAAoC,EAC5D,UAAU,2JACV,MAAO,CAAE,aAAc,sBAAA,EAEvB,SAAA,CAAArE,EAAAA,IAACkH,EAAAA,SAAA,CAAS,UAAU,SAAA,CAAU,EAC7B,EAAE,yBAAyB,CAAA,CAAA,CAAA,CAC9B,EACF,EAECpC,SACE,MAAA,CAAI,UAAU,wCACb,SAAA9E,EAAAA,IAACgH,EAAAA,QAAA,CAAQ,UAAU,qDAAA,CAAsD,CAAA,CAC3E,EAED,CAAClC,GAAoBD,EAAU,SAAW,GACzC3E,OAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAF,EAAAA,IAACmE,EAAAA,KAAA,CAAK,UAAU,iDAAA,CAAkD,QACjE,IAAA,CAAE,UAAU,oCAAqC,SAAA,EAAE,8BAA8B,EAAE,EACpFnE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMqE,EAAS,oCAAoC,EAC5D,UAAU,qHACV,MAAO,CAAE,aAAc,sBAAA,EAEtB,WAAE,qCAAqC,CAAA,CAAA,CAC1C,EACF,EAED,CAACS,GAAoBD,EAAU,OAAS,GACvC7E,EAAAA,IAAC,MAAA,CAAI,UAAU,uDACZ,SAAA6E,EAAU,IAAKuB,GACdlG,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAMuG,EAAkBL,CAAM,EACvC,UAAU,2LACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAApG,EAAAA,IAAC,MAAA,CACC,UAAU,2LACV,MAAO,CAAE,aAAc,sBAAA,EAEvB,eAAC+D,GAAA,CAAY,KAAMqC,EAAO,KAAM,UAAU,SAAA,CAAU,CAAA,CAAA,EAEtDpG,EAAAA,IAAC,OAAA,CAAK,UAAU,6DAA8D,WAAO,MAAM,EAC3FA,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAoC,WAAO,gBAAA,CAAiB,CAAA,CAAA,EAZvEoG,EAAO,EAAA,CAcf,CAAA,CACH,CAAA,CAAA,CAAA,EAIJlG,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAF,EAAAA,IAACmH,EAAA,CACC,MAAO,EAAE,0CAA0C,EACnD,MAAO7B,GAAW,eAAiB,EACnC,KAAMtF,EAAAA,IAACoH,EAAAA,SAAA,CAAS,UAAU,SAAA,CAAU,EACpC,SAAU,GAAGnC,CAAM,IAAI,EAAE,qCAAqC,CAAC,EAAA,CAAA,EAEjEjF,EAAAA,IAACmH,EAAA,CACC,MAAO,EAAE,wCAAwC,EACjD,MAAO,GAAG,KAAK,MAAM7B,GAAW,oBAAsB,CAAC,CAAC,OACxD,KAAMtF,EAAAA,IAACqH,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,EACtC,SAAU,EAAE,uCAAuC,CAAA,CAAA,EAErDrH,EAAAA,IAACmH,EAAA,CACC,MAAO,EAAE,6CAA6C,EACtD,OAAQtG,GAAU,CAAA,GAAI,OACtB,KAAMb,EAAAA,IAACc,EAAAA,cAAA,CAAc,UAAU,SAAA,CAAU,EACzC,SAAU,EAAE,mCAAmC,EAC/C,OAAQD,GAAU,CAAA,GAAI,OAAS,EAAI,MAAQ,OAAA,CAAA,CAC7C,EACF,EAEAX,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAF,EAAAA,IAACsH,EAAAA,SAAA,CAAS,UAAU,sCAAA,CAAuC,QAC1D,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,wCAAwC,CAAA,CAAE,CAAA,EACxG,EACAtH,EAAAA,IAAC0C,EAAA,CAAiB,KAAMmD,CAAA,CAAa,CAAA,CAAA,CAAA,EAGvC3F,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAF,EAAAA,IAACgC,EAAAA,MAAA,CAAM,UAAU,sCAAA,CAAuC,QACvD,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,wCAAwC,CAAA,CAAE,CAAA,EACxG,EACAhC,EAAAA,IAACiD,EAAA,CAAiB,KAAM8C,CAAA,CAAa,CAAA,CAAA,CAAA,CACvC,EACF,EAEA7F,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAF,EAAAA,IAACuH,EAAAA,UAAA,CAAU,UAAU,sCAAA,CAAuC,QAC3D,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,6CAA6C,CAAA,CAAE,CAAA,EAC7G,EACAvH,EAAAA,IAACuD,EAAA,CAAsB,KAAM0C,CAAA,CAAU,CAAA,CAAA,CAAA,EAGzC/F,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAF,EAAAA,IAACwH,EAAAA,UAAA,CAAU,UAAU,sCAAA,CAAuC,QAC3D,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,6CAA6C,CAAA,CAAE,CAAA,EAC7G,EACAxH,EAAAA,IAAC,MAAA,CAAI,UAAU,aACX,SAAA,CAAC,EAAG,GAAI,EAAE,EAAY,IAAKyH,GAC3BzH,EAAAA,IAAC,SAAA,CAEC,QAAS,IAAMkF,EAAUuC,CAAC,EAC1B,UAAW,mDACTxC,IAAWwC,EACP,0CACA,qFACN,GACA,MAAO,CAAE,aAAc,sBAAA,EAEtB,SAAA,EAAE,gDAAgDA,CAAC,MAAM,CAAA,EATrDA,CAAA,CAWR,CAAA,CACH,CAAA,EACF,QACC/H,EAAA,CAAsB,KAAM4F,GAAW,YAAc,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,EAG5DpF,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAF,EAAAA,IAACyB,EAAAA,QAAA,CAAQ,UAAU,sCAAA,CAAuC,QACzD,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,2CAA2C,CAAA,CAAE,CAAA,EAC3G,EACAzB,EAAAA,IAACuB,EAAA,CAAmB,QAASkE,CAAA,CAAgB,CAAA,CAAA,CAAA,EAG/CvF,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAF,EAAAA,IAACc,EAAAA,cAAA,CAAc,UAAU,sCAAA,CAAuC,QAC/D,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,wCAAwC,CAAA,CAAE,CAAA,EACxG,EACAd,EAAAA,IAACY,EAAA,CAAiB,OAAQC,GAAU,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,EAG1CX,EAAAA,KAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAF,EAAAA,IAACwH,EAAAA,UAAA,CAAU,UAAU,sCAAA,CAAuC,QAC3D,KAAA,CAAG,UAAU,2CAA4C,SAAA,EAAE,wCAAwC,CAAA,CAAE,CAAA,EACxG,EACAxH,EAAAA,IAACiC,EAAA,CAAgB,MAAO0D,CAAA,CAAa,CAAA,CAAA,CAAA,CACvC,EACF,CAEJ,CAEA,SAASwB,EAAS,CAChB,MAAAO,EACA,MAAAlH,EACA,KAAAmH,EACA,SAAAC,EACA,MAAAC,EAAQ,MACV,EAMG,CACD,MAAMC,EAAe,CACnB,KAAM,oFACN,MAAO,yFACP,IAAK,8EAAA,EAGP,OACE5H,EAAAA,KAAC,MAAA,CACC,UAAW,cAAc4H,EAAaD,CAAK,CAAC,GAC5C,MAAO,CAAE,aAAc,oBAAA,EAEvB,SAAA,CAAA3H,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,iCAAkC,SAAA0H,EAAM,EACvDC,CAAA,EACH,EACA3H,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAsB,SAAAQ,EAAM,EAC1CoH,GAAY5H,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAA4H,CAAA,CAAS,CAAA,CAAA,CAAA,CAGtE"}
|
|
1
|
+
{"version":3,"file":"UserDashboardPage-KLB5CQP5.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","colorClasses"],"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-lpIzhufD.js";
|
|
8
|
+
import { T as jr, u as Fr } from "./TenantScopeSelector-BWfYxvEa.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-QzXI-5xu.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-BbSYk9_Z.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-U7smBQoF.js.map
|