Feat: Expose user email on workspace settings member tables (#4857)

* Feat: Expose user email on workspace settings member tables

* Added permissions check

* Remove fetching items
This commit is contained in:
Mike
2025-05-30 18:52:23 +02:00
committed by GitHub
parent 8f37710c9e
commit 98cf564342
12 changed files with 192 additions and 132 deletions
@@ -73,6 +73,7 @@
:items="actionItems"
mount-menu-on-body
:menu-position="HorizontalDirection.Left"
:menu-id="`user-actions-${item.id}`"
@chosen="({ item: actionItem }) => onActionChosen(actionItem, item)"
>
<FormButton
@@ -46,6 +46,7 @@
:items="actionItems"
mount-menu-on-body
:menu-position="HorizontalDirection.Left"
:menu-id="`invite-actions-${item.id}`"
@chosen="({ item: actionItem }) => onActionChosen(actionItem, item)"
>
<FormButton
@@ -19,9 +19,12 @@
<LayoutTable
class="mt-6 md:mt-8"
:columns="[
{ id: 'name', header: 'Name', classes: 'col-span-4' },
{ id: 'seat', header: 'Seat', classes: 'col-span-2' },
{ id: 'joined', header: 'Joined', classes: 'col-span-3' },
{ id: 'name', header: 'Name', classes: 'col-span-3' },
...(canReadMemberEmail
? [{ id: 'email', header: 'Email', classes: 'col-span-3' }]
: []),
{ id: 'seat', header: 'Seat', classes: 'col-span-1' },
{ id: 'joined', header: 'Joined', classes: 'col-span-2' },
{ id: 'projects', header: 'Projects', classes: 'col-span-2' },
{
id: 'actions',
@@ -49,6 +52,11 @@
</span>
</div>
</template>
<template #email="{ item }">
<div class="flex">
<span class="truncate text-body-xs text-foreground">{{ item.email }}</span>
</div>
</template>
<template #seat="{ item }">
<SettingsWorkspacesMembersTableSeatType
:seat-type="item.seatType"
@@ -109,18 +117,26 @@
</template>
<script setup lang="ts">
import {
import type {
WorkspaceSeatType,
type SettingsWorkspacesMembersActionsMenu_UserFragment
SettingsWorkspacesMembersActionsMenu_UserFragment
} from '~/lib/common/generated/gql/graphql'
import { Roles, type Nullable } from '@speckle/shared'
import { settingsWorkspacesMembersSearchQuery } from '~~/lib/settings/graphql/queries'
import {
settingsWorkspacesMembersSearchQuery,
settingsWorkspacesMembersTableQuery
} from '~~/lib/settings/graphql/queries'
import { usePaginatedQuery } from '~/lib/common/composables/graphql'
import { useQuery } from '@vue/apollo-composable'
const props = defineProps<{
workspaceSlug: string
}>()
const { result } = useQuery(settingsWorkspacesMembersTableQuery, () => ({
slug: props.workspaceSlug
}))
const search = ref('')
const seatTypeFilter = ref<WorkspaceSeatType>()
const showProjectPermissionsDialog = ref(false)
@@ -131,7 +147,7 @@ const targetUser = ref<SettingsWorkspacesMembersActionsMenu_UserFragment | undef
const {
identifier,
onInfiniteLoad,
query: { result, loading }
query: { result: membersResult, loading }
} = usePaginatedQuery({
query: settingsWorkspacesMembersSearchQuery,
baseVariables: computed(() => ({
@@ -155,15 +171,11 @@ const {
})
const workspace = computed(() => result.value?.workspaceBySlug)
const guests = computed(() => {
const guestArray = workspace.value?.team.items
return (guestArray || [])
.map((g) => ({ ...g, seatType: g.seatType || WorkspaceSeatType.Viewer }))
.filter((item) => item.role === Roles.Workspace.Guest)
.filter((item) => !seatTypeFilter.value || item.seatType === seatTypeFilter.value)
})
const guests = computed(() => membersResult.value?.workspaceBySlug?.team?.items)
const isWorkspaceAdmin = computed(() => workspace.value?.role === Roles.Workspace.Admin)
const canReadMemberEmail = computed(
() => workspace.value?.permissions.canReadMemberEmail.authorized
)
</script>
@@ -9,8 +9,9 @@
class="mt-6 md:mt-8 mb-12"
:columns="[
{ id: 'name', header: 'Name', classes: 'col-span-3' },
{ id: 'invitedBy', header: 'Invited by', classes: 'col-span-4' },
{ id: 'role', header: 'Role', classes: 'col-span-2' },
{ id: 'email', header: 'Email', classes: 'col-span-3' },
{ id: 'invitedBy', header: 'Invited by', classes: 'col-span-2' },
{ id: 'role', header: 'Role', classes: 'col-span-1' },
{ id: 'lastRemindedOn', header: 'Last reminded on', classes: 'col-span-2' },
{
id: 'actions',
@@ -32,6 +33,11 @@
<span class="truncate text-body-xs text-foreground">{{ item.title }}</span>
</div>
</template>
<template #email="{ item }">
<div class="flex">
<span class="truncate text-body-xs text-foreground">{{ item.email }}</span>
</div>
</template>
<template #invitedBy="{ item }">
<div class="flex items-center gap-2">
<UserAvatar hide-tooltip :user="item.invitedBy" />
@@ -56,6 +62,7 @@
:items="actionsItems"
mount-menu-on-body
:menu-position="HorizontalDirection.Left"
:menu-id="`invite-actions-${item.id}`"
@chosen="({ item: actionItem }) => onActionChosen(actionItem, item)"
>
<FormButton
@@ -92,6 +99,7 @@ graphql(`
role
title
updatedAt
email
user {
id
...LimitedUserAvatar
@@ -4,12 +4,13 @@
class="mt-2 mb-12"
:columns="[
{ id: 'name', header: 'Name', classes: 'col-span-3' },
{ id: 'createdAt', header: 'Requested at', classes: 'col-span-3' },
{ id: 'status', header: 'Status', classes: 'col-span-3' },
{ id: 'email', header: 'Email', classes: 'col-span-3' },
{ id: 'createdAt', header: 'Requested at', classes: 'col-span-2' },
{ id: 'status', header: 'Status', classes: 'col-span-2' },
{
id: 'actions',
header: '',
classes: 'col-span-3 flex items-center justify-end'
classes: 'col-span-2 flex items-center justify-end'
}
]"
:items="joinRequests"
@@ -23,6 +24,11 @@
</span>
</div>
</template>
<template #email="{ item }">
<div class="flex">
<span class="truncate text-body-xs text-foreground">{{ item.email }}</span>
</div>
</template>
<template #createdAt="{ item }">
<p class="text-body-xs text-foreground">
{{ formattedFullDate(item.createdAt) }}
@@ -77,6 +83,7 @@ graphql(`
id
createdAt
status
email
user {
id
avatar
@@ -20,10 +20,12 @@
<LayoutTable
class="mt-6 mb-12"
:columns="[
{ id: 'name', header: 'Name', classes: 'col-span-4' },
{ id: 'seat', header: 'Seat', classes: 'col-span-3' },
{ id: 'joined', header: 'Joined', classes: 'col-span-4' },
// { id: 'projects', header: 'Projects', classes: 'col-span-2' },
{ id: 'name', header: 'Name', classes: 'col-span-3' },
...(canReadMemberEmail
? [{ id: 'email', header: 'Email', classes: 'col-span-4' }]
: []),
{ id: 'seat', header: 'Seat', classes: 'col-span-2' },
{ id: 'joined', header: 'Joined', classes: 'col-span-2' },
{
id: 'actions',
header: '',
@@ -76,6 +78,11 @@
</div>
</div>
</template>
<template #email="{ item }">
<div class="flex">
<span class="text-foreground-2 truncate">{{ item.email }}</span>
</div>
</template>
<template #seat="{ item }">
<SettingsWorkspacesMembersTableSeatType
:seat-type="item.seatType"
@@ -85,31 +92,6 @@
<template #joined="{ item }">
<span class="text-foreground-2">{{ formattedFullDate(item.joinDate) }}</span>
</template>
<!-- <template #projects="{ item }">
<FormButton
v-if="
item.projectRoles.length > 0 &&
isWorkspaceAdmin &&
item.role !== Roles.Workspace.Admin
"
color="subtle"
size="sm"
class="!font-normal !text-foreground-2 -ml-2"
@click="
() => {
targetUser = item
showProjectPermissionsDialog = true
}
"
>
{{ item.projectRoles.length }}
{{ item.projectRoles.length === 1 ? 'project' : 'projects' }}
</FormButton>
<div v-else class="text-foreground-2 max-w-max text-body-2xs select-none">
{{ item.projectRoles.length }}
{{ item.projectRoles.length === 1 ? 'project' : 'projects' }}
</div>
</template> -->
<template #actions="{ item }">
<SettingsWorkspacesMembersActionsMenu
:target-user="item"
@@ -134,24 +116,24 @@
<script setup lang="ts">
import { Roles, type Nullable, type WorkspaceRoles } from '@speckle/shared'
import { settingsWorkspacesMembersSearchQuery } from '~~/lib/settings/graphql/queries'
import {
settingsWorkspacesMembersSearchQuery,
settingsWorkspacesMembersTableQuery
} from '~~/lib/settings/graphql/queries'
import type {
WorkspaceSeatType,
type SettingsWorkspacesMembersActionsMenu_UserFragment
SettingsWorkspacesMembersActionsMenu_UserFragment
} from '~~/lib/common/generated/gql/graphql'
import { graphql } from '~/lib/common/generated/gql'
import { ExclamationCircleIcon } from '@heroicons/vue/24/outline'
import type { WorkspaceUserActionTypes } from '~/lib/settings/helpers/types'
import { usePaginatedQuery } from '~/lib/common/composables/graphql'
import { useQuery } from '@vue/apollo-composable'
graphql(`
fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {
id
projectRoles {
project {
id
}
}
email
...SettingsWorkspacesMembersActionsMenu_User
}
`)
@@ -160,6 +142,12 @@ const props = defineProps<{
workspaceSlug: string
}>()
const { activeUser } = useActiveUser()
const { result } = useQuery(settingsWorkspacesMembersTableQuery, () => ({
slug: props.workspaceSlug
}))
const selectedAction = ref<Record<string, WorkspaceUserActionTypes>>({})
const search = ref('')
const roleFilter = ref<WorkspaceRoles>()
const seatTypeFilter = ref<WorkspaceSeatType>()
@@ -168,12 +156,10 @@ const targetUser = ref<SettingsWorkspacesMembersActionsMenu_UserFragment | undef
undefined
)
const { activeUser } = useActiveUser()
const {
identifier,
onInfiniteLoad,
query: { result, loading }
query: { result: membersResult, loading }
} = usePaginatedQuery({
query: settingsWorkspacesMembersSearchQuery,
baseVariables: computed(() => ({
@@ -199,16 +185,8 @@ const {
})
const workspace = computed(() => result.value?.workspaceBySlug)
const members = computed(() => {
const memberArray = workspace.value?.team.items
return (memberArray || [])
.map((member) => ({
...member,
seatType: member.seatType || WorkspaceSeatType.Viewer
}))
.filter((user) => user.role !== Roles.Workspace.Guest)
})
const selectedAction = ref<Record<string, WorkspaceUserActionTypes>>({})
const canReadMemberEmail = computed(
() => workspace.value?.permissions.canReadMemberEmail.authorized
)
const members = computed(() => membersResult.value?.workspaceBySlug.team.items)
</script>
@@ -8,15 +8,17 @@
</template>
<script setup lang="ts">
import type { WorkspaceSeatType, WorkspaceRoles } from '@speckle/shared'
import type { WorkspaceRoles, MaybeNullOrUndefined } from '@speckle/shared'
import { WorkspaceSeatTypeDescription } from '~/lib/settings/helpers/constants'
import { WorkspaceSeatType } from '~~/lib/common/generated/gql/graphql'
const props = defineProps<{
seatType: WorkspaceSeatType
seatType: MaybeNullOrUndefined<WorkspaceSeatType>
role: WorkspaceRoles
}>()
const description = computed(
() => WorkspaceSeatTypeDescription[props.role][props.seatType]
() =>
WorkspaceSeatTypeDescription[props.role][props.seatType || WorkspaceSeatType.Viewer]
)
</script>
@@ -7,6 +7,7 @@
mount-menu-on-body
size="lg"
:menu-position="HorizontalDirection.Left"
:menu-id="`member-actions-${targetUser.id}`"
@chosen="({ item: actionItem }) => onActionChosen(actionItem)"
>
<FormButton
@@ -123,10 +123,10 @@ type Documents = {
"\n fragment SettingsWorkspacesGeneralEditAvatar_Workspace on Workspace {\n id\n logo\n name\n }\n": typeof types.SettingsWorkspacesGeneralEditAvatar_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesGeneralEditSlugDialog_Workspace on Workspace {\n id\n name\n slug\n }\n": typeof types.SettingsWorkspacesGeneralEditSlugDialog_WorkspaceFragmentDoc,
"\n fragment WorkspaceBillingPage_Workspace on Workspace {\n id\n role\n subscription {\n currency\n billingInterval\n }\n plan {\n name\n usage {\n projectCount\n modelCount\n }\n }\n ...BillingAlert_Workspace\n }\n": typeof types.WorkspaceBillingPage_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n": typeof types.SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n email\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n": typeof types.SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_Workspace on Workspace {\n id\n ...SettingsWorkspacesMembersTableHeader_Workspace\n invitedTeam {\n ...SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator\n }\n }\n": typeof types.SettingsWorkspacesMembersInvitesTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n user {\n id\n avatar\n name\n }\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersRequestsTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n projectRoles {\n project {\n id\n }\n }\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n": typeof types.SettingsWorkspacesMembersTable_WorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n email\n user {\n id\n avatar\n name\n }\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersRequestsTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n email\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n": typeof types.SettingsWorkspacesMembersTable_WorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersTableHeader_Workspace on Workspace {\n id\n slug\n role\n ...InviteDialogWorkspace_Workspace\n permissions {\n canInvite {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersTableHeader_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersActionsMenu_User on WorkspaceCollaborator {\n id\n role\n seatType\n joinDate\n user {\n id\n name\n avatar\n workspaceDomainPolicyCompliant(workspaceSlug: $slug)\n }\n ...SettingsWorkspacesMembersActionsProjectPermissionsDialog_User\n }\n": typeof types.SettingsWorkspacesMembersActionsMenu_UserFragmentDoc,
"\n fragment SettingsWorkspacesMembersActionsProjectPermissionsDialog_User on WorkspaceCollaborator {\n projectRoles {\n project {\n id\n name\n }\n role\n }\n }\n": typeof types.SettingsWorkspacesMembersActionsProjectPermissionsDialog_UserFragmentDoc,
@@ -337,10 +337,11 @@ type Documents = {
"\n query SettingsWorkspaceBilling($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n ...WorkspaceBillingPage_Workspace\n }\n }\n": typeof types.SettingsWorkspaceBillingDocument,
"\n query SettingsWorkspaceBillingCustomerPortal($workspaceId: String!) {\n workspace(id: $workspaceId) {\n customerPortalUrl\n }\n }\n": typeof types.SettingsWorkspaceBillingCustomerPortalDocument,
"\n query SettingsWorkspaceRegions($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n ...SettingsWorkspacesRegions_Workspace\n }\n serverInfo {\n ...SettingsWorkspacesRegions_ServerInfo\n }\n }\n": typeof types.SettingsWorkspaceRegionsDocument,
"\n query SettingsWorkspacesMembers($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n": typeof types.SettingsWorkspacesMembersDocument,
"\n query SettingsWorkspacesMembers(\n $slug: String!\n $filter: AdminWorkspaceJoinRequestFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n": typeof types.SettingsWorkspacesMembersDocument,
"\n query SettingsWorkspacesMembersInvites($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersInvitesTable_Workspace\n }\n }\n": typeof types.SettingsWorkspacesMembersInvitesDocument,
"\n query SettingsWorkspacesMembersRequests($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersRequestsTable_Workspace\n }\n }\n": typeof types.SettingsWorkspacesMembersRequestsDocument,
"\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n team(filter: $filter, limit: 250) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersSearchDocument,
"\n query SettingsWorkspacesMembersTableQuery($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n permissions {\n canReadMemberEmail {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersTableQueryDocument,
"\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n team(filter: $filter, limit: 10) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersSearchDocument,
"\n query SettingsWorkspacesInvitesSearch(\n $slug: String!\n $invitesFilter: PendingWorkspaceCollaboratorsFilter\n ) {\n workspaceBySlug(slug: $slug) {\n id\n ...SettingsWorkspacesMembersTableHeader_Workspace\n invitedTeam(filter: $invitesFilter) {\n ...SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator\n }\n }\n }\n": typeof types.SettingsWorkspacesInvitesSearchDocument,
"\n query SettingsWorkspacesProjects(\n $slug: String!\n $limit: Int!\n $cursor: String\n $filter: WorkspaceProjectsFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesProjects_Workspace\n projects(limit: $limit, cursor: $cursor, filter: $filter) {\n cursor\n ...SettingsWorkspacesProjects_ProjectCollection\n }\n }\n }\n": typeof types.SettingsWorkspacesProjectsDocument,
"\n query SettingsWorkspaceSecurity($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesSecurity_Workspace\n }\n }\n": typeof types.SettingsWorkspaceSecurityDocument,
@@ -446,7 +447,7 @@ type Documents = {
"\n fragment SettingsServerProjects_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...SettingsSharedProjects_Project\n }\n }\n": typeof types.SettingsServerProjects_ProjectCollectionFragmentDoc,
"\n query SettingsServerRegions {\n serverInfo {\n multiRegion {\n regions {\n id\n ...SettingsServerRegionsTable_ServerRegionItem\n }\n availableKeys\n }\n }\n }\n": typeof types.SettingsServerRegionsDocument,
"\n fragment SettingsWorkspacesGeneral_Workspace on Workspace {\n ...SettingsWorkspacesGeneralEditAvatar_Workspace\n ...SettingsWorkspaceGeneralDeleteDialog_Workspace\n ...SettingsWorkspacesGeneralEditSlugDialog_Workspace\n id\n name\n slug\n description\n logo\n role\n plan {\n status\n name\n }\n embedOptions {\n hideSpeckleBranding\n }\n permissions {\n canEditEmbedOptions {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.SettingsWorkspacesGeneral_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n adminWorkspacesJoinRequests {\n items {\n id\n status\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersCounts_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n teamByRole {\n admins {\n totalCount\n }\n members {\n totalCount\n }\n guests {\n totalCount\n }\n }\n adminWorkspacesJoinRequests(filter: $filter) {\n totalCount\n items {\n id\n status\n }\n }\n }\n": typeof types.SettingsWorkspacesMembersCounts_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesProjects_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...SettingsSharedProjects_Project\n }\n }\n": typeof types.SettingsWorkspacesProjects_ProjectCollectionFragmentDoc,
"\n fragment SettingsWorkspacesProjects_Workspace on Workspace {\n id\n name\n slug\n plan {\n name\n }\n role\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.SettingsWorkspacesProjects_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesRegions_Workspace on Workspace {\n id\n role\n defaultRegion {\n id\n ...SettingsWorkspacesRegionsSelect_ServerRegionItem\n }\n hasAccessToMultiRegion: hasAccessToFeature(\n featureName: workspaceDataRegionSpecificity\n )\n hasProjects: projects(limit: 0) {\n totalCount\n }\n }\n": typeof types.SettingsWorkspacesRegions_WorkspaceFragmentDoc,
@@ -563,10 +564,10 @@ const documents: Documents = {
"\n fragment SettingsWorkspacesGeneralEditAvatar_Workspace on Workspace {\n id\n logo\n name\n }\n": types.SettingsWorkspacesGeneralEditAvatar_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesGeneralEditSlugDialog_Workspace on Workspace {\n id\n name\n slug\n }\n": types.SettingsWorkspacesGeneralEditSlugDialog_WorkspaceFragmentDoc,
"\n fragment WorkspaceBillingPage_Workspace on Workspace {\n id\n role\n subscription {\n currency\n billingInterval\n }\n plan {\n name\n usage {\n projectCount\n modelCount\n }\n }\n ...BillingAlert_Workspace\n }\n": types.WorkspaceBillingPage_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n": types.SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n email\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n": types.SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersInvitesTable_Workspace on Workspace {\n id\n ...SettingsWorkspacesMembersTableHeader_Workspace\n invitedTeam {\n ...SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator\n }\n }\n": types.SettingsWorkspacesMembersInvitesTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n user {\n id\n avatar\n name\n }\n }\n }\n }\n": types.SettingsWorkspacesMembersRequestsTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n projectRoles {\n project {\n id\n }\n }\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n": types.SettingsWorkspacesMembersTable_WorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n email\n user {\n id\n avatar\n name\n }\n }\n }\n }\n": types.SettingsWorkspacesMembersRequestsTable_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n email\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n": types.SettingsWorkspacesMembersTable_WorkspaceCollaboratorFragmentDoc,
"\n fragment SettingsWorkspacesMembersTableHeader_Workspace on Workspace {\n id\n slug\n role\n ...InviteDialogWorkspace_Workspace\n permissions {\n canInvite {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.SettingsWorkspacesMembersTableHeader_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersActionsMenu_User on WorkspaceCollaborator {\n id\n role\n seatType\n joinDate\n user {\n id\n name\n avatar\n workspaceDomainPolicyCompliant(workspaceSlug: $slug)\n }\n ...SettingsWorkspacesMembersActionsProjectPermissionsDialog_User\n }\n": types.SettingsWorkspacesMembersActionsMenu_UserFragmentDoc,
"\n fragment SettingsWorkspacesMembersActionsProjectPermissionsDialog_User on WorkspaceCollaborator {\n projectRoles {\n project {\n id\n name\n }\n role\n }\n }\n": types.SettingsWorkspacesMembersActionsProjectPermissionsDialog_UserFragmentDoc,
@@ -777,10 +778,11 @@ const documents: Documents = {
"\n query SettingsWorkspaceBilling($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n ...WorkspaceBillingPage_Workspace\n }\n }\n": types.SettingsWorkspaceBillingDocument,
"\n query SettingsWorkspaceBillingCustomerPortal($workspaceId: String!) {\n workspace(id: $workspaceId) {\n customerPortalUrl\n }\n }\n": types.SettingsWorkspaceBillingCustomerPortalDocument,
"\n query SettingsWorkspaceRegions($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n ...SettingsWorkspacesRegions_Workspace\n }\n serverInfo {\n ...SettingsWorkspacesRegions_ServerInfo\n }\n }\n": types.SettingsWorkspaceRegionsDocument,
"\n query SettingsWorkspacesMembers($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n": types.SettingsWorkspacesMembersDocument,
"\n query SettingsWorkspacesMembers(\n $slug: String!\n $filter: AdminWorkspaceJoinRequestFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n": types.SettingsWorkspacesMembersDocument,
"\n query SettingsWorkspacesMembersInvites($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersInvitesTable_Workspace\n }\n }\n": types.SettingsWorkspacesMembersInvitesDocument,
"\n query SettingsWorkspacesMembersRequests($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersRequestsTable_Workspace\n }\n }\n": types.SettingsWorkspacesMembersRequestsDocument,
"\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n team(filter: $filter, limit: 250) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n": types.SettingsWorkspacesMembersSearchDocument,
"\n query SettingsWorkspacesMembersTableQuery($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n permissions {\n canReadMemberEmail {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n": types.SettingsWorkspacesMembersTableQueryDocument,
"\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n team(filter: $filter, limit: 10) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n": types.SettingsWorkspacesMembersSearchDocument,
"\n query SettingsWorkspacesInvitesSearch(\n $slug: String!\n $invitesFilter: PendingWorkspaceCollaboratorsFilter\n ) {\n workspaceBySlug(slug: $slug) {\n id\n ...SettingsWorkspacesMembersTableHeader_Workspace\n invitedTeam(filter: $invitesFilter) {\n ...SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator\n }\n }\n }\n": types.SettingsWorkspacesInvitesSearchDocument,
"\n query SettingsWorkspacesProjects(\n $slug: String!\n $limit: Int!\n $cursor: String\n $filter: WorkspaceProjectsFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesProjects_Workspace\n projects(limit: $limit, cursor: $cursor, filter: $filter) {\n cursor\n ...SettingsWorkspacesProjects_ProjectCollection\n }\n }\n }\n": types.SettingsWorkspacesProjectsDocument,
"\n query SettingsWorkspaceSecurity($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesSecurity_Workspace\n }\n }\n": types.SettingsWorkspaceSecurityDocument,
@@ -886,7 +888,7 @@ const documents: Documents = {
"\n fragment SettingsServerProjects_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...SettingsSharedProjects_Project\n }\n }\n": types.SettingsServerProjects_ProjectCollectionFragmentDoc,
"\n query SettingsServerRegions {\n serverInfo {\n multiRegion {\n regions {\n id\n ...SettingsServerRegionsTable_ServerRegionItem\n }\n availableKeys\n }\n }\n }\n": types.SettingsServerRegionsDocument,
"\n fragment SettingsWorkspacesGeneral_Workspace on Workspace {\n ...SettingsWorkspacesGeneralEditAvatar_Workspace\n ...SettingsWorkspaceGeneralDeleteDialog_Workspace\n ...SettingsWorkspacesGeneralEditSlugDialog_Workspace\n id\n name\n slug\n description\n logo\n role\n plan {\n status\n name\n }\n embedOptions {\n hideSpeckleBranding\n }\n permissions {\n canEditEmbedOptions {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.SettingsWorkspacesGeneral_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n adminWorkspacesJoinRequests {\n items {\n id\n status\n }\n }\n }\n": types.SettingsWorkspacesMembersCounts_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n teamByRole {\n admins {\n totalCount\n }\n members {\n totalCount\n }\n guests {\n totalCount\n }\n }\n adminWorkspacesJoinRequests(filter: $filter) {\n totalCount\n items {\n id\n status\n }\n }\n }\n": types.SettingsWorkspacesMembersCounts_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesProjects_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...SettingsSharedProjects_Project\n }\n }\n": types.SettingsWorkspacesProjects_ProjectCollectionFragmentDoc,
"\n fragment SettingsWorkspacesProjects_Workspace on Workspace {\n id\n name\n slug\n plan {\n name\n }\n role\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.SettingsWorkspacesProjects_WorkspaceFragmentDoc,
"\n fragment SettingsWorkspacesRegions_Workspace on Workspace {\n id\n role\n defaultRegion {\n id\n ...SettingsWorkspacesRegionsSelect_ServerRegionItem\n }\n hasAccessToMultiRegion: hasAccessToFeature(\n featureName: workspaceDataRegionSpecificity\n )\n hasProjects: projects(limit: 0) {\n totalCount\n }\n }\n": types.SettingsWorkspacesRegions_WorkspaceFragmentDoc,
@@ -1347,7 +1349,7 @@ export function graphql(source: "\n fragment WorkspaceBillingPage_Workspace on
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n"];
export function graphql(source: "\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n email\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersInvitesTable_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n inviteId\n role\n title\n updatedAt\n email\n user {\n id\n ...LimitedUserAvatar\n }\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -1355,11 +1357,11 @@ export function graphql(source: "\n fragment SettingsWorkspacesMembersInvitesTa
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n user {\n id\n avatar\n name\n }\n }\n }\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n user {\n id\n avatar\n name\n }\n }\n }\n }\n"];
export function graphql(source: "\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n email\n user {\n id\n avatar\n name\n }\n }\n }\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersRequestsTable_Workspace on Workspace {\n ...SettingsWorkspacesMembersTableHeader_Workspace\n id\n adminWorkspacesJoinRequests {\n totalCount\n items {\n ...WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest\n id\n createdAt\n status\n email\n user {\n id\n avatar\n name\n }\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n projectRoles {\n project {\n id\n }\n }\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n projectRoles {\n project {\n id\n }\n }\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n"];
export function graphql(source: "\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n email\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersTable_WorkspaceCollaborator on WorkspaceCollaborator {\n id\n email\n ...SettingsWorkspacesMembersActionsMenu_User\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -2203,7 +2205,7 @@ export function graphql(source: "\n query SettingsWorkspaceRegions($slug: Strin
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n query SettingsWorkspacesMembers($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n"): (typeof documents)["\n query SettingsWorkspacesMembers($slug: String!) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n"];
export function graphql(source: "\n query SettingsWorkspacesMembers(\n $slug: String!\n $filter: AdminWorkspaceJoinRequestFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n"): (typeof documents)["\n query SettingsWorkspacesMembers(\n $slug: String!\n $filter: AdminWorkspaceJoinRequestFilter\n ) {\n workspaceBySlug(slug: $slug) {\n ...SettingsWorkspacesMembersCounts_Workspace\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -2215,7 +2217,11 @@ export function graphql(source: "\n query SettingsWorkspacesMembersRequests($sl
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n team(filter: $filter, limit: 250) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n"): (typeof documents)["\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n team(filter: $filter, limit: 250) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n"];
export function graphql(source: "\n query SettingsWorkspacesMembersTableQuery($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n permissions {\n canReadMemberEmail {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n"): (typeof documents)["\n query SettingsWorkspacesMembersTableQuery($slug: String!) {\n workspaceBySlug(slug: $slug) {\n id\n role\n ...SettingsWorkspacesMembersTableHeader_Workspace\n permissions {\n canReadMemberEmail {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n team(filter: $filter, limit: 10) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n"): (typeof documents)["\n query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {\n workspaceBySlug(slug: $slug) {\n id\n team(filter: $filter, limit: 10) {\n items {\n id\n ...SettingsWorkspacesMembersTable_WorkspaceCollaborator\n }\n cursor\n totalCount\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -2639,7 +2645,7 @@ export function graphql(source: "\n fragment SettingsWorkspacesGeneral_Workspac
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n adminWorkspacesJoinRequests {\n items {\n id\n status\n }\n }\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n adminWorkspacesJoinRequests {\n items {\n id\n status\n }\n }\n }\n"];
export function graphql(source: "\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n teamByRole {\n admins {\n totalCount\n }\n members {\n totalCount\n }\n guests {\n totalCount\n }\n }\n adminWorkspacesJoinRequests(filter: $filter) {\n totalCount\n items {\n id\n status\n }\n }\n }\n"): (typeof documents)["\n fragment SettingsWorkspacesMembersCounts_Workspace on Workspace {\n id\n role\n invitedTeam {\n id\n }\n teamByRole {\n admins {\n totalCount\n }\n members {\n totalCount\n }\n guests {\n totalCount\n }\n }\n adminWorkspacesJoinRequests(filter: $filter) {\n totalCount\n items {\n id\n status\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
File diff suppressed because one or more lines are too long
@@ -46,7 +46,10 @@ export const settingsWorkspaceRegionsQuery = graphql(`
`)
export const settingsWorkspacesMembersQuery = graphql(`
query SettingsWorkspacesMembers($slug: String!) {
query SettingsWorkspacesMembers(
$slug: String!
$filter: AdminWorkspaceJoinRequestFilter
) {
workspaceBySlug(slug: $slug) {
...SettingsWorkspacesMembersCounts_Workspace
}
@@ -69,13 +72,26 @@ export const settingsWorkspacesMembersRequestsQuery = graphql(`
}
`)
export const settingsWorkspacesMembersSearchQuery = graphql(`
query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {
export const settingsWorkspacesMembersTableQuery = graphql(`
query SettingsWorkspacesMembersTableQuery($slug: String!) {
workspaceBySlug(slug: $slug) {
id
role
...SettingsWorkspacesMembersTableHeader_Workspace
team(filter: $filter, limit: 250) {
permissions {
canReadMemberEmail {
...FullPermissionCheckResult
}
}
}
}
`)
export const settingsWorkspacesMembersSearchQuery = graphql(`
query SettingsWorkspacesMembersSearch($slug: String!, $filter: WorkspaceTeamFilter) {
workspaceBySlug(slug: $slug) {
id
team(filter: $filter, limit: 10) {
items {
id
...SettingsWorkspacesMembersTable_WorkspaceCollaborator
@@ -22,7 +22,6 @@ import { settingsWorkspacesMembersQuery } from '~/lib/settings/graphql/queries'
import type { LayoutPageTabItem } from '~~/lib/layout/helpers/components'
import { useOnWorkspaceUpdated } from '~/lib/workspaces/composables/management'
import { settingsWorkspaceRoutes } from '~/lib/common/helpers/route'
import { useWorkspaceUsage } from '~/lib/workspaces/composables/usage'
import { WorkspaceJoinRequestStatus } from '~/lib/common/generated/gql/graphql'
graphql(`
@@ -32,11 +31,19 @@ graphql(`
invitedTeam {
id
}
adminWorkspacesJoinRequests {
items {
id
status
teamByRole {
admins {
totalCount
}
members {
totalCount
}
guests {
totalCount
}
}
adminWorkspacesJoinRequests(filter: $filter) {
totalCount
}
}
`)
@@ -53,26 +60,32 @@ const route = useRoute()
const router = useRouter()
const slug = computed(() => (route.params.slug as string) || '')
const { memberCount, guestCount, adminCount } = useWorkspaceUsage(slug.value)
const { result } = useQuery(settingsWorkspacesMembersQuery, () => ({
slug: slug.value
slug: slug.value,
filter: {
status: WorkspaceJoinRequestStatus.Pending
}
}))
const workspace = computed(() => result.value?.workspaceBySlug)
const isAdmin = computed(() => workspace.value?.role === Roles.Workspace.Admin)
const memberTotalCount = computed(() => memberCount.value + adminCount.value)
const memberTotalCount = computed(
() =>
(workspace.value?.teamByRole.members?.totalCount ?? 0) +
(workspace.value?.teamByRole.admins?.totalCount ?? 0)
)
const guestTotalCount = computed(
() => workspace.value?.teamByRole.guests?.totalCount ?? 0
)
const invitedCount = computed(() => workspace.value?.invitedTeam?.length)
const joinRequestCount = computed(
() =>
workspace.value?.adminWorkspacesJoinRequests?.items.filter(
(item) => item.status === WorkspaceJoinRequestStatus.Pending
).length
() => workspace.value?.adminWorkspacesJoinRequests?.totalCount
)
const tabItems = computed<LayoutPageTabItem[]>(() => [
{ title: 'Members', id: 'members', count: memberTotalCount.value },
{ title: 'Guests', id: 'guests', count: guestCount.value },
{ title: 'Guests', id: 'guests', count: guestTotalCount.value },
{
title: 'Pending invites',
id: 'invites',