@atlashub/smartstack 3.29.0 → 3.31.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.
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CDMhqrhE.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CDMhqrhE.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DcvOMm5k.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DcvOMm5k.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-DYBPNzjQ.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-DYBPNzjQ.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-YpJSDaWc.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-YpJSDaWc.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-9r1axtCg.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-9r1axtCg.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-TjCQ8_A8.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-TjCQ8_A8.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-COxazTnz.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-COxazTnz.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-QRysH0pT.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-QRysH0pT.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-Dbx01Ikm.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-Dbx01Ikm.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage-jSHy3MPz.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage-jSHy3MPz.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-CclKc0wI.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-CclKc0wI.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-CxWmOc1x.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-CxWmOc1x.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-BJXWXwyI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-BJXWXwyI.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-D2l8cM3o.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-D2l8cM3o.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-CMosl3my.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-CMosl3my.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-Dc6NGQ61.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-Dc6NGQ61.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-DH7tpMlF.js} +2 -2
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-DH7tpMlF.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-DI-iMqoJ.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-DI-iMqoJ.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-B5UbujbZ.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-B5UbujbZ.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-E79QBSLb.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-E79QBSLb.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-CDFaL1gT.js} +2 -2
- package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-CDFaL1gT.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-CPeKJjyK.js} +2 -2
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-CPeKJjyK.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-BZ3Ocos5.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-BZ3Ocos5.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-Bml48QpH.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-Bml48QpH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-DP1XPaKK.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-DP1XPaKK.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-DyzslZ06.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-DyzslZ06.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-Bz2KrMik.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-Bz2KrMik.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-hKjKM0Bh.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-hKjKM0Bh.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-B4nAd8Tj.js} +2 -2
- package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-B4nAd8Tj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-C9qgPBS-.js} +3 -3
- package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-C9qgPBS-.js.map} +1 -1
- package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CjbNGMo1.js} +3 -3
- package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CjbNGMo1.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-rN7IFlTR.js} +2 -2
- package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-rN7IFlTR.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-CGv2L62M.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-CGv2L62M.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-DpYDmsgw.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-DpYDmsgw.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-CLI_fpF4.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-CLI_fpF4.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-Db6sOrZN.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-Db6sOrZN.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-BhMz2B6A.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-BhMz2B6A.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-D06arMXO.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-D06arMXO.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-BCM8KBCd.js} +5 -5
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-BCM8KBCd.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-CGMV3bWt.js} +2 -2
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-CGMV3bWt.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-BBrwEomx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-BBrwEomx.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-CrlWe3gd.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-CrlWe3gd.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-BOV34_rJ.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-BOV34_rJ.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CK4-klmd.js} +2 -2
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CK4-klmd.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-CFZ1G4dG.js} +2 -2
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-CFZ1G4dG.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DuhpwhZx.js} +2 -2
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DuhpwhZx.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-BnNQRfBP.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-BnNQRfBP.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DdJxEoTZ.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DdJxEoTZ.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-BllOlagk.js} +2 -2
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-BllOlagk.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D1T_ozHl.js} +2 -2
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D1T_ozHl.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-CioLaCYz.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-CioLaCYz.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-CrAQt7qL.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-CrAQt7qL.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-BIG78-1-.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-BIG78-1-.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-CvPqugYu.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-CvPqugYu.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-CDSuc8vw.js} +2 -2
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-CDSuc8vw.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-XaOrGrPZ.js} +2 -2
- package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-XaOrGrPZ.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BsWVXkMe.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BsWVXkMe.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-oSD7oQhJ.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-oSD7oQhJ.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-DD0_XWdT.js} +2 -2
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-DD0_XWdT.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-ca2BOdoH.js} +2 -2
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-ca2BOdoH.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-Bex_JN5N.js} +2 -2
- package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-Bex_JN5N.js.map} +1 -1
- package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-C8tUIOnb.js} +2 -2
- package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-C8tUIOnb.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-B-FXS2ln.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-B-FXS2ln.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-C8KZprkI.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-C8KZprkI.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-BYt__zKJ.js} +2 -2
- package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-BYt__zKJ.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-MWcVu-LY.js} +2 -2
- package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-MWcVu-LY.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-DaJiMj5Z.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-DaJiMj5Z.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-rCLUIj_T.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-rCLUIj_T.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-DeuPnLWg.js} +2 -2
- package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-DeuPnLWg.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-j7Rp6apG.js} +2 -2
- package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-j7Rp6apG.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CLtZWX17.js} +3 -3
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CLtZWX17.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TGyGmLMM.js} +2 -2
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TGyGmLMM.js.map} +1 -1
- package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-C0c5G9e7.js} +2 -2
- package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-C0c5G9e7.js.map} +1 -1
- package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-Dm03fBBf.js} +2 -2
- package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-Dm03fBBf.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-B4WDzEKi.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-B4WDzEKi.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-Cwo9NwxH.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-Cwo9NwxH.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-CL12dFy-.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-CL12dFy-.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-CneIhl30.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-CneIhl30.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-DStKmwHT.js} +2 -2
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-DStKmwHT.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-X4Rrhs9p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-X4Rrhs9p.js.map} +1 -1
- package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BUBYWtvR.js} +2 -2
- package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BUBYWtvR.js.map} +1 -1
- package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-CAgiB-NG.js} +2 -2
- package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-CAgiB-NG.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-B9vtpIZx.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-B9vtpIZx.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-BAoah-mL.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-BAoah-mL.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-BFcP4X8s.js} +2 -2
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-BFcP4X8s.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-D_Npnt4A.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-D_Npnt4A.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-DBP9kalU.js} +2 -2
- package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-DBP9kalU.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-p21DLhUb.js} +2 -2
- package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-p21DLhUb.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-DOwShnG8.js} +3 -3
- package/dist/chunks/UserCreateTicketPage-DOwShnG8.js.map +1 -0
- package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-lvlvp2u6.js} +48 -48
- package/dist/chunks/UserCreateTicketPage-lvlvp2u6.js.map +1 -0
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-C_tm7Pld.js} +2 -2
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-C_tm7Pld.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-Dp6q6FEW.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-Dp6q6FEW.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-6grZ6gmV.js} +5 -5
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-6grZ6gmV.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-DXLxO7LF.js} +2 -2
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-DXLxO7LF.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-Ch9IfCPo.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-Ch9IfCPo.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-a4II5VEE.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-a4II5VEE.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-B7Er0V4l.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-B7Er0V4l.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-BeAv4QfV.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-BeAv4QfV.js.map} +1 -1
- package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-0M1FLqOe.js} +2 -2
- package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-0M1FLqOe.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-ZR9r9vvf.js} +2 -2
- package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-ZR9r9vvf.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-BJH8EE1K.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-BJH8EE1K.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-CBpF5d54.js} +2 -2
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-CBpF5d54.js.map} +1 -1
- package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-CkkWAvNB.js} +2 -2
- package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-CkkWAvNB.js.map} +1 -1
- package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-Dl7a2lWz.js} +2 -2
- package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-Dl7a2lWz.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-BwcSE_H1.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-BwcSE_H1.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-DKMmDvWk.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-DKMmDvWk.js.map} +1 -1
- package/dist/chunks/auth-Ca2Rn6on.js +2 -0
- package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
- package/dist/chunks/auth-ClNTDOqm.js +18 -0
- package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
- package/dist/chunks/auth-DECnMZjF.js +18 -0
- package/dist/chunks/auth-DECnMZjF.js.map +1 -0
- package/dist/chunks/auth-DPvxdqy4.js +18 -0
- package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
- package/dist/chunks/auth-HzvnTaOm.js +2 -0
- package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
- package/dist/chunks/auth-M6aNTKCH.js +2 -0
- package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
- package/dist/chunks/auth-UHnAu6_e.js +2 -0
- package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
- package/dist/chunks/auth-YrujJY7m.js +18 -0
- package/dist/chunks/auth-YrujJY7m.js.map +1 -0
- package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-BzDV3_Jc.js} +2 -2
- package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-BzDV3_Jc.js.map} +1 -1
- package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-CQ4vFMdP.js} +2 -2
- package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-CQ4vFMdP.js.map} +1 -1
- package/dist/chunks/{index-BIqcvvbh.js → index-BBmMbSZV.js} +9 -8
- package/dist/chunks/index-BBmMbSZV.js.map +1 -0
- package/dist/chunks/{index-_g82N2nb.js → index-BLlESTfA.js} +2 -2
- package/dist/chunks/{index-_g82N2nb.js.map → index-BLlESTfA.js.map} +1 -1
- package/dist/chunks/{index-DEOBhXS_.js → index-BPMjxWVx.js} +2 -2
- package/dist/chunks/{index-DEOBhXS_.js.map → index-BPMjxWVx.js.map} +1 -1
- package/dist/chunks/{index-Czk12A3G.js → index-CEbwdURd.js} +2 -2
- package/dist/chunks/{index-Czk12A3G.js.map → index-CEbwdURd.js.map} +1 -1
- package/dist/chunks/{index-BOKR3bw6.js → index-CUZygY5Q.js} +2 -2
- package/dist/chunks/{index-BOKR3bw6.js.map → index-CUZygY5Q.js.map} +1 -1
- package/dist/chunks/{index-IJR_91Yt.js → index-Ci1SqFiY.js} +2 -2
- package/dist/chunks/{index-IJR_91Yt.js.map → index-Ci1SqFiY.js.map} +1 -1
- package/dist/chunks/{index-Br2wsGE8.js → index-Cib93xtp.js} +2 -2
- package/dist/chunks/{index-Br2wsGE8.js.map → index-Cib93xtp.js.map} +1 -1
- package/dist/chunks/{index-BxHVPJ-j.js → index-CoHIgn5H.js} +2 -2
- package/dist/chunks/{index-BxHVPJ-j.js.map → index-CoHIgn5H.js.map} +1 -1
- package/dist/chunks/{index-DA5VyW0k.js → index-CpY95_ro.js} +2296 -2309
- package/dist/chunks/index-CpY95_ro.js.map +1 -0
- package/dist/chunks/{index-BMsjMCv9.js → index-D-2xSu5W.js} +3 -3
- package/dist/chunks/{index-BMsjMCv9.js.map → index-D-2xSu5W.js.map} +1 -1
- package/dist/chunks/{index-DIQ6Jmmq.js → index-D18t9DhC.js} +4 -4
- package/dist/chunks/{index-DIQ6Jmmq.js.map → index-D18t9DhC.js.map} +1 -1
- package/dist/chunks/index-DK5czlkn.js +48 -0
- package/dist/chunks/index-DK5czlkn.js.map +1 -0
- package/dist/chunks/{index-CxgEV-rT.js → index-DQd324n7.js} +2 -2
- package/dist/chunks/{index-CxgEV-rT.js.map → index-DQd324n7.js.map} +1 -1
- package/dist/chunks/{index-S-X8qFYW.js → index-Dbq-x5H9.js} +2 -2
- package/dist/chunks/{index-S-X8qFYW.js.map → index-Dbq-x5H9.js.map} +1 -1
- package/dist/chunks/{index-CNxx56kE.js → index-Det9dEaQ.js} +2 -2
- package/dist/chunks/{index-CNxx56kE.js.map → index-Det9dEaQ.js.map} +1 -1
- package/dist/chunks/{index-C1w97Ejz.js → index-bgT9XOKZ.js} +2 -2
- package/dist/chunks/{index-C1w97Ejz.js.map → index-bgT9XOKZ.js.map} +1 -1
- package/dist/chunks/index-h7ZrwrQg.js +2 -0
- package/dist/chunks/index-h7ZrwrQg.js.map +1 -0
- package/dist/chunks/{index-Djy4eIbB.js → index-k4USDz2P.js} +2 -2
- package/dist/chunks/{index-Djy4eIbB.js.map → index-k4USDz2P.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-7ihIWxAh.js} +2 -2
- package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-7ihIWxAh.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-Dk6K-UTE.js} +2 -2
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-Dk6K-UTE.js.map} +1 -1
- package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-BCMKkzlv.js} +2 -2
- package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-BCMKkzlv.js.map} +1 -1
- package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Dwn7pl5z.js} +2 -2
- package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Dwn7pl5z.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-Du7CvowE.js} +3 -3
- package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-Du7CvowE.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-gJ7yhWyi.js} +2 -2
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-gJ7yhWyi.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-5wWea2Jg.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-5wWea2Jg.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-Bk_v8egy.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-Bk_v8egy.js.map} +1 -1
- package/dist/components/routing/ProtectedRoute.d.ts.map +1 -1
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/pages/LoginPage.d.ts.map +1 -1
- package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
- package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
- package/dist/services/api/apiClient.d.ts.map +1 -1
- package/dist/services/support/ticketDraftService.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +6 -6
- package/dist/utils/permissions.generated.d.ts +288 -0
- package/dist/utils/permissions.generated.d.ts.map +1 -0
- package/dist/utils/uuid.d.ts +6 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
- package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
- package/dist/chunks/auth-B-hELPDB.js +0 -2
- package/dist/chunks/auth-B-hELPDB.js.map +0 -1
- package/dist/chunks/auth-BYaMuq7D.js +0 -16
- package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
- package/dist/chunks/auth-C5zpZ9k7.js +0 -2
- package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
- package/dist/chunks/auth-CDpRMVv1.js +0 -16
- package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
- package/dist/chunks/auth-CyPkCta2.js +0 -2
- package/dist/chunks/auth-CyPkCta2.js.map +0 -1
- package/dist/chunks/auth-DL47kvnl.js +0 -2
- package/dist/chunks/auth-DL47kvnl.js.map +0 -1
- package/dist/chunks/auth-Diiv90i1.js +0 -16
- package/dist/chunks/auth-Diiv90i1.js.map +0 -1
- package/dist/chunks/auth-rog9MvUr.js +0 -16
- package/dist/chunks/auth-rog9MvUr.js.map +0 -1
- package/dist/chunks/index-BIqcvvbh.js.map +0 -1
- package/dist/chunks/index-DA5VyW0k.js.map +0 -1
- package/dist/chunks/index-Dht6EQW1.js +0 -2
- package/dist/chunks/index-Dht6EQW1.js.map +0 -1
- package/dist/chunks/index-vXiLh35n.js +0 -48
- package/dist/chunks/index-vXiLh35n.js.map +0 -1
|
@@ -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-
|
|
6
|
+
import { k as h, B as we, S as H } from "./index-CpY95_ro.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-
|
|
519
|
+
//# sourceMappingURL=RolesPage-C0c5G9e7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RolesPage-C5gYJxAl.js","sources":["../../src/pages/platform/administration/permissions/RolesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, MoreHorizontal, X, Loader2, Users, Shield, Eye, Crown, UserCog, PenTool, Sparkles, Filter, AppWindow, ChevronDown } from 'lucide-react';\r\nimport { adminApi, type RoleListDto, type PermissionListDto, type CreateRoleRequest, type UpdateRoleRequest, type RoleCategory } from '@/services/api/adminApi';\r\nimport { Slot } from '@/extensions';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nconst ALL_CATEGORIES: RoleCategory[] = ['Global', 'Admin', 'Manager', 'Contributor', 'Viewer', 'Custom'];\r\n\r\nconst CATEGORY_CONFIG: Record<RoleCategory, { icon: React.ElementType; color: string; bgColor: string; borderColor: string }> = {\r\n Global: {\r\n icon: Crown,\r\n color: 'text-purple-600 dark:text-purple-400',\r\n bgColor: 'bg-purple-50 dark:bg-purple-900/20',\r\n borderColor: 'border-purple-200 dark:border-purple-800'\r\n },\r\n Admin: {\r\n icon: Shield,\r\n color: 'text-red-600 dark:text-red-400',\r\n bgColor: 'bg-red-50 dark:bg-red-900/20',\r\n borderColor: 'border-red-200 dark:border-red-800'\r\n },\r\n Manager: {\r\n icon: UserCog,\r\n color: 'text-blue-600 dark:text-blue-400',\r\n bgColor: 'bg-blue-50 dark:bg-blue-900/20',\r\n borderColor: 'border-blue-200 dark:border-blue-800'\r\n },\r\n Contributor: {\r\n icon: PenTool,\r\n color: 'text-green-600 dark:text-green-400',\r\n bgColor: 'bg-green-50 dark:bg-green-900/20',\r\n borderColor: 'border-green-200 dark:border-green-800'\r\n },\r\n Viewer: {\r\n icon: Eye,\r\n color: 'text-gray-600 dark:text-gray-400',\r\n bgColor: 'bg-gray-50 dark:bg-gray-900/20',\r\n borderColor: 'border-gray-200 dark:border-gray-700'\r\n },\r\n Custom: {\r\n icon: Sparkles,\r\n color: 'text-orange-600 dark:text-orange-400',\r\n bgColor: 'bg-orange-50 dark:bg-orange-900/20',\r\n borderColor: 'border-orange-200 dark:border-orange-800'\r\n }\r\n};\r\n\r\nexport function RolesPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [permissions, setPermissions] = useState<PermissionListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingRole, setEditingRole] = useState<RoleListDto | null>(null);\r\n const [formData, setFormData] = useState<CreateRoleRequest>({\r\n name: '',\r\n description: '',\r\n permissionIds: []\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n const [filter, setFilter] = useState<'system' | 'custom' | RoleCategory | null>(null);\r\n const [applicationFilter, setApplicationFilter] = useState<string | null>(null);\r\n const [categoryFilter, setCategoryFilter] = useState<RoleCategory | null>(null);\r\n\r\n const loadRoles = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.roles.getAll(search ? { search } : undefined);\r\n setRoles(result);\r\n } catch (err) {\r\n console.error('Failed to load roles:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search]);\r\n\r\n const loadPermissions = async () => {\r\n try {\r\n const result = await adminApi.permissions.getAll();\r\n setPermissions(result);\r\n } catch (err) {\r\n console.error('Failed to load permissions:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRoles();\r\n loadPermissions();\r\n }, [loadRoles]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n loadRoles();\r\n };\r\n\r\n const openCreateModal = () => {\r\n setEditingRole(null);\r\n setFormData({ name: '', description: '', permissionIds: [] });\r\n setError(null);\r\n setShowModal(true);\r\n };\r\n\r\n const openEditModal = async (role: RoleListDto) => {\r\n try {\r\n const detail = await adminApi.roles.getById(role.id);\r\n setEditingRole(role);\r\n setFormData({\r\n name: detail.name,\r\n description: detail.description || '',\r\n parentRoleId: detail.parentRoleId || undefined,\r\n permissionIds: detail.permissions.map(p => p.id)\r\n });\r\n setError(null);\r\n setShowModal(true);\r\n } catch (err) {\r\n console.error('Failed to load role details:', err);\r\n }\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n if (editingRole) {\r\n const updateData: UpdateRoleRequest = {\r\n name: formData.name,\r\n description: formData.description,\r\n parentRoleId: formData.parentRoleId,\r\n permissionIds: formData.permissionIds\r\n };\r\n await adminApi.roles.update(editingRole.id, updateData);\r\n } else {\r\n await adminApi.roles.create(formData);\r\n }\r\n setShowModal(false);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (role: RoleListDto) => {\r\n if (!confirm(t('roles.confirmDelete', { name: role.name }))) return;\r\n\r\n try {\r\n await adminApi.roles.delete(role.id);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n alert(message);\r\n }\r\n setMenuOpen(null);\r\n };\r\n\r\n const handlePermissionToggle = (permissionId: string) => {\r\n setFormData(prev => ({\r\n ...prev,\r\n permissionIds: prev.permissionIds?.includes(permissionId)\r\n ? prev.permissionIds.filter(id => id !== permissionId)\r\n : [...(prev.permissionIds || []), permissionId]\r\n }));\r\n };\r\n\r\n const stats = useMemo(() => {\r\n const systemCount = roles.filter(r => r.isSystem).length;\r\n const customCount = roles.filter(r => !r.isSystem).length;\r\n const totalUsers = roles.reduce((sum, r) => sum + r.usersCount, 0);\r\n const categoryCount = roles.reduce((acc, r) => {\r\n acc[r.category] = (acc[r.category] || 0) + 1;\r\n return acc;\r\n }, {} as Record<string, number>);\r\n return { total: roles.length, systemCount, customCount, totalUsers, categoryCount };\r\n }, [roles]);\r\n\r\n const uniqueApplications = useMemo(() => {\r\n const appMap = new Map<string, string>();\r\n roles.forEach(r => {\r\n if (r.applicationId && r.applicationName) {\r\n appMap.set(r.applicationId, r.applicationName);\r\n }\r\n });\r\n return Array.from(appMap.entries())\r\n .map(([id, name]) => ({ id, name }))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n }, [roles]);\r\n\r\n const filteredRoles = useMemo(() => {\r\n let result = roles;\r\n // System/custom filter (from stats bar)\r\n if (filter === 'system') result = result.filter(r => r.isSystem);\r\n else if (filter === 'custom') result = result.filter(r => !r.isSystem);\r\n else if (filter) result = result.filter(r => r.category === filter);\r\n // Application filter\r\n if (applicationFilter === '__global__') result = result.filter(r => !r.applicationId);\r\n else if (applicationFilter) result = result.filter(r => r.applicationId === applicationFilter);\r\n // Category filter\r\n if (categoryFilter) result = result.filter(r => r.category === categoryFilter);\r\n return result;\r\n }, [roles, filter, applicationFilter, categoryFilter]);\r\n\r\n const hasActiveFilters = filter !== null || applicationFilter !== null || categoryFilter !== null;\r\n\r\n const clearAllFilters = () => {\r\n setFilter(null);\r\n setApplicationFilter(null);\r\n setCategoryFilter(null);\r\n };\r\n\r\n const toggleFilter = (newFilter: 'system' | 'custom' | RoleCategory) => {\r\n setFilter(prev => prev === newFilter ? null : newFilter);\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('roles.title') }\r\n ]}\r\n />\r\n\r\n {/* Header with stats */}\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('roles.title')}</h1>\r\n {!loading && (\r\n <span className=\"px-3 py-1 rounded-full text-sm font-medium bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n {hasActiveFilters ? `${filteredRoles.length} / ${stats.total}` : stats.total} {t('roles.totalLabel')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('roles.list')}</p>\r\n {!loading && stats.total > 0 && (\r\n <div className=\"flex items-center gap-2 mt-3 text-sm\">\r\n <button\r\n onClick={() => toggleFilter('system')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'system'\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)] ring-2 ring-[var(--warning-border)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {stats.systemCount} {t('roles.systemRoles')}\r\n </button>\r\n <button\r\n onClick={() => toggleFilter('custom')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'custom'\r\n ? 'bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] ring-2 ring-[var(--color-accent-300)] dark:ring-[var(--color-accent-700)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Sparkles className=\"w-4 h-4\" />\r\n {stats.customCount} {t('roles.customRoles')}\r\n </button>\r\n <span className=\"flex items-center gap-1.5 px-2.5 py-1 text-[var(--text-tertiary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n {stats.totalUsers} {t('roles.totalUsers')}\r\n </span>\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-full text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n title={t('roles.filters.clearAll')}\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Slot name=\"roles.header.actions\" context={{ roles, reload: loadRoles }} />\r\n <button\r\n onClick={openCreateModal}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roles.create')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Search + Filters */}\r\n <div className=\"flex flex-col gap-3\">\r\n <form onSubmit={handleSearch} className=\"flex gap-2\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search')}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.search')}\r\n </button>\r\n </form>\r\n\r\n {/* Filter bar */}\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <div className=\"flex items-center gap-1.5 text-sm text-[var(--text-tertiary)]\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span>{t('roles.filters.title')}</span>\r\n </div>\r\n\r\n {/* Application filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={applicationFilter ?? ''}\r\n onChange={e => setApplicationFilter(e.target.value || null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allApplications')}</option>\r\n <option value=\"__global__\">{t('roles.filters.globalRoles')}</option>\r\n {uniqueApplications.map(app => (\r\n <option key={app.id} value={app.id}>{app.name}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Category filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={categoryFilter ?? ''}\r\n onChange={e => setCategoryFilter((e.target.value || null) as RoleCategory | null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allCategories')}</option>\r\n {ALL_CATEGORIES.map(cat => (\r\n <option key={cat} value={cat}>{t(`roles.categories.${cat.toLowerCase()}`)}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Clear all filters */}\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 text-sm rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('roles.columns.category')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.columns.application')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden xl:table-cell\">{t('roles.columns.description')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.usersCount')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.permissions')}</th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center\">\r\n <Loader2 className=\"w-6 h-6 animate-spin mx-auto text-[var(--color-accent-500)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center text-[var(--text-secondary)]\">\r\n {hasActiveFilters ? (\r\n <div className=\"space-y-2\">\r\n <p>{t('roles.noRoles')}</p>\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"text-[var(--color-accent-600)] hover:underline\"\r\n >\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n </div>\r\n ) : t('roles.noRoles')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length > 0 && (\r\n filteredRoles.map(role => {\r\n const categoryConfig = CATEGORY_CONFIG[role.category] || CATEGORY_CONFIG.Custom;\r\n const CategoryIcon = categoryConfig.icon;\r\n return (\r\n <tr\r\n key={role.id}\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-9 h-9 rounded-full flex items-center justify-center ${categoryConfig.bgColor} ${categoryConfig.borderColor} border`}>\r\n <CategoryIcon className={`w-4 h-4 ${categoryConfig.color}`} />\r\n </div>\r\n <div>\r\n <div className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{role.name}</div>\r\n {role.isSystem && (\r\n <span className=\"text-xs text-[var(--warning-text)]\">\r\n {t('roles.system')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setCategoryFilter(prev => prev === role.category ? null : role.category); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all ${categoryConfig.bgColor} ${categoryConfig.color} ${categoryConfig.borderColor} hover:ring-2 hover:ring-offset-1 ${categoryFilter === role.category ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <CategoryIcon className=\"w-3.5 h-3.5\" />\r\n {t(`roles.categories.${role.category.toLowerCase()}`)}\r\n </button>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n {role.applicationName ? (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setApplicationFilter(prev => prev === role.applicationId ? null : role.applicationId); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)] hover:ring-2 hover:ring-offset-1 ${applicationFilter === role.applicationId ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <AppWindow className=\"w-3.5 h-3.5\" />\r\n {role.applicationName}\r\n </button>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs text-[var(--text-tertiary)]\">\r\n <Crown className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.globalRoles')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)] max-w-xs truncate hidden xl:table-cell\">{role.description || '-'}</td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.usersCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-center hidden lg:table-cell\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Shield className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.permissionsCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n title={t('users.view')}\r\n >\r\n <Eye className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {!role.isSystem && (\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === role.id ? null : role.id)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === role.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-[var(--radius-menu-item)] border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditModal(role); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n {role.usersCount === 0 && (\r\n <button\r\n onClick={() => handleDelete(role)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--error-text)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-modal)] w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {editingRole ? t('roles.edit') : t('roles.create')}\r\n </h2>\r\n <button onClick={() => setShowModal(false)} className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={e => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('roles.permissions')}\r\n </label>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto p-2 border border-[var(--border-color)] rounded-[var(--radius-card)]\">\r\n {permissions.map(permission => (\r\n <label key={permission.id} className=\"flex items-start gap-2 cursor-pointer p-2 hover:bg-[var(--bg-hover)] rounded-[var(--radius-button)]\">\r\n <input\r\n type=\"checkbox\"\r\n checked={formData.permissionIds?.includes(permission.id) || false}\r\n onChange={() => handlePermissionToggle(permission.id)}\r\n className=\"mt-0.5 rounded border-[var(--border-color)]\"\r\n />\r\n <div>\r\n <div className=\"text-[var(--text-primary)] font-mono text-sm\">{permission.path}</div>\r\n {permission.description && (\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{permission.description}</div>\r\n )}\r\n </div>\r\n </label>\r\n ))}\r\n {permissions.length === 0 && (\r\n <div className=\"text-center py-4 text-[var(--text-secondary)]\">\r\n {t('roles.noPermissions')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Extension form fields slot */}\r\n <Slot\r\n name=\"roles.form.fields.after\"\r\n context={{\r\n formData,\r\n onChange: (field: string, value: unknown) => {\r\n setFormData(prev => ({ ...prev, [field]: value }));\r\n },\r\n disabled: saving,\r\n isEditing: !!editingRole,\r\n role: editingRole,\r\n }}\r\n />\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {editingRole ? t('common.save') : t('common.create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ALL_CATEGORIES","CATEGORY_CONFIG","Crown","Shield","UserCog","PenTool","Eye","Sparkles","RolesPage","t","useTranslation","navigate","useNavigate","roles","setRoles","useState","permissions","setPermissions","loading","setLoading","search","setSearch","showModal","setShowModal","editingRole","setEditingRole","formData","setFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","filter","setFilter","applicationFilter","setApplicationFilter","categoryFilter","setCategoryFilter","loadRoles","useCallback","result","adminApi","err","loadPermissions","useEffect","handleSearch","openCreateModal","openEditModal","role","detail","p","handleSubmit","updateData","message","handleDelete","handlePermissionToggle","permissionId","prev","id","stats","useMemo","systemCount","r","customCount","totalUsers","sum","categoryCount","acc","uniqueApplications","appMap","name","a","b","filteredRoles","hasActiveFilters","clearAllFilters","toggleFilter","newFilter","jsxs","jsx","Breadcrumb","Users","X","Slot","Plus","Search","Filter","app","ChevronDown","cat","Loader2","categoryConfig","CategoryIcon","e","AppWindow","MoreHorizontal","Edit2","Trash2","permission","field","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RolesPage-C0c5G9e7.js","sources":["../../src/pages/platform/administration/permissions/RolesPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Plus, Search, Edit2, Trash2, MoreHorizontal, X, Loader2, Users, Shield, Eye, Crown, UserCog, PenTool, Sparkles, Filter, AppWindow, ChevronDown } from 'lucide-react';\r\nimport { adminApi, type RoleListDto, type PermissionListDto, type CreateRoleRequest, type UpdateRoleRequest, type RoleCategory } from '@/services/api/adminApi';\r\nimport { Slot } from '@/extensions';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nconst ALL_CATEGORIES: RoleCategory[] = ['Global', 'Admin', 'Manager', 'Contributor', 'Viewer', 'Custom'];\r\n\r\nconst CATEGORY_CONFIG: Record<RoleCategory, { icon: React.ElementType; color: string; bgColor: string; borderColor: string }> = {\r\n Global: {\r\n icon: Crown,\r\n color: 'text-purple-600 dark:text-purple-400',\r\n bgColor: 'bg-purple-50 dark:bg-purple-900/20',\r\n borderColor: 'border-purple-200 dark:border-purple-800'\r\n },\r\n Admin: {\r\n icon: Shield,\r\n color: 'text-red-600 dark:text-red-400',\r\n bgColor: 'bg-red-50 dark:bg-red-900/20',\r\n borderColor: 'border-red-200 dark:border-red-800'\r\n },\r\n Manager: {\r\n icon: UserCog,\r\n color: 'text-blue-600 dark:text-blue-400',\r\n bgColor: 'bg-blue-50 dark:bg-blue-900/20',\r\n borderColor: 'border-blue-200 dark:border-blue-800'\r\n },\r\n Contributor: {\r\n icon: PenTool,\r\n color: 'text-green-600 dark:text-green-400',\r\n bgColor: 'bg-green-50 dark:bg-green-900/20',\r\n borderColor: 'border-green-200 dark:border-green-800'\r\n },\r\n Viewer: {\r\n icon: Eye,\r\n color: 'text-gray-600 dark:text-gray-400',\r\n bgColor: 'bg-gray-50 dark:bg-gray-900/20',\r\n borderColor: 'border-gray-200 dark:border-gray-700'\r\n },\r\n Custom: {\r\n icon: Sparkles,\r\n color: 'text-orange-600 dark:text-orange-400',\r\n bgColor: 'bg-orange-50 dark:bg-orange-900/20',\r\n borderColor: 'border-orange-200 dark:border-orange-800'\r\n }\r\n};\r\n\r\nexport function RolesPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [permissions, setPermissions] = useState<PermissionListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [search, setSearch] = useState('');\r\n const [showModal, setShowModal] = useState(false);\r\n const [editingRole, setEditingRole] = useState<RoleListDto | null>(null);\r\n const [formData, setFormData] = useState<CreateRoleRequest>({\r\n name: '',\r\n description: '',\r\n permissionIds: []\r\n });\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n const [filter, setFilter] = useState<'system' | 'custom' | RoleCategory | null>(null);\r\n const [applicationFilter, setApplicationFilter] = useState<string | null>(null);\r\n const [categoryFilter, setCategoryFilter] = useState<RoleCategory | null>(null);\r\n\r\n const loadRoles = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.roles.getAll(search ? { search } : undefined);\r\n setRoles(result);\r\n } catch (err) {\r\n console.error('Failed to load roles:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search]);\r\n\r\n const loadPermissions = async () => {\r\n try {\r\n const result = await adminApi.permissions.getAll();\r\n setPermissions(result);\r\n } catch (err) {\r\n console.error('Failed to load permissions:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadRoles();\r\n loadPermissions();\r\n }, [loadRoles]);\r\n\r\n const handleSearch = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n loadRoles();\r\n };\r\n\r\n const openCreateModal = () => {\r\n setEditingRole(null);\r\n setFormData({ name: '', description: '', permissionIds: [] });\r\n setError(null);\r\n setShowModal(true);\r\n };\r\n\r\n const openEditModal = async (role: RoleListDto) => {\r\n try {\r\n const detail = await adminApi.roles.getById(role.id);\r\n setEditingRole(role);\r\n setFormData({\r\n name: detail.name,\r\n description: detail.description || '',\r\n parentRoleId: detail.parentRoleId || undefined,\r\n permissionIds: detail.permissions.map(p => p.id)\r\n });\r\n setError(null);\r\n setShowModal(true);\r\n } catch (err) {\r\n console.error('Failed to load role details:', err);\r\n }\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSaving(true);\r\n setError(null);\r\n\r\n try {\r\n if (editingRole) {\r\n const updateData: UpdateRoleRequest = {\r\n name: formData.name,\r\n description: formData.description,\r\n parentRoleId: formData.parentRoleId,\r\n permissionIds: formData.permissionIds\r\n };\r\n await adminApi.roles.update(editingRole.id, updateData);\r\n } else {\r\n await adminApi.roles.create(formData);\r\n }\r\n setShowModal(false);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n setError(message);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleDelete = async (role: RoleListDto) => {\r\n if (!confirm(t('roles.confirmDelete', { name: role.name }))) return;\r\n\r\n try {\r\n await adminApi.roles.delete(role.id);\r\n loadRoles();\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'An error occurred';\r\n alert(message);\r\n }\r\n setMenuOpen(null);\r\n };\r\n\r\n const handlePermissionToggle = (permissionId: string) => {\r\n setFormData(prev => ({\r\n ...prev,\r\n permissionIds: prev.permissionIds?.includes(permissionId)\r\n ? prev.permissionIds.filter(id => id !== permissionId)\r\n : [...(prev.permissionIds || []), permissionId]\r\n }));\r\n };\r\n\r\n const stats = useMemo(() => {\r\n const systemCount = roles.filter(r => r.isSystem).length;\r\n const customCount = roles.filter(r => !r.isSystem).length;\r\n const totalUsers = roles.reduce((sum, r) => sum + r.usersCount, 0);\r\n const categoryCount = roles.reduce((acc, r) => {\r\n acc[r.category] = (acc[r.category] || 0) + 1;\r\n return acc;\r\n }, {} as Record<string, number>);\r\n return { total: roles.length, systemCount, customCount, totalUsers, categoryCount };\r\n }, [roles]);\r\n\r\n const uniqueApplications = useMemo(() => {\r\n const appMap = new Map<string, string>();\r\n roles.forEach(r => {\r\n if (r.applicationId && r.applicationName) {\r\n appMap.set(r.applicationId, r.applicationName);\r\n }\r\n });\r\n return Array.from(appMap.entries())\r\n .map(([id, name]) => ({ id, name }))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n }, [roles]);\r\n\r\n const filteredRoles = useMemo(() => {\r\n let result = roles;\r\n // System/custom filter (from stats bar)\r\n if (filter === 'system') result = result.filter(r => r.isSystem);\r\n else if (filter === 'custom') result = result.filter(r => !r.isSystem);\r\n else if (filter) result = result.filter(r => r.category === filter);\r\n // Application filter\r\n if (applicationFilter === '__global__') result = result.filter(r => !r.applicationId);\r\n else if (applicationFilter) result = result.filter(r => r.applicationId === applicationFilter);\r\n // Category filter\r\n if (categoryFilter) result = result.filter(r => r.category === categoryFilter);\r\n return result;\r\n }, [roles, filter, applicationFilter, categoryFilter]);\r\n\r\n const hasActiveFilters = filter !== null || applicationFilter !== null || categoryFilter !== null;\r\n\r\n const clearAllFilters = () => {\r\n setFilter(null);\r\n setApplicationFilter(null);\r\n setCategoryFilter(null);\r\n };\r\n\r\n const toggleFilter = (newFilter: 'system' | 'custom' | RoleCategory) => {\r\n setFilter(prev => prev === newFilter ? null : newFilter);\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('roles.title') }\r\n ]}\r\n />\r\n\r\n {/* Header with stats */}\r\n <div className=\"flex items-start justify-between\">\r\n <div>\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{t('roles.title')}</h1>\r\n {!loading && (\r\n <span className=\"px-3 py-1 rounded-full text-sm font-medium bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n {hasActiveFilters ? `${filteredRoles.length} / ${stats.total}` : stats.total} {t('roles.totalLabel')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('roles.list')}</p>\r\n {!loading && stats.total > 0 && (\r\n <div className=\"flex items-center gap-2 mt-3 text-sm\">\r\n <button\r\n onClick={() => toggleFilter('system')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'system'\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)] ring-2 ring-[var(--warning-border)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n {stats.systemCount} {t('roles.systemRoles')}\r\n </button>\r\n <button\r\n onClick={() => toggleFilter('custom')}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 rounded-full transition-all ${\r\n filter === 'custom'\r\n ? 'bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 text-[var(--color-accent-700)] dark:text-[var(--color-accent-300)] border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] ring-2 ring-[var(--color-accent-300)] dark:ring-[var(--color-accent-700)]'\r\n : 'text-[var(--text-tertiary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n <Sparkles className=\"w-4 h-4\" />\r\n {stats.customCount} {t('roles.customRoles')}\r\n </button>\r\n <span className=\"flex items-center gap-1.5 px-2.5 py-1 text-[var(--text-tertiary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n {stats.totalUsers} {t('roles.totalUsers')}\r\n </span>\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1 px-2 py-1 rounded-full text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n title={t('roles.filters.clearAll')}\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Slot name=\"roles.header.actions\" context={{ roles, reload: loadRoles }} />\r\n <button\r\n onClick={openCreateModal}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roles.create')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Search + Filters */}\r\n <div className=\"flex flex-col gap-3\">\r\n <form onSubmit={handleSearch} className=\"flex gap-2\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={e => setSearch(e.target.value)}\r\n placeholder={t('common.search')}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.search')}\r\n </button>\r\n </form>\r\n\r\n {/* Filter bar */}\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <div className=\"flex items-center gap-1.5 text-sm text-[var(--text-tertiary)]\">\r\n <Filter className=\"w-4 h-4\" />\r\n <span>{t('roles.filters.title')}</span>\r\n </div>\r\n\r\n {/* Application filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={applicationFilter ?? ''}\r\n onChange={e => setApplicationFilter(e.target.value || null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allApplications')}</option>\r\n <option value=\"__global__\">{t('roles.filters.globalRoles')}</option>\r\n {uniqueApplications.map(app => (\r\n <option key={app.id} value={app.id}>{app.name}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Category filter */}\r\n <div className=\"relative\">\r\n <select\r\n value={categoryFilter ?? ''}\r\n onChange={e => setCategoryFilter((e.target.value || null) as RoleCategory | null)}\r\n className=\"appearance-none pl-3 pr-8 py-1.5 text-sm rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] cursor-pointer\"\r\n >\r\n <option value=\"\">{t('roles.filters.allCategories')}</option>\r\n {ALL_CATEGORIES.map(cat => (\r\n <option key={cat} value={cat}>{t(`roles.categories.${cat.toLowerCase()}`)}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n\r\n {/* Clear all filters */}\r\n {hasActiveFilters && (\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 text-sm rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.name')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden md:table-cell\">{t('roles.columns.category')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.columns.application')}</th>\r\n <th className=\"text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden xl:table-cell\">{t('roles.columns.description')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider\">{t('roles.columns.usersCount')}</th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">{t('roles.permissions')}</th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center\">\r\n <Loader2 className=\"w-6 h-6 animate-spin mx-auto text-[var(--color-accent-500)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-6 py-12 text-center text-[var(--text-secondary)]\">\r\n {hasActiveFilters ? (\r\n <div className=\"space-y-2\">\r\n <p>{t('roles.noRoles')}</p>\r\n <button\r\n onClick={clearAllFilters}\r\n className=\"text-[var(--color-accent-600)] hover:underline\"\r\n >\r\n {t('roles.filters.clearAll')}\r\n </button>\r\n </div>\r\n ) : t('roles.noRoles')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && filteredRoles.length > 0 && (\r\n filteredRoles.map(role => {\r\n const categoryConfig = CATEGORY_CONFIG[role.category] || CATEGORY_CONFIG.Custom;\r\n const CategoryIcon = categoryConfig.icon;\r\n return (\r\n <tr\r\n key={role.id}\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"hover:bg-[var(--bg-hover)] transition-colors cursor-pointer group\"\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-9 h-9 rounded-full flex items-center justify-center ${categoryConfig.bgColor} ${categoryConfig.borderColor} border`}>\r\n <CategoryIcon className={`w-4 h-4 ${categoryConfig.color}`} />\r\n </div>\r\n <div>\r\n <div className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors\">{role.name}</div>\r\n {role.isSystem && (\r\n <span className=\"text-xs text-[var(--warning-text)]\">\r\n {t('roles.system')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setCategoryFilter(prev => prev === role.category ? null : role.category); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all ${categoryConfig.bgColor} ${categoryConfig.color} ${categoryConfig.borderColor} hover:ring-2 hover:ring-offset-1 ${categoryFilter === role.category ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <CategoryIcon className=\"w-3.5 h-3.5\" />\r\n {t(`roles.categories.${role.category.toLowerCase()}`)}\r\n </button>\r\n </td>\r\n <td className=\"px-4 py-3 hidden lg:table-cell\">\r\n {role.applicationName ? (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setApplicationFilter(prev => prev === role.applicationId ? null : role.applicationId); }}\r\n className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs font-medium border transition-all bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)] hover:ring-2 hover:ring-offset-1 ${applicationFilter === role.applicationId ? 'ring-2 ring-offset-1' : ''}`}\r\n >\r\n <AppWindow className=\"w-3.5 h-3.5\" />\r\n {role.applicationName}\r\n </button>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs text-[var(--text-tertiary)]\">\r\n <Crown className=\"w-3.5 h-3.5\" />\r\n {t('roles.filters.globalRoles')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-[var(--text-secondary)] max-w-xs truncate hidden xl:table-cell\">{role.description || '-'}</td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Users className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.usersCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-center hidden lg:table-cell\">\r\n <div className=\"inline-flex items-center gap-1.5 text-[var(--text-secondary)]\">\r\n <Shield className=\"w-4 h-4\" />\r\n <span className=\"font-medium\">{role.permissionsCount}</span>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={e => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/permissions/roles/${role.id}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n title={t('users.view')}\r\n >\r\n <Eye className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {!role.isSystem && (\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === role.id ? null : role.id)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <MoreHorizontal className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n {menuOpen === role.id && (\r\n <div className=\"absolute right-0 top-full mt-1 w-48 py-1 bg-[var(--bg-secondary)] rounded-[var(--radius-menu-item)] border border-[var(--border-color)] shadow-lg z-10\">\r\n <button\r\n onClick={() => { openEditModal(role); setMenuOpen(null); }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n {role.usersCount === 0 && (\r\n <button\r\n onClick={() => handleDelete(role)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-left text-[var(--error-text)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* Modal */}\r\n {showModal && (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-modal)] w-full max-w-lg p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {editingRole ? t('roles.edit') : t('roles.create')}\r\n </h2>\r\n <button onClick={() => setShowModal(false)} className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)]\">\r\n <X className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-4 p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.name}\r\n onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roles.form.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={e => setFormData(prev => ({ ...prev, description: e.target.value }))}\r\n rows={3}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('roles.permissions')}\r\n </label>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto p-2 border border-[var(--border-color)] rounded-[var(--radius-card)]\">\r\n {permissions.map(permission => (\r\n <label key={permission.id} className=\"flex items-start gap-2 cursor-pointer p-2 hover:bg-[var(--bg-hover)] rounded-[var(--radius-button)]\">\r\n <input\r\n type=\"checkbox\"\r\n checked={formData.permissionIds?.includes(permission.id) || false}\r\n onChange={() => handlePermissionToggle(permission.id)}\r\n className=\"mt-0.5 rounded border-[var(--border-color)]\"\r\n />\r\n <div>\r\n <div className=\"text-[var(--text-primary)] font-mono text-sm\">{permission.path}</div>\r\n {permission.description && (\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{permission.description}</div>\r\n )}\r\n </div>\r\n </label>\r\n ))}\r\n {permissions.length === 0 && (\r\n <div className=\"text-center py-4 text-[var(--text-secondary)]\">\r\n {t('roles.noPermissions')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Extension form fields slot */}\r\n <Slot\r\n name=\"roles.form.fields.after\"\r\n context={{\r\n formData,\r\n onChange: (field: string, value: unknown) => {\r\n setFormData(prev => ({ ...prev, [field]: value }));\r\n },\r\n disabled: saving,\r\n isEditing: !!editingRole,\r\n role: editingRole,\r\n }}\r\n />\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowModal(false)}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] font-medium transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white font-medium transition-colors disabled:opacity-50 flex items-center gap-2\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {editingRole ? t('common.save') : t('common.create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["ALL_CATEGORIES","CATEGORY_CONFIG","Crown","Shield","UserCog","PenTool","Eye","Sparkles","RolesPage","t","useTranslation","navigate","useNavigate","roles","setRoles","useState","permissions","setPermissions","loading","setLoading","search","setSearch","showModal","setShowModal","editingRole","setEditingRole","formData","setFormData","saving","setSaving","error","setError","menuOpen","setMenuOpen","filter","setFilter","applicationFilter","setApplicationFilter","categoryFilter","setCategoryFilter","loadRoles","useCallback","result","adminApi","err","loadPermissions","useEffect","handleSearch","openCreateModal","openEditModal","role","detail","p","handleSubmit","updateData","message","handleDelete","handlePermissionToggle","permissionId","prev","id","stats","useMemo","systemCount","r","customCount","totalUsers","sum","categoryCount","acc","uniqueApplications","appMap","name","a","b","filteredRoles","hasActiveFilters","clearAllFilters","toggleFilter","newFilter","jsxs","jsx","Breadcrumb","Users","X","Slot","Plus","Search","Filter","app","ChevronDown","cat","Loader2","categoryConfig","CategoryIcon","e","AppWindow","MoreHorizontal","Edit2","Trash2","permission","field","value"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react"),Z=require("react-router-dom"),ee=require("react-i18next"),a=require("lucide-react"),d=require("./index-vXiLh35n.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-
|
|
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-DK5czlkn.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-Dm03fBBf.js.map
|