@atlashub/smartstack 3.21.0 → 3.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RolesPage-Cb8joqdJ.js","sources":["../../src/pages/platform/administration/permissions/RolesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, MoreHorizontal, X, Loader2, Users, Shield, Eye, Crown, UserCog, PenTool, Sparkles, Filter, AppWindow, ChevronDown } from 'lucide-react';\r\nimport { adminApi, type RoleListDto, type PermissionListDto, type CreateRoleRequest, type UpdateRoleRequest, type RoleCategory } from '@/services/api/adminApi';\r\nimport { Slot } from '@/extensions';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nconst ALL_CATEGORIES: RoleCategory[] = ['Global', 'Admin', 'Manager', 'Contributor', 'Viewer', 'Custom'];\r\n\r\nconst CATEGORY_CONFIG: Record<RoleCategory, { icon: React.ElementType; color: string; bgColor: string; borderColor: string }> = {\r\n Global: {\r\n icon: Crown,\r\n color: 'text-purple-600 dark:text-purple-400',\r\n bgColor: 'bg-purple-50 dark:bg-purple-900/20',\r\n borderColor: 'border-purple-200 dark:border-purple-800'\r\n },\r\n Admin: {\r\n icon: Shield,\r\n color: 'text-red-600 dark:text-red-400',\r\n bgColor: 'bg-red-50 dark:bg-red-900/20',\r\n borderColor: 'border-red-200 dark:border-red-800'\r\n },\r\n Manager: {\r\n icon: UserCog,\r\n color: 'text-blue-600 dark:text-blue-400',\r\n bgColor: 'bg-blue-50 dark:bg-blue-900/20',\r\n borderColor: 'border-blue-200 dark:border-blue-800'\r\n },\r\n Contributor: {\r\n icon: PenTool,\r\n color: 'text-green-600 dark:text-green-400',\r\n bgColor: 'bg-green-50 dark:bg-green-900/20',\r\n borderColor: 'border-green-200 dark:border-green-800'\r\n },\r\n Viewer: {\r\n icon: Eye,\r\n color: 'text-gray-600 dark:text-gray-400',\r\n bgColor: 'bg-gray-50 dark:bg-gray-900/20',\r\n borderColor: 'border-gray-200 dark:border-gray-700'\r\n },\r\n Custom: {\r\n icon: Sparkles,\r\n color: 'text-orange-600 dark:text-orange-400',\r\n bgColor: 'bg-orange-50 dark:bg-orange-900/20',\r\n borderColor: 'border-orange-200 dark:border-orange-800'\r\n }\r\n};\r\n\r\nexport function RolesPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [permissions, setPermissions] = useState<PermissionListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingRole, setEditingRole] = useState<RoleListDto | null>(null);\r\n const [formData, setFormData] = useState<CreateRoleRequest>({\r\n name: '',\r\n description: '',\r\n permissionIds: []\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n const [filter, setFilter] = useState<'system' | 'custom' | RoleCategory | null>(null);\r\n const [applicationFilter, setApplicationFilter] = useState<string | null>(null);\r\n const [categoryFilter, setCategoryFilter] = useState<RoleCategory | null>(null);\r\n\r\n const loadRoles = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.roles.getAll(search ? { search } : undefined);\r\n setRoles(result);\r\n } catch (err) {\r\n console.error('Failed to load roles:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search]);\r\n\r\n const loadPermissions = async () => {\r\n try {\r\n const result = await adminApi.permissions.getAll();\r\n setPermissions(result);\r\n } catch (err) {\r\n console.error('Failed to load permissions:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRoles();\r\n loadPermissions();\r\n }, [loadRoles]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n loadRoles();\r\n };\r\n\r\n const openCreateModal = () => {\r\n setEditingRole(null);\r\n setFormData({ name: '', description: '', permissionIds: [] });\r\n setError(null);\r\n setShowModal(true);\r\n };\r\n\r\n const openEditModal = async (role: RoleListDto) => {\r\n try {\r\n const detail = await adminApi.roles.getById(role.id);\r\n setEditingRole(role);\r\n setFormData({\r\n name: detail.name,\r\n description: detail.description || '',\r\n parentRoleId: detail.parentRoleId || undefined,\r\n permissionIds: detail.permissions.map(p => p.id)\r\n });\r\n setError(null);\r\n setShowModal(true);\r\n } catch (err) {\r\n console.error('Failed to load role details:', err);\r\n }\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n if (editingRole) {\r\n const updateData: UpdateRoleRequest = {\r\n name: formData.name,\r\n description: formData.description,\r\n parentRoleId: formData.parentRoleId,\r\n permissionIds: formData.permissionIds\r\n };\r\n await adminApi.roles.update(editingRole.id, updateData);\r\n } else {\r\n await adminApi.roles.create(formData);\r\n }\r\n setShowModal(false);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (role: RoleListDto) => {\r\n if (!confirm(t('roles.confirmDelete', { name: role.name }))) return;\r\n\r\n try {\r\n await adminApi.roles.delete(role.id);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n alert(message);\r\n }\r\n setMenuOpen(null);\r\n };\r\n\r\n const handlePermissionToggle = (permissionId: string) => {\r\n setFormData(prev => ({\r\n ...prev,\r\n permissionIds: prev.permissionIds?.includes(permissionId)\r\n ? prev.permissionIds.filter(id => id !== permissionId)\r\n : [...(prev.permissionIds || []), permissionId]\r\n }));\r\n };\r\n\r\n const stats = useMemo(() => {\r\n const systemCount = roles.filter(r => r.isSystem).length;\r\n const customCount = roles.filter(r => !r.isSystem).length;\r\n const totalUsers = roles.reduce((sum, r) => sum + r.usersCount, 0);\r\n const categoryCount = roles.reduce((acc, r) => {\r\n acc[r.category] = (acc[r.category] || 0) + 1;\r\n return acc;\r\n }, {} as Record<string, number>);\r\n return { total: roles.length, systemCount, customCount, totalUsers, categoryCount };\r\n }, [roles]);\r\n\r\n const uniqueApplications = useMemo(() => {\r\n const appMap = new Map<string, string>();\r\n roles.forEach(r => {\r\n if (r.applicationId && r.applicationName) {\r\n appMap.set(r.applicationId, r.applicationName);\r\n }\r\n });\r\n return Array.from(appMap.entries())\r\n .map(([id, name]) => ({ id, name }))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n }, [roles]);\r\n\r\n const filteredRoles = useMemo(() => {\r\n let result = roles;\r\n // System/custom filter (from stats bar)\r\n if (filter === 'system') result = result.filter(r => r.isSystem);\r\n else if (filter === 'custom') result = result.filter(r => !r.isSystem);\r\n else if (filter) result = result.filter(r => r.category === filter);\r\n // Application filter\r\n if (applicationFilter === '__global__') result = result.filter(r => !r.applicationId);\r\n else if (applicationFilter) result = result.filter(r => r.applicationId === applicationFilter);\r\n // Category filter\r\n if (categoryFilter) result = result.filter(r => r.category === categoryFilter);\r\n return result;\r\n }, [roles, filter, applicationFilter, categoryFilter]);\r\n\r\n const hasActiveFilters = filter !== null || applicationFilter !== null || categoryFilter !== null;\r\n\r\n const clearAllFilters = () => {\r\n setFilter(null);\r\n setApplicationFilter(null);\r\n setCategoryFilter(null);\r\n };\r\n\r\n const toggleFilter = (newFilter: 'system' | 'custom' | RoleCategory) => {\r\n setFilter(prev => prev === newFilter ? null : newFilter);\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('roles.title') }\r\n ]}\r\n />\r\n\r\n {/* Header with stats */}\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('roles.title')}</h1>\r\n {!loading && (\r\n <span className=\"px-3 py-1 rounded-full text-sm font-medium bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n {hasActiveFilters ? `${filteredRoles.length} / ${stats.total}` : stats.total} {t('roles.totalLabel')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('roles.list')}</p>\r\n {!loading && stats.total > 0 && (\r\n <div className=\"flex items-center gap-2 mt-3 text-sm\">\r\n <button\r\n onClick={() => toggleFilter('system')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'system'\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)] ring-2 ring-[var(--warning-border)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {stats.systemCount} {t('roles.systemRoles')}\r\n </button>\r\n <button\r\n onClick={() => toggleFilter('custom')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'custom'\r\n ? 'bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] ring-2 ring-[var(--color-accent-300)] dark:ring-[var(--color-accent-700)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Sparkles className=\"w-4 h-4\" />\r\n {stats.customCount} {t('roles.customRoles')}\r\n </button>\r\n <span className=\"flex items-center gap-1.5 px-2.5 py-1 text-[var(--text-tertiary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n {stats.totalUsers} {t('roles.totalUsers')}\r\n </span>\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-full text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n title={t('roles.filters.clearAll')}\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Slot name=\"roles.header.actions\" context={{ roles, reload: loadRoles }} />\r\n <button\r\n onClick={openCreateModal}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roles.create')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Search + Filters */}\r\n <div className=\"flex flex-col gap-3\">\r\n <form onSubmit={handleSearch} className=\"flex gap-2\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search')}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.search')}\r\n </button>\r\n </form>\r\n\r\n {/* Filter bar */}\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <div className=\"flex items-center gap-1.5 text-sm text-[var(--text-tertiary)]\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span>{t('roles.filters.title')}</span>\r\n </div>\r\n\r\n {/* Application filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={applicationFilter ?? ''}\r\n onChange={e => setApplicationFilter(e.target.value || null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allApplications')}</option>\r\n <option value=\"__global__\">{t('roles.filters.globalRoles')}</option>\r\n {uniqueApplications.map(app => (\r\n <option key={app.id} value={app.id}>{app.name}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Category filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={categoryFilter ?? ''}\r\n onChange={e => setCategoryFilter((e.target.value || null) as RoleCategory | null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allCategories')}</option>\r\n {ALL_CATEGORIES.map(cat => (\r\n <option key={cat} value={cat}>{t(`roles.categories.${cat.toLowerCase()}`)}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Clear all filters */}\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 text-sm rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('roles.columns.category')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.columns.application')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden xl:table-cell\">{t('roles.columns.description')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.usersCount')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.permissions')}</th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center\">\r\n <Loader2 className=\"w-6 h-6 animate-spin mx-auto text-[var(--color-accent-500)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center text-[var(--text-secondary)]\">\r\n {hasActiveFilters ? (\r\n <div className=\"space-y-2\">\r\n <p>{t('roles.noRoles')}</p>\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"text-[var(--color-accent-600)] hover:underline\"\r\n >\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n </div>\r\n ) : t('roles.noRoles')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length > 0 && (\r\n filteredRoles.map(role => {\r\n const categoryConfig = CATEGORY_CONFIG[role.category] || CATEGORY_CONFIG.Custom;\r\n const CategoryIcon = categoryConfig.icon;\r\n return (\r\n <tr\r\n key={role.id}\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-9 h-9 rounded-full flex items-center justify-center ${categoryConfig.bgColor} ${categoryConfig.borderColor} border`}>\r\n <CategoryIcon className={`w-4 h-4 ${categoryConfig.color}`} />\r\n </div>\r\n <div>\r\n <div className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{role.name}</div>\r\n {role.isSystem && (\r\n <span className=\"text-xs text-[var(--warning-text)]\">\r\n {t('roles.system')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setCategoryFilter(prev => prev === role.category ? null : role.category); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all ${categoryConfig.bgColor} ${categoryConfig.color} ${categoryConfig.borderColor} hover:ring-2 hover:ring-offset-1 ${categoryFilter === role.category ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <CategoryIcon className=\"w-3.5 h-3.5\" />\r\n {t(`roles.categories.${role.category.toLowerCase()}`)}\r\n </button>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n {role.applicationName ? (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setApplicationFilter(prev => prev === role.applicationId ? null : role.applicationId); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)] hover:ring-2 hover:ring-offset-1 ${applicationFilter === role.applicationId ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <AppWindow className=\"w-3.5 h-3.5\" />\r\n {role.applicationName}\r\n </button>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs text-[var(--text-tertiary)]\">\r\n <Crown className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.globalRoles')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)] max-w-xs truncate hidden xl:table-cell\">{role.description || '-'}</td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.usersCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-center hidden lg:table-cell\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Shield className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.permissionsCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n title={t('users.view')}\r\n >\r\n <Eye className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {!role.isSystem && (\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === role.id ? null : role.id)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === role.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-[var(--radius-menu-item)] border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditModal(role); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n {role.usersCount === 0 && (\r\n <button\r\n onClick={() => handleDelete(role)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--error-text)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-modal)] w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {editingRole ? t('roles.edit') : t('roles.create')}\r\n </h2>\r\n <button onClick={() => setShowModal(false)} className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={e => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('roles.permissions')}\r\n </label>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto p-2 border border-[var(--border-color)] rounded-[var(--radius-card)]\">\r\n {permissions.map(permission => (\r\n <label key={permission.id} className=\"flex items-start gap-2 cursor-pointer p-2 hover:bg-[var(--bg-hover)] rounded-[var(--radius-button)]\">\r\n <input\r\n type=\"checkbox\"\r\n checked={formData.permissionIds?.includes(permission.id) || false}\r\n onChange={() => handlePermissionToggle(permission.id)}\r\n className=\"mt-0.5 rounded border-[var(--border-color)]\"\r\n />\r\n <div>\r\n <div className=\"text-[var(--text-primary)] font-mono text-sm\">{permission.path}</div>\r\n {permission.description && (\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{permission.description}</div>\r\n )}\r\n </div>\r\n </label>\r\n ))}\r\n {permissions.length === 0 && (\r\n <div className=\"text-center py-4 text-[var(--text-secondary)]\">\r\n {t('roles.noPermissions')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Extension form fields slot */}\r\n <Slot\r\n name=\"roles.form.fields.after\"\r\n context={{\r\n formData,\r\n onChange: (field: string, value: unknown) => {\r\n setFormData(prev => ({ ...prev, [field]: value }));\r\n },\r\n disabled: saving,\r\n isEditing: !!editingRole,\r\n role: editingRole,\r\n }}\r\n />\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {editingRole ? t('common.save') : t('common.create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ALL_CATEGORIES","CATEGORY_CONFIG","Crown","Shield","UserCog","PenTool","Eye","Sparkles","RolesPage","t","useTranslation","navigate","useNavigate","roles","setRoles","useState","permissions","setPermissions","loading","setLoading","search","setSearch","showModal","setShowModal","editingRole","setEditingRole","formData","setFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","filter","setFilter","applicationFilter","setApplicationFilter","categoryFilter","setCategoryFilter","loadRoles","useCallback","result","adminApi","err","loadPermissions","useEffect","handleSearch","openCreateModal","openEditModal","role","detail","p","handleSubmit","updateData","message","handleDelete","handlePermissionToggle","permissionId","prev","id","stats","useMemo","systemCount","r","customCount","totalUsers","sum","categoryCount","acc","uniqueApplications","appMap","name","a","b","filteredRoles","hasActiveFilters","clearAllFilters","toggleFilter","newFilter","jsxs","jsx","Breadcrumb","Users","X","Slot","Plus","Search","Filter","app","ChevronDown","cat","Loader2","categoryConfig","CategoryIcon","e","AppWindow","MoreHorizontal","Edit2","Trash2","permission","field","value"],"mappings":"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"}
1
+ {"version":3,"file":"RolesPage-BN8_zMOC.js","sources":["../../src/pages/platform/administration/permissions/RolesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, MoreHorizontal, X, Loader2, Users, Shield, Eye, Crown, UserCog, PenTool, Sparkles, Filter, AppWindow, ChevronDown } from 'lucide-react';\r\nimport { adminApi, type RoleListDto, type PermissionListDto, type CreateRoleRequest, type UpdateRoleRequest, type RoleCategory } from '@/services/api/adminApi';\r\nimport { Slot } from '@/extensions';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nconst ALL_CATEGORIES: RoleCategory[] = ['Global', 'Admin', 'Manager', 'Contributor', 'Viewer', 'Custom'];\r\n\r\nconst CATEGORY_CONFIG: Record<RoleCategory, { icon: React.ElementType; color: string; bgColor: string; borderColor: string }> = {\r\n Global: {\r\n icon: Crown,\r\n color: 'text-purple-600 dark:text-purple-400',\r\n bgColor: 'bg-purple-50 dark:bg-purple-900/20',\r\n borderColor: 'border-purple-200 dark:border-purple-800'\r\n },\r\n Admin: {\r\n icon: Shield,\r\n color: 'text-red-600 dark:text-red-400',\r\n bgColor: 'bg-red-50 dark:bg-red-900/20',\r\n borderColor: 'border-red-200 dark:border-red-800'\r\n },\r\n Manager: {\r\n icon: UserCog,\r\n color: 'text-blue-600 dark:text-blue-400',\r\n bgColor: 'bg-blue-50 dark:bg-blue-900/20',\r\n borderColor: 'border-blue-200 dark:border-blue-800'\r\n },\r\n Contributor: {\r\n icon: PenTool,\r\n color: 'text-green-600 dark:text-green-400',\r\n bgColor: 'bg-green-50 dark:bg-green-900/20',\r\n borderColor: 'border-green-200 dark:border-green-800'\r\n },\r\n Viewer: {\r\n icon: Eye,\r\n color: 'text-gray-600 dark:text-gray-400',\r\n bgColor: 'bg-gray-50 dark:bg-gray-900/20',\r\n borderColor: 'border-gray-200 dark:border-gray-700'\r\n },\r\n Custom: {\r\n icon: Sparkles,\r\n color: 'text-orange-600 dark:text-orange-400',\r\n bgColor: 'bg-orange-50 dark:bg-orange-900/20',\r\n borderColor: 'border-orange-200 dark:border-orange-800'\r\n }\r\n};\r\n\r\nexport function RolesPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [permissions, setPermissions] = useState<PermissionListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingRole, setEditingRole] = useState<RoleListDto | null>(null);\r\n const [formData, setFormData] = useState<CreateRoleRequest>({\r\n name: '',\r\n description: '',\r\n permissionIds: []\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n const [filter, setFilter] = useState<'system' | 'custom' | RoleCategory | null>(null);\r\n const [applicationFilter, setApplicationFilter] = useState<string | null>(null);\r\n const [categoryFilter, setCategoryFilter] = useState<RoleCategory | null>(null);\r\n\r\n const loadRoles = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.roles.getAll(search ? { search } : undefined);\r\n setRoles(result);\r\n } catch (err) {\r\n console.error('Failed to load roles:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search]);\r\n\r\n const loadPermissions = async () => {\r\n try {\r\n const result = await adminApi.permissions.getAll();\r\n setPermissions(result);\r\n } catch (err) {\r\n console.error('Failed to load permissions:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRoles();\r\n loadPermissions();\r\n }, [loadRoles]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n loadRoles();\r\n };\r\n\r\n const openCreateModal = () => {\r\n setEditingRole(null);\r\n setFormData({ name: '', description: '', permissionIds: [] });\r\n setError(null);\r\n setShowModal(true);\r\n };\r\n\r\n const openEditModal = async (role: RoleListDto) => {\r\n try {\r\n const detail = await adminApi.roles.getById(role.id);\r\n setEditingRole(role);\r\n setFormData({\r\n name: detail.name,\r\n description: detail.description || '',\r\n parentRoleId: detail.parentRoleId || undefined,\r\n permissionIds: detail.permissions.map(p => p.id)\r\n });\r\n setError(null);\r\n setShowModal(true);\r\n } catch (err) {\r\n console.error('Failed to load role details:', err);\r\n }\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n if (editingRole) {\r\n const updateData: UpdateRoleRequest = {\r\n name: formData.name,\r\n description: formData.description,\r\n parentRoleId: formData.parentRoleId,\r\n permissionIds: formData.permissionIds\r\n };\r\n await adminApi.roles.update(editingRole.id, updateData);\r\n } else {\r\n await adminApi.roles.create(formData);\r\n }\r\n setShowModal(false);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (role: RoleListDto) => {\r\n if (!confirm(t('roles.confirmDelete', { name: role.name }))) return;\r\n\r\n try {\r\n await adminApi.roles.delete(role.id);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n alert(message);\r\n }\r\n setMenuOpen(null);\r\n };\r\n\r\n const handlePermissionToggle = (permissionId: string) => {\r\n setFormData(prev => ({\r\n ...prev,\r\n permissionIds: prev.permissionIds?.includes(permissionId)\r\n ? prev.permissionIds.filter(id => id !== permissionId)\r\n : [...(prev.permissionIds || []), permissionId]\r\n }));\r\n };\r\n\r\n const stats = useMemo(() => {\r\n const systemCount = roles.filter(r => r.isSystem).length;\r\n const customCount = roles.filter(r => !r.isSystem).length;\r\n const totalUsers = roles.reduce((sum, r) => sum + r.usersCount, 0);\r\n const categoryCount = roles.reduce((acc, r) => {\r\n acc[r.category] = (acc[r.category] || 0) + 1;\r\n return acc;\r\n }, {} as Record<string, number>);\r\n return { total: roles.length, systemCount, customCount, totalUsers, categoryCount };\r\n }, [roles]);\r\n\r\n const uniqueApplications = useMemo(() => {\r\n const appMap = new Map<string, string>();\r\n roles.forEach(r => {\r\n if (r.applicationId && r.applicationName) {\r\n appMap.set(r.applicationId, r.applicationName);\r\n }\r\n });\r\n return Array.from(appMap.entries())\r\n .map(([id, name]) => ({ id, name }))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n }, [roles]);\r\n\r\n const filteredRoles = useMemo(() => {\r\n let result = roles;\r\n // System/custom filter (from stats bar)\r\n if (filter === 'system') result = result.filter(r => r.isSystem);\r\n else if (filter === 'custom') result = result.filter(r => !r.isSystem);\r\n else if (filter) result = result.filter(r => r.category === filter);\r\n // Application filter\r\n if (applicationFilter === '__global__') result = result.filter(r => !r.applicationId);\r\n else if (applicationFilter) result = result.filter(r => r.applicationId === applicationFilter);\r\n // Category filter\r\n if (categoryFilter) result = result.filter(r => r.category === categoryFilter);\r\n return result;\r\n }, [roles, filter, applicationFilter, categoryFilter]);\r\n\r\n const hasActiveFilters = filter !== null || applicationFilter !== null || categoryFilter !== null;\r\n\r\n const clearAllFilters = () => {\r\n setFilter(null);\r\n setApplicationFilter(null);\r\n setCategoryFilter(null);\r\n };\r\n\r\n const toggleFilter = (newFilter: 'system' | 'custom' | RoleCategory) => {\r\n setFilter(prev => prev === newFilter ? null : newFilter);\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('roles.title') }\r\n ]}\r\n />\r\n\r\n {/* Header with stats */}\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('roles.title')}</h1>\r\n {!loading && (\r\n <span className=\"px-3 py-1 rounded-full text-sm font-medium bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n {hasActiveFilters ? `${filteredRoles.length} / ${stats.total}` : stats.total} {t('roles.totalLabel')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('roles.list')}</p>\r\n {!loading && stats.total > 0 && (\r\n <div className=\"flex items-center gap-2 mt-3 text-sm\">\r\n <button\r\n onClick={() => toggleFilter('system')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'system'\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)] ring-2 ring-[var(--warning-border)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {stats.systemCount} {t('roles.systemRoles')}\r\n </button>\r\n <button\r\n onClick={() => toggleFilter('custom')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'custom'\r\n ? 'bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] ring-2 ring-[var(--color-accent-300)] dark:ring-[var(--color-accent-700)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Sparkles className=\"w-4 h-4\" />\r\n {stats.customCount} {t('roles.customRoles')}\r\n </button>\r\n <span className=\"flex items-center gap-1.5 px-2.5 py-1 text-[var(--text-tertiary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n {stats.totalUsers} {t('roles.totalUsers')}\r\n </span>\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-full text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n title={t('roles.filters.clearAll')}\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Slot name=\"roles.header.actions\" context={{ roles, reload: loadRoles }} />\r\n <button\r\n onClick={openCreateModal}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roles.create')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Search + Filters */}\r\n <div className=\"flex flex-col gap-3\">\r\n <form onSubmit={handleSearch} className=\"flex gap-2\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search')}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.search')}\r\n </button>\r\n </form>\r\n\r\n {/* Filter bar */}\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <div className=\"flex items-center gap-1.5 text-sm text-[var(--text-tertiary)]\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span>{t('roles.filters.title')}</span>\r\n </div>\r\n\r\n {/* Application filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={applicationFilter ?? ''}\r\n onChange={e => setApplicationFilter(e.target.value || null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allApplications')}</option>\r\n <option value=\"__global__\">{t('roles.filters.globalRoles')}</option>\r\n {uniqueApplications.map(app => (\r\n <option key={app.id} value={app.id}>{app.name}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Category filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={categoryFilter ?? ''}\r\n onChange={e => setCategoryFilter((e.target.value || null) as RoleCategory | null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allCategories')}</option>\r\n {ALL_CATEGORIES.map(cat => (\r\n <option key={cat} value={cat}>{t(`roles.categories.${cat.toLowerCase()}`)}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Clear all filters */}\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 text-sm rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('roles.columns.category')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.columns.application')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden xl:table-cell\">{t('roles.columns.description')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.usersCount')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.permissions')}</th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center\">\r\n <Loader2 className=\"w-6 h-6 animate-spin mx-auto text-[var(--color-accent-500)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center text-[var(--text-secondary)]\">\r\n {hasActiveFilters ? (\r\n <div className=\"space-y-2\">\r\n <p>{t('roles.noRoles')}</p>\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"text-[var(--color-accent-600)] hover:underline\"\r\n >\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n </div>\r\n ) : t('roles.noRoles')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length > 0 && (\r\n filteredRoles.map(role => {\r\n const categoryConfig = CATEGORY_CONFIG[role.category] || CATEGORY_CONFIG.Custom;\r\n const CategoryIcon = categoryConfig.icon;\r\n return (\r\n <tr\r\n key={role.id}\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-9 h-9 rounded-full flex items-center justify-center ${categoryConfig.bgColor} ${categoryConfig.borderColor} border`}>\r\n <CategoryIcon className={`w-4 h-4 ${categoryConfig.color}`} />\r\n </div>\r\n <div>\r\n <div className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{role.name}</div>\r\n {role.isSystem && (\r\n <span className=\"text-xs text-[var(--warning-text)]\">\r\n {t('roles.system')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setCategoryFilter(prev => prev === role.category ? null : role.category); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all ${categoryConfig.bgColor} ${categoryConfig.color} ${categoryConfig.borderColor} hover:ring-2 hover:ring-offset-1 ${categoryFilter === role.category ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <CategoryIcon className=\"w-3.5 h-3.5\" />\r\n {t(`roles.categories.${role.category.toLowerCase()}`)}\r\n </button>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n {role.applicationName ? (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setApplicationFilter(prev => prev === role.applicationId ? null : role.applicationId); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)] hover:ring-2 hover:ring-offset-1 ${applicationFilter === role.applicationId ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <AppWindow className=\"w-3.5 h-3.5\" />\r\n {role.applicationName}\r\n </button>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs text-[var(--text-tertiary)]\">\r\n <Crown className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.globalRoles')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)] max-w-xs truncate hidden xl:table-cell\">{role.description || '-'}</td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.usersCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-center hidden lg:table-cell\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Shield className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.permissionsCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n title={t('users.view')}\r\n >\r\n <Eye className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {!role.isSystem && (\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === role.id ? null : role.id)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === role.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-[var(--radius-menu-item)] border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditModal(role); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n {role.usersCount === 0 && (\r\n <button\r\n onClick={() => handleDelete(role)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--error-text)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-modal)] w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {editingRole ? t('roles.edit') : t('roles.create')}\r\n </h2>\r\n <button onClick={() => setShowModal(false)} className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={e => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('roles.permissions')}\r\n </label>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto p-2 border border-[var(--border-color)] rounded-[var(--radius-card)]\">\r\n {permissions.map(permission => (\r\n <label key={permission.id} className=\"flex items-start gap-2 cursor-pointer p-2 hover:bg-[var(--bg-hover)] rounded-[var(--radius-button)]\">\r\n <input\r\n type=\"checkbox\"\r\n checked={formData.permissionIds?.includes(permission.id) || false}\r\n onChange={() => handlePermissionToggle(permission.id)}\r\n className=\"mt-0.5 rounded border-[var(--border-color)]\"\r\n />\r\n <div>\r\n <div className=\"text-[var(--text-primary)] font-mono text-sm\">{permission.path}</div>\r\n {permission.description && (\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{permission.description}</div>\r\n )}\r\n </div>\r\n </label>\r\n ))}\r\n {permissions.length === 0 && (\r\n <div className=\"text-center py-4 text-[var(--text-secondary)]\">\r\n {t('roles.noPermissions')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Extension form fields slot */}\r\n <Slot\r\n name=\"roles.form.fields.after\"\r\n context={{\r\n formData,\r\n onChange: (field: string, value: unknown) => {\r\n setFormData(prev => ({ ...prev, [field]: value }));\r\n },\r\n disabled: saving,\r\n isEditing: !!editingRole,\r\n role: editingRole,\r\n }}\r\n />\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {editingRole ? t('common.save') : t('common.create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ALL_CATEGORIES","CATEGORY_CONFIG","Crown","Shield","UserCog","PenTool","Eye","Sparkles","RolesPage","t","useTranslation","navigate","useNavigate","roles","setRoles","useState","permissions","setPermissions","loading","setLoading","search","setSearch","showModal","setShowModal","editingRole","setEditingRole","formData","setFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","filter","setFilter","applicationFilter","setApplicationFilter","categoryFilter","setCategoryFilter","loadRoles","useCallback","result","adminApi","err","loadPermissions","useEffect","handleSearch","openCreateModal","openEditModal","role","detail","p","handleSubmit","updateData","message","handleDelete","handlePermissionToggle","permissionId","prev","id","stats","useMemo","systemCount","r","customCount","totalUsers","sum","categoryCount","acc","uniqueApplications","appMap","name","a","b","filteredRoles","hasActiveFilters","clearAllFilters","toggleFilter","newFilter","jsxs","jsx","Breadcrumb","Users","X","Slot","Plus","Search","Filter","app","ChevronDown","cat","Loader2","categoryConfig","CategoryIcon","e","AppWindow","MoreHorizontal","Edit2","Trash2","permission","field","value"],"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"),n=require("react"),k=require("react-i18next"),o=require("lucide-react"),u=require("./index-2wUhd9Lu.js"),A=["Critical","High","Medium","Low"];function B(){const{t:a}=k.useTranslation("support"),[c,d]=n.useState(!0),[x,m]=n.useState(null),[j,w]=n.useState([]),[b,T]=n.useState([]),[l,C]=n.useState(null),[p,g]=n.useState({}),[f,N]=n.useState(null),v=n.useCallback(async()=>{try{d(!0);const[s,t,r]=await Promise.all([u.slaApi.getConfigurations(),u.slaApi.getEscalationRules(),u.slaApi.getMetrics()]),i=[...s].sort((h,R)=>A.indexOf(h.priority)-A.indexOf(R.priority));w(i),T(t),C(r);const S={};i.forEach(h=>{S[h.priority]={response:h.responseTimeMinutes,resolution:h.resolutionTimeMinutes}}),g(S)}catch(s){console.error("Failed to load SLA configurations:",s)}finally{d(!1)}},[]);n.useEffect(()=>{v()},[v]);const L=async s=>{const t=p[s];if(t)try{m(s),await u.slaApi.updateConfiguration(s,{responseTimeMinutes:t.response,resolutionTimeMinutes:t.resolution}),await v(),N(`${s} SLA configuration saved successfully`),setTimeout(()=>N(null),3e3)}catch(r){console.error("Failed to save SLA configuration:",r)}finally{m(null)}},y=(s,t,r)=>{g(i=>({...i,[s]:{...i[s],[t]:r}}))},M=s=>{const t=j.find(i=>i.priority===s),r=p[s];return!t||!r?!1:t.responseTimeMinutes!==r.response||t.resolutionTimeMinutes!==r.resolution};return c?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(o.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(u.Breadcrumb,{items:[{label:a("title","Support"),href:"/support"},{label:a("sla.title","SLA Configuration")}]}),e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(o.Clock,{className:"w-6 h-6"}),a("sla.title","SLA Configuration")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:"Configure Service Level Agreements for ticket response and resolution times"})]}),f&&e.jsxs("div",{className:"bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] px-4 py-3 rounded flex items-center gap-2",children:[e.jsx(o.Check,{className:"w-5 h-5"}),f]}),l&&e.jsxs("div",{className:"card p-4",children:[e.jsx("h2",{className:"font-semibold mb-4",children:"Current SLA Performance"}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsx("div",{className:"text-2xl font-bold",children:l.totalTickets}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Total Tickets"})]}),e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--success-text)]",children:l.ticketsWithinSla}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Within SLA"})]}),e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--error-text)]",children:l.ticketsBreached}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Breached"})]}),e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsxs("div",{className:`text-2xl font-bold ${l.slaCompliancePercentage>=90?"text-[var(--success-text)]":"text-[var(--warning-text)]"}`,children:[l.slaCompliancePercentage.toFixed(1),"%"]}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Compliance"})]})]}),Object.keys(l.breachesByPriority).length>0&&e.jsxs("div",{className:"mt-4 pt-4 border-t border-[var(--border-color)]",children:[e.jsx("h3",{className:"text-sm font-medium mb-2",children:"Breaches by Priority"}),e.jsx("div",{className:"flex gap-4",children:Object.entries(l.breachesByPriority).map(([s,t])=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-sm",children:[s,":"]}),e.jsx("span",{className:"font-medium text-[var(--error-text)]",children:t})]},s))})]})]}),e.jsxs("div",{className:"card",children:[e.jsxs("div",{className:"p-4 border-b border-[var(--border-color)]",children:[e.jsx("h2",{className:"font-semibold",children:"Response & Resolution Times"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:"Define the maximum time allowed for initial response and complete resolution by priority"})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left p-4 font-medium",children:"Priority"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Response Time"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Resolution Time"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Status"}),e.jsx("th",{className:"text-right p-4 font-medium",children:"Actions"})]})}),e.jsx("tbody",{children:j.map(s=>{const t=p[s.priority],r=M(s.priority);return e.jsxs("tr",{className:"border-b border-[var(--border-color)]",children:[e.jsx("td",{className:"p-4",children:e.jsx("span",{className:`inline-flex items-center px-3 py-1 rounded-[var(--radius-badge)] font-medium text-sm ${s.priority==="Critical"?"bg-[var(--error-bg)] text-[var(--error-text)]":s.priority==="High"||s.priority==="Medium"?"bg-[var(--warning-bg)] text-[var(--warning-text)]":"bg-[var(--info-bg)] text-[var(--info-text)]"}`,children:s.priority})}),e.jsx("td",{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",min:"1",value:t?.response??s.responseTimeMinutes,onChange:i=>y(s.priority,"response",parseInt(i.target.value)||0),className:"input w-24"}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:"minutes"}),e.jsxs("span",{className:"text-sm text-[var(--text-secondary)] ml-2",children:["(",s.responseTimeFormatted,")"]})]})}),e.jsx("td",{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",min:"1",value:t?.resolution??s.resolutionTimeMinutes,onChange:i=>y(s.priority,"resolution",parseInt(i.target.value)||0),className:"input w-24"}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:"minutes"}),e.jsxs("span",{className:"text-sm text-[var(--text-secondary)] ml-2",children:["(",s.resolutionTimeFormatted,")"]})]})}),e.jsx("td",{className:"p-4",children:s.isActive?e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm",children:"Active"}):e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm",children:"Inactive"})}),e.jsx("td",{className:"p-4 text-right",children:e.jsxs("button",{onClick:()=>L(s.priority),disabled:!r||x===s.priority,className:`btn ${r?"btn-primary":"btn-secondary"} flex items-center gap-2`,children:[x===s.priority?e.jsx(o.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(o.Save,{className:"w-4 h-4"}),"Save"]})})]},s.id)})})]})})]}),e.jsxs("div",{className:"card",children:[e.jsxs("div",{className:"p-4 border-b border-[var(--border-color)]",children:[e.jsx("h2",{className:"font-semibold",children:"Escalation Rules"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:"Automatic escalation paths when SLAs are breached"})]}),b.length>0?e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left p-4 font-medium",children:"Level"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Trigger"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Delay After Breach"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Status"})]})}),e.jsx("tbody",{children:b.map(s=>e.jsxs("tr",{className:"border-b border-[var(--border-color)]",children:[e.jsx("td",{className:"p-4",children:e.jsx("span",{className:"font-medium",children:s.level})}),e.jsx("td",{className:"p-4",children:e.jsx("span",{className:"text-sm",children:P(s.triggerType)})}),e.jsx("td",{className:"p-4",children:e.jsx("span",{className:"text-sm",children:$(s.delayAfterBreachMinutes)})}),e.jsx("td",{className:"p-4",children:s.isActive?e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm",children:"Active"}):e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm",children:"Inactive"})})]},s.id))})]})}):e.jsxs("div",{className:"p-8 text-center text-[var(--text-secondary)]",children:[e.jsx(o.AlertTriangle,{className:"w-12 h-12 mx-auto mb-4 opacity-50"}),e.jsx("p",{children:"No escalation rules configured"})]})]}),e.jsxs("div",{className:"card p-4 bg-[var(--info-bg)] border-[var(--info-border)]",children:[e.jsx("h3",{className:"font-semibold text-[var(--info-text)] mb-2",children:"About SLA Configuration"}),e.jsxs("ul",{className:"text-sm text-[var(--info-text)] space-y-1",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Response Time:"})," Maximum time allowed for the first agent response after ticket creation"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Resolution Time:"})," Maximum time allowed to fully resolve and close the ticket"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"SLA Pause:"})," SLA timers automatically pause when a ticket is placed On Hold"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Escalation:"})," When SLA is breached, tickets are automatically escalated to higher levels"]})]})]})]})}function P(a){switch(a){case"ResponseBreach":return"Response SLA Breached";case"ResolutionBreach":return"Resolution SLA Breached";default:return a}}function $(a){if(a<60)return`${a} minutes`;const c=Math.floor(a/60),d=a%60;if(c<24)return d>0?`${c}h ${d}m`:`${c} hours`;const x=Math.floor(c/24),m=c%24;return m>0?`${x}d ${m}h`:`${x} days`}exports.SlaConfigPage=B;
2
- //# sourceMappingURL=SlaConfigPage-B86McKM6.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),k=require("react-i18next"),o=require("lucide-react"),u=require("./index-IgLVXPg8.js"),A=["Critical","High","Medium","Low"];function B(){const{t:a}=k.useTranslation("support"),[c,d]=n.useState(!0),[x,m]=n.useState(null),[j,w]=n.useState([]),[b,T]=n.useState([]),[l,C]=n.useState(null),[p,g]=n.useState({}),[f,N]=n.useState(null),v=n.useCallback(async()=>{try{d(!0);const[s,t,r]=await Promise.all([u.slaApi.getConfigurations(),u.slaApi.getEscalationRules(),u.slaApi.getMetrics()]),i=[...s].sort((h,R)=>A.indexOf(h.priority)-A.indexOf(R.priority));w(i),T(t),C(r);const S={};i.forEach(h=>{S[h.priority]={response:h.responseTimeMinutes,resolution:h.resolutionTimeMinutes}}),g(S)}catch(s){console.error("Failed to load SLA configurations:",s)}finally{d(!1)}},[]);n.useEffect(()=>{v()},[v]);const L=async s=>{const t=p[s];if(t)try{m(s),await u.slaApi.updateConfiguration(s,{responseTimeMinutes:t.response,resolutionTimeMinutes:t.resolution}),await v(),N(`${s} SLA configuration saved successfully`),setTimeout(()=>N(null),3e3)}catch(r){console.error("Failed to save SLA configuration:",r)}finally{m(null)}},y=(s,t,r)=>{g(i=>({...i,[s]:{...i[s],[t]:r}}))},M=s=>{const t=j.find(i=>i.priority===s),r=p[s];return!t||!r?!1:t.responseTimeMinutes!==r.response||t.resolutionTimeMinutes!==r.resolution};return c?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(o.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(u.Breadcrumb,{items:[{label:a("title","Support"),href:"/support"},{label:a("sla.title","SLA Configuration")}]}),e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(o.Clock,{className:"w-6 h-6"}),a("sla.title","SLA Configuration")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:"Configure Service Level Agreements for ticket response and resolution times"})]}),f&&e.jsxs("div",{className:"bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] px-4 py-3 rounded flex items-center gap-2",children:[e.jsx(o.Check,{className:"w-5 h-5"}),f]}),l&&e.jsxs("div",{className:"card p-4",children:[e.jsx("h2",{className:"font-semibold mb-4",children:"Current SLA Performance"}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsx("div",{className:"text-2xl font-bold",children:l.totalTickets}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Total Tickets"})]}),e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--success-text)]",children:l.ticketsWithinSla}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Within SLA"})]}),e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsx("div",{className:"text-2xl font-bold text-[var(--error-text)]",children:l.ticketsBreached}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Breached"})]}),e.jsxs("div",{className:"text-center p-3 bg-[var(--bg-secondary)] rounded",children:[e.jsxs("div",{className:`text-2xl font-bold ${l.slaCompliancePercentage>=90?"text-[var(--success-text)]":"text-[var(--warning-text)]"}`,children:[l.slaCompliancePercentage.toFixed(1),"%"]}),e.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:"Compliance"})]})]}),Object.keys(l.breachesByPriority).length>0&&e.jsxs("div",{className:"mt-4 pt-4 border-t border-[var(--border-color)]",children:[e.jsx("h3",{className:"text-sm font-medium mb-2",children:"Breaches by Priority"}),e.jsx("div",{className:"flex gap-4",children:Object.entries(l.breachesByPriority).map(([s,t])=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-sm",children:[s,":"]}),e.jsx("span",{className:"font-medium text-[var(--error-text)]",children:t})]},s))})]})]}),e.jsxs("div",{className:"card",children:[e.jsxs("div",{className:"p-4 border-b border-[var(--border-color)]",children:[e.jsx("h2",{className:"font-semibold",children:"Response & Resolution Times"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:"Define the maximum time allowed for initial response and complete resolution by priority"})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left p-4 font-medium",children:"Priority"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Response Time"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Resolution Time"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Status"}),e.jsx("th",{className:"text-right p-4 font-medium",children:"Actions"})]})}),e.jsx("tbody",{children:j.map(s=>{const t=p[s.priority],r=M(s.priority);return e.jsxs("tr",{className:"border-b border-[var(--border-color)]",children:[e.jsx("td",{className:"p-4",children:e.jsx("span",{className:`inline-flex items-center px-3 py-1 rounded-[var(--radius-badge)] font-medium text-sm ${s.priority==="Critical"?"bg-[var(--error-bg)] text-[var(--error-text)]":s.priority==="High"||s.priority==="Medium"?"bg-[var(--warning-bg)] text-[var(--warning-text)]":"bg-[var(--info-bg)] text-[var(--info-text)]"}`,children:s.priority})}),e.jsx("td",{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",min:"1",value:t?.response??s.responseTimeMinutes,onChange:i=>y(s.priority,"response",parseInt(i.target.value)||0),className:"input w-24"}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:"minutes"}),e.jsxs("span",{className:"text-sm text-[var(--text-secondary)] ml-2",children:["(",s.responseTimeFormatted,")"]})]})}),e.jsx("td",{className:"p-4",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",min:"1",value:t?.resolution??s.resolutionTimeMinutes,onChange:i=>y(s.priority,"resolution",parseInt(i.target.value)||0),className:"input w-24"}),e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:"minutes"}),e.jsxs("span",{className:"text-sm text-[var(--text-secondary)] ml-2",children:["(",s.resolutionTimeFormatted,")"]})]})}),e.jsx("td",{className:"p-4",children:s.isActive?e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm",children:"Active"}):e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm",children:"Inactive"})}),e.jsx("td",{className:"p-4 text-right",children:e.jsxs("button",{onClick:()=>L(s.priority),disabled:!r||x===s.priority,className:`btn ${r?"btn-primary":"btn-secondary"} flex items-center gap-2`,children:[x===s.priority?e.jsx(o.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(o.Save,{className:"w-4 h-4"}),"Save"]})})]},s.id)})})]})})]}),e.jsxs("div",{className:"card",children:[e.jsxs("div",{className:"p-4 border-b border-[var(--border-color)]",children:[e.jsx("h2",{className:"font-semibold",children:"Escalation Rules"}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:"Automatic escalation paths when SLAs are breached"})]}),b.length>0?e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]",children:[e.jsx("th",{className:"text-left p-4 font-medium",children:"Level"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Trigger"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Delay After Breach"}),e.jsx("th",{className:"text-left p-4 font-medium",children:"Status"})]})}),e.jsx("tbody",{children:b.map(s=>e.jsxs("tr",{className:"border-b border-[var(--border-color)]",children:[e.jsx("td",{className:"p-4",children:e.jsx("span",{className:"font-medium",children:s.level})}),e.jsx("td",{className:"p-4",children:e.jsx("span",{className:"text-sm",children:P(s.triggerType)})}),e.jsx("td",{className:"p-4",children:e.jsx("span",{className:"text-sm",children:$(s.delayAfterBreachMinutes)})}),e.jsx("td",{className:"p-4",children:s.isActive?e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm",children:"Active"}):e.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm",children:"Inactive"})})]},s.id))})]})}):e.jsxs("div",{className:"p-8 text-center text-[var(--text-secondary)]",children:[e.jsx(o.AlertTriangle,{className:"w-12 h-12 mx-auto mb-4 opacity-50"}),e.jsx("p",{children:"No escalation rules configured"})]})]}),e.jsxs("div",{className:"card p-4 bg-[var(--info-bg)] border-[var(--info-border)]",children:[e.jsx("h3",{className:"font-semibold text-[var(--info-text)] mb-2",children:"About SLA Configuration"}),e.jsxs("ul",{className:"text-sm text-[var(--info-text)] space-y-1",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Response Time:"})," Maximum time allowed for the first agent response after ticket creation"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Resolution Time:"})," Maximum time allowed to fully resolve and close the ticket"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"SLA Pause:"})," SLA timers automatically pause when a ticket is placed On Hold"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Escalation:"})," When SLA is breached, tickets are automatically escalated to higher levels"]})]})]})]})}function P(a){switch(a){case"ResponseBreach":return"Response SLA Breached";case"ResolutionBreach":return"Resolution SLA Breached";default:return a}}function $(a){if(a<60)return`${a} minutes`;const c=Math.floor(a/60),d=a%60;if(c<24)return d>0?`${c}h ${d}m`:`${c} hours`;const x=Math.floor(c/24),m=c%24;return m>0?`${x}d ${m}h`:`${x} days`}exports.SlaConfigPage=B;
2
+ //# sourceMappingURL=SlaConfigPage-B7kZNig4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SlaConfigPage-B86McKM6.js","sources":["../../src/pages/platform/support/SlaConfigPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Clock, Save, AlertTriangle, Loader2, Check } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n slaApi,\r\n type SlaConfigurationDto,\r\n type EscalationRuleDto,\r\n type SlaMetricsDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\r\n\r\nexport function SlaConfigPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [configs, setConfigs] = useState<SlaConfigurationDto[]>([]);\r\n const [escalationRules, setEscalationRules] = useState<EscalationRuleDto[]>([]);\r\n const [metrics, setMetrics] = useState<SlaMetricsDto | null>(null);\r\n const [editedConfigs, setEditedConfigs] = useState<Record<string, { response: number; resolution: number }>>({});\r\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [configsRes, rulesRes, metricsRes] = await Promise.all([\r\n slaApi.getConfigurations(),\r\n slaApi.getEscalationRules(),\r\n slaApi.getMetrics(),\r\n ]);\r\n\r\n // Sort by priority order\r\n const sorted = [...configsRes].sort(\r\n (a, b) => priorityOrder.indexOf(a.priority) - priorityOrder.indexOf(b.priority)\r\n );\r\n\r\n setConfigs(sorted);\r\n setEscalationRules(rulesRes);\r\n setMetrics(metricsRes);\r\n\r\n // Initialize edited values\r\n const edited: Record<string, { response: number; resolution: number }> = {};\r\n sorted.forEach((c) => {\r\n edited[c.priority] = {\r\n response: c.responseTimeMinutes,\r\n resolution: c.resolutionTimeMinutes,\r\n };\r\n });\r\n setEditedConfigs(edited);\r\n } catch (error) {\r\n console.error('Failed to load SLA configurations:', 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 handleSave = async (priority: string) => {\r\n const edited = editedConfigs[priority];\r\n if (!edited) return;\r\n\r\n try {\r\n setSaving(priority);\r\n await slaApi.updateConfiguration(priority, {\r\n responseTimeMinutes: edited.response,\r\n resolutionTimeMinutes: edited.resolution,\r\n });\r\n\r\n // Reload to get updated formatted strings\r\n await loadData();\r\n\r\n setSuccessMessage(`${priority} SLA configuration saved successfully`);\r\n setTimeout(() => setSuccessMessage(null), 3000);\r\n } catch (error) {\r\n console.error('Failed to save SLA configuration:', error);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleInputChange = (priority: string, field: 'response' | 'resolution', value: number) => {\r\n setEditedConfigs((prev) => ({\r\n ...prev,\r\n [priority]: {\r\n ...prev[priority],\r\n [field]: value,\r\n },\r\n }));\r\n };\r\n\r\n const hasChanges = (priority: string) => {\r\n const config = configs.find((c) => c.priority === priority);\r\n const edited = editedConfigs[priority];\r\n if (!config || !edited) return false;\r\n return (\r\n config.responseTimeMinutes !== edited.response ||\r\n config.resolutionTimeMinutes !== edited.resolution\r\n );\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\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('sla.title', 'SLA Configuration') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Clock className=\"w-6 h-6\" />\r\n {t('sla.title', 'SLA Configuration')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Configure Service Level Agreements for ticket response and resolution times\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {successMessage && (\r\n <div className=\"bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] px-4 py-3 rounded flex items-center gap-2\">\r\n <Check className=\"w-5 h-5\" />\r\n {successMessage}\r\n </div>\r\n )}\r\n\r\n {/* SLA Metrics Overview */}\r\n {metrics && (\r\n <div className=\"card p-4\">\r\n <h2 className=\"font-semibold mb-4\">Current SLA Performance</h2>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold\">{metrics.totalTickets}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Total Tickets</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--success-text)]\">{metrics.ticketsWithinSla}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Within SLA</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--error-text)]\">{metrics.ticketsBreached}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Breached</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className={`text-2xl font-bold ${metrics.slaCompliancePercentage >= 90 ? 'text-[var(--success-text)]' : 'text-[var(--warning-text)]'}`}>\r\n {metrics.slaCompliancePercentage.toFixed(1)}%\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Compliance</div>\r\n </div>\r\n </div>\r\n\r\n {/* Breaches by Priority */}\r\n {Object.keys(metrics.breachesByPriority).length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium mb-2\">Breaches by Priority</h3>\r\n <div className=\"flex gap-4\">\r\n {Object.entries(metrics.breachesByPriority).map(([priority, count]) => (\r\n <div key={priority} className=\"flex items-center gap-2\">\r\n <span className=\"text-sm\">{priority}:</span>\r\n <span className=\"font-medium text-[var(--error-text)]\">{count}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* SLA Configurations */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Response & Resolution Times</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Define the maximum time allowed for initial response and complete resolution by priority\r\n </p>\r\n </div>\r\n\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Priority</th>\r\n <th className=\"text-left p-4 font-medium\">Response Time</th>\r\n <th className=\"text-left p-4 font-medium\">Resolution Time</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n <th className=\"text-right p-4 font-medium\">Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {configs.map((config) => {\r\n const edited = editedConfigs[config.priority];\r\n const changed = hasChanges(config.priority);\r\n\r\n return (\r\n <tr key={config.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className={`inline-flex items-center px-3 py-1 rounded-[var(--radius-badge)] font-medium text-sm ${\r\n config.priority === 'Critical' ? 'bg-[var(--error-bg)] text-[var(--error-text)]' :\r\n config.priority === 'High' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n config.priority === 'Medium' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n }`}>\r\n {config.priority}\r\n </span>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.response ?? config.responseTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'response', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.responseTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.resolution ?? config.resolutionTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'resolution', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.resolutionTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n {config.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <button\r\n onClick={() => handleSave(config.priority)}\r\n disabled={!changed || saving === config.priority}\r\n className={`btn ${changed ? 'btn-primary' : 'btn-secondary'} flex items-center gap-2`}\r\n >\r\n {saving === config.priority ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n Save\r\n </button>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n {/* Escalation Rules */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Escalation Rules</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Automatic escalation paths when SLAs are breached\r\n </p>\r\n </div>\r\n\r\n {escalationRules.length > 0 ? (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Level</th>\r\n <th className=\"text-left p-4 font-medium\">Trigger</th>\r\n <th className=\"text-left p-4 font-medium\">Delay After Breach</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {escalationRules.map((rule) => (\r\n <tr key={rule.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className=\"font-medium\">{rule.level}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatTriggerType(rule.triggerType)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatMinutes(rule.delayAfterBreachMinutes)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n {rule.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>No escalation rules configured</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Help Section */}\r\n <div className=\"card p-4 bg-[var(--info-bg)] border-[var(--info-border)]\">\r\n <h3 className=\"font-semibold text-[var(--info-text)] mb-2\">About SLA Configuration</h3>\r\n <ul className=\"text-sm text-[var(--info-text)] space-y-1\">\r\n <li>\r\n <strong>Response Time:</strong> Maximum time allowed for the first agent response after ticket creation\r\n </li>\r\n <li>\r\n <strong>Resolution Time:</strong> Maximum time allowed to fully resolve and close the ticket\r\n </li>\r\n <li>\r\n <strong>SLA Pause:</strong> SLA timers automatically pause when a ticket is placed On Hold\r\n </li>\r\n <li>\r\n <strong>Escalation:</strong> When SLA is breached, tickets are automatically escalated to higher levels\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatTriggerType(type: string): string {\r\n switch (type) {\r\n case 'ResponseBreach':\r\n return 'Response SLA Breached';\r\n case 'ResolutionBreach':\r\n return 'Resolution SLA Breached';\r\n default:\r\n return type;\r\n }\r\n}\r\n\r\nfunction formatMinutes(minutes: number): string {\r\n if (minutes < 60) return `${minutes} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n if (hours < 24) return mins > 0 ? `${hours}h ${mins}m` : `${hours} hours`;\r\n const days = Math.floor(hours / 24);\r\n const remainingHours = hours % 24;\r\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days} days`;\r\n}\r\n"],"names":["priorityOrder","SlaConfigPage","t","useTranslation","loading","setLoading","useState","saving","setSaving","configs","setConfigs","escalationRules","setEscalationRules","metrics","setMetrics","editedConfigs","setEditedConfigs","successMessage","setSuccessMessage","loadData","useCallback","configsRes","rulesRes","metricsRes","slaApi","sorted","a","b","edited","c","error","useEffect","handleSave","priority","handleInputChange","field","value","prev","hasChanges","config","jsx","Loader2","jsxs","Breadcrumb","Clock","Check","count","changed","e","Save","rule","formatTriggerType","formatMinutes","AlertTriangle","type","minutes","hours","mins","days","remainingHours"],"mappings":"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"}
1
+ {"version":3,"file":"SlaConfigPage-B7kZNig4.js","sources":["../../src/pages/platform/support/SlaConfigPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Clock, Save, AlertTriangle, Loader2, Check } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n slaApi,\r\n type SlaConfigurationDto,\r\n type EscalationRuleDto,\r\n type SlaMetricsDto,\r\n} from '@/services/api/supportApi';\r\n\r\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\r\n\r\nexport function SlaConfigPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [configs, setConfigs] = useState<SlaConfigurationDto[]>([]);\r\n const [escalationRules, setEscalationRules] = useState<EscalationRuleDto[]>([]);\r\n const [metrics, setMetrics] = useState<SlaMetricsDto | null>(null);\r\n const [editedConfigs, setEditedConfigs] = useState<Record<string, { response: number; resolution: number }>>({});\r\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const [configsRes, rulesRes, metricsRes] = await Promise.all([\r\n slaApi.getConfigurations(),\r\n slaApi.getEscalationRules(),\r\n slaApi.getMetrics(),\r\n ]);\r\n\r\n // Sort by priority order\r\n const sorted = [...configsRes].sort(\r\n (a, b) => priorityOrder.indexOf(a.priority) - priorityOrder.indexOf(b.priority)\r\n );\r\n\r\n setConfigs(sorted);\r\n setEscalationRules(rulesRes);\r\n setMetrics(metricsRes);\r\n\r\n // Initialize edited values\r\n const edited: Record<string, { response: number; resolution: number }> = {};\r\n sorted.forEach((c) => {\r\n edited[c.priority] = {\r\n response: c.responseTimeMinutes,\r\n resolution: c.resolutionTimeMinutes,\r\n };\r\n });\r\n setEditedConfigs(edited);\r\n } catch (error) {\r\n console.error('Failed to load SLA configurations:', 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 handleSave = async (priority: string) => {\r\n const edited = editedConfigs[priority];\r\n if (!edited) return;\r\n\r\n try {\r\n setSaving(priority);\r\n await slaApi.updateConfiguration(priority, {\r\n responseTimeMinutes: edited.response,\r\n resolutionTimeMinutes: edited.resolution,\r\n });\r\n\r\n // Reload to get updated formatted strings\r\n await loadData();\r\n\r\n setSuccessMessage(`${priority} SLA configuration saved successfully`);\r\n setTimeout(() => setSuccessMessage(null), 3000);\r\n } catch (error) {\r\n console.error('Failed to save SLA configuration:', error);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleInputChange = (priority: string, field: 'response' | 'resolution', value: number) => {\r\n setEditedConfigs((prev) => ({\r\n ...prev,\r\n [priority]: {\r\n ...prev[priority],\r\n [field]: value,\r\n },\r\n }));\r\n };\r\n\r\n const hasChanges = (priority: string) => {\r\n const config = configs.find((c) => c.priority === priority);\r\n const edited = editedConfigs[priority];\r\n if (!config || !edited) return false;\r\n return (\r\n config.responseTimeMinutes !== edited.response ||\r\n config.resolutionTimeMinutes !== edited.resolution\r\n );\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\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('sla.title', 'SLA Configuration') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Clock className=\"w-6 h-6\" />\r\n {t('sla.title', 'SLA Configuration')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Configure Service Level Agreements for ticket response and resolution times\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {successMessage && (\r\n <div className=\"bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] px-4 py-3 rounded flex items-center gap-2\">\r\n <Check className=\"w-5 h-5\" />\r\n {successMessage}\r\n </div>\r\n )}\r\n\r\n {/* SLA Metrics Overview */}\r\n {metrics && (\r\n <div className=\"card p-4\">\r\n <h2 className=\"font-semibold mb-4\">Current SLA Performance</h2>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold\">{metrics.totalTickets}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Total Tickets</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--success-text)]\">{metrics.ticketsWithinSla}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Within SLA</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className=\"text-2xl font-bold text-[var(--error-text)]\">{metrics.ticketsBreached}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Breached</div>\r\n </div>\r\n <div className=\"text-center p-3 bg-[var(--bg-secondary)] rounded\">\r\n <div className={`text-2xl font-bold ${metrics.slaCompliancePercentage >= 90 ? 'text-[var(--success-text)]' : 'text-[var(--warning-text)]'}`}>\r\n {metrics.slaCompliancePercentage.toFixed(1)}%\r\n </div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">Compliance</div>\r\n </div>\r\n </div>\r\n\r\n {/* Breaches by Priority */}\r\n {Object.keys(metrics.breachesByPriority).length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium mb-2\">Breaches by Priority</h3>\r\n <div className=\"flex gap-4\">\r\n {Object.entries(metrics.breachesByPriority).map(([priority, count]) => (\r\n <div key={priority} className=\"flex items-center gap-2\">\r\n <span className=\"text-sm\">{priority}:</span>\r\n <span className=\"font-medium text-[var(--error-text)]\">{count}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* SLA Configurations */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Response & Resolution Times</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Define the maximum time allowed for initial response and complete resolution by priority\r\n </p>\r\n </div>\r\n\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Priority</th>\r\n <th className=\"text-left p-4 font-medium\">Response Time</th>\r\n <th className=\"text-left p-4 font-medium\">Resolution Time</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n <th className=\"text-right p-4 font-medium\">Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {configs.map((config) => {\r\n const edited = editedConfigs[config.priority];\r\n const changed = hasChanges(config.priority);\r\n\r\n return (\r\n <tr key={config.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className={`inline-flex items-center px-3 py-1 rounded-[var(--radius-badge)] font-medium text-sm ${\r\n config.priority === 'Critical' ? 'bg-[var(--error-bg)] text-[var(--error-text)]' :\r\n config.priority === 'High' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n config.priority === 'Medium' ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]' :\r\n 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n }`}>\r\n {config.priority}\r\n </span>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.response ?? config.responseTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'response', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.responseTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={edited?.resolution ?? config.resolutionTimeMinutes}\r\n onChange={(e) =>\r\n handleInputChange(config.priority, 'resolution', parseInt(e.target.value) || 0)\r\n }\r\n className=\"input w-24\"\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">minutes</span>\r\n <span className=\"text-sm text-[var(--text-secondary)] ml-2\">\r\n ({config.resolutionTimeFormatted})\r\n </span>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n {config.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <button\r\n onClick={() => handleSave(config.priority)}\r\n disabled={!changed || saving === config.priority}\r\n className={`btn ${changed ? 'btn-primary' : 'btn-secondary'} flex items-center gap-2`}\r\n >\r\n {saving === config.priority ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n Save\r\n </button>\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n {/* Escalation Rules */}\r\n <div className=\"card\">\r\n <div className=\"p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"font-semibold\">Escalation Rules</h2>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n Automatic escalation paths when SLAs are breached\r\n </p>\r\n </div>\r\n\r\n {escalationRules.length > 0 ? (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-4 font-medium\">Level</th>\r\n <th className=\"text-left p-4 font-medium\">Trigger</th>\r\n <th className=\"text-left p-4 font-medium\">Delay After Breach</th>\r\n <th className=\"text-left p-4 font-medium\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {escalationRules.map((rule) => (\r\n <tr key={rule.id} className=\"border-b border-[var(--border-color)]\">\r\n <td className=\"p-4\">\r\n <span className=\"font-medium\">{rule.level}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatTriggerType(rule.triggerType)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"text-sm\">{formatMinutes(rule.delayAfterBreachMinutes)}</span>\r\n </td>\r\n <td className=\"p-4\">\r\n {rule.isActive ? (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--success-bg)] text-[var(--success-text)] text-sm\">\r\n Active\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] text-sm\">\r\n Inactive\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)]\">\r\n <AlertTriangle className=\"w-12 h-12 mx-auto mb-4 opacity-50\" />\r\n <p>No escalation rules configured</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Help Section */}\r\n <div className=\"card p-4 bg-[var(--info-bg)] border-[var(--info-border)]\">\r\n <h3 className=\"font-semibold text-[var(--info-text)] mb-2\">About SLA Configuration</h3>\r\n <ul className=\"text-sm text-[var(--info-text)] space-y-1\">\r\n <li>\r\n <strong>Response Time:</strong> Maximum time allowed for the first agent response after ticket creation\r\n </li>\r\n <li>\r\n <strong>Resolution Time:</strong> Maximum time allowed to fully resolve and close the ticket\r\n </li>\r\n <li>\r\n <strong>SLA Pause:</strong> SLA timers automatically pause when a ticket is placed On Hold\r\n </li>\r\n <li>\r\n <strong>Escalation:</strong> When SLA is breached, tickets are automatically escalated to higher levels\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatTriggerType(type: string): string {\r\n switch (type) {\r\n case 'ResponseBreach':\r\n return 'Response SLA Breached';\r\n case 'ResolutionBreach':\r\n return 'Resolution SLA Breached';\r\n default:\r\n return type;\r\n }\r\n}\r\n\r\nfunction formatMinutes(minutes: number): string {\r\n if (minutes < 60) return `${minutes} minutes`;\r\n const hours = Math.floor(minutes / 60);\r\n const mins = minutes % 60;\r\n if (hours < 24) return mins > 0 ? `${hours}h ${mins}m` : `${hours} hours`;\r\n const days = Math.floor(hours / 24);\r\n const remainingHours = hours % 24;\r\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days} days`;\r\n}\r\n"],"names":["priorityOrder","SlaConfigPage","t","useTranslation","loading","setLoading","useState","saving","setSaving","configs","setConfigs","escalationRules","setEscalationRules","metrics","setMetrics","editedConfigs","setEditedConfigs","successMessage","setSuccessMessage","loadData","useCallback","configsRes","rulesRes","metricsRes","slaApi","sorted","a","b","edited","c","error","useEffect","handleSave","priority","handleInputChange","field","value","prev","hasChanges","config","jsx","Loader2","jsxs","Breadcrumb","Clock","Check","count","changed","e","Save","rule","formatTriggerType","formatMinutes","AlertTriangle","type","minutes","hours","mins","days","remainingHours"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as s } from "react/jsx-runtime";
2
2
  import { useState as o, useCallback as $, useEffect as P } from "react";
3
3
  import { useTranslation as E } from "react-i18next";
4
4
  import { Loader2 as S, Clock as O, Check as j, Save as F, AlertTriangle as I } from "lucide-react";
5
- import { Z as p, B as H } from "./index-CwSaRXXg.js";
5
+ import { Z as p, B as H } from "./index-lpIzhufD.js";
6
6
  const T = ["Critical", "High", "Medium", "Low"];
7
7
  function K() {
8
8
  const { t: i } = E("support"), [c, d] = o(!0), [m, h] = o(null), [b, C] = o([]), [f, M] = o([]), [l, L] = o(null), [x, g] = o({}), [N, y] = o(null), v = $(async () => {
@@ -248,4 +248,4 @@ function W(i) {
248
248
  export {
249
249
  K as SlaConfigPage
250
250
  };
251
- //# sourceMappingURL=SlaConfigPage-BY7gvYU6.js.map
251
+ //# sourceMappingURL=SlaConfigPage-okvZfA_K.js.map