From 193ef432a0f2e5ce76620fcf3747d287d7ffad7e Mon Sep 17 00:00:00 2001 From: Weiko Date: Wed, 12 Feb 2025 18:49:50 +0100 Subject: [PATCH] add object settings permission tab (#10159) ## Context Introducing the "Permissions" tab in the role page Next: Need to address some css improvements, some components might be reusable and it still does not fully match the figma (icon missing for permission types for example). We decided to merge like this for now so we have something functional and I will update the code in an upcoming PR Screenshot 2025-02-12 at 13 54 16 --- .../pages/settings/roles/SettingsRoles.tsx | 2 +- .../roles/components/RoleAssignment.tsx | 54 ++++--- .../components/RoleAssignmentTableHeader.tsx | 2 +- .../roles/components/RolePermissions.tsx | 133 ++++++++++++++++-- .../RolePermissionsObjectsTableHeader.tsx | 44 ++++++ .../RolePermissionsObjectsTableRow.tsx | 69 +++++++++ .../RolePermissionsSettingsTableHeader.tsx | 52 +++++++ .../RolePermissionsSettingsTableRow.tsx | 55 ++++++++ .../RoleWorkspaceMemberPickerDropdown.tsx | 37 ++--- ...leWorkspaceMemberPickerDropdownContent.tsx | 64 ++------- .../types/RolePermissionsObjectPermission.ts | 6 + .../types/RolePermissionsSettingPermission.ts | 6 + .../data-seed-dev-workspace.command.ts | 24 +--- .../core/demo/user-workspaces.ts | 11 +- .../src/database/typeorm-seeds/core/index.ts | 4 +- .../{userWorkspaces.ts => user-workspaces.ts} | 20 ++- .../workspace-manager.service.ts | 46 ++++-- .../src/input/components/Checkbox.tsx | 10 +- 18 files changed, 479 insertions(+), 160 deletions(-) create mode 100644 packages/twenty-front/src/pages/settings/roles/components/RolePermissionsObjectsTableHeader.tsx create mode 100644 packages/twenty-front/src/pages/settings/roles/components/RolePermissionsObjectsTableRow.tsx create mode 100644 packages/twenty-front/src/pages/settings/roles/components/RolePermissionsSettingsTableHeader.tsx create mode 100644 packages/twenty-front/src/pages/settings/roles/components/RolePermissionsSettingsTableRow.tsx create mode 100644 packages/twenty-front/src/pages/settings/roles/types/RolePermissionsObjectPermission.ts create mode 100644 packages/twenty-front/src/pages/settings/roles/types/RolePermissionsSettingPermission.ts rename packages/twenty-server/src/database/typeorm-seeds/core/{userWorkspaces.ts => user-workspaces.ts} (70%) diff --git a/packages/twenty-front/src/pages/settings/roles/SettingsRoles.tsx b/packages/twenty-front/src/pages/settings/roles/SettingsRoles.tsx index 86aad9830..87b9810c4 100644 --- a/packages/twenty-front/src/pages/settings/roles/SettingsRoles.tsx +++ b/packages/twenty-front/src/pages/settings/roles/SettingsRoles.tsx @@ -64,7 +64,7 @@ const StyledAvatarGroup = styled.div` `; const StyledTableHeaderRow = styled(Table)` - margin-bottom: ${({ theme }) => theme.spacing(1.5)}; + margin-bottom: ${({ theme }) => theme.spacing(2)}; `; const StyledBottomSection = styled(Section)` diff --git a/packages/twenty-front/src/pages/settings/roles/components/RoleAssignment.tsx b/packages/twenty-front/src/pages/settings/roles/components/RoleAssignment.tsx index b7cc51579..2d52713ac 100644 --- a/packages/twenty-front/src/pages/settings/roles/components/RoleAssignment.tsx +++ b/packages/twenty-front/src/pages/settings/roles/components/RoleAssignment.tsx @@ -1,3 +1,4 @@ +import { currentWorkspaceMembersState } from '@/auth/states/currentWorkspaceMembersStates'; import { SettingsPath } from '@/types/SettingsPath'; import { TextInput } from '@/ui/input/components/TextInput'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; @@ -6,7 +7,16 @@ import { Table } from '@/ui/layout/table/components/Table'; import styled from '@emotion/styled'; import { t } from '@lingui/core/macro'; import { useState } from 'react'; -import { Button, H2Title, IconPlus, IconSearch, Section } from 'twenty-ui'; +import { useRecoilValue } from 'recoil'; +import { + AppTooltip, + Button, + H2Title, + IconPlus, + IconSearch, + Section, + TooltipDelay, +} from 'twenty-ui'; import { Role, WorkspaceMember } from '~/generated-metadata/graphql'; import { GetRolesDocument, @@ -36,14 +46,6 @@ const StyledBottomSection = styled(Section)<{ hasRows: boolean }>` justify-content: flex-end; `; -const StyledEmptyText = styled.div` - align-items: center; - color: ${({ theme }) => theme.font.color.light}; - display: flex; - justify-content: center; - margin-top: ${({ theme }) => theme.spacing(4)}; -`; - const StyledSearchContainer = styled.div` margin: ${({ theme }) => theme.spacing(2)} 0; `; @@ -80,6 +82,7 @@ export const RoleAssignment = ({ role }: RoleAssignmentProps) => { const { data: rolesData } = useGetRolesQuery(); const { closeDropdown } = useDropdown('role-member-select'); const [searchFilter, setSearchFilter] = useState(''); + const currentWorkspaceMembers = useRecoilValue(currentWorkspaceMembersState); const workspaceMemberRoleMap = new Map< string, @@ -154,6 +157,9 @@ export const RoleAssignment = ({ role }: RoleAssignmentProps) => { setSearchFilter(text); }; + const allWorkspaceMembersHaveThisRole = + role.workspaceMembers.length === currentWorkspaceMembers.length; + return ( <>
@@ -180,13 +186,6 @@ export const RoleAssignment = ({ role }: RoleAssignmentProps) => { onRemove={() => handleRemoveClick(workspaceMember)} /> ))} - {filteredWorkspaceMembers.length === 0 && ( - - {searchFilter - ? t`No members matching your search` - : t`No members assigned to this role yet`} - - )}
0}> @@ -194,12 +193,23 @@ export const RoleAssignment = ({ role }: RoleAssignmentProps) => { dropdownId="role-member-select" dropdownHotkeyScope={{ scope: 'roleAssignment' }} clickableComponent={ -