@atlashub/smartstack 3.21.0 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"UserDashboardPage-BP5WeXPS.js","sources":["../../src/components/dashboard/SessionAnalyticsChart.tsx","../../src/components/dashboard/LoginErrorsTable.tsx","../../src/components/dashboard/CurrentSessionCard.tsx","../../src/components/dashboard/DeviceStatsCard.tsx","../../src/components/dashboard/WeeklyUsageChart.tsx","../../src/components/dashboard/HourlyUsageChart.tsx","../../src/components/dashboard/ApplicationUsageChart.tsx","../../src/pages/personal/myspace/UserDashboardPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DailySessionStatsDto } from '@/services/api/userApi';\r\n\r\ninterface SessionAnalyticsChartProps {\r\n readonly data: DailySessionStatsDto[];\r\n}\r\n\r\nexport function SessionAnalyticsChart({ data }: SessionAnalyticsChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.sessionAnalytics.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.map(item => ({\r\n date: new Date(item.date).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit' }),\r\n loginCount: item.loginCount,\r\n avgDuration: Math.round(item.avgDuration),\r\n }));\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n yAxisId=\"left\"\r\n stroke=\"var(--color-accent-500)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.connections'), angle: -90, position: 'insideLeft', fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n yAxisId=\"right\"\r\n orientation=\"right\"\r\n stroke=\"#22c55e\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.avgDuration'), angle: 90, position: 'insideRight', fill: 'var(--text-secondary)' }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: 'var(--radius-card)',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name: string | undefined) => {\r\n if (name === 'loginCount') return [value, t('dashboard.sessionAnalytics.connections')];\r\n if (name === 'avgDuration') return [`${value} min`, t('dashboard.sessionAnalytics.avgDuration')];\r\n return [value, name || ''];\r\n }}\r\n />\r\n <Legend\r\n wrapperStyle={{ color: 'var(--text-secondary)' }}\r\n formatter={(value: string) => {\r\n if (value === 'loginCount') return t('dashboard.sessionAnalytics.connections');\r\n if (value === 'avgDuration') return t('dashboard.sessionAnalytics.avgDurationMin');\r\n return value;\r\n }}\r\n />\r\n <Line\r\n yAxisId=\"left\"\r\n type=\"monotone\"\r\n dataKey=\"loginCount\"\r\n stroke=\"var(--color-accent-500)\"\r\n strokeWidth={2}\r\n dot={{ fill: 'var(--color-accent-500)', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n <Line\r\n yAxisId=\"right\"\r\n type=\"monotone\"\r\n dataKey=\"avgDuration\"\r\n stroke=\"#22c55e\"\r\n strokeWidth={2}\r\n dot={{ fill: '#22c55e', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n </LineChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { AlertTriangle, MapPin, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { LoginErrorDto } from '@/services/api/userApi';\r\n\r\ninterface LoginErrorsTableProps {\r\n readonly errors: LoginErrorDto[];\r\n}\r\n\r\nexport function LoginErrorsTable({ errors }: LoginErrorsTableProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!Array.isArray(errors) || errors.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mb-3 text-green-500\" />\r\n <p className=\"font-medium\">{t('dashboard.loginErrors.noErrors')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.loginErrors.accountSecure')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const isRecent = (loginAt: string) => {\r\n const errorDate = new Date(loginAt);\r\n const now = new Date();\r\n const hoursDiff = (now.getTime() - errorDate.getTime()) / (1000 * 60 * 60);\r\n return hoursDiff < 24;\r\n };\r\n\r\n return (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.datetime')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.reason')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.ipAddress')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.location')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {errors.map((error) => {\r\n const recent = isRecent(error.loginAt);\r\n return (\r\n <tr\r\n key={error.loginAt}\r\n className={`border-b border-[var(--border-color)] hover:bg-[var(--bg-secondary)] ${\r\n recent ? 'bg-red-50/50 dark:bg-red-900/10' : ''\r\n }`}\r\n >\r\n <td className=\"p-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {recent && (\r\n <span className=\"w-2 h-2 rounded-full bg-red-500 animate-pulse\" title={t('dashboard.loginErrors.recentLabel')} />\r\n )}\r\n <span className=\"text-sm\">\r\n {new Date(error.loginAt).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n })}\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-3\">\r\n <span\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\"\r\n style={{ borderRadius: 'var(--radius-badge)' }}\r\n >\r\n <AlertTriangle className=\"w-3 h-3\" />\r\n {error.failureReason}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n <span className=\"text-sm font-mono text-[var(--text-secondary)]\">\r\n {error.ipAddress || 'N/A'}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n {error.city || error.country ? (\r\n <div className=\"flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n {error.city && (\r\n <>\r\n <MapPin className=\"w-3 h-3\" />\r\n <span>{error.city}</span>\r\n </>\r\n )}\r\n {error.country && (\r\n <>\r\n <Globe className=\"w-3 h-3\" />\r\n <span>{error.country}</span>\r\n </>\r\n )}\r\n </div>\r\n ) : (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">{t('dashboard.loginErrors.notAvailable')}</span>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Clock, MapPin, Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { CurrentSessionDto } from '@/services/api/userApi';\r\n\r\ninterface CurrentSessionCardProps {\r\n readonly session: CurrentSessionDto | null;\r\n}\r\n\r\nexport function CurrentSessionCard({ session }: CurrentSessionCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!session) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <Monitor className=\"w-12 h-12 mb-3 opacity-50\" />\r\n <p className=\"font-medium\">{t('dashboard.currentSession.noActiveSession')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.currentSession.pleaseReconnect')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const formatDuration = (minutes: number): string => {\r\n if (minutes < 1) return \"< 1 minute\";\r\n if (minutes < 60) return `${Math.round(minutes)} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = Math.round(minutes % 60);\r\n if (mins === 0) return `${hours}h`;\r\n return `${hours}h ${mins}min`;\r\n };\r\n\r\n const extractBrowserName = (userAgent: string | null): string => {\r\n if (!userAgent) return t('dashboard.browsers.unknown');\r\n\r\n if (userAgent.includes('Edg/')) return t('dashboard.browsers.edge');\r\n if (userAgent.includes('Chrome/')) return t('dashboard.browsers.chrome');\r\n if (userAgent.includes('Firefox/')) return t('dashboard.browsers.firefox');\r\n if (userAgent.includes('Safari/') && !userAgent.includes('Chrome')) return t('dashboard.browsers.safari');\r\n if (userAgent.includes('OPR/') || userAgent.includes('Opera/')) return t('dashboard.browsers.opera');\r\n\r\n return t('dashboard.browsers.other');\r\n };\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Clock className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.duration')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {formatDuration(session.durationMinutes)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('dashboard.currentSession.since')} {new Date(session.loginAt).toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-blue-500/10 text-blue-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Monitor className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.device')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {extractBrowserName(session.userAgent)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1 font-mono\">\r\n {session.ipAddress || t('dashboard.currentSession.ipNotAvailable')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {(session.city || session.country) && (\r\n <div className=\"md:col-span-2 flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-green-500/10 text-green-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Globe className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.location')}</p>\r\n <div className=\"flex items-center gap-3 mt-1\">\r\n {session.city && (\r\n <div className=\"flex items-center gap-1\">\r\n <MapPin className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{session.city}</span>\r\n </div>\r\n )}\r\n {session.country && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{session.country}</span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DeviceStatsDto } from '@/services/api/userApi';\r\n\r\ninterface DeviceStatsCardProps {\r\n readonly stats: DeviceStatsDto | null;\r\n}\r\n\r\nexport function DeviceStatsCard({ stats }: DeviceStatsCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!stats) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <p>{t('dashboard.deviceStats.noData')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const browserColors = ['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444'];\r\n const countryColors = ['#06b6d4', '#ec4899', '#10b981', '#f97316', '#6366f1'];\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Monitor className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.browsersUsed')}\r\n </h4>\r\n {stats.byBrowser?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byBrowser.map((item, index) => {\r\n const maxCount = Math.max(...stats.byBrowser.map(b => b.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.browser} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.browser}>\r\n {item.browser}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: browserColors[index % browserColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.noData')}</p>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.connectionCountries')}\r\n </h4>\r\n {stats.byCountry?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byCountry.map((item, index) => {\r\n const maxCount = Math.max(...stats.byCountry.map(c => c.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.country} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.country}>\r\n {item.country}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: countryColors[index % countryColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.locationNotAvailable')}</p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ReferenceLine } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { WeeklyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface WeeklyUsageChartProps {\r\n readonly data: WeeklyStatsDto | null;\r\n}\r\n\r\nexport function WeeklyUsageChart({ data }: WeeklyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.dayStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.weeklyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.dayStats.map(item => ({\r\n day: t(`dashboard.days.${item.dayName.toLowerCase()}`),\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n }));\r\n\r\n // Calculate average of averages for the reference line\r\n const avgDurationPerSession = chartData.filter(d => d.sessionCount > 0).length > 0\r\n ? chartData.filter(d => d.sessionCount > 0).reduce((acc, d) => acc + d.duration, 0) / chartData.filter(d => d.sessionCount > 0).length\r\n : 0;\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"day\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.weeklyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <ReferenceLine\r\n y={avgDurationPerSession}\r\n stroke=\"#f59e0b\"\r\n strokeDasharray=\"5 5\"\r\n label={{\r\n value: `${t('dashboard.weeklyUsage.average')}: ${formatDuration(Math.round(avgDurationPerSession))}`,\r\n position: 'right',\r\n fill: '#f59e0b',\r\n fontSize: 11,\r\n }}\r\n />\r\n <Bar\r\n dataKey=\"duration\"\r\n fill=\"var(--color-accent-500)\"\r\n radius={[4, 4, 0, 0]}\r\n />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Cell } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { HourlyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface HourlyUsageChartProps {\r\n readonly data: HourlyStatsDto | null;\r\n}\r\n\r\nexport function HourlyUsageChart({ data }: HourlyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.hourStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.hourlyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const formatHour = (hour: number) => {\r\n return `${hour.toString().padStart(2, '0')}:00`;\r\n };\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.hourStats.map(item => ({\r\n hour: formatHour(item.hour),\r\n hourNum: item.hour,\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n isPeak: item.hour === data.peakHour,\r\n }));\r\n\r\n return (\r\n <div>\r\n <div className=\"flex items-center justify-end mb-2 text-xs text-[var(--text-secondary)]\">\r\n <span className=\"inline-block w-3 h-3 rounded-sm bg-[var(--color-accent-600)] mr-1\" />\r\n {t('dashboard.hourlyUsage.peakHour')}: {formatHour(data.peakHour)}\r\n </div>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 10, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"hour\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 11 }}\r\n interval={0}\r\n angle={-45}\r\n textAnchor=\"end\"\r\n height={60}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.hourlyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <Bar dataKey=\"duration\" radius={[4, 4, 0, 0]}>\r\n {chartData.map((entry, index) => (\r\n <Cell\r\n key={`${entry.hour}-${index}`}\r\n fill={entry.isPeak ? 'var(--color-accent-600)' : 'var(--color-accent-400)'}\r\n />\r\n ))}\r\n </Bar>\r\n </BarChart>\r\n </ResponsiveContainer>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { PieChart, Pie, Cell, Tooltip, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { ApplicationUsageDto } from '@/services/api/userApi';\r\n\r\ninterface ApplicationUsageChartProps {\r\n readonly data: ApplicationUsageDto | null;\r\n}\r\n\r\nconst COLORS = ['#3b82f6', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16', '#f97316', '#6366f1'];\r\n\r\nexport function ApplicationUsageChart({ data }: ApplicationUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.applicationUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.applications.map(app => ({\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n duration: app.totalDurationSeconds,\r\n percentage: app.percentage,\r\n }));\r\n\r\n const formatDuration = (seconds: number) => {\r\n if (seconds < 60) return `${seconds}s`;\r\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`;\r\n return `${Math.round(seconds / 3600)}h`;\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col md:flex-row items-center gap-6\">\r\n <div className=\"w-full md:w-1/2\">\r\n <ResponsiveContainer width=\"100%\" height={280}>\r\n <PieChart>\r\n <Pie\r\n data={chartData}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={60}\r\n outerRadius={90}\r\n dataKey=\"value\"\r\n label={({ name, percent }) => `${name} (${((percent ?? 0) * 100).toFixed(0)}%)`}\r\n labelLine={false}\r\n >\r\n {chartData.map((item, index) => (\r\n <Cell key={`${item.name}-${index}`} fill={COLORS[index % COLORS.length]} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value, _name, props) => [\r\n `${value} ${t('dashboard.applicationUsage.accesses')} (${formatDuration(props.payload.duration)})`,\r\n null,\r\n ]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n <div className=\"w-full md:w-1/2\">\r\n <div className=\"text-sm text-[var(--text-secondary)] mb-3\">\r\n {t('dashboard.applicationUsage.totalAccess')}: <span className=\"font-semibold text-[var(--text-primary)]\">{data.totalAccess}</span>\r\n </div>\r\n <div className=\"space-y-2 max-h-[240px] overflow-y-auto\">\r\n {data.applications.map((app, index) => (\r\n <div\r\n key={app.applicationId}\r\n className=\"flex items-center gap-3 p-2 rounded-[var(--radius-card)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\r\n style={{ backgroundColor: COLORS[index % COLORS.length] }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"text-sm font-medium text-[var(--text-primary)] truncate\">\r\n {app.applicationName}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {app.accessCount} {t('dashboard.applicationUsage.accesses')} - {formatDuration(app.totalDurationSeconds)}\r\n </div>\r\n </div>\r\n <div className=\"text-sm font-semibold text-[var(--text-primary)]\">\r\n {app.percentage}%\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Activity,\r\n TrendingUp,\r\n AlertTriangle,\r\n Monitor,\r\n BarChart3,\r\n Loader2,\r\n Calendar,\r\n Clock,\r\n AppWindow,\r\n Star,\r\n Settings,\r\n Building2,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation } from '@/contexts/NavigationContext';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport type {\r\n SessionAnalyticsDto,\r\n LoginErrorDto,\r\n CurrentSessionDto,\r\n DeviceStatsDto,\r\n WeeklyStatsDto,\r\n HourlyStatsDto,\r\n ApplicationUsageDto,\r\n} from '@/services/api/userApi';\r\nimport { SessionAnalyticsChart } from '@/components/dashboard/SessionAnalyticsChart';\r\nimport { LoginErrorsTable } from '@/components/dashboard/LoginErrorsTable';\r\nimport { CurrentSessionCard } from '@/components/dashboard/CurrentSessionCard';\r\nimport { DeviceStatsCard } from '@/components/dashboard/DeviceStatsCard';\r\nimport { WeeklyUsageChart } from '@/components/dashboard/WeeklyUsageChart';\r\nimport { HourlyUsageChart } from '@/components/dashboard/HourlyUsageChart';\r\nimport { ApplicationUsageChart } from '@/components/dashboard/ApplicationUsageChart';\r\n\r\n// Dynamic icon component\r\nfunction DynamicIcon({ name, className }: { name: string; className?: string }) {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) {\r\n return <Star className={className} />;\r\n }\r\n return <IconComponent className={className} />;\r\n}\r\n\r\nexport function UserDashboardPage(): ReactElement {\r\n const { t } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { user } = useAuth();\r\n const { currentTenant } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, loading: favoritesLoading, triggerExpand } = useFavoriteModules();\r\n const [period, setPeriod] = useState<7 | 30 | 90>(30);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const [analytics, setAnalytics] = useState<SessionAnalyticsDto | null>(null);\r\n const [errors, setErrors] = useState<LoginErrorDto[]>([]);\r\n const [currentSession, setCurrentSession] = useState<CurrentSessionDto | null>(null);\r\n const [deviceStats, setDeviceStats] = useState<DeviceStatsDto | null>(null);\r\n const [weeklyStats, setWeeklyStats] = useState<WeeklyStatsDto | null>(null);\r\n const [hourlyStats, setHourlyStats] = useState<HourlyStatsDto | null>(null);\r\n const [appUsage, setAppUsage] = useState<ApplicationUsageDto | null>(null);\r\n\r\n // Resolve favorite route to first section if module has sections (same as FavoritesBar)\r\n const resolveRoute = (module: FavoriteModule): string => {\r\n if (menu) {\r\n for (const app of menu.applications) {\r\n const navModule = app.modules.find(m => m.id === module.id);\r\n if (navModule?.sections?.length) {\r\n const firstSection = [...navModule.sections].sort((a, b) => a.displayOrder - b.displayOrder)[0];\r\n if (firstSection.route) return firstSection.route;\r\n }\r\n }\r\n }\r\n return module.route;\r\n };\r\n\r\n const handleModuleClick = (module: FavoriteModule) => {\r\n const route = resolveRoute(module);\r\n if (route) {\r\n triggerExpand();\r\n navigate(route);\r\n }\r\n };\r\n\r\n const displayName = user?.firstName && user?.lastName\r\n ? `${user.firstName} ${user.lastName}`\r\n : user?.email || 'Utilisateur';\r\n\r\n const loadDashboardData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n // Use aggregated endpoint: 1 API call instead of 7\r\n const data = await userApi.dashboard.getAll(period, 10);\r\n\r\n setAnalytics(data.sessionAnalytics);\r\n setErrors(data.loginErrors ?? []);\r\n setCurrentSession(data.currentSession);\r\n setDeviceStats(data.deviceStats);\r\n setWeeklyStats(data.weeklyStats);\r\n setHourlyStats(data.hourlyStats);\r\n setAppUsage(data.applicationUsage);\r\n } catch {\r\n setAnalytics(null);\r\n setErrors([]);\r\n setCurrentSession(null);\r\n setDeviceStats(null);\r\n setWeeklyStats(null);\r\n setHourlyStats(null);\r\n setAppUsage(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [period]);\r\n\r\n useEffect(() => {\r\n loadDashboardData();\r\n }, [period, loadDashboardData]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('navigation:dashboard.welcome')}, {displayName}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('navigation:breadcrumb.myspace')}</p>\r\n </div>\r\n\r\n {/* Quick Access Favorites */}\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <Star className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n {currentTenant && (\r\n <span className=\"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] px-2 py-1 bg-[var(--bg-secondary)] border border-[var(--border-color)]\" style={{ borderRadius: 'var(--radius-button)' }}>\r\n <Building2 className=\"w-3.5 h-3.5\" />\r\n {currentTenant.name}\r\n </span>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('common:favorites.manage')}\r\n </button>\r\n </div>\r\n\r\n {favoritesLoading && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length === 0 && (\r\n <div className=\"text-center py-8\">\r\n <Star className=\"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('common:favorites.noFavorites')}</p>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"px-4 py-2 bg-[var(--color-accent-600)] text-white font-medium hover:bg-[var(--color-accent-700)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('common:favorites.configureFavorites')}\r\n </button>\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length > 0 && (\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-3\">\r\n {favorites.map((module) => (\r\n <button\r\n key={module.id}\r\n onClick={() => handleModuleClick(module)}\r\n className=\"flex flex-col items-center gap-2 p-4 bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)] transition-all group\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div\r\n className=\"w-12 h-12 flex items-center justify-center bg-[var(--color-accent-100)] text-[var(--color-accent-600)] group-hover:bg-[var(--color-accent-600)] group-hover:text-white transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-6 h-6\" />\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)] text-center\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">{module.applicationLabel}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <StatCard\r\n title={t('navigation:dashboard.stats.totalSessions')}\r\n value={analytics?.totalSessions ?? 0}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n subtitle={`${period} ${t('navigation:dashboard.stats.lastDays')}`}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.avgDuration')}\r\n value={`${Math.round(analytics?.avgSessionDuration ?? 0)} min`}\r\n icon={<TrendingUp className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.perSession')}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.connectionErrors')}\r\n value={(errors ?? []).length}\r\n icon={<AlertTriangle className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.recent')}\r\n color={(errors ?? []).length > 0 ? 'red' : 'green'}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Calendar className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.weeklyUsage.title')}</h2>\r\n </div>\r\n <WeeklyUsageChart data={weeklyStats} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Clock className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.hourlyUsage.title')}</h2>\r\n </div>\r\n <HourlyUsageChart data={hourlyStats} />\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AppWindow className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.applicationUsage.title')}</h2>\r\n </div>\r\n <ApplicationUsageChart data={appUsage} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div className=\"flex items-center gap-3\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.sessionAnalytics.title')}</h2>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {([7, 30, 90] as const).map((p) => (\r\n <button\r\n key={p}\r\n onClick={() => setPeriod(p)}\r\n className={`px-3 py-1 text-sm font-medium transition-colors ${\r\n period === p\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t(`navigation:dashboard.sessionAnalytics.period.${p}days`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <SessionAnalyticsChart data={analytics?.dailyStats ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Monitor className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.currentSession.title')}</h2>\r\n </div>\r\n <CurrentSessionCard session={currentSession} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.loginErrors.title')}</h2>\r\n </div>\r\n <LoginErrorsTable errors={errors ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.deviceStats.title')}</h2>\r\n </div>\r\n <DeviceStatsCard stats={deviceStats} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatCard({\r\n title,\r\n value,\r\n icon,\r\n subtitle,\r\n color = 'blue',\r\n}: {\r\n title: string;\r\n value: string | number;\r\n icon: React.ReactNode;\r\n subtitle?: string;\r\n color?: 'blue' | 'green' | 'red';\r\n}) {\r\n const colorClasses = {\r\n blue: 'bg-blue-50 text-blue-600 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800',\r\n green: 'bg-green-50 text-green-600 border-green-200 dark:bg-green-900/20 dark:border-green-800',\r\n red: 'bg-red-50 text-red-600 border-red-200 dark:bg-red-900/20 dark:border-red-800',\r\n };\r\n\r\n return (\r\n <div\r\n className={`p-4 border ${colorClasses[color]}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {subtitle && <div className=\"text-xs opacity-70 mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n}\r\n"],"names":["SessionAnalyticsChart","data","t","useTranslation","chartData","item","jsx","ResponsiveContainer","jsxs","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","value","name","Legend","Line","LoginErrorsTable","errors","AlertTriangle","isRecent","loginAt","errorDate","error","recent","Fragment","MapPin","Globe","CurrentSessionCard","session","Monitor","formatDuration","minutes","hours","mins","extractBrowserName","userAgent","Clock","DeviceStatsCard","stats","browserColors","countryColors","index","maxCount","b","percentage","c","WeeklyUsageChart","avgDurationPerSession","d","acc","BarChart","ReferenceLine","Bar","HourlyUsageChart","formatHour","hour","entry","Cell","COLORS","ApplicationUsageChart","app","seconds","PieChart","Pie","percent","_name","props","DynamicIcon","className","IconComponent","LucideIcons","Star","UserDashboardPage","navigate","useNavigate","user","useAuth","currentTenant","useTenant","menu","useNavigation","favorites","favoritesLoading","triggerExpand","useFavoriteModules","period","setPeriod","useState","loading","setLoading","analytics","setAnalytics","setErrors","currentSession","setCurrentSession","deviceStats","setDeviceStats","weeklyStats","setWeeklyStats","hourlyStats","setHourlyStats","appUsage","setAppUsage","resolveRoute","module","navModule","m","firstSection","a","handleModuleClick","route","displayName","loadDashboardData","useCallback","userApi","useEffect","Loader2","Building2","Settings","StatCard","Activity","TrendingUp","Calendar","AppWindow","BarChart3","p","title","icon","subtitle","color"],"mappings":"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"}
1
+ {"version":3,"file":"UserDashboardPage-BrtkJ-NB.js","sources":["../../src/components/dashboard/SessionAnalyticsChart.tsx","../../src/components/dashboard/LoginErrorsTable.tsx","../../src/components/dashboard/CurrentSessionCard.tsx","../../src/components/dashboard/DeviceStatsCard.tsx","../../src/components/dashboard/WeeklyUsageChart.tsx","../../src/components/dashboard/HourlyUsageChart.tsx","../../src/components/dashboard/ApplicationUsageChart.tsx","../../src/pages/personal/myspace/UserDashboardPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DailySessionStatsDto } from '@/services/api/userApi';\r\n\r\ninterface SessionAnalyticsChartProps {\r\n readonly data: DailySessionStatsDto[];\r\n}\r\n\r\nexport function SessionAnalyticsChart({ data }: SessionAnalyticsChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.sessionAnalytics.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.map(item => ({\r\n date: new Date(item.date).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit' }),\r\n loginCount: item.loginCount,\r\n avgDuration: Math.round(item.avgDuration),\r\n }));\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n yAxisId=\"left\"\r\n stroke=\"var(--color-accent-500)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.connections'), angle: -90, position: 'insideLeft', fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n yAxisId=\"right\"\r\n orientation=\"right\"\r\n stroke=\"#22c55e\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.avgDuration'), angle: 90, position: 'insideRight', fill: 'var(--text-secondary)' }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: 'var(--radius-card)',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name: string | undefined) => {\r\n if (name === 'loginCount') return [value, t('dashboard.sessionAnalytics.connections')];\r\n if (name === 'avgDuration') return [`${value} min`, t('dashboard.sessionAnalytics.avgDuration')];\r\n return [value, name || ''];\r\n }}\r\n />\r\n <Legend\r\n wrapperStyle={{ color: 'var(--text-secondary)' }}\r\n formatter={(value: string) => {\r\n if (value === 'loginCount') return t('dashboard.sessionAnalytics.connections');\r\n if (value === 'avgDuration') return t('dashboard.sessionAnalytics.avgDurationMin');\r\n return value;\r\n }}\r\n />\r\n <Line\r\n yAxisId=\"left\"\r\n type=\"monotone\"\r\n dataKey=\"loginCount\"\r\n stroke=\"var(--color-accent-500)\"\r\n strokeWidth={2}\r\n dot={{ fill: 'var(--color-accent-500)', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n <Line\r\n yAxisId=\"right\"\r\n type=\"monotone\"\r\n dataKey=\"avgDuration\"\r\n stroke=\"#22c55e\"\r\n strokeWidth={2}\r\n dot={{ fill: '#22c55e', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n </LineChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { AlertTriangle, MapPin, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { LoginErrorDto } from '@/services/api/userApi';\r\n\r\ninterface LoginErrorsTableProps {\r\n readonly errors: LoginErrorDto[];\r\n}\r\n\r\nexport function LoginErrorsTable({ errors }: LoginErrorsTableProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!Array.isArray(errors) || errors.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mb-3 text-green-500\" />\r\n <p className=\"font-medium\">{t('dashboard.loginErrors.noErrors')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.loginErrors.accountSecure')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const isRecent = (loginAt: string) => {\r\n const errorDate = new Date(loginAt);\r\n const now = new Date();\r\n const hoursDiff = (now.getTime() - errorDate.getTime()) / (1000 * 60 * 60);\r\n return hoursDiff < 24;\r\n };\r\n\r\n return (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.datetime')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.reason')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.ipAddress')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.location')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {errors.map((error) => {\r\n const recent = isRecent(error.loginAt);\r\n return (\r\n <tr\r\n key={error.loginAt}\r\n className={`border-b border-[var(--border-color)] hover:bg-[var(--bg-secondary)] ${\r\n recent ? 'bg-red-50/50 dark:bg-red-900/10' : ''\r\n }`}\r\n >\r\n <td className=\"p-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {recent && (\r\n <span className=\"w-2 h-2 rounded-full bg-red-500 animate-pulse\" title={t('dashboard.loginErrors.recentLabel')} />\r\n )}\r\n <span className=\"text-sm\">\r\n {new Date(error.loginAt).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n })}\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-3\">\r\n <span\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\"\r\n style={{ borderRadius: 'var(--radius-badge)' }}\r\n >\r\n <AlertTriangle className=\"w-3 h-3\" />\r\n {error.failureReason}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n <span className=\"text-sm font-mono text-[var(--text-secondary)]\">\r\n {error.ipAddress || 'N/A'}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n {error.city || error.country ? (\r\n <div className=\"flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n {error.city && (\r\n <>\r\n <MapPin className=\"w-3 h-3\" />\r\n <span>{error.city}</span>\r\n </>\r\n )}\r\n {error.country && (\r\n <>\r\n <Globe className=\"w-3 h-3\" />\r\n <span>{error.country}</span>\r\n </>\r\n )}\r\n </div>\r\n ) : (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">{t('dashboard.loginErrors.notAvailable')}</span>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Clock, MapPin, Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { CurrentSessionDto } from '@/services/api/userApi';\r\n\r\ninterface CurrentSessionCardProps {\r\n readonly session: CurrentSessionDto | null;\r\n}\r\n\r\nexport function CurrentSessionCard({ session }: CurrentSessionCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!session) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <Monitor className=\"w-12 h-12 mb-3 opacity-50\" />\r\n <p className=\"font-medium\">{t('dashboard.currentSession.noActiveSession')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.currentSession.pleaseReconnect')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const formatDuration = (minutes: number): string => {\r\n if (minutes < 1) return \"< 1 minute\";\r\n if (minutes < 60) return `${Math.round(minutes)} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = Math.round(minutes % 60);\r\n if (mins === 0) return `${hours}h`;\r\n return `${hours}h ${mins}min`;\r\n };\r\n\r\n const extractBrowserName = (userAgent: string | null): string => {\r\n if (!userAgent) return t('dashboard.browsers.unknown');\r\n\r\n if (userAgent.includes('Edg/')) return t('dashboard.browsers.edge');\r\n if (userAgent.includes('Chrome/')) return t('dashboard.browsers.chrome');\r\n if (userAgent.includes('Firefox/')) return t('dashboard.browsers.firefox');\r\n if (userAgent.includes('Safari/') && !userAgent.includes('Chrome')) return t('dashboard.browsers.safari');\r\n if (userAgent.includes('OPR/') || userAgent.includes('Opera/')) return t('dashboard.browsers.opera');\r\n\r\n return t('dashboard.browsers.other');\r\n };\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Clock className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.duration')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {formatDuration(session.durationMinutes)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('dashboard.currentSession.since')} {new Date(session.loginAt).toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-blue-500/10 text-blue-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Monitor className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.device')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {extractBrowserName(session.userAgent)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1 font-mono\">\r\n {session.ipAddress || t('dashboard.currentSession.ipNotAvailable')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {(session.city || session.country) && (\r\n <div className=\"md:col-span-2 flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-green-500/10 text-green-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Globe className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.location')}</p>\r\n <div className=\"flex items-center gap-3 mt-1\">\r\n {session.city && (\r\n <div className=\"flex items-center gap-1\">\r\n <MapPin className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{session.city}</span>\r\n </div>\r\n )}\r\n {session.country && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{session.country}</span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DeviceStatsDto } from '@/services/api/userApi';\r\n\r\ninterface DeviceStatsCardProps {\r\n readonly stats: DeviceStatsDto | null;\r\n}\r\n\r\nexport function DeviceStatsCard({ stats }: DeviceStatsCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!stats) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <p>{t('dashboard.deviceStats.noData')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const browserColors = ['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444'];\r\n const countryColors = ['#06b6d4', '#ec4899', '#10b981', '#f97316', '#6366f1'];\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Monitor className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.browsersUsed')}\r\n </h4>\r\n {stats.byBrowser?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byBrowser.map((item, index) => {\r\n const maxCount = Math.max(...stats.byBrowser.map(b => b.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.browser} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.browser}>\r\n {item.browser}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: browserColors[index % browserColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.noData')}</p>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.connectionCountries')}\r\n </h4>\r\n {stats.byCountry?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byCountry.map((item, index) => {\r\n const maxCount = Math.max(...stats.byCountry.map(c => c.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.country} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.country}>\r\n {item.country}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: countryColors[index % countryColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.locationNotAvailable')}</p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ReferenceLine } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { WeeklyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface WeeklyUsageChartProps {\r\n readonly data: WeeklyStatsDto | null;\r\n}\r\n\r\nexport function WeeklyUsageChart({ data }: WeeklyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.dayStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.weeklyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.dayStats.map(item => ({\r\n day: t(`dashboard.days.${item.dayName.toLowerCase()}`),\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n }));\r\n\r\n // Calculate average of averages for the reference line\r\n const avgDurationPerSession = chartData.filter(d => d.sessionCount > 0).length > 0\r\n ? chartData.filter(d => d.sessionCount > 0).reduce((acc, d) => acc + d.duration, 0) / chartData.filter(d => d.sessionCount > 0).length\r\n : 0;\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"day\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.weeklyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <ReferenceLine\r\n y={avgDurationPerSession}\r\n stroke=\"#f59e0b\"\r\n strokeDasharray=\"5 5\"\r\n label={{\r\n value: `${t('dashboard.weeklyUsage.average')}: ${formatDuration(Math.round(avgDurationPerSession))}`,\r\n position: 'right',\r\n fill: '#f59e0b',\r\n fontSize: 11,\r\n }}\r\n />\r\n <Bar\r\n dataKey=\"duration\"\r\n fill=\"var(--color-accent-500)\"\r\n radius={[4, 4, 0, 0]}\r\n />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Cell } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { HourlyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface HourlyUsageChartProps {\r\n readonly data: HourlyStatsDto | null;\r\n}\r\n\r\nexport function HourlyUsageChart({ data }: HourlyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.hourStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.hourlyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const formatHour = (hour: number) => {\r\n return `${hour.toString().padStart(2, '0')}:00`;\r\n };\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.hourStats.map(item => ({\r\n hour: formatHour(item.hour),\r\n hourNum: item.hour,\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n isPeak: item.hour === data.peakHour,\r\n }));\r\n\r\n return (\r\n <div>\r\n <div className=\"flex items-center justify-end mb-2 text-xs text-[var(--text-secondary)]\">\r\n <span className=\"inline-block w-3 h-3 rounded-sm bg-[var(--color-accent-600)] mr-1\" />\r\n {t('dashboard.hourlyUsage.peakHour')}: {formatHour(data.peakHour)}\r\n </div>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 10, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"hour\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 11 }}\r\n interval={0}\r\n angle={-45}\r\n textAnchor=\"end\"\r\n height={60}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.hourlyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <Bar dataKey=\"duration\" radius={[4, 4, 0, 0]}>\r\n {chartData.map((entry, index) => (\r\n <Cell\r\n key={`${entry.hour}-${index}`}\r\n fill={entry.isPeak ? 'var(--color-accent-600)' : 'var(--color-accent-400)'}\r\n />\r\n ))}\r\n </Bar>\r\n </BarChart>\r\n </ResponsiveContainer>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { PieChart, Pie, Cell, Tooltip, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { ApplicationUsageDto } from '@/services/api/userApi';\r\n\r\ninterface ApplicationUsageChartProps {\r\n readonly data: ApplicationUsageDto | null;\r\n}\r\n\r\nconst COLORS = ['#3b82f6', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16', '#f97316', '#6366f1'];\r\n\r\nexport function ApplicationUsageChart({ data }: ApplicationUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.applicationUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.applications.map(app => ({\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n duration: app.totalDurationSeconds,\r\n percentage: app.percentage,\r\n }));\r\n\r\n const formatDuration = (seconds: number) => {\r\n if (seconds < 60) return `${seconds}s`;\r\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`;\r\n return `${Math.round(seconds / 3600)}h`;\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col md:flex-row items-center gap-6\">\r\n <div className=\"w-full md:w-1/2\">\r\n <ResponsiveContainer width=\"100%\" height={280}>\r\n <PieChart>\r\n <Pie\r\n data={chartData}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={60}\r\n outerRadius={90}\r\n dataKey=\"value\"\r\n label={({ name, percent }) => `${name} (${((percent ?? 0) * 100).toFixed(0)}%)`}\r\n labelLine={false}\r\n >\r\n {chartData.map((item, index) => (\r\n <Cell key={`${item.name}-${index}`} fill={COLORS[index % COLORS.length]} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value, _name, props) => [\r\n `${value} ${t('dashboard.applicationUsage.accesses')} (${formatDuration(props.payload.duration)})`,\r\n null,\r\n ]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n <div className=\"w-full md:w-1/2\">\r\n <div className=\"text-sm text-[var(--text-secondary)] mb-3\">\r\n {t('dashboard.applicationUsage.totalAccess')}: <span className=\"font-semibold text-[var(--text-primary)]\">{data.totalAccess}</span>\r\n </div>\r\n <div className=\"space-y-2 max-h-[240px] overflow-y-auto\">\r\n {data.applications.map((app, index) => (\r\n <div\r\n key={app.applicationId}\r\n className=\"flex items-center gap-3 p-2 rounded-[var(--radius-card)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\r\n style={{ backgroundColor: COLORS[index % COLORS.length] }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"text-sm font-medium text-[var(--text-primary)] truncate\">\r\n {app.applicationName}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {app.accessCount} {t('dashboard.applicationUsage.accesses')} - {formatDuration(app.totalDurationSeconds)}\r\n </div>\r\n </div>\r\n <div className=\"text-sm font-semibold text-[var(--text-primary)]\">\r\n {app.percentage}%\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Activity,\r\n TrendingUp,\r\n AlertTriangle,\r\n Monitor,\r\n BarChart3,\r\n Loader2,\r\n Calendar,\r\n Clock,\r\n AppWindow,\r\n Star,\r\n Settings,\r\n Building2,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation } from '@/contexts/NavigationContext';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport type {\r\n SessionAnalyticsDto,\r\n LoginErrorDto,\r\n CurrentSessionDto,\r\n DeviceStatsDto,\r\n WeeklyStatsDto,\r\n HourlyStatsDto,\r\n ApplicationUsageDto,\r\n} from '@/services/api/userApi';\r\nimport { SessionAnalyticsChart } from '@/components/dashboard/SessionAnalyticsChart';\r\nimport { LoginErrorsTable } from '@/components/dashboard/LoginErrorsTable';\r\nimport { CurrentSessionCard } from '@/components/dashboard/CurrentSessionCard';\r\nimport { DeviceStatsCard } from '@/components/dashboard/DeviceStatsCard';\r\nimport { WeeklyUsageChart } from '@/components/dashboard/WeeklyUsageChart';\r\nimport { HourlyUsageChart } from '@/components/dashboard/HourlyUsageChart';\r\nimport { ApplicationUsageChart } from '@/components/dashboard/ApplicationUsageChart';\r\n\r\n// Dynamic icon component\r\nfunction DynamicIcon({ name, className }: { name: string; className?: string }) {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) {\r\n return <Star className={className} />;\r\n }\r\n return <IconComponent className={className} />;\r\n}\r\n\r\nexport function UserDashboardPage(): ReactElement {\r\n const { t } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { user } = useAuth();\r\n const { currentTenant } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, loading: favoritesLoading, triggerExpand } = useFavoriteModules();\r\n const [period, setPeriod] = useState<7 | 30 | 90>(30);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const [analytics, setAnalytics] = useState<SessionAnalyticsDto | null>(null);\r\n const [errors, setErrors] = useState<LoginErrorDto[]>([]);\r\n const [currentSession, setCurrentSession] = useState<CurrentSessionDto | null>(null);\r\n const [deviceStats, setDeviceStats] = useState<DeviceStatsDto | null>(null);\r\n const [weeklyStats, setWeeklyStats] = useState<WeeklyStatsDto | null>(null);\r\n const [hourlyStats, setHourlyStats] = useState<HourlyStatsDto | null>(null);\r\n const [appUsage, setAppUsage] = useState<ApplicationUsageDto | null>(null);\r\n\r\n // Resolve favorite route to first section if module has sections (same as FavoritesBar)\r\n const resolveRoute = (module: FavoriteModule): string => {\r\n if (menu) {\r\n for (const app of menu.applications) {\r\n const navModule = app.modules.find(m => m.id === module.id);\r\n if (navModule?.sections?.length) {\r\n const firstSection = [...navModule.sections].sort((a, b) => a.displayOrder - b.displayOrder)[0];\r\n if (firstSection.route) return firstSection.route;\r\n }\r\n }\r\n }\r\n return module.route;\r\n };\r\n\r\n const handleModuleClick = (module: FavoriteModule) => {\r\n const route = resolveRoute(module);\r\n if (route) {\r\n triggerExpand();\r\n navigate(route);\r\n }\r\n };\r\n\r\n const displayName = user?.firstName && user?.lastName\r\n ? `${user.firstName} ${user.lastName}`\r\n : user?.email || 'Utilisateur';\r\n\r\n const loadDashboardData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n // Use aggregated endpoint: 1 API call instead of 7\r\n const data = await userApi.dashboard.getAll(period, 10);\r\n\r\n setAnalytics(data.sessionAnalytics);\r\n setErrors(data.loginErrors ?? []);\r\n setCurrentSession(data.currentSession);\r\n setDeviceStats(data.deviceStats);\r\n setWeeklyStats(data.weeklyStats);\r\n setHourlyStats(data.hourlyStats);\r\n setAppUsage(data.applicationUsage);\r\n } catch {\r\n setAnalytics(null);\r\n setErrors([]);\r\n setCurrentSession(null);\r\n setDeviceStats(null);\r\n setWeeklyStats(null);\r\n setHourlyStats(null);\r\n setAppUsage(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [period]);\r\n\r\n useEffect(() => {\r\n loadDashboardData();\r\n }, [period, loadDashboardData]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('navigation:dashboard.welcome')}, {displayName}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('navigation:breadcrumb.myspace')}</p>\r\n </div>\r\n\r\n {/* Quick Access Favorites */}\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <Star className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n {currentTenant && (\r\n <span className=\"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] px-2 py-1 bg-[var(--bg-secondary)] border border-[var(--border-color)]\" style={{ borderRadius: 'var(--radius-button)' }}>\r\n <Building2 className=\"w-3.5 h-3.5\" />\r\n {currentTenant.name}\r\n </span>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('common:favorites.manage')}\r\n </button>\r\n </div>\r\n\r\n {favoritesLoading && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length === 0 && (\r\n <div className=\"text-center py-8\">\r\n <Star className=\"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('common:favorites.noFavorites')}</p>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"px-4 py-2 bg-[var(--color-accent-600)] text-white font-medium hover:bg-[var(--color-accent-700)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('common:favorites.configureFavorites')}\r\n </button>\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length > 0 && (\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-3\">\r\n {favorites.map((module) => (\r\n <button\r\n key={module.id}\r\n onClick={() => handleModuleClick(module)}\r\n className=\"flex flex-col items-center gap-2 p-4 bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)] transition-all group\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div\r\n className=\"w-12 h-12 flex items-center justify-center bg-[var(--color-accent-100)] text-[var(--color-accent-600)] group-hover:bg-[var(--color-accent-600)] group-hover:text-white transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-6 h-6\" />\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)] text-center\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">{module.applicationLabel}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <StatCard\r\n title={t('navigation:dashboard.stats.totalSessions')}\r\n value={analytics?.totalSessions ?? 0}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n subtitle={`${period} ${t('navigation:dashboard.stats.lastDays')}`}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.avgDuration')}\r\n value={`${Math.round(analytics?.avgSessionDuration ?? 0)} min`}\r\n icon={<TrendingUp className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.perSession')}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.connectionErrors')}\r\n value={(errors ?? []).length}\r\n icon={<AlertTriangle className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.recent')}\r\n color={(errors ?? []).length > 0 ? 'red' : 'green'}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Calendar className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.weeklyUsage.title')}</h2>\r\n </div>\r\n <WeeklyUsageChart data={weeklyStats} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Clock className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.hourlyUsage.title')}</h2>\r\n </div>\r\n <HourlyUsageChart data={hourlyStats} />\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AppWindow className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.applicationUsage.title')}</h2>\r\n </div>\r\n <ApplicationUsageChart data={appUsage} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div className=\"flex items-center gap-3\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.sessionAnalytics.title')}</h2>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {([7, 30, 90] as const).map((p) => (\r\n <button\r\n key={p}\r\n onClick={() => setPeriod(p)}\r\n className={`px-3 py-1 text-sm font-medium transition-colors ${\r\n period === p\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t(`navigation:dashboard.sessionAnalytics.period.${p}days`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <SessionAnalyticsChart data={analytics?.dailyStats ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Monitor className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.currentSession.title')}</h2>\r\n </div>\r\n <CurrentSessionCard session={currentSession} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.loginErrors.title')}</h2>\r\n </div>\r\n <LoginErrorsTable errors={errors ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.deviceStats.title')}</h2>\r\n </div>\r\n <DeviceStatsCard stats={deviceStats} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatCard({\r\n title,\r\n value,\r\n icon,\r\n subtitle,\r\n color = 'blue',\r\n}: {\r\n title: string;\r\n value: string | number;\r\n icon: React.ReactNode;\r\n subtitle?: string;\r\n color?: 'blue' | 'green' | 'red';\r\n}) {\r\n const colorClasses = {\r\n blue: 'bg-blue-50 text-blue-600 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800',\r\n green: 'bg-green-50 text-green-600 border-green-200 dark:bg-green-900/20 dark:border-green-800',\r\n red: 'bg-red-50 text-red-600 border-red-200 dark:bg-red-900/20 dark:border-red-800',\r\n };\r\n\r\n return (\r\n <div\r\n className={`p-4 border ${colorClasses[color]}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {subtitle && <div className=\"text-xs opacity-70 mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n}\r\n"],"names":["SessionAnalyticsChart","data","t","useTranslation","chartData","item","jsx","ResponsiveContainer","jsxs","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","value","name","Legend","Line","LoginErrorsTable","errors","AlertTriangle","isRecent","loginAt","errorDate","error","recent","Fragment","MapPin","Globe","CurrentSessionCard","session","Monitor","formatDuration","minutes","hours","mins","extractBrowserName","userAgent","Clock","DeviceStatsCard","stats","browserColors","countryColors","index","maxCount","b","percentage","c","WeeklyUsageChart","avgDurationPerSession","d","acc","BarChart","ReferenceLine","Bar","HourlyUsageChart","formatHour","hour","entry","Cell","COLORS","ApplicationUsageChart","app","seconds","PieChart","Pie","percent","_name","props","DynamicIcon","className","IconComponent","LucideIcons","Star","UserDashboardPage","navigate","useNavigate","user","useAuth","currentTenant","useTenant","menu","useNavigation","favorites","favoritesLoading","triggerExpand","useFavoriteModules","period","setPeriod","useState","loading","setLoading","analytics","setAnalytics","setErrors","currentSession","setCurrentSession","deviceStats","setDeviceStats","weeklyStats","setWeeklyStats","hourlyStats","setHourlyStats","appUsage","setAppUsage","resolveRoute","module","navModule","m","firstSection","a","handleModuleClick","route","displayName","loadDashboardData","useCallback","userApi","useEffect","Loader2","Building2","Settings","StatCard","Activity","TrendingUp","Calendar","AppWindow","BarChart3","p","title","icon","subtitle","color"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),u=require("react"),W=require("react-router-dom"),h=require("react-i18next"),c=require("lucide-react"),v=require("./index-2wUhd9Lu.js"),i=require("recharts");function G(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const n=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(r,o,n.get?n:{enumerable:!0,get:()=>t[o]})}}return r.default=t,Object.freeze(r)}const H=G(c);function Y({data:t}){const{t:r}=h.useTranslation("navigation");if(!t||t.length===0)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.sessionAnalytics.noData")});const o=t.map(n=>({date:new Date(n.date).toLocaleDateString("fr-FR",{day:"2-digit",month:"2-digit"}),loginCount:n.loginCount,avgDuration:Math.round(n.avgDuration)}));return e.jsx(i.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(i.LineChart,{data:o,margin:{top:5,right:30,left:20,bottom:5},children:[e.jsx(i.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(i.XAxis,{dataKey:"date",stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12}}),e.jsx(i.YAxis,{yAxisId:"left",stroke:"var(--color-accent-500)",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.sessionAnalytics.connections"),angle:-90,position:"insideLeft",fill:"var(--text-secondary)"}}),e.jsx(i.YAxis,{yAxisId:"right",orientation:"right",stroke:"#22c55e",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.sessionAnalytics.avgDuration"),angle:90,position:"insideRight",fill:"var(--text-secondary)"}}),e.jsx(i.Tooltip,{contentStyle:{backgroundColor:"var(--bg-card)",border:"1px solid var(--border-color)",borderRadius:"var(--radius-card)",color:"var(--text-primary)"},formatter:(n,a)=>a==="loginCount"?[n,r("dashboard.sessionAnalytics.connections")]:a==="avgDuration"?[`${n} min`,r("dashboard.sessionAnalytics.avgDuration")]:[n,a||""]}),e.jsx(i.Legend,{wrapperStyle:{color:"var(--text-secondary)"},formatter:n=>n==="loginCount"?r("dashboard.sessionAnalytics.connections"):n==="avgDuration"?r("dashboard.sessionAnalytics.avgDurationMin"):n}),e.jsx(i.Line,{yAxisId:"left",type:"monotone",dataKey:"loginCount",stroke:"var(--color-accent-500)",strokeWidth:2,dot:{fill:"var(--color-accent-500)",r:4},activeDot:{r:6}}),e.jsx(i.Line,{yAxisId:"right",type:"monotone",dataKey:"avgDuration",stroke:"#22c55e",strokeWidth:2,dot:{fill:"#22c55e",r:4},activeDot:{r:6}})]})})}function _({errors:t}){const{t:r}=h.useTranslation("navigation");if(!Array.isArray(t)||t.length===0)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]",children:[e.jsx(c.AlertTriangle,{className:"w-12 h-12 mb-3 text-green-500"}),e.jsx("p",{className:"font-medium",children:r("dashboard.loginErrors.noErrors")}),e.jsx("p",{className:"text-sm mt-1",children:r("dashboard.loginErrors.accountSecure")})]});const o=n=>{const a=new Date(n);return(new Date().getTime()-a.getTime())/(1e3*60*60)<24};return e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border-color)]",children:[e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.datetime")}),e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.reason")}),e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.ipAddress")}),e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.location")})]})}),e.jsx("tbody",{children:t.map(n=>{const a=o(n.loginAt);return e.jsxs("tr",{className:`border-b border-[var(--border-color)] hover:bg-[var(--bg-secondary)] ${a?"bg-red-50/50 dark:bg-red-900/10":""}`,children:[e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[a&&e.jsx("span",{className:"w-2 h-2 rounded-full bg-red-500 animate-pulse",title:r("dashboard.loginErrors.recentLabel")}),e.jsx("span",{className:"text-sm",children:new Date(n.loginAt).toLocaleDateString("fr-FR",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"})})]})}),e.jsx("td",{className:"p-3",children:e.jsxs("span",{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",style:{borderRadius:"var(--radius-badge)"},children:[e.jsx(c.AlertTriangle,{className:"w-3 h-3"}),n.failureReason]})}),e.jsx("td",{className:"p-3",children:e.jsx("span",{className:"text-sm font-mono text-[var(--text-secondary)]",children:n.ipAddress||"N/A"})}),e.jsx("td",{className:"p-3",children:n.city||n.country?e.jsxs("div",{className:"flex items-center gap-1 text-sm text-[var(--text-secondary)]",children:[n.city&&e.jsxs(e.Fragment,{children:[e.jsx(c.MapPin,{className:"w-3 h-3"}),e.jsx("span",{children:n.city})]}),n.country&&e.jsxs(e.Fragment,{children:[e.jsx(c.Globe,{className:"w-3 h-3"}),e.jsx("span",{children:n.country})]})]}):e.jsx("span",{className:"text-sm text-[var(--text-tertiary)]",children:r("dashboard.loginErrors.notAvailable")})})]},n.loginAt)})})]})})}function X({session:t}){const{t:r}=h.useTranslation("navigation");if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]",children:[e.jsx(c.Monitor,{className:"w-12 h-12 mb-3 opacity-50"}),e.jsx("p",{className:"font-medium",children:r("dashboard.currentSession.noActiveSession")}),e.jsx("p",{className:"text-sm mt-1",children:r("dashboard.currentSession.pleaseReconnect")})]});const o=a=>{if(a<1)return"< 1 minute";if(a<60)return`${Math.round(a)} minutes`;const s=Math.floor(a/60),d=Math.round(a%60);return d===0?`${s}h`:`${s}h ${d}min`},n=a=>a?a.includes("Edg/")?r("dashboard.browsers.edge"):a.includes("Chrome/")?r("dashboard.browsers.chrome"):a.includes("Firefox/")?r("dashboard.browsers.firefox"):a.includes("Safari/")&&!a.includes("Chrome")?r("dashboard.browsers.safari"):a.includes("OPR/")||a.includes("Opera/")?r("dashboard.browsers.opera"):r("dashboard.browsers.other"):r("dashboard.browsers.unknown");return e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{className:"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)]",style:{borderRadius:"var(--radius-button)"},children:e.jsx(c.Clock,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-xs text-[var(--text-tertiary)] uppercase tracking-wide",children:r("dashboard.currentSession.duration")}),e.jsx("p",{className:"text-lg font-bold text-[var(--text-primary)] mt-1",children:o(t.durationMinutes)}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[r("dashboard.currentSession.since")," ",new Date(t.loginAt).toLocaleTimeString("fr-FR",{hour:"2-digit",minute:"2-digit"})]})]})]}),e.jsxs("div",{className:"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{className:"p-2 bg-blue-500/10 text-blue-500",style:{borderRadius:"var(--radius-button)"},children:e.jsx(c.Monitor,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-xs text-[var(--text-tertiary)] uppercase tracking-wide",children:r("dashboard.currentSession.device")}),e.jsx("p",{className:"text-lg font-bold text-[var(--text-primary)] mt-1",children:n(t.userAgent)}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] mt-1 font-mono",children:t.ipAddress||r("dashboard.currentSession.ipNotAvailable")})]})]}),(t.city||t.country)&&e.jsxs("div",{className:"md:col-span-2 flex items-start gap-3 p-4 bg-[var(--bg-secondary)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{className:"p-2 bg-green-500/10 text-green-500",style:{borderRadius:"var(--radius-button)"},children:e.jsx(c.Globe,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-xs text-[var(--text-tertiary)] uppercase tracking-wide",children:r("dashboard.currentSession.location")}),e.jsxs("div",{className:"flex items-center gap-3 mt-1",children:[t.city&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(c.MapPin,{className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:t.city})]}),t.country&&e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:t.country})]})]})]})]})}function J({stats:t}){const{t:r}=h.useTranslation("navigation");if(!t)return e.jsx("div",{className:"flex items-center justify-center py-8 text-[var(--text-secondary)]",children:e.jsx("p",{children:r("dashboard.deviceStats.noData")})});const o=["#3b82f6","#8b5cf6","#22c55e","#f59e0b","#ef4444"],n=["#06b6d4","#ec4899","#10b981","#f97316","#6366f1"];return e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsxs("div",{children:[e.jsxs("h4",{className:"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2",children:[e.jsx(c.Monitor,{className:"w-4 h-4"}),r("dashboard.deviceStats.browsersUsed")]}),t.byBrowser?.length?e.jsx("div",{className:"space-y-3",children:t.byBrowser.map((a,s)=>{const d=Math.max(...t.byBrowser.map(m=>m.count),1),x=a.count/d*100;return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-24 text-sm text-[var(--text-primary)] truncate",title:a.browser,children:a.browser}),e.jsx("div",{className:"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${x}%`,backgroundColor:o[s%o.length]}})}),e.jsx("div",{className:"w-12 text-right font-medium text-[var(--text-primary)]",children:a.count})]},a.browser)})}):e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:r("dashboard.deviceStats.noData")})]}),e.jsxs("div",{children:[e.jsxs("h4",{className:"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2",children:[e.jsx(c.Globe,{className:"w-4 h-4"}),r("dashboard.deviceStats.connectionCountries")]}),t.byCountry?.length?e.jsx("div",{className:"space-y-3",children:t.byCountry.map((a,s)=>{const d=Math.max(...t.byCountry.map(m=>m.count),1),x=a.count/d*100;return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-24 text-sm text-[var(--text-primary)] truncate",title:a.country,children:a.country}),e.jsx("div",{className:"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${x}%`,backgroundColor:n[s%n.length]}})}),e.jsx("div",{className:"w-12 text-right font-medium text-[var(--text-primary)]",children:a.count})]},a.country)})}):e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:r("dashboard.deviceStats.locationNotAvailable")})]})]})}function Q({data:t}){const{t:r}=h.useTranslation("navigation");if(!t?.dayStats?.length)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.weeklyUsage.noData")});const o=t.dayStats.map(s=>({day:r(`dashboard.days.${s.dayName.toLowerCase()}`),duration:s.sessionCount>0?Math.round(s.totalDuration/s.sessionCount):0,sessionCount:s.sessionCount})),n=o.filter(s=>s.sessionCount>0).length>0?o.filter(s=>s.sessionCount>0).reduce((s,d)=>s+d.duration,0)/o.filter(s=>s.sessionCount>0).length:0,a=s=>{if(s<60)return`${s} min`;const d=Math.floor(s/60),x=s%60;return x>0?`${d}h ${x}m`:`${d}h`};return e.jsx(i.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(i.BarChart,{data:o,margin:{top:20,right:30,left:20,bottom:5},children:[e.jsx(i.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(i.XAxis,{dataKey:"day",stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12}}),e.jsx(i.YAxis,{stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.weeklyUsage.duration"),angle:-90,position:"insideLeft",fill:"var(--text-secondary)"}}),e.jsx(i.Tooltip,{cursor:{fill:"transparent"},contentStyle:{backgroundColor:"var(--bg-tertiary)",border:"none",borderRadius:"var(--radius-card)",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",padding:"8px 12px"},formatter:s=>[a(s),null],labelStyle:{color:"var(--text-primary)",fontWeight:600,marginBottom:4},itemStyle:{color:"var(--text-secondary)",padding:0},separator:""}),e.jsx(i.ReferenceLine,{y:n,stroke:"#f59e0b",strokeDasharray:"5 5",label:{value:`${r("dashboard.weeklyUsage.average")}: ${a(Math.round(n))}`,position:"right",fill:"#f59e0b",fontSize:11}}),e.jsx(i.Bar,{dataKey:"duration",fill:"var(--color-accent-500)",radius:[4,4,0,0]})]})})}function V({data:t}){const{t:r}=h.useTranslation("navigation");if(!t?.hourStats?.length)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.hourlyUsage.noData")});const o=s=>`${s.toString().padStart(2,"0")}:00`,n=s=>{if(s<60)return`${s} min`;const d=Math.floor(s/60),x=s%60;return x>0?`${d}h ${x}m`:`${d}h`},a=t.hourStats.map(s=>({hour:o(s.hour),hourNum:s.hour,duration:s.sessionCount>0?Math.round(s.totalDuration/s.sessionCount):0,sessionCount:s.sessionCount,isPeak:s.hour===t.peakHour}));return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-end mb-2 text-xs text-[var(--text-secondary)]",children:[e.jsx("span",{className:"inline-block w-3 h-3 rounded-sm bg-[var(--color-accent-600)] mr-1"}),r("dashboard.hourlyUsage.peakHour"),": ",o(t.peakHour)]}),e.jsx(i.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(i.BarChart,{data:a,margin:{top:10,right:30,left:20,bottom:5},children:[e.jsx(i.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(i.XAxis,{dataKey:"hour",stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:11},interval:0,angle:-45,textAnchor:"end",height:60}),e.jsx(i.YAxis,{stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.hourlyUsage.duration"),angle:-90,position:"insideLeft",fill:"var(--text-secondary)"}}),e.jsx(i.Tooltip,{cursor:{fill:"transparent"},contentStyle:{backgroundColor:"var(--bg-tertiary)",border:"none",borderRadius:"var(--radius-card)",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",padding:"8px 12px"},formatter:s=>[n(s),null],labelStyle:{color:"var(--text-primary)",fontWeight:600,marginBottom:4},itemStyle:{color:"var(--text-secondary)",padding:0},separator:""}),e.jsx(i.Bar,{dataKey:"duration",radius:[4,4,0,0],children:a.map((s,d)=>e.jsx(i.Cell,{fill:s.isPeak?"var(--color-accent-600)":"var(--color-accent-400)"},`${s.hour}-${d}`))})]})})]})}const f=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899","#84cc16","#f97316","#6366f1"];function Z({data:t}){const{t:r}=h.useTranslation("navigation");if(!t?.applications?.length)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.applicationUsage.noData")});const o=t.applications.map(a=>({name:a.applicationName,value:a.accessCount,duration:a.totalDurationSeconds,percentage:a.percentage})),n=a=>a<60?`${a}s`:a<3600?`${Math.round(a/60)}m`:`${Math.round(a/3600)}h`;return e.jsxs("div",{className:"flex flex-col md:flex-row items-center gap-6",children:[e.jsx("div",{className:"w-full md:w-1/2",children:e.jsx(i.ResponsiveContainer,{width:"100%",height:280,children:e.jsxs(i.PieChart,{children:[e.jsx(i.Pie,{data:o,cx:"50%",cy:"50%",innerRadius:60,outerRadius:90,dataKey:"value",label:({name:a,percent:s})=>`${a} (${((s??0)*100).toFixed(0)}%)`,labelLine:!1,children:o.map((a,s)=>e.jsx(i.Cell,{fill:f[s%f.length]},`${a.name}-${s}`))}),e.jsx(i.Tooltip,{contentStyle:{backgroundColor:"var(--bg-tertiary)",border:"none",borderRadius:"var(--radius-card)",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",padding:"8px 12px"},formatter:(a,s,d)=>[`${a} ${r("dashboard.applicationUsage.accesses")} (${n(d.payload.duration)})`,null],labelStyle:{color:"var(--text-primary)",fontWeight:600,marginBottom:4},itemStyle:{color:"var(--text-secondary)",padding:0},separator:""})]})})}),e.jsxs("div",{className:"w-full md:w-1/2",children:[e.jsxs("div",{className:"text-sm text-[var(--text-secondary)] mb-3",children:[r("dashboard.applicationUsage.totalAccess"),": ",e.jsx("span",{className:"font-semibold text-[var(--text-primary)]",children:t.totalAccess})]}),e.jsx("div",{className:"space-y-2 max-h-[240px] overflow-y-auto",children:t.applications.map((a,s)=>e.jsxs("div",{className:"flex items-center gap-3 p-2 rounded-[var(--radius-card)] hover:bg-[var(--bg-hover)] transition-colors",children:[e.jsx("div",{className:"w-3 h-3 rounded-sm flex-shrink-0",style:{backgroundColor:f[s%f.length]}}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--text-primary)] truncate",children:a.applicationName}),e.jsxs("div",{className:"text-xs text-[var(--text-secondary)]",children:[a.accessCount," ",r("dashboard.applicationUsage.accesses")," - ",n(a.totalDurationSeconds)]})]}),e.jsxs("div",{className:"text-sm font-semibold text-[var(--text-primary)]",children:[a.percentage,"%"]})]},a.applicationId))})]})]})}function ee({name:t,className:r}){const n=H[t];return n?e.jsx(n,{className:r}):e.jsx(c.Star,{className:r})}function te(){const{t}=h.useTranslation(["navigation","common"]),r=W.useNavigate(),{user:o}=v.useAuth(),{currentTenant:n}=v.useTenant(),{menu:a}=v.useNavigation(),{favorites:s,loading:d,triggerExpand:x}=v.useFavorites(),[m,T]=u.useState(30),[U,N]=u.useState(!0),[y,w]=u.useState(null),[p,S]=u.useState([]),[L,C]=u.useState(null),[E,k]=u.useState(null),[B,D]=u.useState(null),[P,A]=u.useState(null),[O,R]=u.useState(null),F=l=>{if(a)for(const b of a.applications){const M=b.modules.find(g=>g.id===l.id);if(M?.sections?.length){const g=[...M.sections].sort((q,K)=>q.displayOrder-K.displayOrder)[0];if(g.route)return g.route}}return l.route},I=l=>{const b=F(l);b&&(x(),r(b))},z=o?.firstName&&o?.lastName?`${o.firstName} ${o.lastName}`:o?.email||"Utilisateur",$=u.useCallback(async()=>{try{N(!0);const l=await v.userApi.dashboard.getAll(m,10);w(l.sessionAnalytics),S(l.loginErrors??[]),C(l.currentSession),k(l.deviceStats),D(l.weeklyStats),A(l.hourlyStats),R(l.applicationUsage)}catch{w(null),S([]),C(null),k(null),D(null),A(null),R(null)}finally{N(!1)}},[m]);return u.useEffect(()=>{$()},[m,$]),U?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(c.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-500)]"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:[t("navigation:dashboard.welcome"),", ",z]}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:t("navigation:breadcrumb.myspace")})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(c.Star,{className:"w-5 h-5 text-[var(--color-accent-500)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("common:favorites.quickAccess")}),n&&e.jsxs("span",{className:"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] px-2 py-1 bg-[var(--bg-secondary)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-button)"},children:[e.jsx(c.Building2,{className:"w-3.5 h-3.5"}),n.name]})]}),e.jsxs("button",{onClick:()=>r("/myspace/preferences?tab=favorites"),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",style:{borderRadius:"var(--radius-button)"},children:[e.jsx(c.Settings,{className:"w-4 h-4"}),t("common:favorites.manage")]})]}),d&&e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(c.Loader2,{className:"w-6 h-6 animate-spin text-[var(--color-accent-500)]"})}),!d&&s.length===0&&e.jsxs("div",{className:"text-center py-8",children:[e.jsx(c.Star,{className:"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3"}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-4",children:t("common:favorites.noFavorites")}),e.jsx("button",{onClick:()=>r("/myspace/preferences?tab=favorites"),className:"px-4 py-2 bg-[var(--color-accent-600)] text-white font-medium hover:bg-[var(--color-accent-700)] transition-colors",style:{borderRadius:"var(--radius-button)"},children:t("common:favorites.configureFavorites")})]}),!d&&s.length>0&&e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-3",children:s.map(l=>e.jsxs("button",{onClick:()=>I(l),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",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{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",style:{borderRadius:"var(--radius-button)"},children:e.jsx(ee,{name:l.icon,className:"w-6 h-6"})}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)] text-center",children:l.label}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:l.applicationLabel})]},l.id))})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsx(j,{title:t("navigation:dashboard.stats.totalSessions"),value:y?.totalSessions??0,icon:e.jsx(c.Activity,{className:"w-5 h-5"}),subtitle:`${m} ${t("navigation:dashboard.stats.lastDays")}`}),e.jsx(j,{title:t("navigation:dashboard.stats.avgDuration"),value:`${Math.round(y?.avgSessionDuration??0)} min`,icon:e.jsx(c.TrendingUp,{className:"w-5 h-5"}),subtitle:t("navigation:dashboard.stats.perSession")}),e.jsx(j,{title:t("navigation:dashboard.stats.connectionErrors"),value:(p??[]).length,icon:e.jsx(c.AlertTriangle,{className:"w-5 h-5"}),subtitle:t("navigation:dashboard.stats.recent"),color:(p??[]).length>0?"red":"green"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.Calendar,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.weeklyUsage.title")})]}),e.jsx(Q,{data:B})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.Clock,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.hourlyUsage.title")})]}),e.jsx(V,{data:P})]})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.AppWindow,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.applicationUsage.title")})]}),e.jsx(Z,{data:O})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(c.BarChart3,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.sessionAnalytics.title")})]}),e.jsx("div",{className:"flex gap-2",children:[7,30,90].map(l=>e.jsx("button",{onClick:()=>T(l),className:`px-3 py-1 text-sm font-medium transition-colors ${m===l?"bg-[var(--color-accent-500)] text-white":"bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)]"}`,style:{borderRadius:"var(--radius-button)"},children:t(`navigation:dashboard.sessionAnalytics.period.${l}days`)},l))})]}),e.jsx(Y,{data:y?.dailyStats??[]})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.Monitor,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.currentSession.title")})]}),e.jsx(X,{session:L})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.AlertTriangle,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.loginErrors.title")})]}),e.jsx(_,{errors:p??[]})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.BarChart3,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.deviceStats.title")})]}),e.jsx(J,{stats:E})]})]})}function j({title:t,value:r,icon:o,subtitle:n,color:a="blue"}){const s={blue:"bg-blue-50 text-blue-600 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800",green:"bg-green-50 text-green-600 border-green-200 dark:bg-green-900/20 dark:border-green-800",red:"bg-red-50 text-red-600 border-red-200 dark:bg-red-900/20 dark:border-red-800"};return e.jsxs("div",{className:`p-4 border ${s[a]}`,style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium opacity-80",children:t}),o]}),e.jsx("div",{className:"text-2xl font-bold",children:r}),n&&e.jsx("div",{className:"text-xs opacity-70 mt-1",children:n})]})}exports.UserDashboardPage=te;
2
- //# sourceMappingURL=UserDashboardPage-B53C8fUq.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),u=require("react"),W=require("react-router-dom"),h=require("react-i18next"),c=require("lucide-react"),v=require("./index-IgLVXPg8.js"),i=require("recharts");function G(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const n=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(r,o,n.get?n:{enumerable:!0,get:()=>t[o]})}}return r.default=t,Object.freeze(r)}const H=G(c);function Y({data:t}){const{t:r}=h.useTranslation("navigation");if(!t||t.length===0)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.sessionAnalytics.noData")});const o=t.map(n=>({date:new Date(n.date).toLocaleDateString("fr-FR",{day:"2-digit",month:"2-digit"}),loginCount:n.loginCount,avgDuration:Math.round(n.avgDuration)}));return e.jsx(i.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(i.LineChart,{data:o,margin:{top:5,right:30,left:20,bottom:5},children:[e.jsx(i.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(i.XAxis,{dataKey:"date",stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12}}),e.jsx(i.YAxis,{yAxisId:"left",stroke:"var(--color-accent-500)",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.sessionAnalytics.connections"),angle:-90,position:"insideLeft",fill:"var(--text-secondary)"}}),e.jsx(i.YAxis,{yAxisId:"right",orientation:"right",stroke:"#22c55e",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.sessionAnalytics.avgDuration"),angle:90,position:"insideRight",fill:"var(--text-secondary)"}}),e.jsx(i.Tooltip,{contentStyle:{backgroundColor:"var(--bg-card)",border:"1px solid var(--border-color)",borderRadius:"var(--radius-card)",color:"var(--text-primary)"},formatter:(n,a)=>a==="loginCount"?[n,r("dashboard.sessionAnalytics.connections")]:a==="avgDuration"?[`${n} min`,r("dashboard.sessionAnalytics.avgDuration")]:[n,a||""]}),e.jsx(i.Legend,{wrapperStyle:{color:"var(--text-secondary)"},formatter:n=>n==="loginCount"?r("dashboard.sessionAnalytics.connections"):n==="avgDuration"?r("dashboard.sessionAnalytics.avgDurationMin"):n}),e.jsx(i.Line,{yAxisId:"left",type:"monotone",dataKey:"loginCount",stroke:"var(--color-accent-500)",strokeWidth:2,dot:{fill:"var(--color-accent-500)",r:4},activeDot:{r:6}}),e.jsx(i.Line,{yAxisId:"right",type:"monotone",dataKey:"avgDuration",stroke:"#22c55e",strokeWidth:2,dot:{fill:"#22c55e",r:4},activeDot:{r:6}})]})})}function _({errors:t}){const{t:r}=h.useTranslation("navigation");if(!Array.isArray(t)||t.length===0)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]",children:[e.jsx(c.AlertTriangle,{className:"w-12 h-12 mb-3 text-green-500"}),e.jsx("p",{className:"font-medium",children:r("dashboard.loginErrors.noErrors")}),e.jsx("p",{className:"text-sm mt-1",children:r("dashboard.loginErrors.accountSecure")})]});const o=n=>{const a=new Date(n);return(new Date().getTime()-a.getTime())/(1e3*60*60)<24};return e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border-color)]",children:[e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.datetime")}),e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.reason")}),e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.ipAddress")}),e.jsx("th",{className:"text-left p-3 font-medium text-[var(--text-secondary)] text-sm",children:r("dashboard.loginErrors.columns.location")})]})}),e.jsx("tbody",{children:t.map(n=>{const a=o(n.loginAt);return e.jsxs("tr",{className:`border-b border-[var(--border-color)] hover:bg-[var(--bg-secondary)] ${a?"bg-red-50/50 dark:bg-red-900/10":""}`,children:[e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[a&&e.jsx("span",{className:"w-2 h-2 rounded-full bg-red-500 animate-pulse",title:r("dashboard.loginErrors.recentLabel")}),e.jsx("span",{className:"text-sm",children:new Date(n.loginAt).toLocaleDateString("fr-FR",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"})})]})}),e.jsx("td",{className:"p-3",children:e.jsxs("span",{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",style:{borderRadius:"var(--radius-badge)"},children:[e.jsx(c.AlertTriangle,{className:"w-3 h-3"}),n.failureReason]})}),e.jsx("td",{className:"p-3",children:e.jsx("span",{className:"text-sm font-mono text-[var(--text-secondary)]",children:n.ipAddress||"N/A"})}),e.jsx("td",{className:"p-3",children:n.city||n.country?e.jsxs("div",{className:"flex items-center gap-1 text-sm text-[var(--text-secondary)]",children:[n.city&&e.jsxs(e.Fragment,{children:[e.jsx(c.MapPin,{className:"w-3 h-3"}),e.jsx("span",{children:n.city})]}),n.country&&e.jsxs(e.Fragment,{children:[e.jsx(c.Globe,{className:"w-3 h-3"}),e.jsx("span",{children:n.country})]})]}):e.jsx("span",{className:"text-sm text-[var(--text-tertiary)]",children:r("dashboard.loginErrors.notAvailable")})})]},n.loginAt)})})]})})}function X({session:t}){const{t:r}=h.useTranslation("navigation");if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]",children:[e.jsx(c.Monitor,{className:"w-12 h-12 mb-3 opacity-50"}),e.jsx("p",{className:"font-medium",children:r("dashboard.currentSession.noActiveSession")}),e.jsx("p",{className:"text-sm mt-1",children:r("dashboard.currentSession.pleaseReconnect")})]});const o=a=>{if(a<1)return"< 1 minute";if(a<60)return`${Math.round(a)} minutes`;const s=Math.floor(a/60),d=Math.round(a%60);return d===0?`${s}h`:`${s}h ${d}min`},n=a=>a?a.includes("Edg/")?r("dashboard.browsers.edge"):a.includes("Chrome/")?r("dashboard.browsers.chrome"):a.includes("Firefox/")?r("dashboard.browsers.firefox"):a.includes("Safari/")&&!a.includes("Chrome")?r("dashboard.browsers.safari"):a.includes("OPR/")||a.includes("Opera/")?r("dashboard.browsers.opera"):r("dashboard.browsers.other"):r("dashboard.browsers.unknown");return e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{className:"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)]",style:{borderRadius:"var(--radius-button)"},children:e.jsx(c.Clock,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-xs text-[var(--text-tertiary)] uppercase tracking-wide",children:r("dashboard.currentSession.duration")}),e.jsx("p",{className:"text-lg font-bold text-[var(--text-primary)] mt-1",children:o(t.durationMinutes)}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[r("dashboard.currentSession.since")," ",new Date(t.loginAt).toLocaleTimeString("fr-FR",{hour:"2-digit",minute:"2-digit"})]})]})]}),e.jsxs("div",{className:"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{className:"p-2 bg-blue-500/10 text-blue-500",style:{borderRadius:"var(--radius-button)"},children:e.jsx(c.Monitor,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-xs text-[var(--text-tertiary)] uppercase tracking-wide",children:r("dashboard.currentSession.device")}),e.jsx("p",{className:"text-lg font-bold text-[var(--text-primary)] mt-1",children:n(t.userAgent)}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] mt-1 font-mono",children:t.ipAddress||r("dashboard.currentSession.ipNotAvailable")})]})]}),(t.city||t.country)&&e.jsxs("div",{className:"md:col-span-2 flex items-start gap-3 p-4 bg-[var(--bg-secondary)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{className:"p-2 bg-green-500/10 text-green-500",style:{borderRadius:"var(--radius-button)"},children:e.jsx(c.Globe,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-xs text-[var(--text-tertiary)] uppercase tracking-wide",children:r("dashboard.currentSession.location")}),e.jsxs("div",{className:"flex items-center gap-3 mt-1",children:[t.city&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(c.MapPin,{className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:t.city})]}),t.country&&e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:t.country})]})]})]})]})}function J({stats:t}){const{t:r}=h.useTranslation("navigation");if(!t)return e.jsx("div",{className:"flex items-center justify-center py-8 text-[var(--text-secondary)]",children:e.jsx("p",{children:r("dashboard.deviceStats.noData")})});const o=["#3b82f6","#8b5cf6","#22c55e","#f59e0b","#ef4444"],n=["#06b6d4","#ec4899","#10b981","#f97316","#6366f1"];return e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsxs("div",{children:[e.jsxs("h4",{className:"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2",children:[e.jsx(c.Monitor,{className:"w-4 h-4"}),r("dashboard.deviceStats.browsersUsed")]}),t.byBrowser?.length?e.jsx("div",{className:"space-y-3",children:t.byBrowser.map((a,s)=>{const d=Math.max(...t.byBrowser.map(m=>m.count),1),x=a.count/d*100;return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-24 text-sm text-[var(--text-primary)] truncate",title:a.browser,children:a.browser}),e.jsx("div",{className:"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${x}%`,backgroundColor:o[s%o.length]}})}),e.jsx("div",{className:"w-12 text-right font-medium text-[var(--text-primary)]",children:a.count})]},a.browser)})}):e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:r("dashboard.deviceStats.noData")})]}),e.jsxs("div",{children:[e.jsxs("h4",{className:"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2",children:[e.jsx(c.Globe,{className:"w-4 h-4"}),r("dashboard.deviceStats.connectionCountries")]}),t.byCountry?.length?e.jsx("div",{className:"space-y-3",children:t.byCountry.map((a,s)=>{const d=Math.max(...t.byCountry.map(m=>m.count),1),x=a.count/d*100;return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-24 text-sm text-[var(--text-primary)] truncate",title:a.country,children:a.country}),e.jsx("div",{className:"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${x}%`,backgroundColor:n[s%n.length]}})}),e.jsx("div",{className:"w-12 text-right font-medium text-[var(--text-primary)]",children:a.count})]},a.country)})}):e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:r("dashboard.deviceStats.locationNotAvailable")})]})]})}function Q({data:t}){const{t:r}=h.useTranslation("navigation");if(!t?.dayStats?.length)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.weeklyUsage.noData")});const o=t.dayStats.map(s=>({day:r(`dashboard.days.${s.dayName.toLowerCase()}`),duration:s.sessionCount>0?Math.round(s.totalDuration/s.sessionCount):0,sessionCount:s.sessionCount})),n=o.filter(s=>s.sessionCount>0).length>0?o.filter(s=>s.sessionCount>0).reduce((s,d)=>s+d.duration,0)/o.filter(s=>s.sessionCount>0).length:0,a=s=>{if(s<60)return`${s} min`;const d=Math.floor(s/60),x=s%60;return x>0?`${d}h ${x}m`:`${d}h`};return e.jsx(i.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(i.BarChart,{data:o,margin:{top:20,right:30,left:20,bottom:5},children:[e.jsx(i.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(i.XAxis,{dataKey:"day",stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12}}),e.jsx(i.YAxis,{stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.weeklyUsage.duration"),angle:-90,position:"insideLeft",fill:"var(--text-secondary)"}}),e.jsx(i.Tooltip,{cursor:{fill:"transparent"},contentStyle:{backgroundColor:"var(--bg-tertiary)",border:"none",borderRadius:"var(--radius-card)",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",padding:"8px 12px"},formatter:s=>[a(s),null],labelStyle:{color:"var(--text-primary)",fontWeight:600,marginBottom:4},itemStyle:{color:"var(--text-secondary)",padding:0},separator:""}),e.jsx(i.ReferenceLine,{y:n,stroke:"#f59e0b",strokeDasharray:"5 5",label:{value:`${r("dashboard.weeklyUsage.average")}: ${a(Math.round(n))}`,position:"right",fill:"#f59e0b",fontSize:11}}),e.jsx(i.Bar,{dataKey:"duration",fill:"var(--color-accent-500)",radius:[4,4,0,0]})]})})}function V({data:t}){const{t:r}=h.useTranslation("navigation");if(!t?.hourStats?.length)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.hourlyUsage.noData")});const o=s=>`${s.toString().padStart(2,"0")}:00`,n=s=>{if(s<60)return`${s} min`;const d=Math.floor(s/60),x=s%60;return x>0?`${d}h ${x}m`:`${d}h`},a=t.hourStats.map(s=>({hour:o(s.hour),hourNum:s.hour,duration:s.sessionCount>0?Math.round(s.totalDuration/s.sessionCount):0,sessionCount:s.sessionCount,isPeak:s.hour===t.peakHour}));return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-end mb-2 text-xs text-[var(--text-secondary)]",children:[e.jsx("span",{className:"inline-block w-3 h-3 rounded-sm bg-[var(--color-accent-600)] mr-1"}),r("dashboard.hourlyUsage.peakHour"),": ",o(t.peakHour)]}),e.jsx(i.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(i.BarChart,{data:a,margin:{top:10,right:30,left:20,bottom:5},children:[e.jsx(i.CartesianGrid,{strokeDasharray:"3 3",stroke:"var(--border-color)"}),e.jsx(i.XAxis,{dataKey:"hour",stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:11},interval:0,angle:-45,textAnchor:"end",height:60}),e.jsx(i.YAxis,{stroke:"var(--text-secondary)",tick:{fill:"var(--text-secondary)",fontSize:12},label:{value:r("dashboard.hourlyUsage.duration"),angle:-90,position:"insideLeft",fill:"var(--text-secondary)"}}),e.jsx(i.Tooltip,{cursor:{fill:"transparent"},contentStyle:{backgroundColor:"var(--bg-tertiary)",border:"none",borderRadius:"var(--radius-card)",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",padding:"8px 12px"},formatter:s=>[n(s),null],labelStyle:{color:"var(--text-primary)",fontWeight:600,marginBottom:4},itemStyle:{color:"var(--text-secondary)",padding:0},separator:""}),e.jsx(i.Bar,{dataKey:"duration",radius:[4,4,0,0],children:a.map((s,d)=>e.jsx(i.Cell,{fill:s.isPeak?"var(--color-accent-600)":"var(--color-accent-400)"},`${s.hour}-${d}`))})]})})]})}const f=["#3b82f6","#22c55e","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#ec4899","#84cc16","#f97316","#6366f1"];function Z({data:t}){const{t:r}=h.useTranslation("navigation");if(!t?.applications?.length)return e.jsx("div",{className:"flex items-center justify-center h-64 text-[var(--text-secondary)]",children:r("dashboard.applicationUsage.noData")});const o=t.applications.map(a=>({name:a.applicationName,value:a.accessCount,duration:a.totalDurationSeconds,percentage:a.percentage})),n=a=>a<60?`${a}s`:a<3600?`${Math.round(a/60)}m`:`${Math.round(a/3600)}h`;return e.jsxs("div",{className:"flex flex-col md:flex-row items-center gap-6",children:[e.jsx("div",{className:"w-full md:w-1/2",children:e.jsx(i.ResponsiveContainer,{width:"100%",height:280,children:e.jsxs(i.PieChart,{children:[e.jsx(i.Pie,{data:o,cx:"50%",cy:"50%",innerRadius:60,outerRadius:90,dataKey:"value",label:({name:a,percent:s})=>`${a} (${((s??0)*100).toFixed(0)}%)`,labelLine:!1,children:o.map((a,s)=>e.jsx(i.Cell,{fill:f[s%f.length]},`${a.name}-${s}`))}),e.jsx(i.Tooltip,{contentStyle:{backgroundColor:"var(--bg-tertiary)",border:"none",borderRadius:"var(--radius-card)",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",padding:"8px 12px"},formatter:(a,s,d)=>[`${a} ${r("dashboard.applicationUsage.accesses")} (${n(d.payload.duration)})`,null],labelStyle:{color:"var(--text-primary)",fontWeight:600,marginBottom:4},itemStyle:{color:"var(--text-secondary)",padding:0},separator:""})]})})}),e.jsxs("div",{className:"w-full md:w-1/2",children:[e.jsxs("div",{className:"text-sm text-[var(--text-secondary)] mb-3",children:[r("dashboard.applicationUsage.totalAccess"),": ",e.jsx("span",{className:"font-semibold text-[var(--text-primary)]",children:t.totalAccess})]}),e.jsx("div",{className:"space-y-2 max-h-[240px] overflow-y-auto",children:t.applications.map((a,s)=>e.jsxs("div",{className:"flex items-center gap-3 p-2 rounded-[var(--radius-card)] hover:bg-[var(--bg-hover)] transition-colors",children:[e.jsx("div",{className:"w-3 h-3 rounded-sm flex-shrink-0",style:{backgroundColor:f[s%f.length]}}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--text-primary)] truncate",children:a.applicationName}),e.jsxs("div",{className:"text-xs text-[var(--text-secondary)]",children:[a.accessCount," ",r("dashboard.applicationUsage.accesses")," - ",n(a.totalDurationSeconds)]})]}),e.jsxs("div",{className:"text-sm font-semibold text-[var(--text-primary)]",children:[a.percentage,"%"]})]},a.applicationId))})]})]})}function ee({name:t,className:r}){const n=H[t];return n?e.jsx(n,{className:r}):e.jsx(c.Star,{className:r})}function te(){const{t}=h.useTranslation(["navigation","common"]),r=W.useNavigate(),{user:o}=v.useAuth(),{currentTenant:n}=v.useTenant(),{menu:a}=v.useNavigation(),{favorites:s,loading:d,triggerExpand:x}=v.useFavorites(),[m,T]=u.useState(30),[U,N]=u.useState(!0),[y,w]=u.useState(null),[p,S]=u.useState([]),[L,C]=u.useState(null),[E,k]=u.useState(null),[B,D]=u.useState(null),[P,A]=u.useState(null),[O,R]=u.useState(null),F=l=>{if(a)for(const b of a.applications){const M=b.modules.find(g=>g.id===l.id);if(M?.sections?.length){const g=[...M.sections].sort((q,K)=>q.displayOrder-K.displayOrder)[0];if(g.route)return g.route}}return l.route},I=l=>{const b=F(l);b&&(x(),r(b))},z=o?.firstName&&o?.lastName?`${o.firstName} ${o.lastName}`:o?.email||"Utilisateur",$=u.useCallback(async()=>{try{N(!0);const l=await v.userApi.dashboard.getAll(m,10);w(l.sessionAnalytics),S(l.loginErrors??[]),C(l.currentSession),k(l.deviceStats),D(l.weeklyStats),A(l.hourlyStats),R(l.applicationUsage)}catch{w(null),S([]),C(null),k(null),D(null),A(null),R(null)}finally{N(!1)}},[m]);return u.useEffect(()=>{$()},[m,$]),U?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(c.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-500)]"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:[t("navigation:dashboard.welcome"),", ",z]}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:t("navigation:breadcrumb.myspace")})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(c.Star,{className:"w-5 h-5 text-[var(--color-accent-500)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("common:favorites.quickAccess")}),n&&e.jsxs("span",{className:"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] px-2 py-1 bg-[var(--bg-secondary)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-button)"},children:[e.jsx(c.Building2,{className:"w-3.5 h-3.5"}),n.name]})]}),e.jsxs("button",{onClick:()=>r("/myspace/preferences?tab=favorites"),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",style:{borderRadius:"var(--radius-button)"},children:[e.jsx(c.Settings,{className:"w-4 h-4"}),t("common:favorites.manage")]})]}),d&&e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(c.Loader2,{className:"w-6 h-6 animate-spin text-[var(--color-accent-500)]"})}),!d&&s.length===0&&e.jsxs("div",{className:"text-center py-8",children:[e.jsx(c.Star,{className:"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3"}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-4",children:t("common:favorites.noFavorites")}),e.jsx("button",{onClick:()=>r("/myspace/preferences?tab=favorites"),className:"px-4 py-2 bg-[var(--color-accent-600)] text-white font-medium hover:bg-[var(--color-accent-700)] transition-colors",style:{borderRadius:"var(--radius-button)"},children:t("common:favorites.configureFavorites")})]}),!d&&s.length>0&&e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-3",children:s.map(l=>e.jsxs("button",{onClick:()=>I(l),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",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("div",{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",style:{borderRadius:"var(--radius-button)"},children:e.jsx(ee,{name:l.icon,className:"w-6 h-6"})}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)] text-center",children:l.label}),e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:l.applicationLabel})]},l.id))})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsx(j,{title:t("navigation:dashboard.stats.totalSessions"),value:y?.totalSessions??0,icon:e.jsx(c.Activity,{className:"w-5 h-5"}),subtitle:`${m} ${t("navigation:dashboard.stats.lastDays")}`}),e.jsx(j,{title:t("navigation:dashboard.stats.avgDuration"),value:`${Math.round(y?.avgSessionDuration??0)} min`,icon:e.jsx(c.TrendingUp,{className:"w-5 h-5"}),subtitle:t("navigation:dashboard.stats.perSession")}),e.jsx(j,{title:t("navigation:dashboard.stats.connectionErrors"),value:(p??[]).length,icon:e.jsx(c.AlertTriangle,{className:"w-5 h-5"}),subtitle:t("navigation:dashboard.stats.recent"),color:(p??[]).length>0?"red":"green"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.Calendar,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.weeklyUsage.title")})]}),e.jsx(Q,{data:B})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.Clock,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.hourlyUsage.title")})]}),e.jsx(V,{data:P})]})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.AppWindow,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.applicationUsage.title")})]}),e.jsx(Z,{data:O})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(c.BarChart3,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.sessionAnalytics.title")})]}),e.jsx("div",{className:"flex gap-2",children:[7,30,90].map(l=>e.jsx("button",{onClick:()=>T(l),className:`px-3 py-1 text-sm font-medium transition-colors ${m===l?"bg-[var(--color-accent-500)] text-white":"bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)]"}`,style:{borderRadius:"var(--radius-button)"},children:t(`navigation:dashboard.sessionAnalytics.period.${l}days`)},l))})]}),e.jsx(Y,{data:y?.dailyStats??[]})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.Monitor,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.currentSession.title")})]}),e.jsx(X,{session:L})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.AlertTriangle,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.loginErrors.title")})]}),e.jsx(_,{errors:p??[]})]}),e.jsxs("div",{className:"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx(c.BarChart3,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("h2",{className:"font-semibold text-[var(--text-primary)]",children:t("navigation:dashboard.deviceStats.title")})]}),e.jsx(J,{stats:E})]})]})}function j({title:t,value:r,icon:o,subtitle:n,color:a="blue"}){const s={blue:"bg-blue-50 text-blue-600 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800",green:"bg-green-50 text-green-600 border-green-200 dark:bg-green-900/20 dark:border-green-800",red:"bg-red-50 text-red-600 border-red-200 dark:bg-red-900/20 dark:border-red-800"};return e.jsxs("div",{className:`p-4 border ${s[a]}`,style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium opacity-80",children:t}),o]}),e.jsx("div",{className:"text-2xl font-bold",children:r}),n&&e.jsx("div",{className:"text-xs opacity-70 mt-1",children:n})]})}exports.UserDashboardPage=te;
2
+ //# sourceMappingURL=UserDashboardPage-KLB5CQP5.js.map