diff --git a/packages/frontend-2/components/form/select/WorkspaceRoles.vue b/packages/frontend-2/components/form/select/WorkspaceRoles.vue index d0316b10b..778429103 100644 --- a/packages/frontend-2/components/form/select/WorkspaceRoles.vue +++ b/packages/frontend-2/components/form/select/WorkspaceRoles.vue @@ -84,6 +84,10 @@ const props = defineProps({ }, showLabel: Boolean, clearable: Boolean, + hideItems: { + required: false, + type: Array as PropType + }, hideDescription: { required: false, type: Boolean @@ -102,7 +106,14 @@ const { selectedValue, isMultiItemArrayValue, hiddenSelectedItemCount, firstItem dynamicVisibility: { elementToWatchForChanges, itemContainer } }) -const roles = computed(() => Object.values(Roles.Workspace)) +const roles = computed(() => { + if (props.hideItems && props.hideItems.length) { + return Object.values(Roles.Workspace).filter( + (role) => !props.hideItems?.includes(role) + ) + } + return Object.values(Roles.Workspace) +}) const disabledItemPredicate = (item: WorkspaceRoles) => props.disabledItems && props.disabledItems.length > 0 diff --git a/packages/frontend-2/components/settings/workspaces/Members.vue b/packages/frontend-2/components/settings/workspaces/Members.vue index 77d71e6d1..2ca713577 100644 --- a/packages/frontend-2/components/settings/workspaces/Members.vue +++ b/packages/frontend-2/components/settings/workspaces/Members.vue @@ -41,6 +41,17 @@ graphql(` fragment SettingsWorkspacesMembers_Workspace on Workspace { id role + team { + items { + id + role + } + } + invitedTeam(filter: $invitesFilter) { + user { + id + } + } } `) @@ -53,18 +64,31 @@ const { result } = useQuery(settingsWorkspacesMembersQuery, () => ({ })) const isAdmin = computed(() => result.value?.workspace?.role === Roles.Workspace.Admin) +const workspace = computed(() => result.value?.workspace) +const memberCount = computed( + () => + result.value?.workspace.team.items.filter( + (item) => item.role !== Roles.Workspace.Guest + ).length +) +const guestCount = computed( + () => + result.value?.workspace.team.items.filter( + (item) => item.role === Roles.Workspace.Guest + ).length +) +const invitedCount = computed(() => result.value?.workspace.invitedTeam?.length) const tabItems = computed(() => [ - { title: 'Members', id: 'members' }, - { title: 'Guests', id: 'guests' }, + { title: 'Members', id: 'members', count: memberCount.value }, + { title: 'Guests', id: 'guests', count: guestCount.value }, { title: 'Pending invites', id: 'invites', disabled: !isAdmin.value, - disabledMessage: 'Only workspace admins can manage invites' + disabledMessage: 'Only workspace admins can manage invites', + count: invitedCount.value } ]) const activeTab = ref(tabItems.value[0]) - -const workspace = computed(() => result.value?.workspace) diff --git a/packages/frontend-2/components/settings/workspaces/members/GuestsTable.vue b/packages/frontend-2/components/settings/workspaces/members/GuestsTable.vue index fc284a096..88779fb81 100644 --- a/packages/frontend-2/components/settings/workspaces/members/GuestsTable.vue +++ b/packages/frontend-2/components/settings/workspaces/members/GuestsTable.vue @@ -163,7 +163,8 @@ const { result: searchResult, loading: searchResultLoading } = useQuery( settingsWorkspacesMembersSearchQuery, () => ({ filter: { - search: search.value + search: search.value, + roles: [Roles.Workspace.Guest] }, workspaceId: props.workspaceId }), diff --git a/packages/frontend-2/components/settings/workspaces/members/MembersTable.vue b/packages/frontend-2/components/settings/workspaces/members/MembersTable.vue index d979d3fc3..283cc05d2 100644 --- a/packages/frontend-2/components/settings/workspaces/members/MembersTable.vue +++ b/packages/frontend-2/components/settings/workspaces/members/MembersTable.vue @@ -104,7 +104,7 @@