@atlashub/smartstack 3.21.0 → 3.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoleDetailPage-Blau6_4c.js","sources":["../../src/components/platform/administration/permissions/RolePermissionMatrix.tsx","../../src/pages/platform/administration/permissions/RoleDetailPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport React, { useState, useMemo, useCallback, createRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, AlertCircle, ChevronDown, ChevronRight, FolderOpen, Box, FileText, Database, Check, Star, Eye, Ban, Save, X, Plus, Edit, Trash2, UserPlus, Play, Shield } from 'lucide-react';\r\nimport { usePermissionMatrix } from '@/hooks/usePermissionMatrix';\r\nimport { useCollapsibleState } from '@/hooks/useCollapsibleState';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { hasFullAccess } from '@/utils/permissions';\r\nimport { groupByApplicationWithSections, calculatePermissionStatus, calculateModuleWithSectionsStatus, getPermissionCellBackground } from '@/utils/permissionUtils';\r\nimport { PermissionStatusIndicator } from './PermissionStatusIndicator';\r\nimport { PermissionPopover } from '../PermissionPopover';\r\nimport type { ResourceNode, PermissionStatus, ModuleWithSections } from './types';\r\n\r\ninterface RolePermissionMatrixProps {\r\n readonly roleId: string;\r\n}\r\n\r\n// Action icons and colors (same as PermissionCellPopover)\r\nconst ACTION_ICONS: Record<string, React.ReactNode> = {\r\n '*': <Shield className=\"h-3 w-3\" />,\r\n read: <Eye className=\"h-3 w-3\" />,\r\n create: <Plus className=\"h-3 w-3\" />,\r\n update: <Edit className=\"h-3 w-3\" />,\r\n delete: <Trash2 className=\"h-3 w-3\" />,\r\n assign: <UserPlus className=\"h-3 w-3\" />,\r\n execute: <Play className=\"h-3 w-3\" />,\r\n};\r\n\r\nconst ACTION_COLORS: Record<string, string> = {\r\n '*': 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n read: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n create: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n update: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n delete: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n assign: 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n execute: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n};\r\n\r\n// Pure function to apply application/module filter\r\nfunction applyApplicationModuleFilterHelper(\r\n grouped: ReturnType<typeof groupByApplicationWithSections>,\r\n applicationFilter: string,\r\n moduleFilter: string\r\n) {\r\n return grouped\r\n .filter(app => applicationFilter === 'all' || app.application === applicationFilter)\r\n .map(app => ({\r\n ...app,\r\n modules: app.modules.filter(m => moduleFilter === 'all' || m.module.moduleLabel === moduleFilter)\r\n }))\r\n .filter(app => app.modules.length > 0);\r\n}\r\n\r\n// Pure function to apply status filter\r\nfunction applyStatusFilterHelper(\r\n grouped: ReturnType<typeof groupByApplicationWithSections>,\r\n statusFilters: Set<PermissionStatus>,\r\n getModuleStatus: (m: ModuleWithSections) => { status: PermissionStatus; grantedCount: number; totalCount: number }\r\n) {\r\n return grouped.map(app => ({\r\n ...app,\r\n modules: app.modules.filter(m => {\r\n const { status } = getModuleStatus(m);\r\n return statusFilters.has(status);\r\n })\r\n })).filter(app => app.modules.length > 0);\r\n}\r\n\r\n// Sub-component for rendering section and resource rows\r\ninterface SectionResourceRowsProps {\r\n readonly section: ResourceNode;\r\n readonly resources: ResourceNode[];\r\n readonly moduleIndex: number;\r\n readonly sectionIndex: number;\r\n readonly collapsedSections: Set<string>;\r\n readonly renderResourceRow: (resource: ResourceNode, rowIndex: number, level: 'module' | 'section' | 'resource', hasChildren: boolean, isCollapsed: boolean) => React.ReactNode;\r\n}\r\n\r\nfunction SectionResourceRows({\r\n section,\r\n resources,\r\n moduleIndex,\r\n sectionIndex,\r\n collapsedSections,\r\n renderResourceRow,\r\n}: SectionResourceRowsProps) {\r\n const hasResources = resources.length > 0;\r\n const isSectionCollapsed = collapsedSections.has(section.id);\r\n\r\n return (\r\n <React.Fragment key={section.id}>\r\n {/* Section Row */}\r\n {renderResourceRow(section, moduleIndex + sectionIndex + 1, 'section', hasResources, isSectionCollapsed)}\r\n\r\n {/* Resource Rows (if section has resources and is not collapsed) */}\r\n {hasResources && !isSectionCollapsed && resources.map((resource, resourceIndex) =>\r\n renderResourceRow(resource, moduleIndex + sectionIndex + resourceIndex + 2, 'resource', false, false)\r\n )}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport function RolePermissionMatrix({ roleId }: RolePermissionMatrixProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { user } = useAuth();\r\n\r\n const { collapsedApps, toggleApp } = useCollapsibleState();\r\n const [collapsedModules, setCollapsedModules] = useState<Set<string>>(new Set());\r\n const [collapsedSections, setCollapsedSections] = useState<Set<string>>(new Set());\r\n const [statusFilters, setStatusFilters] = useState<Set<PermissionStatus>>(new Set());\r\n const [openPopover, setOpenPopover] = useState<string | null>(null);\r\n\r\n // Filter states\r\n const [applicationFilter, setApplicationFilter] = useState<string>('all');\r\n const [moduleFilter, setModuleFilter] = useState<string>('all');\r\n\r\n // Super Admin can edit system roles\r\n const canEditSystemRoles = useMemo(() => {\r\n if (!user) return false;\r\n return hasFullAccess(user.permissions);\r\n }, [user]);\r\n\r\n const {\r\n loading,\r\n error,\r\n roles,\r\n filteredResources,\r\n hasChanges,\r\n saving,\r\n saveSuccess,\r\n saveError,\r\n togglePermission,\r\n saveChanges,\r\n resetChanges,\r\n getPermissionInheritance,\r\n } = usePermissionMatrix({ canEditSystemRoles });\r\n\r\n // Find the specific role\r\n const role = useMemo(() => {\r\n return roles.find(r => r.id === roleId);\r\n }, [roles, roleId]);\r\n\r\n // Check if role is editable\r\n const isRoleEditable = useMemo(() => {\r\n if (!role) return false;\r\n if (role.isSystem && !canEditSystemRoles) return false;\r\n return true;\r\n }, [role, canEditSystemRoles]);\r\n\r\n const toggleStatusFilter = (status: PermissionStatus) => {\r\n setStatusFilters(prev => {\r\n const next = new Set(prev);\r\n if (next.has(status)) {\r\n next.delete(status);\r\n } else {\r\n next.add(status);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const toggleModule = (moduleId: string) => {\r\n setCollapsedModules(prev => {\r\n const next = new Set(prev);\r\n if (next.has(moduleId)) {\r\n next.delete(moduleId);\r\n } else {\r\n next.add(moduleId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const toggleSection = (sectionId: string) => {\r\n setCollapsedSections(prev => {\r\n const next = new Set(prev);\r\n if (next.has(sectionId)) {\r\n next.delete(sectionId);\r\n } else {\r\n next.add(sectionId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n // Build filter options from resources\r\n const filterOptions = useMemo(() => {\r\n const applications: { app: string; label: string }[] = [];\r\n const modules: { app: string; module: string; label: string }[] = [];\r\n\r\n filteredResources.forEach(resource => {\r\n if (resource.level === 'module') {\r\n const appKey = resource.applicationLabel;\r\n if (!applications.find(a => a.app === appKey)) {\r\n applications.push({\r\n app: resource.applicationLabel,\r\n label: resource.applicationLabel\r\n });\r\n }\r\n\r\n modules.push({\r\n app: resource.applicationLabel,\r\n module: resource.moduleLabel,\r\n label: resource.moduleLabel\r\n });\r\n }\r\n });\r\n\r\n return {\r\n applications: applications.sort((a, b) => a.label.localeCompare(b.label)),\r\n modules: modules.sort((a, b) => a.label.localeCompare(b.label))\r\n };\r\n }, [filteredResources]);\r\n\r\n // Handle permission toggle\r\n const handleTogglePermission = useCallback((permissionId: string) => {\r\n if (!role || !isRoleEditable) return;\r\n togglePermission(role.id, permissionId);\r\n }, [role, isRoleEditable, togglePermission]);\r\n\r\n // Check if a permission is granted\r\n const isPermissionGrantedFn = useCallback((permissionId: string): boolean => {\r\n if (!role) return false;\r\n const info = getPermissionInheritance(role.id, permissionId);\r\n return info.isDirect || info.isInherited;\r\n }, [role, getPermissionInheritance]);\r\n\r\n // Calculate permission status for this role on a module (including sections)\r\n const getModuleStatus = useCallback((moduleWithSections: ModuleWithSections): { status: PermissionStatus; grantedCount: number; totalCount: number } => {\r\n return calculateModuleWithSectionsStatus(\r\n moduleWithSections.module,\r\n moduleWithSections.sections,\r\n isPermissionGrantedFn\r\n );\r\n }, [isPermissionGrantedFn]);\r\n\r\n // Calculate permission status for a single resource\r\n const getResourceStatus = useCallback((resource: ResourceNode): { status: PermissionStatus; grantedCount: number } => {\r\n return calculatePermissionStatus(resource, isPermissionGrantedFn);\r\n }, [isPermissionGrantedFn]);\r\n\r\n // Get granted permissions for a resource\r\n const getGrantedPermissions = useCallback((resource: ResourceNode): string[] => {\r\n if (!role) return [];\r\n\r\n return resource.permissions\r\n .filter(p => {\r\n const info = getPermissionInheritance(role.id, p.id);\r\n return info.isDirect || info.isInherited;\r\n })\r\n .map(p => p.action);\r\n }, [role, getPermissionInheritance]);\r\n\r\n\r\n const applyApplicationModuleFilter = useCallback((grouped: ReturnType<typeof groupByApplicationWithSections>) => {\r\n return applyApplicationModuleFilterHelper(grouped, applicationFilter, moduleFilter);\r\n }, [applicationFilter, moduleFilter]);\r\n\r\n const applyStatusFilter = useCallback((grouped: ReturnType<typeof groupByApplicationWithSections>) => {\r\n if (statusFilters.size === 0) return grouped;\r\n return applyStatusFilterHelper(grouped, statusFilters, getModuleStatus);\r\n }, [statusFilters, getModuleStatus]);\r\n\r\n const groupedResources = useMemo(() => {\r\n let grouped = groupByApplicationWithSections(filteredResources);\r\n grouped = applyApplicationModuleFilter(grouped);\r\n grouped = applyStatusFilter(grouped);\r\n return grouped;\r\n }, [filteredResources, applyApplicationModuleFilter, applyStatusFilter]);\r\n\r\n // Get total module count for stats\r\n const totalModuleCount = useMemo(() => {\r\n return groupedResources.reduce((sum, app) =>\r\n sum + app.modules.length, 0);\r\n }, [groupedResources]);\r\n\r\n const handleToggleCollapse = useCallback((resourceId: string, level: 'module' | 'section' | 'resource') => {\r\n if (level === 'module') {\r\n toggleModule(resourceId);\r\n } else if (level === 'section') {\r\n toggleSection(resourceId);\r\n }\r\n }, [toggleModule, toggleSection]);\r\n\r\n const handleCellClick = (resourceId: string) => {\r\n if (openPopover === resourceId) {\r\n setOpenPopover(null);\r\n } else {\r\n setOpenPopover(resourceId);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <div className=\"text-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-accent-500)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('userPermissions.loading')}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertCircle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!role) {\r\n return (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.notFound')}\r\n </div>\r\n );\r\n }\r\n\r\n const getRoleResourceIcon = (level: 'module' | 'section' | 'resource') => {\r\n if (level === 'resource') return <Database className=\"h-3.5 w-3.5 text-[var(--text-muted)]\" />;\r\n if (level === 'section') return <FileText className=\"h-3.5 w-3.5 text-[var(--text-muted)]\" />;\r\n return <Box className=\"h-3.5 w-3.5 text-[var(--text-secondary)]\" />;\r\n };\r\n\r\n const getRoleResourceLabelClass = (level: 'module' | 'section' | 'resource'): string => {\r\n if (level === 'resource') return 'text-[var(--text-muted)] italic';\r\n if (level === 'section') return 'text-[var(--text-secondary)]';\r\n return 'font-medium text-[var(--text-primary)]';\r\n };\r\n\r\n const getRolePaddingClass = (level: 'module' | 'section' | 'resource'): string => {\r\n if (level === 'resource') return 'pl-28';\r\n if (level === 'section') return 'pl-22';\r\n return 'pl-16';\r\n };\r\n\r\n const renderToggleButton = (hasChildren: boolean, resourceId: string, level: 'module' | 'section' | 'resource', isCollapsed: boolean) => {\r\n if (!hasChildren) return null;\r\n return (\r\n <button\r\n onClick={() => handleToggleCollapse(resourceId, level)}\r\n className=\"p-0.5 hover:bg-[var(--bg-hover)] rounded\"\r\n >\r\n {isCollapsed ? (\r\n <ChevronRight className=\"h-3 w-3 text-[var(--text-muted)]\" />\r\n ) : (\r\n <ChevronDown className=\"h-3 w-3 text-[var(--text-muted)]\" />\r\n )}\r\n </button>\r\n );\r\n };\r\n\r\n const renderPermissionBadges = (grantedPermissions: string[]) => {\r\n if (grantedPermissions.length === 0) {\r\n return (\r\n <span className=\"text-xs text-[var(--text-muted)] italic\">\r\n {t('assignments.noPermissions')}\r\n </span>\r\n );\r\n }\r\n return grantedPermissions.map((action) => {\r\n const actionColor = ACTION_COLORS[action] || 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] border-[var(--border-color)]';\r\n const icon = ACTION_ICONS[action] || <Eye className=\"h-3 w-3\" />;\r\n return (\r\n <div\r\n key={action}\r\n className={`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-[var(--radius-badge)] border text-xs font-medium ${actionColor}`}\r\n title={t(`assignments.actions.${action === '*' ? 'all' : action}.description`)}\r\n >\r\n {icon}\r\n <span className=\"capitalize\">\r\n {t(`assignments.actions.${action === '*' ? 'all' : action}.label`)}\r\n </span>\r\n </div>\r\n );\r\n });\r\n };\r\n\r\n const renderResourceRow = (\r\n resource: ResourceNode,\r\n rowIndex: number,\r\n level: 'module' | 'section' | 'resource',\r\n hasChildren: boolean = false,\r\n isCollapsed: boolean = false\r\n ) => {\r\n const { status, grantedCount } = getResourceStatus(resource);\r\n const isPopoverOpen = openPopover === resource.id;\r\n const buttonRef = createRef<HTMLButtonElement>();\r\n const cellBg = getPermissionCellBackground(status);\r\n const grantedPermissions = getGrantedPermissions(resource);\r\n const paddingLeft = getRolePaddingClass(level);\r\n const rowBgClass = rowIndex % 2 === 0 ? 'item-light' : 'item-medium';\r\n\r\n return (\r\n <tr\r\n key={resource.id}\r\n className={`hover:bg-[var(--bg-hover)] ${rowBgClass}`}\r\n >\r\n <td\r\n className={`sticky left-0 z-10 ${rowBgClass} px-3 py-2 ${paddingLeft}`}\r\n style={{ width: '280px', minWidth: '280px', maxWidth: '280px' }}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {renderToggleButton(hasChildren, resource.id, level, isCollapsed)}\r\n {getRoleResourceIcon(level)}\r\n <span className={`text-sm ${getRoleResourceLabelClass(level)}`}>\r\n {resource.moduleLabel}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">\r\n ({resource.permissions.length})\r\n </span>\r\n </div>\r\n </td>\r\n\r\n <td\r\n className={`px-0 py-1 text-center relative ${cellBg}`}\r\n style={{ width: '60px', minWidth: '60px', maxWidth: '60px' }}\r\n >\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n onClick={() => isRoleEditable && handleCellClick(resource.id)}\r\n disabled={!isRoleEditable}\r\n className={`w-full h-full min-h-[36px] flex items-center justify-center rounded transition-colors ${\r\n !isRoleEditable\r\n ? 'cursor-not-allowed opacity-50'\r\n : 'hover:opacity-80'\r\n } ${\r\n isPopoverOpen ? 'ring-2 ring-[var(--color-accent-500)]' : ''\r\n }`}\r\n title={\r\n !isRoleEditable\r\n ? `${role.name} - ${t('assignments.systemRoleReadOnly')}`\r\n : `${role.name} - ${resource.moduleLabel}: ${grantedCount}/${resource.permissions.length}`\r\n }\r\n >\r\n <PermissionStatusIndicator\r\n status={status}\r\n grantedCount={grantedCount}\r\n totalCount={resource.permissions.length}\r\n />\r\n </button>\r\n {isPopoverOpen && isRoleEditable && (\r\n <PermissionPopover\r\n mode=\"editable\"\r\n role={role}\r\n resource={resource}\r\n onTogglePermission={handleTogglePermission}\r\n onClose={() => setOpenPopover(null)}\r\n getPermissionInheritance={(_, permId) => getPermissionInheritance(role.id, permId)}\r\n />\r\n )}\r\n </td>\r\n\r\n <td className=\"px-3 py-2\">\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {renderPermissionBadges(grantedPermissions)}\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Fixed height container for save banner to prevent layout shift */}\r\n <div className=\"min-h-[52px]\">\r\n {saveSuccess && (\r\n <div className=\"flex items-center justify-between p-3 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Check className=\"h-4 w-4 text-[var(--success-text)]\" />\r\n <p className=\"text-sm text-[var(--success-text)] font-medium\">\r\n {t('common.savedSuccessfully', 'Sauvegardé avec succès !')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n {!saveSuccess && saving && (\r\n <div className=\"flex items-center justify-between p-3 rounded-[var(--radius-card)] bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Loader2 className=\"h-4 w-4 animate-spin text-[var(--info-text)]\" />\r\n <p className=\"text-sm text-[var(--info-text)] font-medium\">\r\n {t('common.saving', 'Sauvegarde en cours...')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n {!saveSuccess && !saving && hasChanges && (\r\n <div className=\"flex items-center justify-between p-3 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)]\">\r\n <p className=\"text-sm text-[var(--warning-text)]\">\r\n {t('assignments.unsavedChanges', 'You have unsaved changes')}\r\n </p>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={resetChanges}\r\n disabled={saving}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-[var(--radius-button)] bg-[var(--bg-secondary)] border border-[var(--border-color)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] disabled:opacity-50\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={saveChanges}\r\n disabled={saving}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n {!saveSuccess && !saving && !hasChanges && (\r\n <div className=\"h-[52px]\" />\r\n )}\r\n </div>\r\n\r\n {/* Save error */}\r\n {saveError && (\r\n <div className=\"p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertCircle className=\"h-4 w-4 text-[var(--error-text)]\" />\r\n <p className=\"text-sm text-[var(--error-text)]\">{saveError}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n\r\n {/* Filter Dropdowns */}\r\n <div className=\"flex flex-wrap items-center gap-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <label className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('userPermissions.filters.application')}:\r\n </label>\r\n <select\r\n value={applicationFilter}\r\n onChange={(e) => {\r\n setApplicationFilter(e.target.value);\r\n setModuleFilter('all');\r\n }}\r\n className=\"px-3 py-1.5 text-sm bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-[var(--radius-input)] text-[var(--text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"all\">{t('userPermissions.filters.allApplications')}</option>\r\n {filterOptions.applications\r\n .map(app => (\r\n <option key={app.app} value={app.app}>{app.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <label className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('userPermissions.filters.module')}:\r\n </label>\r\n <select\r\n value={moduleFilter}\r\n onChange={(e) => setModuleFilter(e.target.value)}\r\n className=\"px-3 py-1.5 text-sm bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-[var(--radius-input)] text-[var(--text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"all\">{t('userPermissions.filters.allModules')}</option>\r\n {filterOptions.modules\r\n .filter(mod =>\r\n (applicationFilter === 'all' || mod.app === applicationFilter)\r\n )\r\n .map(mod => (\r\n <option key={`${mod.app}:${mod.module}`} value={mod.module}>{mod.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* Status Filter Buttons - Using CSS variables for colors */}\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('userPermissions.filterByStatus')}:\r\n </span>\r\n <div className=\"flex flex-wrap gap-2\">\r\n <button\r\n onClick={() => toggleStatusFilter('all')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('all')\r\n ? 'bg-[var(--success-bg)] border-[var(--success-border)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--success-border)]'\r\n }`}\r\n >\r\n <Check className={`h-3.5 w-3.5 ${statusFilters.has('all') ? '' : 'text-[var(--success-dot)]'}`} />\r\n {t('assignments.complete')}\r\n </button>\r\n <button\r\n onClick={() => toggleStatusFilter('some')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('some')\r\n ? 'bg-[var(--warning-bg)] border-[var(--warning-border)] text-[var(--warning-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--warning-border)]'\r\n }`}\r\n >\r\n <Star className={`h-3.5 w-3.5 ${statusFilters.has('some') ? '' : 'text-[var(--warning-dot)]'}`} />\r\n {t('assignments.partial')}\r\n </button>\r\n <button\r\n onClick={() => toggleStatusFilter('read-only')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('read-only')\r\n ? 'bg-[var(--info-bg)] border-[var(--info-border)] text-[var(--info-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--info-border)]'\r\n }`}\r\n >\r\n <Eye className={`h-3.5 w-3.5 ${statusFilters.has('read-only') ? '' : 'text-[var(--info-dot)]'}`} />\r\n {t('assignments.readOnly')}\r\n </button>\r\n <button\r\n onClick={() => toggleStatusFilter('none')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('none')\r\n ? 'bg-[var(--error-bg)] border-[var(--error-border)] text-[var(--error-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--error-border)]'\r\n }`}\r\n >\r\n <Ban className={`h-3.5 w-3.5 ${statusFilters.has('none') ? '' : 'text-[var(--text-muted)]'}`} />\r\n {t('assignments.none')}\r\n </button>\r\n </div>\r\n {statusFilters.size > 0 && (\r\n <button\r\n onClick={() => setStatusFilters(new Set())}\r\n className=\"text-xs text-[var(--color-accent-500)] hover:text-[var(--color-accent-600)] underline\"\r\n >\r\n {t('assignments.clearFilters')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Stats */}\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"px-2.5 py-1 text-xs font-semibold rounded-full bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {totalModuleCount} {t('assignments.modules')}\r\n </span>\r\n </div>\r\n\r\n {/* Permission Matrix Table - Same style as PermissionMatrixTable */}\r\n <div className=\"overflow-x-auto overflow-y-visible\">\r\n <table className=\"border-collapse\" style={{ width: 'auto' }}>\r\n <thead className=\"item-medium border-b border-[var(--item-color-border)]\">\r\n <tr>\r\n <th\r\n scope=\"col\"\r\n className=\"sticky left-0 z-20 item-medium px-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\"\r\n style={{ width: '280px', minWidth: '280px', maxWidth: '280px', height: '48px', verticalAlign: 'middle' }}\r\n >\r\n {t('assignments.resource')}\r\n </th>\r\n <th\r\n scope=\"col\"\r\n className=\"px-2 text-center text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\"\r\n style={{ width: '60px', minWidth: '60px', maxWidth: '60px', height: '48px', verticalAlign: 'middle' }}\r\n >\r\n {t('userPermissions.status')}\r\n </th>\r\n <th\r\n scope=\"col\"\r\n className=\"px-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\"\r\n style={{ height: '48px', verticalAlign: 'middle' }}\r\n >\r\n {t('assignments.permissions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--item-color-border)]\">\r\n {groupedResources.map((appGroup) => {\r\n const appKey = appGroup.application;\r\n const isAppCollapsed = collapsedApps.has(appKey);\r\n\r\n return (\r\n <React.Fragment key={appKey}>\r\n {/* Application Header Row */}\r\n <tr className=\"bg-[var(--bg-tertiary)]\">\r\n <td\r\n className=\"sticky left-0 z-10 px-3 py-2 bg-[var(--bg-tertiary)]\"\r\n style={{ width: '280px', minWidth: '280px', maxWidth: '280px' }}\r\n >\r\n <button\r\n onClick={() => toggleApp(appKey)}\r\n className=\"flex items-center gap-3 w-full text-left hover:opacity-80\"\r\n >\r\n {isAppCollapsed ? (\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <ChevronDown className=\"h-4 w-4 text-[var(--text-secondary)]\" />\r\n )}\r\n <FolderOpen className=\"h-4 w-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-semibold text-[var(--text-primary)]\">\r\n {appGroup.application}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-muted)] ml-auto\">\r\n {appGroup.modules.length} module{appGroup.modules.length > 1 ? 's' : ''}\r\n </span>\r\n </button>\r\n </td>\r\n <td className=\"px-0 py-2\" />\r\n <td className=\"px-0 py-2\" />\r\n </tr>\r\n\r\n {/* Module, Section and Resource Rows */}\r\n {!isAppCollapsed && appGroup.modules.map((moduleWithSections, moduleIndex) => {\r\n const { module, sections } = moduleWithSections;\r\n const hasSections = sections.length > 0;\r\n const isModuleCollapsed = collapsedModules.has(module.id);\r\n\r\n return (\r\n <React.Fragment key={module.id}>\r\n {/* Module Row */}\r\n {renderResourceRow(module, moduleIndex, 'module', hasSections, isModuleCollapsed)}\r\n\r\n {/* Section and Resource Rows (if module has sections and is not collapsed) */}\r\n {hasSections && !isModuleCollapsed && sections.map((sectionWithResources, sectionIndex) => {\r\n const { section, resources } = sectionWithResources;\r\n\r\n return (\r\n <SectionResourceRows\r\n key={section.id}\r\n section={section}\r\n resources={resources}\r\n moduleIndex={moduleIndex}\r\n sectionIndex={sectionIndex}\r\n collapsedSections={collapsedSections}\r\n renderResourceRow={renderResourceRow}\r\n />\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {totalModuleCount === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('assignments.noResources')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, Link } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n ArrowLeft,\r\n Shield,\r\n Users,\r\n Settings,\r\n Loader2,\r\n Save,\r\n Lock,\r\n AlertTriangle,\r\n CheckCircle,\r\n Languages,\r\n Plus,\r\n Trash2,\r\n Edit2,\r\n X,\r\n UsersRound,\r\n Search\r\n} from 'lucide-react';\r\nimport {\r\n adminApi,\r\n type RoleDetailDto,\r\n type RoleListDto,\r\n type UpdateRoleRequest,\r\n type RoleTranslationDto,\r\n type UpdateRoleTranslationRequest,\r\n type RoleCategory,\r\n type UserListDto\r\n} from '@/services/api/adminApi';\r\nimport { groupsApi, type GroupListDto } from '@/services/api/groupsApi';\r\nimport { RolePermissionMatrix } from '@/components/platform/administration/permissions/RolePermissionMatrix';\r\n\r\ntype TabId = 'info' | 'permissions' | 'users' | 'groups' | 'translations';\r\n\r\nconst SUPPORTED_LANGUAGES = [\r\n { code: 'fr', label: 'Français' },\r\n { code: 'en', label: 'English' },\r\n { code: 'it', label: 'Italiano' },\r\n { code: 'de', label: 'Deutsch' }\r\n];\r\n\r\nexport function RoleDetailPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { id: roleId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [role, setRole] = useState<RoleDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [activeTab, setActiveTab] = useState<TabId>('info');\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const [formData, setFormData] = useState({\r\n name: '',\r\n shortName: '',\r\n category: 'Custom' as RoleCategory,\r\n description: '',\r\n parentRoleId: null as string | null\r\n });\r\n const [availableRoles, setAvailableRoles] = useState<RoleListDto[]>([]);\r\n\r\n const ROLE_CATEGORIES: RoleCategory[] = ['Global', 'Admin', 'Manager', 'Contributor', 'Viewer', 'Custom'];\r\n\r\n // Translation state\r\n const [translations, setTranslations] = useState<RoleTranslationDto[]>([]);\r\n const [loadingTranslations, setLoadingTranslations] = useState(false);\r\n const [editingTranslation, setEditingTranslation] = useState<string | null>(null);\r\n const [translationForm, setTranslationForm] = useState<UpdateRoleTranslationRequest>({\r\n name: '',\r\n shortName: '',\r\n description: ''\r\n });\r\n const [savingTranslation, setSavingTranslation] = useState(false);\r\n const [showAddTranslation, setShowAddTranslation] = useState(false);\r\n const [newTranslationLang, setNewTranslationLang] = useState('');\r\n\r\n // User assignment state\r\n const [addingUser, setAddingUser] = useState(false);\r\n const [availableUsers, setAvailableUsers] = useState<UserListDto[]>([]);\r\n const [loadingUsers, setLoadingUsers] = useState(false);\r\n const [userSearchTerm, setUserSearchTerm] = useState('');\r\n const [selectedUserId, setSelectedUserId] = useState<string | null>(null);\r\n const [assigningUser, setAssigningUser] = useState(false);\r\n const [removingUserId, setRemovingUserId] = useState<string | null>(null);\r\n\r\n // Group assignment state\r\n const [addingGroup, setAddingGroup] = useState(false);\r\n const [availableGroups, setAvailableGroups] = useState<GroupListDto[]>([]);\r\n const [loadingGroups, setLoadingGroups] = useState(false);\r\n const [groupSearchTerm, setGroupSearchTerm] = useState('');\r\n const [selectedGroupId, setSelectedGroupId] = useState<string | null>(null);\r\n const [assigningGroup, setAssigningGroup] = useState(false);\r\n const [removingGroupId, setRemovingGroupId] = useState<string | null>(null);\r\n\r\n const loadRole = useCallback(async () => {\r\n if (!roleId) return;\r\n try {\r\n setLoading(true);\r\n const [roleData, rolesData] = await Promise.all([\r\n adminApi.roles.getById(roleId),\r\n adminApi.roles.getAll()\r\n ]);\r\n setRole(roleData);\r\n // Filter out current role from available parent roles\r\n setAvailableRoles(rolesData.filter(r => r.id !== roleId));\r\n setFormData({\r\n name: roleData.name,\r\n shortName: roleData.shortName,\r\n category: roleData.category,\r\n description: roleData.description || '',\r\n parentRoleId: roleData.parentRoleId\r\n });\r\n } catch (err) {\r\n console.error('Failed to load role:', err);\r\n setError(t('roleDetail.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [roleId, t]);\r\n\r\n useEffect(() => {\r\n loadRole();\r\n }, [loadRole]);\r\n\r\n const handleSaveInfo = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!roleId || !role) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updateData: UpdateRoleRequest = {\r\n name: formData.name,\r\n shortName: formData.shortName,\r\n category: formData.category,\r\n description: formData.description || undefined,\r\n parentRoleId: formData.parentRoleId || undefined\r\n };\r\n await adminApi.roles.update(roleId, updateData);\r\n setSuccess(t('roleDetail.success.saved'));\r\n loadRole();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n // Translation functions\r\n const loadTranslations = useCallback(async () => {\r\n if (!roleId) return;\r\n setLoadingTranslations(true);\r\n try {\r\n const data = await adminApi.roles.getTranslations(roleId);\r\n setTranslations(data);\r\n } catch (err) {\r\n console.error('Failed to load translations:', err);\r\n } finally {\r\n setLoadingTranslations(false);\r\n }\r\n }, [roleId]);\r\n\r\n useEffect(() => {\r\n if (activeTab === 'translations' && translations.length === 0) {\r\n loadTranslations();\r\n }\r\n }, [activeTab, translations.length, loadTranslations]);\r\n\r\n const startEditTranslation = (trans: RoleTranslationDto) => {\r\n setEditingTranslation(trans.languageCode);\r\n setTranslationForm({\r\n name: trans.name,\r\n shortName: trans.shortName,\r\n description: trans.description || ''\r\n });\r\n };\r\n\r\n const cancelEditTranslation = () => {\r\n setEditingTranslation(null);\r\n setShowAddTranslation(false);\r\n setTranslationForm({ name: '', shortName: '', description: '' });\r\n setNewTranslationLang('');\r\n };\r\n\r\n const handleSaveTranslation = async (languageCode: string) => {\r\n if (!roleId) return;\r\n setSavingTranslation(true);\r\n setError(null);\r\n try {\r\n await adminApi.roles.upsertTranslation(roleId, languageCode, translationForm);\r\n setSuccess(t('roleDetail.translations.saved'));\r\n setEditingTranslation(null);\r\n setShowAddTranslation(false);\r\n setNewTranslationLang('');\r\n loadTranslations();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.saveFailed'));\r\n } finally {\r\n setSavingTranslation(false);\r\n }\r\n };\r\n\r\n const handleDeleteTranslation = async (languageCode: string) => {\r\n if (!roleId) return;\r\n if (!confirm(t('roleDetail.translations.confirmDelete'))) return;\r\n try {\r\n await adminApi.roles.deleteTranslation(roleId, languageCode);\r\n setSuccess(t('roleDetail.translations.deleted'));\r\n loadTranslations();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.saveFailed'));\r\n }\r\n };\r\n\r\n const availableLanguages = SUPPORTED_LANGUAGES.filter(\r\n lang => !translations.some(t => t.languageCode === lang.code)\r\n );\r\n\r\n // User assignment functions\r\n const openAddUser = async () => {\r\n setAddingUser(true);\r\n setSelectedUserId(null);\r\n setUserSearchTerm('');\r\n setLoadingUsers(true);\r\n try {\r\n const data = await adminApi.users.getAll({ globalScope: true });\r\n setAvailableUsers(data.items);\r\n } catch (err) {\r\n console.error('Failed to load users:', err);\r\n } finally {\r\n setLoadingUsers(false);\r\n }\r\n };\r\n\r\n const handleAssignUser = async () => {\r\n if (!roleId || !selectedUserId) return;\r\n setAssigningUser(true);\r\n try {\r\n await adminApi.roles.assignUser(roleId, selectedUserId);\r\n setAddingUser(false);\r\n setSelectedUserId(null);\r\n setSuccess(t('roleDetail.users.assigned'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.assignFailed'));\r\n } finally {\r\n setAssigningUser(false);\r\n }\r\n };\r\n\r\n const handleRemoveUser = async (userId: string) => {\r\n if (!roleId) return;\r\n if (!confirm(t('roleDetail.users.confirmRemove'))) return;\r\n setRemovingUserId(userId);\r\n try {\r\n await adminApi.roles.removeUser(roleId, userId);\r\n setSuccess(t('roleDetail.users.removed'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.removeFailed'));\r\n } finally {\r\n setRemovingUserId(null);\r\n }\r\n };\r\n\r\n // Group assignment functions\r\n const openAddGroup = async () => {\r\n setAddingGroup(true);\r\n setSelectedGroupId(null);\r\n setGroupSearchTerm('');\r\n setLoadingGroups(true);\r\n try {\r\n const data = await groupsApi.getAll();\r\n setAvailableGroups(data);\r\n } catch (err) {\r\n console.error('Failed to load groups:', err);\r\n } finally {\r\n setLoadingGroups(false);\r\n }\r\n };\r\n\r\n const handleAssignGroup = async () => {\r\n if (!roleId || !selectedGroupId) return;\r\n setAssigningGroup(true);\r\n try {\r\n await adminApi.roles.assignGroup(roleId, selectedGroupId);\r\n setAddingGroup(false);\r\n setSelectedGroupId(null);\r\n setSuccess(t('roleDetail.groups.assigned'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.assignFailed'));\r\n } finally {\r\n setAssigningGroup(false);\r\n }\r\n };\r\n\r\n const handleRemoveGroup = async (groupId: string) => {\r\n if (!roleId) return;\r\n if (!confirm(t('roleDetail.groups.confirmRemove'))) return;\r\n setRemovingGroupId(groupId);\r\n try {\r\n await adminApi.roles.removeGroup(roleId, groupId);\r\n setSuccess(t('roleDetail.groups.removed'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.removeFailed'));\r\n } finally {\r\n setRemovingGroupId(null);\r\n }\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('roleDetail.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'permissions', label: t('roleDetail.tabs.permissions'), icon: <Shield className=\"w-4 h-4\" /> },\r\n { id: 'users', label: t('roleDetail.tabs.users'), icon: <Users className=\"w-4 h-4\" /> },\r\n { id: 'groups', label: t('roleDetail.tabs.groups'), icon: <UsersRound className=\"w-4 h-4\" /> },\r\n { id: 'translations', label: t('roleDetail.tabs.translations'), icon: <Languages className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!role) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('roleDetail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/permissions/roles')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('roleDetail.backToList')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('roles.title', 'Roles'), href: '/administration/permissions/roles' },\r\n { label: role?.name || 'Detail' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/permissions/roles')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">{role.name}</h1>\r\n {role.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('roles.system')}\r\n </span>\r\n )}\r\n </div>\r\n {role.description && (\r\n <p className=\"text-sm sm:text-base text-[var(--text-secondary)] mt-1\">{role.description}</p>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-4 text-sm text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-4 h-4\" />\r\n <span>{role.users.length} {t('roleDetail.usersCount')}</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <UsersRound className=\"w-4 h-4\" />\r\n <span>{role.groups?.length || 0} {t('roleDetail.groupsCount')}</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Shield className=\"w-4 h-4\" />\r\n <span>{role.permissions.length} {t('roles.permissions')}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <form onSubmit={handleSaveInfo} className=\"space-y-6 max-w-2xl\">\r\n {/* ID (read-only) */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.id')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-secondary)] font-mono text-sm\">\r\n {role.id}\r\n </div>\r\n </div>\r\n\r\n {/* Name */}\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-primary)] 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 {/* Short Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.shortName')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.shortName}\r\n onChange={e => setFormData(prev => ({ ...prev, shortName: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\r\n {t('roleDetail.info.shortNameHelp')}\r\n </p>\r\n </div>\r\n\r\n {/* Category */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.category')} *\r\n </label>\r\n <select\r\n value={formData.category}\r\n onChange={e => setFormData(prev => ({ ...prev, category: e.target.value as RoleCategory }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n {ROLE_CATEGORIES.map(cat => (\r\n <option key={cat} value={cat}>\r\n {t(`roleDetail.categories.${cat.toLowerCase()}`)}\r\n </option>\r\n ))}\r\n </select>\r\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\r\n {t('roleDetail.info.categoryHelp')}\r\n </p>\r\n </div>\r\n\r\n {/* Parent Role */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.parentRole')}\r\n </label>\r\n <select\r\n value={formData.parentRoleId || ''}\r\n onChange={e => setFormData(prev => ({ ...prev, parentRoleId: e.target.value || null }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"\">{t('roleDetail.info.noParent')}</option>\r\n {availableRoles.map(r => (\r\n <option key={r.id} value={r.id}>\r\n {r.name} ({t(`roleDetail.categories.${r.category.toLowerCase()}`)})\r\n </option>\r\n ))}\r\n </select>\r\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\r\n {t('roleDetail.info.parentRoleHelp')}\r\n </p>\r\n </div>\r\n\r\n {/* Description */}\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-primary)] 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 {/* System Role Badge */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.systemRole')}\r\n </label>\r\n <div className=\"flex items-center gap-2\">\r\n {role.isSystem ? (\r\n <span className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-[var(--radius-badge)] text-sm bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n <Lock className=\"w-4 h-4\" />\r\n {t('roleDetail.info.isSystemRole')}\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-[var(--radius-badge)] text-sm bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {t('roleDetail.info.isCustomRole')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metadata */}\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 pt-4 border-t border-[var(--border-color)]\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.createdAt')}\r\n </label>\r\n <div className=\"text-sm text-[var(--text-primary)]\">\r\n {new Date(role.createdAt).toLocaleString()}\r\n </div>\r\n </div>\r\n {role.updatedAt && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.updatedAt')}\r\n </label>\r\n <div className=\"text-sm text-[var(--text-primary)]\">\r\n {new Date(role.updatedAt).toLocaleString()}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex justify-end pt-4\">\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\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 disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* Permissions Tab - Matrix View */}\r\n {activeTab === 'permissions' && roleId && (\r\n <RolePermissionMatrix roleId={roleId} />\r\n )}\r\n\r\n {/* Groups Tab */}\r\n {activeTab === 'groups' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('roleDetail.groups.title')} ({role.groups?.length || 0})\r\n </h3>\r\n <button\r\n onClick={openAddGroup}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roleDetail.groups.add')}\r\n </button>\r\n </div>\r\n\r\n {(!role.groups || role.groups.length === 0) ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.groups.noGroups')}\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {role.groups.map(group => (\r\n <div\r\n key={group.id}\r\n className=\"flex items-center gap-4 p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\"\r\n >\r\n <Link\r\n to={`/administration/users/groups/${group.id}`}\r\n className=\"flex items-center gap-4 flex-1 min-w-0 hover:opacity-80 transition-opacity\"\r\n >\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] flex items-center justify-center\">\r\n <UsersRound className=\"w-5 h-5 text-[var(--color-accent-700)]\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-[var(--text-primary)] truncate\">{group.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] truncate\">\r\n {group.membersCount} {t('roleDetail.groups.members')}\r\n {group.description && ` · ${group.description}`}\r\n </div>\r\n </div>\r\n </Link>\r\n <button\r\n onClick={() => handleRemoveGroup(group.id)}\r\n disabled={removingGroupId === group.id}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--error-text)] transition-colors disabled:opacity-50\"\r\n title={t('roleDetail.groups.remove')}\r\n >\r\n {removingGroupId === group.id ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Add Group Modal */}\r\n {addingGroup && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] w-full max-w-md 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 {t('roleDetail.groups.addTitle')}\r\n </h2>\r\n <button\r\n onClick={() => setAddingGroup(false)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={groupSearchTerm}\r\n onChange={(e) => setGroupSearchTerm(e.target.value)}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n placeholder={t('roleDetail.groups.searchPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {loadingGroups ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {availableGroups\r\n .filter(g =>\r\n !role.groups?.some(rg => rg.id === g.id) &&\r\n (groupSearchTerm === '' ||\r\n g.name.toLowerCase().includes(groupSearchTerm.toLowerCase()) ||\r\n (g.description || '').toLowerCase().includes(groupSearchTerm.toLowerCase()))\r\n )\r\n .map(group => (\r\n <label\r\n key={group.id}\r\n className={`flex items-center gap-3 cursor-pointer p-3 rounded-[var(--radius-button)] transition-colors ${\r\n selectedGroupId === group.id\r\n ? 'bg-[var(--color-accent-500)]/10 border border-[var(--color-accent-500)]'\r\n : 'hover:bg-[var(--bg-hover)] border border-transparent'\r\n }`}\r\n htmlFor={`group-${group.id}`}\r\n >\r\n <input\r\n id={`group-${group.id}`}\r\n type=\"radio\"\r\n name=\"selectedGroup\"\r\n checked={selectedGroupId === group.id}\r\n onChange={() => setSelectedGroupId(group.id)}\r\n className=\"w-4 h-4 text-[var(--color-accent-600)] focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"text-[var(--text-primary)] font-medium\">{group.name}</span>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">\r\n {group.memberCount} {t('roleDetail.groups.members')}\r\n {group.description && ` · ${group.description}`}\r\n </p>\r\n </div>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setAddingGroup(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 onClick={handleAssignGroup}\r\n disabled={!selectedGroupId || assigningGroup}\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 disabled:opacity-50\"\r\n >\r\n {assigningGroup && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.add')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Users Tab */}\r\n {activeTab === 'users' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('roleDetail.users.title')} ({role.users.length})\r\n </h3>\r\n <button\r\n onClick={openAddUser}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roleDetail.users.add')}\r\n </button>\r\n </div>\r\n\r\n {role.users.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.users.noUsers')}\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {role.users.map(user => (\r\n <div\r\n key={user.id}\r\n className=\"flex items-center gap-4 p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\"\r\n >\r\n <Link\r\n to={`/administration/users/${user.id}`}\r\n className=\"flex items-center gap-4 flex-1 min-w-0 hover:opacity-80 transition-opacity\"\r\n >\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] flex items-center justify-center\">\r\n <span className=\"text-sm font-medium text-[var(--color-accent-700)]\">\r\n {user.fullName.split(' ').map(n => n.at(0)).join('').toUpperCase().slice(0, 2)}\r\n </span>\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-[var(--text-primary)] truncate\">{user.fullName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] truncate\">{user.email}</div>\r\n </div>\r\n </Link>\r\n <button\r\n onClick={() => handleRemoveUser(user.id)}\r\n disabled={removingUserId === user.id}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--error-text)] transition-colors disabled:opacity-50\"\r\n title={t('roleDetail.users.remove')}\r\n >\r\n {removingUserId === user.id ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Add User Modal */}\r\n {addingUser && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] w-full max-w-md 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 {t('roleDetail.users.addTitle')}\r\n </h2>\r\n <button\r\n onClick={() => setAddingUser(false)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={userSearchTerm}\r\n onChange={(e) => setUserSearchTerm(e.target.value)}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n placeholder={t('roleDetail.users.searchPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {loadingUsers ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {availableUsers\r\n .filter(u =>\r\n !role.users.some(ru => ru.id === u.id) &&\r\n (userSearchTerm === '' ||\r\n u.fullName.toLowerCase().includes(userSearchTerm.toLowerCase()) ||\r\n u.email.toLowerCase().includes(userSearchTerm.toLowerCase()))\r\n )\r\n .map(user => (\r\n <label\r\n key={user.id}\r\n className={`flex items-center gap-3 cursor-pointer p-3 rounded-[var(--radius-button)] transition-colors ${\r\n selectedUserId === user.id\r\n ? 'bg-[var(--color-accent-500)]/10 border border-[var(--color-accent-500)]'\r\n : 'hover:bg-[var(--bg-hover)] border border-transparent'\r\n }`}\r\n htmlFor={`user-${user.id}`}\r\n >\r\n <input\r\n id={`user-${user.id}`}\r\n type=\"radio\"\r\n name=\"selectedUser\"\r\n checked={selectedUserId === user.id}\r\n onChange={() => setSelectedUserId(user.id)}\r\n className=\"w-4 h-4 text-[var(--color-accent-600)] focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"text-[var(--text-primary)] font-medium\">{user.fullName}</span>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{user.email}</p>\r\n </div>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setAddingUser(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 onClick={handleAssignUser}\r\n disabled={!selectedUserId || assigningUser}\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 disabled:opacity-50\"\r\n >\r\n {assigningUser && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.add')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Translations Tab */}\r\n {activeTab === 'translations' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('roleDetail.translations.title')} ({translations.length})\r\n </h3>\r\n {availableLanguages.length > 0 && (\r\n <button\r\n onClick={() => setShowAddTranslation(true)}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roleDetail.translations.add')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Add new translation form */}\r\n {showAddTranslation && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--color-accent-500)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h4 className=\"font-medium text-[var(--text-primary)]\">\r\n {t('roleDetail.translations.addNew')}\r\n </h4>\r\n <button\r\n onClick={cancelEditTranslation}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n <X className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n <div className=\"grid gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.language')}\r\n </label>\r\n <select\r\n value={newTranslationLang}\r\n onChange={e => setNewTranslationLang(e.target.value)}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n >\r\n <option value=\"\">{t('roleDetail.translations.selectLanguage')}</option>\r\n {availableLanguages.map(lang => (\r\n <option key={lang.code} value={lang.code}>{lang.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n {newTranslationLang && (\r\n <>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.name}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.shortName')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.shortName}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, shortName: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.description')}\r\n </label>\r\n <textarea\r\n value={translationForm.description || ''}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] resize-none\"\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={cancelEditTranslation}\r\n className=\"px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] text-sm font-medium\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={() => handleSaveTranslation(newTranslationLang)}\r\n disabled={savingTranslation || !translationForm.name || !translationForm.shortName}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium disabled:opacity-50\"\r\n >\r\n {savingTranslation && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {loadingTranslations && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loadingTranslations && translations.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.translations.noTranslations')}\r\n </div>\r\n )}\r\n {!loadingTranslations && translations.length > 0 && (\r\n <div className=\"space-y-3\">\r\n {translations.map(trans => {\r\n const langInfo = SUPPORTED_LANGUAGES.find(l => l.code === trans.languageCode);\r\n const isEditing = editingTranslation === trans.languageCode;\r\n\r\n return (\r\n <div\r\n key={trans.languageCode}\r\n className={`p-4 rounded-[var(--radius-card)] border ${\r\n isEditing\r\n ? 'bg-[var(--bg-primary)] border-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-primary)] border-[var(--border-color)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"px-2 py-0.5 text-xs font-medium rounded bg-[var(--bg-tertiary)] text-[var(--text-secondary)] uppercase\">\r\n {trans.languageCode}\r\n </span>\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {langInfo?.label || trans.languageCode}\r\n </span>\r\n </div>\r\n {!isEditing && (\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={() => startEditTranslation(trans)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--color-accent-600)]\"\r\n title={t('common.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleDeleteTranslation(trans.languageCode)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--error-text)]\"\r\n title={t('common.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {isEditing ? (\r\n <div className=\"grid gap-3 mt-3\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.name}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.shortName')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.shortName}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, shortName: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.description')}\r\n </label>\r\n <textarea\r\n value={translationForm.description || ''}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] resize-none\"\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={cancelEditTranslation}\r\n className=\"px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] text-sm font-medium\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={() => handleSaveTranslation(trans.languageCode)}\r\n disabled={savingTranslation || !translationForm.name || !translationForm.shortName}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium disabled:opacity-50\"\r\n >\r\n {savingTranslation && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-1\">\r\n <div className=\"font-medium text-[var(--text-primary)]\">{trans.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('roleDetail.translations.shortName')}: {trans.shortName}\r\n </div>\r\n {trans.description && (\r\n <div className=\"text-sm text-[var(--text-tertiary)] mt-1\">{trans.description}</div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ACTION_ICONS","jsx","Shield","Eye","Plus","Edit","Trash2","UserPlus","Play","ACTION_COLORS","applyApplicationModuleFilterHelper","grouped","applicationFilter","moduleFilter","app","m","applyStatusFilterHelper","statusFilters","getModuleStatus","status","SectionResourceRows","section","resources","moduleIndex","sectionIndex","collapsedSections","renderResourceRow","hasResources","isSectionCollapsed","jsxs","React","resource","resourceIndex","RolePermissionMatrix","roleId","t","useTranslation","user","useAuth","collapsedApps","toggleApp","useCollapsibleState","collapsedModules","setCollapsedModules","useState","setCollapsedSections","setStatusFilters","openPopover","setOpenPopover","setApplicationFilter","setModuleFilter","canEditSystemRoles","useMemo","hasFullAccess","loading","error","roles","filteredResources","hasChanges","saving","saveSuccess","saveError","togglePermission","saveChanges","resetChanges","getPermissionInheritance","usePermissionMatrix","role","r","isRoleEditable","toggleStatusFilter","prev","next","toggleModule","moduleId","toggleSection","sectionId","filterOptions","applications","modules","appKey","a","b","handleTogglePermission","useCallback","permissionId","isPermissionGrantedFn","info","moduleWithSections","calculateModuleWithSectionsStatus","getResourceStatus","calculatePermissionStatus","getGrantedPermissions","p","applyApplicationModuleFilter","applyStatusFilter","groupedResources","groupByApplicationWithSections","totalModuleCount","sum","handleToggleCollapse","resourceId","level","handleCellClick","Loader2","AlertCircle","getRoleResourceIcon","Database","FileText","Box","getRoleResourceLabelClass","getRolePaddingClass","renderToggleButton","hasChildren","isCollapsed","ChevronRight","ChevronDown","renderPermissionBadges","grantedPermissions","action","actionColor","icon","rowIndex","grantedCount","isPopoverOpen","buttonRef","createRef","cellBg","getPermissionCellBackground","paddingLeft","rowBgClass","PermissionStatusIndicator","PermissionPopover","_","permId","Check","X","Save","e","mod","Star","Ban","appGroup","isAppCollapsed","FolderOpen","module","sections","hasSections","isModuleCollapsed","sectionWithResources","SUPPORTED_LANGUAGES","RoleDetailPage","useParams","navigate","useNavigate","setRole","setLoading","setSaving","activeTab","setActiveTab","setError","success","setSuccess","formData","setFormData","availableRoles","setAvailableRoles","ROLE_CATEGORIES","translations","setTranslations","loadingTranslations","setLoadingTranslations","editingTranslation","setEditingTranslation","translationForm","setTranslationForm","savingTranslation","setSavingTranslation","showAddTranslation","setShowAddTranslation","newTranslationLang","setNewTranslationLang","addingUser","setAddingUser","availableUsers","setAvailableUsers","loadingUsers","setLoadingUsers","userSearchTerm","setUserSearchTerm","selectedUserId","setSelectedUserId","assigningUser","setAssigningUser","removingUserId","setRemovingUserId","addingGroup","setAddingGroup","availableGroups","setAvailableGroups","loadingGroups","setLoadingGroups","groupSearchTerm","setGroupSearchTerm","selectedGroupId","setSelectedGroupId","assigningGroup","setAssigningGroup","removingGroupId","setRemovingGroupId","loadRole","roleData","rolesData","adminApi","err","useEffect","handleSaveInfo","updateData","loadTranslations","data","startEditTranslation","trans","cancelEditTranslation","handleSaveTranslation","languageCode","handleDeleteTranslation","availableLanguages","lang","openAddUser","handleAssignUser","handleRemoveUser","userId","openAddGroup","groupsApi","handleAssignGroup","handleRemoveGroup","groupId","tabs","Settings","Users","UsersRound","Languages","Breadcrumb","ArrowLeft","Lock","AlertTriangle","CheckCircle","tab","cat","group","Link","Search","g","rg","n","u","ru","Fragment","langInfo","l","isEditing","Edit2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RoleDetailPage-BQffUSnt.js","sources":["../../src/components/platform/administration/permissions/RolePermissionMatrix.tsx","../../src/pages/platform/administration/permissions/RoleDetailPage.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\r\nimport React, { useState, useMemo, useCallback, createRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, AlertCircle, ChevronDown, ChevronRight, FolderOpen, Box, FileText, Database, Check, Star, Eye, Ban, Save, X, Plus, Edit, Trash2, UserPlus, Play, Shield } from 'lucide-react';\r\nimport { usePermissionMatrix } from '@/hooks/usePermissionMatrix';\r\nimport { useCollapsibleState } from '@/hooks/useCollapsibleState';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { hasFullAccess } from '@/utils/permissions';\r\nimport { groupByApplicationWithSections, calculatePermissionStatus, calculateModuleWithSectionsStatus, getPermissionCellBackground } from '@/utils/permissionUtils';\r\nimport { PermissionStatusIndicator } from './PermissionStatusIndicator';\r\nimport { PermissionPopover } from '../PermissionPopover';\r\nimport type { ResourceNode, PermissionStatus, ModuleWithSections } from './types';\r\n\r\ninterface RolePermissionMatrixProps {\r\n readonly roleId: string;\r\n}\r\n\r\n// Action icons and colors (same as PermissionCellPopover)\r\nconst ACTION_ICONS: Record<string, React.ReactNode> = {\r\n '*': <Shield className=\"h-3 w-3\" />,\r\n read: <Eye className=\"h-3 w-3\" />,\r\n create: <Plus className=\"h-3 w-3\" />,\r\n update: <Edit className=\"h-3 w-3\" />,\r\n delete: <Trash2 className=\"h-3 w-3\" />,\r\n assign: <UserPlus className=\"h-3 w-3\" />,\r\n execute: <Play className=\"h-3 w-3\" />,\r\n};\r\n\r\nconst ACTION_COLORS: Record<string, string> = {\r\n '*': 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n read: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n create: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n update: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n delete: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n assign: 'bg-[var(--accent-bg)] text-[var(--accent-text)] border-[var(--accent-border)]',\r\n execute: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n};\r\n\r\n// Pure function to apply application/module filter\r\nfunction applyApplicationModuleFilterHelper(\r\n grouped: ReturnType<typeof groupByApplicationWithSections>,\r\n applicationFilter: string,\r\n moduleFilter: string\r\n) {\r\n return grouped\r\n .filter(app => applicationFilter === 'all' || app.application === applicationFilter)\r\n .map(app => ({\r\n ...app,\r\n modules: app.modules.filter(m => moduleFilter === 'all' || m.module.moduleLabel === moduleFilter)\r\n }))\r\n .filter(app => app.modules.length > 0);\r\n}\r\n\r\n// Pure function to apply status filter\r\nfunction applyStatusFilterHelper(\r\n grouped: ReturnType<typeof groupByApplicationWithSections>,\r\n statusFilters: Set<PermissionStatus>,\r\n getModuleStatus: (m: ModuleWithSections) => { status: PermissionStatus; grantedCount: number; totalCount: number }\r\n) {\r\n return grouped.map(app => ({\r\n ...app,\r\n modules: app.modules.filter(m => {\r\n const { status } = getModuleStatus(m);\r\n return statusFilters.has(status);\r\n })\r\n })).filter(app => app.modules.length > 0);\r\n}\r\n\r\n// Sub-component for rendering section and resource rows\r\ninterface SectionResourceRowsProps {\r\n readonly section: ResourceNode;\r\n readonly resources: ResourceNode[];\r\n readonly moduleIndex: number;\r\n readonly sectionIndex: number;\r\n readonly collapsedSections: Set<string>;\r\n readonly renderResourceRow: (resource: ResourceNode, rowIndex: number, level: 'module' | 'section' | 'resource', hasChildren: boolean, isCollapsed: boolean) => React.ReactNode;\r\n}\r\n\r\nfunction SectionResourceRows({\r\n section,\r\n resources,\r\n moduleIndex,\r\n sectionIndex,\r\n collapsedSections,\r\n renderResourceRow,\r\n}: SectionResourceRowsProps) {\r\n const hasResources = resources.length > 0;\r\n const isSectionCollapsed = collapsedSections.has(section.id);\r\n\r\n return (\r\n <React.Fragment key={section.id}>\r\n {/* Section Row */}\r\n {renderResourceRow(section, moduleIndex + sectionIndex + 1, 'section', hasResources, isSectionCollapsed)}\r\n\r\n {/* Resource Rows (if section has resources and is not collapsed) */}\r\n {hasResources && !isSectionCollapsed && resources.map((resource, resourceIndex) =>\r\n renderResourceRow(resource, moduleIndex + sectionIndex + resourceIndex + 2, 'resource', false, false)\r\n )}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport function RolePermissionMatrix({ roleId }: RolePermissionMatrixProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { user } = useAuth();\r\n\r\n const { collapsedApps, toggleApp } = useCollapsibleState();\r\n const [collapsedModules, setCollapsedModules] = useState<Set<string>>(new Set());\r\n const [collapsedSections, setCollapsedSections] = useState<Set<string>>(new Set());\r\n const [statusFilters, setStatusFilters] = useState<Set<PermissionStatus>>(new Set());\r\n const [openPopover, setOpenPopover] = useState<string | null>(null);\r\n\r\n // Filter states\r\n const [applicationFilter, setApplicationFilter] = useState<string>('all');\r\n const [moduleFilter, setModuleFilter] = useState<string>('all');\r\n\r\n // Super Admin can edit system roles\r\n const canEditSystemRoles = useMemo(() => {\r\n if (!user) return false;\r\n return hasFullAccess(user.permissions);\r\n }, [user]);\r\n\r\n const {\r\n loading,\r\n error,\r\n roles,\r\n filteredResources,\r\n hasChanges,\r\n saving,\r\n saveSuccess,\r\n saveError,\r\n togglePermission,\r\n saveChanges,\r\n resetChanges,\r\n getPermissionInheritance,\r\n } = usePermissionMatrix({ canEditSystemRoles });\r\n\r\n // Find the specific role\r\n const role = useMemo(() => {\r\n return roles.find(r => r.id === roleId);\r\n }, [roles, roleId]);\r\n\r\n // Check if role is editable\r\n const isRoleEditable = useMemo(() => {\r\n if (!role) return false;\r\n if (role.isSystem && !canEditSystemRoles) return false;\r\n return true;\r\n }, [role, canEditSystemRoles]);\r\n\r\n const toggleStatusFilter = (status: PermissionStatus) => {\r\n setStatusFilters(prev => {\r\n const next = new Set(prev);\r\n if (next.has(status)) {\r\n next.delete(status);\r\n } else {\r\n next.add(status);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const toggleModule = (moduleId: string) => {\r\n setCollapsedModules(prev => {\r\n const next = new Set(prev);\r\n if (next.has(moduleId)) {\r\n next.delete(moduleId);\r\n } else {\r\n next.add(moduleId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const toggleSection = (sectionId: string) => {\r\n setCollapsedSections(prev => {\r\n const next = new Set(prev);\r\n if (next.has(sectionId)) {\r\n next.delete(sectionId);\r\n } else {\r\n next.add(sectionId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n // Build filter options from resources\r\n const filterOptions = useMemo(() => {\r\n const applications: { app: string; label: string }[] = [];\r\n const modules: { app: string; module: string; label: string }[] = [];\r\n\r\n filteredResources.forEach(resource => {\r\n if (resource.level === 'module') {\r\n const appKey = resource.applicationLabel;\r\n if (!applications.find(a => a.app === appKey)) {\r\n applications.push({\r\n app: resource.applicationLabel,\r\n label: resource.applicationLabel\r\n });\r\n }\r\n\r\n modules.push({\r\n app: resource.applicationLabel,\r\n module: resource.moduleLabel,\r\n label: resource.moduleLabel\r\n });\r\n }\r\n });\r\n\r\n return {\r\n applications: applications.sort((a, b) => a.label.localeCompare(b.label)),\r\n modules: modules.sort((a, b) => a.label.localeCompare(b.label))\r\n };\r\n }, [filteredResources]);\r\n\r\n // Handle permission toggle\r\n const handleTogglePermission = useCallback((permissionId: string) => {\r\n if (!role || !isRoleEditable) return;\r\n togglePermission(role.id, permissionId);\r\n }, [role, isRoleEditable, togglePermission]);\r\n\r\n // Check if a permission is granted\r\n const isPermissionGrantedFn = useCallback((permissionId: string): boolean => {\r\n if (!role) return false;\r\n const info = getPermissionInheritance(role.id, permissionId);\r\n return info.isDirect || info.isInherited;\r\n }, [role, getPermissionInheritance]);\r\n\r\n // Calculate permission status for this role on a module (including sections)\r\n const getModuleStatus = useCallback((moduleWithSections: ModuleWithSections): { status: PermissionStatus; grantedCount: number; totalCount: number } => {\r\n return calculateModuleWithSectionsStatus(\r\n moduleWithSections.module,\r\n moduleWithSections.sections,\r\n isPermissionGrantedFn\r\n );\r\n }, [isPermissionGrantedFn]);\r\n\r\n // Calculate permission status for a single resource\r\n const getResourceStatus = useCallback((resource: ResourceNode): { status: PermissionStatus; grantedCount: number } => {\r\n return calculatePermissionStatus(resource, isPermissionGrantedFn);\r\n }, [isPermissionGrantedFn]);\r\n\r\n // Get granted permissions for a resource\r\n const getGrantedPermissions = useCallback((resource: ResourceNode): string[] => {\r\n if (!role) return [];\r\n\r\n return resource.permissions\r\n .filter(p => {\r\n const info = getPermissionInheritance(role.id, p.id);\r\n return info.isDirect || info.isInherited;\r\n })\r\n .map(p => p.action);\r\n }, [role, getPermissionInheritance]);\r\n\r\n\r\n const applyApplicationModuleFilter = useCallback((grouped: ReturnType<typeof groupByApplicationWithSections>) => {\r\n return applyApplicationModuleFilterHelper(grouped, applicationFilter, moduleFilter);\r\n }, [applicationFilter, moduleFilter]);\r\n\r\n const applyStatusFilter = useCallback((grouped: ReturnType<typeof groupByApplicationWithSections>) => {\r\n if (statusFilters.size === 0) return grouped;\r\n return applyStatusFilterHelper(grouped, statusFilters, getModuleStatus);\r\n }, [statusFilters, getModuleStatus]);\r\n\r\n const groupedResources = useMemo(() => {\r\n let grouped = groupByApplicationWithSections(filteredResources);\r\n grouped = applyApplicationModuleFilter(grouped);\r\n grouped = applyStatusFilter(grouped);\r\n return grouped;\r\n }, [filteredResources, applyApplicationModuleFilter, applyStatusFilter]);\r\n\r\n // Get total module count for stats\r\n const totalModuleCount = useMemo(() => {\r\n return groupedResources.reduce((sum, app) =>\r\n sum + app.modules.length, 0);\r\n }, [groupedResources]);\r\n\r\n const handleToggleCollapse = useCallback((resourceId: string, level: 'module' | 'section' | 'resource') => {\r\n if (level === 'module') {\r\n toggleModule(resourceId);\r\n } else if (level === 'section') {\r\n toggleSection(resourceId);\r\n }\r\n }, [toggleModule, toggleSection]);\r\n\r\n const handleCellClick = (resourceId: string) => {\r\n if (openPopover === resourceId) {\r\n setOpenPopover(null);\r\n } else {\r\n setOpenPopover(resourceId);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <div className=\"text-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-accent-500)] mx-auto mb-4\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('userPermissions.loading')}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertCircle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <p className=\"text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!role) {\r\n return (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.notFound')}\r\n </div>\r\n );\r\n }\r\n\r\n const getRoleResourceIcon = (level: 'module' | 'section' | 'resource') => {\r\n if (level === 'resource') return <Database className=\"h-3.5 w-3.5 text-[var(--text-muted)]\" />;\r\n if (level === 'section') return <FileText className=\"h-3.5 w-3.5 text-[var(--text-muted)]\" />;\r\n return <Box className=\"h-3.5 w-3.5 text-[var(--text-secondary)]\" />;\r\n };\r\n\r\n const getRoleResourceLabelClass = (level: 'module' | 'section' | 'resource'): string => {\r\n if (level === 'resource') return 'text-[var(--text-muted)] italic';\r\n if (level === 'section') return 'text-[var(--text-secondary)]';\r\n return 'font-medium text-[var(--text-primary)]';\r\n };\r\n\r\n const getRolePaddingClass = (level: 'module' | 'section' | 'resource'): string => {\r\n if (level === 'resource') return 'pl-28';\r\n if (level === 'section') return 'pl-22';\r\n return 'pl-16';\r\n };\r\n\r\n const renderToggleButton = (hasChildren: boolean, resourceId: string, level: 'module' | 'section' | 'resource', isCollapsed: boolean) => {\r\n if (!hasChildren) return null;\r\n return (\r\n <button\r\n onClick={() => handleToggleCollapse(resourceId, level)}\r\n className=\"p-0.5 hover:bg-[var(--bg-hover)] rounded\"\r\n >\r\n {isCollapsed ? (\r\n <ChevronRight className=\"h-3 w-3 text-[var(--text-muted)]\" />\r\n ) : (\r\n <ChevronDown className=\"h-3 w-3 text-[var(--text-muted)]\" />\r\n )}\r\n </button>\r\n );\r\n };\r\n\r\n const renderPermissionBadges = (grantedPermissions: string[]) => {\r\n if (grantedPermissions.length === 0) {\r\n return (\r\n <span className=\"text-xs text-[var(--text-muted)] italic\">\r\n {t('assignments.noPermissions')}\r\n </span>\r\n );\r\n }\r\n return grantedPermissions.map((action) => {\r\n const actionColor = ACTION_COLORS[action] || 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] border-[var(--border-color)]';\r\n const icon = ACTION_ICONS[action] || <Eye className=\"h-3 w-3\" />;\r\n return (\r\n <div\r\n key={action}\r\n className={`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-[var(--radius-badge)] border text-xs font-medium ${actionColor}`}\r\n title={t(`assignments.actions.${action === '*' ? 'all' : action}.description`)}\r\n >\r\n {icon}\r\n <span className=\"capitalize\">\r\n {t(`assignments.actions.${action === '*' ? 'all' : action}.label`)}\r\n </span>\r\n </div>\r\n );\r\n });\r\n };\r\n\r\n const renderResourceRow = (\r\n resource: ResourceNode,\r\n rowIndex: number,\r\n level: 'module' | 'section' | 'resource',\r\n hasChildren: boolean = false,\r\n isCollapsed: boolean = false\r\n ) => {\r\n const { status, grantedCount } = getResourceStatus(resource);\r\n const isPopoverOpen = openPopover === resource.id;\r\n const buttonRef = createRef<HTMLButtonElement>();\r\n const cellBg = getPermissionCellBackground(status);\r\n const grantedPermissions = getGrantedPermissions(resource);\r\n const paddingLeft = getRolePaddingClass(level);\r\n const rowBgClass = rowIndex % 2 === 0 ? 'item-light' : 'item-medium';\r\n\r\n return (\r\n <tr\r\n key={resource.id}\r\n className={`hover:bg-[var(--bg-hover)] ${rowBgClass}`}\r\n >\r\n <td\r\n className={`sticky left-0 z-10 ${rowBgClass} px-3 py-2 ${paddingLeft}`}\r\n style={{ width: '280px', minWidth: '280px', maxWidth: '280px' }}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {renderToggleButton(hasChildren, resource.id, level, isCollapsed)}\r\n {getRoleResourceIcon(level)}\r\n <span className={`text-sm ${getRoleResourceLabelClass(level)}`}>\r\n {resource.moduleLabel}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-muted)]\">\r\n ({resource.permissions.length})\r\n </span>\r\n </div>\r\n </td>\r\n\r\n <td\r\n className={`px-0 py-1 text-center relative ${cellBg}`}\r\n style={{ width: '60px', minWidth: '60px', maxWidth: '60px' }}\r\n >\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n onClick={() => isRoleEditable && handleCellClick(resource.id)}\r\n disabled={!isRoleEditable}\r\n className={`w-full h-full min-h-[36px] flex items-center justify-center rounded transition-colors ${\r\n !isRoleEditable\r\n ? 'cursor-not-allowed opacity-50'\r\n : 'hover:opacity-80'\r\n } ${\r\n isPopoverOpen ? 'ring-2 ring-[var(--color-accent-500)]' : ''\r\n }`}\r\n title={\r\n !isRoleEditable\r\n ? `${role.name} - ${t('assignments.systemRoleReadOnly')}`\r\n : `${role.name} - ${resource.moduleLabel}: ${grantedCount}/${resource.permissions.length}`\r\n }\r\n >\r\n <PermissionStatusIndicator\r\n status={status}\r\n grantedCount={grantedCount}\r\n totalCount={resource.permissions.length}\r\n />\r\n </button>\r\n {isPopoverOpen && isRoleEditable && (\r\n <PermissionPopover\r\n mode=\"editable\"\r\n role={role}\r\n resource={resource}\r\n onTogglePermission={handleTogglePermission}\r\n onClose={() => setOpenPopover(null)}\r\n getPermissionInheritance={(_, permId) => getPermissionInheritance(role.id, permId)}\r\n />\r\n )}\r\n </td>\r\n\r\n <td className=\"px-3 py-2\">\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {renderPermissionBadges(grantedPermissions)}\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Fixed height container for save banner to prevent layout shift */}\r\n <div className=\"min-h-[52px]\">\r\n {saveSuccess && (\r\n <div className=\"flex items-center justify-between p-3 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Check className=\"h-4 w-4 text-[var(--success-text)]\" />\r\n <p className=\"text-sm text-[var(--success-text)] font-medium\">\r\n {t('common.savedSuccessfully', 'Sauvegardé avec succès !')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n {!saveSuccess && saving && (\r\n <div className=\"flex items-center justify-between p-3 rounded-[var(--radius-card)] bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <Loader2 className=\"h-4 w-4 animate-spin text-[var(--info-text)]\" />\r\n <p className=\"text-sm text-[var(--info-text)] font-medium\">\r\n {t('common.saving', 'Sauvegarde en cours...')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n {!saveSuccess && !saving && hasChanges && (\r\n <div className=\"flex items-center justify-between p-3 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)]\">\r\n <p className=\"text-sm text-[var(--warning-text)]\">\r\n {t('assignments.unsavedChanges', 'You have unsaved changes')}\r\n </p>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={resetChanges}\r\n disabled={saving}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-[var(--radius-button)] bg-[var(--bg-secondary)] border border-[var(--border-color)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] disabled:opacity-50\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={saveChanges}\r\n disabled={saving}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n {!saveSuccess && !saving && !hasChanges && (\r\n <div className=\"h-[52px]\" />\r\n )}\r\n </div>\r\n\r\n {/* Save error */}\r\n {saveError && (\r\n <div className=\"p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertCircle className=\"h-4 w-4 text-[var(--error-text)]\" />\r\n <p className=\"text-sm text-[var(--error-text)]\">{saveError}</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n\r\n {/* Filter Dropdowns */}\r\n <div className=\"flex flex-wrap items-center gap-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <label className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('userPermissions.filters.application')}:\r\n </label>\r\n <select\r\n value={applicationFilter}\r\n onChange={(e) => {\r\n setApplicationFilter(e.target.value);\r\n setModuleFilter('all');\r\n }}\r\n className=\"px-3 py-1.5 text-sm bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-[var(--radius-input)] text-[var(--text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"all\">{t('userPermissions.filters.allApplications')}</option>\r\n {filterOptions.applications\r\n .map(app => (\r\n <option key={app.app} value={app.app}>{app.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <label className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('userPermissions.filters.module')}:\r\n </label>\r\n <select\r\n value={moduleFilter}\r\n onChange={(e) => setModuleFilter(e.target.value)}\r\n className=\"px-3 py-1.5 text-sm bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-[var(--radius-input)] text-[var(--text-primary)] focus:outline-none focus:ring-1 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"all\">{t('userPermissions.filters.allModules')}</option>\r\n {filterOptions.modules\r\n .filter(mod =>\r\n (applicationFilter === 'all' || mod.app === applicationFilter)\r\n )\r\n .map(mod => (\r\n <option key={`${mod.app}:${mod.module}`} value={mod.module}>{mod.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* Status Filter Buttons - Using CSS variables for colors */}\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('userPermissions.filterByStatus')}:\r\n </span>\r\n <div className=\"flex flex-wrap gap-2\">\r\n <button\r\n onClick={() => toggleStatusFilter('all')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('all')\r\n ? 'bg-[var(--success-bg)] border-[var(--success-border)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--success-border)]'\r\n }`}\r\n >\r\n <Check className={`h-3.5 w-3.5 ${statusFilters.has('all') ? '' : 'text-[var(--success-dot)]'}`} />\r\n {t('assignments.complete')}\r\n </button>\r\n <button\r\n onClick={() => toggleStatusFilter('some')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('some')\r\n ? 'bg-[var(--warning-bg)] border-[var(--warning-border)] text-[var(--warning-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--warning-border)]'\r\n }`}\r\n >\r\n <Star className={`h-3.5 w-3.5 ${statusFilters.has('some') ? '' : 'text-[var(--warning-dot)]'}`} />\r\n {t('assignments.partial')}\r\n </button>\r\n <button\r\n onClick={() => toggleStatusFilter('read-only')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('read-only')\r\n ? 'bg-[var(--info-bg)] border-[var(--info-border)] text-[var(--info-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--info-border)]'\r\n }`}\r\n >\r\n <Eye className={`h-3.5 w-3.5 ${statusFilters.has('read-only') ? '' : 'text-[var(--info-dot)]'}`} />\r\n {t('assignments.readOnly')}\r\n </button>\r\n <button\r\n onClick={() => toggleStatusFilter('none')}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border transition-colors ${\r\n statusFilters.has('none')\r\n ? 'bg-[var(--error-bg)] border-[var(--error-border)] text-[var(--error-text)]'\r\n : 'bg-[var(--bg-tertiary)] border-[var(--border-color)] text-[var(--text-secondary)] hover:border-[var(--error-border)]'\r\n }`}\r\n >\r\n <Ban className={`h-3.5 w-3.5 ${statusFilters.has('none') ? '' : 'text-[var(--text-muted)]'}`} />\r\n {t('assignments.none')}\r\n </button>\r\n </div>\r\n {statusFilters.size > 0 && (\r\n <button\r\n onClick={() => setStatusFilters(new Set())}\r\n className=\"text-xs text-[var(--color-accent-500)] hover:text-[var(--color-accent-600)] underline\"\r\n >\r\n {t('assignments.clearFilters')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Stats */}\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"px-2.5 py-1 text-xs font-semibold rounded-full bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {totalModuleCount} {t('assignments.modules')}\r\n </span>\r\n </div>\r\n\r\n {/* Permission Matrix Table - Same style as PermissionMatrixTable */}\r\n <div className=\"overflow-x-auto overflow-y-visible\">\r\n <table className=\"border-collapse\" style={{ width: 'auto' }}>\r\n <thead className=\"item-medium border-b border-[var(--item-color-border)]\">\r\n <tr>\r\n <th\r\n scope=\"col\"\r\n className=\"sticky left-0 z-20 item-medium px-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\"\r\n style={{ width: '280px', minWidth: '280px', maxWidth: '280px', height: '48px', verticalAlign: 'middle' }}\r\n >\r\n {t('assignments.resource')}\r\n </th>\r\n <th\r\n scope=\"col\"\r\n className=\"px-2 text-center text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\"\r\n style={{ width: '60px', minWidth: '60px', maxWidth: '60px', height: '48px', verticalAlign: 'middle' }}\r\n >\r\n {t('userPermissions.status')}\r\n </th>\r\n <th\r\n scope=\"col\"\r\n className=\"px-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\"\r\n style={{ height: '48px', verticalAlign: 'middle' }}\r\n >\r\n {t('assignments.permissions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--item-color-border)]\">\r\n {groupedResources.map((appGroup) => {\r\n const appKey = appGroup.application;\r\n const isAppCollapsed = collapsedApps.has(appKey);\r\n\r\n return (\r\n <React.Fragment key={appKey}>\r\n {/* Application Header Row */}\r\n <tr className=\"bg-[var(--bg-tertiary)]\">\r\n <td\r\n className=\"sticky left-0 z-10 px-3 py-2 bg-[var(--bg-tertiary)]\"\r\n style={{ width: '280px', minWidth: '280px', maxWidth: '280px' }}\r\n >\r\n <button\r\n onClick={() => toggleApp(appKey)}\r\n className=\"flex items-center gap-3 w-full text-left hover:opacity-80\"\r\n >\r\n {isAppCollapsed ? (\r\n <ChevronRight className=\"h-4 w-4 text-[var(--text-secondary)]\" />\r\n ) : (\r\n <ChevronDown className=\"h-4 w-4 text-[var(--text-secondary)]\" />\r\n )}\r\n <FolderOpen className=\"h-4 w-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-semibold text-[var(--text-primary)]\">\r\n {appGroup.application}\r\n </span>\r\n <span className=\"text-xs text-[var(--text-muted)] ml-auto\">\r\n {appGroup.modules.length} module{appGroup.modules.length > 1 ? 's' : ''}\r\n </span>\r\n </button>\r\n </td>\r\n <td className=\"px-0 py-2\" />\r\n <td className=\"px-0 py-2\" />\r\n </tr>\r\n\r\n {/* Module, Section and Resource Rows */}\r\n {!isAppCollapsed && appGroup.modules.map((moduleWithSections, moduleIndex) => {\r\n const { module, sections } = moduleWithSections;\r\n const hasSections = sections.length > 0;\r\n const isModuleCollapsed = collapsedModules.has(module.id);\r\n\r\n return (\r\n <React.Fragment key={module.id}>\r\n {/* Module Row */}\r\n {renderResourceRow(module, moduleIndex, 'module', hasSections, isModuleCollapsed)}\r\n\r\n {/* Section and Resource Rows (if module has sections and is not collapsed) */}\r\n {hasSections && !isModuleCollapsed && sections.map((sectionWithResources, sectionIndex) => {\r\n const { section, resources } = sectionWithResources;\r\n\r\n return (\r\n <SectionResourceRows\r\n key={section.id}\r\n section={section}\r\n resources={resources}\r\n moduleIndex={moduleIndex}\r\n sectionIndex={sectionIndex}\r\n collapsedSections={collapsedSections}\r\n renderResourceRow={renderResourceRow}\r\n />\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {totalModuleCount === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('assignments.noResources')}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useParams, useNavigate, Link } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n ArrowLeft,\r\n Shield,\r\n Users,\r\n Settings,\r\n Loader2,\r\n Save,\r\n Lock,\r\n AlertTriangle,\r\n CheckCircle,\r\n Languages,\r\n Plus,\r\n Trash2,\r\n Edit2,\r\n X,\r\n UsersRound,\r\n Search\r\n} from 'lucide-react';\r\nimport {\r\n adminApi,\r\n type RoleDetailDto,\r\n type RoleListDto,\r\n type UpdateRoleRequest,\r\n type RoleTranslationDto,\r\n type UpdateRoleTranslationRequest,\r\n type RoleCategory,\r\n type UserListDto\r\n} from '@/services/api/adminApi';\r\nimport { groupsApi, type GroupListDto } from '@/services/api/groupsApi';\r\nimport { RolePermissionMatrix } from '@/components/platform/administration/permissions/RolePermissionMatrix';\r\n\r\ntype TabId = 'info' | 'permissions' | 'users' | 'groups' | 'translations';\r\n\r\nconst SUPPORTED_LANGUAGES = [\r\n { code: 'fr', label: 'Français' },\r\n { code: 'en', label: 'English' },\r\n { code: 'it', label: 'Italiano' },\r\n { code: 'de', label: 'Deutsch' }\r\n];\r\n\r\nexport function RoleDetailPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { id: roleId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n\r\n const [role, setRole] = useState<RoleDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [activeTab, setActiveTab] = useState<TabId>('info');\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const [formData, setFormData] = useState({\r\n name: '',\r\n shortName: '',\r\n category: 'Custom' as RoleCategory,\r\n description: '',\r\n parentRoleId: null as string | null\r\n });\r\n const [availableRoles, setAvailableRoles] = useState<RoleListDto[]>([]);\r\n\r\n const ROLE_CATEGORIES: RoleCategory[] = ['Global', 'Admin', 'Manager', 'Contributor', 'Viewer', 'Custom'];\r\n\r\n // Translation state\r\n const [translations, setTranslations] = useState<RoleTranslationDto[]>([]);\r\n const [loadingTranslations, setLoadingTranslations] = useState(false);\r\n const [editingTranslation, setEditingTranslation] = useState<string | null>(null);\r\n const [translationForm, setTranslationForm] = useState<UpdateRoleTranslationRequest>({\r\n name: '',\r\n shortName: '',\r\n description: ''\r\n });\r\n const [savingTranslation, setSavingTranslation] = useState(false);\r\n const [showAddTranslation, setShowAddTranslation] = useState(false);\r\n const [newTranslationLang, setNewTranslationLang] = useState('');\r\n\r\n // User assignment state\r\n const [addingUser, setAddingUser] = useState(false);\r\n const [availableUsers, setAvailableUsers] = useState<UserListDto[]>([]);\r\n const [loadingUsers, setLoadingUsers] = useState(false);\r\n const [userSearchTerm, setUserSearchTerm] = useState('');\r\n const [selectedUserId, setSelectedUserId] = useState<string | null>(null);\r\n const [assigningUser, setAssigningUser] = useState(false);\r\n const [removingUserId, setRemovingUserId] = useState<string | null>(null);\r\n\r\n // Group assignment state\r\n const [addingGroup, setAddingGroup] = useState(false);\r\n const [availableGroups, setAvailableGroups] = useState<GroupListDto[]>([]);\r\n const [loadingGroups, setLoadingGroups] = useState(false);\r\n const [groupSearchTerm, setGroupSearchTerm] = useState('');\r\n const [selectedGroupId, setSelectedGroupId] = useState<string | null>(null);\r\n const [assigningGroup, setAssigningGroup] = useState(false);\r\n const [removingGroupId, setRemovingGroupId] = useState<string | null>(null);\r\n\r\n const loadRole = useCallback(async () => {\r\n if (!roleId) return;\r\n try {\r\n setLoading(true);\r\n const [roleData, rolesData] = await Promise.all([\r\n adminApi.roles.getById(roleId),\r\n adminApi.roles.getAll()\r\n ]);\r\n setRole(roleData);\r\n // Filter out current role from available parent roles\r\n setAvailableRoles(rolesData.filter(r => r.id !== roleId));\r\n setFormData({\r\n name: roleData.name,\r\n shortName: roleData.shortName,\r\n category: roleData.category,\r\n description: roleData.description || '',\r\n parentRoleId: roleData.parentRoleId\r\n });\r\n } catch (err) {\r\n console.error('Failed to load role:', err);\r\n setError(t('roleDetail.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [roleId, t]);\r\n\r\n useEffect(() => {\r\n loadRole();\r\n }, [loadRole]);\r\n\r\n const handleSaveInfo = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!roleId || !role) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updateData: UpdateRoleRequest = {\r\n name: formData.name,\r\n shortName: formData.shortName,\r\n category: formData.category,\r\n description: formData.description || undefined,\r\n parentRoleId: formData.parentRoleId || undefined\r\n };\r\n await adminApi.roles.update(roleId, updateData);\r\n setSuccess(t('roleDetail.success.saved'));\r\n loadRole();\r\n } catch (err: unknown) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n // Translation functions\r\n const loadTranslations = useCallback(async () => {\r\n if (!roleId) return;\r\n setLoadingTranslations(true);\r\n try {\r\n const data = await adminApi.roles.getTranslations(roleId);\r\n setTranslations(data);\r\n } catch (err) {\r\n console.error('Failed to load translations:', err);\r\n } finally {\r\n setLoadingTranslations(false);\r\n }\r\n }, [roleId]);\r\n\r\n useEffect(() => {\r\n if (activeTab === 'translations' && translations.length === 0) {\r\n loadTranslations();\r\n }\r\n }, [activeTab, translations.length, loadTranslations]);\r\n\r\n const startEditTranslation = (trans: RoleTranslationDto) => {\r\n setEditingTranslation(trans.languageCode);\r\n setTranslationForm({\r\n name: trans.name,\r\n shortName: trans.shortName,\r\n description: trans.description || ''\r\n });\r\n };\r\n\r\n const cancelEditTranslation = () => {\r\n setEditingTranslation(null);\r\n setShowAddTranslation(false);\r\n setTranslationForm({ name: '', shortName: '', description: '' });\r\n setNewTranslationLang('');\r\n };\r\n\r\n const handleSaveTranslation = async (languageCode: string) => {\r\n if (!roleId) return;\r\n setSavingTranslation(true);\r\n setError(null);\r\n try {\r\n await adminApi.roles.upsertTranslation(roleId, languageCode, translationForm);\r\n setSuccess(t('roleDetail.translations.saved'));\r\n setEditingTranslation(null);\r\n setShowAddTranslation(false);\r\n setNewTranslationLang('');\r\n loadTranslations();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.saveFailed'));\r\n } finally {\r\n setSavingTranslation(false);\r\n }\r\n };\r\n\r\n const handleDeleteTranslation = async (languageCode: string) => {\r\n if (!roleId) return;\r\n if (!confirm(t('roleDetail.translations.confirmDelete'))) return;\r\n try {\r\n await adminApi.roles.deleteTranslation(roleId, languageCode);\r\n setSuccess(t('roleDetail.translations.deleted'));\r\n loadTranslations();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.saveFailed'));\r\n }\r\n };\r\n\r\n const availableLanguages = SUPPORTED_LANGUAGES.filter(\r\n lang => !translations.some(t => t.languageCode === lang.code)\r\n );\r\n\r\n // User assignment functions\r\n const openAddUser = async () => {\r\n setAddingUser(true);\r\n setSelectedUserId(null);\r\n setUserSearchTerm('');\r\n setLoadingUsers(true);\r\n try {\r\n const data = await adminApi.users.getAll({ globalScope: true });\r\n setAvailableUsers(data.items);\r\n } catch (err) {\r\n console.error('Failed to load users:', err);\r\n } finally {\r\n setLoadingUsers(false);\r\n }\r\n };\r\n\r\n const handleAssignUser = async () => {\r\n if (!roleId || !selectedUserId) return;\r\n setAssigningUser(true);\r\n try {\r\n await adminApi.roles.assignUser(roleId, selectedUserId);\r\n setAddingUser(false);\r\n setSelectedUserId(null);\r\n setSuccess(t('roleDetail.users.assigned'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.assignFailed'));\r\n } finally {\r\n setAssigningUser(false);\r\n }\r\n };\r\n\r\n const handleRemoveUser = async (userId: string) => {\r\n if (!roleId) return;\r\n if (!confirm(t('roleDetail.users.confirmRemove'))) return;\r\n setRemovingUserId(userId);\r\n try {\r\n await adminApi.roles.removeUser(roleId, userId);\r\n setSuccess(t('roleDetail.users.removed'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.removeFailed'));\r\n } finally {\r\n setRemovingUserId(null);\r\n }\r\n };\r\n\r\n // Group assignment functions\r\n const openAddGroup = async () => {\r\n setAddingGroup(true);\r\n setSelectedGroupId(null);\r\n setGroupSearchTerm('');\r\n setLoadingGroups(true);\r\n try {\r\n const data = await groupsApi.getAll();\r\n setAvailableGroups(data);\r\n } catch (err) {\r\n console.error('Failed to load groups:', err);\r\n } finally {\r\n setLoadingGroups(false);\r\n }\r\n };\r\n\r\n const handleAssignGroup = async () => {\r\n if (!roleId || !selectedGroupId) return;\r\n setAssigningGroup(true);\r\n try {\r\n await adminApi.roles.assignGroup(roleId, selectedGroupId);\r\n setAddingGroup(false);\r\n setSelectedGroupId(null);\r\n setSuccess(t('roleDetail.groups.assigned'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.assignFailed'));\r\n } finally {\r\n setAssigningGroup(false);\r\n }\r\n };\r\n\r\n const handleRemoveGroup = async (groupId: string) => {\r\n if (!roleId) return;\r\n if (!confirm(t('roleDetail.groups.confirmRemove'))) return;\r\n setRemovingGroupId(groupId);\r\n try {\r\n await adminApi.roles.removeGroup(roleId, groupId);\r\n setSuccess(t('roleDetail.groups.removed'));\r\n loadRole();\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : t('roleDetail.errors.removeFailed'));\r\n } finally {\r\n setRemovingGroupId(null);\r\n }\r\n };\r\n\r\n const tabs: { id: TabId; label: string; icon: React.ReactNode }[] = [\r\n { id: 'info', label: t('roleDetail.tabs.info'), icon: <Settings className=\"w-4 h-4\" /> },\r\n { id: 'permissions', label: t('roleDetail.tabs.permissions'), icon: <Shield className=\"w-4 h-4\" /> },\r\n { id: 'users', label: t('roleDetail.tabs.users'), icon: <Users className=\"w-4 h-4\" /> },\r\n { id: 'groups', label: t('roleDetail.tabs.groups'), icon: <UsersRound className=\"w-4 h-4\" /> },\r\n { id: 'translations', label: t('roleDetail.tabs.translations'), icon: <Languages className=\"w-4 h-4\" /> }\r\n ];\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (!role) {\r\n return (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-[var(--text-secondary)]\">{t('roleDetail.notFound')}</p>\r\n <button\r\n onClick={() => navigate('/administration/permissions/roles')}\r\n className=\"mt-4 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white\"\r\n >\r\n {t('roleDetail.backToList')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('roles.title', 'Roles'), href: '/administration/permissions/roles' },\r\n { label: role?.name || 'Detail' }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/permissions/roles')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">{role.name}</h1>\r\n {role.isSystem && (\r\n <span className=\"flex items-center gap-1 px-2 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('roles.system')}\r\n </span>\r\n )}\r\n </div>\r\n {role.description && (\r\n <p className=\"text-sm sm:text-base text-[var(--text-secondary)] mt-1\">{role.description}</p>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-4 text-sm text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-4 h-4\" />\r\n <span>{role.users.length} {t('roleDetail.usersCount')}</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <UsersRound className=\"w-4 h-4\" />\r\n <span>{role.groups?.length || 0} {t('roleDetail.groupsCount')}</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Shield className=\"w-4 h-4\" />\r\n <span>{role.permissions.length} {t('roles.permissions')}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)] text-[var(--error-text)] flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)] text-[var(--success-text)] flex items-center gap-2\">\r\n <CheckCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n {success}\r\n </div>\r\n )}\r\n\r\n\r\n {/* Tabs */}\r\n <div className=\"flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {tabs.map(tab => (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveTab(tab.id)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium transition-colors ${\r\n activeTab === tab.id\r\n ? 'bg-[var(--color-accent-600)] text-white'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {tab.icon}\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] p-4 sm:p-6\">\r\n {/* Info Tab */}\r\n {activeTab === 'info' && (\r\n <form onSubmit={handleSaveInfo} className=\"space-y-6 max-w-2xl\">\r\n {/* ID (read-only) */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.id')}\r\n </label>\r\n <div className=\"px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-tertiary)] text-[var(--text-secondary)] font-mono text-sm\">\r\n {role.id}\r\n </div>\r\n </div>\r\n\r\n {/* Name */}\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-primary)] 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 {/* Short Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.shortName')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n required\r\n value={formData.shortName}\r\n onChange={e => setFormData(prev => ({ ...prev, shortName: e.target.value }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\r\n {t('roleDetail.info.shortNameHelp')}\r\n </p>\r\n </div>\r\n\r\n {/* Category */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.category')} *\r\n </label>\r\n <select\r\n value={formData.category}\r\n onChange={e => setFormData(prev => ({ ...prev, category: e.target.value as RoleCategory }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n {ROLE_CATEGORIES.map(cat => (\r\n <option key={cat} value={cat}>\r\n {t(`roleDetail.categories.${cat.toLowerCase()}`)}\r\n </option>\r\n ))}\r\n </select>\r\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\r\n {t('roleDetail.info.categoryHelp')}\r\n </p>\r\n </div>\r\n\r\n {/* Parent Role */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.parentRole')}\r\n </label>\r\n <select\r\n value={formData.parentRoleId || ''}\r\n onChange={e => setFormData(prev => ({ ...prev, parentRoleId: e.target.value || null }))}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"\">{t('roleDetail.info.noParent')}</option>\r\n {availableRoles.map(r => (\r\n <option key={r.id} value={r.id}>\r\n {r.name} ({t(`roleDetail.categories.${r.category.toLowerCase()}`)})\r\n </option>\r\n ))}\r\n </select>\r\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\r\n {t('roleDetail.info.parentRoleHelp')}\r\n </p>\r\n </div>\r\n\r\n {/* Description */}\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-primary)] 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 {/* System Role Badge */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.info.systemRole')}\r\n </label>\r\n <div className=\"flex items-center gap-2\">\r\n {role.isSystem ? (\r\n <span className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-[var(--radius-badge)] text-sm bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n <Lock className=\"w-4 h-4\" />\r\n {t('roleDetail.info.isSystemRole')}\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-[var(--radius-badge)] text-sm bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n {t('roleDetail.info.isCustomRole')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Metadata */}\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 pt-4 border-t border-[var(--border-color)]\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.createdAt')}\r\n </label>\r\n <div className=\"text-sm text-[var(--text-primary)]\">\r\n {new Date(role.createdAt).toLocaleString()}\r\n </div>\r\n </div>\r\n {role.updatedAt && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.updatedAt')}\r\n </label>\r\n <div className=\"text-sm text-[var(--text-primary)]\">\r\n {new Date(role.updatedAt).toLocaleString()}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex justify-end pt-4\">\r\n <button\r\n type=\"submit\"\r\n disabled={saving}\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 disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {/* Permissions Tab - Matrix View */}\r\n {activeTab === 'permissions' && roleId && (\r\n <RolePermissionMatrix roleId={roleId} />\r\n )}\r\n\r\n {/* Groups Tab */}\r\n {activeTab === 'groups' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('roleDetail.groups.title')} ({role.groups?.length || 0})\r\n </h3>\r\n <button\r\n onClick={openAddGroup}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roleDetail.groups.add')}\r\n </button>\r\n </div>\r\n\r\n {(!role.groups || role.groups.length === 0) ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.groups.noGroups')}\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {role.groups.map(group => (\r\n <div\r\n key={group.id}\r\n className=\"flex items-center gap-4 p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\"\r\n >\r\n <Link\r\n to={`/administration/users/groups/${group.id}`}\r\n className=\"flex items-center gap-4 flex-1 min-w-0 hover:opacity-80 transition-opacity\"\r\n >\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] flex items-center justify-center\">\r\n <UsersRound className=\"w-5 h-5 text-[var(--color-accent-700)]\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-[var(--text-primary)] truncate\">{group.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] truncate\">\r\n {group.membersCount} {t('roleDetail.groups.members')}\r\n {group.description && ` · ${group.description}`}\r\n </div>\r\n </div>\r\n </Link>\r\n <button\r\n onClick={() => handleRemoveGroup(group.id)}\r\n disabled={removingGroupId === group.id}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--error-text)] transition-colors disabled:opacity-50\"\r\n title={t('roleDetail.groups.remove')}\r\n >\r\n {removingGroupId === group.id ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Add Group Modal */}\r\n {addingGroup && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] w-full max-w-md 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 {t('roleDetail.groups.addTitle')}\r\n </h2>\r\n <button\r\n onClick={() => setAddingGroup(false)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={groupSearchTerm}\r\n onChange={(e) => setGroupSearchTerm(e.target.value)}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n placeholder={t('roleDetail.groups.searchPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {loadingGroups ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {availableGroups\r\n .filter(g =>\r\n !role.groups?.some(rg => rg.id === g.id) &&\r\n (groupSearchTerm === '' ||\r\n g.name.toLowerCase().includes(groupSearchTerm.toLowerCase()) ||\r\n (g.description || '').toLowerCase().includes(groupSearchTerm.toLowerCase()))\r\n )\r\n .map(group => (\r\n <label\r\n key={group.id}\r\n className={`flex items-center gap-3 cursor-pointer p-3 rounded-[var(--radius-button)] transition-colors ${\r\n selectedGroupId === group.id\r\n ? 'bg-[var(--color-accent-500)]/10 border border-[var(--color-accent-500)]'\r\n : 'hover:bg-[var(--bg-hover)] border border-transparent'\r\n }`}\r\n htmlFor={`group-${group.id}`}\r\n >\r\n <input\r\n id={`group-${group.id}`}\r\n type=\"radio\"\r\n name=\"selectedGroup\"\r\n checked={selectedGroupId === group.id}\r\n onChange={() => setSelectedGroupId(group.id)}\r\n className=\"w-4 h-4 text-[var(--color-accent-600)] focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"text-[var(--text-primary)] font-medium\">{group.name}</span>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">\r\n {group.memberCount} {t('roleDetail.groups.members')}\r\n {group.description && ` · ${group.description}`}\r\n </p>\r\n </div>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setAddingGroup(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 onClick={handleAssignGroup}\r\n disabled={!selectedGroupId || assigningGroup}\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 disabled:opacity-50\"\r\n >\r\n {assigningGroup && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.add')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Users Tab */}\r\n {activeTab === 'users' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('roleDetail.users.title')} ({role.users.length})\r\n </h3>\r\n <button\r\n onClick={openAddUser}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roleDetail.users.add')}\r\n </button>\r\n </div>\r\n\r\n {role.users.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.users.noUsers')}\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {role.users.map(user => (\r\n <div\r\n key={user.id}\r\n className=\"flex items-center gap-4 p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\"\r\n >\r\n <Link\r\n to={`/administration/users/${user.id}`}\r\n className=\"flex items-center gap-4 flex-1 min-w-0 hover:opacity-80 transition-opacity\"\r\n >\r\n <div className=\"w-10 h-10 rounded-full bg-[var(--color-accent-100)] flex items-center justify-center\">\r\n <span className=\"text-sm font-medium text-[var(--color-accent-700)]\">\r\n {user.fullName.split(' ').map(n => n.at(0)).join('').toUpperCase().slice(0, 2)}\r\n </span>\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-[var(--text-primary)] truncate\">{user.fullName}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)] truncate\">{user.email}</div>\r\n </div>\r\n </Link>\r\n <button\r\n onClick={() => handleRemoveUser(user.id)}\r\n disabled={removingUserId === user.id}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--error-text)] transition-colors disabled:opacity-50\"\r\n title={t('roleDetail.users.remove')}\r\n >\r\n {removingUserId === user.id ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Trash2 className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Add User Modal */}\r\n {addingUser && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] w-full max-w-md 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 {t('roleDetail.users.addTitle')}\r\n </h2>\r\n <button\r\n onClick={() => setAddingUser(false)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={userSearchTerm}\r\n onChange={(e) => setUserSearchTerm(e.target.value)}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n placeholder={t('roleDetail.users.searchPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {loadingUsers ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {availableUsers\r\n .filter(u =>\r\n !role.users.some(ru => ru.id === u.id) &&\r\n (userSearchTerm === '' ||\r\n u.fullName.toLowerCase().includes(userSearchTerm.toLowerCase()) ||\r\n u.email.toLowerCase().includes(userSearchTerm.toLowerCase()))\r\n )\r\n .map(user => (\r\n <label\r\n key={user.id}\r\n className={`flex items-center gap-3 cursor-pointer p-3 rounded-[var(--radius-button)] transition-colors ${\r\n selectedUserId === user.id\r\n ? 'bg-[var(--color-accent-500)]/10 border border-[var(--color-accent-500)]'\r\n : 'hover:bg-[var(--bg-hover)] border border-transparent'\r\n }`}\r\n htmlFor={`user-${user.id}`}\r\n >\r\n <input\r\n id={`user-${user.id}`}\r\n type=\"radio\"\r\n name=\"selectedUser\"\r\n checked={selectedUserId === user.id}\r\n onChange={() => setSelectedUserId(user.id)}\r\n className=\"w-4 h-4 text-[var(--color-accent-600)] focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"text-[var(--text-primary)] font-medium\">{user.fullName}</span>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{user.email}</p>\r\n </div>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={() => setAddingUser(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 onClick={handleAssignUser}\r\n disabled={!selectedUserId || assigningUser}\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 disabled:opacity-50\"\r\n >\r\n {assigningUser && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.add')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Translations Tab */}\r\n {activeTab === 'translations' && (\r\n <div className=\"space-y-6\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('roleDetail.translations.title')} ({translations.length})\r\n </h3>\r\n {availableLanguages.length > 0 && (\r\n <button\r\n onClick={() => setShowAddTranslation(true)}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('roleDetail.translations.add')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Add new translation form */}\r\n {showAddTranslation && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--color-accent-500)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h4 className=\"font-medium text-[var(--text-primary)]\">\r\n {t('roleDetail.translations.addNew')}\r\n </h4>\r\n <button\r\n onClick={cancelEditTranslation}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)]\"\r\n >\r\n <X className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n </button>\r\n </div>\r\n <div className=\"grid gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.language')}\r\n </label>\r\n <select\r\n value={newTranslationLang}\r\n onChange={e => setNewTranslationLang(e.target.value)}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n >\r\n <option value=\"\">{t('roleDetail.translations.selectLanguage')}</option>\r\n {availableLanguages.map(lang => (\r\n <option key={lang.code} value={lang.code}>{lang.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n {newTranslationLang && (\r\n <>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.name}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.shortName')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.shortName}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, shortName: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.description')}\r\n </label>\r\n <textarea\r\n value={translationForm.description || ''}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] resize-none\"\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={cancelEditTranslation}\r\n className=\"px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] text-sm font-medium\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={() => handleSaveTranslation(newTranslationLang)}\r\n disabled={savingTranslation || !translationForm.name || !translationForm.shortName}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium disabled:opacity-50\"\r\n >\r\n {savingTranslation && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {loadingTranslations && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loadingTranslations && translations.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('roleDetail.translations.noTranslations')}\r\n </div>\r\n )}\r\n {!loadingTranslations && translations.length > 0 && (\r\n <div className=\"space-y-3\">\r\n {translations.map(trans => {\r\n const langInfo = SUPPORTED_LANGUAGES.find(l => l.code === trans.languageCode);\r\n const isEditing = editingTranslation === trans.languageCode;\r\n\r\n return (\r\n <div\r\n key={trans.languageCode}\r\n className={`p-4 rounded-[var(--radius-card)] border ${\r\n isEditing\r\n ? 'bg-[var(--bg-primary)] border-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-primary)] border-[var(--border-color)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"px-2 py-0.5 text-xs font-medium rounded bg-[var(--bg-tertiary)] text-[var(--text-secondary)] uppercase\">\r\n {trans.languageCode}\r\n </span>\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {langInfo?.label || trans.languageCode}\r\n </span>\r\n </div>\r\n {!isEditing && (\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={() => startEditTranslation(trans)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--color-accent-600)]\"\r\n title={t('common.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleDeleteTranslation(trans.languageCode)}\r\n className=\"p-1.5 rounded hover:bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:text-[var(--error-text)]\"\r\n title={t('common.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {isEditing ? (\r\n <div className=\"grid gap-3 mt-3\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.name}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.shortName')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={translationForm.shortName}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, shortName: e.target.value }))}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('roleDetail.translations.description')}\r\n </label>\r\n <textarea\r\n value={translationForm.description || ''}\r\n onChange={e => setTranslationForm(prev => ({ ...prev, description: e.target.value }))}\r\n rows={2}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] resize-none\"\r\n />\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n onClick={cancelEditTranslation}\r\n className=\"px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--bg-tertiary)] hover:bg-[var(--bg-hover)] text-[var(--text-primary)] text-sm font-medium\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button\r\n onClick={() => handleSaveTranslation(trans.languageCode)}\r\n disabled={savingTranslation || !translationForm.name || !translationForm.shortName}\r\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)] text-white text-sm font-medium disabled:opacity-50\"\r\n >\r\n {savingTranslation && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-1\">\r\n <div className=\"font-medium text-[var(--text-primary)]\">{trans.name}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('roleDetail.translations.shortName')}: {trans.shortName}\r\n </div>\r\n {trans.description && (\r\n <div className=\"text-sm text-[var(--text-tertiary)] mt-1\">{trans.description}</div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ACTION_ICONS","jsx","Shield","Eye","Plus","Edit","Trash2","UserPlus","Play","ACTION_COLORS","applyApplicationModuleFilterHelper","grouped","applicationFilter","moduleFilter","app","m","applyStatusFilterHelper","statusFilters","getModuleStatus","status","SectionResourceRows","section","resources","moduleIndex","sectionIndex","collapsedSections","renderResourceRow","hasResources","isSectionCollapsed","jsxs","React","resource","resourceIndex","RolePermissionMatrix","roleId","t","useTranslation","user","useAuth","collapsedApps","toggleApp","useCollapsibleState","collapsedModules","setCollapsedModules","useState","setCollapsedSections","setStatusFilters","openPopover","setOpenPopover","setApplicationFilter","setModuleFilter","canEditSystemRoles","useMemo","hasFullAccess","loading","error","roles","filteredResources","hasChanges","saving","saveSuccess","saveError","togglePermission","saveChanges","resetChanges","getPermissionInheritance","usePermissionMatrix","role","r","isRoleEditable","toggleStatusFilter","prev","next","toggleModule","moduleId","toggleSection","sectionId","filterOptions","applications","modules","appKey","a","b","handleTogglePermission","useCallback","permissionId","isPermissionGrantedFn","info","moduleWithSections","calculateModuleWithSectionsStatus","getResourceStatus","calculatePermissionStatus","getGrantedPermissions","p","applyApplicationModuleFilter","applyStatusFilter","groupedResources","groupByApplicationWithSections","totalModuleCount","sum","handleToggleCollapse","resourceId","level","handleCellClick","Loader2","AlertCircle","getRoleResourceIcon","Database","FileText","Box","getRoleResourceLabelClass","getRolePaddingClass","renderToggleButton","hasChildren","isCollapsed","ChevronRight","ChevronDown","renderPermissionBadges","grantedPermissions","action","actionColor","icon","rowIndex","grantedCount","isPopoverOpen","buttonRef","createRef","cellBg","getPermissionCellBackground","paddingLeft","rowBgClass","PermissionStatusIndicator","PermissionPopover","_","permId","Check","X","Save","e","mod","Star","Ban","appGroup","isAppCollapsed","FolderOpen","module","sections","hasSections","isModuleCollapsed","sectionWithResources","SUPPORTED_LANGUAGES","RoleDetailPage","useParams","navigate","useNavigate","setRole","setLoading","setSaving","activeTab","setActiveTab","setError","success","setSuccess","formData","setFormData","availableRoles","setAvailableRoles","ROLE_CATEGORIES","translations","setTranslations","loadingTranslations","setLoadingTranslations","editingTranslation","setEditingTranslation","translationForm","setTranslationForm","savingTranslation","setSavingTranslation","showAddTranslation","setShowAddTranslation","newTranslationLang","setNewTranslationLang","addingUser","setAddingUser","availableUsers","setAvailableUsers","loadingUsers","setLoadingUsers","userSearchTerm","setUserSearchTerm","selectedUserId","setSelectedUserId","assigningUser","setAssigningUser","removingUserId","setRemovingUserId","addingGroup","setAddingGroup","availableGroups","setAvailableGroups","loadingGroups","setLoadingGroups","groupSearchTerm","setGroupSearchTerm","selectedGroupId","setSelectedGroupId","assigningGroup","setAssigningGroup","removingGroupId","setRemovingGroupId","loadRole","roleData","rolesData","adminApi","err","useEffect","handleSaveInfo","updateData","loadTranslations","data","startEditTranslation","trans","cancelEditTranslation","handleSaveTranslation","languageCode","handleDeleteTranslation","availableLanguages","lang","openAddUser","handleAssignUser","handleRemoveUser","userId","openAddGroup","groupsApi","handleAssignGroup","handleRemoveGroup","groupId","tabs","Settings","Users","UsersRound","Languages","Breadcrumb","ArrowLeft","Lock","AlertTriangle","CheckCircle","tab","cat","group","Link","Search","g","rg","n","u","ru","Fragment","langInfo","l","isEditing","Edit2"],"mappings":"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"}
|