diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/AdvancedPermissionGroup.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/AdvancedPermissionGroup.tsx index 49bfba9f9ade9a..62172fd1971c46 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/AdvancedPermissionGroup.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/AdvancedPermissionGroup.tsx @@ -16,6 +16,7 @@ interface AdvancedPermissionGroupProps { resource: Resource; selectedPermissions: string[]; onChange: (permissions: string[]) => void; + disabled?: boolean; } const INTERNAL_DATAACCESS_KEY = "_resource"; @@ -24,6 +25,7 @@ export function AdvancedPermissionGroup({ resource, selectedPermissions, onChange, + disabled, }: AdvancedPermissionGroupProps) { const { t } = useLocale(); const { toggleSinglePermission, toggleResourcePermissionLevel } = usePermissions(); @@ -47,7 +49,9 @@ export function AdvancedPermissionGroup({ const handleToggleAll = (e: React.MouseEvent) => { e.stopPropagation(); // Stop event from triggering parent click - onChange(toggleResourcePermissionLevel(resource, isAllSelected ? "none" : "all", selectedPermissions)); + if (!disabled) { + onChange(toggleResourcePermissionLevel(resource, isAllSelected ? "none" : "all", selectedPermissions)); + } }; // Helper function to check if read permission is auto-enabled @@ -77,6 +81,7 @@ export function AdvancedPermissionGroup({ checked={isAllSelected} onCheckedChange={() => handleToggleAll} onClick={handleToggleAll} + disabled={disabled} /> {t(resourceConfig._resource?.i18nKey || "")} @@ -107,9 +112,12 @@ export function AdvancedPermissionGroup({ checked={isChecked} className="mr-2" onCheckedChange={(checked) => { - onChange(toggleSinglePermission(permission, !!checked, selectedPermissions)); + if (!disabled) { + onChange(toggleSinglePermission(permission, !!checked, selectedPermissions)); + } }} onClick={(e) => e.stopPropagation()} // Stop checkbox clicks from affecting parent + disabled={disabled} />
void; + disabled?: boolean; } -export default function RoleColorPicker({ value, onChange }: RoleColorPickerProps) { +export default function RoleColorPicker({ value, onChange, disabled }: RoleColorPickerProps) { const { t } = useLocale(); const [, setCustomColor] = useState(value); const colorInputRef = useRef(null); @@ -21,7 +22,9 @@ export default function RoleColorPicker({ value, onChange }: RoleColorPickerProp }; const handleColorSquareClick = () => { - colorInputRef.current?.click(); + if (!disabled) { + colorInputRef.current?.click(); + } }; return ( @@ -29,7 +32,8 @@ export default function RoleColorPicker({ value, onChange }: RoleColorPickerProp
@@ -217,6 +223,7 @@ export function RoleSheet({ role, open, onOpenChange, teamId, scope = Scope.Orga resource={resource as Resource} selectedPermissions={permissions} onChange={(newPermissions) => form.setValue("permissions", newPermissions)} + disabled={isSystemRole} /> ))} @@ -239,6 +246,7 @@ export function RoleSheet({ role, open, onOpenChange, teamId, scope = Scope.Orga resource={resource} permissions={permissions} onChange={(newPermissions) => form.setValue("permissions", newPermissions)} + disabled={isSystemRole} /> ))} @@ -247,18 +255,27 @@ export function RoleSheet({ role, open, onOpenChange, teamId, scope = Scope.Orga - - - - + {!isSystemRole && ( + + + + + )} + {isSystemRole && ( + + + + )} diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/RolesList.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/RolesList.tsx index 2fa5d4e3521d89..6dcd8e8de75f17 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/RolesList.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/RolesList.tsx @@ -81,8 +81,10 @@ export function RolesList({ role={role} key={role.id} onClick={() => { - // Cant edit system roles + // For system roles, open in view-only mode if (role.type === "SYSTEM") { + setSelectedRoleId(role.id); + setIsOpen(true); return; } @@ -136,7 +138,9 @@ function RoleItem({
diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/SimplePermissionItem.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/SimplePermissionItem.tsx index 9f0a75f7a732c8..c7e055fdc8d06e 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/SimplePermissionItem.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/roles/_components/SimplePermissionItem.tsx @@ -12,9 +12,15 @@ interface SimplePermissionItemProps { resource: string; permissions: string[]; onChange: (permissions: string[]) => void; + disabled?: boolean; } -export function SimplePermissionItem({ resource, permissions, onChange }: SimplePermissionItemProps) { +export function SimplePermissionItem({ + resource, + permissions, + onChange, + disabled, +}: SimplePermissionItemProps) { const { t } = useLocale(); const { getResourcePermissionLevel, toggleResourcePermissionLevel } = usePermissions(); @@ -37,10 +43,12 @@ export function SimplePermissionItem({ resource, permissions, onChange }: Simple { - if (val) onChange(toggleResourcePermissionLevel(resource, val as PermissionLevel, permissions)); + if (val && !disabled) + onChange(toggleResourcePermissionLevel(resource, val as PermissionLevel, permissions)); }} value={getResourcePermissionLevel(resource, permissions)} options={options} + disabled={disabled} />
); diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 7d99dc6e12ef85..e56c241d45fef0 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -683,6 +683,7 @@ "send_invite_email": "Send an invite email", "role": "Role", "edit_role": "Edit Role", + "view_role": "View Role", "edit_team": "Edit team", "editing_user": "Editing user", "editing_org": "Editing organization",