Confirmation dialog
This commit is contained in:
@@ -2,18 +2,7 @@
|
||||
<div>
|
||||
<!-- Current State -->
|
||||
<CommonCard class="!p-2 !pr-3 !border-outline-3 !bg-foundation-2">
|
||||
<div class="flex items-center gap-2">
|
||||
<div class="p-2 rounded-full border border-outline-3 bg-foundation">
|
||||
<component :is="currentState.icon" class="w-5 h-5" />
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<div class="text-foreground">{{ currentState.title }}</div>
|
||||
<div class="text-foreground-2 text-body-2xs">
|
||||
{{ currentState.description }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-auto text-foreground-2 font-medium">Current</div>
|
||||
</div>
|
||||
<slot name="current-state" />
|
||||
</CommonCard>
|
||||
|
||||
<!-- Arrow -->
|
||||
@@ -25,36 +14,11 @@
|
||||
<CommonCard
|
||||
class="!p-2 !pr-3 !border-blue-300 !bg-blue-50 dark:!border-blue-800 dark:!bg-blue-950"
|
||||
>
|
||||
<div class="flex items-center gap-2">
|
||||
<div
|
||||
class="p-2.5 rounded-full border border-blue-300 dark:border-blue-800 bg-foundation"
|
||||
>
|
||||
<component :is="newState.icon" class="w-4 h-4" />
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<div class="text-foreground">{{ newState.title }}</div>
|
||||
<div class="text-foreground-2 text-body-2xs">
|
||||
{{ newState.description }}
|
||||
</div>
|
||||
</div>
|
||||
<slot name="price" />
|
||||
</div>
|
||||
<slot name="new-state" />
|
||||
</CommonCard>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ArrowDownIcon } from '@heroicons/vue/20/solid'
|
||||
import type { ConcreteComponent } from 'vue'
|
||||
|
||||
type TransitionCard = {
|
||||
icon: ConcreteComponent
|
||||
title: string
|
||||
description: string
|
||||
}
|
||||
|
||||
defineProps<{
|
||||
currentState: TransitionCard
|
||||
newState: TransitionCard
|
||||
}>()
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
<template>
|
||||
<div>
|
||||
<LayoutDialog
|
||||
v-model:open="open"
|
||||
max-width="sm"
|
||||
:buttons="dialogButtons"
|
||||
prevent-close-on-click-outside
|
||||
>
|
||||
<template #header>Confirm move</template>
|
||||
<BillingTransitionCards
|
||||
:current-state="transitionItems.project"
|
||||
:new-state="transitionItems.workspace"
|
||||
>
|
||||
<template #current-state>
|
||||
<div class="flex flex-col">
|
||||
<div class="text-foreground-2 text-body-3xs">Project</div>
|
||||
<div class="flex items-center gap-4 justify-between">
|
||||
<div class="text-heading-sm mt-1">{{ project.name }}</div>
|
||||
<div class="text-body-2xs font-medium">(count) models</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #new-state>
|
||||
<div class="flex flex-col">
|
||||
<div class="text-foreground-2 text-body-3xs">Workspace</div>
|
||||
<div class="text-heading-sm mt-1">{{ workspace.name }}</div>
|
||||
</div>
|
||||
</template>
|
||||
</BillingTransitionCards>
|
||||
<div class="flex flex-col gap-y-4">
|
||||
<p class="text-body-2xs text-foreground-2 mt-4">
|
||||
The project, including all its data, will be moved to the workspace, where all
|
||||
existing members will have access by default.
|
||||
</p>
|
||||
|
||||
<div
|
||||
v-if="dryRunResultMembers.length > 0"
|
||||
class="pt-2 gap-y-2 flex flex-col border-t border-outline-3"
|
||||
>
|
||||
<p class="text-body-2xs text-foreground-2 mt-2 mb-1">
|
||||
{{
|
||||
dryRunResultMembers.length === 1
|
||||
? '1 person will also be added as a free member to the workspace.'
|
||||
: `${dryRunResultMembers.length} people will also be added as free members to the workspace.`
|
||||
}}
|
||||
</p>
|
||||
<div class="w-full">
|
||||
<div
|
||||
v-for="user in dryRunResultMembers"
|
||||
:key="`dry-run-user-${user.id}`"
|
||||
class="flex items-center py-1.5 px-2 border-t border-x last:border-b border-outline-3 first:rounded-t-lg last:rounded-b-lg gap-x-1.5"
|
||||
>
|
||||
<UserAvatar hide-tooltip :user="user" size="sm" />
|
||||
<p class="text-foreground text-body-2xs">{{ user.name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<p v-if="dryRunResultMembersInfoText" class="text-body-2xs text-foreground-2">
|
||||
{{ dryRunResultMembersInfoText }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</LayoutDialog>
|
||||
<WorkspaceRegionStaticDataDisclaimer
|
||||
v-if="showRegionStaticDataDisclaimer"
|
||||
v-model:open="showRegionStaticDataDisclaimer"
|
||||
:variant="RegionStaticDataDisclaimerVariant.MoveProjectIntoWorkspace"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { LayoutDialogButton } from '@speckle/ui-components'
|
||||
import type {
|
||||
ProjectsMoveToWorkspaceDialog_ProjectFragment,
|
||||
ProjectsMoveToWorkspaceDialog_WorkspaceFragment
|
||||
} from '~~/lib/common/generated/gql/graphql'
|
||||
import { useQuery } from '@vue/apollo-composable'
|
||||
import { moveToWorkspaceDryRunQuery } from '~/lib/projects/graphql/queries'
|
||||
import { useMoveProjectToWorkspace } from '~/lib/projects/composables/projectManagement'
|
||||
import {
|
||||
useWorkspaceCustomDataResidencyDisclaimer,
|
||||
RegionStaticDataDisclaimerVariant
|
||||
} from '~/lib/workspaces/composables/region'
|
||||
|
||||
const props = defineProps<{
|
||||
project: ProjectsMoveToWorkspaceDialog_ProjectFragment
|
||||
workspace: ProjectsMoveToWorkspaceDialog_WorkspaceFragment
|
||||
eventSource?: string
|
||||
}>()
|
||||
|
||||
const open = defineModel<boolean>('open', { required: true })
|
||||
const moveProject = useMoveProjectToWorkspace()
|
||||
|
||||
const { showRegionStaticDataDisclaimer, triggerAction } =
|
||||
useWorkspaceCustomDataResidencyDisclaimer({
|
||||
workspace: computed(() => props.workspace),
|
||||
onConfirmAction: async () => {
|
||||
const res = await moveProject({
|
||||
projectId: props.project.id,
|
||||
workspaceId: props.workspace.id,
|
||||
workspaceName: props.workspace.name,
|
||||
eventSource: props.eventSource
|
||||
})
|
||||
if (res?.id) {
|
||||
open.value = false
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const { result: dryRunResult } = useQuery(
|
||||
moveToWorkspaceDryRunQuery,
|
||||
() => ({
|
||||
projectId: props.project.id,
|
||||
workspaceId: props.workspace.id,
|
||||
limit: 20
|
||||
}),
|
||||
() => ({
|
||||
enabled: !!props.project.id && !!props.workspace.id
|
||||
})
|
||||
)
|
||||
|
||||
const dryRunResultMembers = computed(
|
||||
() => dryRunResult.value?.project.moveToWorkspaceDryRun.addedToWorkspace || []
|
||||
)
|
||||
const dryRunResultMembersCount = computed(
|
||||
() => dryRunResult.value?.project.moveToWorkspaceDryRun.addedToWorkspaceTotalCount
|
||||
)
|
||||
const dryRunResultMembersInfoText = computed(() => {
|
||||
if (!dryRunResultMembers.value || !dryRunResultMembersCount.value) return ''
|
||||
|
||||
if (dryRunResultMembers.value?.length > 20 && dryRunResultMembersCount.value > 20) {
|
||||
const diff = dryRunResultMembersCount.value - dryRunResultMembers.value.length
|
||||
return `and ${diff} more`
|
||||
}
|
||||
|
||||
return ''
|
||||
})
|
||||
|
||||
const dialogButtons = computed<LayoutDialogButton[]>(() => [
|
||||
{
|
||||
text: 'Back',
|
||||
props: {
|
||||
color: 'outline'
|
||||
},
|
||||
onClick: () => {
|
||||
open.value = false
|
||||
}
|
||||
},
|
||||
{
|
||||
text: 'Move',
|
||||
onClick: () => {
|
||||
triggerAction()
|
||||
}
|
||||
}
|
||||
])
|
||||
|
||||
const transitionItems = {
|
||||
project: {
|
||||
title: 'Viewer seat',
|
||||
description: 'Can view and comment on projects'
|
||||
},
|
||||
workspace: {
|
||||
title: 'Editor seat',
|
||||
description: 'Can view and comment on projects'
|
||||
}
|
||||
} as const
|
||||
</script>
|
||||
@@ -1,19 +1,42 @@
|
||||
<template>
|
||||
<div>
|
||||
<LayoutDialog v-model:open="open" max-width="sm" :buttons="dialogButtons">
|
||||
<LayoutDialog v-model:open="open" max-width="sm" prevent-close-on-click-outside>
|
||||
<template #header>Ready to move your project?</template>
|
||||
<div class="flex flex-col space-y-4">
|
||||
<template v-if="!workspace">
|
||||
<div v-if="hasWorkspaces">
|
||||
<div class="flex flex-col gap-4">
|
||||
<button v-for="ws in workspaces" :key="ws.id">
|
||||
<p class="mb-4">Select an existing workspaces or create a new one.</p>
|
||||
<div class="flex flex-col gap-2">
|
||||
<button
|
||||
v-for="ws in workspaces"
|
||||
:key="ws.id"
|
||||
class="w-full"
|
||||
@click="
|
||||
() => {
|
||||
selectedWorkspace = ws
|
||||
showConfirmDialog = true
|
||||
}
|
||||
"
|
||||
>
|
||||
<WorkspaceCard
|
||||
:logo="ws.logo ?? ''"
|
||||
:name="ws.name"
|
||||
:team-count="ws.projects.totalCount"
|
||||
:clickable="ws.role === Roles.Workspace.Admin"
|
||||
>
|
||||
<template #text>
|
||||
<div class="flex flex-col gap-2">
|
||||
<p>
|
||||
{{ ws.projects.totalCount }} projects,
|
||||
{{ ws.projects.totalCount }} models
|
||||
</p>
|
||||
<UserAvatarGroup
|
||||
:users="ws.team.items.map((t) => t.user)"
|
||||
:max-count="6"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template #actions>
|
||||
<CommonBadge color="secondary" class="capitalize">
|
||||
<CommonBadge color="secondary" class="capitalize" rounded>
|
||||
{{ ws.plan?.name }}
|
||||
</CommonBadge>
|
||||
</template>
|
||||
@@ -37,49 +60,30 @@
|
||||
to
|
||||
<span class="font-medium">{{ workspace.name }}</span>
|
||||
</p>
|
||||
<p class="text-foreground-3">
|
||||
{{ project.modelCount.totalCount }} {{ modelText }},
|
||||
{{ project.versions.totalCount }} {{ versionsText }}
|
||||
</p>
|
||||
</div>
|
||||
<p class="text-body-2xs text-foreground-2">
|
||||
The project, including models and versions, will be moved to the
|
||||
workspace, where all existing members and admins will have access.
|
||||
</p>
|
||||
<div
|
||||
v-if="dryRunResultMembers.length > 0"
|
||||
class="pt-2 gap-y-2 flex flex-col"
|
||||
>
|
||||
<p class="text-body-2xs text-foreground-2">
|
||||
The following people will be added to the workspace
|
||||
</p>
|
||||
<div class="w-full">
|
||||
<div
|
||||
v-for="user in dryRunResultMembers"
|
||||
:key="`dry-run-user-${user.id}`"
|
||||
class="bg-foundation flex items-center py-1.5 px-2 border-t border-x last:border-b border-outline-3 first:rounded-t-lg last:rounded-b-lg gap-x-1.5"
|
||||
>
|
||||
<UserAvatar hide-tooltip :user="user" size="sm" />
|
||||
<p class="text-foreground text-body-2xs">{{ user.name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<p
|
||||
v-if="dryRunResultMembersInfoText"
|
||||
class="text-body-2xs text-foreground-2"
|
||||
>
|
||||
{{ dryRunResultMembersInfoText }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<WorkspaceRegionStaticDataDisclaimer
|
||||
v-if="showRegionStaticDataDisclaimer"
|
||||
v-model:open="showRegionStaticDataDisclaimer"
|
||||
:variant="RegionStaticDataDisclaimerVariant.MoveProjectIntoWorkspace"
|
||||
@confirm="onConfirmHandler"
|
||||
/>
|
||||
<template #buttons>
|
||||
<FormButton
|
||||
color="outline"
|
||||
class="-my-2"
|
||||
full-width
|
||||
@click="navigateTo(workspaceCreateRoute())"
|
||||
>
|
||||
Create a new workspace
|
||||
</FormButton>
|
||||
</template>
|
||||
</LayoutDialog>
|
||||
|
||||
<ProjectsConfirmMoveDialog
|
||||
v-if="project && selectedWorkspace"
|
||||
v-model:open="showConfirmDialog"
|
||||
:project="project"
|
||||
:workspace="selectedWorkspace"
|
||||
:event-source="eventSource"
|
||||
/>
|
||||
|
||||
<WorkspacePlanLimitReachedDialog
|
||||
v-if="activeLimit"
|
||||
v-model:open="showLimitReachedDialog"
|
||||
@@ -98,14 +102,10 @@ import type {
|
||||
ProjectsMoveToWorkspaceDialog_ProjectFragment
|
||||
} from '~~/lib/common/generated/gql/graphql'
|
||||
import { useQuery } from '@vue/apollo-composable'
|
||||
import type { LayoutDialogButton } from '@speckle/ui-components'
|
||||
import { useMoveProjectToWorkspace } from '~/lib/projects/composables/projectManagement'
|
||||
import {
|
||||
useWorkspaceCustomDataResidencyDisclaimer,
|
||||
RegionStaticDataDisclaimerVariant
|
||||
} from '~/lib/workspaces/composables/region'
|
||||
import { UserAvatarGroup } from '@speckle/ui-components'
|
||||
import { useWorkspaceLimits } from '~/lib/workspaces/composables/limits'
|
||||
import { moveToWorkspaceDryRunQuery } from '~/lib/projects/graphql/queries'
|
||||
import { Roles } from '@speckle/shared'
|
||||
import { workspaceCreateRoute } from '~/lib/common/helpers/route'
|
||||
|
||||
graphql(`
|
||||
fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {
|
||||
@@ -120,6 +120,15 @@ graphql(`
|
||||
projects {
|
||||
totalCount
|
||||
}
|
||||
team {
|
||||
items {
|
||||
user {
|
||||
id
|
||||
name
|
||||
avatar
|
||||
}
|
||||
}
|
||||
}
|
||||
...WorkspaceHasCustomDataResidency_Workspace
|
||||
...ProjectsWorkspaceSelect_Workspace
|
||||
}
|
||||
@@ -169,22 +178,9 @@ const isWorkspacesEnabled = useIsWorkspacesEnabled()
|
||||
const { result } = useQuery(query, null, () => ({
|
||||
enabled: isWorkspacesEnabled.value
|
||||
}))
|
||||
const moveProject = useMoveProjectToWorkspace()
|
||||
|
||||
const selectedWorkspace = ref<ProjectsMoveToWorkspaceDialog_WorkspaceFragment>()
|
||||
|
||||
const { result: dryRunResult } = useQuery(
|
||||
moveToWorkspaceDryRunQuery,
|
||||
() => ({
|
||||
projectId: props.project?.id || '',
|
||||
workspaceId: props.workspace?.id || '',
|
||||
limit: 20
|
||||
}),
|
||||
() => ({
|
||||
enabled: !!props.project?.id && !!props.workspace?.id
|
||||
})
|
||||
)
|
||||
|
||||
const activeWorkspaceSlug = computed(() => props.workspace?.slug || '')
|
||||
|
||||
const dialogTitle = computed(() => {
|
||||
@@ -202,28 +198,6 @@ const showLimitReachedDialog = ref(false)
|
||||
|
||||
const workspaces = computed(() => result.value?.activeUser?.workspaces.items ?? [])
|
||||
const hasWorkspaces = computed(() => workspaces.value.length > 0)
|
||||
const modelText = computed(() =>
|
||||
props.project?.modelCount.totalCount === 1 ? 'model' : 'models'
|
||||
)
|
||||
const versionsText = computed(() =>
|
||||
props.project?.versions.totalCount === 1 ? 'version' : 'versions'
|
||||
)
|
||||
const dryRunResultMembers = computed(
|
||||
() => dryRunResult.value?.project.moveToWorkspaceDryRun.addedToWorkspace || []
|
||||
)
|
||||
const dryRunResultMembersCount = computed(
|
||||
() => dryRunResult.value?.project.moveToWorkspaceDryRun.addedToWorkspaceTotalCount
|
||||
)
|
||||
const dryRunResultMembersInfoText = computed(() => {
|
||||
if (!dryRunResultMembers.value || !dryRunResultMembersCount.value) return ''
|
||||
|
||||
if (dryRunResultMembers.value?.length > 20 && dryRunResultMembersCount.value > 20) {
|
||||
const diff = dryRunResultMembersCount.value - dryRunResultMembers.value.length
|
||||
return `and ${diff} more`
|
||||
}
|
||||
|
||||
return ''
|
||||
})
|
||||
|
||||
// Determine which limit type is hit
|
||||
const limitType = computed((): 'project' | 'model' | null => {
|
||||
@@ -242,61 +216,13 @@ const activeLimit = computed(() => {
|
||||
return 0
|
||||
})
|
||||
|
||||
const dialogButtons = computed<LayoutDialogButton[]>(() => {
|
||||
return [
|
||||
{
|
||||
text: 'Cancel',
|
||||
props: { color: 'outline' },
|
||||
onClick: () => {
|
||||
open.value = false
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
const onMoveClick = async (
|
||||
targetWorkspace: ProjectsMoveToWorkspaceDialog_WorkspaceFragment
|
||||
) => {
|
||||
if (!props.project) return
|
||||
|
||||
const projectModelCount = props.project.modelCount.totalCount
|
||||
const { canAddProject, canAddModels } = useWorkspaceLimits(targetWorkspace.slug)
|
||||
|
||||
// Check if we can add this project to the workspace
|
||||
if (!canAddProject.value || !canAddModels(projectModelCount)) {
|
||||
open.value = false
|
||||
showLimitReachedDialog.value = true
|
||||
} else {
|
||||
const { triggerAction } = useWorkspaceCustomDataResidencyDisclaimer({
|
||||
workspace: computed(() => targetWorkspace),
|
||||
onConfirmAction: async () => {
|
||||
const res = await moveProject({
|
||||
projectId: props.project!.id,
|
||||
workspaceId: targetWorkspace.id,
|
||||
workspaceName: targetWorkspace.name,
|
||||
eventSource: props.eventSource
|
||||
})
|
||||
if (res?.id) {
|
||||
open.value = false
|
||||
}
|
||||
}
|
||||
})
|
||||
triggerAction()
|
||||
}
|
||||
}
|
||||
|
||||
const { showRegionStaticDataDisclaimer, onConfirmHandler } =
|
||||
useWorkspaceCustomDataResidencyDisclaimer({
|
||||
workspace: computed(() => props.workspace),
|
||||
onConfirmAction: onMoveClick
|
||||
})
|
||||
const showConfirmDialog = ref(false)
|
||||
|
||||
watch(
|
||||
() => open.value,
|
||||
(isOpen, oldIsOpen) => {
|
||||
if (isOpen && isOpen !== oldIsOpen) {
|
||||
selectedWorkspace.value = undefined
|
||||
showRegionStaticDataDisclaimer.value = false
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
@@ -1,19 +1,22 @@
|
||||
<template>
|
||||
<CommonCard class="w-full bg-foundation">
|
||||
<CommonCard
|
||||
class="w-full bg-foundation border-outline-2 !p-4"
|
||||
:class="{
|
||||
'cursor-pointer hover:border-outline-3 shadow-sm hover:border-zinc-400': clickable
|
||||
}"
|
||||
@click="clickable && onClick"
|
||||
>
|
||||
<div class="flex justify-between gap-4">
|
||||
<div class="flex gap-4">
|
||||
<WorkspaceAvatar :name="name" :logo="logo" size="xl" />
|
||||
<div class="flex flex-col sm:flex-row gap-4 justify-between flex-1">
|
||||
<div class="flex flex-col flex-1">
|
||||
<h6 class="text-heading-sm">{{ name }}</h6>
|
||||
<p class="text-body-2xs text-foreground-2">
|
||||
{{ teamCount }}
|
||||
{{ teamCount === 1 ? 'member' : 'members' }}
|
||||
</p>
|
||||
<div class="flex flex-col items-start text-body-2xs text-foreground-2">
|
||||
<h6 class="text-heading-sm text-foreground">{{ name }}</h6>
|
||||
<slot name="text"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-y-2">
|
||||
<div class="flex flex-col gap-y-2" @click.stop>
|
||||
<slot name="actions"></slot>
|
||||
</div>
|
||||
</div>
|
||||
@@ -21,9 +24,19 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
const props = defineProps<{
|
||||
logo: string
|
||||
name: string
|
||||
teamCount: number
|
||||
clickable?: boolean
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'click'): void
|
||||
}>()
|
||||
|
||||
const onClick = () => {
|
||||
if (props.clickable) {
|
||||
emit('click')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -45,14 +45,14 @@ type Documents = {
|
||||
"\n fragment FormSelectModels_Model on Model {\n id\n name\n }\n": typeof types.FormSelectModels_ModelFragmentDoc,
|
||||
"\n fragment FormSelectProjects_Project on Project {\n id\n name\n }\n": typeof types.FormSelectProjects_ProjectFragmentDoc,
|
||||
"\n fragment FormUsersSelectItem on LimitedUser {\n id\n name\n avatar\n }\n": typeof types.FormUsersSelectItemFragmentDoc,
|
||||
"\n fragment HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\n }\n": typeof types.HeaderNavShare_ProjectFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n": typeof types.HeaderNavNotificationsProjectInvite_PendingStreamCollaboratorFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": typeof types.HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaboratorFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherActiveWorkspace_Workspace on Workspace {\n id\n name\n logo\n ...HeaderWorkspaceSwitcherHeaderWorkspace_Workspace\n }\n": typeof types.HeaderWorkspaceSwitcherActiveWorkspace_WorkspaceFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherWorkspaceList_Workspace on Workspace {\n id\n name\n logo\n role\n slug\n creationState {\n completed\n }\n plan {\n name\n }\n }\n": typeof types.HeaderWorkspaceSwitcherWorkspaceList_WorkspaceFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherWorkspaceList_User on User {\n id\n expiredSsoSessions {\n id\n ...HeaderWorkspaceSwitcherHeaderExpiredSso_LimitedWorkspace\n }\n workspaces {\n items {\n id\n ...HeaderWorkspaceSwitcherWorkspaceList_Workspace\n }\n }\n }\n": typeof types.HeaderWorkspaceSwitcherWorkspaceList_UserFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherHeaderExpiredSso_LimitedWorkspace on LimitedWorkspace {\n id\n slug\n name\n logo\n }\n": typeof types.HeaderWorkspaceSwitcherHeaderExpiredSso_LimitedWorkspaceFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherHeaderWorkspace_Workspace on Workspace {\n ...InviteDialogWorkspace_Workspace\n id\n name\n logo\n role\n plan {\n name\n }\n team {\n totalCount\n }\n }\n": typeof types.HeaderWorkspaceSwitcherHeaderWorkspace_WorkspaceFragmentDoc,
|
||||
"\n fragment HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\n }\n": typeof types.HeaderNavShare_ProjectFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n": typeof types.HeaderNavNotificationsProjectInvite_PendingStreamCollaboratorFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": typeof types.HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaboratorFragmentDoc,
|
||||
"\n fragment InviteDialogWorkspace_Workspace on Workspace {\n id\n name\n domainBasedMembershipProtectionEnabled\n domains {\n domain\n id\n }\n }\n": typeof types.InviteDialogWorkspace_WorkspaceFragmentDoc,
|
||||
"\n fragment InviteDialogProject_Project on Project {\n id\n name\n ...InviteDialogProjectWorkspaceMembers_Project\n workspace {\n id\n name\n role\n domainBasedMembershipProtectionEnabled\n domains {\n domain\n id\n }\n }\n }\n": typeof types.InviteDialogProject_ProjectFragmentDoc,
|
||||
"\n fragment InviteDialogProjectWorkspaceMembersRow_WorkspaceCollaborator on WorkspaceCollaborator {\n role\n id\n user {\n id\n name\n bio\n company\n avatar\n verified\n role\n }\n }\n": typeof types.InviteDialogProjectWorkspaceMembersRow_WorkspaceCollaboratorFragmentDoc,
|
||||
@@ -102,7 +102,7 @@ type Documents = {
|
||||
"\n fragment ProjectsDeleteDialog_Project on Project {\n id\n name\n role\n models(limit: 0) {\n totalCount\n }\n workspace {\n slug\n id\n }\n versions(limit: 0) {\n totalCount\n }\n }\n": typeof types.ProjectsDeleteDialog_ProjectFragmentDoc,
|
||||
"\n fragment ProjectsHiddenProjectWarning_User on User {\n id\n expiredSsoSessions {\n id\n slug\n name\n logo\n }\n }\n": typeof types.ProjectsHiddenProjectWarning_UserFragmentDoc,
|
||||
"\n fragment MoveToWorkspaceAlert_Project on Project {\n ...ProjectsMoveToWorkspaceDialog_Project\n }\n": typeof types.MoveToWorkspaceAlert_ProjectFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n": typeof types.ProjectsMoveToWorkspaceDialog_WorkspaceFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n team {\n items {\n user {\n id\n name\n avatar\n }\n }\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n": typeof types.ProjectsMoveToWorkspaceDialog_WorkspaceFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_User on User {\n workspaces {\n items {\n ...ProjectsMoveToWorkspaceDialog_Workspace\n }\n }\n }\n": typeof types.ProjectsMoveToWorkspaceDialog_UserFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_Project on Project {\n id\n name\n modelCount: models(limit: 0) {\n totalCount\n }\n versions(limit: 0) {\n totalCount\n }\n }\n": typeof types.ProjectsMoveToWorkspaceDialog_ProjectFragmentDoc,
|
||||
"\n query ProjectsMoveToWorkspaceDialog {\n activeUser {\n id\n ...ProjectsMoveToWorkspaceDialog_User\n }\n }\n": typeof types.ProjectsMoveToWorkspaceDialogDocument,
|
||||
@@ -459,14 +459,14 @@ const documents: Documents = {
|
||||
"\n fragment FormSelectModels_Model on Model {\n id\n name\n }\n": types.FormSelectModels_ModelFragmentDoc,
|
||||
"\n fragment FormSelectProjects_Project on Project {\n id\n name\n }\n": types.FormSelectProjects_ProjectFragmentDoc,
|
||||
"\n fragment FormUsersSelectItem on LimitedUser {\n id\n name\n avatar\n }\n": types.FormUsersSelectItemFragmentDoc,
|
||||
"\n fragment HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\n }\n": types.HeaderNavShare_ProjectFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n": types.HeaderNavNotificationsProjectInvite_PendingStreamCollaboratorFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": types.HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaboratorFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherActiveWorkspace_Workspace on Workspace {\n id\n name\n logo\n ...HeaderWorkspaceSwitcherHeaderWorkspace_Workspace\n }\n": types.HeaderWorkspaceSwitcherActiveWorkspace_WorkspaceFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherWorkspaceList_Workspace on Workspace {\n id\n name\n logo\n role\n slug\n creationState {\n completed\n }\n plan {\n name\n }\n }\n": types.HeaderWorkspaceSwitcherWorkspaceList_WorkspaceFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherWorkspaceList_User on User {\n id\n expiredSsoSessions {\n id\n ...HeaderWorkspaceSwitcherHeaderExpiredSso_LimitedWorkspace\n }\n workspaces {\n items {\n id\n ...HeaderWorkspaceSwitcherWorkspaceList_Workspace\n }\n }\n }\n": types.HeaderWorkspaceSwitcherWorkspaceList_UserFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherHeaderExpiredSso_LimitedWorkspace on LimitedWorkspace {\n id\n slug\n name\n logo\n }\n": types.HeaderWorkspaceSwitcherHeaderExpiredSso_LimitedWorkspaceFragmentDoc,
|
||||
"\n fragment HeaderWorkspaceSwitcherHeaderWorkspace_Workspace on Workspace {\n ...InviteDialogWorkspace_Workspace\n id\n name\n logo\n role\n plan {\n name\n }\n team {\n totalCount\n }\n }\n": types.HeaderWorkspaceSwitcherHeaderWorkspace_WorkspaceFragmentDoc,
|
||||
"\n fragment HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\n }\n": types.HeaderNavShare_ProjectFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n": types.HeaderNavNotificationsProjectInvite_PendingStreamCollaboratorFragmentDoc,
|
||||
"\n fragment HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": types.HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaboratorFragmentDoc,
|
||||
"\n fragment InviteDialogWorkspace_Workspace on Workspace {\n id\n name\n domainBasedMembershipProtectionEnabled\n domains {\n domain\n id\n }\n }\n": types.InviteDialogWorkspace_WorkspaceFragmentDoc,
|
||||
"\n fragment InviteDialogProject_Project on Project {\n id\n name\n ...InviteDialogProjectWorkspaceMembers_Project\n workspace {\n id\n name\n role\n domainBasedMembershipProtectionEnabled\n domains {\n domain\n id\n }\n }\n }\n": types.InviteDialogProject_ProjectFragmentDoc,
|
||||
"\n fragment InviteDialogProjectWorkspaceMembersRow_WorkspaceCollaborator on WorkspaceCollaborator {\n role\n id\n user {\n id\n name\n bio\n company\n avatar\n verified\n role\n }\n }\n": types.InviteDialogProjectWorkspaceMembersRow_WorkspaceCollaboratorFragmentDoc,
|
||||
@@ -516,7 +516,7 @@ const documents: Documents = {
|
||||
"\n fragment ProjectsDeleteDialog_Project on Project {\n id\n name\n role\n models(limit: 0) {\n totalCount\n }\n workspace {\n slug\n id\n }\n versions(limit: 0) {\n totalCount\n }\n }\n": types.ProjectsDeleteDialog_ProjectFragmentDoc,
|
||||
"\n fragment ProjectsHiddenProjectWarning_User on User {\n id\n expiredSsoSessions {\n id\n slug\n name\n logo\n }\n }\n": types.ProjectsHiddenProjectWarning_UserFragmentDoc,
|
||||
"\n fragment MoveToWorkspaceAlert_Project on Project {\n ...ProjectsMoveToWorkspaceDialog_Project\n }\n": types.MoveToWorkspaceAlert_ProjectFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n": types.ProjectsMoveToWorkspaceDialog_WorkspaceFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n team {\n items {\n user {\n id\n name\n avatar\n }\n }\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n": types.ProjectsMoveToWorkspaceDialog_WorkspaceFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_User on User {\n workspaces {\n items {\n ...ProjectsMoveToWorkspaceDialog_Workspace\n }\n }\n }\n": types.ProjectsMoveToWorkspaceDialog_UserFragmentDoc,
|
||||
"\n fragment ProjectsMoveToWorkspaceDialog_Project on Project {\n id\n name\n modelCount: models(limit: 0) {\n totalCount\n }\n versions(limit: 0) {\n totalCount\n }\n }\n": types.ProjectsMoveToWorkspaceDialog_ProjectFragmentDoc,
|
||||
"\n query ProjectsMoveToWorkspaceDialog {\n activeUser {\n id\n ...ProjectsMoveToWorkspaceDialog_User\n }\n }\n": types.ProjectsMoveToWorkspaceDialogDocument,
|
||||
@@ -980,18 +980,6 @@ export function graphql(source: "\n fragment FormSelectProjects_Project on Proj
|
||||
* 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 FormUsersSelectItem on LimitedUser {\n id\n name\n avatar\n }\n"): (typeof documents)["\n fragment FormUsersSelectItem on LimitedUser {\n id\n name\n avatar\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 HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\n }\n"): (typeof documents)["\n fragment HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\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 HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n"): (typeof documents)["\n fragment HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\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 HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n"): (typeof documents)["\n fragment HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
@@ -1012,6 +1000,18 @@ export function graphql(source: "\n fragment HeaderWorkspaceSwitcherHeaderExpir
|
||||
* 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 HeaderWorkspaceSwitcherHeaderWorkspace_Workspace on Workspace {\n ...InviteDialogWorkspace_Workspace\n id\n name\n logo\n role\n plan {\n name\n }\n team {\n totalCount\n }\n }\n"): (typeof documents)["\n fragment HeaderWorkspaceSwitcherHeaderWorkspace_Workspace on Workspace {\n ...InviteDialogWorkspace_Workspace\n id\n name\n logo\n role\n plan {\n name\n }\n team {\n totalCount\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 HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\n }\n"): (typeof documents)["\n fragment HeaderNavShare_Project on Project {\n id\n visibility\n ...ProjectsModelPageEmbed_Project\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 HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\n }\n }\n"): (typeof documents)["\n fragment HeaderNavNotificationsProjectInvite_PendingStreamCollaborator on PendingStreamCollaborator {\n id\n invitedBy {\n ...LimitedUserAvatar\n }\n projectId\n projectName\n token\n user {\n id\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 HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n"): (typeof documents)["\n fragment HeaderNavNotificationsWorkspaceInvite_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n invitedBy {\n id\n ...LimitedUserAvatar\n }\n workspaceId\n workspaceName\n token\n user {\n id\n }\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
@@ -1211,7 +1211,7 @@ export function graphql(source: "\n fragment MoveToWorkspaceAlert_Project on Pr
|
||||
/**
|
||||
* 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 ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n"): (typeof documents)["\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n"];
|
||||
export function graphql(source: "\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n team {\n items {\n user {\n id\n name\n avatar\n }\n }\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\n }\n"): (typeof documents)["\n fragment ProjectsMoveToWorkspaceDialog_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n projects {\n totalCount\n }\n team {\n items {\n user {\n id\n name\n avatar\n }\n }\n }\n ...WorkspaceHasCustomDataResidency_Workspace\n ...ProjectsWorkspaceSelect_Workspace\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
Reference in New Issue
Block a user