@atlashub/smartstack 3.21.0 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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":"ApplicationsPage-CW3-Hjlu.js","sources":["../../src/components/platform/administration/access-requests/RequestAccessButton.tsx","../../src/pages/ApplicationsPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LogIn, Loader2, X, Clock, RefreshCw } from 'lucide-react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\ninterface RequestAccessButtonProps {\r\n readonly applicationId: string;\r\n readonly tenantId: string;\r\n readonly existingStatus?: 'Pending' | 'Denied' | null;\r\n readonly onSuccess?: () => void;\r\n}\r\n\r\nexport function RequestAccessButton({ applicationId, tenantId, existingStatus, onSuccess }: RequestAccessButtonProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [loading, setLoading] = useState(false);\r\n const [showReasonModal, setShowReasonModal] = useState(false);\r\n const [reason, setReason] = useState('');\r\n const [justSubmitted, setJustSubmitted] = useState(false);\r\n\r\n const handleRequest = async () => {\r\n setLoading(true);\r\n try {\r\n await accessRequestsApi.createRequest(tenantId, applicationId, {\r\n applicationId,\r\n reason: reason || undefined,\r\n });\r\n setShowReasonModal(false);\r\n setReason('');\r\n setJustSubmitted(true);\r\n onSuccess?.();\r\n } catch (err) {\r\n console.error('Failed to create access request:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // After successful submission or existing pending request, show pending state\r\n if (justSubmitted || existingStatus === 'Pending') {\r\n return (\r\n <div className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-amber-500/10 text-amber-600 border border-amber-500/30 cursor-default\">\r\n <Clock className=\"w-4 h-4\" />\r\n {t('accessRequests.pendingLabel', 'Request pending')}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div>\r\n <button\r\n onClick={() => setShowReasonModal(true)}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]\"\r\n >\r\n {existingStatus === 'Denied' ? (\r\n <RefreshCw className=\"w-4 h-4\" />\r\n ) : (\r\n <LogIn className=\"w-4 h-4\" />\r\n )}\r\n {existingStatus === 'Denied'\r\n ? t('accessRequests.retryAccess', 'Retry request')\r\n : t('accessRequests.requestAccess')}\r\n </button>\r\n\r\n {showReasonModal && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('accessRequests.modal.requestTitle')}</h3>\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={loading}\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.reasonLabel')}\r\n </label>\r\n <textarea\r\n value={reason}\r\n onChange={(e) => setReason(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n rows={3}\r\n placeholder={t('accessRequests.modal.reasonPlaceholder')}\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={loading}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleRequest}\r\n disabled={loading}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {loading && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:submit')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { memo, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Star,\r\n LifeBuoy,\r\n Briefcase,\r\n FileText,\r\n Box,\r\n ArrowRight,\r\n Lock,\r\n} from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { RequestAccessButton } from '@/components/platform/administration/access-requests';\r\nimport { useUserAccessRequests } from '@/hooks/useUserAccessRequests';\r\n\r\nconst iconMap: Record<string, typeof Box> = {\r\n lifebuoy: LifeBuoy,\r\n briefcase: Briefcase,\r\n file: FileText,\r\n box: Box,\r\n};\r\n\r\nfunction getIcon(iconName: string | null) {\r\n if (!iconName) return Box;\r\n return iconMap[iconName.toLowerCase()] || Box;\r\n}\r\n\r\ninterface ApplicationCardProps {\r\n readonly app: ApplicationDto;\r\n readonly isFavorite: boolean;\r\n readonly onToggleFavorite: () => void;\r\n readonly buildUrl: (path: string) => string;\r\n readonly tenantId?: string;\r\n readonly existingRequestStatus?: 'Pending' | 'Denied' | null;\r\n readonly onAccessRequested?: () => void;\r\n}\r\n\r\nconst ApplicationCard = memo(function ApplicationCard({ app, isFavorite, onToggleFavorite, buildUrl, tenantId, existingRequestStatus, onAccessRequested }: ApplicationCardProps) {\r\n const { t } = useTranslation('navigation');\r\n const Icon = getIcon(app.icon);\r\n const isRequestAccess = app.accessLevel === 'RequestAccess' && app.modules.length === 0;\r\n\r\n const handleFavoriteClick = useCallback((e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onToggleFavorite();\r\n }, [onToggleFavorite]);\r\n\r\n if (isRequestAccess) {\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--warning-border)] transition-all duration-300 hover:shadow-lg\">\r\n <div className=\"block p-6\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <Icon className=\"w-7 h-7 text-[var(--warning-text)]\" />\r\n </div>\r\n <div className=\"p-2 rounded-lg bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n <Lock className=\"w-5 h-5\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--warning-text)] opacity-80 mb-4\">\r\n {t('applicationsPage.requestAccessDesc', \"Restricted access - request required\")}\r\n </p>\r\n\r\n {tenantId && (\r\n <RequestAccessButton\r\n applicationId={app.id}\r\n tenantId={tenantId}\r\n existingStatus={existingRequestStatus}\r\n onSuccess={onAccessRequested}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-400)] transition-all duration-300 hover:shadow-lg\">\r\n <Link\r\n to={app.route ? buildUrl(app.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--accent-bg)] flex items-center justify-center group-hover:opacity-90 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <button\r\n onClick={handleFavoriteClick}\r\n className={`p-2 rounded-lg transition-all duration-200 ${\r\n isFavorite\r\n ? 'text-[var(--warning-text)] bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n title={isFavorite ? t('applicationsPage.removeFavorite', 'Remove from favorites') : t('applicationsPage.addFavorite', 'Add to favorites')}\r\n >\r\n <Star className={`w-5 h-5 ${isFavorite ? 'fill-current' : ''}`} />\r\n </button>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {app.modules.length} {app.modules.length === 1\r\n ? t('applicationsPage.moduleCount_one', 'module')\r\n : t('applicationsPage.moduleCount_other', 'modules')}\r\n </p>\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('applicationsPage.open', 'Open')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n});\r\n\r\nexport function ApplicationsPage(): ReactElement | null {\r\n const { t } = useTranslation('navigation');\r\n const { favorites, menu, toggleFavorite, isFavorite, isLoading, refreshMenu } = useNavigation();\r\n const { currentTenant } = useTenant();\r\n const buildUrl = useTenantUrl();\r\n const { requests: myAccessRequests, reload: reloadAccessRequests } = useUserAccessRequests();\r\n\r\n const applications = menu?.applications || [];\r\n\r\n const getRequestStatus = useCallback((appId: string): 'Pending' | 'Denied' | null => {\r\n const appRequests = myAccessRequests\r\n .filter(r => r.applicationId === appId && r.tenantId === currentTenant?.id);\r\n const pending = appRequests.find(r => r.status === 'Pending');\r\n if (pending) return 'Pending';\r\n const denied = appRequests.find(r => r.status === 'Denied');\r\n if (denied) return 'Denied';\r\n return null;\r\n }, [myAccessRequests, currentTenant?.id]);\r\n\r\n const handleAccessRequested = useCallback(() => {\r\n refreshMenu();\r\n reloadAccessRequests();\r\n }, [refreshMenu, reloadAccessRequests]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('applicationsPage.title', 'Applications')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('applicationsPage.subtitle', 'Your available applications')}\r\n </p>\r\n </div>\r\n\r\n {favorites.length > 0 && (\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Star className=\"w-5 h-5 text-[var(--warning-text)] fill-[var(--warning-text)]\" />\r\n {t('applicationsPage.favorites', 'Favorites')}\r\n </h2>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {favorites.map(fav => {\r\n const app = applications.find(a => a.id === fav.id);\r\n if (!app) return null;\r\n return (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={true}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n );\r\n })}\r\n </div>\r\n </section>\r\n )}\r\n\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('applicationsPage.all', 'All applications')}\r\n </h2>\r\n {applications.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {applications.map(app => (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={isFavorite(app.id)}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('applicationsPage.noApps', 'No applications available')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["RequestAccessButton","applicationId","tenantId","existingStatus","onSuccess","t","useTranslation","loading","setLoading","useState","showReasonModal","setShowReasonModal","reason","setReason","justSubmitted","setJustSubmitted","handleRequest","accessRequestsApi","err","jsxs","jsx","Clock","RefreshCw","LogIn","X","e","Loader2","iconMap","LifeBuoy","Briefcase","FileText","Box","getIcon","iconName","ApplicationCard","memo","app","isFavorite","onToggleFavorite","buildUrl","existingRequestStatus","onAccessRequested","Icon","isRequestAccess","handleFavoriteClick","useCallback","Lock","Link","Star","ArrowRight","ApplicationsPage","favorites","menu","toggleFavorite","isLoading","refreshMenu","useNavigation","currentTenant","useTenant","useTenantUrl","myAccessRequests","reloadAccessRequests","useUserAccessRequests","applications","getRequestStatus","appId","appRequests","r","handleAccessRequested","fav","a"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsPage-CQPuuiO6.js","sources":["../../src/components/platform/administration/access-requests/RequestAccessButton.tsx","../../src/pages/ApplicationsPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LogIn, Loader2, X, Clock, RefreshCw } from 'lucide-react';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\n\r\ninterface RequestAccessButtonProps {\r\n readonly applicationId: string;\r\n readonly tenantId: string;\r\n readonly existingStatus?: 'Pending' | 'Denied' | null;\r\n readonly onSuccess?: () => void;\r\n}\r\n\r\nexport function RequestAccessButton({ applicationId, tenantId, existingStatus, onSuccess }: RequestAccessButtonProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [loading, setLoading] = useState(false);\r\n const [showReasonModal, setShowReasonModal] = useState(false);\r\n const [reason, setReason] = useState('');\r\n const [justSubmitted, setJustSubmitted] = useState(false);\r\n\r\n const handleRequest = async () => {\r\n setLoading(true);\r\n try {\r\n await accessRequestsApi.createRequest(tenantId, applicationId, {\r\n applicationId,\r\n reason: reason || undefined,\r\n });\r\n setShowReasonModal(false);\r\n setReason('');\r\n setJustSubmitted(true);\r\n onSuccess?.();\r\n } catch (err) {\r\n console.error('Failed to create access request:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // After successful submission or existing pending request, show pending state\r\n if (justSubmitted || existingStatus === 'Pending') {\r\n return (\r\n <div className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-amber-500/10 text-amber-600 border border-amber-500/30 cursor-default\">\r\n <Clock className=\"w-4 h-4\" />\r\n {t('accessRequests.pendingLabel', 'Request pending')}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div>\r\n <button\r\n onClick={() => setShowReasonModal(true)}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]\"\r\n >\r\n {existingStatus === 'Denied' ? (\r\n <RefreshCw className=\"w-4 h-4\" />\r\n ) : (\r\n <LogIn className=\"w-4 h-4\" />\r\n )}\r\n {existingStatus === 'Denied'\r\n ? t('accessRequests.retryAccess', 'Retry request')\r\n : t('accessRequests.requestAccess')}\r\n </button>\r\n\r\n {showReasonModal && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('accessRequests.modal.requestTitle')}</h3>\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded\"\r\n disabled={loading}\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block font-medium mb-2\">\r\n {t('accessRequests.modal.reasonLabel')}\r\n </label>\r\n <textarea\r\n value={reason}\r\n onChange={(e) => setReason(e.target.value)}\r\n className=\"w-full px-3 py-2 border rounded-[var(--radius-input)] bg-[var(--bg-primary)] border-[var(--border-color)]\"\r\n rows={3}\r\n placeholder={t('accessRequests.modal.reasonPlaceholder')}\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={() => setShowReasonModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:bg-[var(--bg-hover)]\"\r\n disabled={loading}\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleRequest}\r\n disabled={loading}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {loading && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:submit')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { memo, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Star,\r\n LifeBuoy,\r\n Briefcase,\r\n FileText,\r\n Box,\r\n ArrowRight,\r\n Lock,\r\n} from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useNavigation, type ApplicationDto } from '@/contexts/NavigationContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { RequestAccessButton } from '@/components/platform/administration/access-requests';\r\nimport { useUserAccessRequests } from '@/hooks/useUserAccessRequests';\r\n\r\nconst iconMap: Record<string, typeof Box> = {\r\n lifebuoy: LifeBuoy,\r\n briefcase: Briefcase,\r\n file: FileText,\r\n box: Box,\r\n};\r\n\r\nfunction getIcon(iconName: string | null) {\r\n if (!iconName) return Box;\r\n return iconMap[iconName.toLowerCase()] || Box;\r\n}\r\n\r\ninterface ApplicationCardProps {\r\n readonly app: ApplicationDto;\r\n readonly isFavorite: boolean;\r\n readonly onToggleFavorite: () => void;\r\n readonly buildUrl: (path: string) => string;\r\n readonly tenantId?: string;\r\n readonly existingRequestStatus?: 'Pending' | 'Denied' | null;\r\n readonly onAccessRequested?: () => void;\r\n}\r\n\r\nconst ApplicationCard = memo(function ApplicationCard({ app, isFavorite, onToggleFavorite, buildUrl, tenantId, existingRequestStatus, onAccessRequested }: ApplicationCardProps) {\r\n const { t } = useTranslation('navigation');\r\n const Icon = getIcon(app.icon);\r\n const isRequestAccess = app.accessLevel === 'RequestAccess' && app.modules.length === 0;\r\n\r\n const handleFavoriteClick = useCallback((e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onToggleFavorite();\r\n }, [onToggleFavorite]);\r\n\r\n if (isRequestAccess) {\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--warning-border)] transition-all duration-300 hover:shadow-lg\">\r\n <div className=\"block p-6\">\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--warning-bg)] flex items-center justify-center\">\r\n <Icon className=\"w-7 h-7 text-[var(--warning-text)]\" />\r\n </div>\r\n <div className=\"p-2 rounded-lg bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n <Lock className=\"w-5 h-5\" />\r\n </div>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--warning-text)] opacity-80 mb-4\">\r\n {t('applicationsPage.requestAccessDesc', \"Restricted access - request required\")}\r\n </p>\r\n\r\n {tenantId && (\r\n <RequestAccessButton\r\n applicationId={app.id}\r\n tenantId={tenantId}\r\n existingStatus={existingRequestStatus}\r\n onSuccess={onAccessRequested}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"group relative bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden hover:border-[var(--color-accent-400)] transition-all duration-300 hover:shadow-lg\">\r\n <Link\r\n to={app.route ? buildUrl(app.route) : '#'}\r\n className=\"block p-6\"\r\n >\r\n <div className=\"flex items-start justify-between mb-4\">\r\n <div className=\"w-14 h-14 rounded-xl bg-[var(--accent-bg)] flex items-center justify-center group-hover:opacity-90 transition-all\">\r\n <Icon className=\"w-7 h-7 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <button\r\n onClick={handleFavoriteClick}\r\n className={`p-2 rounded-lg transition-all duration-200 ${\r\n isFavorite\r\n ? 'text-[var(--warning-text)] bg-[var(--warning-bg)]'\r\n : 'text-[var(--text-tertiary)] opacity-0 group-hover:opacity-100 hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n title={isFavorite ? t('applicationsPage.removeFavorite', 'Remove from favorites') : t('applicationsPage.addFavorite', 'Add to favorites')}\r\n >\r\n <Star className={`w-5 h-5 ${isFavorite ? 'fill-current' : ''}`} />\r\n </button>\r\n </div>\r\n\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-2\">\r\n {app.label}\r\n </h3>\r\n\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {app.modules.length} {app.modules.length === 1\r\n ? t('applicationsPage.moduleCount_one', 'module')\r\n : t('applicationsPage.moduleCount_other', 'modules')}\r\n </p>\r\n\r\n <div className=\"flex items-center gap-2 text-[var(--color-accent-500)] text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {t('applicationsPage.open', 'Open')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </div>\r\n </Link>\r\n </div>\r\n );\r\n});\r\n\r\nexport function ApplicationsPage(): ReactElement | null {\r\n const { t } = useTranslation('navigation');\r\n const { favorites, menu, toggleFavorite, isFavorite, isLoading, refreshMenu } = useNavigation();\r\n const { currentTenant } = useTenant();\r\n const buildUrl = useTenantUrl();\r\n const { requests: myAccessRequests, reload: reloadAccessRequests } = useUserAccessRequests();\r\n\r\n const applications = menu?.applications || [];\r\n\r\n const getRequestStatus = useCallback((appId: string): 'Pending' | 'Denied' | null => {\r\n const appRequests = myAccessRequests\r\n .filter(r => r.applicationId === appId && r.tenantId === currentTenant?.id);\r\n const pending = appRequests.find(r => r.status === 'Pending');\r\n if (pending) return 'Pending';\r\n const denied = appRequests.find(r => r.status === 'Denied');\r\n if (denied) return 'Denied';\r\n return null;\r\n }, [myAccessRequests, currentTenant?.id]);\r\n\r\n const handleAccessRequested = useCallback(() => {\r\n refreshMenu();\r\n reloadAccessRequests();\r\n }, [refreshMenu, reloadAccessRequests]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <div className=\"w-8 h-8 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-8\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('applicationsPage.title', 'Applications')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('applicationsPage.subtitle', 'Your available applications')}\r\n </p>\r\n </div>\r\n\r\n {favorites.length > 0 && (\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Star className=\"w-5 h-5 text-[var(--warning-text)] fill-[var(--warning-text)]\" />\r\n {t('applicationsPage.favorites', 'Favorites')}\r\n </h2>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {favorites.map(fav => {\r\n const app = applications.find(a => a.id === fav.id);\r\n if (!app) return null;\r\n return (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={true}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n );\r\n })}\r\n </div>\r\n </section>\r\n )}\r\n\r\n <section>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('applicationsPage.all', 'All applications')}\r\n </h2>\r\n {applications.length > 0 ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {applications.map(app => (\r\n <ApplicationCard\r\n key={app.id}\r\n app={app}\r\n isFavorite={isFavorite(app.id)}\r\n onToggleFavorite={() => toggleFavorite(app.id)}\r\n buildUrl={buildUrl}\r\n tenantId={currentTenant?.id}\r\n existingRequestStatus={getRequestStatus(app.id)}\r\n onAccessRequested={handleAccessRequested}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-12 bg-[var(--bg-card)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <Box className=\"w-12 h-12 text-[var(--text-tertiary)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('applicationsPage.noApps', 'No applications available')}\r\n </p>\r\n </div>\r\n )}\r\n </section>\r\n </div>\r\n );\r\n}\r\n"],"names":["RequestAccessButton","applicationId","tenantId","existingStatus","onSuccess","t","useTranslation","loading","setLoading","useState","showReasonModal","setShowReasonModal","reason","setReason","justSubmitted","setJustSubmitted","handleRequest","accessRequestsApi","err","jsxs","jsx","Clock","RefreshCw","LogIn","X","e","Loader2","iconMap","LifeBuoy","Briefcase","FileText","Box","getIcon","iconName","ApplicationCard","memo","app","isFavorite","onToggleFavorite","buildUrl","existingRequestStatus","onAccessRequested","Icon","isRequestAccess","handleFavoriteClick","useCallback","Lock","Link","Star","ArrowRight","ApplicationsPage","favorites","menu","toggleFavorite","isLoading","refreshMenu","useNavigation","currentTenant","useTenant","useTenantUrl","myAccessRequests","reloadAccessRequests","useUserAccessRequests","applications","getRequestStatus","appId","appRequests","r","handleAccessRequested","fav","a"],"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"),i=require("react"),O=require("react-i18next"),c=require("lucide-react"),x=require("./index-2wUhd9Lu.js"),C=["RoundRobin","LoadBalancing","SkillBased","Affinity","PriorityBased"],B=["Low","Medium","High","Critical"],D=["Bug","FeatureRequest","Support","Question","Suggestion","ApplicationRequest"],N={name:"",priority:0,strategyType:"RoundRobin",ticketPriorityFilter:null,ticketTypeFilter:null,maxConcurrentTickets:10,isFallback:!1};function H(s,l){if(!s.ticketPriorityFilter&&!s.ticketTypeFilter)return l("assignment.noFilter");const o=[];return s.ticketPriorityFilter&&o.push(l(`tickets.priorities.${s.ticketPriorityFilter}`)),s.ticketTypeFilter&&o.push(l(`tickets.types.${s.ticketTypeFilter}`)),o.join(" + ")}function _(){const{t:s}=O.useTranslation("support"),[l,o]=i.useState(!0),[k,d]=i.useState(null),[u,S]=i.useState([]),[T,R]=i.useState(""),[h,A]=i.useState(""),[g,P]=i.useState(""),[E,y]=i.useState(!1),[b,v]=i.useState(null),[a,n]=i.useState(N),[r,F]=i.useState(!1),p=i.useCallback(async()=>{try{o(!0),d(null);const t=await x.rulesApi.getAll();S(t)}catch(t){d(t instanceof Error?t.message:"Failed to load assignment rules"),console.error("Failed to load assignment rules:",t)}finally{o(!1)}},[]);i.useEffect(()=>{p()},[p]);const L=u.filter(t=>{const f=t.name.toLowerCase().includes(T.toLowerCase()),m=!h||t.strategyType===h,M=!g||(g==="active"?t.isActive:!t.isActive);return f&&m&&M}),w=()=>{v(null),n(N),y(!0)},I=t=>{v(t),n({name:t.name,priority:t.priority,strategyType:t.strategyType,ticketPriorityFilter:t.ticketPriorityFilter,ticketTypeFilter:t.ticketTypeFilter,maxConcurrentTickets:t.maxConcurrentTickets,isFallback:t.isFallback}),y(!0)},j=()=>{y(!1),v(null),n(N)},$=async()=>{if(!a.name.trim()){alert(s("assignment.form.nameRequired"));return}try{F(!0),d(null);const t={name:a.name,priority:a.priority,strategyType:a.strategyType,ticketPriorityFilter:a.ticketPriorityFilter||void 0,ticketTypeFilter:a.ticketTypeFilter||void 0,maxConcurrentTickets:a.maxConcurrentTickets,isFallback:a.isFallback};b?await x.rulesApi.update(b.id,t):await x.rulesApi.create(t),await p(),j()}catch(t){d(t instanceof Error?t.message:"Failed to save rule"),console.error("Failed to save rule:",t)}finally{F(!1)}},q=async(t,f)=>{if(window.confirm(s("assignment.confirmDelete",{name:f})))try{d(null),await x.rulesApi.delete(t),await p()}catch(m){d(m instanceof Error?m.message:"Failed to delete rule"),console.error("Failed to delete rule:",m)}};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(x.Breadcrumb,{items:[{label:s("title","Support"),href:"/support"},{label:s("assignment.title")}]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:s("assignment.title")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("assignment.subtitle","Manage auto-assignment rules for tickets")})]}),e.jsxs("button",{onClick:w,className:"btn btn-primary flex items-center gap-2",children:[e.jsx(c.Plus,{className:"w-4 h-4"}),s("assignment.create")]})]}),k&&e.jsxs("div",{className:"card p-4 bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-start gap-3",children:[e.jsx(c.AlertCircle,{className:"w-5 h-5 flex-shrink-0 mt-0.5"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s("common:error")}),e.jsx("p",{className:"text-sm",children:k})]})]}),l&&e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(c.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}),!l&&u.length===0&&e.jsxs("div",{className:"card p-12 text-center",children:[e.jsx("p",{className:"text-xl font-semibold mb-2",children:s("assignment.noRules")}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-6",children:s("assignment.noRulesSubtitle","Create your first assignment rule to get started")}),e.jsx("button",{onClick:w,className:"btn btn-primary",children:s("assignment.create")})]}),!l&&u.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"card p-4 space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("assignment.search")}),e.jsxs("div",{className:"relative",children:[e.jsx(c.Search,{className:"absolute left-3 top-3 w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("input",{type:"text",placeholder:s("assignment.searchPlaceholder","Search by name..."),value:T,onChange:t=>R(t.target.value),className:"input w-full pl-10"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("assignment.strategy")}),e.jsxs("select",{value:h,onChange:t=>A(t.target.value),className:"input w-full",children:[e.jsx("option",{value:"",children:s("assignment.allStrategies","All Strategies")}),C.map(t=>e.jsx("option",{value:t,children:s(`assignment.strategyTypes.${t.charAt(0).toLowerCase()}${t.slice(1)}`)},t))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("assignment.status")}),e.jsxs("select",{value:g,onChange:t=>P(t.target.value),className:"input w-full",children:[e.jsx("option",{value:"",children:s("assignment.allStatus","All Status")}),e.jsx("option",{value:"active",children:s("common:active")}),e.jsx("option",{value:"inactive",children:s("common:inactive")})]})]})]})]}),e.jsx("div",{className:"card overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.name")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.strategy")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.priority")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.filters")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.maxTickets")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.active")}),e.jsx("th",{className:"px-6 py-3 text-right text-sm font-semibold text-[var(--text-secondary)]",children:s("common:actions.title")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:L.map(t=>e.jsxs("tr",{className:"hover:bg-[var(--bg-secondary)] transition",children:[e.jsx("td",{className:"px-6 py-4 text-sm font-medium",children:t.name}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:s(`assignment.strategyTypes.${t.strategyType.charAt(0).toLowerCase()}${t.strategyType.slice(1)}`)}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:t.priority}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:e.jsx("span",{className:"inline-block text-xs bg-[var(--bg-secondary)] px-2 py-1 rounded",children:H(t,s)})}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:t.maxConcurrentTickets}),e.jsx("td",{className:"px-6 py-4 text-sm",children:e.jsx("span",{className:`px-3 py-1 rounded-full text-xs font-medium ${t.isActive?"bg-[var(--success-bg)] text-[var(--success-text)]":"bg-[var(--bg-secondary)] text-[var(--text-secondary)]"}`,children:t.isActive?s("common:active"):s("common:inactive")})}),e.jsx("td",{className:"px-6 py-4 text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-2",children:[e.jsxs("button",{onClick:()=>I(t),className:"btn btn-secondary btn-sm flex items-center gap-1",children:[e.jsx(c.Edit,{className:"w-4 h-4"}),s("common:actions.edit")]}),e.jsxs("button",{onClick:()=>q(t.id,t.name),className:"btn btn-secondary btn-sm flex items-center gap-1 text-[var(--error-text)]",children:[e.jsx(c.Trash2,{className:"w-4 h-4"}),s("common:actions.delete")]})]})})]},t.id))})]})})]}),E&&e.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"bg-[var(--bg-primary)] rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto",children:[e.jsxs("div",{className:"sticky top-0 bg-[var(--bg-secondary)] border-b border-[var(--border-color)] px-6 py-4 flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold",children:s(b?"assignment.edit":"assignment.create")}),e.jsx("button",{onClick:j,disabled:r,className:"text-[var(--text-secondary)] hover:text-[var(--text-primary)]",children:"✕"})]}),e.jsxs("div",{className:"p-6 space-y-4",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-1",children:[s("assignment.name")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("input",{type:"text",value:a.name,onChange:t=>n({...a,name:t.target.value}),placeholder:s("assignment.form.namePlaceholder","Rule name"),className:"input w-full",disabled:r})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.priority")}),e.jsx("input",{type:"number",value:a.priority,onChange:t=>n({...a,priority:parseInt(t.target.value)||0}),placeholder:"0",className:"input w-full",disabled:r}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:s("assignment.form.priorityHint","Lower number = higher priority")})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-1",children:[s("assignment.strategy")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("select",{value:a.strategyType,onChange:t=>n({...a,strategyType:t.target.value}),className:"input w-full",disabled:r,children:C.map(t=>e.jsx("option",{value:t,children:s(`assignment.strategyTypes.${t.charAt(0).toLowerCase()}${t.slice(1)}`)},t))})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.form.ticketPriority","Ticket Priority Filter")}),e.jsxs("select",{value:a.ticketPriorityFilter||"",onChange:t=>n({...a,ticketPriorityFilter:t.target.value||null}),className:"input w-full",disabled:r,children:[e.jsx("option",{value:"",children:s("assignment.form.noFilter","No filter")}),B.map(t=>e.jsx("option",{value:t,children:s(`tickets.priorities.${t}`)},t))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.form.ticketType","Ticket Type Filter")}),e.jsxs("select",{value:a.ticketTypeFilter||"",onChange:t=>n({...a,ticketTypeFilter:t.target.value||null}),className:"input w-full",disabled:r,children:[e.jsx("option",{value:"",children:s("assignment.form.noFilter","No filter")}),D.map(t=>e.jsx("option",{value:t,children:s(`tickets.types.${t}`)},t))]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.maxTickets")}),e.jsx("input",{type:"number",min:"1",value:a.maxConcurrentTickets,onChange:t=>n({...a,maxConcurrentTickets:Math.max(1,parseInt(t.target.value)||1)}),className:"input w-full",disabled:r})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"isFallback",checked:a.isFallback,onChange:t=>n({...a,isFallback:t.target.checked}),className:"rounded border-[var(--border-color)]",disabled:r}),e.jsx("label",{htmlFor:"isFallback",className:"text-sm font-medium",children:s("assignment.fallback")}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] ml-auto",children:s("assignment.form.fallbackHint","Used when other rules do not match")})]})]}),e.jsxs("div",{className:"border-t border-[var(--border-color)] px-6 py-4 flex justify-end gap-2 bg-[var(--bg-secondary)]",children:[e.jsx("button",{onClick:j,disabled:r,className:"btn btn-secondary",children:s("common:actions.cancel")}),e.jsxs("button",{onClick:$,disabled:r,className:"btn btn-primary flex items-center gap-2",children:[r&&e.jsx(c.Loader2,{className:"w-4 h-4 animate-spin"}),s("common:actions.save")]})]})]})})]})}exports.AssignmentRulesPage=_;
2
- //# sourceMappingURL=AssignmentRulesPage-D8vfGDBN.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),i=require("react"),O=require("react-i18next"),c=require("lucide-react"),x=require("./index-IgLVXPg8.js"),C=["RoundRobin","LoadBalancing","SkillBased","Affinity","PriorityBased"],B=["Low","Medium","High","Critical"],D=["Bug","FeatureRequest","Support","Question","Suggestion","ApplicationRequest"],N={name:"",priority:0,strategyType:"RoundRobin",ticketPriorityFilter:null,ticketTypeFilter:null,maxConcurrentTickets:10,isFallback:!1};function H(s,l){if(!s.ticketPriorityFilter&&!s.ticketTypeFilter)return l("assignment.noFilter");const o=[];return s.ticketPriorityFilter&&o.push(l(`tickets.priorities.${s.ticketPriorityFilter}`)),s.ticketTypeFilter&&o.push(l(`tickets.types.${s.ticketTypeFilter}`)),o.join(" + ")}function _(){const{t:s}=O.useTranslation("support"),[l,o]=i.useState(!0),[k,d]=i.useState(null),[u,S]=i.useState([]),[T,R]=i.useState(""),[h,A]=i.useState(""),[g,P]=i.useState(""),[E,y]=i.useState(!1),[b,v]=i.useState(null),[a,n]=i.useState(N),[r,F]=i.useState(!1),p=i.useCallback(async()=>{try{o(!0),d(null);const t=await x.rulesApi.getAll();S(t)}catch(t){d(t instanceof Error?t.message:"Failed to load assignment rules"),console.error("Failed to load assignment rules:",t)}finally{o(!1)}},[]);i.useEffect(()=>{p()},[p]);const L=u.filter(t=>{const f=t.name.toLowerCase().includes(T.toLowerCase()),m=!h||t.strategyType===h,M=!g||(g==="active"?t.isActive:!t.isActive);return f&&m&&M}),w=()=>{v(null),n(N),y(!0)},I=t=>{v(t),n({name:t.name,priority:t.priority,strategyType:t.strategyType,ticketPriorityFilter:t.ticketPriorityFilter,ticketTypeFilter:t.ticketTypeFilter,maxConcurrentTickets:t.maxConcurrentTickets,isFallback:t.isFallback}),y(!0)},j=()=>{y(!1),v(null),n(N)},$=async()=>{if(!a.name.trim()){alert(s("assignment.form.nameRequired"));return}try{F(!0),d(null);const t={name:a.name,priority:a.priority,strategyType:a.strategyType,ticketPriorityFilter:a.ticketPriorityFilter||void 0,ticketTypeFilter:a.ticketTypeFilter||void 0,maxConcurrentTickets:a.maxConcurrentTickets,isFallback:a.isFallback};b?await x.rulesApi.update(b.id,t):await x.rulesApi.create(t),await p(),j()}catch(t){d(t instanceof Error?t.message:"Failed to save rule"),console.error("Failed to save rule:",t)}finally{F(!1)}},q=async(t,f)=>{if(window.confirm(s("assignment.confirmDelete",{name:f})))try{d(null),await x.rulesApi.delete(t),await p()}catch(m){d(m instanceof Error?m.message:"Failed to delete rule"),console.error("Failed to delete rule:",m)}};return e.jsxs("div",{className:"space-y-6",children:[e.jsx(x.Breadcrumb,{items:[{label:s("title","Support"),href:"/support"},{label:s("assignment.title")}]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:s("assignment.title")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("assignment.subtitle","Manage auto-assignment rules for tickets")})]}),e.jsxs("button",{onClick:w,className:"btn btn-primary flex items-center gap-2",children:[e.jsx(c.Plus,{className:"w-4 h-4"}),s("assignment.create")]})]}),k&&e.jsxs("div",{className:"card p-4 bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-start gap-3",children:[e.jsx(c.AlertCircle,{className:"w-5 h-5 flex-shrink-0 mt-0.5"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s("common:error")}),e.jsx("p",{className:"text-sm",children:k})]})]}),l&&e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(c.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}),!l&&u.length===0&&e.jsxs("div",{className:"card p-12 text-center",children:[e.jsx("p",{className:"text-xl font-semibold mb-2",children:s("assignment.noRules")}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-6",children:s("assignment.noRulesSubtitle","Create your first assignment rule to get started")}),e.jsx("button",{onClick:w,className:"btn btn-primary",children:s("assignment.create")})]}),!l&&u.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"card p-4 space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("assignment.search")}),e.jsxs("div",{className:"relative",children:[e.jsx(c.Search,{className:"absolute left-3 top-3 w-4 h-4 text-[var(--text-secondary)]"}),e.jsx("input",{type:"text",placeholder:s("assignment.searchPlaceholder","Search by name..."),value:T,onChange:t=>R(t.target.value),className:"input w-full pl-10"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("assignment.strategy")}),e.jsxs("select",{value:h,onChange:t=>A(t.target.value),className:"input w-full",children:[e.jsx("option",{value:"",children:s("assignment.allStrategies","All Strategies")}),C.map(t=>e.jsx("option",{value:t,children:s(`assignment.strategyTypes.${t.charAt(0).toLowerCase()}${t.slice(1)}`)},t))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("assignment.status")}),e.jsxs("select",{value:g,onChange:t=>P(t.target.value),className:"input w-full",children:[e.jsx("option",{value:"",children:s("assignment.allStatus","All Status")}),e.jsx("option",{value:"active",children:s("common:active")}),e.jsx("option",{value:"inactive",children:s("common:inactive")})]})]})]})]}),e.jsx("div",{className:"card overflow-hidden",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.name")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.strategy")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.priority")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.filters")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.maxTickets")}),e.jsx("th",{className:"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]",children:s("assignment.active")}),e.jsx("th",{className:"px-6 py-3 text-right text-sm font-semibold text-[var(--text-secondary)]",children:s("common:actions.title")})]})}),e.jsx("tbody",{className:"divide-y divide-[var(--border-color)]",children:L.map(t=>e.jsxs("tr",{className:"hover:bg-[var(--bg-secondary)] transition",children:[e.jsx("td",{className:"px-6 py-4 text-sm font-medium",children:t.name}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:s(`assignment.strategyTypes.${t.strategyType.charAt(0).toLowerCase()}${t.strategyType.slice(1)}`)}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:t.priority}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:e.jsx("span",{className:"inline-block text-xs bg-[var(--bg-secondary)] px-2 py-1 rounded",children:H(t,s)})}),e.jsx("td",{className:"px-6 py-4 text-sm text-[var(--text-secondary)]",children:t.maxConcurrentTickets}),e.jsx("td",{className:"px-6 py-4 text-sm",children:e.jsx("span",{className:`px-3 py-1 rounded-full text-xs font-medium ${t.isActive?"bg-[var(--success-bg)] text-[var(--success-text)]":"bg-[var(--bg-secondary)] text-[var(--text-secondary)]"}`,children:t.isActive?s("common:active"):s("common:inactive")})}),e.jsx("td",{className:"px-6 py-4 text-right",children:e.jsxs("div",{className:"flex items-center justify-end gap-2",children:[e.jsxs("button",{onClick:()=>I(t),className:"btn btn-secondary btn-sm flex items-center gap-1",children:[e.jsx(c.Edit,{className:"w-4 h-4"}),s("common:actions.edit")]}),e.jsxs("button",{onClick:()=>q(t.id,t.name),className:"btn btn-secondary btn-sm flex items-center gap-1 text-[var(--error-text)]",children:[e.jsx(c.Trash2,{className:"w-4 h-4"}),s("common:actions.delete")]})]})})]},t.id))})]})})]}),E&&e.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"bg-[var(--bg-primary)] rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto",children:[e.jsxs("div",{className:"sticky top-0 bg-[var(--bg-secondary)] border-b border-[var(--border-color)] px-6 py-4 flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold",children:s(b?"assignment.edit":"assignment.create")}),e.jsx("button",{onClick:j,disabled:r,className:"text-[var(--text-secondary)] hover:text-[var(--text-primary)]",children:"✕"})]}),e.jsxs("div",{className:"p-6 space-y-4",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-1",children:[s("assignment.name")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("input",{type:"text",value:a.name,onChange:t=>n({...a,name:t.target.value}),placeholder:s("assignment.form.namePlaceholder","Rule name"),className:"input w-full",disabled:r})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.priority")}),e.jsx("input",{type:"number",value:a.priority,onChange:t=>n({...a,priority:parseInt(t.target.value)||0}),placeholder:"0",className:"input w-full",disabled:r}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:s("assignment.form.priorityHint","Lower number = higher priority")})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-1",children:[s("assignment.strategy")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("select",{value:a.strategyType,onChange:t=>n({...a,strategyType:t.target.value}),className:"input w-full",disabled:r,children:C.map(t=>e.jsx("option",{value:t,children:s(`assignment.strategyTypes.${t.charAt(0).toLowerCase()}${t.slice(1)}`)},t))})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.form.ticketPriority","Ticket Priority Filter")}),e.jsxs("select",{value:a.ticketPriorityFilter||"",onChange:t=>n({...a,ticketPriorityFilter:t.target.value||null}),className:"input w-full",disabled:r,children:[e.jsx("option",{value:"",children:s("assignment.form.noFilter","No filter")}),B.map(t=>e.jsx("option",{value:t,children:s(`tickets.priorities.${t}`)},t))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.form.ticketType","Ticket Type Filter")}),e.jsxs("select",{value:a.ticketTypeFilter||"",onChange:t=>n({...a,ticketTypeFilter:t.target.value||null}),className:"input w-full",disabled:r,children:[e.jsx("option",{value:"",children:s("assignment.form.noFilter","No filter")}),D.map(t=>e.jsx("option",{value:t,children:s(`tickets.types.${t}`)},t))]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:s("assignment.maxTickets")}),e.jsx("input",{type:"number",min:"1",value:a.maxConcurrentTickets,onChange:t=>n({...a,maxConcurrentTickets:Math.max(1,parseInt(t.target.value)||1)}),className:"input w-full",disabled:r})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"isFallback",checked:a.isFallback,onChange:t=>n({...a,isFallback:t.target.checked}),className:"rounded border-[var(--border-color)]",disabled:r}),e.jsx("label",{htmlFor:"isFallback",className:"text-sm font-medium",children:s("assignment.fallback")}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] ml-auto",children:s("assignment.form.fallbackHint","Used when other rules do not match")})]})]}),e.jsxs("div",{className:"border-t border-[var(--border-color)] px-6 py-4 flex justify-end gap-2 bg-[var(--bg-secondary)]",children:[e.jsx("button",{onClick:j,disabled:r,className:"btn btn-secondary",children:s("common:actions.cancel")}),e.jsxs("button",{onClick:$,disabled:r,className:"btn btn-primary flex items-center gap-2",children:[r&&e.jsx(c.Loader2,{className:"w-4 h-4 animate-spin"}),s("common:actions.save")]})]})]})})]})}exports.AssignmentRulesPage=_;
2
+ //# sourceMappingURL=AssignmentRulesPage-CFffeEbo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssignmentRulesPage-D8vfGDBN.js","sources":["../../src/pages/platform/support/AssignmentRulesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, Plus, Edit, Trash2, Search, AlertCircle } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { rulesApi, type AssignmentRuleDto, type CreateAssignmentRuleRequest, type UpdateAssignmentRuleRequest } from '@/services/api/assignmentApi';\r\n\r\nconst STRATEGY_OPTIONS = [\r\n 'RoundRobin',\r\n 'LoadBalancing',\r\n 'SkillBased',\r\n 'Affinity',\r\n 'PriorityBased',\r\n] as const;\r\n\r\nconst TICKET_PRIORITIES = ['Low', 'Medium', 'High', 'Critical'] as const;\r\nconst TICKET_TYPES = ['Bug', 'FeatureRequest', 'Support', 'Question', 'Suggestion', 'ApplicationRequest'] as const;\r\n\r\ninterface FormData {\r\n name: string;\r\n priority: number;\r\n strategyType: string;\r\n ticketPriorityFilter: string | null;\r\n ticketTypeFilter: string | null;\r\n maxConcurrentTickets: number;\r\n isFallback: boolean;\r\n}\r\n\r\nconst defaultFormData: FormData = {\r\n name: '',\r\n priority: 0,\r\n strategyType: 'RoundRobin',\r\n ticketPriorityFilter: null,\r\n ticketTypeFilter: null,\r\n maxConcurrentTickets: 10,\r\n isFallback: false,\r\n};\r\n\r\nfunction formatRuleFilters(\r\n rule: Pick<AssignmentRuleDto, 'ticketPriorityFilter' | 'ticketTypeFilter'>,\r\n t: (key: string) => string\r\n): string {\r\n if (!rule.ticketPriorityFilter && !rule.ticketTypeFilter) {\r\n return t('assignment.noFilter');\r\n }\r\n\r\n const parts: string[] = [];\r\n if (rule.ticketPriorityFilter) {\r\n parts.push(t(`tickets.priorities.${rule.ticketPriorityFilter}`));\r\n }\r\n if (rule.ticketTypeFilter) {\r\n parts.push(t(`tickets.types.${rule.ticketTypeFilter}`));\r\n }\r\n return parts.join(' + ');\r\n}\r\n\r\nexport function AssignmentRulesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rules, setRules] = useState<AssignmentRuleDto[]>([]);\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [strategyFilter, setStrategyFilter] = useState<string>('');\r\n const [activeFilter, setActiveFilter] = useState<string>('');\r\n\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n const [editingRule, setEditingRule] = useState<AssignmentRuleDto | null>(null);\r\n const [formData, setFormData] = useState<FormData>(defaultFormData);\r\n const [saving, setSaving] = useState(false);\r\n\r\n const loadRules = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await rulesApi.getAll();\r\n setRules(data);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load assignment rules');\r\n console.error('Failed to load assignment rules:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadRules();\r\n }, [loadRules]);\r\n\r\n const filteredRules = rules.filter((rule) => {\r\n const matchesSearch = rule.name.toLowerCase().includes(searchTerm.toLowerCase());\r\n const matchesStrategy = !strategyFilter || rule.strategyType === strategyFilter;\r\n const matchesActive = !activeFilter || (activeFilter === 'active' ? rule.isActive : !rule.isActive);\r\n return matchesSearch && matchesStrategy && matchesActive;\r\n });\r\n\r\n const handleCreate = () => {\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleEdit = (rule: AssignmentRuleDto) => {\r\n setEditingRule(rule);\r\n setFormData({\r\n name: rule.name,\r\n priority: rule.priority,\r\n strategyType: rule.strategyType,\r\n ticketPriorityFilter: rule.ticketPriorityFilter,\r\n ticketTypeFilter: rule.ticketTypeFilter,\r\n maxConcurrentTickets: rule.maxConcurrentTickets,\r\n isFallback: rule.isFallback,\r\n });\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleCloseModal = () => {\r\n setIsModalOpen(false);\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!formData.name.trim()) {\r\n alert(t('assignment.form.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n const payload: CreateAssignmentRuleRequest | UpdateAssignmentRuleRequest = {\r\n name: formData.name,\r\n priority: formData.priority,\r\n strategyType: formData.strategyType,\r\n ticketPriorityFilter: formData.ticketPriorityFilter || undefined,\r\n ticketTypeFilter: formData.ticketTypeFilter || undefined,\r\n maxConcurrentTickets: formData.maxConcurrentTickets,\r\n isFallback: formData.isFallback,\r\n };\r\n\r\n if (editingRule) {\r\n await rulesApi.update(editingRule.id, payload as UpdateAssignmentRuleRequest);\r\n } else {\r\n await rulesApi.create(payload as CreateAssignmentRuleRequest);\r\n }\r\n\r\n await loadRules();\r\n handleCloseModal();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to save rule');\r\n console.error('Failed to save rule:', err);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string, name: string) => {\r\n if (!window.confirm(t('assignment.confirmDelete', { name }))) {\r\n return;\r\n }\r\n\r\n try {\r\n setError(null);\r\n await rulesApi.delete(id);\r\n await loadRules();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to delete rule');\r\n console.error('Failed to delete rule:', err);\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('assignment.title') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold\">{t('assignment.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('assignment.subtitle', 'Manage auto-assignment rules for tickets')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"card p-4 bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <p className=\"font-medium\">{t('common:error')}</p>\r\n <p className=\"text-sm\">{error}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && rules.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <p className=\"text-xl font-semibold mb-2\">{t('assignment.noRules')}</p>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('assignment.noRulesSubtitle', 'Create your first assignment rule to get started')}\r\n </p>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary\"\r\n >\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n )}\r\n {!loading && rules.length > 0 && (\r\n <>\r\n <div className=\"card p-4 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.search')}</label>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-3 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('assignment.searchPlaceholder', 'Search by name...')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.strategy')}</label>\r\n <select\r\n value={strategyFilter}\r\n onChange={(e) => setStrategyFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStrategies', 'All Strategies')}</option>\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.status')}</label>\r\n <select\r\n value={activeFilter}\r\n onChange={(e) => setActiveFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStatus', 'All Status')}</option>\r\n <option value=\"active\">{t('common:active')}</option>\r\n <option value=\"inactive\">{t('common:inactive')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.name')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.strategy')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.priority')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.filters')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.maxTickets')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.active')}\r\n </th>\r\n <th className=\"px-6 py-3 text-right text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('common:actions.title')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredRules.map((rule) => (\r\n <tr key={rule.id} className=\"hover:bg-[var(--bg-secondary)] transition\">\r\n <td className=\"px-6 py-4 text-sm font-medium\">{rule.name}</td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {t(`assignment.strategyTypes.${rule.strategyType.charAt(0).toLowerCase()}${rule.strategyType.slice(1)}`)}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.priority}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"inline-block text-xs bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n {formatRuleFilters(rule, t)}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.maxConcurrentTickets}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm\">\r\n <span className={`px-3 py-1 rounded-full text-xs font-medium ${\r\n rule.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {rule.isActive ? t('common:active') : t('common:inactive')}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-right\">\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={() => handleEdit(rule)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('common:actions.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(rule.id, rule.name)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1 text-[var(--error-text)]\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common:actions.delete')}\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </>\r\n )}\r\n\r\n {isModalOpen && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"sticky top-0 bg-[var(--bg-secondary)] border-b border-[var(--border-color)] px-6 py-4 flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingRule ? t('assignment.edit') : t('assignment.create')}\r\n </h2>\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-6 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\r\n placeholder={t('assignment.form.namePlaceholder', 'Rule name')}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.priority')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={formData.priority}\r\n onChange={(e) => setFormData({ ...formData, priority: parseInt(e.target.value) || 0 })}\r\n placeholder=\"0\"\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('assignment.form.priorityHint', 'Lower number = higher priority')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.strategy')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n value={formData.strategyType}\r\n onChange={(e) => setFormData({ ...formData, strategyType: e.target.value })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketPriority', 'Ticket Priority Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketPriorityFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketPriorityFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_PRIORITIES.map((priority) => (\r\n <option key={priority} value={priority}>\r\n {t(`tickets.priorities.${priority}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketType', 'Ticket Type Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketTypeFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketTypeFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`tickets.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.maxTickets')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={formData.maxConcurrentTickets}\r\n onChange={(e) => setFormData({ ...formData, maxConcurrentTickets: Math.max(1, parseInt(e.target.value) || 1) })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"isFallback\"\r\n checked={formData.isFallback}\r\n onChange={(e) => setFormData({ ...formData, isFallback: e.target.checked })}\r\n className=\"rounded border-[var(--border-color)]\"\r\n disabled={saving}\r\n />\r\n <label htmlFor=\"isFallback\" className=\"text-sm font-medium\">\r\n {t('assignment.fallback')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-secondary)] ml-auto\">\r\n {t('assignment.form.fallbackHint', 'Used when other rules do not match')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t border-[var(--border-color)] px-6 py-4 flex justify-end gap-2 bg-[var(--bg-secondary)]\">\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:actions.save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["STRATEGY_OPTIONS","TICKET_PRIORITIES","TICKET_TYPES","defaultFormData","formatRuleFilters","rule","t","parts","AssignmentRulesPage","useTranslation","loading","setLoading","useState","error","setError","rules","setRules","searchTerm","setSearchTerm","strategyFilter","setStrategyFilter","activeFilter","setActiveFilter","isModalOpen","setIsModalOpen","editingRule","setEditingRule","formData","setFormData","saving","setSaving","loadRules","useCallback","data","rulesApi","err","useEffect","filteredRules","matchesSearch","matchesStrategy","matchesActive","handleCreate","handleEdit","handleCloseModal","handleSave","payload","handleDelete","id","name","jsxs","jsx","Breadcrumb","Plus","AlertCircle","Loader2","Fragment","Search","e","strategy","Edit","Trash2","priority","type"],"mappings":"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"}
1
+ {"version":3,"file":"AssignmentRulesPage-CFffeEbo.js","sources":["../../src/pages/platform/support/AssignmentRulesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, Plus, Edit, Trash2, Search, AlertCircle } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { rulesApi, type AssignmentRuleDto, type CreateAssignmentRuleRequest, type UpdateAssignmentRuleRequest } from '@/services/api/assignmentApi';\r\n\r\nconst STRATEGY_OPTIONS = [\r\n 'RoundRobin',\r\n 'LoadBalancing',\r\n 'SkillBased',\r\n 'Affinity',\r\n 'PriorityBased',\r\n] as const;\r\n\r\nconst TICKET_PRIORITIES = ['Low', 'Medium', 'High', 'Critical'] as const;\r\nconst TICKET_TYPES = ['Bug', 'FeatureRequest', 'Support', 'Question', 'Suggestion', 'ApplicationRequest'] as const;\r\n\r\ninterface FormData {\r\n name: string;\r\n priority: number;\r\n strategyType: string;\r\n ticketPriorityFilter: string | null;\r\n ticketTypeFilter: string | null;\r\n maxConcurrentTickets: number;\r\n isFallback: boolean;\r\n}\r\n\r\nconst defaultFormData: FormData = {\r\n name: '',\r\n priority: 0,\r\n strategyType: 'RoundRobin',\r\n ticketPriorityFilter: null,\r\n ticketTypeFilter: null,\r\n maxConcurrentTickets: 10,\r\n isFallback: false,\r\n};\r\n\r\nfunction formatRuleFilters(\r\n rule: Pick<AssignmentRuleDto, 'ticketPriorityFilter' | 'ticketTypeFilter'>,\r\n t: (key: string) => string\r\n): string {\r\n if (!rule.ticketPriorityFilter && !rule.ticketTypeFilter) {\r\n return t('assignment.noFilter');\r\n }\r\n\r\n const parts: string[] = [];\r\n if (rule.ticketPriorityFilter) {\r\n parts.push(t(`tickets.priorities.${rule.ticketPriorityFilter}`));\r\n }\r\n if (rule.ticketTypeFilter) {\r\n parts.push(t(`tickets.types.${rule.ticketTypeFilter}`));\r\n }\r\n return parts.join(' + ');\r\n}\r\n\r\nexport function AssignmentRulesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rules, setRules] = useState<AssignmentRuleDto[]>([]);\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [strategyFilter, setStrategyFilter] = useState<string>('');\r\n const [activeFilter, setActiveFilter] = useState<string>('');\r\n\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n const [editingRule, setEditingRule] = useState<AssignmentRuleDto | null>(null);\r\n const [formData, setFormData] = useState<FormData>(defaultFormData);\r\n const [saving, setSaving] = useState(false);\r\n\r\n const loadRules = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await rulesApi.getAll();\r\n setRules(data);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load assignment rules');\r\n console.error('Failed to load assignment rules:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadRules();\r\n }, [loadRules]);\r\n\r\n const filteredRules = rules.filter((rule) => {\r\n const matchesSearch = rule.name.toLowerCase().includes(searchTerm.toLowerCase());\r\n const matchesStrategy = !strategyFilter || rule.strategyType === strategyFilter;\r\n const matchesActive = !activeFilter || (activeFilter === 'active' ? rule.isActive : !rule.isActive);\r\n return matchesSearch && matchesStrategy && matchesActive;\r\n });\r\n\r\n const handleCreate = () => {\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleEdit = (rule: AssignmentRuleDto) => {\r\n setEditingRule(rule);\r\n setFormData({\r\n name: rule.name,\r\n priority: rule.priority,\r\n strategyType: rule.strategyType,\r\n ticketPriorityFilter: rule.ticketPriorityFilter,\r\n ticketTypeFilter: rule.ticketTypeFilter,\r\n maxConcurrentTickets: rule.maxConcurrentTickets,\r\n isFallback: rule.isFallback,\r\n });\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleCloseModal = () => {\r\n setIsModalOpen(false);\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!formData.name.trim()) {\r\n alert(t('assignment.form.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n const payload: CreateAssignmentRuleRequest | UpdateAssignmentRuleRequest = {\r\n name: formData.name,\r\n priority: formData.priority,\r\n strategyType: formData.strategyType,\r\n ticketPriorityFilter: formData.ticketPriorityFilter || undefined,\r\n ticketTypeFilter: formData.ticketTypeFilter || undefined,\r\n maxConcurrentTickets: formData.maxConcurrentTickets,\r\n isFallback: formData.isFallback,\r\n };\r\n\r\n if (editingRule) {\r\n await rulesApi.update(editingRule.id, payload as UpdateAssignmentRuleRequest);\r\n } else {\r\n await rulesApi.create(payload as CreateAssignmentRuleRequest);\r\n }\r\n\r\n await loadRules();\r\n handleCloseModal();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to save rule');\r\n console.error('Failed to save rule:', err);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string, name: string) => {\r\n if (!window.confirm(t('assignment.confirmDelete', { name }))) {\r\n return;\r\n }\r\n\r\n try {\r\n setError(null);\r\n await rulesApi.delete(id);\r\n await loadRules();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to delete rule');\r\n console.error('Failed to delete rule:', err);\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('assignment.title') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold\">{t('assignment.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('assignment.subtitle', 'Manage auto-assignment rules for tickets')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"card p-4 bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <p className=\"font-medium\">{t('common:error')}</p>\r\n <p className=\"text-sm\">{error}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && rules.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <p className=\"text-xl font-semibold mb-2\">{t('assignment.noRules')}</p>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('assignment.noRulesSubtitle', 'Create your first assignment rule to get started')}\r\n </p>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary\"\r\n >\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n )}\r\n {!loading && rules.length > 0 && (\r\n <>\r\n <div className=\"card p-4 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.search')}</label>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-3 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('assignment.searchPlaceholder', 'Search by name...')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.strategy')}</label>\r\n <select\r\n value={strategyFilter}\r\n onChange={(e) => setStrategyFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStrategies', 'All Strategies')}</option>\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.status')}</label>\r\n <select\r\n value={activeFilter}\r\n onChange={(e) => setActiveFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStatus', 'All Status')}</option>\r\n <option value=\"active\">{t('common:active')}</option>\r\n <option value=\"inactive\">{t('common:inactive')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.name')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.strategy')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.priority')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.filters')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.maxTickets')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.active')}\r\n </th>\r\n <th className=\"px-6 py-3 text-right text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('common:actions.title')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredRules.map((rule) => (\r\n <tr key={rule.id} className=\"hover:bg-[var(--bg-secondary)] transition\">\r\n <td className=\"px-6 py-4 text-sm font-medium\">{rule.name}</td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {t(`assignment.strategyTypes.${rule.strategyType.charAt(0).toLowerCase()}${rule.strategyType.slice(1)}`)}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.priority}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"inline-block text-xs bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n {formatRuleFilters(rule, t)}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.maxConcurrentTickets}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm\">\r\n <span className={`px-3 py-1 rounded-full text-xs font-medium ${\r\n rule.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {rule.isActive ? t('common:active') : t('common:inactive')}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-right\">\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={() => handleEdit(rule)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('common:actions.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(rule.id, rule.name)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1 text-[var(--error-text)]\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common:actions.delete')}\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </>\r\n )}\r\n\r\n {isModalOpen && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"sticky top-0 bg-[var(--bg-secondary)] border-b border-[var(--border-color)] px-6 py-4 flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingRule ? t('assignment.edit') : t('assignment.create')}\r\n </h2>\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-6 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\r\n placeholder={t('assignment.form.namePlaceholder', 'Rule name')}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.priority')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={formData.priority}\r\n onChange={(e) => setFormData({ ...formData, priority: parseInt(e.target.value) || 0 })}\r\n placeholder=\"0\"\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('assignment.form.priorityHint', 'Lower number = higher priority')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.strategy')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n value={formData.strategyType}\r\n onChange={(e) => setFormData({ ...formData, strategyType: e.target.value })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketPriority', 'Ticket Priority Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketPriorityFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketPriorityFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_PRIORITIES.map((priority) => (\r\n <option key={priority} value={priority}>\r\n {t(`tickets.priorities.${priority}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketType', 'Ticket Type Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketTypeFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketTypeFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`tickets.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.maxTickets')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={formData.maxConcurrentTickets}\r\n onChange={(e) => setFormData({ ...formData, maxConcurrentTickets: Math.max(1, parseInt(e.target.value) || 1) })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"isFallback\"\r\n checked={formData.isFallback}\r\n onChange={(e) => setFormData({ ...formData, isFallback: e.target.checked })}\r\n className=\"rounded border-[var(--border-color)]\"\r\n disabled={saving}\r\n />\r\n <label htmlFor=\"isFallback\" className=\"text-sm font-medium\">\r\n {t('assignment.fallback')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-secondary)] ml-auto\">\r\n {t('assignment.form.fallbackHint', 'Used when other rules do not match')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t border-[var(--border-color)] px-6 py-4 flex justify-end gap-2 bg-[var(--bg-secondary)]\">\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:actions.save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["STRATEGY_OPTIONS","TICKET_PRIORITIES","TICKET_TYPES","defaultFormData","formatRuleFilters","rule","t","parts","AssignmentRulesPage","useTranslation","loading","setLoading","useState","error","setError","rules","setRules","searchTerm","setSearchTerm","strategyFilter","setStrategyFilter","activeFilter","setActiveFilter","isModalOpen","setIsModalOpen","editingRule","setEditingRule","formData","setFormData","saving","setSaving","loadRules","useCallback","data","rulesApi","err","useEffect","filteredRules","matchesSearch","matchesStrategy","matchesActive","handleCreate","handleEdit","handleCloseModal","handleSave","payload","handleDelete","id","name","jsxs","jsx","Breadcrumb","Plus","AlertCircle","Loader2","Fragment","Search","e","strategy","Edit","Trash2","priority","type"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs as s, jsx as t, Fragment as O } from "react/jsx-runtime";
2
2
  import { useState as l, useCallback as q, useEffect as H } from "react";
3
3
  import { useTranslation as _ } from "react-i18next";
4
4
  import { Plus as K, AlertCircle as Y, Loader2 as S, Search as z, Edit as G, Trash2 as Q } from "lucide-react";
5
- import { a5 as h, B as U } from "./index-CwSaRXXg.js";
5
+ import { a5 as h, B as U } from "./index-lpIzhufD.js";
6
6
  const P = [
7
7
  "RoundRobin",
8
8
  "LoadBalancing",
@@ -388,4 +388,4 @@ function se() {
388
388
  export {
389
389
  se as AssignmentRulesPage
390
390
  };
391
- //# sourceMappingURL=AssignmentRulesPage-CxktlEMB.js.map
391
+ //# sourceMappingURL=AssignmentRulesPage-D78UeUId.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssignmentRulesPage-CxktlEMB.js","sources":["../../src/pages/platform/support/AssignmentRulesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, Plus, Edit, Trash2, Search, AlertCircle } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { rulesApi, type AssignmentRuleDto, type CreateAssignmentRuleRequest, type UpdateAssignmentRuleRequest } from '@/services/api/assignmentApi';\r\n\r\nconst STRATEGY_OPTIONS = [\r\n 'RoundRobin',\r\n 'LoadBalancing',\r\n 'SkillBased',\r\n 'Affinity',\r\n 'PriorityBased',\r\n] as const;\r\n\r\nconst TICKET_PRIORITIES = ['Low', 'Medium', 'High', 'Critical'] as const;\r\nconst TICKET_TYPES = ['Bug', 'FeatureRequest', 'Support', 'Question', 'Suggestion', 'ApplicationRequest'] as const;\r\n\r\ninterface FormData {\r\n name: string;\r\n priority: number;\r\n strategyType: string;\r\n ticketPriorityFilter: string | null;\r\n ticketTypeFilter: string | null;\r\n maxConcurrentTickets: number;\r\n isFallback: boolean;\r\n}\r\n\r\nconst defaultFormData: FormData = {\r\n name: '',\r\n priority: 0,\r\n strategyType: 'RoundRobin',\r\n ticketPriorityFilter: null,\r\n ticketTypeFilter: null,\r\n maxConcurrentTickets: 10,\r\n isFallback: false,\r\n};\r\n\r\nfunction formatRuleFilters(\r\n rule: Pick<AssignmentRuleDto, 'ticketPriorityFilter' | 'ticketTypeFilter'>,\r\n t: (key: string) => string\r\n): string {\r\n if (!rule.ticketPriorityFilter && !rule.ticketTypeFilter) {\r\n return t('assignment.noFilter');\r\n }\r\n\r\n const parts: string[] = [];\r\n if (rule.ticketPriorityFilter) {\r\n parts.push(t(`tickets.priorities.${rule.ticketPriorityFilter}`));\r\n }\r\n if (rule.ticketTypeFilter) {\r\n parts.push(t(`tickets.types.${rule.ticketTypeFilter}`));\r\n }\r\n return parts.join(' + ');\r\n}\r\n\r\nexport function AssignmentRulesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rules, setRules] = useState<AssignmentRuleDto[]>([]);\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [strategyFilter, setStrategyFilter] = useState<string>('');\r\n const [activeFilter, setActiveFilter] = useState<string>('');\r\n\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n const [editingRule, setEditingRule] = useState<AssignmentRuleDto | null>(null);\r\n const [formData, setFormData] = useState<FormData>(defaultFormData);\r\n const [saving, setSaving] = useState(false);\r\n\r\n const loadRules = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await rulesApi.getAll();\r\n setRules(data);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load assignment rules');\r\n console.error('Failed to load assignment rules:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadRules();\r\n }, [loadRules]);\r\n\r\n const filteredRules = rules.filter((rule) => {\r\n const matchesSearch = rule.name.toLowerCase().includes(searchTerm.toLowerCase());\r\n const matchesStrategy = !strategyFilter || rule.strategyType === strategyFilter;\r\n const matchesActive = !activeFilter || (activeFilter === 'active' ? rule.isActive : !rule.isActive);\r\n return matchesSearch && matchesStrategy && matchesActive;\r\n });\r\n\r\n const handleCreate = () => {\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleEdit = (rule: AssignmentRuleDto) => {\r\n setEditingRule(rule);\r\n setFormData({\r\n name: rule.name,\r\n priority: rule.priority,\r\n strategyType: rule.strategyType,\r\n ticketPriorityFilter: rule.ticketPriorityFilter,\r\n ticketTypeFilter: rule.ticketTypeFilter,\r\n maxConcurrentTickets: rule.maxConcurrentTickets,\r\n isFallback: rule.isFallback,\r\n });\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleCloseModal = () => {\r\n setIsModalOpen(false);\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!formData.name.trim()) {\r\n alert(t('assignment.form.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n const payload: CreateAssignmentRuleRequest | UpdateAssignmentRuleRequest = {\r\n name: formData.name,\r\n priority: formData.priority,\r\n strategyType: formData.strategyType,\r\n ticketPriorityFilter: formData.ticketPriorityFilter || undefined,\r\n ticketTypeFilter: formData.ticketTypeFilter || undefined,\r\n maxConcurrentTickets: formData.maxConcurrentTickets,\r\n isFallback: formData.isFallback,\r\n };\r\n\r\n if (editingRule) {\r\n await rulesApi.update(editingRule.id, payload as UpdateAssignmentRuleRequest);\r\n } else {\r\n await rulesApi.create(payload as CreateAssignmentRuleRequest);\r\n }\r\n\r\n await loadRules();\r\n handleCloseModal();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to save rule');\r\n console.error('Failed to save rule:', err);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string, name: string) => {\r\n if (!window.confirm(t('assignment.confirmDelete', { name }))) {\r\n return;\r\n }\r\n\r\n try {\r\n setError(null);\r\n await rulesApi.delete(id);\r\n await loadRules();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to delete rule');\r\n console.error('Failed to delete rule:', err);\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('assignment.title') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold\">{t('assignment.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('assignment.subtitle', 'Manage auto-assignment rules for tickets')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"card p-4 bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <p className=\"font-medium\">{t('common:error')}</p>\r\n <p className=\"text-sm\">{error}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && rules.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <p className=\"text-xl font-semibold mb-2\">{t('assignment.noRules')}</p>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('assignment.noRulesSubtitle', 'Create your first assignment rule to get started')}\r\n </p>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary\"\r\n >\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n )}\r\n {!loading && rules.length > 0 && (\r\n <>\r\n <div className=\"card p-4 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.search')}</label>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-3 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('assignment.searchPlaceholder', 'Search by name...')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.strategy')}</label>\r\n <select\r\n value={strategyFilter}\r\n onChange={(e) => setStrategyFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStrategies', 'All Strategies')}</option>\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.status')}</label>\r\n <select\r\n value={activeFilter}\r\n onChange={(e) => setActiveFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStatus', 'All Status')}</option>\r\n <option value=\"active\">{t('common:active')}</option>\r\n <option value=\"inactive\">{t('common:inactive')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.name')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.strategy')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.priority')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.filters')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.maxTickets')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.active')}\r\n </th>\r\n <th className=\"px-6 py-3 text-right text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('common:actions.title')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredRules.map((rule) => (\r\n <tr key={rule.id} className=\"hover:bg-[var(--bg-secondary)] transition\">\r\n <td className=\"px-6 py-4 text-sm font-medium\">{rule.name}</td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {t(`assignment.strategyTypes.${rule.strategyType.charAt(0).toLowerCase()}${rule.strategyType.slice(1)}`)}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.priority}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"inline-block text-xs bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n {formatRuleFilters(rule, t)}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.maxConcurrentTickets}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm\">\r\n <span className={`px-3 py-1 rounded-full text-xs font-medium ${\r\n rule.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {rule.isActive ? t('common:active') : t('common:inactive')}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-right\">\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={() => handleEdit(rule)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('common:actions.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(rule.id, rule.name)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1 text-[var(--error-text)]\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common:actions.delete')}\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </>\r\n )}\r\n\r\n {isModalOpen && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"sticky top-0 bg-[var(--bg-secondary)] border-b border-[var(--border-color)] px-6 py-4 flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingRule ? t('assignment.edit') : t('assignment.create')}\r\n </h2>\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-6 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\r\n placeholder={t('assignment.form.namePlaceholder', 'Rule name')}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.priority')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={formData.priority}\r\n onChange={(e) => setFormData({ ...formData, priority: parseInt(e.target.value) || 0 })}\r\n placeholder=\"0\"\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('assignment.form.priorityHint', 'Lower number = higher priority')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.strategy')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n value={formData.strategyType}\r\n onChange={(e) => setFormData({ ...formData, strategyType: e.target.value })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketPriority', 'Ticket Priority Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketPriorityFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketPriorityFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_PRIORITIES.map((priority) => (\r\n <option key={priority} value={priority}>\r\n {t(`tickets.priorities.${priority}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketType', 'Ticket Type Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketTypeFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketTypeFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`tickets.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.maxTickets')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={formData.maxConcurrentTickets}\r\n onChange={(e) => setFormData({ ...formData, maxConcurrentTickets: Math.max(1, parseInt(e.target.value) || 1) })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"isFallback\"\r\n checked={formData.isFallback}\r\n onChange={(e) => setFormData({ ...formData, isFallback: e.target.checked })}\r\n className=\"rounded border-[var(--border-color)]\"\r\n disabled={saving}\r\n />\r\n <label htmlFor=\"isFallback\" className=\"text-sm font-medium\">\r\n {t('assignment.fallback')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-secondary)] ml-auto\">\r\n {t('assignment.form.fallbackHint', 'Used when other rules do not match')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t border-[var(--border-color)] px-6 py-4 flex justify-end gap-2 bg-[var(--bg-secondary)]\">\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:actions.save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["STRATEGY_OPTIONS","TICKET_PRIORITIES","TICKET_TYPES","defaultFormData","formatRuleFilters","rule","t","parts","AssignmentRulesPage","useTranslation","loading","setLoading","useState","error","setError","rules","setRules","searchTerm","setSearchTerm","strategyFilter","setStrategyFilter","activeFilter","setActiveFilter","isModalOpen","setIsModalOpen","editingRule","setEditingRule","formData","setFormData","saving","setSaving","loadRules","useCallback","data","rulesApi","err","useEffect","filteredRules","matchesSearch","matchesStrategy","matchesActive","handleCreate","handleEdit","handleCloseModal","handleSave","payload","handleDelete","id","name","jsxs","jsx","Breadcrumb","Plus","AlertCircle","Loader2","Fragment","Search","strategy","Edit","Trash2","priority","type"],"mappings":";;;;;AAOA,MAAMA,IAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,IAAoB,CAAC,OAAO,UAAU,QAAQ,UAAU,GACxDC,IAAe,CAAC,OAAO,kBAAkB,WAAW,YAAY,cAAc,oBAAoB,GAYlGC,IAA4B;AAAA,EAChC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,YAAY;AACd;AAEA,SAASC,EACPC,GACAC,GACQ;AACR,MAAI,CAACD,EAAK,wBAAwB,CAACA,EAAK;AACtC,WAAOC,EAAE,qBAAqB;AAGhC,QAAMC,IAAkB,CAAA;AACxB,SAAIF,EAAK,wBACPE,EAAM,KAAKD,EAAE,sBAAsBD,EAAK,oBAAoB,EAAE,CAAC,GAE7DA,EAAK,oBACPE,EAAM,KAAKD,EAAE,iBAAiBD,EAAK,gBAAgB,EAAE,CAAC,GAEjDE,EAAM,KAAK,KAAK;AACzB;AAEO,SAASC,KAAoC;AAClD,QAAM,EAAE,GAAAF,EAAA,IAAMG,EAAe,SAAS,GAChC,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAI,GACrC,CAACC,GAAOC,CAAQ,IAAIF,EAAwB,IAAI,GAChD,CAACG,GAAOC,CAAQ,IAAIJ,EAA8B,CAAA,CAAE,GACpD,CAACK,GAAYC,CAAa,IAAIN,EAAS,EAAE,GACzC,CAACO,GAAgBC,CAAiB,IAAIR,EAAiB,EAAE,GACzD,CAACS,GAAcC,CAAe,IAAIV,EAAiB,EAAE,GAErD,CAACW,GAAaC,CAAc,IAAIZ,EAAS,EAAK,GAC9C,CAACa,GAAaC,CAAc,IAAId,EAAmC,IAAI,GACvE,CAACe,GAAUC,CAAW,IAAIhB,EAAmBT,CAAe,GAC5D,CAAC0B,GAAQC,CAAS,IAAIlB,EAAS,EAAK,GAEpCmB,IAAYC,EAAY,YAAY;AACxC,QAAI;AACF,MAAArB,EAAW,EAAI,GACfG,EAAS,IAAI;AACb,YAAMmB,IAAO,MAAMC,EAAS,OAAA;AAC5B,MAAAlB,EAASiB,CAAI;AAAA,IACf,SAASE,GAAK;AACZ,MAAArB,EAASqB,aAAe,QAAQA,EAAI,UAAU,iCAAiC,GAC/E,QAAQ,MAAM,oCAAoCA,CAAG;AAAA,IACvD,UAAA;AACE,MAAAxB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,EAAAyB,EAAU,MAAM;AACd,IAAAL,EAAA;AAAA,EACF,GAAG,CAACA,CAAS,CAAC;AAEd,QAAMM,IAAgBtB,EAAM,OAAO,CAACV,MAAS;AAC3C,UAAMiC,IAAgBjC,EAAK,KAAK,YAAA,EAAc,SAASY,EAAW,aAAa,GACzEsB,IAAkB,CAACpB,KAAkBd,EAAK,iBAAiBc,GAC3DqB,IAAgB,CAACnB,MAAiBA,MAAiB,WAAWhB,EAAK,WAAW,CAACA,EAAK;AAC1F,WAAOiC,KAAiBC,KAAmBC;AAAA,EAC7C,CAAC,GAEKC,IAAe,MAAM;AACzB,IAAAf,EAAe,IAAI,GACnBE,EAAYzB,CAAe,GAC3BqB,EAAe,EAAI;AAAA,EACrB,GAEMkB,IAAa,CAACrC,MAA4B;AAC9C,IAAAqB,EAAerB,CAAI,GACnBuB,EAAY;AAAA,MACV,MAAMvB,EAAK;AAAA,MACX,UAAUA,EAAK;AAAA,MACf,cAAcA,EAAK;AAAA,MACnB,sBAAsBA,EAAK;AAAA,MAC3B,kBAAkBA,EAAK;AAAA,MACvB,sBAAsBA,EAAK;AAAA,MAC3B,YAAYA,EAAK;AAAA,IAAA,CAClB,GACDmB,EAAe,EAAI;AAAA,EACrB,GAEMmB,IAAmB,MAAM;AAC7B,IAAAnB,EAAe,EAAK,GACpBE,EAAe,IAAI,GACnBE,EAAYzB,CAAe;AAAA,EAC7B,GAEMyC,IAAa,YAAY;AAC7B,QAAI,CAACjB,EAAS,KAAK,QAAQ;AACzB,YAAMrB,EAAE,8BAA8B,CAAC;AACvC;AAAA,IACF;AAEA,QAAI;AACF,MAAAwB,EAAU,EAAI,GACdhB,EAAS,IAAI;AAEb,YAAM+B,IAAqE;AAAA,QACzE,MAAMlB,EAAS;AAAA,QACf,UAAUA,EAAS;AAAA,QACnB,cAAcA,EAAS;AAAA,QACvB,sBAAsBA,EAAS,wBAAwB;AAAA,QACvD,kBAAkBA,EAAS,oBAAoB;AAAA,QAC/C,sBAAsBA,EAAS;AAAA,QAC/B,YAAYA,EAAS;AAAA,MAAA;AAGvB,MAAIF,IACF,MAAMS,EAAS,OAAOT,EAAY,IAAIoB,CAAsC,IAE5E,MAAMX,EAAS,OAAOW,CAAsC,GAG9D,MAAMd,EAAA,GACNY,EAAA;AAAA,IACF,SAASR,GAAK;AACZ,MAAArB,EAASqB,aAAe,QAAQA,EAAI,UAAU,qBAAqB,GACnE,QAAQ,MAAM,wBAAwBA,CAAG;AAAA,IAC3C,UAAA;AACE,MAAAL,EAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAEMgB,IAAe,OAAOC,GAAYC,MAAiB;AACvD,QAAK,OAAO,QAAQ1C,EAAE,4BAA4B,EAAE,MAAA0C,EAAA,CAAM,CAAC;AAI3D,UAAI;AACF,QAAAlC,EAAS,IAAI,GACb,MAAMoB,EAAS,OAAOa,CAAE,GACxB,MAAMhB,EAAA;AAAA,MACR,SAASI,GAAK;AACZ,QAAArB,EAASqB,aAAe,QAAQA,EAAI,UAAU,uBAAuB,GACrE,QAAQ,MAAM,0BAA0BA,CAAG;AAAA,MAC7C;AAAA,EACF;AAEA,SACE,gBAAAc,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO7C,EAAE,SAAS,SAAS,GAAG,MAAM,WAAA;AAAA,UACtC,EAAE,OAAOA,EAAE,kBAAkB,EAAA;AAAA,QAAE;AAAA,MACjC;AAAA,IAAA;AAAA,IAGF,gBAAA2C,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,sBAAsB,UAAA5C,EAAE,kBAAkB,GAAE;AAAA,0BACzD,KAAA,EAAE,WAAU,gCACV,UAAAA,EAAE,uBAAuB,0CAA0C,EAAA,CACtE;AAAA,MAAA,GACF;AAAA,MACA,gBAAA2C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASR;AAAA,UACT,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAS,EAACE,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,YACzB9C,EAAE,mBAAmB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACxB,GACF;AAAA,IAECO,KACC,gBAAAoC,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,MAAA,gBAAAC,EAACG,GAAA,EAAY,WAAU,+BAAA,CAA+B;AAAA,wBACrD,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAH,EAAC,KAAA,EAAE,WAAU,eAAe,UAAA5C,EAAE,cAAc,GAAE;AAAA,QAC9C,gBAAA4C,EAAC,KAAA,EAAE,WAAU,WAAW,UAAArC,EAAA,CAAM;AAAA,MAAA,EAAA,CAChC;AAAA,IAAA,GACF;AAAA,IAGDH,uBACE,OAAA,EAAI,WAAU,0CACb,UAAA,gBAAAwC,EAACI,GAAA,EAAQ,WAAU,uDAAA,CAAuD,EAAA,CAC5E;AAAA,IAED,CAAC5C,KAAWK,EAAM,WAAW,KAC5B,gBAAAkC,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,8BAA8B,UAAA5C,EAAE,oBAAoB,GAAE;AAAA,wBAClE,KAAA,EAAE,WAAU,qCACV,UAAAA,EAAE,8BAA8B,kDAAkD,GACrF;AAAA,MACA,gBAAA4C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAST;AAAA,UACT,WAAU;AAAA,UAET,YAAE,mBAAmB;AAAA,QAAA;AAAA,MAAA;AAAA,IACxB,GACF;AAAA,IAED,CAAC/B,KAAWK,EAAM,SAAS,KAC1B,gBAAAkC,EAAAM,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,kCAAkC,UAAA5C,EAAE,mBAAmB,GAAE;AAAA,UAC1E,gBAAA2C,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,YAAA,gBAAAC,EAACM,GAAA,EAAO,WAAU,6DAAA,CAA6D;AAAA,YAC/E,gBAAAN;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAa5C,EAAE,gCAAgC,mBAAmB;AAAA,gBAClE,OAAOW;AAAA,gBACP,UAAU,CAAC,MAAMC,EAAc,EAAE,OAAO,KAAK;AAAA,gBAC7C,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAEA,gBAAA+B,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,kCAAkC,UAAA5C,EAAE,qBAAqB,GAAE;AAAA,YAC5E,gBAAA2C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO9B;AAAA,gBACP,UAAU,CAAC,MAAMC,EAAkB,EAAE,OAAO,KAAK;AAAA,gBACjD,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAA8B,EAAC,YAAO,OAAM,IAAI,UAAA5C,EAAE,4BAA4B,gBAAgB,GAAE;AAAA,kBACjEN,EAAiB,IAAI,CAACyD,MACrB,gBAAAP,EAAC,YAAsB,OAAOO,GAC3B,UAAAnD,EAAE,4BAA4BmD,EAAS,OAAO,CAAC,EAAE,YAAA,CAAa,GAAGA,EAAS,MAAM,CAAC,CAAC,EAAE,EAAA,GAD1EA,CAEb,CACD;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,GACF;AAAA,4BAEC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAP,EAAC,SAAA,EAAM,WAAU,kCAAkC,UAAA5C,EAAE,mBAAmB,GAAE;AAAA,YAC1E,gBAAA2C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO5B;AAAA,gBACP,UAAU,CAAC,MAAMC,EAAgB,EAAE,OAAO,KAAK;AAAA,gBAC/C,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAA4B,EAAC,YAAO,OAAM,IAAI,UAAA5C,EAAE,wBAAwB,YAAY,GAAE;AAAA,oCACzD,UAAA,EAAO,OAAM,UAAU,UAAAA,EAAE,eAAe,GAAE;AAAA,oCAC1C,UAAA,EAAO,OAAM,YAAY,UAAAA,EAAE,iBAAiB,EAAA,CAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACjD,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,wBAEC,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAA2C,EAAC,SAAA,EAAM,WAAU,UACf,UAAA;AAAA,QAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,kEACf,UAAA,gBAAAD,EAAC,MAAA,EACC,UAAA;AAAA,UAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,0EACX,UAAA5C,EAAE,iBAAiB,GACtB;AAAA,4BACC,MAAA,EAAG,WAAU,0EACX,UAAAA,EAAE,qBAAqB,GAC1B;AAAA,4BACC,MAAA,EAAG,WAAU,0EACX,UAAAA,EAAE,qBAAqB,GAC1B;AAAA,4BACC,MAAA,EAAG,WAAU,0EACX,UAAAA,EAAE,oBAAoB,GACzB;AAAA,4BACC,MAAA,EAAG,WAAU,0EACX,UAAAA,EAAE,uBAAuB,GAC5B;AAAA,4BACC,MAAA,EAAG,WAAU,0EACX,UAAAA,EAAE,mBAAmB,GACxB;AAAA,4BACC,MAAA,EAAG,WAAU,2EACX,UAAAA,EAAE,sBAAsB,EAAA,CAC3B;AAAA,QAAA,EAAA,CACF,EAAA,CACF;AAAA,QACA,gBAAA4C,EAAC,SAAA,EAAM,WAAU,yCACd,UAAAb,EAAc,IAAI,CAAChC,MAClB,gBAAA4C,EAAC,MAAA,EAAiB,WAAU,6CAC1B,UAAA;AAAA,UAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,iCAAiC,UAAA7C,EAAK,MAAK;AAAA,UACzD,gBAAA6C,EAAC,QAAG,WAAU,kDACX,YAAE,4BAA4B7C,EAAK,aAAa,OAAO,CAAC,EAAE,YAAA,CAAa,GAAGA,EAAK,aAAa,MAAM,CAAC,CAAC,EAAE,GACzG;AAAA,UACA,gBAAA6C,EAAC,MAAA,EAAG,WAAU,kDACX,YAAK,UACR;AAAA,UACA,gBAAAA,EAAC,MAAA,EAAG,WAAU,kDACZ,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,mEACb,UAAA9C,EAAkBC,GAAMC,CAAC,EAAA,CAC5B,GACF;AAAA,UACA,gBAAA4C,EAAC,MAAA,EAAG,WAAU,kDACX,YAAK,sBACR;AAAA,UACA,gBAAAA,EAAC,QAAG,WAAU,qBACZ,4BAAC,QAAA,EAAK,WAAW,8CACf7C,EAAK,WACD,sDACA,uDACN,IACG,YAAK,WAAWC,EAAE,eAAe,IAAIA,EAAE,iBAAiB,EAAA,CAC3D,EAAA,CACF;AAAA,4BACC,MAAA,EAAG,WAAU,wBACZ,UAAA,gBAAA2C,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,YAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMP,EAAWrC,CAAI;AAAA,gBAC9B,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAA6C,EAACQ,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,kBACzBpD,EAAE,qBAAqB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAE1B,gBAAA2C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMH,EAAazC,EAAK,IAAIA,EAAK,IAAI;AAAA,gBAC9C,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAA6C,EAACS,GAAA,EAAO,WAAU,UAAA,CAAU;AAAA,kBAC3BrD,EAAE,uBAAuB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5B,EAAA,CACF,EAAA,CACF;AAAA,QAAA,KA1COD,EAAK,EA2Cd,CACD,EAAA,CACH;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGDkB,uBACE,OAAA,EAAI,WAAU,uEACb,UAAA,gBAAA0B,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2HACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,yBACX,UAAc5C,EAAdmB,IAAgB,oBAAuB,mBAAN,EAAyB,CAC7D;AAAA,QACA,gBAAAyB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASP;AAAA,YACT,UAAUd;AAAA,YACV,WAAU;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MAEA,gBAAAoB,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,kCACd,UAAA;AAAA,YAAA3C,EAAE,iBAAiB;AAAA,YAAE;AAAA,YAAC,gBAAA4C,EAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA,IAAA,CAAC;AAAA,UAAA,GACrE;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOvB,EAAS;AAAA,cAChB,UAAU,CAAC,MAAMC,EAAY,EAAE,GAAGD,GAAU,MAAM,EAAE,OAAO,OAAO;AAAA,cAClE,aAAarB,EAAE,mCAAmC,WAAW;AAAA,cAC7D,WAAU;AAAA,cACV,UAAUuB;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAEA,gBAAAoB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,kCACd,UAAA5C,EAAE,qBAAqB,GAC1B;AAAA,YACA,gBAAA4C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOvB,EAAS;AAAA,gBAChB,UAAU,CAAC,MAAMC,EAAY,EAAE,GAAGD,GAAU,UAAU,SAAS,EAAE,OAAO,KAAK,KAAK,GAAG;AAAA,gBACrF,aAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,UAAUE;AAAA,cAAA;AAAA,YAAA;AAAA,8BAEX,KAAA,EAAE,WAAU,6CACV,UAAAvB,EAAE,gCAAgC,gCAAgC,EAAA,CACrE;AAAA,UAAA,GACF;AAAA,4BAEC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAA2C,EAAC,SAAA,EAAM,WAAU,kCACd,UAAA;AAAA,cAAA3C,EAAE,qBAAqB;AAAA,cAAE;AAAA,cAAC,gBAAA4C,EAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA,IAAA,CAAC;AAAA,YAAA,GACzE;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAOvB,EAAS;AAAA,gBAChB,UAAU,CAAC,MAAMC,EAAY,EAAE,GAAGD,GAAU,cAAc,EAAE,OAAO,OAAO;AAAA,gBAC1E,WAAU;AAAA,gBACV,UAAUE;AAAA,gBAET,UAAA7B,EAAiB,IAAI,CAACyD,MACrB,gBAAAP,EAAC,YAAsB,OAAOO,GAC3B,UAAAnD,EAAE,4BAA4BmD,EAAS,OAAO,CAAC,EAAE,YAAA,CAAa,GAAGA,EAAS,MAAM,CAAC,CAAC,EAAE,EAAA,GAD1EA,CAEb,CACD;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAEA,gBAAAR,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAC,EAAC,WAAM,WAAU,kCACd,UAAA5C,EAAE,kCAAkC,wBAAwB,GAC/D;AAAA,YACA,gBAAA2C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAOtB,EAAS,wBAAwB;AAAA,gBACxC,UAAU,CAAC,MAAMC,EAAY,EAAE,GAAGD,GAAU,sBAAsB,EAAE,OAAO,SAAS,KAAA,CAAM;AAAA,gBAC1F,WAAU;AAAA,gBACV,UAAUE;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAAqB,EAAC,YAAO,OAAM,IAAI,UAAA5C,EAAE,4BAA4B,WAAW,GAAE;AAAA,kBAC5DL,EAAkB,IAAI,CAAC2D,wBACrB,UAAA,EAAsB,OAAOA,GAC3B,UAAAtD,EAAE,sBAAsBsD,CAAQ,EAAE,EAAA,GADxBA,CAEb,CACD;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,GACF;AAAA,4BAEC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAV,EAAC,WAAM,WAAU,kCACd,UAAA5C,EAAE,8BAA8B,oBAAoB,GACvD;AAAA,YACA,gBAAA2C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAOtB,EAAS,oBAAoB;AAAA,gBACpC,UAAU,CAAC,MAAMC,EAAY,EAAE,GAAGD,GAAU,kBAAkB,EAAE,OAAO,SAAS,KAAA,CAAM;AAAA,gBACtF,WAAU;AAAA,gBACV,UAAUE;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAAqB,EAAC,YAAO,OAAM,IAAI,UAAA5C,EAAE,4BAA4B,WAAW,GAAE;AAAA,kBAC5DJ,EAAa,IAAI,CAAC2D,wBAChB,UAAA,EAAkB,OAAOA,GACvB,UAAAvD,EAAE,iBAAiBuD,CAAI,EAAE,EAAA,GADfA,CAEb,CACD;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,EAAA,CACF;AAAA,QAAA,GACF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAX,EAAC,SAAA,EAAM,WAAU,kCACd,UAAA5C,EAAE,uBAAuB,GAC5B;AAAA,UACA,gBAAA4C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAI;AAAA,cACJ,OAAOvB,EAAS;AAAA,cAChB,UAAU,CAAC,MAAMC,EAAY,EAAE,GAAGD,GAAU,sBAAsB,KAAK,IAAI,GAAG,SAAS,EAAE,OAAO,KAAK,KAAK,CAAC,GAAG;AAAA,cAC9G,WAAU;AAAA,cACV,UAAUE;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAEA,gBAAAoB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,IAAG;AAAA,cACH,SAASvB,EAAS;AAAA,cAClB,UAAU,CAAC,MAAMC,EAAY,EAAE,GAAGD,GAAU,YAAY,EAAE,OAAO,SAAS;AAAA,cAC1E,WAAU;AAAA,cACV,UAAUE;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZ,gBAAAqB,EAAC,WAAM,SAAQ,cAAa,WAAU,uBACnC,UAAA5C,EAAE,qBAAqB,GAC1B;AAAA,4BACC,KAAA,EAAE,WAAU,gDACV,UAAAA,EAAE,gCAAgC,oCAAoC,EAAA,CACzE;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAA2C,EAAC,OAAA,EAAI,WAAU,mGACb,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASP;AAAA,YACT,UAAUd;AAAA,YACV,WAAU;AAAA,YAET,YAAE,uBAAuB;AAAA,UAAA;AAAA,QAAA;AAAA,QAE5B,gBAAAoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASL;AAAA,YACT,UAAUf;AAAA,YACV,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,KAAU,gBAAAqB,EAACI,GAAA,EAAQ,WAAU,uBAAA,CAAuB;AAAA,cACpDhD,EAAE,qBAAqB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"AssignmentRulesPage-D78UeUId.js","sources":["../../src/pages/platform/support/AssignmentRulesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, Plus, Edit, Trash2, Search, AlertCircle } from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { rulesApi, type AssignmentRuleDto, type CreateAssignmentRuleRequest, type UpdateAssignmentRuleRequest } from '@/services/api/assignmentApi';\r\n\r\nconst STRATEGY_OPTIONS = [\r\n 'RoundRobin',\r\n 'LoadBalancing',\r\n 'SkillBased',\r\n 'Affinity',\r\n 'PriorityBased',\r\n] as const;\r\n\r\nconst TICKET_PRIORITIES = ['Low', 'Medium', 'High', 'Critical'] as const;\r\nconst TICKET_TYPES = ['Bug', 'FeatureRequest', 'Support', 'Question', 'Suggestion', 'ApplicationRequest'] as const;\r\n\r\ninterface FormData {\r\n name: string;\r\n priority: number;\r\n strategyType: string;\r\n ticketPriorityFilter: string | null;\r\n ticketTypeFilter: string | null;\r\n maxConcurrentTickets: number;\r\n isFallback: boolean;\r\n}\r\n\r\nconst defaultFormData: FormData = {\r\n name: '',\r\n priority: 0,\r\n strategyType: 'RoundRobin',\r\n ticketPriorityFilter: null,\r\n ticketTypeFilter: null,\r\n maxConcurrentTickets: 10,\r\n isFallback: false,\r\n};\r\n\r\nfunction formatRuleFilters(\r\n rule: Pick<AssignmentRuleDto, 'ticketPriorityFilter' | 'ticketTypeFilter'>,\r\n t: (key: string) => string\r\n): string {\r\n if (!rule.ticketPriorityFilter && !rule.ticketTypeFilter) {\r\n return t('assignment.noFilter');\r\n }\r\n\r\n const parts: string[] = [];\r\n if (rule.ticketPriorityFilter) {\r\n parts.push(t(`tickets.priorities.${rule.ticketPriorityFilter}`));\r\n }\r\n if (rule.ticketTypeFilter) {\r\n parts.push(t(`tickets.types.${rule.ticketTypeFilter}`));\r\n }\r\n return parts.join(' + ');\r\n}\r\n\r\nexport function AssignmentRulesPage(): ReactElement {\r\n const { t } = useTranslation('support');\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rules, setRules] = useState<AssignmentRuleDto[]>([]);\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [strategyFilter, setStrategyFilter] = useState<string>('');\r\n const [activeFilter, setActiveFilter] = useState<string>('');\r\n\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n const [editingRule, setEditingRule] = useState<AssignmentRuleDto | null>(null);\r\n const [formData, setFormData] = useState<FormData>(defaultFormData);\r\n const [saving, setSaving] = useState(false);\r\n\r\n const loadRules = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await rulesApi.getAll();\r\n setRules(data);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load assignment rules');\r\n console.error('Failed to load assignment rules:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadRules();\r\n }, [loadRules]);\r\n\r\n const filteredRules = rules.filter((rule) => {\r\n const matchesSearch = rule.name.toLowerCase().includes(searchTerm.toLowerCase());\r\n const matchesStrategy = !strategyFilter || rule.strategyType === strategyFilter;\r\n const matchesActive = !activeFilter || (activeFilter === 'active' ? rule.isActive : !rule.isActive);\r\n return matchesSearch && matchesStrategy && matchesActive;\r\n });\r\n\r\n const handleCreate = () => {\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleEdit = (rule: AssignmentRuleDto) => {\r\n setEditingRule(rule);\r\n setFormData({\r\n name: rule.name,\r\n priority: rule.priority,\r\n strategyType: rule.strategyType,\r\n ticketPriorityFilter: rule.ticketPriorityFilter,\r\n ticketTypeFilter: rule.ticketTypeFilter,\r\n maxConcurrentTickets: rule.maxConcurrentTickets,\r\n isFallback: rule.isFallback,\r\n });\r\n setIsModalOpen(true);\r\n };\r\n\r\n const handleCloseModal = () => {\r\n setIsModalOpen(false);\r\n setEditingRule(null);\r\n setFormData(defaultFormData);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!formData.name.trim()) {\r\n alert(t('assignment.form.nameRequired'));\r\n return;\r\n }\r\n\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n const payload: CreateAssignmentRuleRequest | UpdateAssignmentRuleRequest = {\r\n name: formData.name,\r\n priority: formData.priority,\r\n strategyType: formData.strategyType,\r\n ticketPriorityFilter: formData.ticketPriorityFilter || undefined,\r\n ticketTypeFilter: formData.ticketTypeFilter || undefined,\r\n maxConcurrentTickets: formData.maxConcurrentTickets,\r\n isFallback: formData.isFallback,\r\n };\r\n\r\n if (editingRule) {\r\n await rulesApi.update(editingRule.id, payload as UpdateAssignmentRuleRequest);\r\n } else {\r\n await rulesApi.create(payload as CreateAssignmentRuleRequest);\r\n }\r\n\r\n await loadRules();\r\n handleCloseModal();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to save rule');\r\n console.error('Failed to save rule:', err);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string, name: string) => {\r\n if (!window.confirm(t('assignment.confirmDelete', { name }))) {\r\n return;\r\n }\r\n\r\n try {\r\n setError(null);\r\n await rulesApi.delete(id);\r\n await loadRules();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to delete rule');\r\n console.error('Failed to delete rule:', err);\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('assignment.title') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold\">{t('assignment.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('assignment.subtitle', 'Manage auto-assignment rules for tickets')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"card p-4 bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <p className=\"font-medium\">{t('common:error')}</p>\r\n <p className=\"text-sm\">{error}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && rules.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <p className=\"text-xl font-semibold mb-2\">{t('assignment.noRules')}</p>\r\n <p className=\"text-[var(--text-secondary)] mb-6\">\r\n {t('assignment.noRulesSubtitle', 'Create your first assignment rule to get started')}\r\n </p>\r\n <button\r\n onClick={handleCreate}\r\n className=\"btn btn-primary\"\r\n >\r\n {t('assignment.create')}\r\n </button>\r\n </div>\r\n )}\r\n {!loading && rules.length > 0 && (\r\n <>\r\n <div className=\"card p-4 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.search')}</label>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-3 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('assignment.searchPlaceholder', 'Search by name...')}\r\n value={searchTerm}\r\n onChange={(e) => setSearchTerm(e.target.value)}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.strategy')}</label>\r\n <select\r\n value={strategyFilter}\r\n onChange={(e) => setStrategyFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStrategies', 'All Strategies')}</option>\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-2\">{t('assignment.status')}</label>\r\n <select\r\n value={activeFilter}\r\n onChange={(e) => setActiveFilter(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('assignment.allStatus', 'All Status')}</option>\r\n <option value=\"active\">{t('common:active')}</option>\r\n <option value=\"inactive\">{t('common:inactive')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.name')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.strategy')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.priority')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.filters')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.maxTickets')}\r\n </th>\r\n <th className=\"px-6 py-3 text-left text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('assignment.active')}\r\n </th>\r\n <th className=\"px-6 py-3 text-right text-sm font-semibold text-[var(--text-secondary)]\">\r\n {t('common:actions.title')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {filteredRules.map((rule) => (\r\n <tr key={rule.id} className=\"hover:bg-[var(--bg-secondary)] transition\">\r\n <td className=\"px-6 py-4 text-sm font-medium\">{rule.name}</td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {t(`assignment.strategyTypes.${rule.strategyType.charAt(0).toLowerCase()}${rule.strategyType.slice(1)}`)}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.priority}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"inline-block text-xs bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n {formatRuleFilters(rule, t)}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-sm text-[var(--text-secondary)]\">\r\n {rule.maxConcurrentTickets}\r\n </td>\r\n <td className=\"px-6 py-4 text-sm\">\r\n <span className={`px-3 py-1 rounded-full text-xs font-medium ${\r\n rule.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {rule.isActive ? t('common:active') : t('common:inactive')}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 text-right\">\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={() => handleEdit(rule)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n <Edit className=\"w-4 h-4\" />\r\n {t('common:actions.edit')}\r\n </button>\r\n <button\r\n onClick={() => handleDelete(rule.id, rule.name)}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1 text-[var(--error-text)]\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common:actions.delete')}\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </>\r\n )}\r\n\r\n {isModalOpen && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"sticky top-0 bg-[var(--bg-secondary)] border-b border-[var(--border-color)] px-6 py-4 flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n {editingRule ? t('assignment.edit') : t('assignment.create')}\r\n </h2>\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n <div className=\"p-6 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.name')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\r\n placeholder={t('assignment.form.namePlaceholder', 'Rule name')}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.priority')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={formData.priority}\r\n onChange={(e) => setFormData({ ...formData, priority: parseInt(e.target.value) || 0 })}\r\n placeholder=\"0\"\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n {t('assignment.form.priorityHint', 'Lower number = higher priority')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.strategy')} <span className=\"text-[var(--error-text)]\">*</span>\r\n </label>\r\n <select\r\n value={formData.strategyType}\r\n onChange={(e) => setFormData({ ...formData, strategyType: e.target.value })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n {STRATEGY_OPTIONS.map((strategy) => (\r\n <option key={strategy} value={strategy}>\r\n {t(`assignment.strategyTypes.${strategy.charAt(0).toLowerCase()}${strategy.slice(1)}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketPriority', 'Ticket Priority Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketPriorityFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketPriorityFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_PRIORITIES.map((priority) => (\r\n <option key={priority} value={priority}>\r\n {t(`tickets.priorities.${priority}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.form.ticketType', 'Ticket Type Filter')}\r\n </label>\r\n <select\r\n value={formData.ticketTypeFilter || ''}\r\n onChange={(e) => setFormData({ ...formData, ticketTypeFilter: e.target.value || null })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n >\r\n <option value=\"\">{t('assignment.form.noFilter', 'No filter')}</option>\r\n {TICKET_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`tickets.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('assignment.maxTickets')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={formData.maxConcurrentTickets}\r\n onChange={(e) => setFormData({ ...formData, maxConcurrentTickets: Math.max(1, parseInt(e.target.value) || 1) })}\r\n className=\"input w-full\"\r\n disabled={saving}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"isFallback\"\r\n checked={formData.isFallback}\r\n onChange={(e) => setFormData({ ...formData, isFallback: e.target.checked })}\r\n className=\"rounded border-[var(--border-color)]\"\r\n disabled={saving}\r\n />\r\n <label htmlFor=\"isFallback\" className=\"text-sm font-medium\">\r\n {t('assignment.fallback')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-secondary)] ml-auto\">\r\n {t('assignment.form.fallbackHint', 'Used when other rules do not match')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t border-[var(--border-color)] px-6 py-4 flex justify-end gap-2 bg-[var(--bg-secondary)]\">\r\n <button\r\n onClick={handleCloseModal}\r\n disabled={saving}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:actions.cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common:actions.save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["STRATEGY_OPTIONS","TICKET_PRIORITIES","TICKET_TYPES","defaultFormData","formatRuleFilters","rule","t","parts","AssignmentRulesPage","useTranslation","loading","setLoading","useState","error","setError","rules","setRules","searchTerm","setSearchTerm","strategyFilter","setStrategyFilter","activeFilter","setActiveFilter","isModalOpen","setIsModalOpen","editingRule","setEditingRule","formData","setFormData","saving","setSaving","loadRules","useCallback","data","rulesApi","err","useEffect","filteredRules","matchesSearch","matchesStrategy","matchesActive","handleCreate","handleEdit","handleCloseModal","handleSave","payload","handleDelete","id","name","jsxs","jsx","Breadcrumb","Plus","AlertCircle","Loader2","Fragment","Search","strategy","Edit","Trash2","priority","type"],"mappings":"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"}