-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Feat 17408 : Add remove option for object permissions rule #17601
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
a24e2bc
e2aabfb
b16916f
7bdb290
cd98028
d36bb1a
0983bd6
ce3787f
7c999c6
ce27cfd
a29e2ca
49bb8ac
9bbc940
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| import { useResetObjectPermission } from '@/settings/roles/role-permissions/object-level-permissions/hooks/useResetObjectPermission'; | ||
| import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; | ||
| import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; | ||
| import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; | ||
| import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; | ||
| import { t } from '@lingui/core/macro'; | ||
| import { IconDotsVertical, IconPencil, IconTrash } from 'twenty-ui/display'; | ||
| import { IconButton } from 'twenty-ui/input'; | ||
| import { MenuItem, UndecoratedLink } from 'twenty-ui/navigation'; | ||
|
|
||
| type SettingsRolePermissionsObjectLevelTableRowOptionsDropdownProps = { | ||
| roleId: string; | ||
| objectMetadataId: string; | ||
| objectPermissionDetailUrl: string; | ||
| }; | ||
|
|
||
| export const SettingsRolePermissionsObjectLevelTableRowOptionsDropdown = ({ | ||
| roleId, | ||
| objectMetadataId, | ||
| objectPermissionDetailUrl, | ||
| }: SettingsRolePermissionsObjectLevelTableRowOptionsDropdownProps) => { | ||
| const dropdownId = `settings-role-object-level-options-${objectMetadataId}`; | ||
|
|
||
| const { closeDropdown } = useCloseDropdown(); | ||
|
|
||
| const { resetObjectPermission } = useResetObjectPermission(roleId); | ||
|
|
||
| const handleRemove = () => { | ||
| closeDropdown(dropdownId); | ||
| resetObjectPermission(objectMetadataId); | ||
| }; | ||
|
|
||
| return ( | ||
| <Dropdown | ||
| dropdownId={dropdownId} | ||
| clickableComponent={ | ||
| <IconButton | ||
| aria-label={t`Object permission options`} | ||
| variant="tertiary" | ||
| Icon={IconDotsVertical} | ||
| /> | ||
| } | ||
| dropdownComponents={ | ||
| <DropdownContent> | ||
| <DropdownMenuItemsContainer> | ||
| <MenuItem | ||
| text={t`Remove rule`} | ||
| onClick={handleRemove} | ||
| LeftIcon={IconTrash} | ||
| accent="danger" | ||
| /> | ||
| </DropdownMenuItemsContainer> | ||
| <DropdownMenuItemsContainer> | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nitpick : Could you invert "Remove rule" and "Edit" to fit with design ? #17408 (comment) |
||
| <UndecoratedLink | ||
| fullWidth | ||
| to={objectPermissionDetailUrl} | ||
| onClick={() => closeDropdown(dropdownId)} | ||
| > | ||
| <MenuItem text={t`Edit`} LeftIcon={IconPencil} /> | ||
| </UndecoratedLink> | ||
| </DropdownMenuItemsContainer> | ||
| </DropdownContent> | ||
| } | ||
| dropdownPlacement="bottom-end" | ||
| /> | ||
| ); | ||
| }; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,78 @@ | ||
| import { useUpsertFieldPermissionInDraftRole } from '@/settings/roles/role-permissions/object-level-permissions/field-permissions/hooks/useUpsertFieldPermissionInDraftRole'; | ||
| import { useUpsertObjectPermissionInDraftRole } from '@/settings/roles/role-permissions/object-level-permissions/hooks/useUpsertObjectPermissionInDraftRole'; | ||
| import { type SettingsRoleObjectPermissionKey } from '@/settings/roles/role-permissions/objects-permissions/constants/SettingsRoleObjectPermissionIconConfig'; | ||
| import { settingsDraftRoleFamilyState } from '@/settings/roles/states/settingsDraftRoleFamilyState'; | ||
| import { useRecoilValue } from 'recoil'; | ||
| import { isDefined } from 'twenty-shared/utils'; | ||
| import { | ||
| type FieldPermission, | ||
| type ObjectPermission, | ||
| } from '~/generated/graphql'; | ||
|
|
||
| const OBJECT_PERMISSION_KEYS: SettingsRoleObjectPermissionKey[] = [ | ||
| 'canReadObjectRecords', | ||
| 'canUpdateObjectRecords', | ||
| 'canSoftDeleteObjectRecords', | ||
| 'canDestroyObjectRecords', | ||
| ]; | ||
|
|
||
| export const useResetObjectPermission = (roleId: string) => { | ||
|
||
| const settingsDraftRole = useRecoilValue( | ||
| settingsDraftRoleFamilyState(roleId), | ||
| ); | ||
|
|
||
| const { upsertObjectPermissionInDraftRole } = | ||
| useUpsertObjectPermissionInDraftRole(roleId); | ||
|
|
||
| const { upsertFieldPermissionInDraftRole } = | ||
| useUpsertFieldPermissionInDraftRole(roleId); | ||
|
|
||
| const resetObjectPermission = (objectMetadataItemId: string) => { | ||
| const fieldPermissionsForCurrentObject = | ||
| settingsDraftRole.fieldPermissions?.filter( | ||
| (permission) => permission.objectMetadataId === objectMetadataItemId, | ||
| ) ?? []; | ||
| const existingObjectPermission = settingsDraftRole.objectPermissions?.find( | ||
| (objectPermissionToFind) => | ||
| objectPermissionToFind.objectMetadataId === objectMetadataItemId, | ||
| ); | ||
|
|
||
| const resetPermissions = OBJECT_PERMISSION_KEYS.reduce( | ||
| (acc, permissionKey) => { | ||
| acc[permissionKey] = null; | ||
| return acc; | ||
| }, | ||
| {} as Record<SettingsRoleObjectPermissionKey, null>, | ||
| ); | ||
|
|
||
| if (!isDefined(existingObjectPermission)) { | ||
| const newObjectPermission = { | ||
| objectMetadataId: objectMetadataItemId, | ||
| ...resetPermissions, | ||
| } satisfies ObjectPermission; | ||
|
|
||
| upsertObjectPermissionInDraftRole(newObjectPermission); | ||
| } else { | ||
| const updatedObjectPermission = { | ||
| ...existingObjectPermission, | ||
| ...resetPermissions, | ||
| }; | ||
|
|
||
| upsertObjectPermissionInDraftRole(updatedObjectPermission); | ||
| } | ||
sentry[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| fieldPermissionsForCurrentObject.forEach( | ||
| (fieldPermission: FieldPermission) => { | ||
| upsertFieldPermissionInDraftRole({ | ||
| ...fieldPermission, | ||
| canUpdateFieldValue: null, | ||
| canReadFieldValue: null, | ||
| }); | ||
| }, | ||
| ); | ||
| }; | ||
|
|
||
| return { | ||
| resetObjectPermission, | ||
| }; | ||
| }; | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To remove cf design