@atlashub/smartstack 3.39.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js → AgentSkillsPage-BS_W2KTh.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js.map → AgentSkillsPage-BS_W2KTh.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js → AgentSkillsPage-CmDFLnp7.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js.map → AgentSkillsPage-CmDFLnp7.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js → AgentWorkloadPage-C8IvYfhT.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js.map → AgentWorkloadPage-C8IvYfhT.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js → AgentWorkloadPage-JXsQbwuM.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js.map → AgentWorkloadPage-JXsQbwuM.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js → ApiCatalogDetailPage-CYOt34Vy.js} +2 -2
  10. package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js.map → ApiCatalogDetailPage-CYOt34Vy.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js → ApiCatalogDetailPage-wFZDsTGy.js} +3 -3
  12. package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js.map → ApiCatalogDetailPage-wFZDsTGy.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js → ApiCatalogPage-Bdm3HNGP.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js.map → ApiCatalogPage-Bdm3HNGP.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js → ApiCatalogPage-m_TWQyGv.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js.map → ApiCatalogPage-m_TWQyGv.js.map} +1 -1
  17. package/dist/chunks/ApplicationDetailPage-C2BSpEoW.js +2 -0
  18. package/dist/chunks/{ApplicationDetailPage-CWdz0TS4.js.map → ApplicationDetailPage-C2BSpEoW.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js → ApplicationDetailPage-CcgDAP-J.js} +503 -501
  20. package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js.map → ApplicationDetailPage-CcgDAP-J.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js → ApplicationsDashboardPage-CDIjziL3.js} +3 -3
  22. package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js.map → ApplicationsDashboardPage-CDIjziL3.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js → ApplicationsDashboardPage-DslDyNzJ.js} +2 -2
  24. package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js.map → ApplicationsDashboardPage-DslDyNzJ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js → ApplicationsGridPage-BCjsQGU0.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js.map → ApplicationsGridPage-BCjsQGU0.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js → ApplicationsGridPage-CIfKiCND.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js.map → ApplicationsGridPage-CIfKiCND.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js → ApplicationsListPage-CT75kNcH.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js.map → ApplicationsListPage-CT75kNcH.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js → ApplicationsListPage-D2B4PZ5n.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js.map → ApplicationsListPage-D2B4PZ5n.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BqfNR-kc.js → ApplicationsPage-CaTBtduL.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BqfNR-kc.js.map → ApplicationsPage-CaTBtduL.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-DuxuWfrN.js → ApplicationsPage-DW1LhL0U.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-DuxuWfrN.js.map → ApplicationsPage-DW1LhL0U.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js → AssignmentRulesPage-Bt9M0ki7.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js.map → AssignmentRulesPage-Bt9M0ki7.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js → AssignmentRulesPage-Y7xv60NY.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js.map → AssignmentRulesPage-Y7xv60NY.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-v8QUJkE7.js → AssignmentsPage-1eQGTjTi.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-v8QUJkE7.js.map → AssignmentsPage-1eQGTjTi.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-CjuGAd8n.js → AssignmentsPage-RURdPvfZ.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-CjuGAd8n.js.map → AssignmentsPage-RURdPvfZ.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js → AuthCallbackPage-8hF0jYlK.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js.map → AuthCallbackPage-8hF0jYlK.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-CuS-efzY.js → AuthCallbackPage-DPL68Asu.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-CuS-efzY.js.map → AuthCallbackPage-DPL68Asu.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js → ConfirmEmailPage-BKlpZkVk.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js.map → ConfirmEmailPage-BKlpZkVk.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js → ConfirmEmailPage-CawSZypI.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js.map → ConfirmEmailPage-CawSZypI.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js → CreateSupportTicketPage-AwbMbBIH.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js.map → CreateSupportTicketPage-AwbMbBIH.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js → CreateSupportTicketPage-Dg1YW1eA.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js.map → CreateSupportTicketPage-Dg1YW1eA.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-B4Pi5P3O.js → DashboardPage-B4YxOF-9.js} +3 -3
  58. package/dist/chunks/{DashboardPage-B4Pi5P3O.js.map → DashboardPage-B4YxOF-9.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-wEKZ_DWf.js → DashboardPage-BZxjinar.js} +2 -2
  60. package/dist/chunks/{DashboardPage-wEKZ_DWf.js.map → DashboardPage-BZxjinar.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-BAqpoxCW.js → DashboardPage-Bo09y8r7.js} +3 -3
  62. package/dist/chunks/{DashboardPage-BAqpoxCW.js.map → DashboardPage-Bo09y8r7.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-BT5kFaQA.js → DashboardPage-Cq5adDjP.js} +2 -2
  64. package/dist/chunks/{DashboardPage-BT5kFaQA.js.map → DashboardPage-Cq5adDjP.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-4pF38E4N.js → EscalationConfigPage-C8Hv5naz.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-4pF38E4N.js.map → EscalationConfigPage-C8Hv5naz.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js → EscalationConfigPage-DNAqMRxA.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js.map → EscalationConfigPage-DNAqMRxA.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js → ForceChangePasswordPage-BURE_vNg.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js.map → ForceChangePasswordPage-BURE_vNg.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js → ForceChangePasswordPage-C6jDZshk.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js.map → ForceChangePasswordPage-C6jDZshk.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js → ForgotPasswordPage-C5HLYbz4.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js.map → ForgotPasswordPage-C5HLYbz4.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js → ForgotPasswordPage-D3ZQBtjd.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js.map → ForgotPasswordPage-D3ZQBtjd.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-dXNOoSXE.js → GroupDetailPage-CTuzp9Vp.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-dXNOoSXE.js.map → GroupDetailPage-CTuzp9Vp.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-BIgBzQk0.js → GroupDetailPage-NJc2zCxC.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-BIgBzQk0.js.map → GroupDetailPage-NJc2zCxC.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js → MyAccessRequestsPage-Cvr29Pnq.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js.map → MyAccessRequestsPage-Cvr29Pnq.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js → MyAccessRequestsPage-t6I24rHN.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js.map → MyAccessRequestsPage-t6I24rHN.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BXx1nPC8.js → MyTenantsPage-Dy2RZ_Ei.js} +2 -2
  86. package/dist/chunks/{MyTenantsPage-BXx1nPC8.js.map → MyTenantsPage-Dy2RZ_Ei.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js → MyTenantsPage-SvDCQ4Wt.js} +3 -3
  88. package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js.map → MyTenantsPage-SvDCQ4Wt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-C9MSmmR5.js → MyTicketsPage-C3lEBFD9.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-C9MSmmR5.js.map → MyTicketsPage-C3lEBFD9.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-d0PoJpnX.js → MyTicketsPage-DydDgFyz.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-d0PoJpnX.js.map → MyTicketsPage-DydDgFyz.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js → NavigationAppsPage-Dyv767w8.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js.map → NavigationAppsPage-Dyv767w8.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-8t2xbddT.js → NavigationAppsPage-WqSspaVo.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-8t2xbddT.js.map → NavigationAppsPage-WqSspaVo.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-_62-bmuk.js → NotificationsPage-Di4I95PM.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-_62-bmuk.js.map → NotificationsPage-Di4I95PM.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-CLHfVUxm.js → NotificationsPage-elSovpBw.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-CLHfVUxm.js.map → NotificationsPage-elSovpBw.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js → OnboardingWizardPage-fdWdkwiT.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js.map → OnboardingWizardPage-fdWdkwiT.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js → OnboardingWizardPage-nPLe2buQ.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js.map → OnboardingWizardPage-nPLe2buQ.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js → PermissionDetailPage-B8C7tWFP.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js.map → PermissionDetailPage-B8C7tWFP.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js → PermissionDetailPage-IUgUaTkE.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js.map → PermissionDetailPage-IUgUaTkE.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-Xb92YAHn.js → PermissionsPage-CmX5sQf2.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-Xb92YAHn.js.map → PermissionsPage-CmX5sQf2.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-B0M4gA5m.js → PermissionsPage-Kg0rduOM.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-B0M4gA5m.js.map → PermissionsPage-Kg0rduOM.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DTeMESj9.js → PortalDashboardPage-CCAYuhtI.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DTeMESj9.js.map → PortalDashboardPage-CCAYuhtI.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-pt9hipR4.js → PortalDashboardPage-Dme1XmzN.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-pt9hipR4.js.map → PortalDashboardPage-Dme1XmzN.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-Cy30AWIN.js → PreferencesPage-Ct6xWAFp.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-Cy30AWIN.js.map → PreferencesPage-Ct6xWAFp.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-CsHVGMgp.js → PreferencesPage-Db2RjMpm.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-CsHVGMgp.js.map → PreferencesPage-Db2RjMpm.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-6Gf7igUI.js → ProfilePage-D6Xb1ALH.js} +2 -2
  122. package/dist/chunks/{ProfilePage-6Gf7igUI.js.map → ProfilePage-D6Xb1ALH.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-BzBWkztf.js → ProfilePage-DN2s-lfp.js} +2 -2
  124. package/dist/chunks/{ProfilePage-BzBWkztf.js.map → ProfilePage-DN2s-lfp.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js → ReferencesManagementPage-B5mcshG1.js} +2 -2
  126. package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js.map → ReferencesManagementPage-B5mcshG1.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js → ReferencesManagementPage-DB975ktX.js} +3 -3
  128. package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js.map → ReferencesManagementPage-DB975ktX.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-asdx33fV.js → RegisterPage-ZskZrLZH.js} +2 -2
  130. package/dist/chunks/{RegisterPage-asdx33fV.js.map → RegisterPage-ZskZrLZH.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-CIPHRYkl.js → RegisterPage-b8yIPVgh.js} +2 -2
  132. package/dist/chunks/{RegisterPage-CIPHRYkl.js.map → RegisterPage-b8yIPVgh.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js → ResetPasswordPage-CeAvfsE-.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js.map → ResetPasswordPage-CeAvfsE-.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js → ResetPasswordPage-Dzp5dCp8.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js.map → ResetPasswordPage-Dzp5dCp8.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Cs6T441o.js → ResolutionModal-CRVN7gHv.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Cs6T441o.js.map → ResolutionModal-CRVN7gHv.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-rLoFOxm9.js → ResolutionModal-DJOw1sLT.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-rLoFOxm9.js.map → ResolutionModal-DJOw1sLT.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js → RoleDetailPage-CLVoFVF8.js} +2 -2
  142. package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js.map → RoleDetailPage-CLVoFVF8.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CNFG6j6P.js → RoleDetailPage-XGnPD_8C.js} +3 -3
  144. package/dist/chunks/{RoleDetailPage-CNFG6j6P.js.map → RoleDetailPage-XGnPD_8C.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-BHEkMR2O.js → RolesPage-BnAMpR2b.js} +2 -2
  146. package/dist/chunks/{RolesPage-BHEkMR2O.js.map → RolesPage-BnAMpR2b.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-D35jwDJU.js → RolesPage-Czj9LMkL.js} +2 -2
  148. package/dist/chunks/{RolesPage-D35jwDJU.js.map → RolesPage-Czj9LMkL.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-DtonDehw.js → SlaConfigPage-HM0MpIlg.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-DtonDehw.js.map → SlaConfigPage-HM0MpIlg.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-C5Jstix-.js → SlaConfigPage-ZRyAs8aY.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-C5Jstix-.js.map → SlaConfigPage-ZRyAs8aY.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js → SupportPermissionsPage-CxJuGgcQ.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js.map → SupportPermissionsPage-CxJuGgcQ.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js → SupportPermissionsPage-DNd323OK.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js.map → SupportPermissionsPage-DNd323OK.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-DjmYOGEC.js → TemplatesPage-CdwPLsHj.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-DjmYOGEC.js.map → TemplatesPage-CdwPLsHj.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DlY91VO_.js → TemplatesPage-Co3ygZvF.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DlY91VO_.js.map → TemplatesPage-Co3ygZvF.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BHLcv2gD.js → TenantCard-CmCfIK2F.js} +2 -2
  162. package/dist/chunks/{TenantCard-BHLcv2gD.js.map → TenantCard-CmCfIK2F.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-DGCKVvKI.js → TenantCard-DI66acce.js} +2 -2
  164. package/dist/chunks/{TenantCard-DGCKVvKI.js.map → TenantCard-DI66acce.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js → TenantScopeSelector-5NOwmFX2.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js.map → TenantScopeSelector-5NOwmFX2.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js → TenantScopeSelector-CEFgxiWt.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js.map → TenantScopeSelector-CEFgxiWt.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-BQHMaRmq.js → TicketDetailPage-BhZ-mpv7.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-BQHMaRmq.js.map → TicketDetailPage-BhZ-mpv7.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js → TicketDetailPage-BxOiOG22.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js.map → TicketDetailPage-BxOiOG22.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-CufUJctx.js → TicketsPage-BiTvIcM8.js} +2 -2
  174. package/dist/chunks/{TicketsPage-CufUJctx.js.map → TicketsPage-BiTvIcM8.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-C8QQ4SKy.js → TicketsPage-CSiinHME.js} +2 -2
  176. package/dist/chunks/{TicketsPage-C8QQ4SKy.js.map → TicketsPage-CSiinHME.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js → UserCreateTicketPage-B3TW1oV7.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js.map → UserCreateTicketPage-B3TW1oV7.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js → UserCreateTicketPage-BszUd_WZ.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js.map → UserCreateTicketPage-BszUd_WZ.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-fdhZwMLg.js → UserDashboardPage-C6MvatAb.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-fdhZwMLg.js.map → UserDashboardPage-C6MvatAb.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-BV1d2hMG.js → UserDashboardPage-Dtt9VzG_.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-BV1d2hMG.js.map → UserDashboardPage-Dtt9VzG_.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-C97e-Dax.js → UserDetailPage-BEEV2vlJ.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-C97e-Dax.js.map → UserDetailPage-BEEV2vlJ.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-BcA7Vhb2.js → UserDetailPage-Dw5OHheZ.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-BcA7Vhb2.js.map → UserDetailPage-Dw5OHheZ.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js → UserTicketDetailPage-B4YkzzbR.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js.map → UserTicketDetailPage-B4YkzzbR.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js → UserTicketDetailPage-DCFV-0ny.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js.map → UserTicketDetailPage-DCFV-0ny.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js → UsersGroupsPage-CY-l9fTp.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js.map → UsersGroupsPage-CY-l9fTp.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js → UsersGroupsPage-c28vYHN9.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js.map → UsersGroupsPage-c28vYHN9.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-BIXWHFmG.js → UsersPage-1sLlq9QD.js} +2 -2
  198. package/dist/chunks/{UsersPage-BIXWHFmG.js.map → UsersPage-1sLlq9QD.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-DS8aWUKj.js → UsersPage-Bm-uNxh0.js} +2 -2
  200. package/dist/chunks/{UsersPage-DS8aWUKj.js.map → UsersPage-Bm-uNxh0.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-C-r0mrCH.js → accessRequestsApi-CJPjyEkH.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-C-r0mrCH.js.map → accessRequestsApi-CJPjyEkH.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js → accessRequestsApi-D_pj1wl6.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js.map → accessRequestsApi-D_pj1wl6.js.map} +1 -1
  205. package/dist/chunks/{aiApi-B-H-76wM.js → aiApi-ByF-oo1J.js} +2 -2
  206. package/dist/chunks/{aiApi-B-H-76wM.js.map → aiApi-ByF-oo1J.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CcdrBILv.js → aiApi-Dt3fj0dU.js} +2 -2
  208. package/dist/chunks/{aiApi-CcdrBILv.js.map → aiApi-Dt3fj0dU.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js → applicationAnalyticsApi-BgG3SGJm.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js.map → applicationAnalyticsApi-BgG3SGJm.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js → applicationAnalyticsApi-ktD65iLO.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js.map → applicationAnalyticsApi-ktD65iLO.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-DExOJZPF.js → groupsApi-C-FLWPCO.js} +2 -2
  214. package/dist/chunks/{groupsApi-DExOJZPF.js.map → groupsApi-C-FLWPCO.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-CyqyYsmi.js → groupsApi-CBI5vMLa.js} +2 -2
  216. package/dist/chunks/{groupsApi-CyqyYsmi.js.map → groupsApi-CBI5vMLa.js.map} +1 -1
  217. package/dist/chunks/{index-DtAReZI6.js → index-B727-QSU.js} +2 -2
  218. package/dist/chunks/{index-DtAReZI6.js.map → index-B727-QSU.js.map} +1 -1
  219. package/dist/chunks/{index-BlOgmQzc.js → index-B9q3vx13.js} +2 -2
  220. package/dist/chunks/{index-BlOgmQzc.js.map → index-B9q3vx13.js.map} +1 -1
  221. package/dist/chunks/{index-VSQ2prtJ.js → index-BD-REzV9.js} +2 -2
  222. package/dist/chunks/{index-VSQ2prtJ.js.map → index-BD-REzV9.js.map} +1 -1
  223. package/dist/chunks/{index-XOOiD_zY.js → index-BDRogQH_.js} +3 -3
  224. package/dist/chunks/{index-XOOiD_zY.js.map → index-BDRogQH_.js.map} +1 -1
  225. package/dist/chunks/{index-DOQyf5yZ.js → index-C-DYxdvd.js} +8 -8
  226. package/dist/chunks/{index-DOQyf5yZ.js.map → index-C-DYxdvd.js.map} +1 -1
  227. package/dist/chunks/{index-Cq80YBne.js → index-CBtjGPod.js} +105 -105
  228. package/dist/chunks/{index-Cq80YBne.js.map → index-CBtjGPod.js.map} +1 -1
  229. package/dist/chunks/{index-dlXYTPWH.js → index-CF1cvNUL.js} +4 -4
  230. package/dist/chunks/{index-dlXYTPWH.js.map → index-CF1cvNUL.js.map} +1 -1
  231. package/dist/chunks/{index-COA_xJVJ.js → index-CH0pTHy1.js} +2 -2
  232. package/dist/chunks/{index-COA_xJVJ.js.map → index-CH0pTHy1.js.map} +1 -1
  233. package/dist/chunks/{index-DjZQ6ZG_.js → index-Ca88RIuT.js} +2 -2
  234. package/dist/chunks/{index-DjZQ6ZG_.js.map → index-Ca88RIuT.js.map} +1 -1
  235. package/dist/chunks/{index-Cj-9tGpd.js → index-CkWvsvKW.js} +2 -2
  236. package/dist/chunks/{index-Cj-9tGpd.js.map → index-CkWvsvKW.js.map} +1 -1
  237. package/dist/chunks/{index-EL_ZNnMH.js → index-CzYKE5fL.js} +2 -2
  238. package/dist/chunks/{index-EL_ZNnMH.js.map → index-CzYKE5fL.js.map} +1 -1
  239. package/dist/chunks/{index-qXfYaEmV.js → index-D32ol7lq.js} +2 -2
  240. package/dist/chunks/{index-qXfYaEmV.js.map → index-D32ol7lq.js.map} +1 -1
  241. package/dist/chunks/{index-DMQQ0KyA.js → index-D7hmx9IX.js} +2 -2
  242. package/dist/chunks/{index-DMQQ0KyA.js.map → index-D7hmx9IX.js.map} +1 -1
  243. package/dist/chunks/{index-BetDcNZm.js → index-DThcQmwZ.js} +2 -2
  244. package/dist/chunks/{index-BetDcNZm.js.map → index-DThcQmwZ.js.map} +1 -1
  245. package/dist/chunks/{index-C7h5yvcP.js → index-D_3J6ziZ.js} +2 -2
  246. package/dist/chunks/{index-C7h5yvcP.js.map → index-D_3J6ziZ.js.map} +1 -1
  247. package/dist/chunks/{index-C_nDTEP5.js → index-JSjfMShT.js} +2 -2
  248. package/dist/chunks/{index-C_nDTEP5.js.map → index-JSjfMShT.js.map} +1 -1
  249. package/dist/chunks/{index-COXxU0FH.js → index-gzXJw_ow.js} +3 -3
  250. package/dist/chunks/{index-COXxU0FH.js.map → index-gzXJw_ow.js.map} +1 -1
  251. package/dist/chunks/{index-jJxtz2bs.js → index-rRAbl04H.js} +2 -2
  252. package/dist/chunks/{index-jJxtz2bs.js.map → index-rRAbl04H.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-Ddvguo0l.js → tenantIconMap-Cw-hQ9n4.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-Ddvguo0l.js.map → tenantIconMap-Cw-hQ9n4.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DBa5MjIz.js → tenantIconMap-DinwojNW.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DBa5MjIz.js.map → tenantIconMap-DinwojNW.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Cr6QSv0g.js → ticketingApi-CcWdebXv.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Cr6QSv0g.js.map → ticketingApi-CcWdebXv.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-D6s75rOB.js → ticketingApi-x0BwZ1NH.js} +2 -2
  260. package/dist/chunks/{ticketingApi-D6s75rOB.js.map → ticketingApi-x0BwZ1NH.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-VuQT-n-P.js → useAccessRequests-BBTIYht3.js} +2 -2
  262. package/dist/chunks/{useAccessRequests-VuQT-n-P.js.map → useAccessRequests-BBTIYht3.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-CanI2ypo.js → useAccessRequests-BBUj9XY9.js} +71 -71
  264. package/dist/chunks/{useAccessRequests-CanI2ypo.js.map → useAccessRequests-BBUj9XY9.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js → useUserAccessRequests-BKQxcOXH.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js.map → useUserAccessRequests-BKQxcOXH.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js → useUserAccessRequests-BPUPiP55.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js.map → useUserAccessRequests-BPUPiP55.js.map} +1 -1
  269. package/dist/pages/platform/administration/applications/ApplicationDetailPage.d.ts.map +1 -1
  270. package/dist/smartstack.cjs +1 -1
  271. package/dist/smartstack.js +1 -1
  272. package/package.json +1 -1
  273. package/dist/chunks/ApplicationDetailPage-CWdz0TS4.js +0 -2
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react"),M=require("react-i18next"),i=require("lucide-react"),d=require("./index-XOOiD_zY.js"),x=["Supervisor","Manager","Director"],b={None:"bg-[var(--bg-secondary)] text-[var(--text-secondary)]",Supervisor:"bg-[var(--info-bg)] text-[var(--info-text)]",Manager:"bg-[var(--warning-bg)] text-[var(--warning-text)]",Director:"bg-[var(--error-bg)] text-[var(--error-text)]"},$={ResponseBreach:i.Clock,ResolutionBreach:i.AlertTriangle,ManualRequest:i.Bell};function T(){const{t:a}=M.useTranslation("support"),[y,f]=l.useState(!0),[p,v]=l.useState(!1),[N,R]=l.useState([]),[g,w]=l.useState([]),[m,h]=l.useState(null),[c,o]=l.useState({delayAfterBreachMinutes:0,notifyRoleId:null,isActive:!0}),u=l.useCallback(async()=>{try{f(!0);const[s,t]=await Promise.all([d.slaApi.getEscalationRules(),d.api.get("/api/administration/permissions/roles")]);R(s),w(t)}catch(s){console.error("Failed to load escalation data:",s)}finally{f(!1)}},[]);l.useEffect(()=>{u()},[u]);const A=s=>{h(s),o({delayAfterBreachMinutes:s.delayAfterBreachMinutes,notifyRoleId:s.notifyRoleId,isActive:s.isActive})},k=()=>{h(null),o({delayAfterBreachMinutes:0,notifyRoleId:null,isActive:!0})},C=async()=>{if(m)try{v(!0),await d.api.put(`/api/support/sla/escalation-rules/${m.id}`,c),u(),h(null)}catch(s){console.error("Failed to save escalation rule:",s)}finally{v(!1)}},S=s=>{if(s===0)return a("escalation.delay.immediate");if(s<60)return`${s} min`;const t=Math.floor(s/60),n=s%60;return n===0?`${t}h`:`${t}h ${n}min`},B=s=>s?g.find(n=>n.id===s)?.name||a("escalation.unknownRole"):a("escalation.notConfigured"),E=N.reduce((s,t)=>(s[t.level]||(s[t.level]=[]),s[t.level].push(t),s),{});return e.jsxs("div",{className:"space-y-6",children:[e.jsx(d.Breadcrumb,{items:[{label:a("title","Support"),href:"/support"},{label:a("escalation.title")}]}),e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(i.TrendingUp,{className:"w-6 h-6"}),a("escalation.title")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:a("escalation.subtitle")})]})}),y?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(i.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"card p-6 bg-[var(--bg-secondary)]",children:[e.jsxs("h3",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(i.Users,{className:"w-5 h-5"}),a("escalation.hierarchy")]}),e.jsx("div",{className:"flex items-center gap-4",children:x.map((s,t)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:`px-4 py-2 rounded-[var(--radius-badge)] font-medium ${b[s]}`,children:a(`escalation.levels.${s}`)}),t<2&&e.jsx("div",{className:"text-[var(--text-secondary)]",children:"→"})]},s))}),e.jsx("p",{className:"mt-4 text-sm text-[var(--text-secondary)]",children:a("escalation.hierarchyDescription")})]}),e.jsx("div",{className:"space-y-6",children:Object.entries(E).filter(([s])=>s!=="None").sort((s,t)=>x.indexOf(s[0])-x.indexOf(t[0])).map(([s,t])=>e.jsxs("div",{className:"card overflow-hidden",children:[e.jsx("div",{className:`px-6 py-3 ${b[s]} border-b border-[var(--border-color)]`,children:e.jsx("h3",{className:"font-semibold",children:a("escalation.level",{number:x.indexOf(s)+1,label:a(`escalation.levels.${s}`)})})}),e.jsx("div",{className:"divide-y divide-[var(--border-color)]",children:t.map(n=>{const j=$[n.triggerType]||i.AlertTriangle,I=m?.id===n.id;return e.jsx("div",{className:`p-4 ${n.isActive?"":"opacity-60"}`,children:I?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(j,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:a(`escalation.triggerTypes.${n.triggerType}`)})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:a("escalation.form.delayAfterBreach")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",min:"0",value:c.delayAfterBreachMinutes,onChange:r=>o({...c,delayAfterBreachMinutes:parseInt(r.target.value)||0}),className:"input w-24"}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:a("escalation.form.minutes")})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:a("escalation.form.notifyRole")}),e.jsxs("select",{value:c.notifyRoleId||"",onChange:r=>o({...c,notifyRoleId:r.target.value||null}),className:"input w-full",children:[e.jsx("option",{value:"",children:a("escalation.form.none")}),g.map(r=>e.jsx("option",{value:r.id,children:r.name},r.id))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:a("escalation.form.status")}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",checked:c.isActive,onChange:r=>o({...c,isActive:r.target.checked}),className:"rounded border-[var(--border-color)]"}),e.jsx("span",{className:"text-sm",children:a("escalation.form.active")})]})]})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs("button",{onClick:k,className:"btn btn-secondary flex items-center gap-1",children:[e.jsx(i.X,{className:"w-4 h-4"}),a("common:actions.cancel")]}),e.jsxs("button",{onClick:C,disabled:p,className:"btn btn-primary flex items-center gap-1",children:[p?e.jsx(i.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(i.Check,{className:"w-4 h-4"}),a("common:actions.save")]})]})]}):e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(j,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("span",{className:"font-medium",children:a(`escalation.triggerTypes.${n.triggerType}`)}),n.isSystemDefault?e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]",children:a("escalation.scope.system")}):e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]",children:a("escalation.scope.tenant")})]}),e.jsxs("div",{className:"text-sm text-[var(--text-secondary)]",children:[e.jsx(i.Clock,{className:"w-4 h-4 inline mr-1"}),S(n.delayAfterBreachMinutes)]}),e.jsxs("div",{className:"text-sm text-[var(--text-secondary)]",children:[e.jsx(i.Bell,{className:"w-4 h-4 inline mr-1"}),B(n.notifyRoleId)]}),!n.isActive&&e.jsx("span",{className:"text-xs px-2 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)]",children:a("escalation.disabled")})]}),e.jsxs("button",{onClick:()=>A(n),className:"btn btn-secondary btn-sm flex items-center gap-1",children:[e.jsx(i.Edit,{className:"w-4 h-4"}),a("common:actions.edit")]})]})},n.id)})})]},s))}),e.jsxs("div",{className:"card p-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:a("escalation.howItWorks.title")}),e.jsx("div",{className:"space-y-4 text-sm text-[var(--text-secondary)]",children:[1,2,3,4].map(s=>e.jsxs("div",{className:"flex gap-3",children:[e.jsx("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",children:s}),e.jsx("p",{children:a(`escalation.howItWorks.step${s}`)})]},s))})]})]})]})}exports.EscalationConfigPage=T;
2
- //# sourceMappingURL=EscalationConfigPage-Bcifnt_h.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react"),M=require("react-i18next"),i=require("lucide-react"),d=require("./index-BDRogQH_.js"),x=["Supervisor","Manager","Director"],b={None:"bg-[var(--bg-secondary)] text-[var(--text-secondary)]",Supervisor:"bg-[var(--info-bg)] text-[var(--info-text)]",Manager:"bg-[var(--warning-bg)] text-[var(--warning-text)]",Director:"bg-[var(--error-bg)] text-[var(--error-text)]"},$={ResponseBreach:i.Clock,ResolutionBreach:i.AlertTriangle,ManualRequest:i.Bell};function T(){const{t:a}=M.useTranslation("support"),[y,f]=l.useState(!0),[p,v]=l.useState(!1),[N,R]=l.useState([]),[g,w]=l.useState([]),[m,h]=l.useState(null),[c,o]=l.useState({delayAfterBreachMinutes:0,notifyRoleId:null,isActive:!0}),u=l.useCallback(async()=>{try{f(!0);const[s,t]=await Promise.all([d.slaApi.getEscalationRules(),d.api.get("/api/administration/permissions/roles")]);R(s),w(t)}catch(s){console.error("Failed to load escalation data:",s)}finally{f(!1)}},[]);l.useEffect(()=>{u()},[u]);const A=s=>{h(s),o({delayAfterBreachMinutes:s.delayAfterBreachMinutes,notifyRoleId:s.notifyRoleId,isActive:s.isActive})},k=()=>{h(null),o({delayAfterBreachMinutes:0,notifyRoleId:null,isActive:!0})},C=async()=>{if(m)try{v(!0),await d.api.put(`/api/support/sla/escalation-rules/${m.id}`,c),u(),h(null)}catch(s){console.error("Failed to save escalation rule:",s)}finally{v(!1)}},S=s=>{if(s===0)return a("escalation.delay.immediate");if(s<60)return`${s} min`;const t=Math.floor(s/60),n=s%60;return n===0?`${t}h`:`${t}h ${n}min`},B=s=>s?g.find(n=>n.id===s)?.name||a("escalation.unknownRole"):a("escalation.notConfigured"),E=N.reduce((s,t)=>(s[t.level]||(s[t.level]=[]),s[t.level].push(t),s),{});return e.jsxs("div",{className:"space-y-6",children:[e.jsx(d.Breadcrumb,{items:[{label:a("title","Support"),href:"/support"},{label:a("escalation.title")}]}),e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(i.TrendingUp,{className:"w-6 h-6"}),a("escalation.title")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:a("escalation.subtitle")})]})}),y?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(i.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"card p-6 bg-[var(--bg-secondary)]",children:[e.jsxs("h3",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(i.Users,{className:"w-5 h-5"}),a("escalation.hierarchy")]}),e.jsx("div",{className:"flex items-center gap-4",children:x.map((s,t)=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:`px-4 py-2 rounded-[var(--radius-badge)] font-medium ${b[s]}`,children:a(`escalation.levels.${s}`)}),t<2&&e.jsx("div",{className:"text-[var(--text-secondary)]",children:"→"})]},s))}),e.jsx("p",{className:"mt-4 text-sm text-[var(--text-secondary)]",children:a("escalation.hierarchyDescription")})]}),e.jsx("div",{className:"space-y-6",children:Object.entries(E).filter(([s])=>s!=="None").sort((s,t)=>x.indexOf(s[0])-x.indexOf(t[0])).map(([s,t])=>e.jsxs("div",{className:"card overflow-hidden",children:[e.jsx("div",{className:`px-6 py-3 ${b[s]} border-b border-[var(--border-color)]`,children:e.jsx("h3",{className:"font-semibold",children:a("escalation.level",{number:x.indexOf(s)+1,label:a(`escalation.levels.${s}`)})})}),e.jsx("div",{className:"divide-y divide-[var(--border-color)]",children:t.map(n=>{const j=$[n.triggerType]||i.AlertTriangle,I=m?.id===n.id;return e.jsx("div",{className:`p-4 ${n.isActive?"":"opacity-60"}`,children:I?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(j,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:a(`escalation.triggerTypes.${n.triggerType}`)})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:a("escalation.form.delayAfterBreach")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",min:"0",value:c.delayAfterBreachMinutes,onChange:r=>o({...c,delayAfterBreachMinutes:parseInt(r.target.value)||0}),className:"input w-24"}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:a("escalation.form.minutes")})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:a("escalation.form.notifyRole")}),e.jsxs("select",{value:c.notifyRoleId||"",onChange:r=>o({...c,notifyRoleId:r.target.value||null}),className:"input w-full",children:[e.jsx("option",{value:"",children:a("escalation.form.none")}),g.map(r=>e.jsx("option",{value:r.id,children:r.name},r.id))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:a("escalation.form.status")}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",checked:c.isActive,onChange:r=>o({...c,isActive:r.target.checked}),className:"rounded border-[var(--border-color)]"}),e.jsx("span",{className:"text-sm",children:a("escalation.form.active")})]})]})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsxs("button",{onClick:k,className:"btn btn-secondary flex items-center gap-1",children:[e.jsx(i.X,{className:"w-4 h-4"}),a("common:actions.cancel")]}),e.jsxs("button",{onClick:C,disabled:p,className:"btn btn-primary flex items-center gap-1",children:[p?e.jsx(i.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(i.Check,{className:"w-4 h-4"}),a("common:actions.save")]})]})]}):e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(j,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsx("span",{className:"font-medium",children:a(`escalation.triggerTypes.${n.triggerType}`)}),n.isSystemDefault?e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]",children:a("escalation.scope.system")}):e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)]",children:a("escalation.scope.tenant")})]}),e.jsxs("div",{className:"text-sm text-[var(--text-secondary)]",children:[e.jsx(i.Clock,{className:"w-4 h-4 inline mr-1"}),S(n.delayAfterBreachMinutes)]}),e.jsxs("div",{className:"text-sm text-[var(--text-secondary)]",children:[e.jsx(i.Bell,{className:"w-4 h-4 inline mr-1"}),B(n.notifyRoleId)]}),!n.isActive&&e.jsx("span",{className:"text-xs px-2 py-0.5 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)]",children:a("escalation.disabled")})]}),e.jsxs("button",{onClick:()=>A(n),className:"btn btn-secondary btn-sm flex items-center gap-1",children:[e.jsx(i.Edit,{className:"w-4 h-4"}),a("common:actions.edit")]})]})},n.id)})})]},s))}),e.jsxs("div",{className:"card p-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:a("escalation.howItWorks.title")}),e.jsx("div",{className:"space-y-4 text-sm text-[var(--text-secondary)]",children:[1,2,3,4].map(s=>e.jsxs("div",{className:"flex gap-3",children:[e.jsx("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",children:s}),e.jsx("p",{children:a(`escalation.howItWorks.step${s}`)})]},s))})]})]})]})}exports.EscalationConfigPage=T;
2
+ //# sourceMappingURL=EscalationConfigPage-DNAqMRxA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EscalationConfigPage-Bcifnt_h.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","t","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","a","b","levelRules","TriggerIcon","isEditing","e","role","X","Check","Edit","step"],"mappings":"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"}
1
+ {"version":3,"file":"EscalationConfigPage-DNAqMRxA.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","t","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","a","b","levelRules","TriggerIcon","isEditing","e","role","X","Check","Edit","step"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { useState as n } from "react";
3
3
  import { useNavigate as E } from "react-router-dom";
4
4
  import { useTranslation as S } from "react-i18next";
5
5
  import { CheckCircle as b, Lock as T, AlertTriangle as F, EyeOff as x, Eye as p, Loader2 as L } from "lucide-react";
6
- import { c as $ } from "./index-Cq80YBne.js";
6
+ import { c as $ } from "./index-CBtjGPod.js";
7
7
  function Y() {
8
8
  const { t: r } = S(), P = E(), [l, y] = n(""), [o, N] = n(""), [d, C] = n(""), [c, k] = n(!1), [i, v] = n(!1), [u, g] = n(!1), [m, h] = n(null), [q, A] = n(!1), R = ((a) => {
9
9
  const t = [];
@@ -137,4 +137,4 @@ function Y() {
137
137
  export {
138
138
  Y as ForceChangePasswordPage
139
139
  };
140
- //# sourceMappingURL=ForceChangePasswordPage-CBaMV_PS.js.map
140
+ //# sourceMappingURL=ForceChangePasswordPage-BURE_vNg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForceChangePasswordPage-CBaMV_PS.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(t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'));\r\n if (!/[A-Z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'));\r\n if (!/[a-z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'));\r\n if (!/[0-9]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number'));\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(t('common:errors.generic', 'An error occurred. Please try again.'));\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 {t('auth.forceChangePasswordPage.successTitle', 'Password Changed')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('auth.forceChangePasswordPage.successMessage', 'You will be redirected to home...')}\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.forceChangePasswordPage.title', 'Password Change Required')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePasswordPage.description', 'For security reasons, you must set a new password.')}\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.forceChangePasswordPage.currentPassword', 'Current Password')}\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={t('auth.forceChangePasswordPage.currentPasswordPlaceholder', 'Enter the password provided by the administrator')}\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.forceChangePasswordPage.newPassword', 'New Password')}\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={t('auth.forceChangePasswordPage.newPasswordPlaceholder', 'Choose a new password')}\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 {[\r\n t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number')\r\n ].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.forceChangePasswordPage.confirmPassword', 'Confirm Password')}\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={t('auth.forceChangePasswordPage.confirmPasswordPlaceholder', 'Confirm your new password')}\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">{t('auth.forceChangePasswordPage.passwordMismatch', 'Passwords do not match')}</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>{t('auth.forceChangePasswordPage.submitting', 'Changing...')}</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePasswordPage.submitButton', 'Change Password')}</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-BURE_vNg.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(t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'));\r\n if (!/[A-Z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'));\r\n if (!/[a-z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'));\r\n if (!/[0-9]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number'));\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(t('common:errors.generic', 'An error occurred. Please try again.'));\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 {t('auth.forceChangePasswordPage.successTitle', 'Password Changed')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('auth.forceChangePasswordPage.successMessage', 'You will be redirected to home...')}\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.forceChangePasswordPage.title', 'Password Change Required')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePasswordPage.description', 'For security reasons, you must set a new password.')}\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.forceChangePasswordPage.currentPassword', 'Current Password')}\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={t('auth.forceChangePasswordPage.currentPasswordPlaceholder', 'Enter the password provided by the administrator')}\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.forceChangePasswordPage.newPassword', 'New Password')}\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={t('auth.forceChangePasswordPage.newPasswordPlaceholder', 'Choose a new password')}\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 {[\r\n t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number')\r\n ].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.forceChangePasswordPage.confirmPassword', 'Confirm Password')}\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={t('auth.forceChangePasswordPage.confirmPasswordPlaceholder', 'Confirm your new password')}\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">{t('auth.forceChangePasswordPage.passwordMismatch', 'Passwords do not match')}</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>{t('auth.forceChangePasswordPage.submitting', 'Changing...')}</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePasswordPage.submitButton', 'Change Password')}</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":";;;;;;AAOO,SAASA,IAAwC;AACtD,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAWC,EAAA,GAEX,CAACC,GAAiBC,CAAkB,IAAIC,EAAS,EAAE,GACnD,CAACC,GAAaC,CAAc,IAAIF,EAAS,EAAE,GAC3C,CAACG,GAAiBC,CAAkB,IAAIJ,EAAS,EAAE,GACnD,CAACK,GAAqBC,CAAsB,IAAIN,EAAS,EAAK,GAC9D,CAACO,GAAiBC,CAAkB,IAAIR,EAAS,EAAK,GACtD,CAACS,GAASC,CAAU,IAAIV,EAAS,EAAK,GACtC,CAACW,GAAOC,CAAQ,IAAIZ,EAAwB,IAAI,GAChD,CAACa,GAASC,CAAU,IAAId,EAAS,EAAK,GAWtCe,KATmB,CAACC,MAA+B;AACvD,UAAMC,IAAmB,CAAA;AACzB,WAAID,EAAS,SAAS,KAAGC,EAAO,KAAKvB,EAAE,uDAAuD,uBAAuB,CAAC,GACjH,QAAQ,KAAKsB,CAAQ,OAAU,KAAKtB,EAAE,uDAAuD,+BAA+B,CAAC,GAC7H,QAAQ,KAAKsB,CAAQ,OAAU,KAAKtB,EAAE,uDAAuD,+BAA+B,CAAC,GAC7H,QAAQ,KAAKsB,CAAQ,OAAU,KAAKtB,EAAE,uDAAuD,qBAAqB,CAAC,GACjHuB;AAAA,EACT,GAEwChB,CAAW,GAC7CiB,IAAUjB,MAAgBE,KAAmBY,EAAe,WAAW,KAAKjB,EAAgB,SAAS,GAErGqB,IAAe,OAAOC,MAAuB;AAEjD,QADAA,EAAE,eAAA,GACE,EAACF,GAEL;AAAA,MAAAR,EAAW,EAAI,GACfE,EAAS,IAAI;AAEb,UAAI;AACF,cAAMS,EAAQ,eAAevB,GAAiBG,CAAW,GACzDa,EAAW,EAAI,GACf,WAAW,MAAM;AACf,UAAAlB,EAAS,GAAG;AAAA,QACd,GAAG,GAAI;AAAA,MACT,SAAS0B,GAAc;AACrB,QAAIA,aAAe,QACjBV,EAASU,EAAI,OAAO,IAEpBV,EAASlB,EAAE,yBAAyB,sCAAsC,CAAC;AAAA,MAE/E,UAAA;AACE,QAAAgB,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF;AAEA,SAAIG,sBAEC,OAAA,EAAI,WAAU,sIACb,UAAA,gBAAAU,EAAC,OAAA,EAAI,WAAU,mFACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAI,WAAU,0GACb,4BAACC,GAAA,EAAY,WAAU,8CAA6C,EAAA,CACtE;AAAA,sBACC,MAAA,EAAG,WAAU,yDACX,UAAA/B,EAAE,6CAA6C,kBAAkB,GACpE;AAAA,sBACC,KAAA,EAAE,WAAU,oCACV,UAAAA,EAAE,+CAA+C,mCAAmC,EAAA,CACvF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,IAKF,gBAAA8B,EAAC,OAAA,EAAI,WAAU,sIACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,uDAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAI,WAAU,0GACb,4BAACE,GAAA,EAAK,WAAU,8CAA6C,EAAA,CAC/D;AAAA,wBACC,MAAA,EAAG,WAAU,oDACX,UAAAhC,EAAE,sCAAsC,0BAA0B,GACrE;AAAA,wBACC,KAAA,EAAE,WAAU,yCACV,UAAAA,EAAE,4CAA4C,oDAAoD,EAAA,CACrG;AAAA,IAAA,GACF;AAAA,IAGCiB,KACC,gBAAAY,EAAC,OAAA,EAAI,WAAU,4GACb,UAAA;AAAA,MAAA,gBAAAC,EAACG,GAAA,EAAc,WAAU,wBAAA,CAAwB;AAAA,MACjD,gBAAAH,EAAC,UAAM,UAAAb,EAAA,CAAM;AAAA,IAAA,GACf;AAAA,IAIF,gBAAAY,EAAC,QAAA,EAAK,UAAUJ,GAAc,WAAU,aAEtC,UAAA;AAAA,MAAA,gBAAAI,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAC,EAAC,WAAM,WAAU,mEACd,UAAA9B,EAAE,gDAAgD,kBAAkB,GACvE;AAAA,QACA,gBAAA6B,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAMnB,IAAsB,SAAS;AAAA,cACrC,UAAQ;AAAA,cACR,OAAOP;AAAA,cACP,UAAU,CAAAsB,MAAKrB,EAAmBqB,EAAE,OAAO,KAAK;AAAA,cAChD,WAAU;AAAA,cACV,aAAa1B,EAAE,2DAA2D,kDAAkD;AAAA,YAAA;AAAA,UAAA;AAAA,UAE9H,gBAAA8B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMlB,EAAuB,CAACD,CAAmB;AAAA,cAC1D,WAAU;AAAA,cAET,UAAAA,sBAAuBuB,GAAA,EAAO,WAAU,WAAU,IAAK,gBAAAJ,EAACK,GAAA,EAAI,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACnF,EAAA,CACF;AAAA,MAAA,GACF;AAAA,wBAGC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAL,EAAC,WAAM,WAAU,mEACd,UAAA9B,EAAE,4CAA4C,cAAc,GAC/D;AAAA,QACA,gBAAA6B,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAMjB,IAAkB,SAAS;AAAA,cACjC,UAAQ;AAAA,cACR,OAAON;AAAA,cACP,UAAU,CAAAmB,MAAKlB,EAAekB,EAAE,OAAO,KAAK;AAAA,cAC5C,WAAU;AAAA,cACV,aAAa1B,EAAE,uDAAuD,uBAAuB;AAAA,YAAA;AAAA,UAAA;AAAA,UAE/F,gBAAA8B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMhB,EAAmB,CAACD,CAAe;AAAA,cAClD,WAAU;AAAA,cAET,UAAAA,sBAAmBqB,GAAA,EAAO,WAAU,WAAU,IAAK,gBAAAJ,EAACK,GAAA,EAAI,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QAC/E,GACF;AAAA,QAGC5B,KACC,gBAAAuB,EAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,UACC9B,EAAE,uDAAuD,uBAAuB;AAAA,UAChFA,EAAE,uDAAuD,+BAA+B;AAAA,UACxFA,EAAE,uDAAuD,+BAA+B;AAAA,UACxFA,EAAE,uDAAuD,qBAAqB;AAAA,QAAA,EAC9E,IAAI,CAACoC,GAAKC,MAAM;AAChB,gBAAMC,IAAS;AAAA,YACb/B,EAAY,UAAU;AAAA,YACtB,QAAQ,KAAKA,CAAW;AAAA,YACxB,QAAQ,KAAKA,CAAW;AAAA,YACxB,QAAQ,KAAKA,CAAW;AAAA,UAAA;AAE1B,iBACE,gBAAAsB,EAAC,SAAyB,WAAW,mCAAmCS,EAAOD,CAAC,IAAI,mBAAmB,eAAe,IACnH,UAAA;AAAA,YAAAC,EAAOD,CAAC,IAAI,gBAAAP,EAACC,GAAA,EAAY,WAAU,WAAU,IAAK,gBAAAD,EAAC,OAAA,EAAI,WAAU,6CAAA,CAA6C;AAAA,YAC9GM;AAAA,UAAA,EAAA,GAFO,WAAWC,CAAC,EAGtB;AAAA,QAEJ,CAAC,EAAA,CACH;AAAA,MAAA,GAEJ;AAAA,wBAGC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAP,EAAC,WAAM,WAAU,mEACd,UAAA9B,EAAE,gDAAgD,kBAAkB,GACvE;AAAA,QACA,gBAAA8B;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAQ;AAAA,YACR,OAAOrB;AAAA,YACP,UAAU,CAAAiB,MAAKhB,EAAmBgB,EAAE,OAAO,KAAK;AAAA,YAChD,WAAW,sCACTjB,KAAmBA,MAAoBF,IACnC,sCACA,0DACN;AAAA,YACA,aAAaP,EAAE,2DAA2D,2BAA2B;AAAA,UAAA;AAAA,QAAA;AAAA,QAEtGS,KAAmBA,MAAoBF,KACtC,gBAAAuB,EAAC,KAAA,EAAE,WAAU,6BAA6B,UAAA9B,EAAE,iDAAiD,wBAAwB,EAAA,CAAE;AAAA,MAAA,GAE3H;AAAA,MAGA,gBAAA8B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,CAACN,KAAWT;AAAA,UACtB,WAAU;AAAA,UAET,cACC,gBAAAc,EAAAU,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAT,EAACU,GAAA,EAAQ,WAAU,uBAAA,CAAuB;AAAA,YAC1C,gBAAAV,EAAC,QAAA,EAAM,UAAA9B,EAAE,2CAA2C,aAAa,EAAA,CAAE;AAAA,UAAA,GACrE,IAEA,gBAAA8B,EAAC,QAAA,EAAM,UAAA9B,EAAE,6CAA6C,iBAAiB,EAAA,CAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAE7E,EAAA,CACF;AAAA,EAAA,EAAA,CACF,GACF,GACF;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),q=require("react-router-dom"),S=require("react-i18next"),o=require("lucide-react"),A=require("./index-XOOiD_zY.js");function R(){const{t:s}=S.useTranslation(),f=q.useNavigate(),[c,b]=n.useState(""),[t,P]=n.useState(""),[d,y]=n.useState(""),[l,p]=n.useState(!1),[i,j]=n.useState(!1),[g,h]=n.useState(!1),[m,u]=n.useState(null),[C,N]=n.useState(!1),k=(r=>{const a=[];return r.length<8&&a.push(s("auth.forceChangePasswordPage.passwordRequirements_1","At least 8 characters")),/[A-Z]/.test(r)||a.push(s("auth.forceChangePasswordPage.passwordRequirements_2","At least one uppercase letter")),/[a-z]/.test(r)||a.push(s("auth.forceChangePasswordPage.passwordRequirements_3","At least one lowercase letter")),/[0-9]/.test(r)||a.push(s("auth.forceChangePasswordPage.passwordRequirements_4","At least one number")),a})(t),x=t===d&&k.length===0&&c.length>0,v=async r=>{if(r.preventDefault(),!!x){h(!0),u(null);try{await A.authApi.changePassword(c,t),N(!0),setTimeout(()=>{f("/")},2e3)}catch(a){a instanceof Error?u(a.message):u(s("common:errors.generic","An error occurred. Please try again."))}finally{h(!1)}}};return C?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(o.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:s("auth.forceChangePasswordPage.successTitle","Password Changed")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:s("auth.forceChangePasswordPage.successMessage","You will be redirected to home...")})]})}):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(o.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:s("auth.forceChangePasswordPage.title","Password Change Required")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:s("auth.forceChangePasswordPage.description","For security reasons, you must set a new password.")})]}),m&&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(o.AlertTriangle,{className:"w-5 h-5 flex-shrink-0"}),e.jsx("span",{children:m})]}),e.jsxs("form",{onSubmit:v,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:s("auth.forceChangePasswordPage.currentPassword","Current Password")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:l?"text":"password",required:!0,value:c,onChange:r=>b(r.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:s("auth.forceChangePasswordPage.currentPasswordPlaceholder","Enter the password provided by the administrator")}),e.jsx("button",{type:"button",onClick:()=>p(!l),className:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300",children:l?e.jsx(o.EyeOff,{className:"w-5 h-5"}):e.jsx(o.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:s("auth.forceChangePasswordPage.newPassword","New Password")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:i?"text":"password",required:!0,value:t,onChange:r=>P(r.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:s("auth.forceChangePasswordPage.newPasswordPlaceholder","Choose a new password")}),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(o.EyeOff,{className:"w-5 h-5"}):e.jsx(o.Eye,{className:"w-5 h-5"})})]}),t&&e.jsx("div",{className:"mt-2 space-y-1",children:[s("auth.forceChangePasswordPage.passwordRequirements_1","At least 8 characters"),s("auth.forceChangePasswordPage.passwordRequirements_2","At least one uppercase letter"),s("auth.forceChangePasswordPage.passwordRequirements_3","At least one lowercase letter"),s("auth.forceChangePasswordPage.passwordRequirements_4","At least one number")].map((r,a)=>{const w=[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 ${w[a]?"text-green-600":"text-gray-500"}`,children:[w[a]?e.jsx(o.CheckCircle,{className:"w-4 h-4"}):e.jsx("div",{className:"w-4 h-4 rounded-full border border-current"}),r]},`pwd-req-${a}`)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:s("auth.forceChangePasswordPage.confirmPassword","Confirm Password")}),e.jsx("input",{type:"password",required:!0,value:d,onChange:r=>y(r.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:s("auth.forceChangePasswordPage.confirmPasswordPlaceholder","Confirm your new password")}),d&&d!==t&&e.jsx("p",{className:"mt-1 text-sm text-red-600",children:s("auth.forceChangePasswordPage.passwordMismatch","Passwords do not match")})]}),e.jsx("button",{type:"submit",disabled:!x||g,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:g?e.jsxs(e.Fragment,{children:[e.jsx(o.Loader2,{className:"w-5 h-5 animate-spin"}),e.jsx("span",{children:s("auth.forceChangePasswordPage.submitting","Changing...")})]}):e.jsx("span",{children:s("auth.forceChangePasswordPage.submitButton","Change Password")})})]})]})})})}exports.ForceChangePasswordPage=R;
2
- //# sourceMappingURL=ForceChangePasswordPage-ClDXluX1.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),q=require("react-router-dom"),S=require("react-i18next"),o=require("lucide-react"),A=require("./index-BDRogQH_.js");function R(){const{t:s}=S.useTranslation(),f=q.useNavigate(),[c,b]=n.useState(""),[t,P]=n.useState(""),[d,y]=n.useState(""),[l,p]=n.useState(!1),[i,j]=n.useState(!1),[g,h]=n.useState(!1),[m,u]=n.useState(null),[C,N]=n.useState(!1),k=(r=>{const a=[];return r.length<8&&a.push(s("auth.forceChangePasswordPage.passwordRequirements_1","At least 8 characters")),/[A-Z]/.test(r)||a.push(s("auth.forceChangePasswordPage.passwordRequirements_2","At least one uppercase letter")),/[a-z]/.test(r)||a.push(s("auth.forceChangePasswordPage.passwordRequirements_3","At least one lowercase letter")),/[0-9]/.test(r)||a.push(s("auth.forceChangePasswordPage.passwordRequirements_4","At least one number")),a})(t),x=t===d&&k.length===0&&c.length>0,v=async r=>{if(r.preventDefault(),!!x){h(!0),u(null);try{await A.authApi.changePassword(c,t),N(!0),setTimeout(()=>{f("/")},2e3)}catch(a){a instanceof Error?u(a.message):u(s("common:errors.generic","An error occurred. Please try again."))}finally{h(!1)}}};return C?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(o.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:s("auth.forceChangePasswordPage.successTitle","Password Changed")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:s("auth.forceChangePasswordPage.successMessage","You will be redirected to home...")})]})}):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(o.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:s("auth.forceChangePasswordPage.title","Password Change Required")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:s("auth.forceChangePasswordPage.description","For security reasons, you must set a new password.")})]}),m&&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(o.AlertTriangle,{className:"w-5 h-5 flex-shrink-0"}),e.jsx("span",{children:m})]}),e.jsxs("form",{onSubmit:v,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:s("auth.forceChangePasswordPage.currentPassword","Current Password")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:l?"text":"password",required:!0,value:c,onChange:r=>b(r.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:s("auth.forceChangePasswordPage.currentPasswordPlaceholder","Enter the password provided by the administrator")}),e.jsx("button",{type:"button",onClick:()=>p(!l),className:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300",children:l?e.jsx(o.EyeOff,{className:"w-5 h-5"}):e.jsx(o.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:s("auth.forceChangePasswordPage.newPassword","New Password")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:i?"text":"password",required:!0,value:t,onChange:r=>P(r.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:s("auth.forceChangePasswordPage.newPasswordPlaceholder","Choose a new password")}),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(o.EyeOff,{className:"w-5 h-5"}):e.jsx(o.Eye,{className:"w-5 h-5"})})]}),t&&e.jsx("div",{className:"mt-2 space-y-1",children:[s("auth.forceChangePasswordPage.passwordRequirements_1","At least 8 characters"),s("auth.forceChangePasswordPage.passwordRequirements_2","At least one uppercase letter"),s("auth.forceChangePasswordPage.passwordRequirements_3","At least one lowercase letter"),s("auth.forceChangePasswordPage.passwordRequirements_4","At least one number")].map((r,a)=>{const w=[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 ${w[a]?"text-green-600":"text-gray-500"}`,children:[w[a]?e.jsx(o.CheckCircle,{className:"w-4 h-4"}):e.jsx("div",{className:"w-4 h-4 rounded-full border border-current"}),r]},`pwd-req-${a}`)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:s("auth.forceChangePasswordPage.confirmPassword","Confirm Password")}),e.jsx("input",{type:"password",required:!0,value:d,onChange:r=>y(r.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:s("auth.forceChangePasswordPage.confirmPasswordPlaceholder","Confirm your new password")}),d&&d!==t&&e.jsx("p",{className:"mt-1 text-sm text-red-600",children:s("auth.forceChangePasswordPage.passwordMismatch","Passwords do not match")})]}),e.jsx("button",{type:"submit",disabled:!x||g,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:g?e.jsxs(e.Fragment,{children:[e.jsx(o.Loader2,{className:"w-5 h-5 animate-spin"}),e.jsx("span",{children:s("auth.forceChangePasswordPage.submitting","Changing...")})]}):e.jsx("span",{children:s("auth.forceChangePasswordPage.submitButton","Change Password")})})]})]})})})}exports.ForceChangePasswordPage=R;
2
+ //# sourceMappingURL=ForceChangePasswordPage-C6jDZshk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForceChangePasswordPage-ClDXluX1.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(t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'));\r\n if (!/[A-Z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'));\r\n if (!/[a-z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'));\r\n if (!/[0-9]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number'));\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(t('common:errors.generic', 'An error occurred. Please try again.'));\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 {t('auth.forceChangePasswordPage.successTitle', 'Password Changed')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('auth.forceChangePasswordPage.successMessage', 'You will be redirected to home...')}\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.forceChangePasswordPage.title', 'Password Change Required')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePasswordPage.description', 'For security reasons, you must set a new password.')}\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.forceChangePasswordPage.currentPassword', 'Current Password')}\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={t('auth.forceChangePasswordPage.currentPasswordPlaceholder', 'Enter the password provided by the administrator')}\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.forceChangePasswordPage.newPassword', 'New Password')}\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={t('auth.forceChangePasswordPage.newPasswordPlaceholder', 'Choose a new password')}\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 {[\r\n t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number')\r\n ].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.forceChangePasswordPage.confirmPassword', 'Confirm Password')}\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={t('auth.forceChangePasswordPage.confirmPasswordPlaceholder', 'Confirm your new password')}\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">{t('auth.forceChangePasswordPage.passwordMismatch', 'Passwords do not match')}</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>{t('auth.forceChangePasswordPage.submitting', 'Changing...')}</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePasswordPage.submitButton', 'Change Password')}</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-C6jDZshk.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(t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'));\r\n if (!/[A-Z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'));\r\n if (!/[a-z]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'));\r\n if (!/[0-9]/.test(password)) errors.push(t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number'));\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(t('common:errors.generic', 'An error occurred. Please try again.'));\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 {t('auth.forceChangePasswordPage.successTitle', 'Password Changed')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('auth.forceChangePasswordPage.successMessage', 'You will be redirected to home...')}\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.forceChangePasswordPage.title', 'Password Change Required')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePasswordPage.description', 'For security reasons, you must set a new password.')}\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.forceChangePasswordPage.currentPassword', 'Current Password')}\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={t('auth.forceChangePasswordPage.currentPasswordPlaceholder', 'Enter the password provided by the administrator')}\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.forceChangePasswordPage.newPassword', 'New Password')}\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={t('auth.forceChangePasswordPage.newPasswordPlaceholder', 'Choose a new password')}\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 {[\r\n t('auth.forceChangePasswordPage.passwordRequirements_1', 'At least 8 characters'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_2', 'At least one uppercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_3', 'At least one lowercase letter'),\r\n t('auth.forceChangePasswordPage.passwordRequirements_4', 'At least one number')\r\n ].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.forceChangePasswordPage.confirmPassword', 'Confirm Password')}\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={t('auth.forceChangePasswordPage.confirmPasswordPlaceholder', 'Confirm your new password')}\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">{t('auth.forceChangePasswordPage.passwordMismatch', 'Passwords do not match')}</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>{t('auth.forceChangePasswordPage.submitting', 'Changing...')}</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePasswordPage.submitButton', 'Change Password')}</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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"}
@@ -3,7 +3,7 @@ import { useState as a } from "react";
3
3
  import { useTranslation as x } from "react-i18next";
4
4
  import { Link as p } from "react-router-dom";
5
5
  import { Mail as m, AlertCircle as y, Loader2 as w, CheckCircle2 as N, ArrowLeft as k } from "lucide-react";
6
- import { T as P, c as v } from "./index-Cq80YBne.js";
6
+ import { T as P, c as v } from "./index-CBtjGPod.js";
7
7
  function E() {
8
8
  const { t: r } = x("auth"), [s, g] = a(""), [l, i] = a(!1), [d, c] = a(null), [u, h] = a(!1), b = async (o) => {
9
9
  o.preventDefault(), c(null), i(!0);
@@ -85,4 +85,4 @@ function E() {
85
85
  export {
86
86
  E as ForgotPasswordPage
87
87
  };
88
- //# sourceMappingURL=ForgotPasswordPage--ueWRNSO.js.map
88
+ //# sourceMappingURL=ForgotPasswordPage-C5HLYbz4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForgotPasswordPage--ueWRNSO.js","sources":["../../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\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 { t } = useTranslation('auth');\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 || t('common:error'));\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 {t('forgotPasswordPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('forgotPasswordPage.description')}\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 {t('forgotPasswordPage.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={t('forgotPasswordPage.emailPlaceholder')}\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 {t('forgotPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('forgotPasswordPage.submitButton')\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 {t('forgotPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('forgotPasswordPage.successMessage', { email })}\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n {t('forgotPasswordPage.checkSpam')}\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 {t('forgotPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","t","useTranslation","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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"}
1
+ {"version":3,"file":"ForgotPasswordPage-C5HLYbz4.js","sources":["../../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\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 { t } = useTranslation('auth');\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 || t('common:error'));\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 {t('forgotPasswordPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('forgotPasswordPage.description')}\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 {t('forgotPasswordPage.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={t('forgotPasswordPage.emailPlaceholder')}\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 {t('forgotPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('forgotPasswordPage.submitButton')\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 {t('forgotPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('forgotPasswordPage.successMessage', { email })}\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n {t('forgotPasswordPage.checkSpam')}\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 {t('forgotPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","t","useTranslation","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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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),s=require("react"),b=require("react-i18next"),f=require("react-router-dom"),t=require("lucide-react"),n=require("./index-XOOiD_zY.js");function j(){const{t:r}=b.useTranslation("auth"),[a,m]=s.useState(""),[l,i]=s.useState(!1),[d,c]=s.useState(null),[g,x]=s.useState(!1),u=async o=>{o.preventDefault(),c(null),i(!0);try{await n.authApi.forgotPassword(a),x(!0)}catch(h){c(h?.message||r("common:error"))}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(n.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[g?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(t.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:r("forgotPasswordPage.successTitle")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:r("forgotPasswordPage.successMessage",{email:a})}),e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:r("forgotPasswordPage.checkSpam")})]}):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(t.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:r("forgotPasswordPage.pageTitle")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:r("forgotPasswordPage.description")})]}),d&&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(t.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:d})]}),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:r("forgotPasswordPage.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(t.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"email",type:"email",value:a,onChange:o=>m(o.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:r("forgotPasswordPage.emailPlaceholder"),required:!0,autoComplete:"email",disabled:l})]})]}),e.jsx("button",{type:"submit",disabled:l,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:l?e.jsxs(e.Fragment,{children:[e.jsx(t.Loader2,{className:"h-5 w-5 animate-spin"}),r("forgotPasswordPage.submitting")]}):r("forgotPasswordPage.submitButton")})]})]}),e.jsx("div",{className:"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700",children:e.jsxs(f.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(t.ArrowLeft,{className:"w-4 h-4"}),r("forgotPasswordPage.backToLogin")]})})]})]})})}exports.ForgotPasswordPage=j;
2
- //# sourceMappingURL=ForgotPasswordPage-CzpAkP5R.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),s=require("react"),b=require("react-i18next"),f=require("react-router-dom"),t=require("lucide-react"),n=require("./index-BDRogQH_.js");function j(){const{t:r}=b.useTranslation("auth"),[a,m]=s.useState(""),[l,i]=s.useState(!1),[d,c]=s.useState(null),[g,x]=s.useState(!1),u=async o=>{o.preventDefault(),c(null),i(!0);try{await n.authApi.forgotPassword(a),x(!0)}catch(h){c(h?.message||r("common:error"))}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(n.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[g?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(t.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:r("forgotPasswordPage.successTitle")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:r("forgotPasswordPage.successMessage",{email:a})}),e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:r("forgotPasswordPage.checkSpam")})]}):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(t.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:r("forgotPasswordPage.pageTitle")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:r("forgotPasswordPage.description")})]}),d&&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(t.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:d})]}),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:r("forgotPasswordPage.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(t.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"email",type:"email",value:a,onChange:o=>m(o.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:r("forgotPasswordPage.emailPlaceholder"),required:!0,autoComplete:"email",disabled:l})]})]}),e.jsx("button",{type:"submit",disabled:l,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:l?e.jsxs(e.Fragment,{children:[e.jsx(t.Loader2,{className:"h-5 w-5 animate-spin"}),r("forgotPasswordPage.submitting")]}):r("forgotPasswordPage.submitButton")})]})]}),e.jsx("div",{className:"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700",children:e.jsxs(f.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(t.ArrowLeft,{className:"w-4 h-4"}),r("forgotPasswordPage.backToLogin")]})})]})]})})}exports.ForgotPasswordPage=j;
2
+ //# sourceMappingURL=ForgotPasswordPage-D3ZQBtjd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForgotPasswordPage-CzpAkP5R.js","sources":["../../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\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 { t } = useTranslation('auth');\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 || t('common:error'));\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 {t('forgotPasswordPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('forgotPasswordPage.description')}\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 {t('forgotPasswordPage.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={t('forgotPasswordPage.emailPlaceholder')}\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 {t('forgotPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('forgotPasswordPage.submitButton')\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 {t('forgotPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('forgotPasswordPage.successMessage', { email })}\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n {t('forgotPasswordPage.checkSpam')}\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 {t('forgotPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","t","useTranslation","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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"}
1
+ {"version":3,"file":"ForgotPasswordPage-D3ZQBtjd.js","sources":["../../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\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 { t } = useTranslation('auth');\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 || t('common:error'));\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 {t('forgotPasswordPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('forgotPasswordPage.description')}\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 {t('forgotPasswordPage.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={t('forgotPasswordPage.emailPlaceholder')}\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 {t('forgotPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('forgotPasswordPage.submitButton')\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 {t('forgotPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('forgotPasswordPage.successMessage', { email })}\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n {t('forgotPasswordPage.checkSpam')}\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 {t('forgotPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","t","useTranslation","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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"}
@@ -4,11 +4,11 @@ import { useNavigate as We, Link as Ie, useParams as wt } from "react-router-dom
4
4
  import { useTranslation as he } from "react-i18next";
5
5
  import * as Ct from "lucide-react";
6
6
  import { AlertCircle as Me, X as ue, Search as ve, ChevronDown as De, Plus as ce, Loader2 as Z, Globe as $e, Building2 as ge, Trash2 as Ne, GitMerge as Ze, Filter as At, RefreshCw as Ye, LayoutGrid as at, LayoutList as kt, AlertTriangle as Re, CheckCircle as Fe, GitBranch as pe, Link as St, Check as Be, Users as xe, Table as It, Info as st, Shield as be, Star as ze, Eye as qe, Ban as Rt, ChevronRight as Ve, FolderOpen as Tt, UserCheck as Pt, User as nt, Box as Gt, Play as Ft, UserPlus as Mt, Edit as $t, Database as jt, FileText as Lt, Boxes as Et, Layers as Dt, Key as ot, ArrowRightLeft as et, AppWindow as Bt, ArrowLeft as Wt, Cloud as tt, Edit3 as lt, Save as Ot, Mail as Ut, CornerDownRight as zt, Unlink as rt } from "lucide-react";
7
- import { g as V, c as _t } from "./groupsApi-CyqyYsmi.js";
8
- import { k as ye, w as qt, s as Vt, v as Qt, a as it, B as Ht } from "./index-Cq80YBne.js";
7
+ import { g as V, c as _t } from "./groupsApi-CBI5vMLa.js";
8
+ import { k as ye, w as qt, s as Vt, v as Qt, a as it, B as Ht } from "./index-CBtjGPod.js";
9
9
  import { g as ct } from "./roleUtils-DlOIxLsd.js";
10
- import { T as Kt, u as Yt } from "./TenantScopeSelector-CU5z5PJH.js";
11
- import { u as Xt, a as Le, g as Ee } from "./tenantIconMap-DBa5MjIz.js";
10
+ import { T as Kt, u as Yt } from "./TenantScopeSelector-CEFgxiWt.js";
11
+ import { u as Xt, a as Le, g as Ee } from "./tenantIconMap-DinwojNW.js";
12
12
  import { c as Jt, g as Zt, a as er, b as tr, P as rr, d as ar } from "./PermissionPopover-CzuQmLbY.js";
13
13
  import { u as sr } from "./useTabNavigation-Bsbskz0i.js";
14
14
  const Qe = {
@@ -2970,4 +2970,4 @@ function Br() {
2970
2970
  export {
2971
2971
  Br as GroupDetailPage
2972
2972
  };
2973
- //# sourceMappingURL=GroupDetailPage-dXNOoSXE.js.map
2973
+ //# sourceMappingURL=GroupDetailPage-CTuzp9Vp.js.map