@atlashub/smartstack 3.31.0 → 3.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/dist/chunks/{AgentSkillsPage-DcvOMm5k.js → AgentSkillsPage-BMxOA-nm.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-DcvOMm5k.js.map → AgentSkillsPage-BMxOA-nm.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-CDMhqrhE.js → AgentSkillsPage-DSwfoazB.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-CDMhqrhE.js.map → AgentSkillsPage-DSwfoazB.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-YpJSDaWc.js → AgentWorkloadPage-B_emq8kd.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-YpJSDaWc.js.map → AgentWorkloadPage-B_emq8kd.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-DYBPNzjQ.js → AgentWorkloadPage-_USTeYWz.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-DYBPNzjQ.js.map → AgentWorkloadPage-_USTeYWz.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-9r1axtCg.js → ApiCatalogDetailPage-BC_HxVu5.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-9r1axtCg.js.map → ApiCatalogDetailPage-BC_HxVu5.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-TjCQ8_A8.js → ApiCatalogDetailPage-BI7zyZAd.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-TjCQ8_A8.js.map → ApiCatalogDetailPage-BI7zyZAd.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-COxazTnz.js → ApiCatalogPage-CutaHo5K.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-COxazTnz.js.map → ApiCatalogPage-CutaHo5K.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-QRysH0pT.js → ApiCatalogPage-M80MorHU.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-QRysH0pT.js.map → ApiCatalogPage-M80MorHU.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-jSHy3MPz.js → ApplicationDetailPage-DVY0wua0.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-jSHy3MPz.js.map → ApplicationDetailPage-DVY0wua0.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-Dbx01Ikm.js → ApplicationDetailPage-DzszwaIZ.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-Dbx01Ikm.js.map → ApplicationDetailPage-DzszwaIZ.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-CclKc0wI.js → ApplicationsDashboardPage-B3ptvnJz.js} +3 -3
  22. package/dist/chunks/{ApplicationsDashboardPage-CclKc0wI.js.map → ApplicationsDashboardPage-B3ptvnJz.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-CxWmOc1x.js → ApplicationsDashboardPage-D0pxqbEc.js} +2 -2
  24. package/dist/chunks/{ApplicationsDashboardPage-CxWmOc1x.js.map → ApplicationsDashboardPage-D0pxqbEc.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-D2l8cM3o.js → ApplicationsGridPage-Ca23FBSP.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-D2l8cM3o.js.map → ApplicationsGridPage-Ca23FBSP.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-BJXWXwyI.js → ApplicationsGridPage-qi2UCD24.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-BJXWXwyI.js.map → ApplicationsGridPage-qi2UCD24.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-CMosl3my.js → ApplicationsListPage-CEUmBXN0.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-CMosl3my.js.map → ApplicationsListPage-CEUmBXN0.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-Dc6NGQ61.js → ApplicationsListPage-cE82bv8j.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-Dc6NGQ61.js.map → ApplicationsListPage-cE82bv8j.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-DI-iMqoJ.js → ApplicationsPage-DW1BrVVN.js} +4 -4
  34. package/dist/chunks/{ApplicationsPage-DI-iMqoJ.js.map → ApplicationsPage-DW1BrVVN.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-DH7tpMlF.js → ApplicationsPage-RAqTs5HI.js} +2 -2
  36. package/dist/chunks/{ApplicationsPage-DH7tpMlF.js.map → ApplicationsPage-RAqTs5HI.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-E79QBSLb.js → AssignmentRulesPage-C0qnk3oR.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-E79QBSLb.js.map → AssignmentRulesPage-C0qnk3oR.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-B5UbujbZ.js → AssignmentRulesPage-CVgFmhEs.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-B5UbujbZ.js.map → AssignmentRulesPage-CVgFmhEs.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-CDFaL1gT.js → AssignmentsPage-Bv9HYtYN.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-CDFaL1gT.js.map → AssignmentsPage-Bv9HYtYN.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-CPeKJjyK.js → AssignmentsPage-z1q1C9Uz.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-CPeKJjyK.js.map → AssignmentsPage-z1q1C9Uz.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-BZ3Ocos5.js → AuthCallbackPage-CcteN6Kv.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-BZ3Ocos5.js.map → AuthCallbackPage-CcteN6Kv.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-Bml48QpH.js → AuthCallbackPage-DL5PJUYJ.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-Bml48QpH.js.map → AuthCallbackPage-DL5PJUYJ.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-DyzslZ06.js → ConfirmEmailPage-BP8VUz-A.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-DyzslZ06.js.map → ConfirmEmailPage-BP8VUz-A.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-DP1XPaKK.js → ConfirmEmailPage-CeflKXpN.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-DP1XPaKK.js.map → ConfirmEmailPage-CeflKXpN.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-Bz2KrMik.js → CreateSupportTicketPage-BAdvWb_8.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-Bz2KrMik.js.map → CreateSupportTicketPage-BAdvWb_8.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-hKjKM0Bh.js → CreateSupportTicketPage-DDiv79-p.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-hKjKM0Bh.js.map → CreateSupportTicketPage-DDiv79-p.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-B4nAd8Tj.js → DashboardPage-B_uyyRRE.js} +2 -2
  58. package/dist/chunks/{DashboardPage-B4nAd8Tj.js.map → DashboardPage-B_uyyRRE.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-rN7IFlTR.js → DashboardPage-CpoduSu7.js} +2 -2
  60. package/dist/chunks/{DashboardPage-rN7IFlTR.js.map → DashboardPage-CpoduSu7.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-CjbNGMo1.js → DashboardPage-D4pyUgdM.js} +3 -3
  62. package/dist/chunks/{DashboardPage-CjbNGMo1.js.map → DashboardPage-D4pyUgdM.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-C9qgPBS-.js → DashboardPage-Kp-MCxW4.js} +3 -3
  64. package/dist/chunks/{DashboardPage-C9qgPBS-.js.map → DashboardPage-Kp-MCxW4.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CGv2L62M.js → EscalationConfigPage-D-WCN6YS.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CGv2L62M.js.map → EscalationConfigPage-D-WCN6YS.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-DpYDmsgw.js → EscalationConfigPage-UrLJarSI.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-DpYDmsgw.js.map → EscalationConfigPage-UrLJarSI.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-Db6sOrZN.js → ForceChangePasswordPage-BIh1SF5C.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-Db6sOrZN.js.map → ForceChangePasswordPage-BIh1SF5C.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CLI_fpF4.js → ForceChangePasswordPage-FFZZRpU7.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CLI_fpF4.js.map → ForceChangePasswordPage-FFZZRpU7.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-BhMz2B6A.js → ForgotPasswordPage-BKqRF7SF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-BhMz2B6A.js.map → ForgotPasswordPage-BKqRF7SF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-D06arMXO.js → ForgotPasswordPage-BXp8qQUX.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-D06arMXO.js.map → ForgotPasswordPage-BXp8qQUX.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-BCM8KBCd.js → GroupDetailPage-a0hBx-LO.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-BCM8KBCd.js.map → GroupDetailPage-a0hBx-LO.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-CGMV3bWt.js → GroupDetailPage-eGGJCqgq.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-CGMV3bWt.js.map → GroupDetailPage-eGGJCqgq.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-BBrwEomx.js → MyAccessRequestsPage-BgQSyy5d.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-BBrwEomx.js.map → MyAccessRequestsPage-BgQSyy5d.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-CrlWe3gd.js → MyAccessRequestsPage-Dmb0rUHO.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-CrlWe3gd.js.map → MyAccessRequestsPage-Dmb0rUHO.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BOV34_rJ.js → MyTenantsPage-BZTeqyDr.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BOV34_rJ.js.map → MyTenantsPage-BZTeqyDr.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-CK4-klmd.js → MyTenantsPage-kCHBF2uA.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-CK4-klmd.js.map → MyTenantsPage-kCHBF2uA.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DuhpwhZx.js → MyTicketsPage-BwNIqpCE.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DuhpwhZx.js.map → MyTicketsPage-BwNIqpCE.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-CFZ1G4dG.js → MyTicketsPage-CTpjkA5t.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-CFZ1G4dG.js.map → MyTicketsPage-CTpjkA5t.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-BnNQRfBP.js → NavigationAppsPage-DO5bTibb.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-BnNQRfBP.js.map → NavigationAppsPage-DO5bTibb.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-DdJxEoTZ.js → NavigationAppsPage-vx_n07SD.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-DdJxEoTZ.js.map → NavigationAppsPage-vx_n07SD.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-BllOlagk.js → NotificationsPage-Br9sb9AQ.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-BllOlagk.js.map → NotificationsPage-Br9sb9AQ.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-D1T_ozHl.js → NotificationsPage-CRhd752L.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-D1T_ozHl.js.map → NotificationsPage-CRhd752L.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-CrAQt7qL.js → OnboardingWizardPage-BIl3Usew.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-CrAQt7qL.js.map → OnboardingWizardPage-BIl3Usew.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-CioLaCYz.js → OnboardingWizardPage-CjqxWX7h.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-CioLaCYz.js.map → OnboardingWizardPage-CjqxWX7h.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-CvPqugYu.js → PermissionDetailPage-COIuJXH-.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-CvPqugYu.js.map → PermissionDetailPage-COIuJXH-.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-BIG78-1-.js → PermissionDetailPage-P_d6xnY0.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-BIG78-1-.js.map → PermissionDetailPage-P_d6xnY0.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-CDSuc8vw.js → PermissionsPage-BhjnMyFY.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-CDSuc8vw.js.map → PermissionsPage-BhjnMyFY.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-XaOrGrPZ.js → PermissionsPage-CHYy8XFr.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-XaOrGrPZ.js.map → PermissionsPage-CHYy8XFr.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-oSD7oQhJ.js → PortalDashboardPage-BwQ4NQrH.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-oSD7oQhJ.js.map → PortalDashboardPage-BwQ4NQrH.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-BsWVXkMe.js → PortalDashboardPage-hLJcfGnT.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-BsWVXkMe.js.map → PortalDashboardPage-hLJcfGnT.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-ca2BOdoH.js → PreferencesPage-DYYqisR0.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-ca2BOdoH.js.map → PreferencesPage-DYYqisR0.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-DD0_XWdT.js → PreferencesPage-DzpM-lpD.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-DD0_XWdT.js.map → PreferencesPage-DzpM-lpD.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-C8tUIOnb.js → ProfilePage-D98bvXeT.js} +2 -2
  122. package/dist/chunks/{ProfilePage-C8tUIOnb.js.map → ProfilePage-D98bvXeT.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-Bex_JN5N.js → ProfilePage-DWRDN0fo.js} +2 -2
  124. package/dist/chunks/{ProfilePage-Bex_JN5N.js.map → ProfilePage-DWRDN0fo.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-B-FXS2ln.js → ReferencesManagementPage-B0Cq9BHS.js} +2 -2
  126. package/dist/chunks/{ReferencesManagementPage-B-FXS2ln.js.map → ReferencesManagementPage-B0Cq9BHS.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-C8KZprkI.js → ReferencesManagementPage-CxbfOBs2.js} +3 -3
  128. package/dist/chunks/{ReferencesManagementPage-C8KZprkI.js.map → ReferencesManagementPage-CxbfOBs2.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-MWcVu-LY.js → RegisterPage-DMeq3GzW.js} +2 -2
  130. package/dist/chunks/{RegisterPage-MWcVu-LY.js.map → RegisterPage-DMeq3GzW.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-BYt__zKJ.js → RegisterPage-DvG2Php7.js} +2 -2
  132. package/dist/chunks/{RegisterPage-BYt__zKJ.js.map → RegisterPage-DvG2Php7.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-rCLUIj_T.js → ResetPasswordPage-DOTswepm.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-rCLUIj_T.js.map → ResetPasswordPage-DOTswepm.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-DaJiMj5Z.js → ResetPasswordPage-ntMMFvDo.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-DaJiMj5Z.js.map → ResetPasswordPage-ntMMFvDo.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-j7Rp6apG.js → ResolutionModal-CKt73sIZ.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-j7Rp6apG.js.map → ResolutionModal-CKt73sIZ.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DeuPnLWg.js → ResolutionModal-XGHCELez.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DeuPnLWg.js.map → ResolutionModal-XGHCELez.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-CLtZWX17.js → RoleDetailPage-BtnYTVN6.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-CLtZWX17.js.map → RoleDetailPage-BtnYTVN6.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-TGyGmLMM.js → RoleDetailPage-DAp65p0d.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-TGyGmLMM.js.map → RoleDetailPage-DAp65p0d.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Dm03fBBf.js → RolesPage-DyEhJHxw.js} +2 -2
  146. package/dist/chunks/{RolesPage-Dm03fBBf.js.map → RolesPage-DyEhJHxw.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-C0c5G9e7.js → RolesPage-FmZCLEYo.js} +2 -2
  148. package/dist/chunks/{RolesPage-C0c5G9e7.js.map → RolesPage-FmZCLEYo.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B4WDzEKi.js → SlaConfigPage-DTtP2Q4t.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B4WDzEKi.js.map → SlaConfigPage-DTtP2Q4t.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-Cwo9NwxH.js → SlaConfigPage-LpVD_ai4.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-Cwo9NwxH.js.map → SlaConfigPage-LpVD_ai4.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-CL12dFy-.js → SupportPermissionsPage-BV8F_Tl3.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-CL12dFy-.js.map → SupportPermissionsPage-BV8F_Tl3.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-CneIhl30.js → SupportPermissionsPage-Bzfq6pKf.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-CneIhl30.js.map → SupportPermissionsPage-Bzfq6pKf.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-DStKmwHT.js → TemplatesPage-CYHH5WlP.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-DStKmwHT.js.map → TemplatesPage-CYHH5WlP.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-X4Rrhs9p.js → TemplatesPage-czt_RH5f.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-X4Rrhs9p.js.map → TemplatesPage-czt_RH5f.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BUBYWtvR.js → TenantCard-Bqh5PGJx.js} +2 -2
  162. package/dist/chunks/{TenantCard-BUBYWtvR.js.map → TenantCard-Bqh5PGJx.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CAgiB-NG.js → TenantCard-C6qKD480.js} +2 -2
  164. package/dist/chunks/{TenantCard-CAgiB-NG.js.map → TenantCard-C6qKD480.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-BAoah-mL.js → TenantScopeSelector-DWUP8Le7.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-BAoah-mL.js.map → TenantScopeSelector-DWUP8Le7.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-B9vtpIZx.js → TenantScopeSelector-DxQ7HNbh.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-B9vtpIZx.js.map → TenantScopeSelector-DxQ7HNbh.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-BFcP4X8s.js → TicketDetailPage-BuxXLcJi.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-BFcP4X8s.js.map → TicketDetailPage-BuxXLcJi.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-D_Npnt4A.js → TicketDetailPage-Dy4pg33-.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-D_Npnt4A.js.map → TicketDetailPage-Dy4pg33-.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-p21DLhUb.js → TicketsPage-Ck-HUgte.js} +2 -2
  174. package/dist/chunks/{TicketsPage-p21DLhUb.js.map → TicketsPage-Ck-HUgte.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-DBP9kalU.js → TicketsPage-jlN9JDzm.js} +2 -2
  176. package/dist/chunks/{TicketsPage-DBP9kalU.js.map → TicketsPage-jlN9JDzm.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-DOwShnG8.js → UserCreateTicketPage-BrRZyXMn.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-DOwShnG8.js.map → UserCreateTicketPage-BrRZyXMn.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-lvlvp2u6.js → UserCreateTicketPage-D58Ro4Nb.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-lvlvp2u6.js.map → UserCreateTicketPage-D58Ro4Nb.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-Dp6q6FEW.js → UserDashboardPage-C5ulSzaI.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-Dp6q6FEW.js.map → UserDashboardPage-C5ulSzaI.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-C_tm7Pld.js → UserDashboardPage-CjAx5OHh.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-C_tm7Pld.js.map → UserDashboardPage-CjAx5OHh.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-DXLxO7LF.js → UserDetailPage-Bhpry9xq.js} +2 -2
  186. package/dist/chunks/{UserDetailPage-DXLxO7LF.js.map → UserDetailPage-Bhpry9xq.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-6grZ6gmV.js → UserDetailPage-DUu2mA_n.js} +5 -5
  188. package/dist/chunks/{UserDetailPage-6grZ6gmV.js.map → UserDetailPage-DUu2mA_n.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-a4II5VEE.js → UserTicketDetailPage-DpFFjIso.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-a4II5VEE.js.map → UserTicketDetailPage-DpFFjIso.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-Ch9IfCPo.js → UserTicketDetailPage-YJvBWFEu.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-Ch9IfCPo.js.map → UserTicketDetailPage-YJvBWFEu.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-BeAv4QfV.js → UsersGroupsPage-b2PTQX_m.js} +2 -2
  194. package/dist/chunks/{UsersGroupsPage-BeAv4QfV.js.map → UsersGroupsPage-b2PTQX_m.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-B7Er0V4l.js → UsersGroupsPage-l33K3Nca.js} +3 -3
  196. package/dist/chunks/{UsersGroupsPage-B7Er0V4l.js.map → UsersGroupsPage-l33K3Nca.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-ZR9r9vvf.js → UsersPage-BjC5ZqTa.js} +2 -2
  198. package/dist/chunks/{UsersPage-ZR9r9vvf.js.map → UsersPage-BjC5ZqTa.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-0M1FLqOe.js → UsersPage-NsTukS8m.js} +2 -2
  200. package/dist/chunks/{UsersPage-0M1FLqOe.js.map → UsersPage-NsTukS8m.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-CBpF5d54.js → accessRequestsApi-C2usKVGJ.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-CBpF5d54.js.map → accessRequestsApi-C2usKVGJ.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-BJH8EE1K.js → accessRequestsApi-LuovcP6l.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-BJH8EE1K.js.map → accessRequestsApi-LuovcP6l.js.map} +1 -1
  205. package/dist/chunks/{aiApi-Dl7a2lWz.js → aiApi-B03u3zUH.js} +2 -2
  206. package/dist/chunks/{aiApi-Dl7a2lWz.js.map → aiApi-B03u3zUH.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CkkWAvNB.js → aiApi-Cwg0B8PJ.js} +2 -2
  208. package/dist/chunks/{aiApi-CkkWAvNB.js.map → aiApi-Cwg0B8PJ.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-BwcSE_H1.js → applicationAnalyticsApi-BobBdehV.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-BwcSE_H1.js.map → applicationAnalyticsApi-BobBdehV.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-DKMmDvWk.js → applicationAnalyticsApi-jCZhWKOx.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-DKMmDvWk.js.map → applicationAnalyticsApi-jCZhWKOx.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BzDV3_Jc.js → groupsApi-CoxnW9vH.js} +2 -2
  214. package/dist/chunks/{groupsApi-BzDV3_Jc.js.map → groupsApi-CoxnW9vH.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-CQ4vFMdP.js → groupsApi-D2lFFcgu.js} +2 -2
  216. package/dist/chunks/{groupsApi-CQ4vFMdP.js.map → groupsApi-D2lFFcgu.js.map} +1 -1
  217. package/dist/chunks/{index-Det9dEaQ.js → index-B5U_Jp0-.js} +2 -2
  218. package/dist/chunks/{index-Det9dEaQ.js.map → index-B5U_Jp0-.js.map} +1 -1
  219. package/dist/chunks/{index-D18t9DhC.js → index-BDB_a-p7.js} +4 -4
  220. package/dist/chunks/{index-D18t9DhC.js.map → index-BDB_a-p7.js.map} +1 -1
  221. package/dist/chunks/{index-CUZygY5Q.js → index-BbHRJz-n.js} +2 -2
  222. package/dist/chunks/{index-CUZygY5Q.js.map → index-BbHRJz-n.js.map} +1 -1
  223. package/dist/chunks/{index-CoHIgn5H.js → index-CI2WU5ZZ.js} +2 -2
  224. package/dist/chunks/{index-CoHIgn5H.js.map → index-CI2WU5ZZ.js.map} +1 -1
  225. package/dist/chunks/{index-D-2xSu5W.js → index-CLk9ClC2.js} +3 -3
  226. package/dist/chunks/{index-D-2xSu5W.js.map → index-CLk9ClC2.js.map} +1 -1
  227. package/dist/chunks/{index-Dbq-x5H9.js → index-CmTKGOa_.js} +2 -2
  228. package/dist/chunks/{index-Dbq-x5H9.js.map → index-CmTKGOa_.js.map} +1 -1
  229. package/dist/chunks/{index-k4USDz2P.js → index-D5oIr6PO.js} +2 -2
  230. package/dist/chunks/{index-k4USDz2P.js.map → index-D5oIr6PO.js.map} +1 -1
  231. package/dist/chunks/{index-Cib93xtp.js → index-DC6TBJV_.js} +2 -2
  232. package/dist/chunks/{index-Cib93xtp.js.map → index-DC6TBJV_.js.map} +1 -1
  233. package/dist/chunks/{index-CpY95_ro.js → index-DN97bp_f.js} +1128 -1093
  234. package/dist/chunks/index-DN97bp_f.js.map +1 -0
  235. package/dist/chunks/{index-BPMjxWVx.js → index-DRW5qV_L.js} +2 -2
  236. package/dist/chunks/{index-BPMjxWVx.js.map → index-DRW5qV_L.js.map} +1 -1
  237. package/dist/chunks/{index-DQd324n7.js → index-DcLZao1q.js} +2 -2
  238. package/dist/chunks/{index-DQd324n7.js.map → index-DcLZao1q.js.map} +1 -1
  239. package/dist/chunks/{index-bgT9XOKZ.js → index-DcMOmGtX.js} +2 -2
  240. package/dist/chunks/{index-bgT9XOKZ.js.map → index-DcMOmGtX.js.map} +1 -1
  241. package/dist/chunks/{index-DK5czlkn.js → index-DnML-nfd.js} +10 -10
  242. package/dist/chunks/index-DnML-nfd.js.map +1 -0
  243. package/dist/chunks/{index-BBmMbSZV.js → index-Drd59qAP.js} +8 -8
  244. package/dist/chunks/{index-BBmMbSZV.js.map → index-Drd59qAP.js.map} +1 -1
  245. package/dist/chunks/{index-CEbwdURd.js → index-EiIHjIgi.js} +2 -2
  246. package/dist/chunks/{index-CEbwdURd.js.map → index-EiIHjIgi.js.map} +1 -1
  247. package/dist/chunks/{index-BLlESTfA.js → index-axYz6ptj.js} +2 -2
  248. package/dist/chunks/{index-BLlESTfA.js.map → index-axYz6ptj.js.map} +1 -1
  249. package/dist/chunks/{index-Ci1SqFiY.js → index-lXrXnhFc.js} +2 -2
  250. package/dist/chunks/{index-Ci1SqFiY.js.map → index-lXrXnhFc.js.map} +1 -1
  251. package/dist/chunks/{index-h7ZrwrQg.js → index-rI-1r6c2.js} +2 -2
  252. package/dist/chunks/{index-h7ZrwrQg.js.map → index-rI-1r6c2.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-Dk6K-UTE.js → tenantIconMap-B4wAYGWP.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-Dk6K-UTE.js.map → tenantIconMap-B4wAYGWP.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-7ihIWxAh.js → tenantIconMap-Cfm15HwB.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-7ihIWxAh.js.map → tenantIconMap-Cfm15HwB.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-BCMKkzlv.js → ticketingApi-CLMAPZDw.js} +2 -2
  258. package/dist/chunks/{ticketingApi-BCMKkzlv.js.map → ticketingApi-CLMAPZDw.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-Dwn7pl5z.js → ticketingApi-CTap4NdE.js} +2 -2
  260. package/dist/chunks/{ticketingApi-Dwn7pl5z.js.map → ticketingApi-CTap4NdE.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-gJ7yhWyi.js → useAccessRequests-CBpDkq9o.js} +2 -2
  262. package/dist/chunks/{useAccessRequests-gJ7yhWyi.js.map → useAccessRequests-CBpDkq9o.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-Du7CvowE.js → useAccessRequests-Cj2-OoAW.js} +3 -3
  264. package/dist/chunks/{useAccessRequests-Du7CvowE.js.map → useAccessRequests-Cj2-OoAW.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-5wWea2Jg.js → useUserAccessRequests-C6l2VMe1.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-5wWea2Jg.js.map → useUserAccessRequests-C6l2VMe1.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-Bk_v8egy.js → useUserAccessRequests-Ds3K-ENU.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-Bk_v8egy.js.map → useUserAccessRequests-Ds3K-ENU.js.map} +1 -1
  269. package/dist/components/routing/DynamicRouter.d.ts.map +1 -1
  270. package/dist/components/routing/ProtectedRoute.d.ts.map +1 -1
  271. package/dist/contexts/AuthContext.d.ts.map +1 -1
  272. package/dist/contexts/NavigationContext.d.ts.map +1 -1
  273. package/dist/extensions/PageRegistry.d.ts +2 -0
  274. package/dist/extensions/PageRegistry.d.ts.map +1 -1
  275. package/dist/services/api/adminApi/settings.d.ts +8 -3
  276. package/dist/services/api/adminApi/settings.d.ts.map +1 -1
  277. package/dist/smartstack.cjs +1 -1
  278. package/dist/smartstack.js +1 -1
  279. package/package.json +1 -1
  280. package/dist/chunks/index-CpY95_ro.js.map +0 -1
  281. package/dist/chunks/index-DK5czlkn.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsPage-DH7tpMlF.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-RAqTs5HI.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":"0VAaO,SAASA,EAAoB,CAAE,cAAAC,EAAe,SAAAC,EAAU,eAAAC,EAAgB,UAAAC,GAAqD,CAClI,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAAA,eAAe,OAAO,EAC9B,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtC,CAACC,EAAiBC,CAAkB,EAAIF,EAAAA,SAAS,EAAK,EACtD,CAACG,EAAQC,CAAS,EAAIJ,EAAAA,SAAS,EAAE,EACjC,CAACK,EAAeC,CAAgB,EAAIN,EAAAA,SAAS,EAAK,EAElDO,EAAgB,SAAY,CAChCR,EAAW,EAAI,EACf,GAAI,CACF,MAAMS,oBAAkB,cAAcf,EAAUD,EAAe,CAC7D,cAAAA,EACA,OAAQW,GAAU,MAAA,CACnB,EACDD,EAAmB,EAAK,EACxBE,EAAU,EAAE,EACZE,EAAiB,EAAI,EACrBX,IAAA,CACF,OAASc,EAAK,CACZ,QAAQ,MAAM,mCAAoCA,CAAG,CACvD,QAAA,CACEV,EAAW,EAAK,CAClB,CACF,EAGA,OAAIM,GAAiBX,IAAmB,UAEpCgB,EAAAA,KAAC,MAAA,CAAI,UAAU,mJACb,SAAA,CAAAC,EAAAA,IAACC,EAAAA,MAAA,CAAM,UAAU,SAAA,CAAU,EAC1BhB,EAAE,8BAA+B,iBAAiB,CAAA,EACrD,SAKD,MAAA,CACC,SAAA,CAAAc,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMR,EAAmB,EAAI,EACtC,UAAU,qJAET,SAAA,CAAAR,IAAmB,eACjBmB,EAAAA,UAAA,CAAU,UAAU,UAAU,EAE/BF,EAAAA,IAACG,EAAAA,MAAA,CAAM,UAAU,SAAA,CAAU,EAE5BpB,IAAmB,SAChBE,EAAE,6BAA8B,eAAe,EAC/CA,EAAE,8BAA8B,CAAA,CAAA,CAAA,EAGrCK,SACE,MAAA,CAAI,UAAU,mFACb,SAAAS,EAAAA,KAAC,MAAA,CAAI,UAAU,0EACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAf,EAAE,mCAAmC,EAAE,EAC9Ee,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMT,EAAmB,EAAK,EACvC,UAAU,yCACV,SAAUJ,EAEV,SAAAa,EAAAA,IAACI,EAAAA,EAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,EACF,EAEAL,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC,QAAA,CAAM,UAAU,yBACd,SAAAf,EAAE,kCAAkC,EACvC,EACAe,EAAAA,IAAC,WAAA,CACC,MAAOR,EACP,SAAWa,GAAMZ,EAAUY,EAAE,OAAO,KAAK,EACzC,UAAU,4GACV,KAAM,EACN,YAAapB,EAAE,wCAAwC,CAAA,CAAA,CACzD,EACF,EACAc,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMT,EAAmB,EAAK,EACvC,UAAU,0GACV,SAAUJ,EAET,WAAE,eAAe,CAAA,CAAA,EAEpBY,EAAAA,KAAC,SAAA,CACC,QAASH,EACT,SAAUT,EACV,UAAU,kKAET,SAAA,CAAAA,GAAWa,EAAAA,IAACM,EAAAA,QAAA,CAAQ,UAAU,sBAAA,CAAuB,EACrDrB,EAAE,eAAe,CAAA,CAAA,CAAA,CACpB,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EAEJ,CAEJ,CC/FA,MAAMsB,EAAsC,CAC1C,SAAUC,EAAAA,SACV,UAAWC,EAAAA,UACX,KAAMC,EAAAA,SACN,IAAKC,EAAAA,GACP,EAEA,SAASC,EAAQC,EAAyB,CACxC,OAAKA,GACEN,EAAQM,EAAS,YAAA,CAAa,GAAKF,EAAAA,GAC5C,CAYA,MAAMG,EAAkBC,EAAAA,KAAK,SAAyB,CAAE,IAAAC,EAAK,WAAAC,EAAY,iBAAAC,EAAkB,SAAAC,EAAU,SAAArC,EAAU,sBAAAsC,EAAuB,kBAAAC,CAAA,EAA2C,CAC/K,KAAM,CAAE,EAAApC,CAAA,EAAMC,EAAAA,eAAe,YAAY,EACnCoC,EAAOV,EAAQI,EAAI,IAAI,EACvBO,EAAkBP,EAAI,cAAgB,iBAAmBA,EAAI,QAAQ,SAAW,EAEhFQ,EAAsBC,cAAapB,GAAwB,CAC/DA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFa,EAAA,CACF,EAAG,CAACA,CAAgB,CAAC,EAErB,OAAIK,QAEC,MAAA,CAAI,UAAU,uMACb,SAAAxB,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,+EACb,eAACsB,EAAA,CAAK,UAAU,qCAAqC,CAAA,CACvD,EACAtB,EAAAA,IAAC,OAAI,UAAU,mEACb,eAAC0B,OAAA,CAAK,UAAU,UAAU,CAAA,CAC5B,CAAA,EACF,EAEA1B,EAAAA,IAAC,KAAA,CAAG,UAAU,wDACX,WAAI,MACP,QAEC,IAAA,CAAE,UAAU,qDACV,SAAAf,EAAE,qCAAsC,sCAAsC,EACjF,EAECH,GACCkB,EAAAA,IAACpB,EAAA,CACC,cAAeoC,EAAI,GACnB,SAAAlC,EACA,eAAgBsC,EAChB,UAAWC,CAAA,CAAA,CACb,CAAA,CAEJ,CAAA,CACF,EAKFrB,EAAAA,IAAC,MAAA,CAAI,UAAU,yMACb,SAAAD,EAAAA,KAAC4B,EAAAA,KAAA,CACC,GAAIX,EAAI,MAAQG,EAASH,EAAI,KAAK,EAAI,IACtC,UAAU,YAEV,SAAA,CAAAjB,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,oHACb,eAACsB,EAAA,CAAK,UAAU,yCAAyC,CAAA,CAC3D,EACAtB,EAAAA,IAAC,SAAA,CACC,QAASwB,EACT,UAAW,8CACTP,EACI,oDACA,6FACN,GACA,MAAOA,EAAahC,EAAE,kCAAmC,uBAAuB,EAAIA,EAAE,+BAAgC,kBAAkB,EAExI,eAAC2C,EAAAA,KAAA,CAAK,UAAW,WAAWX,EAAa,eAAiB,EAAE,EAAA,CAAI,CAAA,CAAA,CAClE,EACF,EAEAjB,EAAAA,IAAC,KAAA,CAAG,UAAU,wDACX,WAAI,MACP,EAEAD,EAAAA,KAAC,IAAA,CAAE,UAAU,4CACV,SAAA,CAAAiB,EAAI,QAAQ,OAAO,IAAEA,EAAI,QAAQ,SAAW,EACzC/B,EAAE,mCAAoC,QAAQ,EAC9CA,EAAE,qCAAsC,SAAS,CAAA,EACvD,EAEAc,EAAAA,KAAC,MAAA,CAAI,UAAU,kIACZ,SAAA,CAAAd,EAAE,wBAAyB,MAAM,EAClCe,EAAAA,IAAC6B,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,CAAA,CAAA,CAClC,CAAA,CAAA,CAAA,EAEJ,CAEJ,CAAC,EAEM,SAASC,GAAwC,CACtD,KAAM,CAAE,EAAA7C,CAAA,EAAMC,EAAAA,eAAe,YAAY,EACnC,CAAE,UAAA6C,EAAW,KAAAC,EAAM,eAAAC,EAAgB,WAAAhB,EAAY,UAAAiB,EAAW,YAAAC,CAAA,EAAgBC,gBAAA,EAC1E,CAAE,cAAAC,CAAA,EAAkBC,YAAA,EACpBnB,EAAWoB,EAAAA,aAAA,EACX,CAAE,SAAUC,EAAkB,OAAQC,CAAA,EAAyBC,EAAAA,sBAAA,EAE/DC,EAAeX,GAAM,cAAgB,CAAA,EAErCY,EAAmBnB,cAAaoB,GAA+C,CACnF,MAAMC,EAAcN,EACjB,OAAOO,GAAKA,EAAE,gBAAkBF,GAASE,EAAE,WAAaV,GAAe,EAAE,EAE5E,OADgBS,EAAY,KAAKC,GAAKA,EAAE,SAAW,SAAS,EACxC,UACLD,EAAY,KAAKC,GAAKA,EAAE,SAAW,QAAQ,EACvC,SACZ,IACT,EAAG,CAACP,EAAkBH,GAAe,EAAE,CAAC,EAElCW,EAAwBvB,EAAAA,YAAY,IAAM,CAC9CU,EAAA,EACAM,EAAA,CACF,EAAG,CAACN,EAAaM,CAAoB,CAAC,EAEtC,OAAIP,EAEAlC,MAAC,OAAI,UAAU,iDACb,eAAC,MAAA,CAAI,UAAU,mGAAmG,CAAA,CACpH,EAKFD,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC,MAAG,UAAU,gDACX,SAAAf,EAAE,yBAA0B,cAAc,EAC7C,QACC,IAAA,CAAE,UAAU,oCACV,SAAAA,EAAE,4BAA6B,6BAA6B,CAAA,CAC/D,CAAA,EACF,EAEC8C,EAAU,OAAS,GAClBhC,EAAAA,KAAC,UAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,gFACZ,SAAA,CAAAC,EAAAA,IAAC4B,EAAAA,KAAA,CAAK,UAAU,+DAAA,CAAgE,EAC/E3C,EAAE,6BAA8B,WAAW,CAAA,EAC9C,QACC,MAAA,CAAI,UAAU,sEACZ,SAAA8C,EAAU,IAAIkB,GAAO,CACpB,MAAMjC,EAAM2B,EAAa,QAAUO,EAAE,KAAOD,EAAI,EAAE,EAClD,OAAKjC,EAEHhB,EAAAA,IAACc,EAAA,CAEC,IAAAE,EACA,WAAY,GACZ,iBAAkB,IAAMiB,EAAejB,EAAI,EAAE,EAC7C,SAAAG,EACA,SAAUkB,GAAe,GACzB,sBAAuBO,EAAiB5B,EAAI,EAAE,EAC9C,kBAAmBgC,CAAA,EAPdhC,EAAI,EAAA,EAHI,IAanB,CAAC,CAAA,CACH,CAAA,EACF,SAGD,UAAA,CACC,SAAA,CAAAhB,MAAC,MAAG,UAAU,wDACX,SAAAf,EAAE,uBAAwB,kBAAkB,EAC/C,EACC0D,EAAa,OAAS,EACrB3C,EAAAA,IAAC,OAAI,UAAU,sEACZ,SAAA2C,EAAa,IAAI3B,GAChBhB,EAAAA,IAACc,EAAA,CAEC,IAAAE,EACA,WAAYC,EAAWD,EAAI,EAAE,EAC7B,iBAAkB,IAAMiB,EAAejB,EAAI,EAAE,EAC7C,SAAAG,EACA,SAAUkB,GAAe,GACzB,sBAAuBO,EAAiB5B,EAAI,EAAE,EAC9C,kBAAmBgC,CAAA,EAPdhC,EAAI,EAAA,CASZ,CAAA,CACH,EAEAjB,OAAC,MAAA,CAAI,UAAU,yGACb,SAAA,CAAAC,EAAAA,IAACW,EAAAA,IAAA,CAAI,UAAU,oDAAA,CAAqD,QACnE,IAAA,CAAE,UAAU,+BACV,SAAA1B,EAAE,0BAA2B,2BAA2B,CAAA,CAC3D,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ"}
@@ -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-DK5czlkn.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-E79QBSLb.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-DnML-nfd.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-C0qnk3oR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssignmentRulesPage-E79QBSLb.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-C0qnk3oR.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":"8NAOMA,EAAmB,CACvB,aACA,gBACA,aACA,WACA,eACF,EAEMC,EAAoB,CAAC,MAAO,SAAU,OAAQ,UAAU,EACxDC,EAAe,CAAC,MAAO,iBAAkB,UAAW,WAAY,aAAc,oBAAoB,EAYlGC,EAA4B,CAChC,KAAM,GACN,SAAU,EACV,aAAc,aACd,qBAAsB,KACtB,iBAAkB,KAClB,qBAAsB,GACtB,WAAY,EACd,EAEA,SAASC,EACPC,EACAC,EACQ,CACR,GAAI,CAACD,EAAK,sBAAwB,CAACA,EAAK,iBACtC,OAAOC,EAAE,qBAAqB,EAGhC,MAAMC,EAAkB,CAAA,EACxB,OAAIF,EAAK,sBACPE,EAAM,KAAKD,EAAE,sBAAsBD,EAAK,oBAAoB,EAAE,CAAC,EAE7DA,EAAK,kBACPE,EAAM,KAAKD,EAAE,iBAAiBD,EAAK,gBAAgB,EAAE,CAAC,EAEjDE,EAAM,KAAK,KAAK,CACzB,CAEO,SAASC,GAAoC,CAClD,KAAM,CAAE,EAAAF,CAAA,EAAMG,EAAAA,eAAe,SAAS,EAChC,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAI,EACrC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAwB,IAAI,EAChD,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAA8B,CAAA,CAAE,EACpD,CAACK,EAAYC,CAAa,EAAIN,EAAAA,SAAS,EAAE,EACzC,CAACO,EAAgBC,CAAiB,EAAIR,EAAAA,SAAiB,EAAE,EACzD,CAACS,EAAcC,CAAe,EAAIV,EAAAA,SAAiB,EAAE,EAErD,CAACW,EAAaC,CAAc,EAAIZ,EAAAA,SAAS,EAAK,EAC9C,CAACa,EAAaC,CAAc,EAAId,EAAAA,SAAmC,IAAI,EACvE,CAACe,EAAUC,CAAW,EAAIhB,EAAAA,SAAmBT,CAAe,EAC5D,CAAC0B,EAAQC,CAAS,EAAIlB,EAAAA,SAAS,EAAK,EAEpCmB,EAAYC,EAAAA,YAAY,SAAY,CACxC,GAAI,CACFrB,EAAW,EAAI,EACfG,EAAS,IAAI,EACb,MAAMmB,EAAO,MAAMC,EAAAA,SAAS,OAAA,EAC5BlB,EAASiB,CAAI,CACf,OAASE,EAAK,CACZrB,EAASqB,aAAe,MAAQA,EAAI,QAAU,iCAAiC,EAC/E,QAAQ,MAAM,mCAAoCA,CAAG,CACvD,QAAA,CACExB,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAELyB,EAAAA,UAAU,IAAM,CACdL,EAAA,CACF,EAAG,CAACA,CAAS,CAAC,EAEd,MAAMM,EAAgBtB,EAAM,OAAQV,GAAS,CAC3C,MAAMiC,EAAgBjC,EAAK,KAAK,YAAA,EAAc,SAASY,EAAW,aAAa,EACzEsB,EAAkB,CAACpB,GAAkBd,EAAK,eAAiBc,EAC3DqB,EAAgB,CAACnB,IAAiBA,IAAiB,SAAWhB,EAAK,SAAW,CAACA,EAAK,UAC1F,OAAOiC,GAAiBC,GAAmBC,CAC7C,CAAC,EAEKC,EAAe,IAAM,CACzBf,EAAe,IAAI,EACnBE,EAAYzB,CAAe,EAC3BqB,EAAe,EAAI,CACrB,EAEMkB,EAAcrC,GAA4B,CAC9CqB,EAAerB,CAAI,EACnBuB,EAAY,CACV,KAAMvB,EAAK,KACX,SAAUA,EAAK,SACf,aAAcA,EAAK,aACnB,qBAAsBA,EAAK,qBAC3B,iBAAkBA,EAAK,iBACvB,qBAAsBA,EAAK,qBAC3B,WAAYA,EAAK,UAAA,CAClB,EACDmB,EAAe,EAAI,CACrB,EAEMmB,EAAmB,IAAM,CAC7BnB,EAAe,EAAK,EACpBE,EAAe,IAAI,EACnBE,EAAYzB,CAAe,CAC7B,EAEMyC,EAAa,SAAY,CAC7B,GAAI,CAACjB,EAAS,KAAK,OAAQ,CACzB,MAAMrB,EAAE,8BAA8B,CAAC,EACvC,MACF,CAEA,GAAI,CACFwB,EAAU,EAAI,EACdhB,EAAS,IAAI,EAEb,MAAM+B,EAAqE,CACzE,KAAMlB,EAAS,KACf,SAAUA,EAAS,SACnB,aAAcA,EAAS,aACvB,qBAAsBA,EAAS,sBAAwB,OACvD,iBAAkBA,EAAS,kBAAoB,OAC/C,qBAAsBA,EAAS,qBAC/B,WAAYA,EAAS,UAAA,EAGnBF,EACF,MAAMS,EAAAA,SAAS,OAAOT,EAAY,GAAIoB,CAAsC,EAE5E,MAAMX,EAAAA,SAAS,OAAOW,CAAsC,EAG9D,MAAMd,EAAA,EACNY,EAAA,CACF,OAASR,EAAK,CACZrB,EAASqB,aAAe,MAAQA,EAAI,QAAU,qBAAqB,EACnE,QAAQ,MAAM,uBAAwBA,CAAG,CAC3C,QAAA,CACEL,EAAU,EAAK,CACjB,CACF,EAEMgB,EAAe,MAAOC,EAAYC,IAAiB,CACvD,GAAK,OAAO,QAAQ1C,EAAE,2BAA4B,CAAE,KAAA0C,CAAA,CAAM,CAAC,EAI3D,GAAI,CACFlC,EAAS,IAAI,EACb,MAAMoB,EAAAA,SAAS,OAAOa,CAAE,EACxB,MAAMhB,EAAA,CACR,OAASI,EAAK,CACZrB,EAASqB,aAAe,MAAQA,EAAI,QAAU,uBAAuB,EACrE,QAAQ,MAAM,yBAA0BA,CAAG,CAC7C,CACF,EAEA,OACEc,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,EAAAA,IAACC,EAAAA,WAAA,CACC,MAAO,CACL,CAAE,MAAO7C,EAAE,QAAS,SAAS,EAAG,KAAM,UAAA,EACtC,CAAE,MAAOA,EAAE,kBAAkB,CAAA,CAAE,CACjC,CAAA,EAGF2C,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,qBAAsB,SAAA5C,EAAE,kBAAkB,EAAE,QACzD,IAAA,CAAE,UAAU,+BACV,SAAAA,EAAE,sBAAuB,0CAA0C,CAAA,CACtE,CAAA,EACF,EACA2C,EAAAA,KAAC,SAAA,CACC,QAASR,EACT,UAAU,0CAEV,SAAA,CAAAS,EAAAA,IAACE,EAAAA,KAAA,CAAK,UAAU,SAAA,CAAU,EACzB9C,EAAE,mBAAmB,CAAA,CAAA,CAAA,CACxB,EACF,EAECO,GACCoC,EAAAA,KAAC,MAAA,CAAI,UAAU,oHACb,SAAA,CAAAC,EAAAA,IAACG,EAAAA,YAAA,CAAY,UAAU,8BAAA,CAA+B,SACrD,MAAA,CACC,SAAA,CAAAH,MAAC,IAAA,CAAE,UAAU,cAAe,SAAA5C,EAAE,cAAc,EAAE,EAC9C4C,EAAAA,IAAC,IAAA,CAAE,UAAU,UAAW,SAAArC,CAAA,CAAM,CAAA,CAAA,CAChC,CAAA,EACF,EAGDH,SACE,MAAA,CAAI,UAAU,yCACb,SAAAwC,EAAAA,IAACI,EAAAA,QAAA,CAAQ,UAAU,sDAAA,CAAuD,CAAA,CAC5E,EAED,CAAC5C,GAAWK,EAAM,SAAW,GAC5BkC,OAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAC,MAAC,IAAA,CAAE,UAAU,6BAA8B,SAAA5C,EAAE,oBAAoB,EAAE,QAClE,IAAA,CAAE,UAAU,oCACV,SAAAA,EAAE,6BAA8B,kDAAkD,EACrF,EACA4C,EAAAA,IAAC,SAAA,CACC,QAAST,EACT,UAAU,kBAET,WAAE,mBAAmB,CAAA,CAAA,CACxB,EACF,EAED,CAAC/B,GAAWK,EAAM,OAAS,GAC1BkC,OAAAM,EAAAA,SAAA,CACE,SAAA,CAAAN,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC,QAAA,CAAM,UAAU,iCAAkC,SAAA5C,EAAE,mBAAmB,EAAE,EAC1E2C,EAAAA,KAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAC,EAAAA,IAACM,EAAAA,OAAA,CAAO,UAAU,4DAAA,CAA6D,EAC/EN,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,YAAa5C,EAAE,+BAAgC,mBAAmB,EAClE,MAAOW,EACP,SAAWwC,GAAMvC,EAAcuC,EAAE,OAAO,KAAK,EAC7C,UAAU,oBAAA,CAAA,CACZ,CAAA,CACF,CAAA,EACF,EAEAR,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC,QAAA,CAAM,UAAU,iCAAkC,SAAA5C,EAAE,qBAAqB,EAAE,EAC5E2C,EAAAA,KAAC,SAAA,CACC,MAAO9B,EACP,SAAWsC,GAAMrC,EAAkBqC,EAAE,OAAO,KAAK,EACjD,UAAU,eAEV,SAAA,CAAAP,MAAC,UAAO,MAAM,GAAI,SAAA5C,EAAE,2BAA4B,gBAAgB,EAAE,EACjEN,EAAiB,IAAK0D,GACrBR,MAAC,UAAsB,MAAOQ,EAC3B,SAAApD,EAAE,4BAA4BoD,EAAS,OAAO,CAAC,EAAE,YAAA,CAAa,GAAGA,EAAS,MAAM,CAAC,CAAC,EAAE,CAAA,EAD1EA,CAEb,CACD,CAAA,CAAA,CAAA,CACH,EACF,SAEC,MAAA,CACC,SAAA,CAAAR,MAAC,QAAA,CAAM,UAAU,iCAAkC,SAAA5C,EAAE,mBAAmB,EAAE,EAC1E2C,EAAAA,KAAC,SAAA,CACC,MAAO5B,EACP,SAAWoC,GAAMnC,EAAgBmC,EAAE,OAAO,KAAK,EAC/C,UAAU,eAEV,SAAA,CAAAP,MAAC,UAAO,MAAM,GAAI,SAAA5C,EAAE,uBAAwB,YAAY,EAAE,QACzD,SAAA,CAAO,MAAM,SAAU,SAAAA,EAAE,eAAe,EAAE,QAC1C,SAAA,CAAO,MAAM,WAAY,SAAAA,EAAE,iBAAiB,CAAA,CAAE,CAAA,CAAA,CAAA,CACjD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,QAEC,MAAA,CAAI,UAAU,uBACb,SAAA2C,EAAAA,KAAC,QAAA,CAAM,UAAU,SACf,SAAA,CAAAC,MAAC,QAAA,CAAM,UAAU,iEACf,SAAAD,EAAAA,KAAC,KAAA,CACC,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,yEACX,SAAA5C,EAAE,iBAAiB,EACtB,QACC,KAAA,CAAG,UAAU,yEACX,SAAAA,EAAE,qBAAqB,EAC1B,QACC,KAAA,CAAG,UAAU,yEACX,SAAAA,EAAE,qBAAqB,EAC1B,QACC,KAAA,CAAG,UAAU,yEACX,SAAAA,EAAE,oBAAoB,EACzB,QACC,KAAA,CAAG,UAAU,yEACX,SAAAA,EAAE,uBAAuB,EAC5B,QACC,KAAA,CAAG,UAAU,yEACX,SAAAA,EAAE,mBAAmB,EACxB,QACC,KAAA,CAAG,UAAU,0EACX,SAAAA,EAAE,sBAAsB,CAAA,CAC3B,CAAA,CAAA,CACF,CAAA,CACF,EACA4C,EAAAA,IAAC,QAAA,CAAM,UAAU,wCACd,SAAAb,EAAc,IAAKhC,GAClB4C,EAAAA,KAAC,KAAA,CAAiB,UAAU,4CAC1B,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,gCAAiC,SAAA7C,EAAK,KAAK,EACzD6C,MAAC,MAAG,UAAU,iDACX,WAAE,4BAA4B7C,EAAK,aAAa,OAAO,CAAC,EAAE,YAAA,CAAa,GAAGA,EAAK,aAAa,MAAM,CAAC,CAAC,EAAE,EACzG,EACA6C,EAAAA,IAAC,KAAA,CAAG,UAAU,iDACX,WAAK,SACR,EACAA,EAAAA,IAAC,KAAA,CAAG,UAAU,iDACZ,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,kEACb,SAAA9C,EAAkBC,EAAMC,CAAC,CAAA,CAC5B,EACF,EACA4C,EAAAA,IAAC,KAAA,CAAG,UAAU,iDACX,WAAK,qBACR,EACAA,EAAAA,IAAC,MAAG,UAAU,oBACZ,eAAC,OAAA,CAAK,UAAW,8CACf7C,EAAK,SACD,oDACA,uDACN,GACG,WAAK,SAAWC,EAAE,eAAe,EAAIA,EAAE,iBAAiB,CAAA,CAC3D,CAAA,CACF,QACC,KAAA,CAAG,UAAU,uBACZ,SAAA2C,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMP,EAAWrC,CAAI,EAC9B,UAAU,mDAEV,SAAA,CAAA6C,EAAAA,IAACS,EAAAA,KAAA,CAAK,UAAU,SAAA,CAAU,EACzBrD,EAAE,qBAAqB,CAAA,CAAA,CAAA,EAE1B2C,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMH,EAAazC,EAAK,GAAIA,EAAK,IAAI,EAC9C,UAAU,4EAEV,SAAA,CAAA6C,EAAAA,IAACU,EAAAA,OAAA,CAAO,UAAU,SAAA,CAAU,EAC3BtD,EAAE,uBAAuB,CAAA,CAAA,CAAA,CAC5B,CAAA,CACF,CAAA,CACF,CAAA,GA1COD,EAAK,EA2Cd,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,EAGDkB,SACE,MAAA,CAAI,UAAU,sEACb,SAAA0B,EAAAA,KAAC,MAAA,CAAI,UAAU,4FACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0HACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wBACX,SAAc5C,EAAdmB,EAAgB,kBAAuB,mBAAN,CAAyB,CAC7D,EACAyB,EAAAA,IAAC,SAAA,CACC,QAASP,EACT,SAAUd,EACV,UAAU,gEACX,SAAA,GAAA,CAAA,CAED,EACF,EAEAoB,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,QAAA,CAAM,UAAU,iCACd,SAAA,CAAA3C,EAAE,iBAAiB,EAAE,IAAC4C,EAAAA,IAAC,OAAA,CAAK,UAAU,2BAA2B,SAAA,GAAA,CAAC,CAAA,EACrE,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOvB,EAAS,KAChB,SAAW8B,GAAM7B,EAAY,CAAE,GAAGD,EAAU,KAAM8B,EAAE,OAAO,MAAO,EAClE,YAAanD,EAAE,kCAAmC,WAAW,EAC7D,UAAU,eACV,SAAUuB,CAAA,CAAA,CACZ,EACF,EAEAoB,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC,QAAA,CAAM,UAAU,iCACd,SAAA5C,EAAE,qBAAqB,EAC1B,EACA4C,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,MAAOvB,EAAS,SAChB,SAAW8B,GAAM7B,EAAY,CAAE,GAAGD,EAAU,SAAU,SAAS8B,EAAE,OAAO,KAAK,GAAK,EAAG,EACrF,YAAY,IACZ,UAAU,eACV,SAAU5B,CAAA,CAAA,QAEX,IAAA,CAAE,UAAU,4CACV,SAAAvB,EAAE,+BAAgC,gCAAgC,CAAA,CACrE,CAAA,EACF,SAEC,MAAA,CACC,SAAA,CAAA2C,EAAAA,KAAC,QAAA,CAAM,UAAU,iCACd,SAAA,CAAA3C,EAAE,qBAAqB,EAAE,IAAC4C,EAAAA,IAAC,OAAA,CAAK,UAAU,2BAA2B,SAAA,GAAA,CAAC,CAAA,EACzE,EACAA,EAAAA,IAAC,SAAA,CACC,MAAOvB,EAAS,aAChB,SAAW8B,GAAM7B,EAAY,CAAE,GAAGD,EAAU,aAAc8B,EAAE,OAAO,MAAO,EAC1E,UAAU,eACV,SAAU5B,EAET,SAAA7B,EAAiB,IAAK0D,GACrBR,EAAAA,IAAC,UAAsB,MAAOQ,EAC3B,SAAApD,EAAE,4BAA4BoD,EAAS,OAAO,CAAC,EAAE,YAAA,CAAa,GAAGA,EAAS,MAAM,CAAC,CAAC,EAAE,CAAA,EAD1EA,CAEb,CACD,CAAA,CAAA,CACH,CAAA,CACF,CAAA,EACF,EAEAT,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC,SAAM,UAAU,iCACd,SAAA5C,EAAE,iCAAkC,wBAAwB,EAC/D,EACA2C,EAAAA,KAAC,SAAA,CACC,MAAOtB,EAAS,sBAAwB,GACxC,SAAW8B,GAAM7B,EAAY,CAAE,GAAGD,EAAU,qBAAsB8B,EAAE,OAAO,OAAS,IAAA,CAAM,EAC1F,UAAU,eACV,SAAU5B,EAEV,SAAA,CAAAqB,MAAC,UAAO,MAAM,GAAI,SAAA5C,EAAE,2BAA4B,WAAW,EAAE,EAC5DL,EAAkB,IAAK4D,SACrB,SAAA,CAAsB,MAAOA,EAC3B,SAAAvD,EAAE,sBAAsBuD,CAAQ,EAAE,CAAA,EADxBA,CAEb,CACD,CAAA,CAAA,CAAA,CACH,EACF,SAEC,MAAA,CACC,SAAA,CAAAX,MAAC,SAAM,UAAU,iCACd,SAAA5C,EAAE,6BAA8B,oBAAoB,EACvD,EACA2C,EAAAA,KAAC,SAAA,CACC,MAAOtB,EAAS,kBAAoB,GACpC,SAAW8B,GAAM7B,EAAY,CAAE,GAAGD,EAAU,iBAAkB8B,EAAE,OAAO,OAAS,IAAA,CAAM,EACtF,UAAU,eACV,SAAU5B,EAEV,SAAA,CAAAqB,MAAC,UAAO,MAAM,GAAI,SAAA5C,EAAE,2BAA4B,WAAW,EAAE,EAC5DJ,EAAa,IAAK4D,SAChB,SAAA,CAAkB,MAAOA,EACvB,SAAAxD,EAAE,iBAAiBwD,CAAI,EAAE,CAAA,EADfA,CAEb,CACD,CAAA,CAAA,CAAA,CACH,CAAA,CACF,CAAA,EACF,SAEC,MAAA,CACC,SAAA,CAAAZ,MAAC,QAAA,CAAM,UAAU,iCACd,SAAA5C,EAAE,uBAAuB,EAC5B,EACA4C,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,IAAI,IACJ,MAAOvB,EAAS,qBAChB,SAAW8B,GAAM7B,EAAY,CAAE,GAAGD,EAAU,qBAAsB,KAAK,IAAI,EAAG,SAAS8B,EAAE,OAAO,KAAK,GAAK,CAAC,EAAG,EAC9G,UAAU,eACV,SAAU5B,CAAA,CAAA,CACZ,EACF,EAEAoB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,GAAG,aACH,QAASvB,EAAS,WAClB,SAAW8B,GAAM7B,EAAY,CAAE,GAAGD,EAAU,WAAY8B,EAAE,OAAO,QAAS,EAC1E,UAAU,uCACV,SAAU5B,CAAA,CAAA,EAEZqB,EAAAA,IAAC,SAAM,QAAQ,aAAa,UAAU,sBACnC,SAAA5C,EAAE,qBAAqB,EAC1B,QACC,IAAA,CAAE,UAAU,+CACV,SAAAA,EAAE,+BAAgC,oCAAoC,CAAA,CACzE,CAAA,CAAA,CACF,CAAA,EACF,EAEA2C,EAAAA,KAAC,MAAA,CAAI,UAAU,kGACb,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACC,QAASP,EACT,SAAUd,EACV,UAAU,oBAET,WAAE,uBAAuB,CAAA,CAAA,EAE5BoB,EAAAA,KAAC,SAAA,CACC,QAASL,EACT,SAAUf,EACV,UAAU,0CAET,SAAA,CAAAA,GAAUqB,EAAAA,IAACI,EAAAA,QAAA,CAAQ,UAAU,sBAAA,CAAuB,EACpDhD,EAAE,qBAAqB,CAAA,CAAA,CAAA,CAC1B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EAEJ,CAEJ"}
@@ -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 { a6 as h, B as U } from "./index-CpY95_ro.js";
5
+ import { a6 as h, B as U } from "./index-DN97bp_f.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-B5UbujbZ.js.map
391
+ //# sourceMappingURL=AssignmentRulesPage-CVgFmhEs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssignmentRulesPage-B5UbujbZ.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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"}
1
+ {"version":3,"file":"AssignmentRulesPage-CVgFmhEs.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;"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
2
  import ce, { useState as C, useCallback as W, useMemo as F, createRef as Te, useRef as xe, useEffect as he } from "react";
3
3
  import { useTranslation as ue } from "react-i18next";
4
4
  import { Lock as Ne, ChevronRight as ae, ChevronDown as ne, FolderOpen as Ie, Database as Me, FileText as Ae, Box as $e, Filter as Oe, Search as Ee, Check as de, RotateCcw as Le, X as je, Loader2 as ge, AlertCircle as ie, Sparkles as _e, Info as De, ChevronLeft as be, Ban as ve, Eye as me, Star as fe, BookOpen as Be, ChevronUp as We, ShieldCheck as Ke, Pencil as ze, User as Ge } from "lucide-react";
5
- import { o as Ue, x as Xe, y as Ze, B as qe, k as He } from "./index-CpY95_ro.js";
5
+ import { o as Ue, x as Xe, y as Ze, B as qe, k as He } from "./index-DN97bp_f.js";
6
6
  import { g as Je, c as Qe, a as Ve, P as Ye, b as et } from "./PermissionPopover-CR6SD8ch.js";
7
7
  function tt({
8
8
  section: r,
@@ -970,4 +970,4 @@ function ut() {
970
970
  export {
971
971
  ut as AssignmentsPage
972
972
  };
973
- //# sourceMappingURL=AssignmentsPage-CDFaL1gT.js.map
973
+ //# sourceMappingURL=AssignmentsPage-Bv9HYtYN.js.map