@atlashub/smartstack 3.21.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EscalationConfigPage-CYGIl_e6.js","sources":["../../src/pages/platform/support/EscalationConfigPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n TrendingUp,\r\n Loader2,\r\n AlertTriangle,\r\n Bell,\r\n Clock,\r\n Users,\r\n Edit,\r\n Check,\r\n X,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { slaApi, type EscalationRuleDto } from '@/services/api/supportApi';\r\nimport { api } from '@/services/api/apiClient';\r\n\r\ninterface RoleDto {\r\n id: string;\r\n name: string;\r\n description: string | null;\r\n}\r\n\r\nconst LEVEL_ORDER = ['Supervisor', 'Manager', 'Director'] as const;\r\n\r\nconst levelColors: Record<string, string> = {\r\n None: 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]',\r\n Supervisor: 'bg-[var(--info-bg)] text-[var(--info-text)]',\r\n Manager: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Director: 'bg-[var(--error-bg)] text-[var(--error-text)]',\r\n};\r\n\r\nconst triggerTypeIcons: Record<string, typeof AlertTriangle> = {\r\n ResponseBreach: Clock,\r\n ResolutionBreach: AlertTriangle,\r\n ManualRequest: Bell,\r\n};\r\n\r\nexport function EscalationConfigPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [rules, setRules] = useState<EscalationRuleDto[]>([]);\r\n const [roles, setRoles] = useState<RoleDto[]>([]);\r\n const [editingRule, setEditingRule] = useState<EscalationRuleDto | null>(null);\r\n const [editForm, setEditForm] = useState<{\r\n delayAfterBreachMinutes: number;\r\n notifyRoleId: string | null;\r\n isActive: boolean;\r\n }>({ delayAfterBreachMinutes: 0, notifyRoleId: null, isActive: true });\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [rulesRes, rolesRes] = await Promise.all([\r\n slaApi.getEscalationRules(),\r\n api.get<RoleDto[]>('/api/administration/permissions/roles'),\r\n ]);\r\n setRules(rulesRes);\r\n setRoles(rolesRes);\r\n } catch (error) {\r\n console.error('Failed to load escalation data:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleEdit = (rule: EscalationRuleDto) => {\r\n setEditingRule(rule);\r\n setEditForm({\r\n delayAfterBreachMinutes: rule.delayAfterBreachMinutes,\r\n notifyRoleId: rule.notifyRoleId,\r\n isActive: rule.isActive,\r\n });\r\n };\r\n\r\n const handleCancelEdit = () => {\r\n setEditingRule(null);\r\n setEditForm({ delayAfterBreachMinutes: 0, notifyRoleId: null, isActive: true });\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!editingRule) return;\r\n\r\n try {\r\n setSaving(true);\r\n await api.put(`/api/support/sla/escalation-rules/${editingRule.id}`, editForm);\r\n loadData();\r\n setEditingRule(null);\r\n } catch (error) {\r\n console.error('Failed to save escalation rule:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const formatDelay = (minutes: number) => {\r\n if (minutes === 0) return t('escalation.delay.immediate');\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const remainingMinutes = minutes % 60;\r\n if (remainingMinutes === 0) return `${hours}h`;\r\n return `${hours}h ${remainingMinutes}min`;\r\n };\r\n\r\n const getRoleName = (roleId: string | null) => {\r\n if (!roleId) return t('escalation.notConfigured');\r\n const role = roles.find((r) => r.id === roleId);\r\n return role?.name || t('escalation.unknownRole');\r\n };\r\n\r\n const groupedRules = rules.reduce((acc, rule) => {\r\n if (!acc[rule.level]) {\r\n acc[rule.level] = [];\r\n }\r\n acc[rule.level].push(rule);\r\n return acc;\r\n }, {} as Record<string, EscalationRuleDto[]>);\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('escalation.title') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <TrendingUp className=\"w-6 h-6\" />\r\n {t('escalation.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('escalation.subtitle')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {loading ? (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n ) : (\r\n <>\r\n <div className=\"card p-6 bg-[var(--bg-secondary)]\">\r\n <h3 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Users className=\"w-5 h-5\" />\r\n {t('escalation.hierarchy')}\r\n </h3>\r\n <div className=\"flex items-center gap-4\">\r\n {LEVEL_ORDER.map((level, index) => (\r\n <div key={level} className=\"flex items-center gap-2\">\r\n <div className={`px-4 py-2 rounded-[var(--radius-badge)] font-medium ${levelColors[level]}`}>\r\n {t(`escalation.levels.${level}`)}\r\n </div>\r\n {index < 2 && (\r\n <div className=\"text-[var(--text-secondary)]\">→</div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n <p className=\"mt-4 text-sm text-[var(--text-secondary)]\">\r\n {t('escalation.hierarchyDescription')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n {Object.entries(groupedRules)\r\n .filter(([level]) => level !== 'None')\r\n .sort((a, b) => {\r\n return LEVEL_ORDER.indexOf(a[0] as typeof LEVEL_ORDER[number]) - LEVEL_ORDER.indexOf(b[0] as typeof LEVEL_ORDER[number]);\r\n })\r\n .map(([level, levelRules]) => (\r\n <div key={level} className=\"card overflow-hidden\">\r\n <div className={`px-6 py-3 ${levelColors[level]} border-b border-[var(--border-color)]`}>\r\n <h3 className=\"font-semibold\">\r\n {t('escalation.level', {\r\n number: LEVEL_ORDER.indexOf(level as typeof LEVEL_ORDER[number]) + 1,\r\n label: t(`escalation.levels.${level}`),\r\n })}\r\n </h3>\r\n </div>\r\n <div className=\"divide-y divide-[var(--border-color)]\">\r\n {levelRules.map((rule) => {\r\n const TriggerIcon = triggerTypeIcons[rule.triggerType] || AlertTriangle;\r\n const isEditing = editingRule?.id === rule.id;\r\n\r\n return (\r\n <div\r\n key={rule.id}\r\n className={`p-4 ${!rule.isActive ? 'opacity-60' : ''}`}\r\n >\r\n {isEditing ? (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <TriggerIcon className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">\r\n {t(`escalation.triggerTypes.${rule.triggerType}`)}\r\n </span>\r\n </div>\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('escalation.form.delayAfterBreach')}\r\n </label>\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={editForm.delayAfterBreachMinutes}\r\n onChange={(e) =>\r\n setEditForm({\r\n ...editForm,\r\n delayAfterBreachMinutes: parseInt(e.target.value) || 0,\r\n })\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('escalation.form.minutes')}\r\n </span>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('escalation.form.notifyRole')}\r\n </label>\r\n <select\r\n value={editForm.notifyRoleId || ''}\r\n onChange={(e) =>\r\n setEditForm({\r\n ...editForm,\r\n notifyRoleId: e.target.value || null,\r\n })\r\n }\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('escalation.form.none')}</option>\r\n {roles.map((role) => (\r\n <option key={role.id} value={role.id}>\r\n {role.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('escalation.form.status')}\r\n </label>\r\n <label className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n checked={editForm.isActive}\r\n onChange={(e) =>\r\n setEditForm({\r\n ...editForm,\r\n isActive: e.target.checked,\r\n })\r\n }\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n <span className=\"text-sm\">{t('escalation.form.active')}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={handleCancelEdit}\r\n className=\"btn btn-secondary flex items-center gap-1\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"btn btn-primary flex items-center gap-1\"\r\n >\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n {t('common:actions.save')}\r\n </button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <TriggerIcon className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <span className=\"font-medium\">\r\n {t(`escalation.triggerTypes.${rule.triggerType}`)}\r\n </span>\r\n {rule.isSystemDefault ? (\r\n <span className=\"text-[10px] px-1.5 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('escalation.scope.system')}\r\n </span>\r\n ) : (\r\n <span className=\"text-[10px] px-1.5 py-0.5 rounded bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n {t('escalation.scope.tenant')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n <Clock className=\"w-4 h-4 inline mr-1\" />\r\n {formatDelay(rule.delayAfterBreachMinutes)}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n <Bell className=\"w-4 h-4 inline mr-1\" />\r\n {getRoleName(rule.notifyRoleId)}\r\n </div>\r\n {!rule.isActive && (\r\n <span className=\"text-xs px-2 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {t('escalation.disabled')}\r\n </span>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => handleEdit(rule)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('common:actions.edit')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <h3 className=\"text-lg font-semibold mb-4\">{t('escalation.howItWorks.title')}</h3>\r\n <div className=\"space-y-4 text-sm text-[var(--text-secondary)]\">\r\n {[1, 2, 3, 4].map((step) => (\r\n <div key={step} className=\"flex gap-3\">\r\n <div className=\"w-6 h-6 rounded-full bg-[var(--info-bg)] text-[var(--info-text)] flex items-center justify-center text-xs font-bold flex-shrink-0\">\r\n {step}\r\n </div>\r\n <p>{t(`escalation.howItWorks.step${step}`)}</p>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["LEVEL_ORDER","levelColors","triggerTypeIcons","Clock","AlertTriangle","Bell","EscalationConfigPage","useTranslation","loading","setLoading","useState","saving","setSaving","rules","setRules","roles","setRoles","editingRule","setEditingRule","editForm","setEditForm","loadData","useCallback","rulesRes","rolesRes","slaApi","api","error","useEffect","handleEdit","rule","handleCancelEdit","handleSave","formatDelay","minutes","hours","remainingMinutes","getRoleName","roleId","r","groupedRules","acc","jsxs","jsx","Breadcrumb","TrendingUp","Loader2","Fragment","Users","level","index","b","levelRules","TriggerIcon","isEditing","e","role","X","Check","Edit","step"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EscalationConfigPage-DPyiBcqV.js","sources":["../../src/pages/platform/support/EscalationConfigPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n TrendingUp,\r\n Loader2,\r\n AlertTriangle,\r\n Bell,\r\n Clock,\r\n Users,\r\n Edit,\r\n Check,\r\n X,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { slaApi, type EscalationRuleDto } from '@/services/api/supportApi';\r\nimport { api } from '@/services/api/apiClient';\r\n\r\ninterface RoleDto {\r\n id: string;\r\n name: string;\r\n description: string | null;\r\n}\r\n\r\nconst LEVEL_ORDER = ['Supervisor', 'Manager', 'Director'] as const;\r\n\r\nconst levelColors: Record<string, string> = {\r\n None: 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]',\r\n Supervisor: 'bg-[var(--info-bg)] text-[var(--info-text)]',\r\n Manager: 'bg-[var(--warning-bg)] text-[var(--warning-text)]',\r\n Director: 'bg-[var(--error-bg)] text-[var(--error-text)]',\r\n};\r\n\r\nconst triggerTypeIcons: Record<string, typeof AlertTriangle> = {\r\n ResponseBreach: Clock,\r\n ResolutionBreach: AlertTriangle,\r\n ManualRequest: Bell,\r\n};\r\n\r\nexport function EscalationConfigPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [rules, setRules] = useState<EscalationRuleDto[]>([]);\r\n const [roles, setRoles] = useState<RoleDto[]>([]);\r\n const [editingRule, setEditingRule] = useState<EscalationRuleDto | null>(null);\r\n const [editForm, setEditForm] = useState<{\r\n delayAfterBreachMinutes: number;\r\n notifyRoleId: string | null;\r\n isActive: boolean;\r\n }>({ delayAfterBreachMinutes: 0, notifyRoleId: null, isActive: true });\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [rulesRes, rolesRes] = await Promise.all([\r\n slaApi.getEscalationRules(),\r\n api.get<RoleDto[]>('/api/administration/permissions/roles'),\r\n ]);\r\n setRules(rulesRes);\r\n setRoles(rolesRes);\r\n } catch (error) {\r\n console.error('Failed to load escalation data:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleEdit = (rule: EscalationRuleDto) => {\r\n setEditingRule(rule);\r\n setEditForm({\r\n delayAfterBreachMinutes: rule.delayAfterBreachMinutes,\r\n notifyRoleId: rule.notifyRoleId,\r\n isActive: rule.isActive,\r\n });\r\n };\r\n\r\n const handleCancelEdit = () => {\r\n setEditingRule(null);\r\n setEditForm({ delayAfterBreachMinutes: 0, notifyRoleId: null, isActive: true });\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!editingRule) return;\r\n\r\n try {\r\n setSaving(true);\r\n await api.put(`/api/support/sla/escalation-rules/${editingRule.id}`, editForm);\r\n loadData();\r\n setEditingRule(null);\r\n } catch (error) {\r\n console.error('Failed to save escalation rule:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const formatDelay = (minutes: number) => {\r\n if (minutes === 0) return t('escalation.delay.immediate');\r\n if (minutes < 60) return `${minutes} min`;\r\n const hours = Math.floor(minutes / 60);\r\n const remainingMinutes = minutes % 60;\r\n if (remainingMinutes === 0) return `${hours}h`;\r\n return `${hours}h ${remainingMinutes}min`;\r\n };\r\n\r\n const getRoleName = (roleId: string | null) => {\r\n if (!roleId) return t('escalation.notConfigured');\r\n const role = roles.find((r) => r.id === roleId);\r\n return role?.name || t('escalation.unknownRole');\r\n };\r\n\r\n const groupedRules = rules.reduce((acc, rule) => {\r\n if (!acc[rule.level]) {\r\n acc[rule.level] = [];\r\n }\r\n acc[rule.level].push(rule);\r\n return acc;\r\n }, {} as Record<string, EscalationRuleDto[]>);\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('title', 'Support'), href: '/support' },\r\n { label: t('escalation.title') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <TrendingUp className=\"w-6 h-6\" />\r\n {t('escalation.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('escalation.subtitle')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {loading ? (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n ) : (\r\n <>\r\n <div className=\"card p-6 bg-[var(--bg-secondary)]\">\r\n <h3 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Users className=\"w-5 h-5\" />\r\n {t('escalation.hierarchy')}\r\n </h3>\r\n <div className=\"flex items-center gap-4\">\r\n {LEVEL_ORDER.map((level, index) => (\r\n <div key={level} className=\"flex items-center gap-2\">\r\n <div className={`px-4 py-2 rounded-[var(--radius-badge)] font-medium ${levelColors[level]}`}>\r\n {t(`escalation.levels.${level}`)}\r\n </div>\r\n {index < 2 && (\r\n <div className=\"text-[var(--text-secondary)]\">→</div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n <p className=\"mt-4 text-sm text-[var(--text-secondary)]\">\r\n {t('escalation.hierarchyDescription')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n {Object.entries(groupedRules)\r\n .filter(([level]) => level !== 'None')\r\n .sort((a, b) => {\r\n return LEVEL_ORDER.indexOf(a[0] as typeof LEVEL_ORDER[number]) - LEVEL_ORDER.indexOf(b[0] as typeof LEVEL_ORDER[number]);\r\n })\r\n .map(([level, levelRules]) => (\r\n <div key={level} className=\"card overflow-hidden\">\r\n <div className={`px-6 py-3 ${levelColors[level]} border-b border-[var(--border-color)]`}>\r\n <h3 className=\"font-semibold\">\r\n {t('escalation.level', {\r\n number: LEVEL_ORDER.indexOf(level as typeof LEVEL_ORDER[number]) + 1,\r\n label: t(`escalation.levels.${level}`),\r\n })}\r\n </h3>\r\n </div>\r\n <div className=\"divide-y divide-[var(--border-color)]\">\r\n {levelRules.map((rule) => {\r\n const TriggerIcon = triggerTypeIcons[rule.triggerType] || AlertTriangle;\r\n const isEditing = editingRule?.id === rule.id;\r\n\r\n return (\r\n <div\r\n key={rule.id}\r\n className={`p-4 ${!rule.isActive ? 'opacity-60' : ''}`}\r\n >\r\n {isEditing ? (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <TriggerIcon className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">\r\n {t(`escalation.triggerTypes.${rule.triggerType}`)}\r\n </span>\r\n </div>\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('escalation.form.delayAfterBreach')}\r\n </label>\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={editForm.delayAfterBreachMinutes}\r\n onChange={(e) =>\r\n setEditForm({\r\n ...editForm,\r\n delayAfterBreachMinutes: parseInt(e.target.value) || 0,\r\n })\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('escalation.form.minutes')}\r\n </span>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('escalation.form.notifyRole')}\r\n </label>\r\n <select\r\n value={editForm.notifyRoleId || ''}\r\n onChange={(e) =>\r\n setEditForm({\r\n ...editForm,\r\n notifyRoleId: e.target.value || null,\r\n })\r\n }\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('escalation.form.none')}</option>\r\n {roles.map((role) => (\r\n <option key={role.id} value={role.id}>\r\n {role.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('escalation.form.status')}\r\n </label>\r\n <label className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n checked={editForm.isActive}\r\n onChange={(e) =>\r\n setEditForm({\r\n ...editForm,\r\n isActive: e.target.checked,\r\n })\r\n }\r\n className=\"rounded border-[var(--border-color)]\"\r\n />\r\n <span className=\"text-sm\">{t('escalation.form.active')}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={handleCancelEdit}\r\n className=\"btn btn-secondary flex items-center gap-1\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"btn btn-primary flex items-center gap-1\"\r\n >\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n {t('common:actions.save')}\r\n </button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <TriggerIcon className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n <span className=\"font-medium\">\r\n {t(`escalation.triggerTypes.${rule.triggerType}`)}\r\n </span>\r\n {rule.isSystemDefault ? (\r\n <span className=\"text-[10px] px-1.5 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {t('escalation.scope.system')}\r\n </span>\r\n ) : (\r\n <span className=\"text-[10px] px-1.5 py-0.5 rounded bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]\">\r\n {t('escalation.scope.tenant')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n <Clock className=\"w-4 h-4 inline mr-1\" />\r\n {formatDelay(rule.delayAfterBreachMinutes)}\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n <Bell className=\"w-4 h-4 inline mr-1\" />\r\n {getRoleName(rule.notifyRoleId)}\r\n </div>\r\n {!rule.isActive && (\r\n <span className=\"text-xs px-2 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {t('escalation.disabled')}\r\n </span>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => handleEdit(rule)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('common:actions.edit')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <h3 className=\"text-lg font-semibold mb-4\">{t('escalation.howItWorks.title')}</h3>\r\n <div className=\"space-y-4 text-sm text-[var(--text-secondary)]\">\r\n {[1, 2, 3, 4].map((step) => (\r\n <div key={step} className=\"flex gap-3\">\r\n <div className=\"w-6 h-6 rounded-full bg-[var(--info-bg)] text-[var(--info-text)] flex items-center justify-center text-xs font-bold flex-shrink-0\">\r\n {step}\r\n </div>\r\n <p>{t(`escalation.howItWorks.step${step}`)}</p>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["LEVEL_ORDER","levelColors","triggerTypeIcons","Clock","AlertTriangle","Bell","EscalationConfigPage","useTranslation","loading","setLoading","useState","saving","setSaving","rules","setRules","roles","setRoles","editingRule","setEditingRule","editForm","setEditForm","loadData","useCallback","rulesRes","rolesRes","slaApi","api","error","useEffect","handleEdit","rule","handleCancelEdit","handleSave","formatDelay","minutes","hours","remainingMinutes","getRoleName","roleId","r","groupedRules","acc","jsxs","jsx","Breadcrumb","TrendingUp","Loader2","Fragment","Users","level","index","b","levelRules","TriggerIcon","isEditing","e","role","X","Check","Edit","step"],"mappings":";;;;;AAwBA,MAAMA,IAAc,CAAC,cAAc,WAAW,UAAU,GAElDC,IAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AACZ,GAEMC,IAAyD;AAAA,EAC7D,gBAAgBC;AAAA,EAChB,kBAAkBC;AAAA,EAClB,eAAeC;AACjB;AAEO,SAASC,IAAqC;AACnD,QAAM,EAAE,EAAA,IAAMC,EAAe,SAAS,GAChC,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAI,GACrC,CAACC,GAAQC,CAAS,IAAIF,EAAS,EAAK,GACpC,CAACG,GAAOC,CAAQ,IAAIJ,EAA8B,CAAA,CAAE,GACpD,CAACK,GAAOC,CAAQ,IAAIN,EAAoB,CAAA,CAAE,GAC1C,CAACO,GAAaC,CAAc,IAAIR,EAAmC,IAAI,GACvE,CAACS,GAAUC,CAAW,IAAIV,EAI7B,EAAE,yBAAyB,GAAG,cAAc,MAAM,UAAU,GAAA,CAAM,GAE/DW,IAAWC,EAAY,YAAY;AACvC,QAAI;AACF,MAAAb,EAAW,EAAI;AACf,YAAM,CAACc,GAAUC,CAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC7CC,EAAO,mBAAA;AAAA,QACPC,EAAI,IAAe,uCAAuC;AAAA,MAAA,CAC3D;AACD,MAAAZ,EAASS,CAAQ,GACjBP,EAASQ,CAAQ;AAAA,IACnB,SAASG,GAAO;AACd,cAAQ,MAAM,mCAAmCA,CAAK;AAAA,IACxD,UAAA;AACE,MAAAlB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,EAAAmB,EAAU,MAAM;AACd,IAAAP,EAAA;AAAA,EACF,GAAG,CAACA,CAAQ,CAAC;AAEb,QAAMQ,IAAa,CAACC,MAA4B;AAC9C,IAAAZ,EAAeY,CAAI,GACnBV,EAAY;AAAA,MACV,yBAAyBU,EAAK;AAAA,MAC9B,cAAcA,EAAK;AAAA,MACnB,UAAUA,EAAK;AAAA,IAAA,CAChB;AAAA,EACH,GAEMC,IAAmB,MAAM;AAC7B,IAAAb,EAAe,IAAI,GACnBE,EAAY,EAAE,yBAAyB,GAAG,cAAc,MAAM,UAAU,IAAM;AAAA,EAChF,GAEMY,IAAa,YAAY;AAC7B,QAAKf;AAEL,UAAI;AACF,QAAAL,EAAU,EAAI,GACd,MAAMc,EAAI,IAAI,qCAAqCT,EAAY,EAAE,IAAIE,CAAQ,GAC7EE,EAAA,GACAH,EAAe,IAAI;AAAA,MACrB,SAASS,GAAO;AACd,gBAAQ,MAAM,mCAAmCA,CAAK;AAAA,MACxD,UAAA;AACE,QAAAf,EAAU,EAAK;AAAA,MACjB;AAAA,EACF,GAEMqB,IAAc,CAACC,MAAoB;AACvC,QAAIA,MAAY,EAAG,QAAO,EAAE,4BAA4B;AACxD,QAAIA,IAAU,GAAI,QAAO,GAAGA,CAAO;AACnC,UAAMC,IAAQ,KAAK,MAAMD,IAAU,EAAE,GAC/BE,IAAmBF,IAAU;AACnC,WAAIE,MAAqB,IAAU,GAAGD,CAAK,MACpC,GAAGA,CAAK,KAAKC,CAAgB;AAAA,EACtC,GAEMC,IAAc,CAACC,MACdA,IACQvB,EAAM,KAAK,CAACwB,MAAMA,EAAE,OAAOD,CAAM,GACjC,QAAQ,EAAE,wBAAwB,IAF3B,EAAE,0BAA0B,GAK5CE,IAAe3B,EAAM,OAAO,CAAC4B,GAAKX,OACjCW,EAAIX,EAAK,KAAK,MACjBW,EAAIX,EAAK,KAAK,IAAI,CAAA,IAEpBW,EAAIX,EAAK,KAAK,EAAE,KAAKA,CAAI,GAClBW,IACN,CAAA,CAAyC;AAE5C,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAO,EAAE,kBAAkB,EAAA;AAAA,QAAE;AAAA,MACjC;AAAA,IAAA;AAAA,IAGF,gBAAAD,EAAC,OAAA,EAAI,WAAU,qCACb,4BAAC,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,8CACZ,UAAA;AAAA,QAAA,gBAAAC,EAACE,GAAA,EAAW,WAAU,UAAA,CAAU;AAAA,QAC/B,EAAE,kBAAkB;AAAA,MAAA,GACvB;AAAA,wBACC,KAAA,EAAE,WAAU,gCACV,UAAA,EAAE,qBAAqB,EAAA,CAC1B;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAECrC,IACC,gBAAAmC,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA,gBAAAA,EAACG,GAAA,EAAQ,WAAU,uDAAA,CAAuD,EAAA,CAC5E,IAEA,gBAAAJ,EAAAK,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,sDACZ,UAAA;AAAA,UAAA,gBAAAC,EAACK,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,UAC1B,EAAE,sBAAsB;AAAA,QAAA,GAC3B;AAAA,QACA,gBAAAL,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA3C,EAAY,IAAI,CAACiD,GAAOC,MACvB,gBAAAR,EAAC,OAAA,EAAgB,WAAU,2BACzB,UAAA;AAAA,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAW,uDAAuD1C,EAAYgD,CAAK,CAAC,IACtF,UAAA,EAAE,qBAAqBA,CAAK,EAAE,GACjC;AAAA,UACCC,IAAQ,KACP,gBAAAP,EAAC,OAAA,EAAI,WAAU,gCAA+B,UAAA,IAAA,CAAC;AAAA,QAAA,KALzCM,CAOV,CACD,GACH;AAAA,0BACC,KAAA,EAAE,WAAU,6CACV,UAAA,EAAE,iCAAiC,EAAA,CACtC;AAAA,MAAA,GACF;AAAA,wBAEC,OAAA,EAAI,WAAU,aACZ,UAAA,OAAO,QAAQT,CAAY,EACzB,OAAO,CAAC,CAACS,CAAK,MAAMA,MAAU,MAAM,EACpC,KAAK,CAAC,GAAGE,MACDnD,EAAY,QAAQ,EAAE,CAAC,CAA+B,IAAIA,EAAY,QAAQmD,EAAE,CAAC,CAA+B,CACxH,EACA,IAAI,CAAC,CAACF,GAAOG,CAAU,MACtB,gBAAAV,EAAC,OAAA,EAAgB,WAAU,wBACzB,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAW,aAAa1C,EAAYgD,CAAK,CAAC,0CAC7C,UAAA,gBAAAN,EAAC,MAAA,EAAG,WAAU,iBACX,UAAA,EAAE,oBAAoB;AAAA,UACrB,QAAQ3C,EAAY,QAAQiD,CAAmC,IAAI;AAAA,UACnE,OAAO,EAAE,qBAAqBA,CAAK,EAAE;AAAA,QAAA,CACtC,GACH,EAAA,CACF;AAAA,0BACC,OAAA,EAAI,WAAU,yCACZ,UAAAG,EAAW,IAAI,CAACtB,MAAS;AACxB,gBAAMuB,IAAcnD,EAAiB4B,EAAK,WAAW,KAAK1B,GACpDkD,IAAYrC,GAAa,OAAOa,EAAK;AAE3C,iBACE,gBAAAa;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAW,OAAQb,EAAK,WAA0B,KAAf,YAAiB;AAAA,cAEnD,UAAAwB,IACC,gBAAAZ,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,kBAAA,gBAAAC,EAACU,GAAA,EAAY,WAAU,UAAA,CAAU;AAAA,kBACjC,gBAAAV,EAAC,UAAK,WAAU,eACb,YAAE,2BAA2Bb,EAAK,WAAW,EAAE,EAAA,CAClD;AAAA,gBAAA,GACF;AAAA,gBACA,gBAAAY,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,oBAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,kCACd,UAAA,EAAE,kCAAkC,GACvC;AAAA,oBACA,gBAAAD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,sBAAA,gBAAAC;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,KAAI;AAAA,0BACJ,OAAOxB,EAAS;AAAA,0BAChB,UAAU,CAACoC,MACTnC,EAAY;AAAA,4BACV,GAAGD;AAAA,4BACH,yBAAyB,SAASoC,EAAE,OAAO,KAAK,KAAK;AAAA,0BAAA,CACtD;AAAA,0BAEH,WAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,wCAEX,QAAA,EAAK,WAAU,wCACb,UAAA,EAAE,yBAAyB,EAAA,CAC9B;AAAA,oBAAA,EAAA,CACF;AAAA,kBAAA,GACF;AAAA,oCACC,OAAA,EACC,UAAA;AAAA,oBAAA,gBAAAZ,EAAC,SAAA,EAAM,WAAU,kCACd,UAAA,EAAE,4BAA4B,GACjC;AAAA,oBACA,gBAAAD;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAOvB,EAAS,gBAAgB;AAAA,wBAChC,UAAU,CAACoC,MACTnC,EAAY;AAAA,0BACV,GAAGD;AAAA,0BACH,cAAcoC,EAAE,OAAO,SAAS;AAAA,wBAAA,CACjC;AAAA,wBAEH,WAAU;AAAA,wBAEV,UAAA;AAAA,0BAAA,gBAAAZ,EAAC,UAAA,EAAO,OAAM,IAAI,UAAA,EAAE,sBAAsB,GAAE;AAAA,0BAC3C5B,EAAM,IAAI,CAACyC,MACV,gBAAAb,EAAC,UAAA,EAAqB,OAAOa,EAAK,IAC/B,UAAAA,EAAK,KAAA,GADKA,EAAK,EAElB,CACD;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACH,GACF;AAAA,oCACC,OAAA,EACC,UAAA;AAAA,oBAAA,gBAAAb,EAAC,SAAA,EAAM,WAAU,kCACd,UAAA,EAAE,wBAAwB,GAC7B;AAAA,oBACA,gBAAAD,EAAC,SAAA,EAAM,WAAU,2BACf,UAAA;AAAA,sBAAA,gBAAAC;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAASxB,EAAS;AAAA,0BAClB,UAAU,CAACoC,MACTnC,EAAY;AAAA,4BACV,GAAGD;AAAA,4BACH,UAAUoC,EAAE,OAAO;AAAA,0BAAA,CACpB;AAAA,0BAEH,WAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,wCAEX,QAAA,EAAK,WAAU,WAAW,UAAA,EAAE,wBAAwB,EAAA,CAAE;AAAA,oBAAA,EAAA,CACzD;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA,GACF;AAAA,gBACA,gBAAAb,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,kBAAA,gBAAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,SAASX;AAAA,sBACT,WAAU;AAAA,sBAEV,UAAA;AAAA,wBAAA,gBAAAY,EAACc,GAAA,EAAE,WAAU,UAAA,CAAU;AAAA,wBACtB,EAAE,uBAAuB;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAE5B,gBAAAf;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,SAASV;AAAA,sBACT,UAAUrB;AAAA,sBACV,WAAU;AAAA,sBAET,UAAA;AAAA,wBAAAA,IACC,gBAAAgC,EAACG,KAAQ,WAAU,uBAAA,CAAuB,IAE1C,gBAAAH,EAACe,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,wBAE5B,EAAE,qBAAqB;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC1B,EAAA,CACF;AAAA,cAAA,EAAA,CACF,IAEA,gBAAAhB,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,oBAAA,gBAAAC,EAACU,GAAA,EAAY,WAAU,uCAAA,CAAuC;AAAA,oBAC9D,gBAAAV,EAAC,UAAK,WAAU,eACb,YAAE,2BAA2Bb,EAAK,WAAW,EAAE,EAAA,CAClD;AAAA,oBACCA,EAAK,kBACJ,gBAAAa,EAAC,QAAA,EAAK,WAAU,+HACb,UAAA,EAAE,yBAAyB,EAAA,CAC9B,sBAEC,QAAA,EAAK,WAAU,oHACb,UAAA,EAAE,yBAAyB,EAAA,CAC9B;AAAA,kBAAA,GAEJ;AAAA,kBACA,gBAAAD,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,oBAAA,gBAAAC,EAACxC,GAAA,EAAM,WAAU,sBAAA,CAAsB;AAAA,oBACtC8B,EAAYH,EAAK,uBAAuB;AAAA,kBAAA,GAC3C;AAAA,kBACA,gBAAAY,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,oBAAA,gBAAAC,EAACtC,GAAA,EAAK,WAAU,sBAAA,CAAsB;AAAA,oBACrCgC,EAAYP,EAAK,YAAY;AAAA,kBAAA,GAChC;AAAA,kBACC,CAACA,EAAK,YACL,gBAAAa,EAAC,UAAK,WAAU,qFACb,UAAA,EAAE,qBAAqB,EAAA,CAC1B;AAAA,gBAAA,GAEJ;AAAA,gBACA,gBAAAD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAMb,EAAWC,CAAI;AAAA,oBAC9B,WAAU;AAAA,oBAEV,UAAA;AAAA,sBAAA,gBAAAa,EAACgB,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,sBACzB,EAAE,qBAAqB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC1B,EAAA,CACF;AAAA,YAAA;AAAA,YAzIG7B,EAAK;AAAA,UAAA;AAAA,QA6IhB,CAAC,EAAA,CACH;AAAA,MAAA,KA9JQmB,CA+JV,CACD,GACL;AAAA,MAEA,gBAAAP,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,8BAA8B,UAAA,EAAE,6BAA6B,GAAE;AAAA,0BAC5E,OAAA,EAAI,WAAU,kDACZ,UAAA,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAACiB,MACjB,gBAAAlB,EAAC,OAAA,EAAe,WAAU,cACxB,UAAA;AAAA,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,qIACZ,UAAAiB,GACH;AAAA,4BACC,KAAA,EAAG,UAAA,EAAE,6BAA6BA,CAAI,EAAE,EAAA,CAAE;AAAA,QAAA,EAAA,GAJnCA,CAKV,CACD,EAAA,CACH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
|
package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),S=require("react-router-dom"),A=require("react-i18next"),a=require("lucide-react"),q=require("./index-
|
|
2
|
-
//# sourceMappingURL=ForceChangePasswordPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),S=require("react-router-dom"),A=require("react-i18next"),a=require("lucide-react"),q=require("./index-IgLVXPg8.js");function E(){const{t:o}=A.useTranslation(),b=S.useNavigate(),[l,w]=n.useState(""),[t,p]=n.useState(""),[d,y]=n.useState(""),[i,j]=n.useState(!1),[c,v]=n.useState(!1),[m,x]=n.useState(!1),[h,u]=n.useState(null),[N,k]=n.useState(!1),P=(s=>{const r=[];return s.length<8&&r.push("Au moins 8 caractères"),/[A-Z]/.test(s)||r.push("Au moins une majuscule"),/[a-z]/.test(s)||r.push("Au moins une minuscule"),/[0-9]/.test(s)||r.push("Au moins un chiffre"),r})(t),g=t===d&&P.length===0&&l.length>0,C=async s=>{if(s.preventDefault(),!!g){x(!0),u(null);try{await q.authApi.changePassword(l,t),k(!0),setTimeout(()=>{b("/")},2e3)}catch(r){r instanceof Error?u(r.message):u("Une erreur est survenue")}finally{x(!1)}}};return N?e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4",children:e.jsxs("div",{className:"w-full max-w-md bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8 text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(a.CheckCircle,{className:"w-8 h-8 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-2xl font-bold text-gray-900 dark:text-white mb-2",children:"Mot de passe modifié"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Vous allez être redirigé vers l'accueil..."})]})}):e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4",children:e.jsx("div",{className:"w-full max-w-md",children:e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"w-16 h-16 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(a.Lock,{className:"w-8 h-8 text-amber-600 dark:text-amber-400"})}),e.jsx("h1",{className:"text-2xl font-bold text-gray-900 dark:text-white",children:o("auth.forceChangePassword.title","Changement de mot de passe requis")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:o("auth.forceChangePassword.description","Pour des raisons de sécurité, vous devez définir un nouveau mot de passe.")})]}),h&&e.jsxs("div",{className:"mb-6 p-4 rounded-xl bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 flex items-center gap-2",children:[e.jsx(a.AlertTriangle,{className:"w-5 h-5 flex-shrink-0"}),e.jsx("span",{children:h})]}),e.jsxs("form",{onSubmit:C,className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:o("auth.forceChangePassword.currentPassword","Mot de passe actuel (temporaire)")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:i?"text":"password",required:!0,value:l,onChange:s=>w(s.target.value),className:"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500",placeholder:"Entrez le mot de passe fourni par l'administrateur"}),e.jsx("button",{type:"button",onClick:()=>j(!i),className:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300",children:i?e.jsx(a.EyeOff,{className:"w-5 h-5"}):e.jsx(a.Eye,{className:"w-5 h-5"})})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:o("auth.forceChangePassword.newPassword","Nouveau mot de passe")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:c?"text":"password",required:!0,value:t,onChange:s=>p(s.target.value),className:"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500",placeholder:"Choisissez un nouveau mot de passe"}),e.jsx("button",{type:"button",onClick:()=>v(!c),className:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300",children:c?e.jsx(a.EyeOff,{className:"w-5 h-5"}):e.jsx(a.Eye,{className:"w-5 h-5"})})]}),t&&e.jsx("div",{className:"mt-2 space-y-1",children:["Au moins 8 caractères","Au moins une majuscule","Au moins une minuscule","Au moins un chiffre"].map((s,r)=>{const f=[t.length>=8,/[A-Z]/.test(t),/[a-z]/.test(t),/[0-9]/.test(t)];return e.jsxs("div",{className:`flex items-center gap-2 text-sm ${f[r]?"text-green-600":"text-gray-500"}`,children:[f[r]?e.jsx(a.CheckCircle,{className:"w-4 h-4"}):e.jsx("div",{className:"w-4 h-4 rounded-full border border-current"}),s]},`pwd-req-${r}`)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:o("auth.forceChangePassword.confirmPassword","Confirmer le nouveau mot de passe")}),e.jsx("input",{type:"password",required:!0,value:d,onChange:s=>y(s.target.value),className:`w-full px-4 py-3 rounded-xl border ${d&&d!==t?"border-red-500 focus:ring-red-500":"border-gray-300 dark:border-gray-600 focus:ring-blue-500"} bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2`,placeholder:"Confirmez votre nouveau mot de passe"}),d&&d!==t&&e.jsx("p",{className:"mt-1 text-sm text-red-600",children:"Les mots de passe ne correspondent pas"})]}),e.jsx("button",{type:"submit",disabled:!g||m,className:"w-full py-3 px-4 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2",children:m?e.jsxs(e.Fragment,{children:[e.jsx(a.Loader2,{className:"w-5 h-5 animate-spin"}),e.jsx("span",{children:"Modification en cours..."})]}):e.jsx("span",{children:o("auth.forceChangePassword.submit","Définir mon nouveau mot de passe")})})]})]})})})}exports.ForceChangePasswordPage=E;
|
|
2
|
+
//# sourceMappingURL=ForceChangePasswordPage-BE-6umub.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForceChangePasswordPage-lRpkwcX7.js","sources":["../../src/pages/auth/ForceChangePasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Lock, Eye, EyeOff, Loader2, AlertTriangle, CheckCircle } from 'lucide-react';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForceChangePasswordPage(): ReactElement {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\r\n const [showNewPassword, setShowNewPassword] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = [];\r\n if (password.length < 8) errors.push('Au moins 8 caractères');\r\n if (!/[A-Z]/.test(password)) errors.push('Au moins une majuscule');\r\n if (!/[a-z]/.test(password)) errors.push('Au moins une minuscule');\r\n if (!/[0-9]/.test(password)) errors.push('Au moins un chiffre');\r\n return errors;\r\n };\r\n\r\n const passwordErrors = validatePassword(newPassword);\r\n const isValid = newPassword === confirmPassword && passwordErrors.length === 0 && currentPassword.length > 0;\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isValid) return;\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.changePassword(currentPassword, newPassword);\r\n setSuccess(true);\r\n setTimeout(() => {\r\n navigate('/');\r\n }, 2000);\r\n } catch (err: unknown) {\r\n if (err instanceof Error) {\r\n setError(err.message);\r\n } else {\r\n setError('Une erreur est survenue');\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8 text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle className=\"w-8 h-8 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe modifié\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Vous allez être redirigé vers l'accueil...\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-amber-600 dark:text-amber-400\" />\r\n </div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {t('auth.forceChangePassword.title', 'Changement de mot de passe requis')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePassword.description', 'Pour des raisons de sécurité, vous devez définir un nouveau mot de passe.')}\r\n </p>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"mb-6 p-4 rounded-xl bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n {/* Current Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.currentPassword', 'Mot de passe actuel (temporaire)')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showCurrentPassword ? 'text' : 'password'}\r\n required\r\n value={currentPassword}\r\n onChange={e => setCurrentPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Entrez le mot de passe fourni par l'administrateur\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowCurrentPassword(!showCurrentPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showCurrentPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* New Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.newPassword', 'Nouveau mot de passe')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showNewPassword ? 'text' : 'password'}\r\n required\r\n value={newPassword}\r\n onChange={e => setNewPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Choisissez un nouveau mot de passe\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowNewPassword(!showNewPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showNewPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n\r\n {/* Password requirements */}\r\n {newPassword && (\r\n <div className=\"mt-2 space-y-1\">\r\n {['Au moins 8 caractères', 'Au moins une majuscule', 'Au moins une minuscule', 'Au moins un chiffre'].map((req, i) => {\r\n const checks = [\r\n newPassword.length >= 8,\r\n /[A-Z]/.test(newPassword),\r\n /[a-z]/.test(newPassword),\r\n /[0-9]/.test(newPassword)\r\n ];\r\n return (\r\n <div key={`pwd-req-${i}`} className={`flex items-center gap-2 text-sm ${checks[i] ? 'text-green-600' : 'text-gray-500'}`}>\r\n {checks[i] ? <CheckCircle className=\"w-4 h-4\" /> : <div className=\"w-4 h-4 rounded-full border border-current\" />}\r\n {req}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.confirmPassword', 'Confirmer le nouveau mot de passe')}\r\n </label>\r\n <input\r\n type=\"password\"\r\n required\r\n value={confirmPassword}\r\n onChange={e => setConfirmPassword(e.target.value)}\r\n className={`w-full px-4 py-3 rounded-xl border ${\r\n confirmPassword && confirmPassword !== newPassword\r\n ? 'border-red-500 focus:ring-red-500'\r\n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\r\n } bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2`}\r\n placeholder=\"Confirmez votre nouveau mot de passe\"\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">Les mots de passe ne correspondent pas</p>\r\n )}\r\n </div>\r\n\r\n {/* Submit */}\r\n <button\r\n type=\"submit\"\r\n disabled={!isValid || loading}\r\n className=\"w-full py-3 px-4 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\r\n >\r\n {loading ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Modification en cours...</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePassword.submit', 'Définir mon nouveau mot de passe')}</span>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForceChangePasswordPage","t","useTranslation","navigate","useNavigate","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","confirmPassword","setConfirmPassword","showCurrentPassword","setShowCurrentPassword","showNewPassword","setShowNewPassword","loading","setLoading","error","setError","success","setSuccess","passwordErrors","password","errors","isValid","handleSubmit","e","authApi","err","jsxs","jsx","CheckCircle","Lock","AlertTriangle","EyeOff","Eye","req","i","checks","Fragment","Loader2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ForceChangePasswordPage-BE-6umub.js","sources":["../../src/pages/auth/ForceChangePasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Lock, Eye, EyeOff, Loader2, AlertTriangle, CheckCircle } from 'lucide-react';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForceChangePasswordPage(): ReactElement {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\r\n const [showNewPassword, setShowNewPassword] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = [];\r\n if (password.length < 8) errors.push('Au moins 8 caractères');\r\n if (!/[A-Z]/.test(password)) errors.push('Au moins une majuscule');\r\n if (!/[a-z]/.test(password)) errors.push('Au moins une minuscule');\r\n if (!/[0-9]/.test(password)) errors.push('Au moins un chiffre');\r\n return errors;\r\n };\r\n\r\n const passwordErrors = validatePassword(newPassword);\r\n const isValid = newPassword === confirmPassword && passwordErrors.length === 0 && currentPassword.length > 0;\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isValid) return;\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.changePassword(currentPassword, newPassword);\r\n setSuccess(true);\r\n setTimeout(() => {\r\n navigate('/');\r\n }, 2000);\r\n } catch (err: unknown) {\r\n if (err instanceof Error) {\r\n setError(err.message);\r\n } else {\r\n setError('Une erreur est survenue');\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8 text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle className=\"w-8 h-8 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe modifié\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Vous allez être redirigé vers l'accueil...\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-amber-600 dark:text-amber-400\" />\r\n </div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {t('auth.forceChangePassword.title', 'Changement de mot de passe requis')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePassword.description', 'Pour des raisons de sécurité, vous devez définir un nouveau mot de passe.')}\r\n </p>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"mb-6 p-4 rounded-xl bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n {/* Current Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.currentPassword', 'Mot de passe actuel (temporaire)')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showCurrentPassword ? 'text' : 'password'}\r\n required\r\n value={currentPassword}\r\n onChange={e => setCurrentPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Entrez le mot de passe fourni par l'administrateur\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowCurrentPassword(!showCurrentPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showCurrentPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* New Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.newPassword', 'Nouveau mot de passe')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showNewPassword ? 'text' : 'password'}\r\n required\r\n value={newPassword}\r\n onChange={e => setNewPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Choisissez un nouveau mot de passe\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowNewPassword(!showNewPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showNewPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n\r\n {/* Password requirements */}\r\n {newPassword && (\r\n <div className=\"mt-2 space-y-1\">\r\n {['Au moins 8 caractères', 'Au moins une majuscule', 'Au moins une minuscule', 'Au moins un chiffre'].map((req, i) => {\r\n const checks = [\r\n newPassword.length >= 8,\r\n /[A-Z]/.test(newPassword),\r\n /[a-z]/.test(newPassword),\r\n /[0-9]/.test(newPassword)\r\n ];\r\n return (\r\n <div key={`pwd-req-${i}`} className={`flex items-center gap-2 text-sm ${checks[i] ? 'text-green-600' : 'text-gray-500'}`}>\r\n {checks[i] ? <CheckCircle className=\"w-4 h-4\" /> : <div className=\"w-4 h-4 rounded-full border border-current\" />}\r\n {req}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.confirmPassword', 'Confirmer le nouveau mot de passe')}\r\n </label>\r\n <input\r\n type=\"password\"\r\n required\r\n value={confirmPassword}\r\n onChange={e => setConfirmPassword(e.target.value)}\r\n className={`w-full px-4 py-3 rounded-xl border ${\r\n confirmPassword && confirmPassword !== newPassword\r\n ? 'border-red-500 focus:ring-red-500'\r\n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\r\n } bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2`}\r\n placeholder=\"Confirmez votre nouveau mot de passe\"\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">Les mots de passe ne correspondent pas</p>\r\n )}\r\n </div>\r\n\r\n {/* Submit */}\r\n <button\r\n type=\"submit\"\r\n disabled={!isValid || loading}\r\n className=\"w-full py-3 px-4 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\r\n >\r\n {loading ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Modification en cours...</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePassword.submit', 'Définir mon nouveau mot de passe')}</span>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForceChangePasswordPage","t","useTranslation","navigate","useNavigate","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","confirmPassword","setConfirmPassword","showCurrentPassword","setShowCurrentPassword","showNewPassword","setShowNewPassword","loading","setLoading","error","setError","success","setSuccess","passwordErrors","password","errors","isValid","handleSubmit","e","authApi","err","jsxs","jsx","CheckCircle","Lock","AlertTriangle","EyeOff","Eye","req","i","checks","Fragment","Loader2"],"mappings":"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"}
|
package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js}
RENAMED
|
@@ -3,7 +3,7 @@ import { useState as n } from "react";
|
|
|
3
3
|
import { useNavigate as q } from "react-router-dom";
|
|
4
4
|
import { useTranslation as L } from "react-i18next";
|
|
5
5
|
import { CheckCircle as b, Lock as M, AlertTriangle as T, EyeOff as p, Eye as w, Loader2 as $ } from "lucide-react";
|
|
6
|
-
import { c as D } from "./index-
|
|
6
|
+
import { c as D } from "./index-lpIzhufD.js";
|
|
7
7
|
function H() {
|
|
8
8
|
const { t: o } = L(), y = q(), [l, v] = n(""), [s, N] = n(""), [d, k] = n(""), [i, P] = n(!1), [c, C] = n(!1), [m, h] = n(!1), [g, u] = n(null), [A, j] = n(!1), z = ((r) => {
|
|
9
9
|
const t = [];
|
|
@@ -132,4 +132,4 @@ function H() {
|
|
|
132
132
|
export {
|
|
133
133
|
H as ForceChangePasswordPage
|
|
134
134
|
};
|
|
135
|
-
//# sourceMappingURL=ForceChangePasswordPage-
|
|
135
|
+
//# sourceMappingURL=ForceChangePasswordPage-CnsYoWmV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForceChangePasswordPage-CvmYAV3r.js","sources":["../../src/pages/auth/ForceChangePasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Lock, Eye, EyeOff, Loader2, AlertTriangle, CheckCircle } from 'lucide-react';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForceChangePasswordPage(): ReactElement {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\r\n const [showNewPassword, setShowNewPassword] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = [];\r\n if (password.length < 8) errors.push('Au moins 8 caractères');\r\n if (!/[A-Z]/.test(password)) errors.push('Au moins une majuscule');\r\n if (!/[a-z]/.test(password)) errors.push('Au moins une minuscule');\r\n if (!/[0-9]/.test(password)) errors.push('Au moins un chiffre');\r\n return errors;\r\n };\r\n\r\n const passwordErrors = validatePassword(newPassword);\r\n const isValid = newPassword === confirmPassword && passwordErrors.length === 0 && currentPassword.length > 0;\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isValid) return;\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.changePassword(currentPassword, newPassword);\r\n setSuccess(true);\r\n setTimeout(() => {\r\n navigate('/');\r\n }, 2000);\r\n } catch (err: unknown) {\r\n if (err instanceof Error) {\r\n setError(err.message);\r\n } else {\r\n setError('Une erreur est survenue');\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8 text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle className=\"w-8 h-8 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe modifié\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Vous allez être redirigé vers l'accueil...\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-amber-600 dark:text-amber-400\" />\r\n </div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {t('auth.forceChangePassword.title', 'Changement de mot de passe requis')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePassword.description', 'Pour des raisons de sécurité, vous devez définir un nouveau mot de passe.')}\r\n </p>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"mb-6 p-4 rounded-xl bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n {/* Current Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.currentPassword', 'Mot de passe actuel (temporaire)')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showCurrentPassword ? 'text' : 'password'}\r\n required\r\n value={currentPassword}\r\n onChange={e => setCurrentPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Entrez le mot de passe fourni par l'administrateur\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowCurrentPassword(!showCurrentPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showCurrentPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* New Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.newPassword', 'Nouveau mot de passe')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showNewPassword ? 'text' : 'password'}\r\n required\r\n value={newPassword}\r\n onChange={e => setNewPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Choisissez un nouveau mot de passe\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowNewPassword(!showNewPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showNewPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n\r\n {/* Password requirements */}\r\n {newPassword && (\r\n <div className=\"mt-2 space-y-1\">\r\n {['Au moins 8 caractères', 'Au moins une majuscule', 'Au moins une minuscule', 'Au moins un chiffre'].map((req, i) => {\r\n const checks = [\r\n newPassword.length >= 8,\r\n /[A-Z]/.test(newPassword),\r\n /[a-z]/.test(newPassword),\r\n /[0-9]/.test(newPassword)\r\n ];\r\n return (\r\n <div key={`pwd-req-${i}`} className={`flex items-center gap-2 text-sm ${checks[i] ? 'text-green-600' : 'text-gray-500'}`}>\r\n {checks[i] ? <CheckCircle className=\"w-4 h-4\" /> : <div className=\"w-4 h-4 rounded-full border border-current\" />}\r\n {req}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.confirmPassword', 'Confirmer le nouveau mot de passe')}\r\n </label>\r\n <input\r\n type=\"password\"\r\n required\r\n value={confirmPassword}\r\n onChange={e => setConfirmPassword(e.target.value)}\r\n className={`w-full px-4 py-3 rounded-xl border ${\r\n confirmPassword && confirmPassword !== newPassword\r\n ? 'border-red-500 focus:ring-red-500'\r\n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\r\n } bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2`}\r\n placeholder=\"Confirmez votre nouveau mot de passe\"\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">Les mots de passe ne correspondent pas</p>\r\n )}\r\n </div>\r\n\r\n {/* Submit */}\r\n <button\r\n type=\"submit\"\r\n disabled={!isValid || loading}\r\n className=\"w-full py-3 px-4 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\r\n >\r\n {loading ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Modification en cours...</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePassword.submit', 'Définir mon nouveau mot de passe')}</span>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForceChangePasswordPage","t","useTranslation","navigate","useNavigate","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","confirmPassword","setConfirmPassword","showCurrentPassword","setShowCurrentPassword","showNewPassword","setShowNewPassword","loading","setLoading","error","setError","success","setSuccess","passwordErrors","password","errors","isValid","handleSubmit","e","authApi","err","jsxs","jsx","CheckCircle","Lock","AlertTriangle","EyeOff","Eye","req","i","checks","Fragment","Loader2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ForceChangePasswordPage-CnsYoWmV.js","sources":["../../src/pages/auth/ForceChangePasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Lock, Eye, EyeOff, Loader2, AlertTriangle, CheckCircle } from 'lucide-react';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForceChangePasswordPage(): ReactElement {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\r\n const [showNewPassword, setShowNewPassword] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = [];\r\n if (password.length < 8) errors.push('Au moins 8 caractères');\r\n if (!/[A-Z]/.test(password)) errors.push('Au moins une majuscule');\r\n if (!/[a-z]/.test(password)) errors.push('Au moins une minuscule');\r\n if (!/[0-9]/.test(password)) errors.push('Au moins un chiffre');\r\n return errors;\r\n };\r\n\r\n const passwordErrors = validatePassword(newPassword);\r\n const isValid = newPassword === confirmPassword && passwordErrors.length === 0 && currentPassword.length > 0;\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isValid) return;\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.changePassword(currentPassword, newPassword);\r\n setSuccess(true);\r\n setTimeout(() => {\r\n navigate('/');\r\n }, 2000);\r\n } catch (err: unknown) {\r\n if (err instanceof Error) {\r\n setError(err.message);\r\n } else {\r\n setError('Une erreur est survenue');\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8 text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle className=\"w-8 h-8 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe modifié\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Vous allez être redirigé vers l'accueil...\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-amber-600 dark:text-amber-400\" />\r\n </div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {t('auth.forceChangePassword.title', 'Changement de mot de passe requis')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePassword.description', 'Pour des raisons de sécurité, vous devez définir un nouveau mot de passe.')}\r\n </p>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"mb-6 p-4 rounded-xl bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n {/* Current Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.currentPassword', 'Mot de passe actuel (temporaire)')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showCurrentPassword ? 'text' : 'password'}\r\n required\r\n value={currentPassword}\r\n onChange={e => setCurrentPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Entrez le mot de passe fourni par l'administrateur\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowCurrentPassword(!showCurrentPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showCurrentPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* New Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.newPassword', 'Nouveau mot de passe')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showNewPassword ? 'text' : 'password'}\r\n required\r\n value={newPassword}\r\n onChange={e => setNewPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Choisissez un nouveau mot de passe\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowNewPassword(!showNewPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showNewPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n\r\n {/* Password requirements */}\r\n {newPassword && (\r\n <div className=\"mt-2 space-y-1\">\r\n {['Au moins 8 caractères', 'Au moins une majuscule', 'Au moins une minuscule', 'Au moins un chiffre'].map((req, i) => {\r\n const checks = [\r\n newPassword.length >= 8,\r\n /[A-Z]/.test(newPassword),\r\n /[a-z]/.test(newPassword),\r\n /[0-9]/.test(newPassword)\r\n ];\r\n return (\r\n <div key={`pwd-req-${i}`} className={`flex items-center gap-2 text-sm ${checks[i] ? 'text-green-600' : 'text-gray-500'}`}>\r\n {checks[i] ? <CheckCircle className=\"w-4 h-4\" /> : <div className=\"w-4 h-4 rounded-full border border-current\" />}\r\n {req}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.confirmPassword', 'Confirmer le nouveau mot de passe')}\r\n </label>\r\n <input\r\n type=\"password\"\r\n required\r\n value={confirmPassword}\r\n onChange={e => setConfirmPassword(e.target.value)}\r\n className={`w-full px-4 py-3 rounded-xl border ${\r\n confirmPassword && confirmPassword !== newPassword\r\n ? 'border-red-500 focus:ring-red-500'\r\n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\r\n } bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2`}\r\n placeholder=\"Confirmez votre nouveau mot de passe\"\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">Les mots de passe ne correspondent pas</p>\r\n )}\r\n </div>\r\n\r\n {/* Submit */}\r\n <button\r\n type=\"submit\"\r\n disabled={!isValid || loading}\r\n className=\"w-full py-3 px-4 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\r\n >\r\n {loading ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Modification en cours...</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePassword.submit', 'Définir mon nouveau mot de passe')}</span>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForceChangePasswordPage","t","useTranslation","navigate","useNavigate","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","confirmPassword","setConfirmPassword","showCurrentPassword","setShowCurrentPassword","showNewPassword","setShowNewPassword","loading","setLoading","error","setError","success","setSuccess","passwordErrors","password","errors","isValid","handleSubmit","e","authApi","err","jsxs","jsx","CheckCircle","Lock","AlertTriangle","EyeOff","Eye","req","i","checks","Fragment","Loader2"],"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"),t=require("react"),h=require("react-router-dom"),r=require("lucide-react"),o=require("./index-
|
|
2
|
-
//# sourceMappingURL=ForgotPasswordPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),h=require("react-router-dom"),r=require("lucide-react"),o=require("./index-IgLVXPg8.js");function b(){const[s,c]=t.useState(""),[a,i]=t.useState(!1),[n,d]=t.useState(null),[m,x]=t.useState(!1),u=async l=>{l.preventDefault(),d(null),i(!0);try{await o.authApi.forgotPassword(s),x(!0)}catch(g){d(g?.message||"Une erreur est survenue")}finally{i(!1)}};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8",children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsx("div",{className:"flex justify-end mb-8",children:e.jsx(o.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[m?e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(r.CheckCircle2,{className:"w-10 h-10 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Email envoyé !"}),e.jsxs("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:["Si un compte existe avec l'adresse ",e.jsx("strong",{children:s}),", vous recevrez un lien de réinitialisation."]}),e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"N'oubliez pas de vérifier vos spams."})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(r.Mail,{className:"w-8 h-8 text-blue-600 dark:text-blue-400"})}),e.jsx("h2",{className:"text-2xl font-bold text-gray-900 dark:text-white mb-2",children:"Mot de passe oublié ?"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe."})]}),n&&e.jsxs("div",{className:"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3",children:[e.jsx(r.AlertCircle,{className:"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-sm text-red-500",children:n})]}),e.jsxs("form",{onSubmit:u,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"email",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Adresse email"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(r.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"email",type:"email",value:s,onChange:l=>c(l.target.value),className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:"vous@exemple.com",required:!0,autoComplete:"email",disabled:a})]})]}),e.jsx("button",{type:"submit",disabled:a,className:"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all",children:a?e.jsxs(e.Fragment,{children:[e.jsx(r.Loader2,{className:"h-5 w-5 animate-spin"}),"Envoi en cours..."]}):"Envoyer le lien"})]})]}),e.jsx("div",{className:"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700",children:e.jsxs(h.Link,{to:"/login",className:"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors",children:[e.jsx(r.ArrowLeft,{className:"w-4 h-4"}),"Retour à la connexion"]})})]})]})})}exports.ForgotPasswordPage=b;
|
|
2
|
+
//# sourceMappingURL=ForgotPasswordPage-CSq4DnFF.js.map
|
package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgotPasswordPage-
|
|
1
|
+
{"version":3,"file":"ForgotPasswordPage-CSq4DnFF.js","sources":["../../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Mail, Loader2, ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForgotPasswordPage(): ReactElement {\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.forgotPassword(email);\r\n setSuccess(true);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setError(error?.message || 'Une erreur est survenue');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {!success ? (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Mail className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe oublié ?\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe.\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n Adresse email\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"vous@exemple.com\"\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n Envoi en cours...\r\n </>\r\n ) : (\r\n 'Envoyer le lien'\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n ) : (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email envoyé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n Si un compte existe avec l'adresse <strong>{email}</strong>, vous recevrez un lien de réinitialisation.\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n N'oubliez pas de vérifier vos spams.\r\n </p>\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n Retour à la connexion\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","email","setEmail","useState","isLoading","setIsLoading","error","setError","success","setSuccess","handleSubmit","e","authApi","err","jsxs","jsx","ThemeSwitcher","CheckCircle2","Fragment","Mail","AlertCircle","Loader2","Link","ArrowLeft"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as r, Fragment as o } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as t } from "react";
|
|
3
3
|
import { Link as x } from "react-router-dom";
|
|
4
4
|
import { Mail as c, AlertCircle as b, Loader2 as p, CheckCircle2 as f, ArrowLeft as y } from "lucide-react";
|
|
5
|
-
import { T as v, c as N } from "./index-
|
|
5
|
+
import { T as v, c as N } from "./index-lpIzhufD.js";
|
|
6
6
|
function A() {
|
|
7
7
|
const [a, m] = t(""), [l, i] = t(!1), [n, d] = t(null), [u, h] = t(!1);
|
|
8
8
|
return /* @__PURE__ */ e("div", { className: "min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8", children: /* @__PURE__ */ r("div", { className: "w-full max-w-md", children: [
|
|
@@ -88,4 +88,4 @@ function A() {
|
|
|
88
88
|
export {
|
|
89
89
|
A as ForgotPasswordPage
|
|
90
90
|
};
|
|
91
|
-
//# sourceMappingURL=ForgotPasswordPage-
|
|
91
|
+
//# sourceMappingURL=ForgotPasswordPage-DZLVolAC.js.map
|
package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgotPasswordPage-
|
|
1
|
+
{"version":3,"file":"ForgotPasswordPage-DZLVolAC.js","sources":["../../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Mail, Loader2, ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForgotPasswordPage(): ReactElement {\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.forgotPassword(email);\r\n setSuccess(true);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setError(error?.message || 'Une erreur est survenue');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {!success ? (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Mail className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe oublié ?\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe.\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n Adresse email\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"vous@exemple.com\"\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n Envoi en cours...\r\n </>\r\n ) : (\r\n 'Envoyer le lien'\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n ) : (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email envoyé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n Si un compte existe avec l'adresse <strong>{email}</strong>, vous recevrez un lien de réinitialisation.\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n N'oubliez pas de vérifier vos spams.\r\n </p>\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n Retour à la connexion\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","email","setEmail","useState","isLoading","setIsLoading","error","setError","success","setSuccess","jsxs","jsx","ThemeSwitcher","CheckCircle2","Fragment","Mail","AlertCircle","e","authApi","err","Loader2","Link","ArrowLeft"],"mappings":"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"}
|
|
@@ -4,11 +4,11 @@ import { useNavigate as Oe, Link as ke, useParams as At } from "react-router-dom
|
|
|
4
4
|
import { useTranslation as he } from "react-i18next";
|
|
5
5
|
import * as kt from "lucide-react";
|
|
6
6
|
import { AlertCircle as Fe, X as ue, Search as ve, ChevronDown as Be, Plus as ce, Loader2 as Z, Globe as Me, Building2 as ge, Trash2 as ye, GitMerge as tt, Filter as St, RefreshCw as Xe, LayoutGrid as nt, LayoutList as Rt, AlertTriangle as Se, CheckCircle as Ge, GitBranch as pe, Link as It, Check as We, Users as xe, Table as Tt, Info as ot, Shield as be, Star as _e, Eye as Ve, Ban as Pt, ChevronRight as Qe, FolderOpen as Gt, UserCheck as Ft, User as lt, Box as Mt, Play as $t, UserPlus as jt, Edit as Lt, Database as Et, FileText as Dt, Boxes as Bt, Layers as Wt, Key as it, ArrowRightLeft as rt, AppWindow as Ot, ArrowLeft as Ut, Cloud as at, Edit3 as ct, Save as zt, Mail as _t, CornerDownRight as qt, Unlink as st } from "lucide-react";
|
|
7
|
-
import { g as q, c as Vt } from "./groupsApi-
|
|
8
|
-
import { k as fe, w as Qt, s as Ht, v as Kt, a as dt, B as Yt } from "./index-
|
|
7
|
+
import { g as q, c as Vt } from "./groupsApi-QzXI-5xu.js";
|
|
8
|
+
import { k as fe, w as Qt, s as Ht, v as Kt, a as dt, B as Yt } from "./index-lpIzhufD.js";
|
|
9
9
|
import { g as mt } from "./roleUtils-DlOIxLsd.js";
|
|
10
|
-
import { T as Xt, u as Jt } from "./TenantScopeSelector-
|
|
11
|
-
import { u as Zt, g as Ee, a as De } from "./tenantIconMap-
|
|
10
|
+
import { T as Xt, u as Jt } from "./TenantScopeSelector-BWfYxvEa.js";
|
|
11
|
+
import { u as Zt, g as Ee, a as De } from "./tenantIconMap-BQD9byc8.js";
|
|
12
12
|
import { c as er, g as tr, a as rr, P as ar, b as sr, d as nr } from "./PermissionPopover-CR6SD8ch.js";
|
|
13
13
|
import { u as or } from "./useTabNavigation-Bsbskz0i.js";
|
|
14
14
|
const He = {
|
|
@@ -2976,4 +2976,4 @@ function Or() {
|
|
|
2976
2976
|
export {
|
|
2977
2977
|
Or as GroupDetailPage
|
|
2978
2978
|
};
|
|
2979
|
-
//# sourceMappingURL=GroupDetailPage-
|
|
2979
|
+
//# sourceMappingURL=GroupDetailPage-Bf9Wb_2j.js.map
|