[permissions] better object level permissions override handling (#12709)

## Context
- Same logic as role level permission, setting true on any higher
permission will force true on read and removing read will remove higher
permissions. Just a bit more complex here since object level permissions
have 3 possible states instead of a simple bool.
This commit is contained in:
Weiko
2025-06-18 18:08:01 +02:00
committed by GitHub
parent da5ae34109
commit 3acdf369ab

View File

@ -1,6 +1,7 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableHeader } from '@/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableHeader'; import { SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableHeader } from '@/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableHeader';
import { SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableRow } from '@/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableRow'; import { SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableRow } from '@/settings/roles/role-permissions/object-level-permissions/object-form/components/SettingsRolePermissionsObjectLevelObjectFormObjectLevelTableRow';
import { SettingsRoleObjectPermissionKey } from '@/settings/roles/role-permissions/objects-permissions/constants/settingsRoleObjectPermissionIconConfig';
import { SettingsRolePermissionsObjectLevelPermission } from '@/settings/roles/role-permissions/objects-permissions/types/SettingsRolePermissionsObjectPermission'; import { SettingsRolePermissionsObjectLevelPermission } from '@/settings/roles/role-permissions/objects-permissions/types/SettingsRolePermissionsObjectPermission';
import { settingsDraftRoleFamilyState } from '@/settings/roles/states/settingsDraftRoleFamilyState'; import { settingsDraftRoleFamilyState } from '@/settings/roles/states/settingsDraftRoleFamilyState';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
@ -8,7 +9,6 @@ import { t } from '@lingui/core/macro';
import { useRecoilState } from 'recoil'; import { useRecoilState } from 'recoil';
import { H2Title } from 'twenty-ui/display'; import { H2Title } from 'twenty-ui/display';
import { Section } from 'twenty-ui/layout'; import { Section } from 'twenty-ui/layout';
import { ObjectPermission } from '~/generated-metadata/graphql';
const StyledTable = styled.div` const StyledTable = styled.div`
border-bottom: 1px solid ${({ theme }) => theme.border.color.light}; border-bottom: 1px solid ${({ theme }) => theme.border.color.light};
@ -44,16 +44,39 @@ export const SettingsRolePermissionsObjectLevelObjectFormObjectLevel = ({
const objectLabel = objectMetadataItem.labelPlural; const objectLabel = objectMetadataItem.labelPlural;
const updateObjectPermission = ( const updateObjectPermission = (
permissionKey: keyof ObjectPermission, permissionKey: SettingsRoleObjectPermissionKey,
value: boolean | null, value: boolean | null,
) => { ) => {
setSettingsDraftRole((currentRole) => { setSettingsDraftRole((currentRole) => {
const updatedPermissions = currentRole.objectPermissions?.map((perm) => { if (!currentRole.objectPermissions) {
if (perm.objectMetadataId === objectMetadataItem.id) { return currentRole;
return { ...perm, [permissionKey]: value }; }
const updatedPermissions = currentRole.objectPermissions.map((perm) => {
if (perm.objectMetadataId !== objectMetadataItem.id) {
return perm;
} }
return perm;
const newPerms = { ...perm, [permissionKey]: value };
const isHigherPermission =
permissionKey === 'canUpdateObjectRecords' ||
permissionKey === 'canSoftDeleteObjectRecords' ||
permissionKey === 'canDestroyObjectRecords';
if (isHigherPermission && value !== false) {
newPerms.canReadObjectRecords = value;
}
if (permissionKey === 'canReadObjectRecords' && !value) {
newPerms.canUpdateObjectRecords = false;
newPerms.canSoftDeleteObjectRecords = false;
newPerms.canDestroyObjectRecords = false;
}
return newPerms;
}); });
return { ...currentRole, objectPermissions: updatedPermissions }; return { ...currentRole, objectPermissions: updatedPermissions };
}); });
}; };