@atlashub/smartstack 3.29.0 → 3.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CVq3qZoe.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CVq3qZoe.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DJb49NMA.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DJb49NMA.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-D_nk3gKj.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-D_nk3gKj.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-oHEi-sFh.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-oHEi-sFh.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-Cr0q2HnB.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-Cr0q2HnB.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-DX8buBkV.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-DX8buBkV.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-DN7sazvI.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-DN7sazvI.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-DqboIzZE.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-DqboIzZE.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage--9YwwS5A.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage--9YwwS5A.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-CCNjr64K.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-CCNjr64K.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-BSsHN3Yj.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-BSsHN3Yj.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-Bs-Xgca4.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-Bs-Xgca4.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-DDysNWJ5.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-s1WEzOXS.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-B3CSMiV0.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-B3CSMiV0.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-B6ZCecIl.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-B6ZCecIl.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-BBaiBM--.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-BBaiBM--.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-ztPwoAGt.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-ztPwoAGt.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-CK4L4rBO.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-CK4L4rBO.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-DFSVFFXr.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-DFSVFFXr.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-Bp7oQD7Q.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-Bp7oQD7Q.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-JCLpyg94.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-JCLpyg94.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-Bl9xlJ3h.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-Bl9xlJ3h.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-CzMHz4jy.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-CzMHz4jy.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-D_8T1vqV.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-D_8T1vqV.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-M7mJgXvn.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-M7mJgXvn.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-BNEGavlu.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-BNEGavlu.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-C2X2mfds.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-C2X2mfds.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-4oy2YqvT.js} +2 -2
  58. package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-4oy2YqvT.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CO-8B8EI.js} +3 -3
  60. package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CO-8B8EI.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-CPArUG-S.js} +2 -2
  62. package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-CPArUG-S.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-D5MRMxEV.js} +3 -3
  64. package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-D5MRMxEV.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-CwdnfJbJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-CwdnfJbJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-DnjLFXnL.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-DnjLFXnL.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-ZEIfyqwE.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-ZEIfyqwE.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-sh-3h_H9.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-sh-3h_H9.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-B4M6-xeM.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-B4M6-xeM.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-MIu-U7p0.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-MIu-U7p0.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-4XK3Bs_r.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-4XK3Bs_r.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-C-kvtd2T.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-C-kvtd2T.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-CP41FzHi.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-CP41FzHi.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-DzrXTrVi.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-DzrXTrVi.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CZRkMbh8.js} +2 -2
  86. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CZRkMbh8.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-V_SwYio2.js} +3 -3
  88. package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-V_SwYio2.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DOUhaLal.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DOUhaLal.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-DnvAIeyr.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-DnvAIeyr.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DXvpLsbt.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DXvpLsbt.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-DfTa4jCG.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-DfTa4jCG.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D76MdAs-.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D76MdAs-.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-I1yCk7tk.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-I1yCk7tk.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-BRUzcl1A.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-BRUzcl1A.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-DtWUPCh3.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-DtWUPCh3.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-CUNKbl7t.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-CUNKbl7t.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-DJJGbXoX.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-DJJGbXoX.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-B8wmawPV.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-B8wmawPV.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-Dbjcctuh.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-Dbjcctuh.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BeNfBZmb.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BeNfBZmb.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-zii0ll57.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-zii0ll57.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-BCpuIGzv.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-BCpuIGzv.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-BmvrBaAD.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-BmvrBaAD.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-eowQd59_.js} +2 -2
  122. package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-eowQd59_.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-mf5wI0-n.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-mf5wI0-n.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-8UPgkVE8.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-8UPgkVE8.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-CLsaUNqA.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-CLsaUNqA.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-57X-ILDb.js} +2 -2
  130. package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-57X-ILDb.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-CNyHSbqs.js} +2 -2
  132. package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-CNyHSbqs.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-CyV8l-Zo.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-CyV8l-Zo.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-JW8-mh_k.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-JW8-mh_k.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-CjwE73NX.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-CjwE73NX.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-wddG59kg.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-wddG59kg.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CrioVHFI.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CrioVHFI.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TUOGR1ow.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TUOGR1ow.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-CAcols3D.js} +2 -2
  146. package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-CAcols3D.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-sJBWaNff.js} +2 -2
  148. package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-sJBWaNff.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-BPGRloOS.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-BPGRloOS.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-D5TRn7Ir.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-D5TRn7Ir.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-Dc2bWTzG.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-Dc2bWTzG.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-UXmYLrIq.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-UXmYLrIq.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-dmPlqqiD.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-dmPlqqiD.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-nTY85sNA.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-nTY85sNA.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-BUXfstRZ.js} +2 -2
  162. package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-BUXfstRZ.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BhT-31ls.js} +2 -2
  164. package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BhT-31ls.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-3_mzBLNI.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-3_mzBLNI.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-B-SRDR2R.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-B-SRDR2R.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-B4cR3rOC.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-B4cR3rOC.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-xN3wPnFL.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-xN3wPnFL.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-CkHgXSxU.js} +2 -2
  174. package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-CkHgXSxU.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-Dwi2xpMI.js} +2 -2
  176. package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-Dwi2xpMI.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-D2a3EOey.js} +3 -3
  178. package/dist/chunks/UserCreateTicketPage-D2a3EOey.js.map +1 -0
  179. package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-bcbSLglE.js} +48 -48
  180. package/dist/chunks/UserCreateTicketPage-bcbSLglE.js.map +1 -0
  181. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-DwnDRNoW.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-DwnDRNoW.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-ZMsx8LWw.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-ZMsx8LWw.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-BRFowOFL.js} +2 -2
  186. package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-BRFowOFL.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-CZyV-zsg.js} +5 -5
  188. package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-CZyV-zsg.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-BstGk_BP.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-BstGk_BP.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-DzB_pELt.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-DzB_pELt.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-BygTv_kK.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-BygTv_kK.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-DTmhzttW.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-DTmhzttW.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-DcwLyMAX.js} +2 -2
  198. package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-DcwLyMAX.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-TIqSHgHj.js} +2 -2
  200. package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-TIqSHgHj.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-3FjMFbpa.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-3FjMFbpa.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-B6dsJzvH.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-B6dsJzvH.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-9G4wG_mT.js} +2 -2
  206. package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-9G4wG_mT.js.map} +1 -1
  207. package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-DXOdsoxr.js} +2 -2
  208. package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-DXOdsoxr.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-D0DEp9Y-.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-D0DEp9Y-.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-DhOd6idI.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-DhOd6idI.js.map} +1 -1
  213. package/dist/chunks/auth-Ca2Rn6on.js +2 -0
  214. package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
  215. package/dist/chunks/auth-ClNTDOqm.js +18 -0
  216. package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
  217. package/dist/chunks/auth-DECnMZjF.js +18 -0
  218. package/dist/chunks/auth-DECnMZjF.js.map +1 -0
  219. package/dist/chunks/auth-DPvxdqy4.js +18 -0
  220. package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
  221. package/dist/chunks/auth-HzvnTaOm.js +2 -0
  222. package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
  223. package/dist/chunks/auth-M6aNTKCH.js +2 -0
  224. package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
  225. package/dist/chunks/auth-UHnAu6_e.js +2 -0
  226. package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
  227. package/dist/chunks/auth-YrujJY7m.js +18 -0
  228. package/dist/chunks/auth-YrujJY7m.js.map +1 -0
  229. package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-Db8G2lLs.js} +2 -2
  230. package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-Db8G2lLs.js.map} +1 -1
  231. package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-lbxNsHFv.js} +2 -2
  232. package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-lbxNsHFv.js.map} +1 -1
  233. package/dist/chunks/{index-IJR_91Yt.js → index-BI2dc1FS.js} +2 -2
  234. package/dist/chunks/{index-IJR_91Yt.js.map → index-BI2dc1FS.js.map} +1 -1
  235. package/dist/chunks/{index-DIQ6Jmmq.js → index-Bn8HzILk.js} +4 -4
  236. package/dist/chunks/{index-DIQ6Jmmq.js.map → index-Bn8HzILk.js.map} +1 -1
  237. package/dist/chunks/{index-DA5VyW0k.js → index-CN2WRyg1.js} +2249 -2264
  238. package/dist/chunks/index-CN2WRyg1.js.map +1 -0
  239. package/dist/chunks/{index-Br2wsGE8.js → index-CTGSmYvs.js} +2 -2
  240. package/dist/chunks/{index-Br2wsGE8.js.map → index-CTGSmYvs.js.map} +1 -1
  241. package/dist/chunks/index-CUICSveU.js +2 -0
  242. package/dist/chunks/index-CUICSveU.js.map +1 -0
  243. package/dist/chunks/{index-S-X8qFYW.js → index-CgtbaFf5.js} +2 -2
  244. package/dist/chunks/{index-S-X8qFYW.js.map → index-CgtbaFf5.js.map} +1 -1
  245. package/dist/chunks/{index-_g82N2nb.js → index-D0HS542b.js} +2 -2
  246. package/dist/chunks/{index-_g82N2nb.js.map → index-D0HS542b.js.map} +1 -1
  247. package/dist/chunks/{index-BIqcvvbh.js → index-DEtq-xUL.js} +9 -8
  248. package/dist/chunks/index-DEtq-xUL.js.map +1 -0
  249. package/dist/chunks/{index-BOKR3bw6.js → index-DF93KQFR.js} +2 -2
  250. package/dist/chunks/{index-BOKR3bw6.js.map → index-DF93KQFR.js.map} +1 -1
  251. package/dist/chunks/{index-CxgEV-rT.js → index-DLekpNSE.js} +2 -2
  252. package/dist/chunks/{index-CxgEV-rT.js.map → index-DLekpNSE.js.map} +1 -1
  253. package/dist/chunks/{index-DEOBhXS_.js → index-DUS-tunb.js} +2 -2
  254. package/dist/chunks/{index-DEOBhXS_.js.map → index-DUS-tunb.js.map} +1 -1
  255. package/dist/chunks/{index-BMsjMCv9.js → index-DjC1u2hI.js} +3 -3
  256. package/dist/chunks/{index-BMsjMCv9.js.map → index-DjC1u2hI.js.map} +1 -1
  257. package/dist/chunks/{index-BxHVPJ-j.js → index-DqbVFB1H.js} +2 -2
  258. package/dist/chunks/{index-BxHVPJ-j.js.map → index-DqbVFB1H.js.map} +1 -1
  259. package/dist/chunks/{index-Djy4eIbB.js → index-DwqLhQ8S.js} +2 -2
  260. package/dist/chunks/{index-Djy4eIbB.js.map → index-DwqLhQ8S.js.map} +1 -1
  261. package/dist/chunks/{index-C1w97Ejz.js → index-HsAOBno4.js} +2 -2
  262. package/dist/chunks/{index-C1w97Ejz.js.map → index-HsAOBno4.js.map} +1 -1
  263. package/dist/chunks/{index-Czk12A3G.js → index-TiWOcC0g.js} +2 -2
  264. package/dist/chunks/{index-Czk12A3G.js.map → index-TiWOcC0g.js.map} +1 -1
  265. package/dist/chunks/{index-vXiLh35n.js → index-cAikSVW0.js} +13 -13
  266. package/dist/chunks/index-cAikSVW0.js.map +1 -0
  267. package/dist/chunks/{index-CNxx56kE.js → index-xhRXN1Jq.js} +2 -2
  268. package/dist/chunks/{index-CNxx56kE.js.map → index-xhRXN1Jq.js.map} +1 -1
  269. package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-CHeS7oLt.js} +2 -2
  270. package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-CHeS7oLt.js.map} +1 -1
  271. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-__FKj6CN.js} +2 -2
  272. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-__FKj6CN.js.map} +1 -1
  273. package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Cj239hYB.js} +2 -2
  274. package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Cj239hYB.js.map} +1 -1
  275. package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-DF4RwD_6.js} +2 -2
  276. package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-DF4RwD_6.js.map} +1 -1
  277. package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-CFam8zFR.js} +3 -3
  278. package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-CFam8zFR.js.map} +1 -1
  279. package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-CViOUwyF.js} +2 -2
  280. package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-CViOUwyF.js.map} +1 -1
  281. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-B-Cs6NX1.js} +2 -2
  282. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-B-Cs6NX1.js.map} +1 -1
  283. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-CslSQeBJ.js} +2 -2
  284. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-CslSQeBJ.js.map} +1 -1
  285. package/dist/contexts/AuthContext.d.ts.map +1 -1
  286. package/dist/pages/LoginPage.d.ts.map +1 -1
  287. package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
  288. package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
  289. package/dist/services/api/apiClient.d.ts.map +1 -1
  290. package/dist/services/support/ticketDraftService.d.ts.map +1 -1
  291. package/dist/smartstack.cjs +1 -1
  292. package/dist/smartstack.js +6 -6
  293. package/dist/utils/permissions.generated.d.ts +288 -0
  294. package/dist/utils/permissions.generated.d.ts.map +1 -0
  295. package/dist/utils/uuid.d.ts +6 -0
  296. package/dist/utils/uuid.d.ts.map +1 -0
  297. package/package.json +1 -1
  298. package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
  299. package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
  300. package/dist/chunks/auth-B-hELPDB.js +0 -2
  301. package/dist/chunks/auth-B-hELPDB.js.map +0 -1
  302. package/dist/chunks/auth-BYaMuq7D.js +0 -16
  303. package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
  304. package/dist/chunks/auth-C5zpZ9k7.js +0 -2
  305. package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
  306. package/dist/chunks/auth-CDpRMVv1.js +0 -16
  307. package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
  308. package/dist/chunks/auth-CyPkCta2.js +0 -2
  309. package/dist/chunks/auth-CyPkCta2.js.map +0 -1
  310. package/dist/chunks/auth-DL47kvnl.js +0 -2
  311. package/dist/chunks/auth-DL47kvnl.js.map +0 -1
  312. package/dist/chunks/auth-Diiv90i1.js +0 -16
  313. package/dist/chunks/auth-Diiv90i1.js.map +0 -1
  314. package/dist/chunks/auth-rog9MvUr.js +0 -16
  315. package/dist/chunks/auth-rog9MvUr.js.map +0 -1
  316. package/dist/chunks/index-BIqcvvbh.js.map +0 -1
  317. package/dist/chunks/index-DA5VyW0k.js.map +0 -1
  318. package/dist/chunks/index-Dht6EQW1.js +0 -2
  319. package/dist/chunks/index-Dht6EQW1.js.map +0 -1
  320. package/dist/chunks/index-vXiLh35n.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"UserDashboardPage-BMYrtF3o.js","sources":["../../src/components/dashboard/SessionAnalyticsChart.tsx","../../src/components/dashboard/LoginErrorsTable.tsx","../../src/components/dashboard/CurrentSessionCard.tsx","../../src/components/dashboard/DeviceStatsCard.tsx","../../src/components/dashboard/WeeklyUsageChart.tsx","../../src/components/dashboard/HourlyUsageChart.tsx","../../src/components/dashboard/ApplicationUsageChart.tsx","../../src/pages/personal/myspace/UserDashboardPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DailySessionStatsDto } from '@/services/api/userApi';\r\n\r\ninterface SessionAnalyticsChartProps {\r\n readonly data: DailySessionStatsDto[];\r\n}\r\n\r\nexport function SessionAnalyticsChart({ data }: SessionAnalyticsChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.sessionAnalytics.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.map(item => ({\r\n date: new Date(item.date).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit' }),\r\n loginCount: item.loginCount,\r\n avgDuration: Math.round(item.avgDuration),\r\n }));\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n yAxisId=\"left\"\r\n stroke=\"var(--color-accent-500)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.connections'), angle: -90, position: 'insideLeft', fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n yAxisId=\"right\"\r\n orientation=\"right\"\r\n stroke=\"#22c55e\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{ value: t('dashboard.sessionAnalytics.avgDuration'), angle: 90, position: 'insideRight', fill: 'var(--text-secondary)' }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: 'var(--radius-card)',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name: string | undefined) => {\r\n if (name === 'loginCount') return [value, t('dashboard.sessionAnalytics.connections')];\r\n if (name === 'avgDuration') return [`${value} min`, t('dashboard.sessionAnalytics.avgDuration')];\r\n return [value, name || ''];\r\n }}\r\n />\r\n <Legend\r\n wrapperStyle={{ color: 'var(--text-secondary)' }}\r\n formatter={(value: string) => {\r\n if (value === 'loginCount') return t('dashboard.sessionAnalytics.connections');\r\n if (value === 'avgDuration') return t('dashboard.sessionAnalytics.avgDurationMin');\r\n return value;\r\n }}\r\n />\r\n <Line\r\n yAxisId=\"left\"\r\n type=\"monotone\"\r\n dataKey=\"loginCount\"\r\n stroke=\"var(--color-accent-500)\"\r\n strokeWidth={2}\r\n dot={{ fill: 'var(--color-accent-500)', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n <Line\r\n yAxisId=\"right\"\r\n type=\"monotone\"\r\n dataKey=\"avgDuration\"\r\n stroke=\"#22c55e\"\r\n strokeWidth={2}\r\n dot={{ fill: '#22c55e', r: 4 }}\r\n activeDot={{ r: 6 }}\r\n />\r\n </LineChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { AlertTriangle, MapPin, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { LoginErrorDto } from '@/services/api/userApi';\r\n\r\ninterface LoginErrorsTableProps {\r\n readonly errors: LoginErrorDto[];\r\n}\r\n\r\nexport function LoginErrorsTable({ errors }: LoginErrorsTableProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!Array.isArray(errors) || errors.length === 0) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mb-3 text-green-500\" />\r\n <p className=\"font-medium\">{t('dashboard.loginErrors.noErrors')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.loginErrors.accountSecure')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const isRecent = (loginAt: string) => {\r\n const errorDate = new Date(loginAt);\r\n const now = new Date();\r\n const hoursDiff = (now.getTime() - errorDate.getTime()) / (1000 * 60 * 60);\r\n return hoursDiff < 24;\r\n };\r\n\r\n return (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.datetime')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.reason')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.ipAddress')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)] text-sm\">{t('dashboard.loginErrors.columns.location')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {errors.map((error) => {\r\n const recent = isRecent(error.loginAt);\r\n return (\r\n <tr\r\n key={error.loginAt}\r\n className={`border-b border-[var(--border-color)] hover:bg-[var(--bg-secondary)] ${\r\n recent ? 'bg-red-50/50 dark:bg-red-900/10' : ''\r\n }`}\r\n >\r\n <td className=\"p-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {recent && (\r\n <span className=\"w-2 h-2 rounded-full bg-red-500 animate-pulse\" title={t('dashboard.loginErrors.recentLabel')} />\r\n )}\r\n <span className=\"text-sm\">\r\n {new Date(error.loginAt).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n })}\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-3\">\r\n <span\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\"\r\n style={{ borderRadius: 'var(--radius-badge)' }}\r\n >\r\n <AlertTriangle className=\"w-3 h-3\" />\r\n {error.failureReason}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n <span className=\"text-sm font-mono text-[var(--text-secondary)]\">\r\n {error.ipAddress || 'N/A'}\r\n </span>\r\n </td>\r\n <td className=\"p-3\">\r\n {error.city || error.country ? (\r\n <div className=\"flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n {error.city && (\r\n <>\r\n <MapPin className=\"w-3 h-3\" />\r\n <span>{error.city}</span>\r\n </>\r\n )}\r\n {error.country && (\r\n <>\r\n <Globe className=\"w-3 h-3\" />\r\n <span>{error.country}</span>\r\n </>\r\n )}\r\n </div>\r\n ) : (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">{t('dashboard.loginErrors.notAvailable')}</span>\r\n )}\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Clock, MapPin, Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { CurrentSessionDto } from '@/services/api/userApi';\r\n\r\ninterface CurrentSessionCardProps {\r\n readonly session: CurrentSessionDto | null;\r\n}\r\n\r\nexport function CurrentSessionCard({ session }: CurrentSessionCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!session) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <Monitor className=\"w-12 h-12 mb-3 opacity-50\" />\r\n <p className=\"font-medium\">{t('dashboard.currentSession.noActiveSession')}</p>\r\n <p className=\"text-sm mt-1\">{t('dashboard.currentSession.pleaseReconnect')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const formatDuration = (minutes: number): string => {\r\n if (minutes < 1) return \"< 1 minute\";\r\n if (minutes < 60) return `${Math.round(minutes)} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = Math.round(minutes % 60);\r\n if (mins === 0) return `${hours}h`;\r\n return `${hours}h ${mins}min`;\r\n };\r\n\r\n const extractBrowserName = (userAgent: string | null): string => {\r\n if (!userAgent) return t('dashboard.browsers.unknown');\r\n\r\n if (userAgent.includes('Edg/')) return t('dashboard.browsers.edge');\r\n if (userAgent.includes('Chrome/')) return t('dashboard.browsers.chrome');\r\n if (userAgent.includes('Firefox/')) return t('dashboard.browsers.firefox');\r\n if (userAgent.includes('Safari/') && !userAgent.includes('Chrome')) return t('dashboard.browsers.safari');\r\n if (userAgent.includes('OPR/') || userAgent.includes('Opera/')) return t('dashboard.browsers.opera');\r\n\r\n return t('dashboard.browsers.other');\r\n };\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-[var(--accent-bg)] text-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Clock className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.duration')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {formatDuration(session.durationMinutes)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('dashboard.currentSession.since')} {new Date(session.loginAt).toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-blue-500/10 text-blue-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Monitor className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.device')}</p>\r\n <p className=\"text-lg font-bold text-[var(--text-primary)] mt-1\">\r\n {extractBrowserName(session.userAgent)}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1 font-mono\">\r\n {session.ipAddress || t('dashboard.currentSession.ipNotAvailable')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {(session.city || session.country) && (\r\n <div className=\"md:col-span-2 flex items-start gap-3 p-4 bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <div\r\n className=\"p-2 bg-green-500/10 text-green-500\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Globe className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wide\">{t('dashboard.currentSession.location')}</p>\r\n <div className=\"flex items-center gap-3 mt-1\">\r\n {session.city && (\r\n <div className=\"flex items-center gap-1\">\r\n <MapPin className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{session.city}</span>\r\n </div>\r\n )}\r\n {session.country && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{session.country}</span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { Monitor, Globe } from 'lucide-react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { DeviceStatsDto } from '@/services/api/userApi';\r\n\r\ninterface DeviceStatsCardProps {\r\n readonly stats: DeviceStatsDto | null;\r\n}\r\n\r\nexport function DeviceStatsCard({ stats }: DeviceStatsCardProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!stats) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8 text-[var(--text-secondary)]\">\r\n <p>{t('dashboard.deviceStats.noData')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const browserColors = ['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444'];\r\n const countryColors = ['#06b6d4', '#ec4899', '#10b981', '#f97316', '#6366f1'];\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Monitor className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.browsersUsed')}\r\n </h4>\r\n {stats.byBrowser?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byBrowser.map((item, index) => {\r\n const maxCount = Math.max(...stats.byBrowser.map(b => b.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.browser} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.browser}>\r\n {item.browser}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: browserColors[index % browserColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.noData')}</p>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <h4 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3 flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {t('dashboard.deviceStats.connectionCountries')}\r\n </h4>\r\n {stats.byCountry?.length ? (\r\n <div className=\"space-y-3\">\r\n {stats.byCountry.map((item, index) => {\r\n const maxCount = Math.max(...stats.byCountry.map(c => c.count), 1);\r\n const percentage = (item.count / maxCount) * 100;\r\n return (\r\n <div key={item.country} className=\"flex items-center gap-3\">\r\n <div className=\"w-24 text-sm text-[var(--text-primary)] truncate\" title={item.country}>\r\n {item.country}\r\n </div>\r\n <div className=\"flex-1 h-6 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: countryColors[index % countryColors.length],\r\n }}\r\n />\r\n </div>\r\n <div className=\"w-12 text-right font-medium text-[var(--text-primary)]\">\r\n {item.count}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('dashboard.deviceStats.locationNotAvailable')}</p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ReferenceLine } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { WeeklyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface WeeklyUsageChartProps {\r\n readonly data: WeeklyStatsDto | null;\r\n}\r\n\r\nexport function WeeklyUsageChart({ data }: WeeklyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.dayStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.weeklyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.dayStats.map(item => ({\r\n day: t(`dashboard.days.${item.dayName.toLowerCase()}`),\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n }));\r\n\r\n // Calculate average of averages for the reference line\r\n const avgDurationPerSession = chartData.filter(d => d.sessionCount > 0).length > 0\r\n ? chartData.filter(d => d.sessionCount > 0).reduce((acc, d) => acc + d.duration, 0) / chartData.filter(d => d.sessionCount > 0).length\r\n : 0;\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n return (\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"day\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.weeklyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <ReferenceLine\r\n y={avgDurationPerSession}\r\n stroke=\"#f59e0b\"\r\n strokeDasharray=\"5 5\"\r\n label={{\r\n value: `${t('dashboard.weeklyUsage.average')}: ${formatDuration(Math.round(avgDurationPerSession))}`,\r\n position: 'right',\r\n fill: '#f59e0b',\r\n fontSize: 11,\r\n }}\r\n />\r\n <Bar\r\n dataKey=\"duration\"\r\n fill=\"var(--color-accent-500)\"\r\n radius={[4, 4, 0, 0]}\r\n />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Cell } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { HourlyStatsDto } from '@/services/api/userApi';\r\n\r\ninterface HourlyUsageChartProps {\r\n readonly data: HourlyStatsDto | null;\r\n}\r\n\r\nexport function HourlyUsageChart({ data }: HourlyUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.hourStats?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.hourlyUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const formatHour = (hour: number) => {\r\n return `${hour.toString().padStart(2, '0')}:00`;\r\n };\r\n\r\n const formatDuration = (minutes: number) => {\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\r\n };\r\n\r\n // Calculate average duration per session (not cumulative)\r\n const chartData = data.hourStats.map(item => ({\r\n hour: formatHour(item.hour),\r\n hourNum: item.hour,\r\n duration: item.sessionCount > 0\r\n ? Math.round(item.totalDuration / item.sessionCount)\r\n : 0,\r\n sessionCount: item.sessionCount,\r\n isPeak: item.hour === data.peakHour,\r\n }));\r\n\r\n return (\r\n <div>\r\n <div className=\"flex items-center justify-end mb-2 text-xs text-[var(--text-secondary)]\">\r\n <span className=\"inline-block w-3 h-3 rounded-sm bg-[var(--color-accent-600)] mr-1\" />\r\n {t('dashboard.hourlyUsage.peakHour')}: {formatHour(data.peakHour)}\r\n </div>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <BarChart data={chartData} margin={{ top: 10, right: 30, left: 20, bottom: 5 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"hour\"\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 11 }}\r\n interval={0}\r\n angle={-45}\r\n textAnchor=\"end\"\r\n height={60}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\r\n label={{\r\n value: t('dashboard.hourlyUsage.duration'),\r\n angle: -90,\r\n position: 'insideLeft',\r\n fill: 'var(--text-secondary)',\r\n }}\r\n />\r\n <Tooltip\r\n cursor={{ fill: 'transparent' }}\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value) => [formatDuration(value as number), null]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n <Bar dataKey=\"duration\" radius={[4, 4, 0, 0]}>\r\n {chartData.map((entry, index) => (\r\n <Cell\r\n key={`${entry.hour}-${index}`}\r\n fill={entry.isPeak ? 'var(--color-accent-600)' : 'var(--color-accent-400)'}\r\n />\r\n ))}\r\n </Bar>\r\n </BarChart>\r\n </ResponsiveContainer>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { PieChart, Pie, Cell, Tooltip, ResponsiveContainer } from 'recharts';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { ApplicationUsageDto } from '@/services/api/userApi';\r\n\r\ninterface ApplicationUsageChartProps {\r\n readonly data: ApplicationUsageDto | null;\r\n}\r\n\r\nconst COLORS = ['#3b82f6', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16', '#f97316', '#6366f1'];\r\n\r\nexport function ApplicationUsageChart({ data }: ApplicationUsageChartProps): ReactElement {\r\n const { t } = useTranslation('navigation');\r\n\r\n if (!data?.applications?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64 text-[var(--text-secondary)]\">\r\n {t('dashboard.applicationUsage.noData')}\r\n </div>\r\n );\r\n }\r\n\r\n const chartData = data.applications.map(app => ({\r\n name: app.applicationName,\r\n value: app.accessCount,\r\n duration: app.totalDurationSeconds,\r\n percentage: app.percentage,\r\n }));\r\n\r\n const formatDuration = (seconds: number) => {\r\n if (seconds < 60) return `${seconds}s`;\r\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`;\r\n return `${Math.round(seconds / 3600)}h`;\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col md:flex-row items-center gap-6\">\r\n <div className=\"w-full md:w-1/2\">\r\n <ResponsiveContainer width=\"100%\" height={280}>\r\n <PieChart>\r\n <Pie\r\n data={chartData}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={60}\r\n outerRadius={90}\r\n dataKey=\"value\"\r\n label={({ name, percent }) => `${name} (${((percent ?? 0) * 100).toFixed(0)}%)`}\r\n labelLine={false}\r\n >\r\n {chartData.map((item, index) => (\r\n <Cell key={`${item.name}-${index}`} fill={COLORS[index % COLORS.length]} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-tertiary)',\r\n border: 'none',\r\n borderRadius: 'var(--radius-card)',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\r\n padding: '8px 12px',\r\n }}\r\n formatter={(value, _name, props) => [\r\n `${value} ${t('dashboard.applicationUsage.accesses')} (${formatDuration(props.payload.duration)})`,\r\n null,\r\n ]}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 600, marginBottom: 4 }}\r\n itemStyle={{ color: 'var(--text-secondary)', padding: 0 }}\r\n separator=\"\"\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n <div className=\"w-full md:w-1/2\">\r\n <div className=\"text-sm text-[var(--text-secondary)] mb-3\">\r\n {t('dashboard.applicationUsage.totalAccess')}: <span className=\"font-semibold text-[var(--text-primary)]\">{data.totalAccess}</span>\r\n </div>\r\n <div className=\"space-y-2 max-h-[240px] overflow-y-auto\">\r\n {data.applications.map((app, index) => (\r\n <div\r\n key={app.applicationId}\r\n className=\"flex items-center gap-3 p-2 rounded-[var(--radius-card)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\r\n style={{ backgroundColor: COLORS[index % COLORS.length] }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"text-sm font-medium text-[var(--text-primary)] truncate\">\r\n {app.applicationName}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">\r\n {app.accessCount} {t('dashboard.applicationUsage.accesses')} - {formatDuration(app.totalDurationSeconds)}\r\n </div>\r\n </div>\r\n <div className=\"text-sm font-semibold text-[var(--text-primary)]\">\r\n {app.percentage}%\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Activity,\r\n TrendingUp,\r\n AlertTriangle,\r\n Monitor,\r\n BarChart3,\r\n Loader2,\r\n Calendar,\r\n Clock,\r\n AppWindow,\r\n Star,\r\n Settings,\r\n Building2,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation } from '@/contexts/NavigationContext';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport type {\r\n SessionAnalyticsDto,\r\n LoginErrorDto,\r\n CurrentSessionDto,\r\n DeviceStatsDto,\r\n WeeklyStatsDto,\r\n HourlyStatsDto,\r\n ApplicationUsageDto,\r\n} from '@/services/api/userApi';\r\nimport { SessionAnalyticsChart } from '@/components/dashboard/SessionAnalyticsChart';\r\nimport { LoginErrorsTable } from '@/components/dashboard/LoginErrorsTable';\r\nimport { CurrentSessionCard } from '@/components/dashboard/CurrentSessionCard';\r\nimport { DeviceStatsCard } from '@/components/dashboard/DeviceStatsCard';\r\nimport { WeeklyUsageChart } from '@/components/dashboard/WeeklyUsageChart';\r\nimport { HourlyUsageChart } from '@/components/dashboard/HourlyUsageChart';\r\nimport { ApplicationUsageChart } from '@/components/dashboard/ApplicationUsageChart';\r\n\r\n// Dynamic icon component\r\nfunction DynamicIcon({ name, className }: { name: string; className?: string }) {\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[name];\r\n if (!IconComponent) {\r\n return <Star className={className} />;\r\n }\r\n return <IconComponent className={className} />;\r\n}\r\n\r\nexport function UserDashboardPage(): ReactElement {\r\n const { t } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { user } = useAuth();\r\n const { currentTenant } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, loading: favoritesLoading, triggerExpand } = useFavoriteModules();\r\n const [period, setPeriod] = useState<7 | 30 | 90>(30);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const [analytics, setAnalytics] = useState<SessionAnalyticsDto | null>(null);\r\n const [errors, setErrors] = useState<LoginErrorDto[]>([]);\r\n const [currentSession, setCurrentSession] = useState<CurrentSessionDto | null>(null);\r\n const [deviceStats, setDeviceStats] = useState<DeviceStatsDto | null>(null);\r\n const [weeklyStats, setWeeklyStats] = useState<WeeklyStatsDto | null>(null);\r\n const [hourlyStats, setHourlyStats] = useState<HourlyStatsDto | null>(null);\r\n const [appUsage, setAppUsage] = useState<ApplicationUsageDto | null>(null);\r\n\r\n // Resolve favorite route to first section if module has sections (same as FavoritesBar)\r\n const resolveRoute = (module: FavoriteModule): string => {\r\n if (menu) {\r\n for (const app of menu.applications) {\r\n const navModule = app.modules.find(m => m.id === module.id);\r\n if (navModule?.sections?.length) {\r\n const firstSection = [...navModule.sections].sort((a, b) => a.displayOrder - b.displayOrder)[0];\r\n if (firstSection.route) return firstSection.route;\r\n }\r\n }\r\n }\r\n return module.route;\r\n };\r\n\r\n const handleModuleClick = (module: FavoriteModule) => {\r\n const route = resolveRoute(module);\r\n if (route) {\r\n triggerExpand();\r\n navigate(route);\r\n }\r\n };\r\n\r\n const displayName = user?.firstName && user?.lastName\r\n ? `${user.firstName} ${user.lastName}`\r\n : user?.email || 'Utilisateur';\r\n\r\n const loadDashboardData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n // Use aggregated endpoint: 1 API call instead of 7\r\n const data = await userApi.dashboard.getAll(period, 10);\r\n\r\n setAnalytics(data.sessionAnalytics);\r\n setErrors(data.loginErrors ?? []);\r\n setCurrentSession(data.currentSession);\r\n setDeviceStats(data.deviceStats);\r\n setWeeklyStats(data.weeklyStats);\r\n setHourlyStats(data.hourlyStats);\r\n setAppUsage(data.applicationUsage);\r\n } catch {\r\n setAnalytics(null);\r\n setErrors([]);\r\n setCurrentSession(null);\r\n setDeviceStats(null);\r\n setWeeklyStats(null);\r\n setHourlyStats(null);\r\n setAppUsage(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [period]);\r\n\r\n useEffect(() => {\r\n loadDashboardData();\r\n }, [period, loadDashboardData]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('navigation:dashboard.welcome')}, {displayName}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('navigation:breadcrumb.myspace')}</p>\r\n </div>\r\n\r\n {/* Quick Access Favorites */}\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <Star className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n {currentTenant && (\r\n <span className=\"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)] px-2 py-1 bg-[var(--bg-secondary)] border border-[var(--border-color)]\" style={{ borderRadius: 'var(--radius-button)' }}>\r\n <Building2 className=\"w-3.5 h-3.5\" />\r\n {currentTenant.name}\r\n </span>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('common:favorites.manage')}\r\n </button>\r\n </div>\r\n\r\n {favoritesLoading && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length === 0 && (\r\n <div className=\"text-center py-8\">\r\n <Star className=\"w-12 h-12 mx-auto text-[var(--text-muted)] mb-3\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('common:favorites.noFavorites')}</p>\r\n <button\r\n onClick={() => navigate('/myspace/preferences?tab=favorites')}\r\n className=\"px-4 py-2 bg-[var(--color-accent-600)] text-white font-medium hover:bg-[var(--color-accent-700)] transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t('common:favorites.configureFavorites')}\r\n </button>\r\n </div>\r\n )}\r\n {!favoritesLoading && favorites.length > 0 && (\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-3\">\r\n {favorites.map((module) => (\r\n <button\r\n key={module.id}\r\n onClick={() => handleModuleClick(module)}\r\n className=\"flex flex-col items-center gap-2 p-4 bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)] transition-all group\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div\r\n className=\"w-12 h-12 flex items-center justify-center bg-[var(--color-accent-100)] text-[var(--color-accent-600)] group-hover:bg-[var(--color-accent-600)] group-hover:text-white transition-colors\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-6 h-6\" />\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)] text-center\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">{module.applicationLabel}</span>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <StatCard\r\n title={t('navigation:dashboard.stats.totalSessions')}\r\n value={analytics?.totalSessions ?? 0}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n subtitle={`${period} ${t('navigation:dashboard.stats.lastDays')}`}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.avgDuration')}\r\n value={`${Math.round(analytics?.avgSessionDuration ?? 0)} min`}\r\n icon={<TrendingUp className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.perSession')}\r\n />\r\n <StatCard\r\n title={t('navigation:dashboard.stats.connectionErrors')}\r\n value={(errors ?? []).length}\r\n icon={<AlertTriangle className=\"w-5 h-5\" />}\r\n subtitle={t('navigation:dashboard.stats.recent')}\r\n color={(errors ?? []).length > 0 ? 'red' : 'green'}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Calendar className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.weeklyUsage.title')}</h2>\r\n </div>\r\n <WeeklyUsageChart data={weeklyStats} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Clock className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.hourlyUsage.title')}</h2>\r\n </div>\r\n <HourlyUsageChart data={hourlyStats} />\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AppWindow className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.applicationUsage.title')}</h2>\r\n </div>\r\n <ApplicationUsageChart data={appUsage} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div className=\"flex items-center gap-3\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.sessionAnalytics.title')}</h2>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {([7, 30, 90] as const).map((p) => (\r\n <button\r\n key={p}\r\n onClick={() => setPeriod(p)}\r\n className={`px-3 py-1 text-sm font-medium transition-colors ${\r\n period === p\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n {t(`navigation:dashboard.sessionAnalytics.period.${p}days`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <SessionAnalyticsChart data={analytics?.dailyStats ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <Monitor className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.currentSession.title')}</h2>\r\n </div>\r\n <CurrentSessionCard session={currentSession} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.loginErrors.title')}</h2>\r\n </div>\r\n <LoginErrorsTable errors={errors ?? []} />\r\n </div>\r\n\r\n <div\r\n className=\"p-6 bg-[var(--bg-card)] border border-[var(--border-color)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-4\">\r\n <BarChart3 className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <h2 className=\"font-semibold text-[var(--text-primary)]\">{t('navigation:dashboard.deviceStats.title')}</h2>\r\n </div>\r\n <DeviceStatsCard stats={deviceStats} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatCard({\r\n title,\r\n value,\r\n icon,\r\n subtitle,\r\n color = 'blue',\r\n}: {\r\n title: string;\r\n value: string | number;\r\n icon: React.ReactNode;\r\n subtitle?: string;\r\n color?: 'blue' | 'green' | 'red';\r\n}) {\r\n const colorClasses = {\r\n blue: 'bg-blue-50 text-blue-600 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800',\r\n green: 'bg-green-50 text-green-600 border-green-200 dark:bg-green-900/20 dark:border-green-800',\r\n red: 'bg-red-50 text-red-600 border-red-200 dark:bg-red-900/20 dark:border-red-800',\r\n };\r\n\r\n return (\r\n <div\r\n className={`p-4 border ${colorClasses[color]}`}\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {subtitle && <div className=\"text-xs opacity-70 mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n}\r\n"],"names":["SessionAnalyticsChart","data","t","useTranslation","chartData","item","jsx","ResponsiveContainer","jsxs","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","value","name","Legend","Line","LoginErrorsTable","errors","AlertTriangle","isRecent","loginAt","errorDate","error","recent","Fragment","MapPin","Globe","CurrentSessionCard","session","Monitor","formatDuration","minutes","hours","mins","extractBrowserName","userAgent","Clock","DeviceStatsCard","stats","browserColors","countryColors","index","maxCount","b","percentage","c","WeeklyUsageChart","avgDurationPerSession","d","acc","BarChart","ReferenceLine","Bar","HourlyUsageChart","formatHour","hour","entry","Cell","COLORS","ApplicationUsageChart","app","seconds","PieChart","Pie","percent","_name","props","DynamicIcon","className","IconComponent","LucideIcons","Star","UserDashboardPage","navigate","useNavigate","user","useAuth","currentTenant","useTenant","menu","useNavigation","favorites","favoritesLoading","triggerExpand","useFavoriteModules","period","setPeriod","useState","loading","setLoading","analytics","setAnalytics","setErrors","currentSession","setCurrentSession","deviceStats","setDeviceStats","weeklyStats","setWeeklyStats","hourlyStats","setHourlyStats","appUsage","setAppUsage","resolveRoute","module","navModule","m","firstSection","a","handleModuleClick","route","displayName","loadDashboardData","useCallback","userApi","useEffect","Loader2","Building2","Settings","StatCard","Activity","TrendingUp","Calendar","AppWindow","BarChart3","p","title","icon","subtitle","color"],"mappings":"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"}
1
+ {"version":3,"file":"UserDashboardPage-DwnDRNoW.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-vXiLh35n.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-81-3GJAQ.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-cAikSVW0.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-ZMsx8LWw.js.map