@atlashub/smartstack 3.21.0 → 3.25.0

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