@atlashub/smartstack 3.31.0 → 3.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-DcvOMm5k.js → AgentSkillsPage-BMxOA-nm.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-DcvOMm5k.js.map → AgentSkillsPage-BMxOA-nm.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-CDMhqrhE.js → AgentSkillsPage-DSwfoazB.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-CDMhqrhE.js.map → AgentSkillsPage-DSwfoazB.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-YpJSDaWc.js → AgentWorkloadPage-B_emq8kd.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-YpJSDaWc.js.map → AgentWorkloadPage-B_emq8kd.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-DYBPNzjQ.js → AgentWorkloadPage-_USTeYWz.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-DYBPNzjQ.js.map → AgentWorkloadPage-_USTeYWz.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-9r1axtCg.js → ApiCatalogDetailPage-BC_HxVu5.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-9r1axtCg.js.map → ApiCatalogDetailPage-BC_HxVu5.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-TjCQ8_A8.js → ApiCatalogDetailPage-BI7zyZAd.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-TjCQ8_A8.js.map → ApiCatalogDetailPage-BI7zyZAd.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-COxazTnz.js → ApiCatalogPage-CutaHo5K.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-COxazTnz.js.map → ApiCatalogPage-CutaHo5K.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-QRysH0pT.js → ApiCatalogPage-M80MorHU.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-QRysH0pT.js.map → ApiCatalogPage-M80MorHU.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-jSHy3MPz.js → ApplicationDetailPage-DVY0wua0.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-jSHy3MPz.js.map → ApplicationDetailPage-DVY0wua0.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-Dbx01Ikm.js → ApplicationDetailPage-DzszwaIZ.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-Dbx01Ikm.js.map → ApplicationDetailPage-DzszwaIZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-CclKc0wI.js → ApplicationsDashboardPage-B3ptvnJz.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-CclKc0wI.js.map → ApplicationsDashboardPage-B3ptvnJz.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-CxWmOc1x.js → ApplicationsDashboardPage-D0pxqbEc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-CxWmOc1x.js.map → ApplicationsDashboardPage-D0pxqbEc.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-D2l8cM3o.js → ApplicationsGridPage-Ca23FBSP.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-D2l8cM3o.js.map → ApplicationsGridPage-Ca23FBSP.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BJXWXwyI.js → ApplicationsGridPage-qi2UCD24.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BJXWXwyI.js.map → ApplicationsGridPage-qi2UCD24.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-CMosl3my.js → ApplicationsListPage-CEUmBXN0.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-CMosl3my.js.map → ApplicationsListPage-CEUmBXN0.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-Dc6NGQ61.js → ApplicationsListPage-cE82bv8j.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-Dc6NGQ61.js.map → ApplicationsListPage-cE82bv8j.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DI-iMqoJ.js → ApplicationsPage-DW1BrVVN.js} +4 -4
- package/dist/chunks/{ApplicationsPage-DI-iMqoJ.js.map → ApplicationsPage-DW1BrVVN.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DH7tpMlF.js → ApplicationsPage-RAqTs5HI.js} +2 -2
- package/dist/chunks/{ApplicationsPage-DH7tpMlF.js.map → ApplicationsPage-RAqTs5HI.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-E79QBSLb.js → AssignmentRulesPage-C0qnk3oR.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-E79QBSLb.js.map → AssignmentRulesPage-C0qnk3oR.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-B5UbujbZ.js → AssignmentRulesPage-CVgFmhEs.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-B5UbujbZ.js.map → AssignmentRulesPage-CVgFmhEs.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-CDFaL1gT.js → AssignmentsPage-Bv9HYtYN.js} +2 -2
- package/dist/chunks/{AssignmentsPage-CDFaL1gT.js.map → AssignmentsPage-Bv9HYtYN.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-CPeKJjyK.js → AssignmentsPage-z1q1C9Uz.js} +2 -2
- package/dist/chunks/{AssignmentsPage-CPeKJjyK.js.map → AssignmentsPage-z1q1C9Uz.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BZ3Ocos5.js → AuthCallbackPage-CcteN6Kv.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BZ3Ocos5.js.map → AuthCallbackPage-CcteN6Kv.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-Bml48QpH.js → AuthCallbackPage-DL5PJUYJ.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-Bml48QpH.js.map → AuthCallbackPage-DL5PJUYJ.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-DyzslZ06.js → ConfirmEmailPage-BP8VUz-A.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-DyzslZ06.js.map → ConfirmEmailPage-BP8VUz-A.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-DP1XPaKK.js → ConfirmEmailPage-CeflKXpN.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-DP1XPaKK.js.map → ConfirmEmailPage-CeflKXpN.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-Bz2KrMik.js → CreateSupportTicketPage-BAdvWb_8.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-Bz2KrMik.js.map → CreateSupportTicketPage-BAdvWb_8.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-hKjKM0Bh.js → CreateSupportTicketPage-DDiv79-p.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-hKjKM0Bh.js.map → CreateSupportTicketPage-DDiv79-p.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B4nAd8Tj.js → DashboardPage-B_uyyRRE.js} +2 -2
- package/dist/chunks/{DashboardPage-B4nAd8Tj.js.map → DashboardPage-B_uyyRRE.js.map} +1 -1
- package/dist/chunks/{DashboardPage-rN7IFlTR.js → DashboardPage-CpoduSu7.js} +2 -2
- package/dist/chunks/{DashboardPage-rN7IFlTR.js.map → DashboardPage-CpoduSu7.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CjbNGMo1.js → DashboardPage-D4pyUgdM.js} +3 -3
- package/dist/chunks/{DashboardPage-CjbNGMo1.js.map → DashboardPage-D4pyUgdM.js.map} +1 -1
- package/dist/chunks/{DashboardPage-C9qgPBS-.js → DashboardPage-Kp-MCxW4.js} +3 -3
- package/dist/chunks/{DashboardPage-C9qgPBS-.js.map → DashboardPage-Kp-MCxW4.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CGv2L62M.js → EscalationConfigPage-D-WCN6YS.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CGv2L62M.js.map → EscalationConfigPage-D-WCN6YS.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DpYDmsgw.js → EscalationConfigPage-UrLJarSI.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DpYDmsgw.js.map → EscalationConfigPage-UrLJarSI.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-Db6sOrZN.js → ForceChangePasswordPage-BIh1SF5C.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-Db6sOrZN.js.map → ForceChangePasswordPage-BIh1SF5C.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CLI_fpF4.js → ForceChangePasswordPage-FFZZRpU7.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CLI_fpF4.js.map → ForceChangePasswordPage-FFZZRpU7.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-BhMz2B6A.js → ForgotPasswordPage-BKqRF7SF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-BhMz2B6A.js.map → ForgotPasswordPage-BKqRF7SF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-D06arMXO.js → ForgotPasswordPage-BXp8qQUX.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-D06arMXO.js.map → ForgotPasswordPage-BXp8qQUX.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-BCM8KBCd.js → GroupDetailPage-a0hBx-LO.js} +5 -5
- package/dist/chunks/{GroupDetailPage-BCM8KBCd.js.map → GroupDetailPage-a0hBx-LO.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-CGMV3bWt.js → GroupDetailPage-eGGJCqgq.js} +2 -2
- package/dist/chunks/{GroupDetailPage-CGMV3bWt.js.map → GroupDetailPage-eGGJCqgq.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BBrwEomx.js → MyAccessRequestsPage-BgQSyy5d.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BBrwEomx.js.map → MyAccessRequestsPage-BgQSyy5d.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-CrlWe3gd.js → MyAccessRequestsPage-Dmb0rUHO.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-CrlWe3gd.js.map → MyAccessRequestsPage-Dmb0rUHO.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BOV34_rJ.js → MyTenantsPage-BZTeqyDr.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BOV34_rJ.js.map → MyTenantsPage-BZTeqyDr.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-CK4-klmd.js → MyTenantsPage-kCHBF2uA.js} +2 -2
- package/dist/chunks/{MyTenantsPage-CK4-klmd.js.map → MyTenantsPage-kCHBF2uA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DuhpwhZx.js → MyTicketsPage-BwNIqpCE.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DuhpwhZx.js.map → MyTicketsPage-BwNIqpCE.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-CFZ1G4dG.js → MyTicketsPage-CTpjkA5t.js} +2 -2
- package/dist/chunks/{MyTicketsPage-CFZ1G4dG.js.map → MyTicketsPage-CTpjkA5t.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-BnNQRfBP.js → NavigationAppsPage-DO5bTibb.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-BnNQRfBP.js.map → NavigationAppsPage-DO5bTibb.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DdJxEoTZ.js → NavigationAppsPage-vx_n07SD.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DdJxEoTZ.js.map → NavigationAppsPage-vx_n07SD.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BllOlagk.js → NotificationsPage-Br9sb9AQ.js} +2 -2
- package/dist/chunks/{NotificationsPage-BllOlagk.js.map → NotificationsPage-Br9sb9AQ.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-D1T_ozHl.js → NotificationsPage-CRhd752L.js} +2 -2
- package/dist/chunks/{NotificationsPage-D1T_ozHl.js.map → NotificationsPage-CRhd752L.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-CrAQt7qL.js → OnboardingWizardPage-BIl3Usew.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-CrAQt7qL.js.map → OnboardingWizardPage-BIl3Usew.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-CioLaCYz.js → OnboardingWizardPage-CjqxWX7h.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-CioLaCYz.js.map → OnboardingWizardPage-CjqxWX7h.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-CvPqugYu.js → PermissionDetailPage-COIuJXH-.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-CvPqugYu.js.map → PermissionDetailPage-COIuJXH-.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-BIG78-1-.js → PermissionDetailPage-P_d6xnY0.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-BIG78-1-.js.map → PermissionDetailPage-P_d6xnY0.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-CDSuc8vw.js → PermissionsPage-BhjnMyFY.js} +2 -2
- package/dist/chunks/{PermissionsPage-CDSuc8vw.js.map → PermissionsPage-BhjnMyFY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-XaOrGrPZ.js → PermissionsPage-CHYy8XFr.js} +2 -2
- package/dist/chunks/{PermissionsPage-XaOrGrPZ.js.map → PermissionsPage-CHYy8XFr.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-oSD7oQhJ.js → PortalDashboardPage-BwQ4NQrH.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-oSD7oQhJ.js.map → PortalDashboardPage-BwQ4NQrH.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-BsWVXkMe.js → PortalDashboardPage-hLJcfGnT.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-BsWVXkMe.js.map → PortalDashboardPage-hLJcfGnT.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-ca2BOdoH.js → PreferencesPage-DYYqisR0.js} +2 -2
- package/dist/chunks/{PreferencesPage-ca2BOdoH.js.map → PreferencesPage-DYYqisR0.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-DD0_XWdT.js → PreferencesPage-DzpM-lpD.js} +2 -2
- package/dist/chunks/{PreferencesPage-DD0_XWdT.js.map → PreferencesPage-DzpM-lpD.js.map} +1 -1
- package/dist/chunks/{ProfilePage-C8tUIOnb.js → ProfilePage-D98bvXeT.js} +2 -2
- package/dist/chunks/{ProfilePage-C8tUIOnb.js.map → ProfilePage-D98bvXeT.js.map} +1 -1
- package/dist/chunks/{ProfilePage-Bex_JN5N.js → ProfilePage-DWRDN0fo.js} +2 -2
- package/dist/chunks/{ProfilePage-Bex_JN5N.js.map → ProfilePage-DWRDN0fo.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-B-FXS2ln.js → ReferencesManagementPage-B0Cq9BHS.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-B-FXS2ln.js.map → ReferencesManagementPage-B0Cq9BHS.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-C8KZprkI.js → ReferencesManagementPage-CxbfOBs2.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-C8KZprkI.js.map → ReferencesManagementPage-CxbfOBs2.js.map} +1 -1
- package/dist/chunks/{RegisterPage-MWcVu-LY.js → RegisterPage-DMeq3GzW.js} +2 -2
- package/dist/chunks/{RegisterPage-MWcVu-LY.js.map → RegisterPage-DMeq3GzW.js.map} +1 -1
- package/dist/chunks/{RegisterPage-BYt__zKJ.js → RegisterPage-DvG2Php7.js} +2 -2
- package/dist/chunks/{RegisterPage-BYt__zKJ.js.map → RegisterPage-DvG2Php7.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-rCLUIj_T.js → ResetPasswordPage-DOTswepm.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-rCLUIj_T.js.map → ResetPasswordPage-DOTswepm.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-DaJiMj5Z.js → ResetPasswordPage-ntMMFvDo.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-DaJiMj5Z.js.map → ResetPasswordPage-ntMMFvDo.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-j7Rp6apG.js → ResolutionModal-CKt73sIZ.js} +2 -2
- package/dist/chunks/{ResolutionModal-j7Rp6apG.js.map → ResolutionModal-CKt73sIZ.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DeuPnLWg.js → ResolutionModal-XGHCELez.js} +2 -2
- package/dist/chunks/{ResolutionModal-DeuPnLWg.js.map → ResolutionModal-XGHCELez.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CLtZWX17.js → RoleDetailPage-BtnYTVN6.js} +3 -3
- package/dist/chunks/{RoleDetailPage-CLtZWX17.js.map → RoleDetailPage-BtnYTVN6.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-TGyGmLMM.js → RoleDetailPage-DAp65p0d.js} +2 -2
- package/dist/chunks/{RoleDetailPage-TGyGmLMM.js.map → RoleDetailPage-DAp65p0d.js.map} +1 -1
- package/dist/chunks/{RolesPage-Dm03fBBf.js → RolesPage-DyEhJHxw.js} +2 -2
- package/dist/chunks/{RolesPage-Dm03fBBf.js.map → RolesPage-DyEhJHxw.js.map} +1 -1
- package/dist/chunks/{RolesPage-C0c5G9e7.js → RolesPage-FmZCLEYo.js} +2 -2
- package/dist/chunks/{RolesPage-C0c5G9e7.js.map → RolesPage-FmZCLEYo.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B4WDzEKi.js → SlaConfigPage-DTtP2Q4t.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B4WDzEKi.js.map → SlaConfigPage-DTtP2Q4t.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-Cwo9NwxH.js → SlaConfigPage-LpVD_ai4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-Cwo9NwxH.js.map → SlaConfigPage-LpVD_ai4.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-CL12dFy-.js → SupportPermissionsPage-BV8F_Tl3.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-CL12dFy-.js.map → SupportPermissionsPage-BV8F_Tl3.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-CneIhl30.js → SupportPermissionsPage-Bzfq6pKf.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-CneIhl30.js.map → SupportPermissionsPage-Bzfq6pKf.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DStKmwHT.js → TemplatesPage-CYHH5WlP.js} +2 -2
- package/dist/chunks/{TemplatesPage-DStKmwHT.js.map → TemplatesPage-CYHH5WlP.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-X4Rrhs9p.js → TemplatesPage-czt_RH5f.js} +2 -2
- package/dist/chunks/{TemplatesPage-X4Rrhs9p.js.map → TemplatesPage-czt_RH5f.js.map} +1 -1
- package/dist/chunks/{TenantCard-BUBYWtvR.js → TenantCard-Bqh5PGJx.js} +2 -2
- package/dist/chunks/{TenantCard-BUBYWtvR.js.map → TenantCard-Bqh5PGJx.js.map} +1 -1
- package/dist/chunks/{TenantCard-CAgiB-NG.js → TenantCard-C6qKD480.js} +2 -2
- package/dist/chunks/{TenantCard-CAgiB-NG.js.map → TenantCard-C6qKD480.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-BAoah-mL.js → TenantScopeSelector-DWUP8Le7.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-BAoah-mL.js.map → TenantScopeSelector-DWUP8Le7.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-B9vtpIZx.js → TenantScopeSelector-DxQ7HNbh.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-B9vtpIZx.js.map → TenantScopeSelector-DxQ7HNbh.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BFcP4X8s.js → TicketDetailPage-BuxXLcJi.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BFcP4X8s.js.map → TicketDetailPage-BuxXLcJi.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-D_Npnt4A.js → TicketDetailPage-Dy4pg33-.js} +2 -2
- package/dist/chunks/{TicketDetailPage-D_Npnt4A.js.map → TicketDetailPage-Dy4pg33-.js.map} +1 -1
- package/dist/chunks/{TicketsPage-p21DLhUb.js → TicketsPage-Ck-HUgte.js} +2 -2
- package/dist/chunks/{TicketsPage-p21DLhUb.js.map → TicketsPage-Ck-HUgte.js.map} +1 -1
- package/dist/chunks/{TicketsPage-DBP9kalU.js → TicketsPage-jlN9JDzm.js} +2 -2
- package/dist/chunks/{TicketsPage-DBP9kalU.js.map → TicketsPage-jlN9JDzm.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-DOwShnG8.js → UserCreateTicketPage-BrRZyXMn.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-DOwShnG8.js.map → UserCreateTicketPage-BrRZyXMn.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-lvlvp2u6.js → UserCreateTicketPage-D58Ro4Nb.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-lvlvp2u6.js.map → UserCreateTicketPage-D58Ro4Nb.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-Dp6q6FEW.js → UserDashboardPage-C5ulSzaI.js} +2 -2
- package/dist/chunks/{UserDashboardPage-Dp6q6FEW.js.map → UserDashboardPage-C5ulSzaI.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-C_tm7Pld.js → UserDashboardPage-CjAx5OHh.js} +2 -2
- package/dist/chunks/{UserDashboardPage-C_tm7Pld.js.map → UserDashboardPage-CjAx5OHh.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-DXLxO7LF.js → UserDetailPage-Bhpry9xq.js} +2 -2
- package/dist/chunks/{UserDetailPage-DXLxO7LF.js.map → UserDetailPage-Bhpry9xq.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-6grZ6gmV.js → UserDetailPage-DUu2mA_n.js} +5 -5
- package/dist/chunks/{UserDetailPage-6grZ6gmV.js.map → UserDetailPage-DUu2mA_n.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-a4II5VEE.js → UserTicketDetailPage-DpFFjIso.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-a4II5VEE.js.map → UserTicketDetailPage-DpFFjIso.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-Ch9IfCPo.js → UserTicketDetailPage-YJvBWFEu.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-Ch9IfCPo.js.map → UserTicketDetailPage-YJvBWFEu.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BeAv4QfV.js → UsersGroupsPage-b2PTQX_m.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BeAv4QfV.js.map → UsersGroupsPage-b2PTQX_m.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-B7Er0V4l.js → UsersGroupsPage-l33K3Nca.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-B7Er0V4l.js.map → UsersGroupsPage-l33K3Nca.js.map} +1 -1
- package/dist/chunks/{UsersPage-ZR9r9vvf.js → UsersPage-BjC5ZqTa.js} +2 -2
- package/dist/chunks/{UsersPage-ZR9r9vvf.js.map → UsersPage-BjC5ZqTa.js.map} +1 -1
- package/dist/chunks/{UsersPage-0M1FLqOe.js → UsersPage-NsTukS8m.js} +2 -2
- package/dist/chunks/{UsersPage-0M1FLqOe.js.map → UsersPage-NsTukS8m.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-CBpF5d54.js → accessRequestsApi-C2usKVGJ.js} +2 -2
- package/dist/chunks/{accessRequestsApi-CBpF5d54.js.map → accessRequestsApi-C2usKVGJ.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-BJH8EE1K.js → accessRequestsApi-LuovcP6l.js} +2 -2
- package/dist/chunks/{accessRequestsApi-BJH8EE1K.js.map → accessRequestsApi-LuovcP6l.js.map} +1 -1
- package/dist/chunks/{aiApi-Dl7a2lWz.js → aiApi-B03u3zUH.js} +2 -2
- package/dist/chunks/{aiApi-Dl7a2lWz.js.map → aiApi-B03u3zUH.js.map} +1 -1
- package/dist/chunks/{aiApi-CkkWAvNB.js → aiApi-Cwg0B8PJ.js} +2 -2
- package/dist/chunks/{aiApi-CkkWAvNB.js.map → aiApi-Cwg0B8PJ.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-BwcSE_H1.js → applicationAnalyticsApi-BobBdehV.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-BwcSE_H1.js.map → applicationAnalyticsApi-BobBdehV.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-DKMmDvWk.js → applicationAnalyticsApi-jCZhWKOx.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-DKMmDvWk.js.map → applicationAnalyticsApi-jCZhWKOx.js.map} +1 -1
- package/dist/chunks/{groupsApi-BzDV3_Jc.js → groupsApi-CoxnW9vH.js} +2 -2
- package/dist/chunks/{groupsApi-BzDV3_Jc.js.map → groupsApi-CoxnW9vH.js.map} +1 -1
- package/dist/chunks/{groupsApi-CQ4vFMdP.js → groupsApi-D2lFFcgu.js} +2 -2
- package/dist/chunks/{groupsApi-CQ4vFMdP.js.map → groupsApi-D2lFFcgu.js.map} +1 -1
- package/dist/chunks/{index-Det9dEaQ.js → index-B5U_Jp0-.js} +2 -2
- package/dist/chunks/{index-Det9dEaQ.js.map → index-B5U_Jp0-.js.map} +1 -1
- package/dist/chunks/{index-D18t9DhC.js → index-BDB_a-p7.js} +4 -4
- package/dist/chunks/{index-D18t9DhC.js.map → index-BDB_a-p7.js.map} +1 -1
- package/dist/chunks/{index-CUZygY5Q.js → index-BbHRJz-n.js} +2 -2
- package/dist/chunks/{index-CUZygY5Q.js.map → index-BbHRJz-n.js.map} +1 -1
- package/dist/chunks/{index-CoHIgn5H.js → index-CI2WU5ZZ.js} +2 -2
- package/dist/chunks/{index-CoHIgn5H.js.map → index-CI2WU5ZZ.js.map} +1 -1
- package/dist/chunks/{index-D-2xSu5W.js → index-CLk9ClC2.js} +3 -3
- package/dist/chunks/{index-D-2xSu5W.js.map → index-CLk9ClC2.js.map} +1 -1
- package/dist/chunks/{index-Dbq-x5H9.js → index-CmTKGOa_.js} +2 -2
- package/dist/chunks/{index-Dbq-x5H9.js.map → index-CmTKGOa_.js.map} +1 -1
- package/dist/chunks/{index-k4USDz2P.js → index-D5oIr6PO.js} +2 -2
- package/dist/chunks/{index-k4USDz2P.js.map → index-D5oIr6PO.js.map} +1 -1
- package/dist/chunks/{index-Cib93xtp.js → index-DC6TBJV_.js} +2 -2
- package/dist/chunks/{index-Cib93xtp.js.map → index-DC6TBJV_.js.map} +1 -1
- package/dist/chunks/{index-CpY95_ro.js → index-DN97bp_f.js} +1128 -1093
- package/dist/chunks/index-DN97bp_f.js.map +1 -0
- package/dist/chunks/{index-BPMjxWVx.js → index-DRW5qV_L.js} +2 -2
- package/dist/chunks/{index-BPMjxWVx.js.map → index-DRW5qV_L.js.map} +1 -1
- package/dist/chunks/{index-DQd324n7.js → index-DcLZao1q.js} +2 -2
- package/dist/chunks/{index-DQd324n7.js.map → index-DcLZao1q.js.map} +1 -1
- package/dist/chunks/{index-bgT9XOKZ.js → index-DcMOmGtX.js} +2 -2
- package/dist/chunks/{index-bgT9XOKZ.js.map → index-DcMOmGtX.js.map} +1 -1
- package/dist/chunks/{index-DK5czlkn.js → index-DnML-nfd.js} +10 -10
- package/dist/chunks/index-DnML-nfd.js.map +1 -0
- package/dist/chunks/{index-BBmMbSZV.js → index-Drd59qAP.js} +8 -8
- package/dist/chunks/{index-BBmMbSZV.js.map → index-Drd59qAP.js.map} +1 -1
- package/dist/chunks/{index-CEbwdURd.js → index-EiIHjIgi.js} +2 -2
- package/dist/chunks/{index-CEbwdURd.js.map → index-EiIHjIgi.js.map} +1 -1
- package/dist/chunks/{index-BLlESTfA.js → index-axYz6ptj.js} +2 -2
- package/dist/chunks/{index-BLlESTfA.js.map → index-axYz6ptj.js.map} +1 -1
- package/dist/chunks/{index-Ci1SqFiY.js → index-lXrXnhFc.js} +2 -2
- package/dist/chunks/{index-Ci1SqFiY.js.map → index-lXrXnhFc.js.map} +1 -1
- package/dist/chunks/{index-h7ZrwrQg.js → index-rI-1r6c2.js} +2 -2
- package/dist/chunks/{index-h7ZrwrQg.js.map → index-rI-1r6c2.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-Dk6K-UTE.js → tenantIconMap-B4wAYGWP.js} +2 -2
- package/dist/chunks/{tenantIconMap-Dk6K-UTE.js.map → tenantIconMap-B4wAYGWP.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-7ihIWxAh.js → tenantIconMap-Cfm15HwB.js} +2 -2
- package/dist/chunks/{tenantIconMap-7ihIWxAh.js.map → tenantIconMap-Cfm15HwB.js.map} +1 -1
- package/dist/chunks/{ticketingApi-BCMKkzlv.js → ticketingApi-CLMAPZDw.js} +2 -2
- package/dist/chunks/{ticketingApi-BCMKkzlv.js.map → ticketingApi-CLMAPZDw.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Dwn7pl5z.js → ticketingApi-CTap4NdE.js} +2 -2
- package/dist/chunks/{ticketingApi-Dwn7pl5z.js.map → ticketingApi-CTap4NdE.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-gJ7yhWyi.js → useAccessRequests-CBpDkq9o.js} +2 -2
- package/dist/chunks/{useAccessRequests-gJ7yhWyi.js.map → useAccessRequests-CBpDkq9o.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-Du7CvowE.js → useAccessRequests-Cj2-OoAW.js} +3 -3
- package/dist/chunks/{useAccessRequests-Du7CvowE.js.map → useAccessRequests-Cj2-OoAW.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-5wWea2Jg.js → useUserAccessRequests-C6l2VMe1.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-5wWea2Jg.js.map → useUserAccessRequests-C6l2VMe1.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Bk_v8egy.js → useUserAccessRequests-Ds3K-ENU.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Bk_v8egy.js.map → useUserAccessRequests-Ds3K-ENU.js.map} +1 -1
- package/dist/components/routing/DynamicRouter.d.ts.map +1 -1
- package/dist/components/routing/ProtectedRoute.d.ts.map +1 -1
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/contexts/NavigationContext.d.ts.map +1 -1
- package/dist/extensions/PageRegistry.d.ts +2 -0
- package/dist/extensions/PageRegistry.d.ts.map +1 -1
- package/dist/services/api/adminApi/settings.d.ts +8 -3
- package/dist/services/api/adminApi/settings.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-CpY95_ro.js.map +0 -1
- package/dist/chunks/index-DK5czlkn.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreferencesPage-ca2BOdoH.js","sources":["../../src/pages/personal/myspace/PreferencesPage.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Palette, Globe, Bell, Loader2, Check, Star, X, Search, GripVertical } from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { LanguageSwitcher } from '@/components/ui/LanguageSwitcher';\r\nimport { ThemeCustomizer } from '@/components/ui/ThemeCustomizer';\r\nimport { useTheme } from '@/contexts/ThemeContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation, type ModuleDto, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport { userApi } from '@/services/api/userApi';\r\n\r\nconst PREFERENCES_TABS = ['appearance', 'language', 'notifications', 'favorites'] as const;\r\ntype PreferencesTab = typeof PREFERENCES_TABS[number];\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\nfunction getFavoriteButtonClass(isSelected: boolean, isDisabled: boolean): string {\r\n if (isSelected) return 'bg-[var(--accent-bg)] border-2 border-[var(--color-accent-500)]';\r\n if (isDisabled) return 'opacity-50 cursor-not-allowed bg-[var(--bg-tertiary)] border border-[var(--border-color)]';\r\n return 'bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)]';\r\n}\r\n\r\nexport function PreferencesPage(): ReactElement | null {\r\n const { t, i18n } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { activeTab, setActiveTab } = useTabNavigation<PreferencesTab>('appearance', PREFERENCES_TABS);\r\n const { loadFromServer, isSyncing, selectedThemeTenant } = useTheme();\r\n const { currentTenant, isLoading: tenantLoading } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, toggleFavorite, isFavorite, canAddMore, maxFavorites, reorderFavorites, loading: favoritesLoading } = useFavoriteModules();\r\n const [syncSuccess, setSyncSuccess] = useState(false);\r\n const [moduleSearch, setModuleSearch] = useState('');\r\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\r\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\r\n const dragNodeRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const [emailNotifications, setEmailNotifications] = useState(true);\r\n const [securityAlerts, setSecurityAlerts] = useState(true);\r\n const [productUpdates, setProductUpdates] = useState(false);\r\n const [notificationsSaving, setNotificationsSaving] = useState(false);\r\n const [notificationsSaved, setNotificationsSaved] = useState(false);\r\n const notificationsSaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isInitialLoadRef = useRef(true);\r\n\r\n // Wait for tenant context to be loaded before fetching preferences\r\n useEffect(() => {\r\n if (!tenantLoading && currentTenant) {\r\n loadPreferences();\r\n }\r\n }, [tenantLoading, currentTenant]);\r\n\r\n const loadPreferences = async () => {\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n setEmailNotifications(prefs.emailNotifications);\r\n setSecurityAlerts(prefs.pushNotifications);\r\n isInitialLoadRef.current = false;\r\n } catch {\r\n isInitialLoadRef.current = false;\r\n }\r\n };\r\n\r\n const saveNotifications = useCallback(async () => {\r\n setNotificationsSaving(true);\r\n setNotificationsSaved(false);\r\n try {\r\n await userApi.preferences.updateNotifications({\r\n emailNotifications,\r\n pushNotifications: securityAlerts,\r\n });\r\n setNotificationsSaved(true);\r\n setTimeout(() => setNotificationsSaved(false), 2000);\r\n } catch {\r\n console.error('[PreferencesPage] Failed to save notifications');\r\n } finally {\r\n setNotificationsSaving(false);\r\n }\r\n }, [emailNotifications, securityAlerts]);\r\n\r\n useEffect(() => {\r\n if (isInitialLoadRef.current) return;\r\n\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n\r\n notificationsSaveTimeoutRef.current = setTimeout(() => {\r\n saveNotifications();\r\n }, 1000);\r\n\r\n return () => {\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n };\r\n }, [emailNotifications, securityAlerts, saveNotifications]);\r\n\r\n const handleSync = async () => {\r\n // Determine which scope to sync based on selectedThemeTenant\r\n // null = global scope, string = tenant scope\r\n const scope = selectedThemeTenant === null ? 'global' : 'tenant';\r\n setSyncSuccess(false);\r\n try {\r\n await loadFromServer(scope);\r\n await loadPreferences();\r\n setSyncSuccess(true);\r\n setTimeout(() => setSyncSuccess(false), 3000);\r\n } catch (error) {\r\n console.error('[PreferencesPage] Sync failed:', error);\r\n }\r\n };\r\n\r\n const tabs = [\r\n { id: 'appearance' as const, label: 'Apparence', icon: Palette, description: 'Personnaliser le thème et les couleurs' },\r\n { id: 'language' as const, label: 'Langue', icon: Globe, description: 'Changer la langue de l\\'interface' },\r\n { id: 'notifications' as const, label: 'Notifications', icon: Bell, description: 'Gérer les notifications' },\r\n { id: 'favorites' as const, label: t('common:favorites.quickAccess'), icon: Star, description: 'Gérer vos modules favoris' },\r\n ];\r\n\r\n // Gather all modules grouped by application for favorites\r\n const modulesByApp: { app: ApplicationDto; modules: ModuleDto[] }[] = [];\r\n menu?.applications.forEach(app => {\r\n if ((app.modules?.length ?? 0) > 0) {\r\n modulesByApp.push({\r\n app,\r\n modules: app.modules,\r\n });\r\n }\r\n });\r\n\r\n const handleToggleFavorite = (module: ModuleDto, app: ApplicationDto) => {\r\n const favoriteModule: FavoriteModule = {\r\n id: module.id,\r\n code: module.code,\r\n label: module.label,\r\n icon: module.icon || 'Star',\r\n route: `/${app.code}/${module.code}`,\r\n applicationCode: app.code,\r\n applicationLabel: app.label,\r\n };\r\n toggleFavorite(favoriteModule);\r\n };\r\n\r\n const handleFavoriteClick = (module: FavoriteModule) => {\r\n if (module.route) {\r\n navigate(module.route);\r\n }\r\n };\r\n\r\n // Drag and drop handlers for reordering\r\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n setDraggedIndex(index);\r\n dragNodeRef.current = e.currentTarget;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', index.toString());\r\n // Add a slight delay to allow the drag image to be created before adding opacity\r\n setTimeout(() => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '0.4';\r\n }\r\n }, 0);\r\n };\r\n\r\n const handleDragEnd = () => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '1';\r\n }\r\n setDraggedIndex(null);\r\n setDragOverIndex(null);\r\n dragNodeRef.current = null;\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n if (index !== draggedIndex) {\r\n setDragOverIndex(index);\r\n }\r\n };\r\n\r\n const handleDragLeave = () => {\r\n setDragOverIndex(null);\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent<HTMLDivElement>, dropIndex: number) => {\r\n e.preventDefault();\r\n const dragIndex = draggedIndex;\r\n if (dragIndex === null || dragIndex === dropIndex) return;\r\n\r\n const newFavorites = [...favorites];\r\n const [draggedItem] = newFavorites.splice(dragIndex, 1);\r\n newFavorites.splice(dropIndex, 0, draggedItem);\r\n\r\n reorderFavorites(newFavorites);\r\n handleDragEnd();\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)]\">{t('navigation:sidebar.preferences')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">Personnalisez votre expérience SmartStack</p>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <div className=\"border-b border-[var(--item-color-border)]\">\r\n <nav className=\"flex gap-1\" aria-label=\"Tabs\">\r\n {tabs.map((tab) => {\r\n const Icon = tab.icon;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-all border-b-2 ${\r\n activeTab === tab.id\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)] bg-[var(--accent-bg)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button) var(--radius-button) 0 0' }}\r\n >\r\n <Icon className=\"w-5 h-5\" />\r\n <span>{tab.label}</span>\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--item-color-border)] p-6\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {activeTab === 'appearance' && (\r\n <div className=\"space-y-4\">\r\n <ThemeCustomizer\r\n onSync={handleSync}\r\n isSyncing={isSyncing}\r\n syncSuccess={syncSuccess}\r\n />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'language' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Langue</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Sélectionnez la langue de l'interface\r\n </p>\r\n </div>\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {i18n.language?.startsWith('fr') ? 'Français' : 'English'}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Langue actuelle de l'interface\r\n </p>\r\n </div>\r\n <LanguageSwitcher />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'notifications' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Notifications</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Gérez vos préférences de notifications\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-muted)]\">\r\n {notificationsSaving && (\r\n <>\r\n <Loader2 className=\"w-3 h-3 animate-spin\" />\r\n <span>Sauvegarde...</span>\r\n </>\r\n )}\r\n {notificationsSaved && !notificationsSaving && (\r\n <>\r\n <Check className=\"w-3 h-3 text-green-500\" />\r\n <span className=\"text-green-600\">Sauvegardé</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"space-y-4\">\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Notifications par email</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Recevoir des notifications par email\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={emailNotifications}\r\n onChange={(e) => setEmailNotifications(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Alertes de sécurité</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Être notifié des événements de sécurité\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={securityAlerts}\r\n onChange={(e) => setSecurityAlerts(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Mises à jour produit</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Nouvelles fonctionnalités et améliorations\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={productUpdates}\r\n onChange={(e) => setProductUpdates(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'favorites' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('common:favorites.selectModules', { count: favorites.length, max: maxFavorites })}\r\n </p>\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 <span className=\"ml-2 text-[var(--text-secondary)]\">Chargement des favoris...</span>\r\n </div>\r\n )}\r\n\r\n {!favoritesLoading && (\r\n <>\r\n\r\n {/* Current Favorites */}\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Vos favoris actuels</h3>\r\n {favorites.length > 1 && (\r\n <span className=\"text-xs text-[var(--text-muted)]\">Glissez pour réorganiser</span>\r\n )}\r\n </div>\r\n {favorites.length === 0 ? (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">Aucun favori sélectionné</p>\r\n ) : (\r\n <div className=\"flex flex-col gap-2\">\r\n {favorites.map((module, index) => (\r\n <div\r\n key={module.id}\r\n draggable\r\n onDragStart={(e) => handleDragStart(e, index)}\r\n onDragEnd={handleDragEnd}\r\n onDragOver={(e) => handleDragOver(e, index)}\r\n onDragLeave={handleDragLeave}\r\n onDrop={(e) => handleDrop(e, index)}\r\n className={`flex items-center gap-2 px-3 py-2 bg-[var(--accent-bg)] border text-[var(--color-accent-500)] cursor-grab active:cursor-grabbing transition-all ${\r\n dragOverIndex === index\r\n ? 'border-[var(--color-accent-500)] border-2 scale-[1.02]'\r\n : 'border-[var(--color-accent-500)]/50'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <GripVertical className=\"w-4 h-4 text-[var(--color-accent-400)] flex-shrink-0\" />\r\n <span className=\"text-xs text-[var(--color-accent-500)] font-mono w-4\">{index + 1}</span>\r\n <button\r\n onClick={() => handleFavoriteClick(module)}\r\n className=\"flex items-center gap-2 hover:underline flex-1\"\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4\" />\r\n <span className=\"text-sm font-medium\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({module.applicationLabel})</span>\r\n </button>\r\n <button\r\n onClick={() => toggleFavorite(module)}\r\n className=\"p-1 hover:bg-[var(--bg-tertiary)] rounded flex-shrink-0\"\r\n title=\"Retirer des favoris\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Available Modules */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Modules disponibles</h3>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder=\"Rechercher un module...\"\r\n value={moduleSearch}\r\n onChange={(e) => setModuleSearch(e.target.value)}\r\n className=\"pl-9 pr-3 py-2 w-64 bg-[var(--bg-primary)] border border-[var(--border-color)] text-sm focus:outline-none focus:border-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-input)' }}\r\n />\r\n </div>\r\n </div>\r\n {modulesByApp.map(({ app, modules }) => {\r\n // Filter modules based on search\r\n const filteredModules = moduleSearch\r\n ? modules.filter(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n app.label.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n : modules;\r\n\r\n // Don't render app section if no modules match\r\n if (filteredModules.length === 0) return null;\r\n\r\n return (\r\n <div\r\n key={app.id}\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-2 mb-3\">\r\n <DynamicIcon name={app.icon || 'Folder'} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({filteredModules.length} module{filteredModules.length > 1 ? 's' : ''})</span>\r\n </div>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2\">\r\n {filteredModules.map((module) => {\r\n const isSelected = isFavorite(module.id);\r\n const isDisabled = !isSelected && !canAddMore;\r\n\r\n return (\r\n <button\r\n key={module.id}\r\n onClick={() => handleToggleFavorite(module, app)}\r\n disabled={isDisabled}\r\n className={`flex items-center gap-3 p-3 transition-all ${\r\n getFavoriteButtonClass(isSelected, isDisabled)\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <div className={`w-8 h-8 flex items-center justify-center ${\r\n isSelected\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`} style={{ borderRadius: 'var(--radius-button)' }}>\r\n <DynamicIcon name={module.icon || 'Star'} className=\"w-4 h-4\" />\r\n </div>\r\n <span className={`text-sm ${\r\n isSelected ? 'font-medium text-[var(--color-accent-500)]' : 'text-[var(--text-primary)]'\r\n }`}>\r\n {module.label}\r\n </span>\r\n {isSelected && (\r\n <Check className=\"w-4 h-4 text-[var(--color-accent-500)] ml-auto\" />\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {(modulesByApp.length === 0 || (moduleSearch && modulesByApp.every(({ modules }) =>\r\n !modules.some(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n ))) && (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {moduleSearch ? `Aucun module trouvé pour \"${moduleSearch}\"` : t('common:favorites.noModules')}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["PREFERENCES_TABS","DynamicIcon","name","className","IconComponent","LucideIcons","jsx","Star","getFavoriteButtonClass","isSelected","isDisabled","PreferencesPage","t","i18n","useTranslation","navigate","useNavigate","activeTab","setActiveTab","useTabNavigation","loadFromServer","isSyncing","selectedThemeTenant","useTheme","currentTenant","tenantLoading","useTenant","menu","useNavigation","favorites","toggleFavorite","isFavorite","canAddMore","maxFavorites","reorderFavorites","favoritesLoading","useFavoriteModules","syncSuccess","setSyncSuccess","useState","moduleSearch","setModuleSearch","draggedIndex","setDraggedIndex","dragOverIndex","setDragOverIndex","dragNodeRef","useRef","emailNotifications","setEmailNotifications","securityAlerts","setSecurityAlerts","productUpdates","setProductUpdates","notificationsSaving","setNotificationsSaving","notificationsSaved","setNotificationsSaved","notificationsSaveTimeoutRef","isInitialLoadRef","useEffect","loadPreferences","prefs","userApi","saveNotifications","useCallback","handleSync","scope","error","tabs","Palette","Globe","Bell","modulesByApp","app","handleToggleFavorite","module","favoriteModule","handleFavoriteClick","handleDragStart","e","index","handleDragEnd","handleDragOver","handleDragLeave","handleDrop","dropIndex","dragIndex","newFavorites","draggedItem","jsxs","tab","Icon","ThemeCustomizer","LanguageSwitcher","Fragment","Loader2","Check","GripVertical","X","Search","modules","filteredModules","m"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreferencesPage-DYYqisR0.js","sources":["../../src/pages/personal/myspace/PreferencesPage.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Palette, Globe, Bell, Loader2, Check, Star, X, Search, GripVertical } from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { LanguageSwitcher } from '@/components/ui/LanguageSwitcher';\r\nimport { ThemeCustomizer } from '@/components/ui/ThemeCustomizer';\r\nimport { useTheme } from '@/contexts/ThemeContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation, type ModuleDto, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport { userApi } from '@/services/api/userApi';\r\n\r\nconst PREFERENCES_TABS = ['appearance', 'language', 'notifications', 'favorites'] as const;\r\ntype PreferencesTab = typeof PREFERENCES_TABS[number];\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\nfunction getFavoriteButtonClass(isSelected: boolean, isDisabled: boolean): string {\r\n if (isSelected) return 'bg-[var(--accent-bg)] border-2 border-[var(--color-accent-500)]';\r\n if (isDisabled) return 'opacity-50 cursor-not-allowed bg-[var(--bg-tertiary)] border border-[var(--border-color)]';\r\n return 'bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)]';\r\n}\r\n\r\nexport function PreferencesPage(): ReactElement | null {\r\n const { t, i18n } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { activeTab, setActiveTab } = useTabNavigation<PreferencesTab>('appearance', PREFERENCES_TABS);\r\n const { loadFromServer, isSyncing, selectedThemeTenant } = useTheme();\r\n const { currentTenant, isLoading: tenantLoading } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, toggleFavorite, isFavorite, canAddMore, maxFavorites, reorderFavorites, loading: favoritesLoading } = useFavoriteModules();\r\n const [syncSuccess, setSyncSuccess] = useState(false);\r\n const [moduleSearch, setModuleSearch] = useState('');\r\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\r\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\r\n const dragNodeRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const [emailNotifications, setEmailNotifications] = useState(true);\r\n const [securityAlerts, setSecurityAlerts] = useState(true);\r\n const [productUpdates, setProductUpdates] = useState(false);\r\n const [notificationsSaving, setNotificationsSaving] = useState(false);\r\n const [notificationsSaved, setNotificationsSaved] = useState(false);\r\n const notificationsSaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isInitialLoadRef = useRef(true);\r\n\r\n // Wait for tenant context to be loaded before fetching preferences\r\n useEffect(() => {\r\n if (!tenantLoading && currentTenant) {\r\n loadPreferences();\r\n }\r\n }, [tenantLoading, currentTenant]);\r\n\r\n const loadPreferences = async () => {\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n setEmailNotifications(prefs.emailNotifications);\r\n setSecurityAlerts(prefs.pushNotifications);\r\n isInitialLoadRef.current = false;\r\n } catch {\r\n isInitialLoadRef.current = false;\r\n }\r\n };\r\n\r\n const saveNotifications = useCallback(async () => {\r\n setNotificationsSaving(true);\r\n setNotificationsSaved(false);\r\n try {\r\n await userApi.preferences.updateNotifications({\r\n emailNotifications,\r\n pushNotifications: securityAlerts,\r\n });\r\n setNotificationsSaved(true);\r\n setTimeout(() => setNotificationsSaved(false), 2000);\r\n } catch {\r\n console.error('[PreferencesPage] Failed to save notifications');\r\n } finally {\r\n setNotificationsSaving(false);\r\n }\r\n }, [emailNotifications, securityAlerts]);\r\n\r\n useEffect(() => {\r\n if (isInitialLoadRef.current) return;\r\n\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n\r\n notificationsSaveTimeoutRef.current = setTimeout(() => {\r\n saveNotifications();\r\n }, 1000);\r\n\r\n return () => {\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n };\r\n }, [emailNotifications, securityAlerts, saveNotifications]);\r\n\r\n const handleSync = async () => {\r\n // Determine which scope to sync based on selectedThemeTenant\r\n // null = global scope, string = tenant scope\r\n const scope = selectedThemeTenant === null ? 'global' : 'tenant';\r\n setSyncSuccess(false);\r\n try {\r\n await loadFromServer(scope);\r\n await loadPreferences();\r\n setSyncSuccess(true);\r\n setTimeout(() => setSyncSuccess(false), 3000);\r\n } catch (error) {\r\n console.error('[PreferencesPage] Sync failed:', error);\r\n }\r\n };\r\n\r\n const tabs = [\r\n { id: 'appearance' as const, label: 'Apparence', icon: Palette, description: 'Personnaliser le thème et les couleurs' },\r\n { id: 'language' as const, label: 'Langue', icon: Globe, description: 'Changer la langue de l\\'interface' },\r\n { id: 'notifications' as const, label: 'Notifications', icon: Bell, description: 'Gérer les notifications' },\r\n { id: 'favorites' as const, label: t('common:favorites.quickAccess'), icon: Star, description: 'Gérer vos modules favoris' },\r\n ];\r\n\r\n // Gather all modules grouped by application for favorites\r\n const modulesByApp: { app: ApplicationDto; modules: ModuleDto[] }[] = [];\r\n menu?.applications.forEach(app => {\r\n if ((app.modules?.length ?? 0) > 0) {\r\n modulesByApp.push({\r\n app,\r\n modules: app.modules,\r\n });\r\n }\r\n });\r\n\r\n const handleToggleFavorite = (module: ModuleDto, app: ApplicationDto) => {\r\n const favoriteModule: FavoriteModule = {\r\n id: module.id,\r\n code: module.code,\r\n label: module.label,\r\n icon: module.icon || 'Star',\r\n route: `/${app.code}/${module.code}`,\r\n applicationCode: app.code,\r\n applicationLabel: app.label,\r\n };\r\n toggleFavorite(favoriteModule);\r\n };\r\n\r\n const handleFavoriteClick = (module: FavoriteModule) => {\r\n if (module.route) {\r\n navigate(module.route);\r\n }\r\n };\r\n\r\n // Drag and drop handlers for reordering\r\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n setDraggedIndex(index);\r\n dragNodeRef.current = e.currentTarget;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', index.toString());\r\n // Add a slight delay to allow the drag image to be created before adding opacity\r\n setTimeout(() => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '0.4';\r\n }\r\n }, 0);\r\n };\r\n\r\n const handleDragEnd = () => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '1';\r\n }\r\n setDraggedIndex(null);\r\n setDragOverIndex(null);\r\n dragNodeRef.current = null;\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n if (index !== draggedIndex) {\r\n setDragOverIndex(index);\r\n }\r\n };\r\n\r\n const handleDragLeave = () => {\r\n setDragOverIndex(null);\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent<HTMLDivElement>, dropIndex: number) => {\r\n e.preventDefault();\r\n const dragIndex = draggedIndex;\r\n if (dragIndex === null || dragIndex === dropIndex) return;\r\n\r\n const newFavorites = [...favorites];\r\n const [draggedItem] = newFavorites.splice(dragIndex, 1);\r\n newFavorites.splice(dropIndex, 0, draggedItem);\r\n\r\n reorderFavorites(newFavorites);\r\n handleDragEnd();\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)]\">{t('navigation:sidebar.preferences')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">Personnalisez votre expérience SmartStack</p>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <div className=\"border-b border-[var(--item-color-border)]\">\r\n <nav className=\"flex gap-1\" aria-label=\"Tabs\">\r\n {tabs.map((tab) => {\r\n const Icon = tab.icon;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-all border-b-2 ${\r\n activeTab === tab.id\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)] bg-[var(--accent-bg)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button) var(--radius-button) 0 0' }}\r\n >\r\n <Icon className=\"w-5 h-5\" />\r\n <span>{tab.label}</span>\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--item-color-border)] p-6\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {activeTab === 'appearance' && (\r\n <div className=\"space-y-4\">\r\n <ThemeCustomizer\r\n onSync={handleSync}\r\n isSyncing={isSyncing}\r\n syncSuccess={syncSuccess}\r\n />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'language' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Langue</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Sélectionnez la langue de l'interface\r\n </p>\r\n </div>\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {i18n.language?.startsWith('fr') ? 'Français' : 'English'}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Langue actuelle de l'interface\r\n </p>\r\n </div>\r\n <LanguageSwitcher />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'notifications' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Notifications</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Gérez vos préférences de notifications\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-muted)]\">\r\n {notificationsSaving && (\r\n <>\r\n <Loader2 className=\"w-3 h-3 animate-spin\" />\r\n <span>Sauvegarde...</span>\r\n </>\r\n )}\r\n {notificationsSaved && !notificationsSaving && (\r\n <>\r\n <Check className=\"w-3 h-3 text-green-500\" />\r\n <span className=\"text-green-600\">Sauvegardé</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"space-y-4\">\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Notifications par email</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Recevoir des notifications par email\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={emailNotifications}\r\n onChange={(e) => setEmailNotifications(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Alertes de sécurité</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Être notifié des événements de sécurité\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={securityAlerts}\r\n onChange={(e) => setSecurityAlerts(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Mises à jour produit</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Nouvelles fonctionnalités et améliorations\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={productUpdates}\r\n onChange={(e) => setProductUpdates(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'favorites' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('common:favorites.selectModules', { count: favorites.length, max: maxFavorites })}\r\n </p>\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 <span className=\"ml-2 text-[var(--text-secondary)]\">Chargement des favoris...</span>\r\n </div>\r\n )}\r\n\r\n {!favoritesLoading && (\r\n <>\r\n\r\n {/* Current Favorites */}\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Vos favoris actuels</h3>\r\n {favorites.length > 1 && (\r\n <span className=\"text-xs text-[var(--text-muted)]\">Glissez pour réorganiser</span>\r\n )}\r\n </div>\r\n {favorites.length === 0 ? (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">Aucun favori sélectionné</p>\r\n ) : (\r\n <div className=\"flex flex-col gap-2\">\r\n {favorites.map((module, index) => (\r\n <div\r\n key={module.id}\r\n draggable\r\n onDragStart={(e) => handleDragStart(e, index)}\r\n onDragEnd={handleDragEnd}\r\n onDragOver={(e) => handleDragOver(e, index)}\r\n onDragLeave={handleDragLeave}\r\n onDrop={(e) => handleDrop(e, index)}\r\n className={`flex items-center gap-2 px-3 py-2 bg-[var(--accent-bg)] border text-[var(--color-accent-500)] cursor-grab active:cursor-grabbing transition-all ${\r\n dragOverIndex === index\r\n ? 'border-[var(--color-accent-500)] border-2 scale-[1.02]'\r\n : 'border-[var(--color-accent-500)]/50'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <GripVertical className=\"w-4 h-4 text-[var(--color-accent-400)] flex-shrink-0\" />\r\n <span className=\"text-xs text-[var(--color-accent-500)] font-mono w-4\">{index + 1}</span>\r\n <button\r\n onClick={() => handleFavoriteClick(module)}\r\n className=\"flex items-center gap-2 hover:underline flex-1\"\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4\" />\r\n <span className=\"text-sm font-medium\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({module.applicationLabel})</span>\r\n </button>\r\n <button\r\n onClick={() => toggleFavorite(module)}\r\n className=\"p-1 hover:bg-[var(--bg-tertiary)] rounded flex-shrink-0\"\r\n title=\"Retirer des favoris\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Available Modules */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Modules disponibles</h3>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder=\"Rechercher un module...\"\r\n value={moduleSearch}\r\n onChange={(e) => setModuleSearch(e.target.value)}\r\n className=\"pl-9 pr-3 py-2 w-64 bg-[var(--bg-primary)] border border-[var(--border-color)] text-sm focus:outline-none focus:border-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-input)' }}\r\n />\r\n </div>\r\n </div>\r\n {modulesByApp.map(({ app, modules }) => {\r\n // Filter modules based on search\r\n const filteredModules = moduleSearch\r\n ? modules.filter(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n app.label.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n : modules;\r\n\r\n // Don't render app section if no modules match\r\n if (filteredModules.length === 0) return null;\r\n\r\n return (\r\n <div\r\n key={app.id}\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-2 mb-3\">\r\n <DynamicIcon name={app.icon || 'Folder'} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({filteredModules.length} module{filteredModules.length > 1 ? 's' : ''})</span>\r\n </div>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2\">\r\n {filteredModules.map((module) => {\r\n const isSelected = isFavorite(module.id);\r\n const isDisabled = !isSelected && !canAddMore;\r\n\r\n return (\r\n <button\r\n key={module.id}\r\n onClick={() => handleToggleFavorite(module, app)}\r\n disabled={isDisabled}\r\n className={`flex items-center gap-3 p-3 transition-all ${\r\n getFavoriteButtonClass(isSelected, isDisabled)\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <div className={`w-8 h-8 flex items-center justify-center ${\r\n isSelected\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`} style={{ borderRadius: 'var(--radius-button)' }}>\r\n <DynamicIcon name={module.icon || 'Star'} className=\"w-4 h-4\" />\r\n </div>\r\n <span className={`text-sm ${\r\n isSelected ? 'font-medium text-[var(--color-accent-500)]' : 'text-[var(--text-primary)]'\r\n }`}>\r\n {module.label}\r\n </span>\r\n {isSelected && (\r\n <Check className=\"w-4 h-4 text-[var(--color-accent-500)] ml-auto\" />\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {(modulesByApp.length === 0 || (moduleSearch && modulesByApp.every(({ modules }) =>\r\n !modules.some(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n ))) && (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {moduleSearch ? `Aucun module trouvé pour \"${moduleSearch}\"` : t('common:favorites.noModules')}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["PREFERENCES_TABS","DynamicIcon","name","className","IconComponent","LucideIcons","jsx","Star","getFavoriteButtonClass","isSelected","isDisabled","PreferencesPage","t","i18n","useTranslation","navigate","useNavigate","activeTab","setActiveTab","useTabNavigation","loadFromServer","isSyncing","selectedThemeTenant","useTheme","currentTenant","tenantLoading","useTenant","menu","useNavigation","favorites","toggleFavorite","isFavorite","canAddMore","maxFavorites","reorderFavorites","favoritesLoading","useFavoriteModules","syncSuccess","setSyncSuccess","useState","moduleSearch","setModuleSearch","draggedIndex","setDraggedIndex","dragOverIndex","setDragOverIndex","dragNodeRef","useRef","emailNotifications","setEmailNotifications","securityAlerts","setSecurityAlerts","productUpdates","setProductUpdates","notificationsSaving","setNotificationsSaving","notificationsSaved","setNotificationsSaved","notificationsSaveTimeoutRef","isInitialLoadRef","useEffect","loadPreferences","prefs","userApi","saveNotifications","useCallback","handleSync","scope","error","tabs","Palette","Globe","Bell","modulesByApp","app","handleToggleFavorite","module","favoriteModule","handleFavoriteClick","handleDragStart","e","index","handleDragEnd","handleDragOver","handleDragLeave","handleDrop","dropIndex","dragIndex","newFavorites","draggedItem","jsxs","tab","Icon","ThemeCustomizer","LanguageSwitcher","Fragment","Loader2","Check","GripVertical","X","Search","modules","filteredModules","m"],"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"),c=require("react"),oe=require("react-router-dom"),le=require("./useTabNavigation-BVtbCTd5.js"),de=require("react-i18next"),n=require("lucide-react"),u=require("./index-DK5czlkn.js");function ue(s){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const x in s)if(x!=="default"){const o=Object.getOwnPropertyDescriptor(s,x);Object.defineProperty(l,x,o.get?o:{enumerable:!0,get:()=>s[x]})}}return l.default=s,Object.freeze(l)}const xe=ue(n),me=["appearance","language","notifications","favorites"];function S({name:s,className:l}){const o=xe[s];return o?e.jsx(o,{className:l}):e.jsx(n.Star,{className:l})}function ve(s,l){return s?"bg-[var(--accent-bg)] border-2 border-[var(--color-accent-500)]":l?"opacity-50 cursor-not-allowed bg-[var(--bg-tertiary)] border border-[var(--border-color)]":"bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)]"}function fe(){const{t:s,i18n:l}=de.useTranslation(["navigation","common"]),x=oe.useNavigate(),{activeTab:o,setActiveTab:$}=le.useTabNavigation("appearance",me),{loadFromServer:z,isSyncing:G,selectedThemeTenant:B}=u.useTheme(),{currentTenant:k,isLoading:C}=u.useTenant(),{menu:_}=u.useNavigation(),{favorites:f,toggleFavorite:R,isFavorite:U,canAddMore:V,maxFavorites:W,reorderFavorites:X,loading:T}=u.useFavorites(),[H,j]=c.useState(!1),[d,J]=c.useState(""),[L,D]=c.useState(null),[K,y]=c.useState(null),v=c.useRef(null),[h,F]=c.useState(!0),[p,P]=c.useState(!0),[Q,Y]=c.useState(!1),[A,E]=c.useState(!1),[Z,N]=c.useState(!1),b=c.useRef(null),w=c.useRef(!0);c.useEffect(()=>{!C&&k&&I()},[C,k]);const I=async()=>{try{const t=await u.userApi.preferences.get();F(t.emailNotifications),P(t.pushNotifications),w.current=!1}catch{w.current=!1}},M=c.useCallback(async()=>{E(!0),N(!1);try{await u.userApi.preferences.updateNotifications({emailNotifications:h,pushNotifications:p}),N(!0),setTimeout(()=>N(!1),2e3)}catch{console.error("[PreferencesPage] Failed to save notifications")}finally{E(!1)}},[h,p]);c.useEffect(()=>{if(!w.current)return b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{M()},1e3),()=>{b.current&&clearTimeout(b.current)}},[h,p,M]);const ee=async()=>{const t=B===null?"global":"tenant";j(!1);try{await z(t),await I(),j(!0),setTimeout(()=>j(!1),3e3)}catch(r){console.error("[PreferencesPage] Sync failed:",r)}},te=[{id:"appearance",label:"Apparence",icon:n.Palette,description:"Personnaliser le thème et les couleurs"},{id:"language",label:"Langue",icon:n.Globe,description:"Changer la langue de l'interface"},{id:"notifications",label:"Notifications",icon:n.Bell,description:"Gérer les notifications"},{id:"favorites",label:s("common:favorites.quickAccess"),icon:n.Star,description:"Gérer vos modules favoris"}],g=[];_?.applications.forEach(t=>{(t.modules?.length??0)>0&&g.push({app:t,modules:t.modules})});const re=(t,r)=>{const a={id:t.id,code:t.code,label:t.label,icon:t.icon||"Star",route:`/${r.code}/${t.code}`,applicationCode:r.code,applicationLabel:r.label};R(a)},ae=t=>{t.route&&x(t.route)},se=(t,r)=>{D(r),v.current=t.currentTarget,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",r.toString()),setTimeout(()=>{v.current&&(v.current.style.opacity="0.4")},0)},O=()=>{v.current&&(v.current.style.opacity="1"),D(null),y(null),v.current=null},ce=(t,r)=>{t.preventDefault(),t.dataTransfer.dropEffect="move",r!==L&&y(r)},ne=()=>{y(null)},ie=(t,r)=>{t.preventDefault();const a=L;if(a===null||a===r)return;const i=[...f],[m]=i.splice(a,1);i.splice(r,0,m),X(i),O()};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("navigation:sidebar.preferences")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:"Personnalisez votre expérience SmartStack"})]}),e.jsx("div",{className:"border-b border-[var(--item-color-border)]",children:e.jsx("nav",{className:"flex gap-1","aria-label":"Tabs",children:te.map(t=>{const r=t.icon;return e.jsxs("button",{onClick:()=>$(t.id),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-all border-b-2 ${o===t.id?"border-[var(--color-accent-500)] text-[var(--color-accent-600)] bg-[var(--accent-bg)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]"}`,style:{borderRadius:"var(--radius-button) var(--radius-button) 0 0"},children:[e.jsx(r,{className:"w-5 h-5"}),e.jsx("span",{children:t.label})]},t.id)})})}),e.jsxs("div",{className:"bg-[var(--bg-card)] border border-[var(--item-color-border)] p-6",style:{borderRadius:"var(--radius-card)"},children:[o==="appearance"&&e.jsx("div",{className:"space-y-4",children:e.jsx(u.ThemeCustomizer,{onSync:ee,isSyncing:G,syncSuccess:H})}),o==="language"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold text-[var(--text-primary)]",children:"Langue"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Sélectionnez la langue de l'interface"})]}),e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:l.language?.startsWith("fr")?"Français":"English"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Langue actuelle de l'interface"})]}),e.jsx(u.LanguageSwitcher,{})]})})]}),o==="notifications"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold text-[var(--text-primary)]",children:"Notifications"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Gérez vos préférences de notifications"})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-[var(--text-muted)]",children:[A&&e.jsxs(e.Fragment,{children:[e.jsx(n.Loader2,{className:"w-3 h-3 animate-spin"}),e.jsx("span",{children:"Sauvegarde..."})]}),Z&&!A&&e.jsxs(e.Fragment,{children:[e.jsx(n.Check,{className:"w-3 h-3 text-green-500"}),e.jsx("span",{className:"text-green-600",children:"Sauvegardé"})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Notifications par email"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Recevoir des notifications par email"})]}),e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",className:"sr-only peer",checked:h,onChange:t=>F(t.target.checked)}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full",style:{borderRadius:"var(--radius-button)"},children:e.jsx("span",{className:"after:rounded-full"})})]})]})}),e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Alertes de sécurité"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Être notifié des événements de sécurité"})]}),e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",className:"sr-only peer",checked:p,onChange:t=>P(t.target.checked)}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full",style:{borderRadius:"var(--radius-button)"},children:e.jsx("span",{className:"after:rounded-full"})})]})]})}),e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Mises à jour produit"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Nouvelles fonctionnalités et améliorations"})]}),e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",className:"sr-only peer",checked:Q,onChange:t=>Y(t.target.checked)}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full",style:{borderRadius:"var(--radius-button)"},children:e.jsx("span",{className:"after:rounded-full"})})]})]})})]})]}),o==="favorites"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold text-[var(--text-primary)]",children:s("common:favorites.quickAccess")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:s("common:favorites.selectModules",{count:f.length,max:W})})]}),T&&e.jsxs("div",{className:"flex items-center justify-center py-8",children:[e.jsx(n.Loader2,{className:"w-6 h-6 animate-spin text-[var(--color-accent-500)]"}),e.jsx("span",{className:"ml-2 text-[var(--text-secondary)]",children:"Chargement des favoris..."})]}),!T&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Vos favoris actuels"}),f.length>1&&e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:"Glissez pour réorganiser"})]}),f.length===0?e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:"Aucun favori sélectionné"}):e.jsx("div",{className:"flex flex-col gap-2",children:f.map((t,r)=>e.jsxs("div",{draggable:!0,onDragStart:a=>se(a,r),onDragEnd:O,onDragOver:a=>ce(a,r),onDragLeave:ne,onDrop:a=>ie(a,r),className:`flex items-center gap-2 px-3 py-2 bg-[var(--accent-bg)] border text-[var(--color-accent-500)] cursor-grab active:cursor-grabbing transition-all ${K===r?"border-[var(--color-accent-500)] border-2 scale-[1.02]":"border-[var(--color-accent-500)]/50"}`,style:{borderRadius:"var(--radius-button)"},children:[e.jsx(n.GripVertical,{className:"w-4 h-4 text-[var(--color-accent-400)] flex-shrink-0"}),e.jsx("span",{className:"text-xs text-[var(--color-accent-500)] font-mono w-4",children:r+1}),e.jsxs("button",{onClick:()=>ae(t),className:"flex items-center gap-2 hover:underline flex-1",children:[e.jsx(S,{name:t.icon,className:"w-4 h-4"}),e.jsx("span",{className:"text-sm font-medium",children:t.label}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)]",children:["(",t.applicationLabel,")"]})]}),e.jsx("button",{onClick:()=>R(t),className:"p-1 hover:bg-[var(--bg-tertiary)] rounded flex-shrink-0",title:"Retirer des favoris",children:e.jsx(n.X,{className:"w-3.5 h-3.5"})})]},t.id))})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Modules disponibles"}),e.jsxs("div",{className:"relative",children:[e.jsx(n.Search,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]"}),e.jsx("input",{type:"text",placeholder:"Rechercher un module...",value:d,onChange:t=>J(t.target.value),className:"pl-9 pr-3 py-2 w-64 bg-[var(--bg-primary)] border border-[var(--border-color)] text-sm focus:outline-none focus:border-[var(--color-accent-500)]",style:{borderRadius:"var(--radius-input)"}})]})]}),g.map(({app:t,modules:r})=>{const a=d?r.filter(i=>i.label.toLowerCase().includes(d.toLowerCase())||i.code.toLowerCase().includes(d.toLowerCase())||t.label.toLowerCase().includes(d.toLowerCase())):r;return a.length===0?null:e.jsxs("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx(S,{name:t.icon||"Folder",className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:t.label}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)]",children:["(",a.length," module",a.length>1?"s":"",")"]})]}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2",children:a.map(i=>{const m=U(i.id),q=!m&&!V;return e.jsxs("button",{onClick:()=>re(i,t),disabled:q,className:`flex items-center gap-3 p-3 transition-all ${ve(m,q)}`,style:{borderRadius:"var(--radius-button)"},children:[e.jsx("div",{className:`w-8 h-8 flex items-center justify-center ${m?"bg-[var(--color-accent-600)] text-white":"bg-[var(--bg-tertiary)] text-[var(--text-secondary)]"}`,style:{borderRadius:"var(--radius-button)"},children:e.jsx(S,{name:i.icon||"Star",className:"w-4 h-4"})}),e.jsx("span",{className:`text-sm ${m?"font-medium text-[var(--color-accent-500)]":"text-[var(--text-primary)]"}`,children:i.label}),m&&e.jsx(n.Check,{className:"w-4 h-4 text-[var(--color-accent-500)] ml-auto"})]},i.id)})})]},t.id)}),(g.length===0||d&&g.every(({modules:t})=>!t.some(r=>r.label.toLowerCase().includes(d.toLowerCase())||r.code.toLowerCase().includes(d.toLowerCase()))))&&e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:d?`Aucun module trouvé pour "${d}"`:s("common:favorites.noModules")})]})]})]})]})]})}exports.PreferencesPage=fe;
|
|
2
|
-
//# sourceMappingURL=PreferencesPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),c=require("react"),oe=require("react-router-dom"),le=require("./useTabNavigation-BVtbCTd5.js"),de=require("react-i18next"),n=require("lucide-react"),u=require("./index-DnML-nfd.js");function ue(s){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const x in s)if(x!=="default"){const o=Object.getOwnPropertyDescriptor(s,x);Object.defineProperty(l,x,o.get?o:{enumerable:!0,get:()=>s[x]})}}return l.default=s,Object.freeze(l)}const xe=ue(n),me=["appearance","language","notifications","favorites"];function S({name:s,className:l}){const o=xe[s];return o?e.jsx(o,{className:l}):e.jsx(n.Star,{className:l})}function ve(s,l){return s?"bg-[var(--accent-bg)] border-2 border-[var(--color-accent-500)]":l?"opacity-50 cursor-not-allowed bg-[var(--bg-tertiary)] border border-[var(--border-color)]":"bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)]"}function fe(){const{t:s,i18n:l}=de.useTranslation(["navigation","common"]),x=oe.useNavigate(),{activeTab:o,setActiveTab:$}=le.useTabNavigation("appearance",me),{loadFromServer:z,isSyncing:G,selectedThemeTenant:B}=u.useTheme(),{currentTenant:k,isLoading:C}=u.useTenant(),{menu:_}=u.useNavigation(),{favorites:f,toggleFavorite:R,isFavorite:U,canAddMore:V,maxFavorites:W,reorderFavorites:X,loading:T}=u.useFavorites(),[H,j]=c.useState(!1),[d,J]=c.useState(""),[L,D]=c.useState(null),[K,y]=c.useState(null),v=c.useRef(null),[h,F]=c.useState(!0),[p,P]=c.useState(!0),[Q,Y]=c.useState(!1),[A,E]=c.useState(!1),[Z,N]=c.useState(!1),b=c.useRef(null),w=c.useRef(!0);c.useEffect(()=>{!C&&k&&I()},[C,k]);const I=async()=>{try{const t=await u.userApi.preferences.get();F(t.emailNotifications),P(t.pushNotifications),w.current=!1}catch{w.current=!1}},M=c.useCallback(async()=>{E(!0),N(!1);try{await u.userApi.preferences.updateNotifications({emailNotifications:h,pushNotifications:p}),N(!0),setTimeout(()=>N(!1),2e3)}catch{console.error("[PreferencesPage] Failed to save notifications")}finally{E(!1)}},[h,p]);c.useEffect(()=>{if(!w.current)return b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{M()},1e3),()=>{b.current&&clearTimeout(b.current)}},[h,p,M]);const ee=async()=>{const t=B===null?"global":"tenant";j(!1);try{await z(t),await I(),j(!0),setTimeout(()=>j(!1),3e3)}catch(r){console.error("[PreferencesPage] Sync failed:",r)}},te=[{id:"appearance",label:"Apparence",icon:n.Palette,description:"Personnaliser le thème et les couleurs"},{id:"language",label:"Langue",icon:n.Globe,description:"Changer la langue de l'interface"},{id:"notifications",label:"Notifications",icon:n.Bell,description:"Gérer les notifications"},{id:"favorites",label:s("common:favorites.quickAccess"),icon:n.Star,description:"Gérer vos modules favoris"}],g=[];_?.applications.forEach(t=>{(t.modules?.length??0)>0&&g.push({app:t,modules:t.modules})});const re=(t,r)=>{const a={id:t.id,code:t.code,label:t.label,icon:t.icon||"Star",route:`/${r.code}/${t.code}`,applicationCode:r.code,applicationLabel:r.label};R(a)},ae=t=>{t.route&&x(t.route)},se=(t,r)=>{D(r),v.current=t.currentTarget,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",r.toString()),setTimeout(()=>{v.current&&(v.current.style.opacity="0.4")},0)},O=()=>{v.current&&(v.current.style.opacity="1"),D(null),y(null),v.current=null},ce=(t,r)=>{t.preventDefault(),t.dataTransfer.dropEffect="move",r!==L&&y(r)},ne=()=>{y(null)},ie=(t,r)=>{t.preventDefault();const a=L;if(a===null||a===r)return;const i=[...f],[m]=i.splice(a,1);i.splice(r,0,m),X(i),O()};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("navigation:sidebar.preferences")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:"Personnalisez votre expérience SmartStack"})]}),e.jsx("div",{className:"border-b border-[var(--item-color-border)]",children:e.jsx("nav",{className:"flex gap-1","aria-label":"Tabs",children:te.map(t=>{const r=t.icon;return e.jsxs("button",{onClick:()=>$(t.id),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-all border-b-2 ${o===t.id?"border-[var(--color-accent-500)] text-[var(--color-accent-600)] bg-[var(--accent-bg)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]"}`,style:{borderRadius:"var(--radius-button) var(--radius-button) 0 0"},children:[e.jsx(r,{className:"w-5 h-5"}),e.jsx("span",{children:t.label})]},t.id)})})}),e.jsxs("div",{className:"bg-[var(--bg-card)] border border-[var(--item-color-border)] p-6",style:{borderRadius:"var(--radius-card)"},children:[o==="appearance"&&e.jsx("div",{className:"space-y-4",children:e.jsx(u.ThemeCustomizer,{onSync:ee,isSyncing:G,syncSuccess:H})}),o==="language"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold text-[var(--text-primary)]",children:"Langue"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Sélectionnez la langue de l'interface"})]}),e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:l.language?.startsWith("fr")?"Français":"English"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Langue actuelle de l'interface"})]}),e.jsx(u.LanguageSwitcher,{})]})})]}),o==="notifications"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold text-[var(--text-primary)]",children:"Notifications"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Gérez vos préférences de notifications"})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-[var(--text-muted)]",children:[A&&e.jsxs(e.Fragment,{children:[e.jsx(n.Loader2,{className:"w-3 h-3 animate-spin"}),e.jsx("span",{children:"Sauvegarde..."})]}),Z&&!A&&e.jsxs(e.Fragment,{children:[e.jsx(n.Check,{className:"w-3 h-3 text-green-500"}),e.jsx("span",{className:"text-green-600",children:"Sauvegardé"})]})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Notifications par email"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Recevoir des notifications par email"})]}),e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",className:"sr-only peer",checked:h,onChange:t=>F(t.target.checked)}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full",style:{borderRadius:"var(--radius-button)"},children:e.jsx("span",{className:"after:rounded-full"})})]})]})}),e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Alertes de sécurité"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Être notifié des événements de sécurité"})]}),e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",className:"sr-only peer",checked:p,onChange:t=>P(t.target.checked)}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full",style:{borderRadius:"var(--radius-button)"},children:e.jsx("span",{className:"after:rounded-full"})})]})]})}),e.jsx("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Mises à jour produit"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:"Nouvelles fonctionnalités et améliorations"})]}),e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",className:"sr-only peer",checked:Q,onChange:t=>Y(t.target.checked)}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full",style:{borderRadius:"var(--radius-button)"},children:e.jsx("span",{className:"after:rounded-full"})})]})]})})]})]}),o==="favorites"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold text-[var(--text-primary)]",children:s("common:favorites.quickAccess")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:s("common:favorites.selectModules",{count:f.length,max:W})})]}),T&&e.jsxs("div",{className:"flex items-center justify-center py-8",children:[e.jsx(n.Loader2,{className:"w-6 h-6 animate-spin text-[var(--color-accent-500)]"}),e.jsx("span",{className:"ml-2 text-[var(--text-secondary)]",children:"Chargement des favoris..."})]}),!T&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Vos favoris actuels"}),f.length>1&&e.jsx("span",{className:"text-xs text-[var(--text-muted)]",children:"Glissez pour réorganiser"})]}),f.length===0?e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:"Aucun favori sélectionné"}):e.jsx("div",{className:"flex flex-col gap-2",children:f.map((t,r)=>e.jsxs("div",{draggable:!0,onDragStart:a=>se(a,r),onDragEnd:O,onDragOver:a=>ce(a,r),onDragLeave:ne,onDrop:a=>ie(a,r),className:`flex items-center gap-2 px-3 py-2 bg-[var(--accent-bg)] border text-[var(--color-accent-500)] cursor-grab active:cursor-grabbing transition-all ${K===r?"border-[var(--color-accent-500)] border-2 scale-[1.02]":"border-[var(--color-accent-500)]/50"}`,style:{borderRadius:"var(--radius-button)"},children:[e.jsx(n.GripVertical,{className:"w-4 h-4 text-[var(--color-accent-400)] flex-shrink-0"}),e.jsx("span",{className:"text-xs text-[var(--color-accent-500)] font-mono w-4",children:r+1}),e.jsxs("button",{onClick:()=>ae(t),className:"flex items-center gap-2 hover:underline flex-1",children:[e.jsx(S,{name:t.icon,className:"w-4 h-4"}),e.jsx("span",{className:"text-sm font-medium",children:t.label}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)]",children:["(",t.applicationLabel,")"]})]}),e.jsx("button",{onClick:()=>R(t),className:"p-1 hover:bg-[var(--bg-tertiary)] rounded flex-shrink-0",title:"Retirer des favoris",children:e.jsx(n.X,{className:"w-3.5 h-3.5"})})]},t.id))})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"font-semibold text-[var(--text-primary)]",children:"Modules disponibles"}),e.jsxs("div",{className:"relative",children:[e.jsx(n.Search,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]"}),e.jsx("input",{type:"text",placeholder:"Rechercher un module...",value:d,onChange:t=>J(t.target.value),className:"pl-9 pr-3 py-2 w-64 bg-[var(--bg-primary)] border border-[var(--border-color)] text-sm focus:outline-none focus:border-[var(--color-accent-500)]",style:{borderRadius:"var(--radius-input)"}})]})]}),g.map(({app:t,modules:r})=>{const a=d?r.filter(i=>i.label.toLowerCase().includes(d.toLowerCase())||i.code.toLowerCase().includes(d.toLowerCase())||t.label.toLowerCase().includes(d.toLowerCase())):r;return a.length===0?null:e.jsxs("div",{className:"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx(S,{name:t.icon||"Folder",className:"w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:t.label}),e.jsxs("span",{className:"text-xs text-[var(--text-muted)]",children:["(",a.length," module",a.length>1?"s":"",")"]})]}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2",children:a.map(i=>{const m=U(i.id),q=!m&&!V;return e.jsxs("button",{onClick:()=>re(i,t),disabled:q,className:`flex items-center gap-3 p-3 transition-all ${ve(m,q)}`,style:{borderRadius:"var(--radius-button)"},children:[e.jsx("div",{className:`w-8 h-8 flex items-center justify-center ${m?"bg-[var(--color-accent-600)] text-white":"bg-[var(--bg-tertiary)] text-[var(--text-secondary)]"}`,style:{borderRadius:"var(--radius-button)"},children:e.jsx(S,{name:i.icon||"Star",className:"w-4 h-4"})}),e.jsx("span",{className:`text-sm ${m?"font-medium text-[var(--color-accent-500)]":"text-[var(--text-primary)]"}`,children:i.label}),m&&e.jsx(n.Check,{className:"w-4 h-4 text-[var(--color-accent-500)] ml-auto"})]},i.id)})})]},t.id)}),(g.length===0||d&&g.every(({modules:t})=>!t.some(r=>r.label.toLowerCase().includes(d.toLowerCase())||r.code.toLowerCase().includes(d.toLowerCase()))))&&e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:d?`Aucun module trouvé pour "${d}"`:s("common:favorites.noModules")})]})]})]})]})]})}exports.PreferencesPage=fe;
|
|
2
|
+
//# sourceMappingURL=PreferencesPage-DzpM-lpD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreferencesPage-DD0_XWdT.js","sources":["../../src/pages/personal/myspace/PreferencesPage.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Palette, Globe, Bell, Loader2, Check, Star, X, Search, GripVertical } from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { LanguageSwitcher } from '@/components/ui/LanguageSwitcher';\r\nimport { ThemeCustomizer } from '@/components/ui/ThemeCustomizer';\r\nimport { useTheme } from '@/contexts/ThemeContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation, type ModuleDto, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport { userApi } from '@/services/api/userApi';\r\n\r\nconst PREFERENCES_TABS = ['appearance', 'language', 'notifications', 'favorites'] as const;\r\ntype PreferencesTab = typeof PREFERENCES_TABS[number];\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\nfunction getFavoriteButtonClass(isSelected: boolean, isDisabled: boolean): string {\r\n if (isSelected) return 'bg-[var(--accent-bg)] border-2 border-[var(--color-accent-500)]';\r\n if (isDisabled) return 'opacity-50 cursor-not-allowed bg-[var(--bg-tertiary)] border border-[var(--border-color)]';\r\n return 'bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)]';\r\n}\r\n\r\nexport function PreferencesPage(): ReactElement | null {\r\n const { t, i18n } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { activeTab, setActiveTab } = useTabNavigation<PreferencesTab>('appearance', PREFERENCES_TABS);\r\n const { loadFromServer, isSyncing, selectedThemeTenant } = useTheme();\r\n const { currentTenant, isLoading: tenantLoading } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, toggleFavorite, isFavorite, canAddMore, maxFavorites, reorderFavorites, loading: favoritesLoading } = useFavoriteModules();\r\n const [syncSuccess, setSyncSuccess] = useState(false);\r\n const [moduleSearch, setModuleSearch] = useState('');\r\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\r\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\r\n const dragNodeRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const [emailNotifications, setEmailNotifications] = useState(true);\r\n const [securityAlerts, setSecurityAlerts] = useState(true);\r\n const [productUpdates, setProductUpdates] = useState(false);\r\n const [notificationsSaving, setNotificationsSaving] = useState(false);\r\n const [notificationsSaved, setNotificationsSaved] = useState(false);\r\n const notificationsSaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isInitialLoadRef = useRef(true);\r\n\r\n // Wait for tenant context to be loaded before fetching preferences\r\n useEffect(() => {\r\n if (!tenantLoading && currentTenant) {\r\n loadPreferences();\r\n }\r\n }, [tenantLoading, currentTenant]);\r\n\r\n const loadPreferences = async () => {\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n setEmailNotifications(prefs.emailNotifications);\r\n setSecurityAlerts(prefs.pushNotifications);\r\n isInitialLoadRef.current = false;\r\n } catch {\r\n isInitialLoadRef.current = false;\r\n }\r\n };\r\n\r\n const saveNotifications = useCallback(async () => {\r\n setNotificationsSaving(true);\r\n setNotificationsSaved(false);\r\n try {\r\n await userApi.preferences.updateNotifications({\r\n emailNotifications,\r\n pushNotifications: securityAlerts,\r\n });\r\n setNotificationsSaved(true);\r\n setTimeout(() => setNotificationsSaved(false), 2000);\r\n } catch {\r\n console.error('[PreferencesPage] Failed to save notifications');\r\n } finally {\r\n setNotificationsSaving(false);\r\n }\r\n }, [emailNotifications, securityAlerts]);\r\n\r\n useEffect(() => {\r\n if (isInitialLoadRef.current) return;\r\n\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n\r\n notificationsSaveTimeoutRef.current = setTimeout(() => {\r\n saveNotifications();\r\n }, 1000);\r\n\r\n return () => {\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n };\r\n }, [emailNotifications, securityAlerts, saveNotifications]);\r\n\r\n const handleSync = async () => {\r\n // Determine which scope to sync based on selectedThemeTenant\r\n // null = global scope, string = tenant scope\r\n const scope = selectedThemeTenant === null ? 'global' : 'tenant';\r\n setSyncSuccess(false);\r\n try {\r\n await loadFromServer(scope);\r\n await loadPreferences();\r\n setSyncSuccess(true);\r\n setTimeout(() => setSyncSuccess(false), 3000);\r\n } catch (error) {\r\n console.error('[PreferencesPage] Sync failed:', error);\r\n }\r\n };\r\n\r\n const tabs = [\r\n { id: 'appearance' as const, label: 'Apparence', icon: Palette, description: 'Personnaliser le thème et les couleurs' },\r\n { id: 'language' as const, label: 'Langue', icon: Globe, description: 'Changer la langue de l\\'interface' },\r\n { id: 'notifications' as const, label: 'Notifications', icon: Bell, description: 'Gérer les notifications' },\r\n { id: 'favorites' as const, label: t('common:favorites.quickAccess'), icon: Star, description: 'Gérer vos modules favoris' },\r\n ];\r\n\r\n // Gather all modules grouped by application for favorites\r\n const modulesByApp: { app: ApplicationDto; modules: ModuleDto[] }[] = [];\r\n menu?.applications.forEach(app => {\r\n if ((app.modules?.length ?? 0) > 0) {\r\n modulesByApp.push({\r\n app,\r\n modules: app.modules,\r\n });\r\n }\r\n });\r\n\r\n const handleToggleFavorite = (module: ModuleDto, app: ApplicationDto) => {\r\n const favoriteModule: FavoriteModule = {\r\n id: module.id,\r\n code: module.code,\r\n label: module.label,\r\n icon: module.icon || 'Star',\r\n route: `/${app.code}/${module.code}`,\r\n applicationCode: app.code,\r\n applicationLabel: app.label,\r\n };\r\n toggleFavorite(favoriteModule);\r\n };\r\n\r\n const handleFavoriteClick = (module: FavoriteModule) => {\r\n if (module.route) {\r\n navigate(module.route);\r\n }\r\n };\r\n\r\n // Drag and drop handlers for reordering\r\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n setDraggedIndex(index);\r\n dragNodeRef.current = e.currentTarget;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', index.toString());\r\n // Add a slight delay to allow the drag image to be created before adding opacity\r\n setTimeout(() => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '0.4';\r\n }\r\n }, 0);\r\n };\r\n\r\n const handleDragEnd = () => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '1';\r\n }\r\n setDraggedIndex(null);\r\n setDragOverIndex(null);\r\n dragNodeRef.current = null;\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n if (index !== draggedIndex) {\r\n setDragOverIndex(index);\r\n }\r\n };\r\n\r\n const handleDragLeave = () => {\r\n setDragOverIndex(null);\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent<HTMLDivElement>, dropIndex: number) => {\r\n e.preventDefault();\r\n const dragIndex = draggedIndex;\r\n if (dragIndex === null || dragIndex === dropIndex) return;\r\n\r\n const newFavorites = [...favorites];\r\n const [draggedItem] = newFavorites.splice(dragIndex, 1);\r\n newFavorites.splice(dropIndex, 0, draggedItem);\r\n\r\n reorderFavorites(newFavorites);\r\n handleDragEnd();\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)]\">{t('navigation:sidebar.preferences')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">Personnalisez votre expérience SmartStack</p>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <div className=\"border-b border-[var(--item-color-border)]\">\r\n <nav className=\"flex gap-1\" aria-label=\"Tabs\">\r\n {tabs.map((tab) => {\r\n const Icon = tab.icon;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-all border-b-2 ${\r\n activeTab === tab.id\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)] bg-[var(--accent-bg)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button) var(--radius-button) 0 0' }}\r\n >\r\n <Icon className=\"w-5 h-5\" />\r\n <span>{tab.label}</span>\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--item-color-border)] p-6\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {activeTab === 'appearance' && (\r\n <div className=\"space-y-4\">\r\n <ThemeCustomizer\r\n onSync={handleSync}\r\n isSyncing={isSyncing}\r\n syncSuccess={syncSuccess}\r\n />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'language' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Langue</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Sélectionnez la langue de l'interface\r\n </p>\r\n </div>\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {i18n.language?.startsWith('fr') ? 'Français' : 'English'}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Langue actuelle de l'interface\r\n </p>\r\n </div>\r\n <LanguageSwitcher />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'notifications' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Notifications</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Gérez vos préférences de notifications\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-muted)]\">\r\n {notificationsSaving && (\r\n <>\r\n <Loader2 className=\"w-3 h-3 animate-spin\" />\r\n <span>Sauvegarde...</span>\r\n </>\r\n )}\r\n {notificationsSaved && !notificationsSaving && (\r\n <>\r\n <Check className=\"w-3 h-3 text-green-500\" />\r\n <span className=\"text-green-600\">Sauvegardé</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"space-y-4\">\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Notifications par email</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Recevoir des notifications par email\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={emailNotifications}\r\n onChange={(e) => setEmailNotifications(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Alertes de sécurité</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Être notifié des événements de sécurité\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={securityAlerts}\r\n onChange={(e) => setSecurityAlerts(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Mises à jour produit</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Nouvelles fonctionnalités et améliorations\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={productUpdates}\r\n onChange={(e) => setProductUpdates(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'favorites' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('common:favorites.selectModules', { count: favorites.length, max: maxFavorites })}\r\n </p>\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 <span className=\"ml-2 text-[var(--text-secondary)]\">Chargement des favoris...</span>\r\n </div>\r\n )}\r\n\r\n {!favoritesLoading && (\r\n <>\r\n\r\n {/* Current Favorites */}\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Vos favoris actuels</h3>\r\n {favorites.length > 1 && (\r\n <span className=\"text-xs text-[var(--text-muted)]\">Glissez pour réorganiser</span>\r\n )}\r\n </div>\r\n {favorites.length === 0 ? (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">Aucun favori sélectionné</p>\r\n ) : (\r\n <div className=\"flex flex-col gap-2\">\r\n {favorites.map((module, index) => (\r\n <div\r\n key={module.id}\r\n draggable\r\n onDragStart={(e) => handleDragStart(e, index)}\r\n onDragEnd={handleDragEnd}\r\n onDragOver={(e) => handleDragOver(e, index)}\r\n onDragLeave={handleDragLeave}\r\n onDrop={(e) => handleDrop(e, index)}\r\n className={`flex items-center gap-2 px-3 py-2 bg-[var(--accent-bg)] border text-[var(--color-accent-500)] cursor-grab active:cursor-grabbing transition-all ${\r\n dragOverIndex === index\r\n ? 'border-[var(--color-accent-500)] border-2 scale-[1.02]'\r\n : 'border-[var(--color-accent-500)]/50'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <GripVertical className=\"w-4 h-4 text-[var(--color-accent-400)] flex-shrink-0\" />\r\n <span className=\"text-xs text-[var(--color-accent-500)] font-mono w-4\">{index + 1}</span>\r\n <button\r\n onClick={() => handleFavoriteClick(module)}\r\n className=\"flex items-center gap-2 hover:underline flex-1\"\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4\" />\r\n <span className=\"text-sm font-medium\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({module.applicationLabel})</span>\r\n </button>\r\n <button\r\n onClick={() => toggleFavorite(module)}\r\n className=\"p-1 hover:bg-[var(--bg-tertiary)] rounded flex-shrink-0\"\r\n title=\"Retirer des favoris\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Available Modules */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Modules disponibles</h3>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder=\"Rechercher un module...\"\r\n value={moduleSearch}\r\n onChange={(e) => setModuleSearch(e.target.value)}\r\n className=\"pl-9 pr-3 py-2 w-64 bg-[var(--bg-primary)] border border-[var(--border-color)] text-sm focus:outline-none focus:border-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-input)' }}\r\n />\r\n </div>\r\n </div>\r\n {modulesByApp.map(({ app, modules }) => {\r\n // Filter modules based on search\r\n const filteredModules = moduleSearch\r\n ? modules.filter(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n app.label.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n : modules;\r\n\r\n // Don't render app section if no modules match\r\n if (filteredModules.length === 0) return null;\r\n\r\n return (\r\n <div\r\n key={app.id}\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-2 mb-3\">\r\n <DynamicIcon name={app.icon || 'Folder'} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({filteredModules.length} module{filteredModules.length > 1 ? 's' : ''})</span>\r\n </div>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2\">\r\n {filteredModules.map((module) => {\r\n const isSelected = isFavorite(module.id);\r\n const isDisabled = !isSelected && !canAddMore;\r\n\r\n return (\r\n <button\r\n key={module.id}\r\n onClick={() => handleToggleFavorite(module, app)}\r\n disabled={isDisabled}\r\n className={`flex items-center gap-3 p-3 transition-all ${\r\n getFavoriteButtonClass(isSelected, isDisabled)\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <div className={`w-8 h-8 flex items-center justify-center ${\r\n isSelected\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`} style={{ borderRadius: 'var(--radius-button)' }}>\r\n <DynamicIcon name={module.icon || 'Star'} className=\"w-4 h-4\" />\r\n </div>\r\n <span className={`text-sm ${\r\n isSelected ? 'font-medium text-[var(--color-accent-500)]' : 'text-[var(--text-primary)]'\r\n }`}>\r\n {module.label}\r\n </span>\r\n {isSelected && (\r\n <Check className=\"w-4 h-4 text-[var(--color-accent-500)] ml-auto\" />\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {(modulesByApp.length === 0 || (moduleSearch && modulesByApp.every(({ modules }) =>\r\n !modules.some(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n ))) && (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {moduleSearch ? `Aucun module trouvé pour \"${moduleSearch}\"` : t('common:favorites.noModules')}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["PREFERENCES_TABS","DynamicIcon","name","className","IconComponent","LucideIcons","jsx","Star","getFavoriteButtonClass","isSelected","isDisabled","PreferencesPage","t","i18n","useTranslation","navigate","useNavigate","activeTab","setActiveTab","useTabNavigation","loadFromServer","isSyncing","selectedThemeTenant","useTheme","currentTenant","tenantLoading","useTenant","menu","useNavigation","favorites","toggleFavorite","isFavorite","canAddMore","maxFavorites","reorderFavorites","favoritesLoading","useFavoriteModules","syncSuccess","setSyncSuccess","useState","moduleSearch","setModuleSearch","draggedIndex","setDraggedIndex","dragOverIndex","setDragOverIndex","dragNodeRef","useRef","emailNotifications","setEmailNotifications","securityAlerts","setSecurityAlerts","productUpdates","setProductUpdates","notificationsSaving","setNotificationsSaving","notificationsSaved","setNotificationsSaved","notificationsSaveTimeoutRef","isInitialLoadRef","useEffect","loadPreferences","prefs","userApi","saveNotifications","useCallback","handleSync","scope","error","tabs","Palette","Globe","Bell","modulesByApp","app","handleToggleFavorite","module","favoriteModule","handleFavoriteClick","handleDragStart","e","index","handleDragEnd","handleDragOver","handleDragLeave","handleDrop","dropIndex","dragIndex","newFavorites","draggedItem","jsxs","tab","Icon","ThemeCustomizer","LanguageSwitcher","Fragment","Loader2","Check","GripVertical","X","Search","modules","filteredModules","m"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreferencesPage-DzpM-lpD.js","sources":["../../src/pages/personal/myspace/PreferencesPage.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Palette, Globe, Bell, Loader2, Check, Star, X, Search, GripVertical } from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { LanguageSwitcher } from '@/components/ui/LanguageSwitcher';\r\nimport { ThemeCustomizer } from '@/components/ui/ThemeCustomizer';\r\nimport { useTheme } from '@/contexts/ThemeContext';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation, type ModuleDto, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useFavoriteModules, type FavoriteModule } from '@/hooks/useFavoriteModules';\r\nimport { userApi } from '@/services/api/userApi';\r\n\r\nconst PREFERENCES_TABS = ['appearance', 'language', 'notifications', 'favorites'] as const;\r\ntype PreferencesTab = typeof PREFERENCES_TABS[number];\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\nfunction getFavoriteButtonClass(isSelected: boolean, isDisabled: boolean): string {\r\n if (isSelected) return 'bg-[var(--accent-bg)] border-2 border-[var(--color-accent-500)]';\r\n if (isDisabled) return 'opacity-50 cursor-not-allowed bg-[var(--bg-tertiary)] border border-[var(--border-color)]';\r\n return 'bg-[var(--bg-primary)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)]';\r\n}\r\n\r\nexport function PreferencesPage(): ReactElement | null {\r\n const { t, i18n } = useTranslation(['navigation', 'common']);\r\n const navigate = useNavigate();\r\n const { activeTab, setActiveTab } = useTabNavigation<PreferencesTab>('appearance', PREFERENCES_TABS);\r\n const { loadFromServer, isSyncing, selectedThemeTenant } = useTheme();\r\n const { currentTenant, isLoading: tenantLoading } = useTenant();\r\n const { menu } = useNavigation();\r\n const { favorites, toggleFavorite, isFavorite, canAddMore, maxFavorites, reorderFavorites, loading: favoritesLoading } = useFavoriteModules();\r\n const [syncSuccess, setSyncSuccess] = useState(false);\r\n const [moduleSearch, setModuleSearch] = useState('');\r\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\r\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\r\n const dragNodeRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const [emailNotifications, setEmailNotifications] = useState(true);\r\n const [securityAlerts, setSecurityAlerts] = useState(true);\r\n const [productUpdates, setProductUpdates] = useState(false);\r\n const [notificationsSaving, setNotificationsSaving] = useState(false);\r\n const [notificationsSaved, setNotificationsSaved] = useState(false);\r\n const notificationsSaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isInitialLoadRef = useRef(true);\r\n\r\n // Wait for tenant context to be loaded before fetching preferences\r\n useEffect(() => {\r\n if (!tenantLoading && currentTenant) {\r\n loadPreferences();\r\n }\r\n }, [tenantLoading, currentTenant]);\r\n\r\n const loadPreferences = async () => {\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n setEmailNotifications(prefs.emailNotifications);\r\n setSecurityAlerts(prefs.pushNotifications);\r\n isInitialLoadRef.current = false;\r\n } catch {\r\n isInitialLoadRef.current = false;\r\n }\r\n };\r\n\r\n const saveNotifications = useCallback(async () => {\r\n setNotificationsSaving(true);\r\n setNotificationsSaved(false);\r\n try {\r\n await userApi.preferences.updateNotifications({\r\n emailNotifications,\r\n pushNotifications: securityAlerts,\r\n });\r\n setNotificationsSaved(true);\r\n setTimeout(() => setNotificationsSaved(false), 2000);\r\n } catch {\r\n console.error('[PreferencesPage] Failed to save notifications');\r\n } finally {\r\n setNotificationsSaving(false);\r\n }\r\n }, [emailNotifications, securityAlerts]);\r\n\r\n useEffect(() => {\r\n if (isInitialLoadRef.current) return;\r\n\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n\r\n notificationsSaveTimeoutRef.current = setTimeout(() => {\r\n saveNotifications();\r\n }, 1000);\r\n\r\n return () => {\r\n if (notificationsSaveTimeoutRef.current) {\r\n clearTimeout(notificationsSaveTimeoutRef.current);\r\n }\r\n };\r\n }, [emailNotifications, securityAlerts, saveNotifications]);\r\n\r\n const handleSync = async () => {\r\n // Determine which scope to sync based on selectedThemeTenant\r\n // null = global scope, string = tenant scope\r\n const scope = selectedThemeTenant === null ? 'global' : 'tenant';\r\n setSyncSuccess(false);\r\n try {\r\n await loadFromServer(scope);\r\n await loadPreferences();\r\n setSyncSuccess(true);\r\n setTimeout(() => setSyncSuccess(false), 3000);\r\n } catch (error) {\r\n console.error('[PreferencesPage] Sync failed:', error);\r\n }\r\n };\r\n\r\n const tabs = [\r\n { id: 'appearance' as const, label: 'Apparence', icon: Palette, description: 'Personnaliser le thème et les couleurs' },\r\n { id: 'language' as const, label: 'Langue', icon: Globe, description: 'Changer la langue de l\\'interface' },\r\n { id: 'notifications' as const, label: 'Notifications', icon: Bell, description: 'Gérer les notifications' },\r\n { id: 'favorites' as const, label: t('common:favorites.quickAccess'), icon: Star, description: 'Gérer vos modules favoris' },\r\n ];\r\n\r\n // Gather all modules grouped by application for favorites\r\n const modulesByApp: { app: ApplicationDto; modules: ModuleDto[] }[] = [];\r\n menu?.applications.forEach(app => {\r\n if ((app.modules?.length ?? 0) > 0) {\r\n modulesByApp.push({\r\n app,\r\n modules: app.modules,\r\n });\r\n }\r\n });\r\n\r\n const handleToggleFavorite = (module: ModuleDto, app: ApplicationDto) => {\r\n const favoriteModule: FavoriteModule = {\r\n id: module.id,\r\n code: module.code,\r\n label: module.label,\r\n icon: module.icon || 'Star',\r\n route: `/${app.code}/${module.code}`,\r\n applicationCode: app.code,\r\n applicationLabel: app.label,\r\n };\r\n toggleFavorite(favoriteModule);\r\n };\r\n\r\n const handleFavoriteClick = (module: FavoriteModule) => {\r\n if (module.route) {\r\n navigate(module.route);\r\n }\r\n };\r\n\r\n // Drag and drop handlers for reordering\r\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n setDraggedIndex(index);\r\n dragNodeRef.current = e.currentTarget;\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', index.toString());\r\n // Add a slight delay to allow the drag image to be created before adding opacity\r\n setTimeout(() => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '0.4';\r\n }\r\n }, 0);\r\n };\r\n\r\n const handleDragEnd = () => {\r\n if (dragNodeRef.current) {\r\n dragNodeRef.current.style.opacity = '1';\r\n }\r\n setDraggedIndex(null);\r\n setDragOverIndex(null);\r\n dragNodeRef.current = null;\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>, index: number) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n if (index !== draggedIndex) {\r\n setDragOverIndex(index);\r\n }\r\n };\r\n\r\n const handleDragLeave = () => {\r\n setDragOverIndex(null);\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent<HTMLDivElement>, dropIndex: number) => {\r\n e.preventDefault();\r\n const dragIndex = draggedIndex;\r\n if (dragIndex === null || dragIndex === dropIndex) return;\r\n\r\n const newFavorites = [...favorites];\r\n const [draggedItem] = newFavorites.splice(dragIndex, 1);\r\n newFavorites.splice(dropIndex, 0, draggedItem);\r\n\r\n reorderFavorites(newFavorites);\r\n handleDragEnd();\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)]\">{t('navigation:sidebar.preferences')}</h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">Personnalisez votre expérience SmartStack</p>\r\n </div>\r\n\r\n {/* Tab Navigation */}\r\n <div className=\"border-b border-[var(--item-color-border)]\">\r\n <nav className=\"flex gap-1\" aria-label=\"Tabs\">\r\n {tabs.map((tab) => {\r\n const Icon = tab.icon;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-all border-b-2 ${\r\n activeTab === tab.id\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)] bg-[var(--accent-bg)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button) var(--radius-button) 0 0' }}\r\n >\r\n <Icon className=\"w-5 h-5\" />\r\n <span>{tab.label}</span>\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div\r\n className=\"bg-[var(--bg-card)] border border-[var(--item-color-border)] p-6\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n {activeTab === 'appearance' && (\r\n <div className=\"space-y-4\">\r\n <ThemeCustomizer\r\n onSync={handleSync}\r\n isSyncing={isSyncing}\r\n syncSuccess={syncSuccess}\r\n />\r\n </div>\r\n )}\r\n\r\n {activeTab === 'language' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Langue</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Sélectionnez la langue de l'interface\r\n </p>\r\n </div>\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {i18n.language?.startsWith('fr') ? 'Français' : 'English'}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Langue actuelle de l'interface\r\n </p>\r\n </div>\r\n <LanguageSwitcher />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'notifications' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">Notifications</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Gérez vos préférences de notifications\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-muted)]\">\r\n {notificationsSaving && (\r\n <>\r\n <Loader2 className=\"w-3 h-3 animate-spin\" />\r\n <span>Sauvegarde...</span>\r\n </>\r\n )}\r\n {notificationsSaved && !notificationsSaving && (\r\n <>\r\n <Check className=\"w-3 h-3 text-green-500\" />\r\n <span className=\"text-green-600\">Sauvegardé</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"space-y-4\">\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Notifications par email</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Recevoir des notifications par email\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={emailNotifications}\r\n onChange={(e) => setEmailNotifications(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Alertes de sécurité</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Être notifié des événements de sécurité\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={securityAlerts}\r\n onChange={(e) => setSecurityAlerts(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Mises à jour produit</h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n Nouvelles fonctionnalités et améliorations\r\n </p>\r\n </div>\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"sr-only peer\"\r\n checked={productUpdates}\r\n onChange={(e) => setProductUpdates(e.target.checked)}\r\n />\r\n <div\r\n className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer peer-checked:bg-[var(--color-accent-500)] after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:h-5 after:w-5 after:transition-all peer-checked:after:translate-x-full\"\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <span className=\"after:rounded-full\" />\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeTab === 'favorites' && (\r\n <div className=\"space-y-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">{t('common:favorites.quickAccess')}</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('common:favorites.selectModules', { count: favorites.length, max: maxFavorites })}\r\n </p>\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 <span className=\"ml-2 text-[var(--text-secondary)]\">Chargement des favoris...</span>\r\n </div>\r\n )}\r\n\r\n {!favoritesLoading && (\r\n <>\r\n\r\n {/* Current Favorites */}\r\n <div\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Vos favoris actuels</h3>\r\n {favorites.length > 1 && (\r\n <span className=\"text-xs text-[var(--text-muted)]\">Glissez pour réorganiser</span>\r\n )}\r\n </div>\r\n {favorites.length === 0 ? (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">Aucun favori sélectionné</p>\r\n ) : (\r\n <div className=\"flex flex-col gap-2\">\r\n {favorites.map((module, index) => (\r\n <div\r\n key={module.id}\r\n draggable\r\n onDragStart={(e) => handleDragStart(e, index)}\r\n onDragEnd={handleDragEnd}\r\n onDragOver={(e) => handleDragOver(e, index)}\r\n onDragLeave={handleDragLeave}\r\n onDrop={(e) => handleDrop(e, index)}\r\n className={`flex items-center gap-2 px-3 py-2 bg-[var(--accent-bg)] border text-[var(--color-accent-500)] cursor-grab active:cursor-grabbing transition-all ${\r\n dragOverIndex === index\r\n ? 'border-[var(--color-accent-500)] border-2 scale-[1.02]'\r\n : 'border-[var(--color-accent-500)]/50'\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <GripVertical className=\"w-4 h-4 text-[var(--color-accent-400)] flex-shrink-0\" />\r\n <span className=\"text-xs text-[var(--color-accent-500)] font-mono w-4\">{index + 1}</span>\r\n <button\r\n onClick={() => handleFavoriteClick(module)}\r\n className=\"flex items-center gap-2 hover:underline flex-1\"\r\n >\r\n <DynamicIcon name={module.icon} className=\"w-4 h-4\" />\r\n <span className=\"text-sm font-medium\">{module.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({module.applicationLabel})</span>\r\n </button>\r\n <button\r\n onClick={() => toggleFavorite(module)}\r\n className=\"p-1 hover:bg-[var(--bg-tertiary)] rounded flex-shrink-0\"\r\n title=\"Retirer des favoris\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Available Modules */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">Modules disponibles</h3>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-muted)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder=\"Rechercher un module...\"\r\n value={moduleSearch}\r\n onChange={(e) => setModuleSearch(e.target.value)}\r\n className=\"pl-9 pr-3 py-2 w-64 bg-[var(--bg-primary)] border border-[var(--border-color)] text-sm focus:outline-none focus:border-[var(--color-accent-500)]\"\r\n style={{ borderRadius: 'var(--radius-input)' }}\r\n />\r\n </div>\r\n </div>\r\n {modulesByApp.map(({ app, modules }) => {\r\n // Filter modules based on search\r\n const filteredModules = moduleSearch\r\n ? modules.filter(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n app.label.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n : modules;\r\n\r\n // Don't render app section if no modules match\r\n if (filteredModules.length === 0) return null;\r\n\r\n return (\r\n <div\r\n key={app.id}\r\n className=\"p-4 bg-[var(--bg-secondary)] border border-[var(--item-color-border)]\"\r\n style={{ borderRadius: 'var(--radius-card)' }}\r\n >\r\n <div className=\"flex items-center gap-2 mb-3\">\r\n <DynamicIcon name={app.icon || 'Folder'} className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"font-medium text-[var(--text-primary)]\">{app.label}</span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">({filteredModules.length} module{filteredModules.length > 1 ? 's' : ''})</span>\r\n </div>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2\">\r\n {filteredModules.map((module) => {\r\n const isSelected = isFavorite(module.id);\r\n const isDisabled = !isSelected && !canAddMore;\r\n\r\n return (\r\n <button\r\n key={module.id}\r\n onClick={() => handleToggleFavorite(module, app)}\r\n disabled={isDisabled}\r\n className={`flex items-center gap-3 p-3 transition-all ${\r\n getFavoriteButtonClass(isSelected, isDisabled)\r\n }`}\r\n style={{ borderRadius: 'var(--radius-button)' }}\r\n >\r\n <div className={`w-8 h-8 flex items-center justify-center ${\r\n isSelected\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`} style={{ borderRadius: 'var(--radius-button)' }}>\r\n <DynamicIcon name={module.icon || 'Star'} className=\"w-4 h-4\" />\r\n </div>\r\n <span className={`text-sm ${\r\n isSelected ? 'font-medium text-[var(--color-accent-500)]' : 'text-[var(--text-primary)]'\r\n }`}>\r\n {module.label}\r\n </span>\r\n {isSelected && (\r\n <Check className=\"w-4 h-4 text-[var(--color-accent-500)] ml-auto\" />\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n {(modulesByApp.length === 0 || (moduleSearch && modulesByApp.every(({ modules }) =>\r\n !modules.some(m =>\r\n m.label.toLowerCase().includes(moduleSearch.toLowerCase()) ||\r\n m.code.toLowerCase().includes(moduleSearch.toLowerCase())\r\n )\r\n ))) && (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {moduleSearch ? `Aucun module trouvé pour \"${moduleSearch}\"` : t('common:favorites.noModules')}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["PREFERENCES_TABS","DynamicIcon","name","className","IconComponent","LucideIcons","jsx","Star","getFavoriteButtonClass","isSelected","isDisabled","PreferencesPage","t","i18n","useTranslation","navigate","useNavigate","activeTab","setActiveTab","useTabNavigation","loadFromServer","isSyncing","selectedThemeTenant","useTheme","currentTenant","tenantLoading","useTenant","menu","useNavigation","favorites","toggleFavorite","isFavorite","canAddMore","maxFavorites","reorderFavorites","favoritesLoading","useFavoriteModules","syncSuccess","setSyncSuccess","useState","moduleSearch","setModuleSearch","draggedIndex","setDraggedIndex","dragOverIndex","setDragOverIndex","dragNodeRef","useRef","emailNotifications","setEmailNotifications","securityAlerts","setSecurityAlerts","productUpdates","setProductUpdates","notificationsSaving","setNotificationsSaving","notificationsSaved","setNotificationsSaved","notificationsSaveTimeoutRef","isInitialLoadRef","useEffect","loadPreferences","prefs","userApi","saveNotifications","useCallback","handleSync","scope","error","tabs","Palette","Globe","Bell","modulesByApp","app","handleToggleFavorite","module","favoriteModule","handleFavoriteClick","handleDragStart","e","index","handleDragEnd","handleDragOver","handleDragLeave","handleDrop","dropIndex","dragIndex","newFavorites","draggedItem","jsxs","tab","Icon","ThemeCustomizer","LanguageSwitcher","Fragment","Loader2","Check","GripVertical","X","Search","modules","filteredModules","m"],"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"),c=require("react"),m=require("react-i18next"),i=require("lucide-react"),x=require("./index-
|
|
2
|
-
//# sourceMappingURL=ProfilePage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),c=require("react"),m=require("react-i18next"),i=require("lucide-react"),x=require("./index-DnML-nfd.js");function v(){const{t}=m.useTranslation(["navigation","common"]),{user:r}=x.useAuth(),[a,n]=c.useState(null);c.useEffect(()=>{if(a){const s=setTimeout(()=>n(null),4e3);return()=>clearTimeout(s)}},[a]);const o=()=>{n(t("common:underDevelopment.description"))},l=r?.firstName&&r?.lastName?`${r.firstName} ${r.lastName}`:r?.email||t("common:name"),d=r?.firstName&&r?.lastName?`${r.firstName.at(0)}${r.lastName.at(0)}`.toUpperCase():r?.email?.at(0)?.toUpperCase()||"U";return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:t("navigation:sidebar.profile")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:t("navigation:profile.subtitle")})]}),a&&e.jsxs("div",{className:"flex items-center gap-3 p-4 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 text-amber-800 dark:text-amber-200",style:{borderRadius:"var(--radius-card)"},children:[e.jsx(i.Construction,{className:"w-5 h-5 flex-shrink-0"}),e.jsx("span",{className:"flex-1 text-sm",children:a}),e.jsx("button",{onClick:()=>n(null),className:"p-1 hover:bg-amber-100 dark:hover:bg-amber-800/30 rounded transition-colors",children:e.jsx(i.X,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] p-6",style:{borderRadius:"var(--radius-card)"},children:[e.jsxs("div",{className:"flex items-center gap-6 mb-6",children:[e.jsx("div",{className:"w-20 h-20 bg-gradient-to-br from-[var(--color-accent-500)] to-[var(--color-accent-600)] flex items-center justify-center text-white text-2xl font-bold",style:{borderRadius:"var(--radius-card)"},children:d}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-semibold text-[var(--text-primary)]",children:l}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:r?.email}),r?.roles&&r.roles.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:r.roles.map(s=>e.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-[var(--accent-bg)] text-[var(--color-accent-600)]",style:{borderRadius:"var(--radius-badge)"},children:s},s))})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3 text-[var(--text-secondary)]",children:[e.jsx(i.Mail,{className:"w-5 h-5"}),e.jsx("span",{children:r?.email||t("navigation:profile.notProvided")})]}),e.jsxs("div",{className:"flex items-center gap-3 text-[var(--text-secondary)]",children:[e.jsx(i.Calendar,{className:"w-5 h-5"}),e.jsx("span",{children:t("navigation:profile.memberSince",{date:"janvier 2024"})})]})]}),e.jsx("div",{className:"mt-6 pt-6 border-t border-[var(--border-color)]",children:e.jsx("button",{onClick:o,className:"px-4 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white font-medium transition-colors",style:{borderRadius:"var(--radius-button)"},children:t("common:buttons.edit")})})]}),e.jsxs("div",{className:"bg-[var(--bg-card)] border border-[var(--border-color)] p-6",style:{borderRadius:"var(--radius-card)"},children:[e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4",children:t("navigation:profile.security.title")}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)]",children:t("navigation:profile.security.password")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t("navigation:profile.security.lastChanged",{days:30})})]}),e.jsx("button",{onClick:o,className:"px-3 py-1.5 text-sm bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors",style:{borderRadius:"var(--radius-button)"},children:t("common:buttons.edit")})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-[var(--text-primary)]",children:t("navigation:profile.security.twoFactor")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t("navigation:profile.security.notEnabled")})]}),e.jsx("button",{onClick:o,className:"px-3 py-1.5 text-sm bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] transition-colors",style:{borderRadius:"var(--radius-button)"},children:t("navigation:profile.security.enable")})]})]})]})]})}exports.ProfilePage=v;
|
|
2
|
+
//# sourceMappingURL=ProfilePage-D98bvXeT.js.map
|