@atlashub/smartstack 3.30.0 → 3.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-DJb49NMA.js → AgentSkillsPage-BMxOA-nm.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-DJb49NMA.js.map → AgentSkillsPage-BMxOA-nm.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-CVq3qZoe.js → AgentSkillsPage-DSwfoazB.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-CVq3qZoe.js.map → AgentSkillsPage-DSwfoazB.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-oHEi-sFh.js → AgentWorkloadPage-B_emq8kd.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-oHEi-sFh.js.map → AgentWorkloadPage-B_emq8kd.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D_nk3gKj.js → AgentWorkloadPage-_USTeYWz.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D_nk3gKj.js.map → AgentWorkloadPage-_USTeYWz.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-Cr0q2HnB.js → ApiCatalogDetailPage-BC_HxVu5.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-Cr0q2HnB.js.map → ApiCatalogDetailPage-BC_HxVu5.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-DX8buBkV.js → ApiCatalogDetailPage-BI7zyZAd.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-DX8buBkV.js.map → ApiCatalogDetailPage-BI7zyZAd.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-DqboIzZE.js → ApiCatalogPage-CutaHo5K.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-DqboIzZE.js.map → ApiCatalogPage-CutaHo5K.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-DN7sazvI.js → ApiCatalogPage-M80MorHU.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-DN7sazvI.js.map → ApiCatalogPage-M80MorHU.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage--9YwwS5A.js → ApplicationDetailPage-DVY0wua0.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage--9YwwS5A.js.map → ApplicationDetailPage-DVY0wua0.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CCNjr64K.js → ApplicationDetailPage-DzszwaIZ.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-CCNjr64K.js.map → ApplicationDetailPage-DzszwaIZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-Bs-Xgca4.js → ApplicationsDashboardPage-B3ptvnJz.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-Bs-Xgca4.js.map → ApplicationsDashboardPage-B3ptvnJz.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BSsHN3Yj.js → ApplicationsDashboardPage-D0pxqbEc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BSsHN3Yj.js.map → ApplicationsDashboardPage-D0pxqbEc.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DDysNWJ5.js → ApplicationsGridPage-Ca23FBSP.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DDysNWJ5.js.map → ApplicationsGridPage-Ca23FBSP.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-s1WEzOXS.js → ApplicationsGridPage-qi2UCD24.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-s1WEzOXS.js.map → ApplicationsGridPage-qi2UCD24.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-B3CSMiV0.js → ApplicationsListPage-CEUmBXN0.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-B3CSMiV0.js.map → ApplicationsListPage-CEUmBXN0.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-B6ZCecIl.js → ApplicationsListPage-cE82bv8j.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-B6ZCecIl.js.map → ApplicationsListPage-cE82bv8j.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-ztPwoAGt.js → ApplicationsPage-DW1BrVVN.js} +4 -4
- package/dist/chunks/{ApplicationsPage-ztPwoAGt.js.map → ApplicationsPage-DW1BrVVN.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BBaiBM--.js → ApplicationsPage-RAqTs5HI.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BBaiBM--.js.map → ApplicationsPage-RAqTs5HI.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CK4L4rBO.js → AssignmentRulesPage-C0qnk3oR.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CK4L4rBO.js.map → AssignmentRulesPage-C0qnk3oR.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-DFSVFFXr.js → AssignmentRulesPage-CVgFmhEs.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-DFSVFFXr.js.map → AssignmentRulesPage-CVgFmhEs.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-JCLpyg94.js → AssignmentsPage-Bv9HYtYN.js} +2 -2
- package/dist/chunks/{AssignmentsPage-JCLpyg94.js.map → AssignmentsPage-Bv9HYtYN.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-Bp7oQD7Q.js → AssignmentsPage-z1q1C9Uz.js} +2 -2
- package/dist/chunks/{AssignmentsPage-Bp7oQD7Q.js.map → AssignmentsPage-z1q1C9Uz.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-Bl9xlJ3h.js → AuthCallbackPage-CcteN6Kv.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-Bl9xlJ3h.js.map → AuthCallbackPage-CcteN6Kv.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-CzMHz4jy.js → AuthCallbackPage-DL5PJUYJ.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-CzMHz4jy.js.map → AuthCallbackPage-DL5PJUYJ.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-D_8T1vqV.js → ConfirmEmailPage-BP8VUz-A.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-D_8T1vqV.js.map → ConfirmEmailPage-BP8VUz-A.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-M7mJgXvn.js → ConfirmEmailPage-CeflKXpN.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-M7mJgXvn.js.map → ConfirmEmailPage-CeflKXpN.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-BNEGavlu.js → CreateSupportTicketPage-BAdvWb_8.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-BNEGavlu.js.map → CreateSupportTicketPage-BAdvWb_8.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-C2X2mfds.js → CreateSupportTicketPage-DDiv79-p.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-C2X2mfds.js.map → CreateSupportTicketPage-DDiv79-p.js.map} +1 -1
- package/dist/chunks/{DashboardPage-4oy2YqvT.js → DashboardPage-B_uyyRRE.js} +2 -2
- package/dist/chunks/{DashboardPage-4oy2YqvT.js.map → DashboardPage-B_uyyRRE.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CPArUG-S.js → DashboardPage-CpoduSu7.js} +2 -2
- package/dist/chunks/{DashboardPage-CPArUG-S.js.map → DashboardPage-CpoduSu7.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CO-8B8EI.js → DashboardPage-D4pyUgdM.js} +3 -3
- package/dist/chunks/{DashboardPage-CO-8B8EI.js.map → DashboardPage-D4pyUgdM.js.map} +1 -1
- package/dist/chunks/{DashboardPage-D5MRMxEV.js → DashboardPage-Kp-MCxW4.js} +3 -3
- package/dist/chunks/{DashboardPage-D5MRMxEV.js.map → DashboardPage-Kp-MCxW4.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DnjLFXnL.js → EscalationConfigPage-D-WCN6YS.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DnjLFXnL.js.map → EscalationConfigPage-D-WCN6YS.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CwdnfJbJ.js → EscalationConfigPage-UrLJarSI.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CwdnfJbJ.js.map → EscalationConfigPage-UrLJarSI.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-sh-3h_H9.js → ForceChangePasswordPage-BIh1SF5C.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-sh-3h_H9.js.map → ForceChangePasswordPage-BIh1SF5C.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-ZEIfyqwE.js → ForceChangePasswordPage-FFZZRpU7.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-ZEIfyqwE.js.map → ForceChangePasswordPage-FFZZRpU7.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-B4M6-xeM.js → ForgotPasswordPage-BKqRF7SF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-B4M6-xeM.js.map → ForgotPasswordPage-BKqRF7SF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-MIu-U7p0.js → ForgotPasswordPage-BXp8qQUX.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-MIu-U7p0.js.map → ForgotPasswordPage-BXp8qQUX.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-4XK3Bs_r.js → GroupDetailPage-a0hBx-LO.js} +5 -5
- package/dist/chunks/{GroupDetailPage-4XK3Bs_r.js.map → GroupDetailPage-a0hBx-LO.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-C-kvtd2T.js → GroupDetailPage-eGGJCqgq.js} +2 -2
- package/dist/chunks/{GroupDetailPage-C-kvtd2T.js.map → GroupDetailPage-eGGJCqgq.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-CP41FzHi.js → MyAccessRequestsPage-BgQSyy5d.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-CP41FzHi.js.map → MyAccessRequestsPage-BgQSyy5d.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-DzrXTrVi.js → MyAccessRequestsPage-Dmb0rUHO.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-DzrXTrVi.js.map → MyAccessRequestsPage-Dmb0rUHO.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-V_SwYio2.js → MyTenantsPage-BZTeqyDr.js} +3 -3
- package/dist/chunks/{MyTenantsPage-V_SwYio2.js.map → MyTenantsPage-BZTeqyDr.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-CZRkMbh8.js → MyTenantsPage-kCHBF2uA.js} +2 -2
- package/dist/chunks/{MyTenantsPage-CZRkMbh8.js.map → MyTenantsPage-kCHBF2uA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DOUhaLal.js → MyTicketsPage-BwNIqpCE.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DOUhaLal.js.map → MyTicketsPage-BwNIqpCE.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DnvAIeyr.js → MyTicketsPage-CTpjkA5t.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DnvAIeyr.js.map → MyTicketsPage-CTpjkA5t.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DfTa4jCG.js → NavigationAppsPage-DO5bTibb.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DfTa4jCG.js.map → NavigationAppsPage-DO5bTibb.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DXvpLsbt.js → NavigationAppsPage-vx_n07SD.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DXvpLsbt.js.map → NavigationAppsPage-vx_n07SD.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-I1yCk7tk.js → NotificationsPage-Br9sb9AQ.js} +2 -2
- package/dist/chunks/{NotificationsPage-I1yCk7tk.js.map → NotificationsPage-Br9sb9AQ.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-D76MdAs-.js → NotificationsPage-CRhd752L.js} +2 -2
- package/dist/chunks/{NotificationsPage-D76MdAs-.js.map → NotificationsPage-CRhd752L.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DtWUPCh3.js → OnboardingWizardPage-BIl3Usew.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DtWUPCh3.js.map → OnboardingWizardPage-BIl3Usew.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BRUzcl1A.js → OnboardingWizardPage-CjqxWX7h.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BRUzcl1A.js.map → OnboardingWizardPage-CjqxWX7h.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-DJJGbXoX.js → PermissionDetailPage-COIuJXH-.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-DJJGbXoX.js.map → PermissionDetailPage-COIuJXH-.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-CUNKbl7t.js → PermissionDetailPage-P_d6xnY0.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-CUNKbl7t.js.map → PermissionDetailPage-P_d6xnY0.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-B8wmawPV.js → PermissionsPage-BhjnMyFY.js} +2 -2
- package/dist/chunks/{PermissionsPage-B8wmawPV.js.map → PermissionsPage-BhjnMyFY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-Dbjcctuh.js → PermissionsPage-CHYy8XFr.js} +2 -2
- package/dist/chunks/{PermissionsPage-Dbjcctuh.js.map → PermissionsPage-CHYy8XFr.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-zii0ll57.js → PortalDashboardPage-BwQ4NQrH.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-zii0ll57.js.map → PortalDashboardPage-BwQ4NQrH.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-BeNfBZmb.js → PortalDashboardPage-hLJcfGnT.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-BeNfBZmb.js.map → PortalDashboardPage-hLJcfGnT.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BmvrBaAD.js → PreferencesPage-DYYqisR0.js} +2 -2
- package/dist/chunks/{PreferencesPage-BmvrBaAD.js.map → PreferencesPage-DYYqisR0.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BCpuIGzv.js → PreferencesPage-DzpM-lpD.js} +2 -2
- package/dist/chunks/{PreferencesPage-BCpuIGzv.js.map → PreferencesPage-DzpM-lpD.js.map} +1 -1
- package/dist/chunks/{ProfilePage-eowQd59_.js → ProfilePage-D98bvXeT.js} +2 -2
- package/dist/chunks/{ProfilePage-eowQd59_.js.map → ProfilePage-D98bvXeT.js.map} +1 -1
- package/dist/chunks/{ProfilePage-mf5wI0-n.js → ProfilePage-DWRDN0fo.js} +2 -2
- package/dist/chunks/{ProfilePage-mf5wI0-n.js.map → ProfilePage-DWRDN0fo.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-CLsaUNqA.js → ReferencesManagementPage-B0Cq9BHS.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-CLsaUNqA.js.map → ReferencesManagementPage-B0Cq9BHS.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-8UPgkVE8.js → ReferencesManagementPage-CxbfOBs2.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-8UPgkVE8.js.map → ReferencesManagementPage-CxbfOBs2.js.map} +1 -1
- package/dist/chunks/{RegisterPage-57X-ILDb.js → RegisterPage-DMeq3GzW.js} +2 -2
- package/dist/chunks/{RegisterPage-57X-ILDb.js.map → RegisterPage-DMeq3GzW.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CNyHSbqs.js → RegisterPage-DvG2Php7.js} +2 -2
- package/dist/chunks/{RegisterPage-CNyHSbqs.js.map → RegisterPage-DvG2Php7.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-JW8-mh_k.js → ResetPasswordPage-DOTswepm.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-JW8-mh_k.js.map → ResetPasswordPage-DOTswepm.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CyV8l-Zo.js → ResetPasswordPage-ntMMFvDo.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CyV8l-Zo.js.map → ResetPasswordPage-ntMMFvDo.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-wddG59kg.js → ResolutionModal-CKt73sIZ.js} +2 -2
- package/dist/chunks/{ResolutionModal-wddG59kg.js.map → ResolutionModal-CKt73sIZ.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-CjwE73NX.js → ResolutionModal-XGHCELez.js} +2 -2
- package/dist/chunks/{ResolutionModal-CjwE73NX.js.map → ResolutionModal-XGHCELez.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CrioVHFI.js → RoleDetailPage-BtnYTVN6.js} +3 -3
- package/dist/chunks/{RoleDetailPage-CrioVHFI.js.map → RoleDetailPage-BtnYTVN6.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-TUOGR1ow.js → RoleDetailPage-DAp65p0d.js} +2 -2
- package/dist/chunks/{RoleDetailPage-TUOGR1ow.js.map → RoleDetailPage-DAp65p0d.js.map} +1 -1
- package/dist/chunks/{RolesPage-CAcols3D.js → RolesPage-DyEhJHxw.js} +2 -2
- package/dist/chunks/{RolesPage-CAcols3D.js.map → RolesPage-DyEhJHxw.js.map} +1 -1
- package/dist/chunks/{RolesPage-sJBWaNff.js → RolesPage-FmZCLEYo.js} +2 -2
- package/dist/chunks/{RolesPage-sJBWaNff.js.map → RolesPage-FmZCLEYo.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BPGRloOS.js → SlaConfigPage-DTtP2Q4t.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BPGRloOS.js.map → SlaConfigPage-DTtP2Q4t.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-D5TRn7Ir.js → SlaConfigPage-LpVD_ai4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-D5TRn7Ir.js.map → SlaConfigPage-LpVD_ai4.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-UXmYLrIq.js → SupportPermissionsPage-BV8F_Tl3.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-UXmYLrIq.js.map → SupportPermissionsPage-BV8F_Tl3.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-Dc2bWTzG.js → SupportPermissionsPage-Bzfq6pKf.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-Dc2bWTzG.js.map → SupportPermissionsPage-Bzfq6pKf.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-nTY85sNA.js → TemplatesPage-CYHH5WlP.js} +2 -2
- package/dist/chunks/{TemplatesPage-nTY85sNA.js.map → TemplatesPage-CYHH5WlP.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-dmPlqqiD.js → TemplatesPage-czt_RH5f.js} +2 -2
- package/dist/chunks/{TemplatesPage-dmPlqqiD.js.map → TemplatesPage-czt_RH5f.js.map} +1 -1
- package/dist/chunks/{TenantCard-BhT-31ls.js → TenantCard-Bqh5PGJx.js} +2 -2
- package/dist/chunks/{TenantCard-BhT-31ls.js.map → TenantCard-Bqh5PGJx.js.map} +1 -1
- package/dist/chunks/{TenantCard-BUXfstRZ.js → TenantCard-C6qKD480.js} +2 -2
- package/dist/chunks/{TenantCard-BUXfstRZ.js.map → TenantCard-C6qKD480.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-B-SRDR2R.js → TenantScopeSelector-DWUP8Le7.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-B-SRDR2R.js.map → TenantScopeSelector-DWUP8Le7.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-3_mzBLNI.js → TenantScopeSelector-DxQ7HNbh.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-3_mzBLNI.js.map → TenantScopeSelector-DxQ7HNbh.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-xN3wPnFL.js → TicketDetailPage-BuxXLcJi.js} +2 -2
- package/dist/chunks/{TicketDetailPage-xN3wPnFL.js.map → TicketDetailPage-BuxXLcJi.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-B4cR3rOC.js → TicketDetailPage-Dy4pg33-.js} +2 -2
- package/dist/chunks/{TicketDetailPage-B4cR3rOC.js.map → TicketDetailPage-Dy4pg33-.js.map} +1 -1
- package/dist/chunks/{TicketsPage-CkHgXSxU.js → TicketsPage-Ck-HUgte.js} +2 -2
- package/dist/chunks/{TicketsPage-CkHgXSxU.js.map → TicketsPage-Ck-HUgte.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Dwi2xpMI.js → TicketsPage-jlN9JDzm.js} +2 -2
- package/dist/chunks/{TicketsPage-Dwi2xpMI.js.map → TicketsPage-jlN9JDzm.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-D2a3EOey.js → UserCreateTicketPage-BrRZyXMn.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-D2a3EOey.js.map → UserCreateTicketPage-BrRZyXMn.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-bcbSLglE.js → UserCreateTicketPage-D58Ro4Nb.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-bcbSLglE.js.map → UserCreateTicketPage-D58Ro4Nb.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-DwnDRNoW.js → UserDashboardPage-C5ulSzaI.js} +2 -2
- package/dist/chunks/{UserDashboardPage-DwnDRNoW.js.map → UserDashboardPage-C5ulSzaI.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-ZMsx8LWw.js → UserDashboardPage-CjAx5OHh.js} +2 -2
- package/dist/chunks/{UserDashboardPage-ZMsx8LWw.js.map → UserDashboardPage-CjAx5OHh.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BRFowOFL.js → UserDetailPage-Bhpry9xq.js} +2 -2
- package/dist/chunks/{UserDetailPage-BRFowOFL.js.map → UserDetailPage-Bhpry9xq.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CZyV-zsg.js → UserDetailPage-DUu2mA_n.js} +5 -5
- package/dist/chunks/{UserDetailPage-CZyV-zsg.js.map → UserDetailPage-DUu2mA_n.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-DzB_pELt.js → UserTicketDetailPage-DpFFjIso.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-DzB_pELt.js.map → UserTicketDetailPage-DpFFjIso.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-BstGk_BP.js → UserTicketDetailPage-YJvBWFEu.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-BstGk_BP.js.map → UserTicketDetailPage-YJvBWFEu.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-DTmhzttW.js → UsersGroupsPage-b2PTQX_m.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-DTmhzttW.js.map → UsersGroupsPage-b2PTQX_m.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BygTv_kK.js → UsersGroupsPage-l33K3Nca.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-BygTv_kK.js.map → UsersGroupsPage-l33K3Nca.js.map} +1 -1
- package/dist/chunks/{UsersPage-TIqSHgHj.js → UsersPage-BjC5ZqTa.js} +2 -2
- package/dist/chunks/{UsersPage-TIqSHgHj.js.map → UsersPage-BjC5ZqTa.js.map} +1 -1
- package/dist/chunks/{UsersPage-DcwLyMAX.js → UsersPage-NsTukS8m.js} +2 -2
- package/dist/chunks/{UsersPage-DcwLyMAX.js.map → UsersPage-NsTukS8m.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-B6dsJzvH.js → accessRequestsApi-C2usKVGJ.js} +2 -2
- package/dist/chunks/{accessRequestsApi-B6dsJzvH.js.map → accessRequestsApi-C2usKVGJ.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-3FjMFbpa.js → accessRequestsApi-LuovcP6l.js} +2 -2
- package/dist/chunks/{accessRequestsApi-3FjMFbpa.js.map → accessRequestsApi-LuovcP6l.js.map} +1 -1
- package/dist/chunks/{aiApi-DXOdsoxr.js → aiApi-B03u3zUH.js} +2 -2
- package/dist/chunks/{aiApi-DXOdsoxr.js.map → aiApi-B03u3zUH.js.map} +1 -1
- package/dist/chunks/{aiApi-9G4wG_mT.js → aiApi-Cwg0B8PJ.js} +2 -2
- package/dist/chunks/{aiApi-9G4wG_mT.js.map → aiApi-Cwg0B8PJ.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-DhOd6idI.js → applicationAnalyticsApi-BobBdehV.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-DhOd6idI.js.map → applicationAnalyticsApi-BobBdehV.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-D0DEp9Y-.js → applicationAnalyticsApi-jCZhWKOx.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-D0DEp9Y-.js.map → applicationAnalyticsApi-jCZhWKOx.js.map} +1 -1
- package/dist/chunks/{groupsApi-Db8G2lLs.js → groupsApi-CoxnW9vH.js} +2 -2
- package/dist/chunks/{groupsApi-Db8G2lLs.js.map → groupsApi-CoxnW9vH.js.map} +1 -1
- package/dist/chunks/{groupsApi-lbxNsHFv.js → groupsApi-D2lFFcgu.js} +2 -2
- package/dist/chunks/{groupsApi-lbxNsHFv.js.map → groupsApi-D2lFFcgu.js.map} +1 -1
- package/dist/chunks/{index-xhRXN1Jq.js → index-B5U_Jp0-.js} +2 -2
- package/dist/chunks/{index-xhRXN1Jq.js.map → index-B5U_Jp0-.js.map} +1 -1
- package/dist/chunks/{index-Bn8HzILk.js → index-BDB_a-p7.js} +4 -4
- package/dist/chunks/{index-Bn8HzILk.js.map → index-BDB_a-p7.js.map} +1 -1
- package/dist/chunks/{index-DF93KQFR.js → index-BbHRJz-n.js} +2 -2
- package/dist/chunks/{index-DF93KQFR.js.map → index-BbHRJz-n.js.map} +1 -1
- package/dist/chunks/{index-DqbVFB1H.js → index-CI2WU5ZZ.js} +2 -2
- package/dist/chunks/{index-DqbVFB1H.js.map → index-CI2WU5ZZ.js.map} +1 -1
- package/dist/chunks/{index-DjC1u2hI.js → index-CLk9ClC2.js} +3 -3
- package/dist/chunks/{index-DjC1u2hI.js.map → index-CLk9ClC2.js.map} +1 -1
- package/dist/chunks/{index-CgtbaFf5.js → index-CmTKGOa_.js} +2 -2
- package/dist/chunks/{index-CgtbaFf5.js.map → index-CmTKGOa_.js.map} +1 -1
- package/dist/chunks/{index-DwqLhQ8S.js → index-D5oIr6PO.js} +2 -2
- package/dist/chunks/{index-DwqLhQ8S.js.map → index-D5oIr6PO.js.map} +1 -1
- package/dist/chunks/{index-CTGSmYvs.js → index-DC6TBJV_.js} +2 -2
- package/dist/chunks/{index-CTGSmYvs.js.map → index-DC6TBJV_.js.map} +1 -1
- package/dist/chunks/{index-CN2WRyg1.js → index-DN97bp_f.js} +1145 -1108
- package/dist/chunks/index-DN97bp_f.js.map +1 -0
- package/dist/chunks/{index-DUS-tunb.js → index-DRW5qV_L.js} +2 -2
- package/dist/chunks/{index-DUS-tunb.js.map → index-DRW5qV_L.js.map} +1 -1
- package/dist/chunks/{index-DLekpNSE.js → index-DcLZao1q.js} +2 -2
- package/dist/chunks/{index-DLekpNSE.js.map → index-DcLZao1q.js.map} +1 -1
- package/dist/chunks/{index-HsAOBno4.js → index-DcMOmGtX.js} +2 -2
- package/dist/chunks/{index-HsAOBno4.js.map → index-DcMOmGtX.js.map} +1 -1
- package/dist/chunks/{index-cAikSVW0.js → index-DnML-nfd.js} +10 -10
- package/dist/chunks/index-DnML-nfd.js.map +1 -0
- package/dist/chunks/{index-DEtq-xUL.js → index-Drd59qAP.js} +8 -8
- package/dist/chunks/{index-DEtq-xUL.js.map → index-Drd59qAP.js.map} +1 -1
- package/dist/chunks/{index-TiWOcC0g.js → index-EiIHjIgi.js} +2 -2
- package/dist/chunks/{index-TiWOcC0g.js.map → index-EiIHjIgi.js.map} +1 -1
- package/dist/chunks/{index-D0HS542b.js → index-axYz6ptj.js} +2 -2
- package/dist/chunks/{index-D0HS542b.js.map → index-axYz6ptj.js.map} +1 -1
- package/dist/chunks/{index-BI2dc1FS.js → index-lXrXnhFc.js} +2 -2
- package/dist/chunks/{index-BI2dc1FS.js.map → index-lXrXnhFc.js.map} +1 -1
- package/dist/chunks/{index-CUICSveU.js → index-rI-1r6c2.js} +2 -2
- package/dist/chunks/{index-CUICSveU.js.map → index-rI-1r6c2.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-__FKj6CN.js → tenantIconMap-B4wAYGWP.js} +2 -2
- package/dist/chunks/{tenantIconMap-__FKj6CN.js.map → tenantIconMap-B4wAYGWP.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-CHeS7oLt.js → tenantIconMap-Cfm15HwB.js} +2 -2
- package/dist/chunks/{tenantIconMap-CHeS7oLt.js.map → tenantIconMap-Cfm15HwB.js.map} +1 -1
- package/dist/chunks/{ticketingApi-DF4RwD_6.js → ticketingApi-CLMAPZDw.js} +2 -2
- package/dist/chunks/{ticketingApi-DF4RwD_6.js.map → ticketingApi-CLMAPZDw.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Cj239hYB.js → ticketingApi-CTap4NdE.js} +2 -2
- package/dist/chunks/{ticketingApi-Cj239hYB.js.map → ticketingApi-CTap4NdE.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-CViOUwyF.js → useAccessRequests-CBpDkq9o.js} +2 -2
- package/dist/chunks/{useAccessRequests-CViOUwyF.js.map → useAccessRequests-CBpDkq9o.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-CFam8zFR.js → useAccessRequests-Cj2-OoAW.js} +3 -3
- package/dist/chunks/{useAccessRequests-CFam8zFR.js.map → useAccessRequests-Cj2-OoAW.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-CslSQeBJ.js → useUserAccessRequests-C6l2VMe1.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-CslSQeBJ.js.map → useUserAccessRequests-C6l2VMe1.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-B-Cs6NX1.js → useUserAccessRequests-Ds3K-ENU.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-B-Cs6NX1.js.map → useUserAccessRequests-Ds3K-ENU.js.map} +1 -1
- package/dist/components/routing/DynamicRouter.d.ts.map +1 -1
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/contexts/NavigationContext.d.ts.map +1 -1
- package/dist/extensions/PageRegistry.d.ts +2 -0
- package/dist/extensions/PageRegistry.d.ts.map +1 -1
- package/dist/services/api/adminApi/settings.d.ts +8 -3
- package/dist/services/api/adminApi/settings.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-CN2WRyg1.js.map +0 -1
- package/dist/chunks/index-cAikSVW0.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersGroupsPage-BygTv_kK.js","sources":["../../src/pages/platform/administration/users/UsersGroupsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link, useNavigate } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport {\r\n Building2,\r\n RefreshCw,\r\n Loader2,\r\n AlertTriangle,\r\n Search,\r\n Users,\r\n Shield,\r\n Plus,\r\n X,\r\n ChevronDown,\r\n ChevronUp,\r\n LayoutGrid,\r\n List,\r\n Filter,\r\n Cloud,\r\n CloudOff,\r\n Trash2,\r\n Check,\r\n GitBranch,\r\n CornerDownRight,\r\n} from 'lucide-react';\r\nimport {\r\n groupsApi,\r\n type GroupListDto,\r\n type GroupMemberDto,\r\n type GroupRoleDto,\r\n} from '@/services/api/groupsApi';\r\nimport { adminApi, type RoleListDto } from '@/services/api/adminApi';\r\n\r\ntype ViewMode = 'cards' | 'table';\r\ntype GroupTypeFilter = 'all' | 'security' | 'distribution';\r\ntype SyncFilter = 'all' | 'local' | 'synced';\r\n\r\ninterface GroupWithDetails extends GroupListDto {\r\n membersLoaded?: GroupMemberDto[];\r\n rolesLoaded?: GroupRoleDto[];\r\n}\r\n\r\nconst getViewModeButtonClass = (isActive: boolean): string => {\r\n if (isActive) {\r\n return 'bg-[var(--color-accent-500)] text-white';\r\n }\r\n return 'text-[var(--text-tertiary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]';\r\n};\r\n\r\n/** Build a hierarchical list: root groups first, then their children indented, recursively */\r\nfunction buildHierarchicalList<T extends { id: string; parentGroupId: string | null }>(\r\n items: T[]\r\n): { item: T; depth: number }[] {\r\n const childrenMap = new Map<string | null, T[]>();\r\n for (const item of items) {\r\n const parentId = item.parentGroupId;\r\n if (!childrenMap.has(parentId)) childrenMap.set(parentId, []);\r\n childrenMap.get(parentId)!.push(item);\r\n }\r\n\r\n const result: { item: T; depth: number }[] = [];\r\n const addChildren = (parentId: string | null, depth: number) => {\r\n const children = childrenMap.get(parentId) || [];\r\n for (const child of children) {\r\n result.push({ item: child, depth });\r\n addChildren(child.id, depth + 1);\r\n }\r\n };\r\n\r\n // Start with root groups (parentGroupId is null or parent not in current filtered list)\r\n const itemIds = new Set(items.map(i => i.id));\r\n const roots = items.filter(i => !i.parentGroupId || !itemIds.has(i.parentGroupId));\r\n for (const root of roots) {\r\n result.push({ item: root, depth: 0 });\r\n addChildren(root.id, 1);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function UsersGroupsPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [groups, setGroups] = useState<GroupWithDetails[]>([]);\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedGroup, setSelectedGroup] = useState<GroupWithDetails | null>(null);\r\n const [showAssignModal, setShowAssignModal] = useState(false);\r\n const [showCreateModal, setShowCreateModal] = useState(false);\r\n const [expandedGroupId, setExpandedGroupId] = useState<string | null>(null);\r\n const [members, setMembers] = useState<Record<string, GroupMemberDto[]>>({});\r\n const [loadingMembers, setLoadingMembers] = useState<string | null>(null);\r\n const [viewMode, setViewMode] = useState<ViewMode>('cards');\r\n const [groupTypeFilter, setGroupTypeFilter] = useState<GroupTypeFilter>('all');\r\n const [syncFilter, setSyncFilter] = useState<SyncFilter>('all');\r\n\r\n // Create group form state\r\n const [newGroupName, setNewGroupName] = useState('');\r\n const [newGroupDescription, setNewGroupDescription] = useState('');\r\n const [newGroupIsSecurityGroup, setNewGroupIsSecurityGroup] = useState(true);\r\n const [newGroupParentId, setNewGroupParentId] = useState<string>('');\r\n const [creating, setCreating] = useState(false);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const [groupsData, rolesData] = await Promise.all([\r\n groupsApi.getAll(),\r\n adminApi.roles.getAssignable(),\r\n ]);\r\n setGroups(Array.isArray(groupsData) ? groupsData : []);\r\n setRoles(Array.isArray(rolesData) ? rolesData : []);\r\n } catch (err: unknown) {\r\n console.error('Failed to load groups:', err);\r\n setGroups([]);\r\n setRoles([]);\r\n const axiosError = err as { response?: { status?: number } };\r\n if (axiosError.response?.status === 401) {\r\n setError(t('common:errors.sessionExpired'));\r\n } else if (axiosError.response?.status === 403) {\r\n setError(t('common:errors.noPermission'));\r\n } else {\r\n setError(t('admin:groups.loadError'));\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [t, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const loadMembers = async (groupId: string) => {\r\n if (members[groupId]) {\r\n setExpandedGroupId(expandedGroupId === groupId ? null : groupId);\r\n return;\r\n }\r\n\r\n setLoadingMembers(groupId);\r\n try {\r\n const data = await groupsApi.getMembers(groupId);\r\n setMembers(prev => ({ ...prev, [groupId]: data }));\r\n setExpandedGroupId(groupId);\r\n } catch (err) {\r\n console.error('Failed to load members:', err);\r\n setError(t('admin:groups.loadError'));\r\n } finally {\r\n setLoadingMembers(null);\r\n }\r\n };\r\n\r\n const reloadGroupsAndRoles = useCallback(async () => {\r\n const [groupsData, rolesData] = await Promise.all([\r\n groupsApi.getAll(),\r\n adminApi.roles.getAssignable(),\r\n ]);\r\n const safeGroupsData = Array.isArray(groupsData) ? groupsData : [];\r\n setGroups(safeGroupsData);\r\n setRoles(Array.isArray(rolesData) ? rolesData : []);\r\n return safeGroupsData;\r\n }, []);\r\n\r\n const handleCreateGroup = async () => {\r\n if (!newGroupName.trim()) return;\r\n\r\n setCreating(true);\r\n try {\r\n await groupsApi.create({\r\n name: newGroupName.trim(),\r\n description: newGroupDescription.trim() || undefined,\r\n isSecurityGroup: newGroupIsSecurityGroup,\r\n parentGroupId: newGroupParentId || undefined,\r\n });\r\n await loadData();\r\n setShowCreateModal(false);\r\n setNewGroupName('');\r\n setNewGroupDescription('');\r\n setNewGroupIsSecurityGroup(true);\r\n setNewGroupParentId('');\r\n } catch (err) {\r\n console.error('Failed to create group:', err);\r\n const axiosError = err as { response?: { status?: number; data?: { message?: string } } };\r\n if (axiosError.response?.status === 409) {\r\n setError(axiosError.response.data?.message || t('admin:groups.createError'));\r\n } else {\r\n setError(t('admin:groups.createError'));\r\n }\r\n } finally {\r\n setCreating(false);\r\n }\r\n };\r\n\r\n const handleDeleteGroup = async (groupId: string, groupName: string, isSyncedFromEntra: boolean = false) => {\r\n const confirmMessage = isSyncedFromEntra\r\n ? t('admin:groups.deleteConfirmEntra', { name: groupName, defaultValue: `Le groupe \"${groupName}\" est synchronisé depuis Entra ID. Il sera recréé lors de la prochaine synchronisation.\\n\\nÊtes-vous sûr de vouloir le supprimer ?` })\r\n : t('admin:groups.deleteConfirm', { name: groupName });\r\n\r\n if (!confirm(confirmMessage)) return;\r\n\r\n try {\r\n await groupsApi.delete(groupId);\r\n await loadData();\r\n } catch (err) {\r\n console.error('Failed to delete group:', err);\r\n setError(t('admin:groups.deleteError'));\r\n }\r\n };\r\n\r\n const handleAssignRole = async (roleId: string) => {\r\n if (!selectedGroup) return;\r\n try {\r\n await groupsApi.assignRole(selectedGroup.id, { roleId });\r\n const safeGroupsData = await reloadGroupsAndRoles();\r\n const updatedGroup = safeGroupsData.find(g => g.id === selectedGroup.id);\r\n if (updatedGroup) setSelectedGroup(updatedGroup);\r\n } catch (err) {\r\n console.error('Failed to assign role:', err);\r\n setError(t('admin:groups.assignError'));\r\n }\r\n };\r\n\r\n const filteredGroups = groups.filter((g) => {\r\n const matchesSearch =\r\n g.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n g.description?.toLowerCase().includes(searchQuery.toLowerCase());\r\n\r\n const matchesType =\r\n groupTypeFilter === 'all' ||\r\n (groupTypeFilter === 'security' && g.isSecurityGroup) ||\r\n (groupTypeFilter === 'distribution' && !g.isSecurityGroup);\r\n\r\n const matchesSync =\r\n syncFilter === 'all' ||\r\n (syncFilter === 'local' && !g.isSyncedFromEntra) ||\r\n (syncFilter === 'synced' && g.isSyncedFromEntra);\r\n\r\n return matchesSearch && matchesType && matchesSync;\r\n });\r\n\r\n const hierarchicalGroups = buildHierarchicalList(filteredGroups);\r\n\r\n const formatDate = (date: string | null) => {\r\n if (!date) return '-';\r\n return new Intl.DateTimeFormat('fr-FR', {\r\n dateStyle: 'medium',\r\n timeStyle: 'short',\r\n }).format(new Date(date));\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\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 return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:users.title', 'Users'), href: '/administration/users' },\r\n { label: t('admin:groups.title', 'Groups') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-[var(--radius-button)] bg-[var(--color-accent-500)]/10\">\r\n <Users className=\"w-6 h-6 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:groups.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:groups.subtitle', { count: groups.length })}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={loadData}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <RefreshCw className=\"w-4 h-4\" />\r\n {t('common:refresh')}\r\n </button>\r\n <button\r\n onClick={() => setShowCreateModal(true)}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('admin:groups.createGroup')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\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 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error}</span>\r\n <button\r\n onClick={() => setError(null)}\r\n className=\"ml-auto p-1 hover:bg-[var(--error-text)]/10 rounded\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search & Filters */}\r\n <div className=\"flex flex-col sm:flex-row gap-4\">\r\n {/* Search */}\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('admin:groups.searchPlaceholder')}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(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)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Type Filter */}\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <select\r\n value={groupTypeFilter}\r\n onChange={(e) => setGroupTypeFilter(e.target.value as GroupTypeFilter)}\r\n className=\"px-3 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=\"all\">{t('admin:groups.allTypes')}</option>\r\n <option value=\"security\">{t('admin:groups.securityGroup')}</option>\r\n <option value=\"distribution\">{t('admin:groups.distributionGroup')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* Sync Filter */}\r\n <div className=\"flex items-center gap-2\">\r\n <Cloud className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <select\r\n value={syncFilter}\r\n onChange={(e) => setSyncFilter(e.target.value as SyncFilter)}\r\n className=\"px-3 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=\"all\">{t('admin:groups.allSyncStatus')}</option>\r\n <option value=\"local\">{t('admin:groups.localOnly')}</option>\r\n <option value=\"synced\">{t('admin:groups.syncedFromEntra')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* View Mode Toggle */}\r\n <div className=\"flex items-center gap-1 p-1 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <button\r\n onClick={() => setViewMode('cards')}\r\n className={`p-2 rounded-[var(--radius-button)] transition-colors ${getViewModeButtonClass(viewMode === 'cards')}`}\r\n title={t('admin:groups.cardView')}\r\n >\r\n <LayoutGrid className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`p-2 rounded-[var(--radius-button)] transition-colors ${getViewModeButtonClass(viewMode === 'table')}`}\r\n title={t('admin:groups.tableView')}\r\n >\r\n <List className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Groups List */}\r\n {filteredGroups.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {searchQuery || groupTypeFilter !== 'all' || syncFilter !== 'all'\r\n ? t('admin:groups.noResults')\r\n : t('admin:groups.noGroups')}\r\n </div>\r\n )}\r\n {filteredGroups.length > 0 && viewMode === 'table' && (\r\n /* Table View */\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.groupName')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.parentGroup')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:type')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.source')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.members')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.assignedRoles')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:actionsColumn')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {hierarchicalGroups.map(({ item: group, depth }) => (\r\n <tr key={group.id} className=\"hover:bg-[var(--bg-hover)] cursor-pointer\" onClick={() => navigate(`/administration/users/groups/${group.id}`)}>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\" style={{ paddingLeft: `${depth * 24}px` }}>\r\n {depth > 0 && (\r\n <CornerDownRight className=\"w-4 h-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n )}\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n }`}>\r\n {group.isSecurityGroup ? (\r\n <Shield className=\"w-4 h-4\" />\r\n ) : (\r\n <Building2 className=\"w-4 h-4\" />\r\n )}\r\n </div>\r\n <div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)] hover:text-[var(--color-accent-500)] hover:underline\">{group.name}</span>\r\n {group.childCount > 0 && (\r\n <span className=\"flex items-center gap-0.5 px-1.5 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]\">\r\n <GitBranch className=\"w-3 h-3\" />\r\n {group.childCount}\r\n </span>\r\n )}\r\n </div>\r\n {group.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] truncate max-w-xs\">\r\n {group.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {group.parentGroupName ? (\r\n <span className=\"text-[var(--text-secondary)]\">{group.parentGroupName}</span>\r\n ) : (\r\n <span className=\"text-[var(--text-tertiary)]\">-</span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className={`px-2 py-1 text-xs rounded-[var(--radius-badge)] ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-purple-500/10 text-purple-500'\r\n }`}>\r\n {group.isSecurityGroup ? t('admin:groups.securityGroup') : t('admin:groups.distributionGroup')}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n {group.isSyncedFromEntra ? (\r\n <span className=\"flex items-center gap-1 text-sm text-blue-500\">\r\n <Cloud className=\"w-4 h-4\" />\r\n Entra\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1 text-sm text-[var(--text-tertiary)]\">\r\n <CloudOff className=\"w-4 h-4\" />\r\n {t('admin:groups.local')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"flex items-center gap-1\">\r\n <Users className=\"w-4 h-4\" />\r\n {group.memberCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex flex-wrap gap-1\">\r\n {group.roles.slice(0, 2).map((role, index) => (\r\n <span\r\n key={`${group.id}-role-${index}`}\r\n className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]\"\r\n >\r\n {role}\r\n </span>\r\n ))}\r\n {group.roles.length > 2 && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]\">\r\n +{group.roles.length - 2}\r\n </span>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-right\" onClick={(e) => e.stopPropagation()}>\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={() => {\r\n setSelectedGroup(group);\r\n setShowAssignModal(true);\r\n }}\r\n className=\"p-2 rounded-[var(--radius-button)] text-[var(--text-tertiary)] hover:text-[var(--color-accent-500)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n title={t('admin:groups.assignRole')}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleDeleteGroup(group.id, group.name, group.isSyncedFromEntra)}\r\n className=\"p-2 rounded-[var(--radius-button)] text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n title={t('common:delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n {filteredGroups.length > 0 && viewMode !== 'table' && (\r\n /* Cards View */\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4\">\r\n {hierarchicalGroups.map(({ item: group }) => (\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n key={group.id}\r\n className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-secondary)] overflow-hidden hover:border-[var(--color-accent-500)] transition-colors cursor-pointer text-left flex flex-col\"\r\n onClick={() => navigate(`/administration/users/groups/${group.id}`)}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); navigate(`/administration/users/groups/${group.id}`); } }}\r\n >\r\n {/* Card Header */}\r\n <div className=\"p-4 flex-1\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div className=\"flex items-start gap-3 min-w-0\">\r\n <div className={`p-2.5 rounded-[var(--radius-button)] flex-shrink-0 ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n }`}>\r\n {group.isSecurityGroup ? (\r\n <Shield className=\"w-5 h-5\" />\r\n ) : (\r\n <Building2 className=\"w-5 h-5\" />\r\n )}\r\n </div>\r\n <div className=\"min-w-0\">\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <span className=\"font-semibold text-[var(--text-primary)] truncate\">\r\n {group.name}\r\n </span>\r\n {group.isSecurityGroup && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-blue-500/10 text-blue-500 border border-blue-500/20\">\r\n {t('admin:groups.securityGroup')}\r\n </span>\r\n )}\r\n {!group.isActive && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n {t('common:inactive')}\r\n </span>\r\n )}\r\n {group.isSyncedFromEntra ? (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-blue-500/10 text-blue-500 border border-blue-500/20 flex items-center gap-1\">\r\n <Cloud className=\"w-3 h-3\" />\r\n Entra\r\n </span>\r\n ) : (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)] border border-[var(--border-color)] flex items-center gap-1\">\r\n <CloudOff className=\"w-3 h-3\" />\r\n {t('admin:groups.local')}\r\n </span>\r\n )}\r\n {group.parentGroupName && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)] border border-[var(--border-color)] flex items-center gap-1\">\r\n <CornerDownRight className=\"w-3 h-3\" />\r\n {group.parentGroupName}\r\n </span>\r\n )}\r\n {group.childCount > 0 && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)] border border-[var(--border-color)] flex items-center gap-1\">\r\n <GitBranch className=\"w-3 h-3\" />\r\n {t('admin:groups.childGroupCount', { count: group.childCount })}\r\n </span>\r\n )}\r\n </div>\r\n {group.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1 line-clamp-2\">\r\n {group.description}\r\n </p>\r\n )}\r\n <div className=\"flex items-center gap-4 mt-2 text-sm text-[var(--text-tertiary)] flex-wrap\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); loadMembers(group.id); }}\r\n className=\"flex items-center gap-1 hover:text-[var(--color-accent-500)] transition-colors\"\r\n >\r\n <Users className=\"w-4 h-4\" />\r\n {t('admin:groups.memberCount', { count: group.memberCount })}\r\n {loadingMembers === group.id && (\r\n <Loader2 className=\"w-3 h-3 animate-spin ml-1\" />\r\n )}\r\n {loadingMembers !== group.id && expandedGroupId === group.id && (\r\n <ChevronUp className=\"w-3 h-3 ml-1\" />\r\n )}\r\n {loadingMembers !== group.id && expandedGroupId !== group.id && (\r\n <ChevronDown className=\"w-3 h-3 ml-1\" />\r\n )}\r\n </button>\r\n </div>\r\n {group.isSyncedFromEntra && group.lastEntraSyncAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('admin:groups.lastSynced', { date: formatDate(group.lastEntraSyncAt) })}\r\n </p>\r\n )}\r\n {!group.isSyncedFromEntra && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('admin:groups.createdAt', { date: formatDate(group.createdAt) })}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setSelectedGroup(group); setShowAssignModal(true); }}\r\n className=\"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('admin:groups.assignRole')}\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); handleDeleteGroup(group.id, group.name, group.isSyncedFromEntra); }}\r\n className=\"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--error-border)] text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common:delete')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Assigned Roles */}\r\n {group.roles.length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h4 className=\"text-sm font-medium text-[var(--text-primary)] mb-2\">\r\n {t('admin:groups.assignedRoles')}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {group.roles.map((role, index) => (\r\n <span\r\n key={`${group.id}-role-${index}`}\r\n className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-badge)] bg-[var(--bg-primary)] border border-[var(--border-color)]\"\r\n >\r\n <Shield className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n <span className=\"text-sm text-[var(--text-primary)]\">{role}</span>\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Members Panel */}\r\n {expandedGroupId === group.id && members[group.id] && (\r\n <div className=\"border-t border-[var(--border-color)] bg-[var(--bg-primary)]\">\r\n <div className=\"p-4\">\r\n <h4 className=\"text-sm font-medium text-[var(--text-primary)] mb-3 flex items-center gap-2\">\r\n <Users className=\"w-4 h-4\" />\r\n {t('admin:groups.members')} ({members[group.id].length})\r\n </h4>\r\n {members[group.id].length === 0 ? (\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n {t('admin:groups.noMembers')}\r\n </p>\r\n ) : (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\r\n {members[group.id].slice(0, 10).map((member) => (\r\n <Link\r\n key={member.userId}\r\n to={`/administration/users/${member.userId}`}\r\n className=\"flex items-center gap-3 p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div className=\"w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]\">\r\n {member.fullName.charAt(0).toUpperCase()}\r\n </div>\r\n <div className=\"min-w-0\">\r\n <p className=\"text-sm font-medium text-[var(--text-primary)] truncate\">\r\n {member.fullName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-tertiary)] truncate\">\r\n {member.email}\r\n </p>\r\n </div>\r\n </Link>\r\n ))}\r\n </div>\r\n )}\r\n {members[group.id].length > 10 && (\r\n <p className=\"mt-3 text-center text-sm text-[var(--text-tertiary)]\">\r\n {t('admin:groups.showingMembers', {\r\n shown: 10,\r\n total: members[group.id].length,\r\n })}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Create Group Modal */}\r\n {showCreateModal && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\r\n <div className=\"w-full max-w-md rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)] shadow-xl\">\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('admin:groups.createGroup')}\r\n </h2>\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"p-4 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('admin:groups.groupName')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={newGroupName}\r\n onChange={(e) => setNewGroupName(e.target.value)}\r\n placeholder={t('admin:groups.groupNamePlaceholder')}\r\n className=\"w-full px-3 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 <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('common:description')}\r\n </label>\r\n <textarea\r\n value={newGroupDescription}\r\n onChange={(e) => setNewGroupDescription(e.target.value)}\r\n placeholder={t('admin:groups.descriptionPlaceholder')}\r\n rows={3}\r\n className=\"w-full px-3 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 <div className=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setNewGroupIsSecurityGroup(!newGroupIsSecurityGroup)}\r\n className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${\r\n newGroupIsSecurityGroup\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n >\r\n <span\r\n className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${\r\n newGroupIsSecurityGroup ? 'translate-x-6' : 'translate-x-1'\r\n }`}\r\n />\r\n </button>\r\n <span className=\"text-sm text-[var(--text-primary)]\">\r\n {t('admin:groups.isSecurityGroup')}\r\n </span>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('admin:groups.parentGroup')}\r\n </label>\r\n <select\r\n value={newGroupParentId}\r\n onChange={(e) => setNewGroupParentId(e.target.value)}\r\n className=\"w-full px-3 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('admin:groups.noParent')}</option>\r\n {groups.filter(g => g.isActive).map(g => (\r\n <option key={g.id} value={g.id}>{g.name}</option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center justify-end gap-3 p-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleCreateGroup}\r\n disabled={!newGroupName.trim() || creating}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {creating ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n {t('common:create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Assign Role Modal */}\r\n {showAssignModal && selectedGroup && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\r\n <div className=\"w-full max-w-md rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)] shadow-xl\">\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('admin:groups.assignRoleTitle')}\r\n </h2>\r\n <button\r\n onClick={() => {\r\n setShowAssignModal(false);\r\n setSelectedGroup(null);\r\n }}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"p-4\">\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {t('admin:groups.assignRoleDescription', { group: selectedGroup.name })}\r\n </p>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {roles\r\n .filter((role) => !selectedGroup.roles.includes(role.name))\r\n .map((role) => (\r\n <button\r\n key={role.id}\r\n onClick={() => handleAssignRole(role.id)}\r\n className=\"w-full flex items-center gap-3 p-3 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)] hover:bg-[var(--bg-hover)] transition-colors text-left\"\r\n >\r\n <Shield className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{role.name}</p>\r\n {role.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{role.description}</p>\r\n )}\r\n </div>\r\n </button>\r\n ))}\r\n {roles.filter((role) => !selectedGroup.roles.includes(role.name)).length === 0 && (\r\n <p className=\"text-sm text-[var(--text-tertiary)] text-center py-4\">\r\n {t('admin:groups.allRolesAssigned')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["getViewModeButtonClass","isActive","buildHierarchicalList","items","childrenMap","item","parentId","result","addChildren","depth","children","child","itemIds","roots","root","UsersGroupsPage","useTranslation","navigate","useNavigate","currentTenant","isGlobalView","useTenant","loading","setLoading","useState","groups","setGroups","roles","setRoles","error","setError","searchQuery","setSearchQuery","selectedGroup","setSelectedGroup","showAssignModal","setShowAssignModal","showCreateModal","setShowCreateModal","expandedGroupId","setExpandedGroupId","members","setMembers","loadingMembers","setLoadingMembers","viewMode","setViewMode","groupTypeFilter","setGroupTypeFilter","syncFilter","setSyncFilter","newGroupName","setNewGroupName","newGroupDescription","setNewGroupDescription","newGroupIsSecurityGroup","setNewGroupIsSecurityGroup","newGroupParentId","setNewGroupParentId","creating","setCreating","loadData","useCallback","groupsData","rolesData","groupsApi","adminApi","err","axiosError","useEffect","loadMembers","groupId","data","prev","reloadGroupsAndRoles","safeGroupsData","handleCreateGroup","handleDeleteGroup","groupName","isSyncedFromEntra","confirmMessage","handleAssignRole","roleId","updatedGroup","g","filteredGroups","matchesSearch","matchesType","matchesSync","hierarchicalGroups","formatDate","date","jsx","Loader2","jsxs","Breadcrumb","Users","RefreshCw","Plus","AlertTriangle","X","Search","Filter","Cloud","LayoutGrid","List","group","CornerDownRight","Shield","Building2","GitBranch","CloudOff","role","index","e","Trash2","ChevronUp","ChevronDown","member","Link","Check"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UsersGroupsPage-l33K3Nca.js","sources":["../../src/pages/platform/administration/users/UsersGroupsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link, useNavigate } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport {\r\n Building2,\r\n RefreshCw,\r\n Loader2,\r\n AlertTriangle,\r\n Search,\r\n Users,\r\n Shield,\r\n Plus,\r\n X,\r\n ChevronDown,\r\n ChevronUp,\r\n LayoutGrid,\r\n List,\r\n Filter,\r\n Cloud,\r\n CloudOff,\r\n Trash2,\r\n Check,\r\n GitBranch,\r\n CornerDownRight,\r\n} from 'lucide-react';\r\nimport {\r\n groupsApi,\r\n type GroupListDto,\r\n type GroupMemberDto,\r\n type GroupRoleDto,\r\n} from '@/services/api/groupsApi';\r\nimport { adminApi, type RoleListDto } from '@/services/api/adminApi';\r\n\r\ntype ViewMode = 'cards' | 'table';\r\ntype GroupTypeFilter = 'all' | 'security' | 'distribution';\r\ntype SyncFilter = 'all' | 'local' | 'synced';\r\n\r\ninterface GroupWithDetails extends GroupListDto {\r\n membersLoaded?: GroupMemberDto[];\r\n rolesLoaded?: GroupRoleDto[];\r\n}\r\n\r\nconst getViewModeButtonClass = (isActive: boolean): string => {\r\n if (isActive) {\r\n return 'bg-[var(--color-accent-500)] text-white';\r\n }\r\n return 'text-[var(--text-tertiary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]';\r\n};\r\n\r\n/** Build a hierarchical list: root groups first, then their children indented, recursively */\r\nfunction buildHierarchicalList<T extends { id: string; parentGroupId: string | null }>(\r\n items: T[]\r\n): { item: T; depth: number }[] {\r\n const childrenMap = new Map<string | null, T[]>();\r\n for (const item of items) {\r\n const parentId = item.parentGroupId;\r\n if (!childrenMap.has(parentId)) childrenMap.set(parentId, []);\r\n childrenMap.get(parentId)!.push(item);\r\n }\r\n\r\n const result: { item: T; depth: number }[] = [];\r\n const addChildren = (parentId: string | null, depth: number) => {\r\n const children = childrenMap.get(parentId) || [];\r\n for (const child of children) {\r\n result.push({ item: child, depth });\r\n addChildren(child.id, depth + 1);\r\n }\r\n };\r\n\r\n // Start with root groups (parentGroupId is null or parent not in current filtered list)\r\n const itemIds = new Set(items.map(i => i.id));\r\n const roots = items.filter(i => !i.parentGroupId || !itemIds.has(i.parentGroupId));\r\n for (const root of roots) {\r\n result.push({ item: root, depth: 0 });\r\n addChildren(root.id, 1);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function UsersGroupsPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [groups, setGroups] = useState<GroupWithDetails[]>([]);\r\n const [roles, setRoles] = useState<RoleListDto[]>([]);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedGroup, setSelectedGroup] = useState<GroupWithDetails | null>(null);\r\n const [showAssignModal, setShowAssignModal] = useState(false);\r\n const [showCreateModal, setShowCreateModal] = useState(false);\r\n const [expandedGroupId, setExpandedGroupId] = useState<string | null>(null);\r\n const [members, setMembers] = useState<Record<string, GroupMemberDto[]>>({});\r\n const [loadingMembers, setLoadingMembers] = useState<string | null>(null);\r\n const [viewMode, setViewMode] = useState<ViewMode>('cards');\r\n const [groupTypeFilter, setGroupTypeFilter] = useState<GroupTypeFilter>('all');\r\n const [syncFilter, setSyncFilter] = useState<SyncFilter>('all');\r\n\r\n // Create group form state\r\n const [newGroupName, setNewGroupName] = useState('');\r\n const [newGroupDescription, setNewGroupDescription] = useState('');\r\n const [newGroupIsSecurityGroup, setNewGroupIsSecurityGroup] = useState(true);\r\n const [newGroupParentId, setNewGroupParentId] = useState<string>('');\r\n const [creating, setCreating] = useState(false);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const [groupsData, rolesData] = await Promise.all([\r\n groupsApi.getAll(),\r\n adminApi.roles.getAssignable(),\r\n ]);\r\n setGroups(Array.isArray(groupsData) ? groupsData : []);\r\n setRoles(Array.isArray(rolesData) ? rolesData : []);\r\n } catch (err: unknown) {\r\n console.error('Failed to load groups:', err);\r\n setGroups([]);\r\n setRoles([]);\r\n const axiosError = err as { response?: { status?: number } };\r\n if (axiosError.response?.status === 401) {\r\n setError(t('common:errors.sessionExpired'));\r\n } else if (axiosError.response?.status === 403) {\r\n setError(t('common:errors.noPermission'));\r\n } else {\r\n setError(t('admin:groups.loadError'));\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [t, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const loadMembers = async (groupId: string) => {\r\n if (members[groupId]) {\r\n setExpandedGroupId(expandedGroupId === groupId ? null : groupId);\r\n return;\r\n }\r\n\r\n setLoadingMembers(groupId);\r\n try {\r\n const data = await groupsApi.getMembers(groupId);\r\n setMembers(prev => ({ ...prev, [groupId]: data }));\r\n setExpandedGroupId(groupId);\r\n } catch (err) {\r\n console.error('Failed to load members:', err);\r\n setError(t('admin:groups.loadError'));\r\n } finally {\r\n setLoadingMembers(null);\r\n }\r\n };\r\n\r\n const reloadGroupsAndRoles = useCallback(async () => {\r\n const [groupsData, rolesData] = await Promise.all([\r\n groupsApi.getAll(),\r\n adminApi.roles.getAssignable(),\r\n ]);\r\n const safeGroupsData = Array.isArray(groupsData) ? groupsData : [];\r\n setGroups(safeGroupsData);\r\n setRoles(Array.isArray(rolesData) ? rolesData : []);\r\n return safeGroupsData;\r\n }, []);\r\n\r\n const handleCreateGroup = async () => {\r\n if (!newGroupName.trim()) return;\r\n\r\n setCreating(true);\r\n try {\r\n await groupsApi.create({\r\n name: newGroupName.trim(),\r\n description: newGroupDescription.trim() || undefined,\r\n isSecurityGroup: newGroupIsSecurityGroup,\r\n parentGroupId: newGroupParentId || undefined,\r\n });\r\n await loadData();\r\n setShowCreateModal(false);\r\n setNewGroupName('');\r\n setNewGroupDescription('');\r\n setNewGroupIsSecurityGroup(true);\r\n setNewGroupParentId('');\r\n } catch (err) {\r\n console.error('Failed to create group:', err);\r\n const axiosError = err as { response?: { status?: number; data?: { message?: string } } };\r\n if (axiosError.response?.status === 409) {\r\n setError(axiosError.response.data?.message || t('admin:groups.createError'));\r\n } else {\r\n setError(t('admin:groups.createError'));\r\n }\r\n } finally {\r\n setCreating(false);\r\n }\r\n };\r\n\r\n const handleDeleteGroup = async (groupId: string, groupName: string, isSyncedFromEntra: boolean = false) => {\r\n const confirmMessage = isSyncedFromEntra\r\n ? t('admin:groups.deleteConfirmEntra', { name: groupName, defaultValue: `Le groupe \"${groupName}\" est synchronisé depuis Entra ID. Il sera recréé lors de la prochaine synchronisation.\\n\\nÊtes-vous sûr de vouloir le supprimer ?` })\r\n : t('admin:groups.deleteConfirm', { name: groupName });\r\n\r\n if (!confirm(confirmMessage)) return;\r\n\r\n try {\r\n await groupsApi.delete(groupId);\r\n await loadData();\r\n } catch (err) {\r\n console.error('Failed to delete group:', err);\r\n setError(t('admin:groups.deleteError'));\r\n }\r\n };\r\n\r\n const handleAssignRole = async (roleId: string) => {\r\n if (!selectedGroup) return;\r\n try {\r\n await groupsApi.assignRole(selectedGroup.id, { roleId });\r\n const safeGroupsData = await reloadGroupsAndRoles();\r\n const updatedGroup = safeGroupsData.find(g => g.id === selectedGroup.id);\r\n if (updatedGroup) setSelectedGroup(updatedGroup);\r\n } catch (err) {\r\n console.error('Failed to assign role:', err);\r\n setError(t('admin:groups.assignError'));\r\n }\r\n };\r\n\r\n const filteredGroups = groups.filter((g) => {\r\n const matchesSearch =\r\n g.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n g.description?.toLowerCase().includes(searchQuery.toLowerCase());\r\n\r\n const matchesType =\r\n groupTypeFilter === 'all' ||\r\n (groupTypeFilter === 'security' && g.isSecurityGroup) ||\r\n (groupTypeFilter === 'distribution' && !g.isSecurityGroup);\r\n\r\n const matchesSync =\r\n syncFilter === 'all' ||\r\n (syncFilter === 'local' && !g.isSyncedFromEntra) ||\r\n (syncFilter === 'synced' && g.isSyncedFromEntra);\r\n\r\n return matchesSearch && matchesType && matchesSync;\r\n });\r\n\r\n const hierarchicalGroups = buildHierarchicalList(filteredGroups);\r\n\r\n const formatDate = (date: string | null) => {\r\n if (!date) return '-';\r\n return new Intl.DateTimeFormat('fr-FR', {\r\n dateStyle: 'medium',\r\n timeStyle: 'short',\r\n }).format(new Date(date));\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\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 return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:users.title', 'Users'), href: '/administration/users' },\r\n { label: t('admin:groups.title', 'Groups') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-[var(--radius-button)] bg-[var(--color-accent-500)]/10\">\r\n <Users className=\"w-6 h-6 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:groups.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:groups.subtitle', { count: groups.length })}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={loadData}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <RefreshCw className=\"w-4 h-4\" />\r\n {t('common:refresh')}\r\n </button>\r\n <button\r\n onClick={() => setShowCreateModal(true)}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('admin:groups.createGroup')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\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 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error}</span>\r\n <button\r\n onClick={() => setError(null)}\r\n className=\"ml-auto p-1 hover:bg-[var(--error-text)]/10 rounded\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search & Filters */}\r\n <div className=\"flex flex-col sm:flex-row gap-4\">\r\n {/* Search */}\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n placeholder={t('admin:groups.searchPlaceholder')}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(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)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Type Filter */}\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <select\r\n value={groupTypeFilter}\r\n onChange={(e) => setGroupTypeFilter(e.target.value as GroupTypeFilter)}\r\n className=\"px-3 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=\"all\">{t('admin:groups.allTypes')}</option>\r\n <option value=\"security\">{t('admin:groups.securityGroup')}</option>\r\n <option value=\"distribution\">{t('admin:groups.distributionGroup')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* Sync Filter */}\r\n <div className=\"flex items-center gap-2\">\r\n <Cloud className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <select\r\n value={syncFilter}\r\n onChange={(e) => setSyncFilter(e.target.value as SyncFilter)}\r\n className=\"px-3 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=\"all\">{t('admin:groups.allSyncStatus')}</option>\r\n <option value=\"local\">{t('admin:groups.localOnly')}</option>\r\n <option value=\"synced\">{t('admin:groups.syncedFromEntra')}</option>\r\n </select>\r\n </div>\r\n\r\n {/* View Mode Toggle */}\r\n <div className=\"flex items-center gap-1 p-1 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <button\r\n onClick={() => setViewMode('cards')}\r\n className={`p-2 rounded-[var(--radius-button)] transition-colors ${getViewModeButtonClass(viewMode === 'cards')}`}\r\n title={t('admin:groups.cardView')}\r\n >\r\n <LayoutGrid className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`p-2 rounded-[var(--radius-button)] transition-colors ${getViewModeButtonClass(viewMode === 'table')}`}\r\n title={t('admin:groups.tableView')}\r\n >\r\n <List className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Groups List */}\r\n {filteredGroups.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {searchQuery || groupTypeFilter !== 'all' || syncFilter !== 'all'\r\n ? t('admin:groups.noResults')\r\n : t('admin:groups.noGroups')}\r\n </div>\r\n )}\r\n {filteredGroups.length > 0 && viewMode === 'table' && (\r\n /* Table View */\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.groupName')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.parentGroup')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:type')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.source')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.members')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('admin:groups.assignedRoles')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('common:actionsColumn')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {hierarchicalGroups.map(({ item: group, depth }) => (\r\n <tr key={group.id} className=\"hover:bg-[var(--bg-hover)] cursor-pointer\" onClick={() => navigate(`/administration/users/groups/${group.id}`)}>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\" style={{ paddingLeft: `${depth * 24}px` }}>\r\n {depth > 0 && (\r\n <CornerDownRight className=\"w-4 h-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n )}\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n }`}>\r\n {group.isSecurityGroup ? (\r\n <Shield className=\"w-4 h-4\" />\r\n ) : (\r\n <Building2 className=\"w-4 h-4\" />\r\n )}\r\n </div>\r\n <div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)] hover:text-[var(--color-accent-500)] hover:underline\">{group.name}</span>\r\n {group.childCount > 0 && (\r\n <span className=\"flex items-center gap-0.5 px-1.5 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]\">\r\n <GitBranch className=\"w-3 h-3\" />\r\n {group.childCount}\r\n </span>\r\n )}\r\n </div>\r\n {group.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] truncate max-w-xs\">\r\n {group.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {group.parentGroupName ? (\r\n <span className=\"text-[var(--text-secondary)]\">{group.parentGroupName}</span>\r\n ) : (\r\n <span className=\"text-[var(--text-tertiary)]\">-</span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className={`px-2 py-1 text-xs rounded-[var(--radius-badge)] ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-purple-500/10 text-purple-500'\r\n }`}>\r\n {group.isSecurityGroup ? t('admin:groups.securityGroup') : t('admin:groups.distributionGroup')}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n {group.isSyncedFromEntra ? (\r\n <span className=\"flex items-center gap-1 text-sm text-blue-500\">\r\n <Cloud className=\"w-4 h-4\" />\r\n Entra\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1 text-sm text-[var(--text-tertiary)]\">\r\n <CloudOff className=\"w-4 h-4\" />\r\n {t('admin:groups.local')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n <span className=\"flex items-center gap-1\">\r\n <Users className=\"w-4 h-4\" />\r\n {group.memberCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex flex-wrap gap-1\">\r\n {group.roles.slice(0, 2).map((role, index) => (\r\n <span\r\n key={`${group.id}-role-${index}`}\r\n className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]\"\r\n >\r\n {role}\r\n </span>\r\n ))}\r\n {group.roles.length > 2 && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]\">\r\n +{group.roles.length - 2}\r\n </span>\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-right\" onClick={(e) => e.stopPropagation()}>\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={() => {\r\n setSelectedGroup(group);\r\n setShowAssignModal(true);\r\n }}\r\n className=\"p-2 rounded-[var(--radius-button)] text-[var(--text-tertiary)] hover:text-[var(--color-accent-500)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n title={t('admin:groups.assignRole')}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => handleDeleteGroup(group.id, group.name, group.isSyncedFromEntra)}\r\n className=\"p-2 rounded-[var(--radius-button)] text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n title={t('common:delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n {filteredGroups.length > 0 && viewMode !== 'table' && (\r\n /* Cards View */\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4\">\r\n {hierarchicalGroups.map(({ item: group }) => (\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n key={group.id}\r\n className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-secondary)] overflow-hidden hover:border-[var(--color-accent-500)] transition-colors cursor-pointer text-left flex flex-col\"\r\n onClick={() => navigate(`/administration/users/groups/${group.id}`)}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); navigate(`/administration/users/groups/${group.id}`); } }}\r\n >\r\n {/* Card Header */}\r\n <div className=\"p-4 flex-1\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div className=\"flex items-start gap-3 min-w-0\">\r\n <div className={`p-2.5 rounded-[var(--radius-button)] flex-shrink-0 ${\r\n group.isSecurityGroup\r\n ? 'bg-blue-500/10 text-blue-500'\r\n : 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n }`}>\r\n {group.isSecurityGroup ? (\r\n <Shield className=\"w-5 h-5\" />\r\n ) : (\r\n <Building2 className=\"w-5 h-5\" />\r\n )}\r\n </div>\r\n <div className=\"min-w-0\">\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <span className=\"font-semibold text-[var(--text-primary)] truncate\">\r\n {group.name}\r\n </span>\r\n {group.isSecurityGroup && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-blue-500/10 text-blue-500 border border-blue-500/20\">\r\n {t('admin:groups.securityGroup')}\r\n </span>\r\n )}\r\n {!group.isActive && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n {t('common:inactive')}\r\n </span>\r\n )}\r\n {group.isSyncedFromEntra ? (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-blue-500/10 text-blue-500 border border-blue-500/20 flex items-center gap-1\">\r\n <Cloud className=\"w-3 h-3\" />\r\n Entra\r\n </span>\r\n ) : (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)] border border-[var(--border-color)] flex items-center gap-1\">\r\n <CloudOff className=\"w-3 h-3\" />\r\n {t('admin:groups.local')}\r\n </span>\r\n )}\r\n {group.parentGroupName && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)] border border-[var(--border-color)] flex items-center gap-1\">\r\n <CornerDownRight className=\"w-3 h-3\" />\r\n {group.parentGroupName}\r\n </span>\r\n )}\r\n {group.childCount > 0 && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-tertiary)] border border-[var(--border-color)] flex items-center gap-1\">\r\n <GitBranch className=\"w-3 h-3\" />\r\n {t('admin:groups.childGroupCount', { count: group.childCount })}\r\n </span>\r\n )}\r\n </div>\r\n {group.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1 line-clamp-2\">\r\n {group.description}\r\n </p>\r\n )}\r\n <div className=\"flex items-center gap-4 mt-2 text-sm text-[var(--text-tertiary)] flex-wrap\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); loadMembers(group.id); }}\r\n className=\"flex items-center gap-1 hover:text-[var(--color-accent-500)] transition-colors\"\r\n >\r\n <Users className=\"w-4 h-4\" />\r\n {t('admin:groups.memberCount', { count: group.memberCount })}\r\n {loadingMembers === group.id && (\r\n <Loader2 className=\"w-3 h-3 animate-spin ml-1\" />\r\n )}\r\n {loadingMembers !== group.id && expandedGroupId === group.id && (\r\n <ChevronUp className=\"w-3 h-3 ml-1\" />\r\n )}\r\n {loadingMembers !== group.id && expandedGroupId !== group.id && (\r\n <ChevronDown className=\"w-3 h-3 ml-1\" />\r\n )}\r\n </button>\r\n </div>\r\n {group.isSyncedFromEntra && group.lastEntraSyncAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('admin:groups.lastSynced', { date: formatDate(group.lastEntraSyncAt) })}\r\n </p>\r\n )}\r\n {!group.isSyncedFromEntra && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('admin:groups.createdAt', { date: formatDate(group.createdAt) })}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setSelectedGroup(group); setShowAssignModal(true); }}\r\n className=\"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('admin:groups.assignRole')}\r\n </button>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); handleDeleteGroup(group.id, group.name, group.isSyncedFromEntra); }}\r\n className=\"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--error-border)] text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common:delete')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Assigned Roles */}\r\n {group.roles.length > 0 && (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h4 className=\"text-sm font-medium text-[var(--text-primary)] mb-2\">\r\n {t('admin:groups.assignedRoles')}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {group.roles.map((role, index) => (\r\n <span\r\n key={`${group.id}-role-${index}`}\r\n className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-[var(--radius-badge)] bg-[var(--bg-primary)] border border-[var(--border-color)]\"\r\n >\r\n <Shield className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n <span className=\"text-sm text-[var(--text-primary)]\">{role}</span>\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Members Panel */}\r\n {expandedGroupId === group.id && members[group.id] && (\r\n <div className=\"border-t border-[var(--border-color)] bg-[var(--bg-primary)]\">\r\n <div className=\"p-4\">\r\n <h4 className=\"text-sm font-medium text-[var(--text-primary)] mb-3 flex items-center gap-2\">\r\n <Users className=\"w-4 h-4\" />\r\n {t('admin:groups.members')} ({members[group.id].length})\r\n </h4>\r\n {members[group.id].length === 0 ? (\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">\r\n {t('admin:groups.noMembers')}\r\n </p>\r\n ) : (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\r\n {members[group.id].slice(0, 10).map((member) => (\r\n <Link\r\n key={member.userId}\r\n to={`/administration/users/${member.userId}`}\r\n className=\"flex items-center gap-3 p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div className=\"w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]\">\r\n {member.fullName.charAt(0).toUpperCase()}\r\n </div>\r\n <div className=\"min-w-0\">\r\n <p className=\"text-sm font-medium text-[var(--text-primary)] truncate\">\r\n {member.fullName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-tertiary)] truncate\">\r\n {member.email}\r\n </p>\r\n </div>\r\n </Link>\r\n ))}\r\n </div>\r\n )}\r\n {members[group.id].length > 10 && (\r\n <p className=\"mt-3 text-center text-sm text-[var(--text-tertiary)]\">\r\n {t('admin:groups.showingMembers', {\r\n shown: 10,\r\n total: members[group.id].length,\r\n })}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Create Group Modal */}\r\n {showCreateModal && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\r\n <div className=\"w-full max-w-md rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)] shadow-xl\">\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('admin:groups.createGroup')}\r\n </h2>\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"p-4 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('admin:groups.groupName')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={newGroupName}\r\n onChange={(e) => setNewGroupName(e.target.value)}\r\n placeholder={t('admin:groups.groupNamePlaceholder')}\r\n className=\"w-full px-3 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 <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('common:description')}\r\n </label>\r\n <textarea\r\n value={newGroupDescription}\r\n onChange={(e) => setNewGroupDescription(e.target.value)}\r\n placeholder={t('admin:groups.descriptionPlaceholder')}\r\n rows={3}\r\n className=\"w-full px-3 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 <div className=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setNewGroupIsSecurityGroup(!newGroupIsSecurityGroup)}\r\n className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${\r\n newGroupIsSecurityGroup\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n >\r\n <span\r\n className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${\r\n newGroupIsSecurityGroup ? 'translate-x-6' : 'translate-x-1'\r\n }`}\r\n />\r\n </button>\r\n <span className=\"text-sm text-[var(--text-primary)]\">\r\n {t('admin:groups.isSecurityGroup')}\r\n </span>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('admin:groups.parentGroup')}\r\n </label>\r\n <select\r\n value={newGroupParentId}\r\n onChange={(e) => setNewGroupParentId(e.target.value)}\r\n className=\"w-full px-3 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('admin:groups.noParent')}</option>\r\n {groups.filter(g => g.isActive).map(g => (\r\n <option key={g.id} value={g.id}>{g.name}</option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center justify-end gap-3 p-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleCreateGroup}\r\n disabled={!newGroupName.trim() || creating}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {creating ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n {t('common:create')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Assign Role Modal */}\r\n {showAssignModal && selectedGroup && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\r\n <div className=\"w-full max-w-md rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)] shadow-xl\">\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('admin:groups.assignRoleTitle')}\r\n </h2>\r\n <button\r\n onClick={() => {\r\n setShowAssignModal(false);\r\n setSelectedGroup(null);\r\n }}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"p-4\">\r\n <p className=\"text-sm text-[var(--text-secondary)] mb-4\">\r\n {t('admin:groups.assignRoleDescription', { group: selectedGroup.name })}\r\n </p>\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\r\n {roles\r\n .filter((role) => !selectedGroup.roles.includes(role.name))\r\n .map((role) => (\r\n <button\r\n key={role.id}\r\n onClick={() => handleAssignRole(role.id)}\r\n className=\"w-full flex items-center gap-3 p-3 rounded-[var(--radius-button)] border border-[var(--border-color)] hover:border-[var(--color-accent-500)] hover:bg-[var(--bg-hover)] transition-colors text-left\"\r\n >\r\n <Shield className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{role.name}</p>\r\n {role.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{role.description}</p>\r\n )}\r\n </div>\r\n </button>\r\n ))}\r\n {roles.filter((role) => !selectedGroup.roles.includes(role.name)).length === 0 && (\r\n <p className=\"text-sm text-[var(--text-tertiary)] text-center py-4\">\r\n {t('admin:groups.allRolesAssigned')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["getViewModeButtonClass","isActive","buildHierarchicalList","items","childrenMap","item","parentId","result","addChildren","depth","children","child","itemIds","roots","root","UsersGroupsPage","useTranslation","navigate","useNavigate","currentTenant","isGlobalView","useTenant","loading","setLoading","useState","groups","setGroups","roles","setRoles","error","setError","searchQuery","setSearchQuery","selectedGroup","setSelectedGroup","showAssignModal","setShowAssignModal","showCreateModal","setShowCreateModal","expandedGroupId","setExpandedGroupId","members","setMembers","loadingMembers","setLoadingMembers","viewMode","setViewMode","groupTypeFilter","setGroupTypeFilter","syncFilter","setSyncFilter","newGroupName","setNewGroupName","newGroupDescription","setNewGroupDescription","newGroupIsSecurityGroup","setNewGroupIsSecurityGroup","newGroupParentId","setNewGroupParentId","creating","setCreating","loadData","useCallback","groupsData","rolesData","groupsApi","adminApi","err","axiosError","useEffect","loadMembers","groupId","data","prev","reloadGroupsAndRoles","safeGroupsData","handleCreateGroup","handleDeleteGroup","groupName","isSyncedFromEntra","confirmMessage","handleAssignRole","roleId","updatedGroup","g","filteredGroups","matchesSearch","matchesType","matchesSync","hierarchicalGroups","formatDate","date","jsx","Loader2","jsxs","Breadcrumb","Users","RefreshCw","Plus","AlertTriangle","X","Search","Filter","Cloud","LayoutGrid","List","group","CornerDownRight","Shield","Building2","GitBranch","CloudOff","role","index","e","Trash2","ChevronUp","ChevronDown","member","Link","Check"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { useMemo as ce, useState as d, useEffect as D, useCallback as Ge } from
|
|
|
3
3
|
import { useNavigate as ze, useSearchParams as Ke } from "react-router-dom";
|
|
4
4
|
import { useTranslation as ge } from "react-i18next";
|
|
5
5
|
import { AlertTriangle as qe, Plus as We, Search as W, X as oe, Filter as de, RotateCcw as Je, ChevronDown as I, ArrowUpDown as Xe, Loader2 as $, Cloud as k, Mail as J, Shield as me, Eye as ue, Edit2 as he, UserX as xe, UserCheck as X, Trash2 as pe, Users as He } from "lucide-react";
|
|
6
|
-
import { a as fe, u as Qe, m as Ye, o as Ze, k as v, B as _e, S as F, V as et, P as tt, A as L, R, p as at, K as ve, q as be } from "./index-
|
|
6
|
+
import { a as fe, u as Qe, m as Ye, o as Ze, k as v, B as _e, S as F, V as et, P as tt, A as L, R, p as at, K as ve, q as be } from "./index-DN97bp_f.js";
|
|
7
7
|
function rt() {
|
|
8
8
|
const { currentTenant: s, hasGlobalRoles: c, isGlobalView: n } = fe(), { currentModuleCode: y, getCurrentModule: N, isLoading: U, menu: E } = Qe();
|
|
9
9
|
return c && !n && s && y && !U && E ? {
|
|
@@ -863,4 +863,4 @@ function ht() {
|
|
|
863
863
|
export {
|
|
864
864
|
ht as UsersPage
|
|
865
865
|
};
|
|
866
|
-
//# sourceMappingURL=UsersPage-
|
|
866
|
+
//# sourceMappingURL=UsersPage-BjC5ZqTa.js.map
|