@atlashub/smartstack 3.39.0-preview.1049 → 3.40.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-DgqyaZwI.js → AgentSkillsPage-BS_W2KTh.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js.map → AgentSkillsPage-BS_W2KTh.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js → AgentSkillsPage-CmDFLnp7.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js.map → AgentSkillsPage-CmDFLnp7.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js → AgentWorkloadPage-C8IvYfhT.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js.map → AgentWorkloadPage-C8IvYfhT.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js → AgentWorkloadPage-JXsQbwuM.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js.map → AgentWorkloadPage-JXsQbwuM.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js → ApiCatalogDetailPage-CYOt34Vy.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js.map → ApiCatalogDetailPage-CYOt34Vy.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js → ApiCatalogDetailPage-wFZDsTGy.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js.map → ApiCatalogDetailPage-wFZDsTGy.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js → ApiCatalogPage-Bdm3HNGP.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js.map → ApiCatalogPage-Bdm3HNGP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js → ApiCatalogPage-m_TWQyGv.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js.map → ApiCatalogPage-m_TWQyGv.js.map} +1 -1
- package/dist/chunks/ApplicationDetailPage-C2BSpEoW.js +2 -0
- package/dist/chunks/{ApplicationDetailPage-CWdz0TS4.js.map → ApplicationDetailPage-C2BSpEoW.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js → ApplicationDetailPage-CcgDAP-J.js} +503 -501
- package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js.map → ApplicationDetailPage-CcgDAP-J.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js → ApplicationsDashboardPage-CDIjziL3.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js.map → ApplicationsDashboardPage-CDIjziL3.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js → ApplicationsDashboardPage-DslDyNzJ.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js.map → ApplicationsDashboardPage-DslDyNzJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js → ApplicationsGridPage-BCjsQGU0.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js.map → ApplicationsGridPage-BCjsQGU0.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js → ApplicationsGridPage-CIfKiCND.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js.map → ApplicationsGridPage-CIfKiCND.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js → ApplicationsListPage-CT75kNcH.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js.map → ApplicationsListPage-CT75kNcH.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js → ApplicationsListPage-D2B4PZ5n.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js.map → ApplicationsListPage-D2B4PZ5n.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BqfNR-kc.js → ApplicationsPage-CaTBtduL.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BqfNR-kc.js.map → ApplicationsPage-CaTBtduL.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DuxuWfrN.js → ApplicationsPage-DW1LhL0U.js} +4 -4
- package/dist/chunks/{ApplicationsPage-DuxuWfrN.js.map → ApplicationsPage-DW1LhL0U.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js → AssignmentRulesPage-Bt9M0ki7.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js.map → AssignmentRulesPage-Bt9M0ki7.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js → AssignmentRulesPage-Y7xv60NY.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js.map → AssignmentRulesPage-Y7xv60NY.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-v8QUJkE7.js → AssignmentsPage-1eQGTjTi.js} +2 -2
- package/dist/chunks/{AssignmentsPage-v8QUJkE7.js.map → AssignmentsPage-1eQGTjTi.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-CjuGAd8n.js → AssignmentsPage-RURdPvfZ.js} +2 -2
- package/dist/chunks/{AssignmentsPage-CjuGAd8n.js.map → AssignmentsPage-RURdPvfZ.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js → AuthCallbackPage-8hF0jYlK.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js.map → AuthCallbackPage-8hF0jYlK.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-CuS-efzY.js → AuthCallbackPage-DPL68Asu.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-CuS-efzY.js.map → AuthCallbackPage-DPL68Asu.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js → ConfirmEmailPage-BKlpZkVk.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js.map → ConfirmEmailPage-BKlpZkVk.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js → ConfirmEmailPage-CawSZypI.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js.map → ConfirmEmailPage-CawSZypI.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js → CreateSupportTicketPage-AwbMbBIH.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js.map → CreateSupportTicketPage-AwbMbBIH.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js → CreateSupportTicketPage-Dg1YW1eA.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js.map → CreateSupportTicketPage-Dg1YW1eA.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B4Pi5P3O.js → DashboardPage-B4YxOF-9.js} +3 -3
- package/dist/chunks/{DashboardPage-B4Pi5P3O.js.map → DashboardPage-B4YxOF-9.js.map} +1 -1
- package/dist/chunks/{DashboardPage-wEKZ_DWf.js → DashboardPage-BZxjinar.js} +2 -2
- package/dist/chunks/{DashboardPage-wEKZ_DWf.js.map → DashboardPage-BZxjinar.js.map} +1 -1
- package/dist/chunks/{DashboardPage-BAqpoxCW.js → DashboardPage-Bo09y8r7.js} +3 -3
- package/dist/chunks/{DashboardPage-BAqpoxCW.js.map → DashboardPage-Bo09y8r7.js.map} +1 -1
- package/dist/chunks/{DashboardPage-BT5kFaQA.js → DashboardPage-Cq5adDjP.js} +2 -2
- package/dist/chunks/{DashboardPage-BT5kFaQA.js.map → DashboardPage-Cq5adDjP.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-4pF38E4N.js → EscalationConfigPage-C8Hv5naz.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-4pF38E4N.js.map → EscalationConfigPage-C8Hv5naz.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js → EscalationConfigPage-DNAqMRxA.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js.map → EscalationConfigPage-DNAqMRxA.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js → ForceChangePasswordPage-BURE_vNg.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js.map → ForceChangePasswordPage-BURE_vNg.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js → ForceChangePasswordPage-C6jDZshk.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js.map → ForceChangePasswordPage-C6jDZshk.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js → ForgotPasswordPage-C5HLYbz4.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js.map → ForgotPasswordPage-C5HLYbz4.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js → ForgotPasswordPage-D3ZQBtjd.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js.map → ForgotPasswordPage-D3ZQBtjd.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-dXNOoSXE.js → GroupDetailPage-CTuzp9Vp.js} +5 -5
- package/dist/chunks/{GroupDetailPage-dXNOoSXE.js.map → GroupDetailPage-CTuzp9Vp.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-BIgBzQk0.js → GroupDetailPage-NJc2zCxC.js} +2 -2
- package/dist/chunks/{GroupDetailPage-BIgBzQk0.js.map → GroupDetailPage-NJc2zCxC.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js → MyAccessRequestsPage-Cvr29Pnq.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js.map → MyAccessRequestsPage-Cvr29Pnq.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js → MyAccessRequestsPage-t6I24rHN.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js.map → MyAccessRequestsPage-t6I24rHN.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BXx1nPC8.js → MyTenantsPage-Dy2RZ_Ei.js} +2 -2
- package/dist/chunks/{MyTenantsPage-BXx1nPC8.js.map → MyTenantsPage-Dy2RZ_Ei.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js → MyTenantsPage-SvDCQ4Wt.js} +3 -3
- package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js.map → MyTenantsPage-SvDCQ4Wt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-C9MSmmR5.js → MyTicketsPage-C3lEBFD9.js} +2 -2
- package/dist/chunks/{MyTicketsPage-C9MSmmR5.js.map → MyTicketsPage-C3lEBFD9.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-d0PoJpnX.js → MyTicketsPage-DydDgFyz.js} +2 -2
- package/dist/chunks/{MyTicketsPage-d0PoJpnX.js.map → MyTicketsPage-DydDgFyz.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js → NavigationAppsPage-Dyv767w8.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js.map → NavigationAppsPage-Dyv767w8.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-8t2xbddT.js → NavigationAppsPage-WqSspaVo.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-8t2xbddT.js.map → NavigationAppsPage-WqSspaVo.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-_62-bmuk.js → NotificationsPage-Di4I95PM.js} +2 -2
- package/dist/chunks/{NotificationsPage-_62-bmuk.js.map → NotificationsPage-Di4I95PM.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-CLHfVUxm.js → NotificationsPage-elSovpBw.js} +2 -2
- package/dist/chunks/{NotificationsPage-CLHfVUxm.js.map → NotificationsPage-elSovpBw.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js → OnboardingWizardPage-fdWdkwiT.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js.map → OnboardingWizardPage-fdWdkwiT.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js → OnboardingWizardPage-nPLe2buQ.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js.map → OnboardingWizardPage-nPLe2buQ.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js → PermissionDetailPage-B8C7tWFP.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js.map → PermissionDetailPage-B8C7tWFP.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js → PermissionDetailPage-IUgUaTkE.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js.map → PermissionDetailPage-IUgUaTkE.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-Xb92YAHn.js → PermissionsPage-CmX5sQf2.js} +2 -2
- package/dist/chunks/{PermissionsPage-Xb92YAHn.js.map → PermissionsPage-CmX5sQf2.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-B0M4gA5m.js → PermissionsPage-Kg0rduOM.js} +2 -2
- package/dist/chunks/{PermissionsPage-B0M4gA5m.js.map → PermissionsPage-Kg0rduOM.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DTeMESj9.js → PortalDashboardPage-CCAYuhtI.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DTeMESj9.js.map → PortalDashboardPage-CCAYuhtI.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-pt9hipR4.js → PortalDashboardPage-Dme1XmzN.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-pt9hipR4.js.map → PortalDashboardPage-Dme1XmzN.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Cy30AWIN.js → PreferencesPage-Ct6xWAFp.js} +2 -2
- package/dist/chunks/{PreferencesPage-Cy30AWIN.js.map → PreferencesPage-Ct6xWAFp.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-CsHVGMgp.js → PreferencesPage-Db2RjMpm.js} +2 -2
- package/dist/chunks/{PreferencesPage-CsHVGMgp.js.map → PreferencesPage-Db2RjMpm.js.map} +1 -1
- package/dist/chunks/{ProfilePage-6Gf7igUI.js → ProfilePage-D6Xb1ALH.js} +2 -2
- package/dist/chunks/{ProfilePage-6Gf7igUI.js.map → ProfilePage-D6Xb1ALH.js.map} +1 -1
- package/dist/chunks/{ProfilePage-BzBWkztf.js → ProfilePage-DN2s-lfp.js} +2 -2
- package/dist/chunks/{ProfilePage-BzBWkztf.js.map → ProfilePage-DN2s-lfp.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js → ReferencesManagementPage-B5mcshG1.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js.map → ReferencesManagementPage-B5mcshG1.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js → ReferencesManagementPage-DB975ktX.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js.map → ReferencesManagementPage-DB975ktX.js.map} +1 -1
- package/dist/chunks/{RegisterPage-asdx33fV.js → RegisterPage-ZskZrLZH.js} +2 -2
- package/dist/chunks/{RegisterPage-asdx33fV.js.map → RegisterPage-ZskZrLZH.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CIPHRYkl.js → RegisterPage-b8yIPVgh.js} +2 -2
- package/dist/chunks/{RegisterPage-CIPHRYkl.js.map → RegisterPage-b8yIPVgh.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js → ResetPasswordPage-CeAvfsE-.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js.map → ResetPasswordPage-CeAvfsE-.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js → ResetPasswordPage-Dzp5dCp8.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js.map → ResetPasswordPage-Dzp5dCp8.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Cs6T441o.js → ResolutionModal-CRVN7gHv.js} +2 -2
- package/dist/chunks/{ResolutionModal-Cs6T441o.js.map → ResolutionModal-CRVN7gHv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-rLoFOxm9.js → ResolutionModal-DJOw1sLT.js} +2 -2
- package/dist/chunks/{ResolutionModal-rLoFOxm9.js.map → ResolutionModal-DJOw1sLT.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js → RoleDetailPage-CLVoFVF8.js} +2 -2
- package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js.map → RoleDetailPage-CLVoFVF8.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CNFG6j6P.js → RoleDetailPage-XGnPD_8C.js} +3 -3
- package/dist/chunks/{RoleDetailPage-CNFG6j6P.js.map → RoleDetailPage-XGnPD_8C.js.map} +1 -1
- package/dist/chunks/{RolesPage-BHEkMR2O.js → RolesPage-BnAMpR2b.js} +2 -2
- package/dist/chunks/{RolesPage-BHEkMR2O.js.map → RolesPage-BnAMpR2b.js.map} +1 -1
- package/dist/chunks/{RolesPage-D35jwDJU.js → RolesPage-Czj9LMkL.js} +2 -2
- package/dist/chunks/{RolesPage-D35jwDJU.js.map → RolesPage-Czj9LMkL.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DtonDehw.js → SlaConfigPage-HM0MpIlg.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DtonDehw.js.map → SlaConfigPage-HM0MpIlg.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-C5Jstix-.js → SlaConfigPage-ZRyAs8aY.js} +2 -2
- package/dist/chunks/{SlaConfigPage-C5Jstix-.js.map → SlaConfigPage-ZRyAs8aY.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js → SupportPermissionsPage-CxJuGgcQ.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js.map → SupportPermissionsPage-CxJuGgcQ.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js → SupportPermissionsPage-DNd323OK.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js.map → SupportPermissionsPage-DNd323OK.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DjmYOGEC.js → TemplatesPage-CdwPLsHj.js} +2 -2
- package/dist/chunks/{TemplatesPage-DjmYOGEC.js.map → TemplatesPage-CdwPLsHj.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DlY91VO_.js → TemplatesPage-Co3ygZvF.js} +2 -2
- package/dist/chunks/{TemplatesPage-DlY91VO_.js.map → TemplatesPage-Co3ygZvF.js.map} +1 -1
- package/dist/chunks/{TenantCard-BHLcv2gD.js → TenantCard-CmCfIK2F.js} +2 -2
- package/dist/chunks/{TenantCard-BHLcv2gD.js.map → TenantCard-CmCfIK2F.js.map} +1 -1
- package/dist/chunks/{TenantCard-DGCKVvKI.js → TenantCard-DI66acce.js} +2 -2
- package/dist/chunks/{TenantCard-DGCKVvKI.js.map → TenantCard-DI66acce.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js → TenantScopeSelector-5NOwmFX2.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js.map → TenantScopeSelector-5NOwmFX2.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js → TenantScopeSelector-CEFgxiWt.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js.map → TenantScopeSelector-CEFgxiWt.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BQHMaRmq.js → TicketDetailPage-BhZ-mpv7.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BQHMaRmq.js.map → TicketDetailPage-BhZ-mpv7.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js → TicketDetailPage-BxOiOG22.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js.map → TicketDetailPage-BxOiOG22.js.map} +1 -1
- package/dist/chunks/{TicketsPage-CufUJctx.js → TicketsPage-BiTvIcM8.js} +2 -2
- package/dist/chunks/{TicketsPage-CufUJctx.js.map → TicketsPage-BiTvIcM8.js.map} +1 -1
- package/dist/chunks/{TicketsPage-C8QQ4SKy.js → TicketsPage-CSiinHME.js} +2 -2
- package/dist/chunks/{TicketsPage-C8QQ4SKy.js.map → TicketsPage-CSiinHME.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js → UserCreateTicketPage-B3TW1oV7.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js.map → UserCreateTicketPage-B3TW1oV7.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js → UserCreateTicketPage-BszUd_WZ.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js.map → UserCreateTicketPage-BszUd_WZ.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-fdhZwMLg.js → UserDashboardPage-C6MvatAb.js} +2 -2
- package/dist/chunks/{UserDashboardPage-fdhZwMLg.js.map → UserDashboardPage-C6MvatAb.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BV1d2hMG.js → UserDashboardPage-Dtt9VzG_.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BV1d2hMG.js.map → UserDashboardPage-Dtt9VzG_.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-C97e-Dax.js → UserDetailPage-BEEV2vlJ.js} +5 -5
- package/dist/chunks/{UserDetailPage-C97e-Dax.js.map → UserDetailPage-BEEV2vlJ.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BcA7Vhb2.js → UserDetailPage-Dw5OHheZ.js} +2 -2
- package/dist/chunks/{UserDetailPage-BcA7Vhb2.js.map → UserDetailPage-Dw5OHheZ.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js → UserTicketDetailPage-B4YkzzbR.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js.map → UserTicketDetailPage-B4YkzzbR.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js → UserTicketDetailPage-DCFV-0ny.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js.map → UserTicketDetailPage-DCFV-0ny.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js → UsersGroupsPage-CY-l9fTp.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js.map → UsersGroupsPage-CY-l9fTp.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js → UsersGroupsPage-c28vYHN9.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js.map → UsersGroupsPage-c28vYHN9.js.map} +1 -1
- package/dist/chunks/{UsersPage-BIXWHFmG.js → UsersPage-1sLlq9QD.js} +2 -2
- package/dist/chunks/{UsersPage-BIXWHFmG.js.map → UsersPage-1sLlq9QD.js.map} +1 -1
- package/dist/chunks/{UsersPage-DS8aWUKj.js → UsersPage-Bm-uNxh0.js} +2 -2
- package/dist/chunks/{UsersPage-DS8aWUKj.js.map → UsersPage-Bm-uNxh0.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-C-r0mrCH.js → accessRequestsApi-CJPjyEkH.js} +2 -2
- package/dist/chunks/{accessRequestsApi-C-r0mrCH.js.map → accessRequestsApi-CJPjyEkH.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js → accessRequestsApi-D_pj1wl6.js} +2 -2
- package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js.map → accessRequestsApi-D_pj1wl6.js.map} +1 -1
- package/dist/chunks/{aiApi-B-H-76wM.js → aiApi-ByF-oo1J.js} +2 -2
- package/dist/chunks/{aiApi-B-H-76wM.js.map → aiApi-ByF-oo1J.js.map} +1 -1
- package/dist/chunks/{aiApi-CcdrBILv.js → aiApi-Dt3fj0dU.js} +2 -2
- package/dist/chunks/{aiApi-CcdrBILv.js.map → aiApi-Dt3fj0dU.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js → applicationAnalyticsApi-BgG3SGJm.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js.map → applicationAnalyticsApi-BgG3SGJm.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js → applicationAnalyticsApi-ktD65iLO.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js.map → applicationAnalyticsApi-ktD65iLO.js.map} +1 -1
- package/dist/chunks/{groupsApi-DExOJZPF.js → groupsApi-C-FLWPCO.js} +2 -2
- package/dist/chunks/{groupsApi-DExOJZPF.js.map → groupsApi-C-FLWPCO.js.map} +1 -1
- package/dist/chunks/{groupsApi-CyqyYsmi.js → groupsApi-CBI5vMLa.js} +2 -2
- package/dist/chunks/{groupsApi-CyqyYsmi.js.map → groupsApi-CBI5vMLa.js.map} +1 -1
- package/dist/chunks/{index-DtAReZI6.js → index-B727-QSU.js} +2 -2
- package/dist/chunks/{index-DtAReZI6.js.map → index-B727-QSU.js.map} +1 -1
- package/dist/chunks/{index-BlOgmQzc.js → index-B9q3vx13.js} +2 -2
- package/dist/chunks/{index-BlOgmQzc.js.map → index-B9q3vx13.js.map} +1 -1
- package/dist/chunks/{index-VSQ2prtJ.js → index-BD-REzV9.js} +2 -2
- package/dist/chunks/{index-VSQ2prtJ.js.map → index-BD-REzV9.js.map} +1 -1
- package/dist/chunks/{index-XOOiD_zY.js → index-BDRogQH_.js} +3 -3
- package/dist/chunks/{index-XOOiD_zY.js.map → index-BDRogQH_.js.map} +1 -1
- package/dist/chunks/{index-DOQyf5yZ.js → index-C-DYxdvd.js} +8 -8
- package/dist/chunks/{index-DOQyf5yZ.js.map → index-C-DYxdvd.js.map} +1 -1
- package/dist/chunks/{index-Cq80YBne.js → index-CBtjGPod.js} +105 -105
- package/dist/chunks/{index-Cq80YBne.js.map → index-CBtjGPod.js.map} +1 -1
- package/dist/chunks/{index-dlXYTPWH.js → index-CF1cvNUL.js} +4 -4
- package/dist/chunks/{index-dlXYTPWH.js.map → index-CF1cvNUL.js.map} +1 -1
- package/dist/chunks/{index-COA_xJVJ.js → index-CH0pTHy1.js} +2 -2
- package/dist/chunks/{index-COA_xJVJ.js.map → index-CH0pTHy1.js.map} +1 -1
- package/dist/chunks/{index-DjZQ6ZG_.js → index-Ca88RIuT.js} +2 -2
- package/dist/chunks/{index-DjZQ6ZG_.js.map → index-Ca88RIuT.js.map} +1 -1
- package/dist/chunks/{index-Cj-9tGpd.js → index-CkWvsvKW.js} +2 -2
- package/dist/chunks/{index-Cj-9tGpd.js.map → index-CkWvsvKW.js.map} +1 -1
- package/dist/chunks/{index-EL_ZNnMH.js → index-CzYKE5fL.js} +2 -2
- package/dist/chunks/{index-EL_ZNnMH.js.map → index-CzYKE5fL.js.map} +1 -1
- package/dist/chunks/{index-qXfYaEmV.js → index-D32ol7lq.js} +2 -2
- package/dist/chunks/{index-qXfYaEmV.js.map → index-D32ol7lq.js.map} +1 -1
- package/dist/chunks/{index-DMQQ0KyA.js → index-D7hmx9IX.js} +2 -2
- package/dist/chunks/{index-DMQQ0KyA.js.map → index-D7hmx9IX.js.map} +1 -1
- package/dist/chunks/{index-BetDcNZm.js → index-DThcQmwZ.js} +2 -2
- package/dist/chunks/{index-BetDcNZm.js.map → index-DThcQmwZ.js.map} +1 -1
- package/dist/chunks/{index-C7h5yvcP.js → index-D_3J6ziZ.js} +2 -2
- package/dist/chunks/{index-C7h5yvcP.js.map → index-D_3J6ziZ.js.map} +1 -1
- package/dist/chunks/{index-C_nDTEP5.js → index-JSjfMShT.js} +2 -2
- package/dist/chunks/{index-C_nDTEP5.js.map → index-JSjfMShT.js.map} +1 -1
- package/dist/chunks/{index-COXxU0FH.js → index-gzXJw_ow.js} +3 -3
- package/dist/chunks/{index-COXxU0FH.js.map → index-gzXJw_ow.js.map} +1 -1
- package/dist/chunks/{index-jJxtz2bs.js → index-rRAbl04H.js} +2 -2
- package/dist/chunks/{index-jJxtz2bs.js.map → index-rRAbl04H.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-Ddvguo0l.js → tenantIconMap-Cw-hQ9n4.js} +2 -2
- package/dist/chunks/{tenantIconMap-Ddvguo0l.js.map → tenantIconMap-Cw-hQ9n4.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DBa5MjIz.js → tenantIconMap-DinwojNW.js} +2 -2
- package/dist/chunks/{tenantIconMap-DBa5MjIz.js.map → tenantIconMap-DinwojNW.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Cr6QSv0g.js → ticketingApi-CcWdebXv.js} +2 -2
- package/dist/chunks/{ticketingApi-Cr6QSv0g.js.map → ticketingApi-CcWdebXv.js.map} +1 -1
- package/dist/chunks/{ticketingApi-D6s75rOB.js → ticketingApi-x0BwZ1NH.js} +2 -2
- package/dist/chunks/{ticketingApi-D6s75rOB.js.map → ticketingApi-x0BwZ1NH.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-VuQT-n-P.js → useAccessRequests-BBTIYht3.js} +2 -2
- package/dist/chunks/{useAccessRequests-VuQT-n-P.js.map → useAccessRequests-BBTIYht3.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-CanI2ypo.js → useAccessRequests-BBUj9XY9.js} +71 -71
- package/dist/chunks/{useAccessRequests-CanI2ypo.js.map → useAccessRequests-BBUj9XY9.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js → useUserAccessRequests-BKQxcOXH.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js.map → useUserAccessRequests-BKQxcOXH.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js → useUserAccessRequests-BPUPiP55.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js.map → useUserAccessRequests-BPUPiP55.js.map} +1 -1
- package/dist/pages/platform/administration/applications/ApplicationDetailPage.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/ApplicationDetailPage-CWdz0TS4.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserDashboardPage-BV1d2hMG.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';\r\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 rounded-[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';\r\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)] rounded-[var(--radius-card)]\">\r\n <div\r\n className=\"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)] rounded-[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)] rounded-[var(--radius-card)]\">\r\n <div\r\n className=\"p-2 bg-blue-500/10 text-blue-500 rounded-[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)] rounded-[var(--radius-card)]\">\r\n <div\r\n className=\"p-2 bg-green-500/10 text-green-500 rounded-[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)] rounded-[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)] rounded-[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 rounded-[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 rounded-[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 rounded-[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 rounded-[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)] rounded-[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)] rounded-[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)] rounded-[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)] rounded-[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 } rounded-[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)] rounded-[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)] rounded-[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)] rounded-[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]} rounded-[var(--radius-card)]`}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {subtitle && <div className=\"text-xs opacity-70 mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n}\r\n"],"names":["SessionAnalyticsChart","data","t","useTranslation","chartData","item","jsx","ResponsiveContainer","jsxs","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","value","name","Legend","Line","LoginErrorsTable","errors","AlertTriangle","isRecent","loginAt","errorDate","error","recent","Fragment","MapPin","Globe","CurrentSessionCard","session","Monitor","formatDuration","minutes","hours","mins","extractBrowserName","userAgent","Clock","DeviceStatsCard","stats","browserColors","countryColors","index","maxCount","b","percentage","c","WeeklyUsageChart","avgDurationPerSession","d","acc","BarChart","ReferenceLine","Bar","HourlyUsageChart","formatHour","hour","entry","Cell","COLORS","ApplicationUsageChart","app","seconds","PieChart","Pie","percent","_name","props","DynamicIcon","className","IconComponent","LucideIcons","Star","UserDashboardPage","navigate","useNavigate","user","useAuth","currentTenant","useTenant","menu","useNavigation","favorites","favoritesLoading","triggerExpand","useFavoriteModules","period","setPeriod","useState","loading","setLoading","analytics","setAnalytics","setErrors","currentSession","setCurrentSession","deviceStats","setDeviceStats","weeklyStats","setWeeklyStats","hourlyStats","setHourlyStats","appUsage","setAppUsage","resolveRoute","module","navModule","m","firstSection","a","handleModuleClick","route","displayName","loadDashboardData","useCallback","userApi","useEffect","Loader2","Building2","Settings","StatCard","Activity","TrendingUp","Calendar","AppWindow","BarChart3","p","title","icon","subtitle","color"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserDashboardPage-Dtt9VzG_.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';\r\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 rounded-[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';\r\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)] rounded-[var(--radius-card)]\">\r\n <div\r\n className=\"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)] rounded-[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)] rounded-[var(--radius-card)]\">\r\n <div\r\n className=\"p-2 bg-blue-500/10 text-blue-500 rounded-[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)] rounded-[var(--radius-card)]\">\r\n <div\r\n className=\"p-2 bg-green-500/10 text-green-500 rounded-[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)] rounded-[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)] rounded-[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 rounded-[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 rounded-[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 rounded-[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 rounded-[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)] rounded-[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)] rounded-[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)] rounded-[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)] rounded-[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 } rounded-[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)] rounded-[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)] rounded-[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)] rounded-[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]} rounded-[var(--radius-card)]`}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {subtitle && <div className=\"text-xs opacity-70 mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n}\r\n"],"names":["SessionAnalyticsChart","data","t","useTranslation","chartData","item","jsx","ResponsiveContainer","jsxs","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","value","name","Legend","Line","LoginErrorsTable","errors","AlertTriangle","isRecent","loginAt","errorDate","error","recent","Fragment","MapPin","Globe","CurrentSessionCard","session","Monitor","formatDuration","minutes","hours","mins","extractBrowserName","userAgent","Clock","DeviceStatsCard","stats","browserColors","countryColors","index","maxCount","b","percentage","c","WeeklyUsageChart","avgDurationPerSession","d","acc","BarChart","ReferenceLine","Bar","HourlyUsageChart","formatHour","hour","entry","Cell","COLORS","ApplicationUsageChart","app","seconds","PieChart","Pie","percent","_name","props","DynamicIcon","className","IconComponent","LucideIcons","Star","UserDashboardPage","navigate","useNavigate","user","useAuth","currentTenant","useTenant","menu","useNavigation","favorites","favoritesLoading","triggerExpand","useFavoriteModules","period","setPeriod","useState","loading","setLoading","analytics","setAnalytics","setErrors","currentSession","setCurrentSession","deviceStats","setDeviceStats","weeklyStats","setWeeklyStats","hourlyStats","setHourlyStats","appUsage","setAppUsage","resolveRoute","module","navModule","m","firstSection","a","handleModuleClick","route","displayName","loadDashboardData","useCallback","userApi","useEffect","Loader2","Building2","Settings","StatCard","Activity","TrendingUp","Calendar","AppWindow","BarChart3","p","title","icon","subtitle","color"],"mappings":"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"}
|
|
@@ -4,13 +4,13 @@ import { Link as jt, useNavigate as $e, useParams as Jt, useSearchParams as Xt }
|
|
|
4
4
|
import { useTranslation as q } from "react-i18next";
|
|
5
5
|
import * as Zt from "lucide-react";
|
|
6
6
|
import { AlertCircle as Je, X as ye, Search as Me, ChevronDown as Xe, Plus as pe, Loader2 as J, Lock as Ft, Users as de, Globe as Mt, Building2 as xe, Trash2 as Te, Filter as yt, Shield as ne, Check as Nt, Star as Ye, Eye as Ze, Ban as er, Info as vt, ChevronRight as bt, FolderOpen as tr, UserCheck as wt, User as be, Database as rr, FileText as ar, Box as sr, Play as nr, UserPlus as ir, Edit as lr, LayoutGrid as or, Table2 as cr, RefreshCw as Ie, AlertTriangle as gt, CheckCircle as st, Cloud as ge, Save as Lt, Briefcase as $t, Phone as It, MapPin as nt, AtSign as dr, Key as Le, Edit3 as Et, Mail as zt, XCircle as Vt, Bug as mr, EyeOff as ur, Copy as pr, UserX as xr, LogOut as it, Unlock as At, Activity as et, Smartphone as Dt, Calendar as hr, Monitor as tt, Link2 as vr, Crown as br, History as ft, RotateCcw as kt, ShieldX as gr, Boxes as St, Layers as fr, AppWindow as yr, ArrowLeft as Nr } from "lucide-react";
|
|
7
|
-
import { k as M, r as wr, s as Dr, D as Gt, U as Fe, t as Ot, v as Cr, a as Ar, o as kr, B as Sr, S as dt } from "./index-
|
|
8
|
-
import { T as Tr, u as Rr } from "./TenantScopeSelector-
|
|
7
|
+
import { k as M, r as wr, s as Dr, D as Gt, U as Fe, t as Ot, v as Cr, a as Ar, o as kr, B as Sr, S as dt } from "./index-CBtjGPod.js";
|
|
8
|
+
import { T as Tr, u as Rr } from "./TenantScopeSelector-CEFgxiWt.js";
|
|
9
9
|
import { g as rt } from "./roleUtils-DlOIxLsd.js";
|
|
10
10
|
import { c as Pr, g as jr, a as Fr, b as Mr, P as Lr, d as $r } from "./PermissionPopover-CzuQmLbY.js";
|
|
11
|
-
import { g as mt } from "./groupsApi-
|
|
11
|
+
import { g as mt } from "./groupsApi-CBI5vMLa.js";
|
|
12
12
|
import { f as ut } from "./formatPhone-CUNTVwt7.js";
|
|
13
|
-
import { T as pt } from "./TenantCard-
|
|
13
|
+
import { T as pt } from "./TenantCard-DI66acce.js";
|
|
14
14
|
const Ut = {
|
|
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)]" },
|
|
@@ -4105,4 +4105,4 @@ function Ea() {
|
|
|
4105
4105
|
export {
|
|
4106
4106
|
Ea as UserDetailPage
|
|
4107
4107
|
};
|
|
4108
|
-
//# sourceMappingURL=UserDetailPage-
|
|
4108
|
+
//# sourceMappingURL=UserDetailPage-BEEV2vlJ.js.map
|