fix(fe) move project permissions

fix(fe) move project permissions
This commit is contained in:
andrewwallacespeckle
2025-04-15 10:07:04 +01:00
committed by GitHub
10 changed files with 100 additions and 87 deletions
@@ -64,7 +64,12 @@
}}
</FormButton>
<FormButton
v-if="!project.workspace?.id && isWorkspacesEnabled"
v-if="
!project.workspace?.id &&
isWorkspacesEnabled &&
(project.role === Roles.Stream.Contributor ||
project.role === Roles.Stream.Owner)
"
size="sm"
color="outline"
@click="$emit('moveProject', project.id)"
@@ -107,6 +112,7 @@
</div>
</template>
<script lang="ts" setup>
import { Roles } from '@speckle/shared'
import { FormButton } from '@speckle/ui-components'
import type { ProjectDashboardItemFragment } from '~~/lib/common/generated/gql/graphql'
import {
@@ -54,7 +54,7 @@
<WorkspaceHeaderAddProjectMenu
button-copy="Add your first project"
:can-create-project="canCreateProject"
:can-move-project="canMoveProject"
:can-move-project-to-workspace="canMoveProjectToWorkspace"
@new-project="openNewProject = true"
@move-project="showMoveProjectsDialog = true"
/>
@@ -83,7 +83,7 @@
<script setup lang="ts">
import { MagnifyingGlassIcon, Squares2X2Icon } from '@heroicons/vue/24/outline'
import { useQuery, useQueryLoading } from '@vue/apollo-composable'
import { Roles, type Nullable, type Optional, type StreamRoles } from '@speckle/shared'
import type { Nullable, Optional, StreamRoles } from '@speckle/shared'
import {
workspacePageQuery,
workspaceProjectsQuery
@@ -91,10 +91,7 @@ import {
import { useDebouncedTextInput } from '@speckle/ui-components'
import { usePaginatedQuery } from '~/lib/common/composables/graphql'
import { graphql } from '~~/lib/common/generated/gql'
import type {
FullPermissionCheckResultFragment,
WorkspaceProjectsQueryQueryVariables
} from '~~/lib/common/generated/gql/graphql'
import type { WorkspaceProjectsQueryQueryVariables } from '~~/lib/common/generated/gql/graphql'
import { workspaceRoute } from '~/lib/common/helpers/route'
import { useBillingActions } from '~/lib/billing/composables/actions'
import { useWorkspacesWizard } from '~/lib/workspaces/composables/wizard'
@@ -195,14 +192,9 @@ const { finalizeWizard } = useWorkspacesWizard()
const canCreateProject = computed(
() => initialQueryResult.value?.workspaceBySlug?.permissions.canCreateProject
)
const canMoveProject = computed((): FullPermissionCheckResultFragment => {
// TODO: Until we have a real resolver
return {
authorized: isWorkspaceAdmin.value,
message: isWorkspaceAdmin.value ? 'OK' : 'You must be a workspace admin',
code: isWorkspaceAdmin.value ? 'OK' : 'FORBIDDEN'
}
})
const canMoveProjectToWorkspace = computed(
() => initialQueryResult.value?.workspaceBySlug?.permissions.canMoveProjectToWorkspace
)
const projects = computed(() => query.result.value?.workspaceBySlug?.projects)
const workspaceInvite = computed(() => initialQueryResult.value?.workspaceInvite)
@@ -213,8 +205,6 @@ const showEmptyState = computed(() => {
return projects.value && !projects.value?.items?.length
})
const isWorkspaceAdmin = computed(() => workspace.value?.role === Roles.Workspace.Admin)
const showLoadingBar = computed(() => {
const isLoading = areQueriesLoading.value || (!!search.value && query.loading.value)
@@ -49,7 +49,7 @@ const props = defineProps<{
hideTextOnMobile?: boolean
buttonCopy?: string
canCreateProject: FullPermissionCheckResultFragment | undefined
canMoveProject: FullPermissionCheckResultFragment | undefined
canMoveProjectToWorkspace: FullPermissionCheckResultFragment | undefined
}>()
const menuId = useId()
@@ -65,7 +65,9 @@ const menuItems = computed<LayoutMenuItem[][]>(() => [
},
{
title: 'Move existing project...',
id: AddNewProjectActionTypes.MoveProject
id: AddNewProjectActionTypes.MoveProject,
disabled: !props.canMoveProjectToWorkspace?.authorized,
disabledTooltip: props.canMoveProjectToWorkspace?.message
}
]
])
@@ -23,7 +23,7 @@
<WorkspaceHeaderAddProjectMenu
hide-text-on-mobile
:can-create-project="canCreateProject"
:can-move-project="canMoveProject"
:can-move-project-to-workspace="canMoveProjectToWorkspace"
@new-project="$emit('show-new-project-dialog')"
@move-project="$emit('show-move-projects-dialog')"
/>
@@ -58,7 +58,6 @@
import { graphql } from '~~/lib/common/generated/gql'
import {
WorkspacePlanStatuses,
type FullPermissionCheckResultFragment,
type WorkspaceHeader_WorkspaceFragment
} from '~~/lib/common/generated/gql/graphql'
import { Cog8ToothIcon } from '@heroicons/vue/24/outline'
@@ -77,6 +76,9 @@ graphql(`
canCreateProject {
...FullPermissionCheckResult
}
canMoveProjectToWorkspace {
...FullPermissionCheckResult
}
}
}
`)
@@ -106,14 +108,9 @@ const isWorkspaceMember = computed(
const canCreateProject = computed(
() => props.workspaceInfo.permissions.canCreateProject
)
const canMoveProject = computed((): FullPermissionCheckResultFragment => {
// TODO: Until we have a real resolver
return {
authorized: isWorkspaceAdmin.value,
message: isWorkspaceAdmin.value ? 'OK' : 'You must be a workspace admin',
code: isWorkspaceAdmin.value ? 'OK' : 'FORBIDDEN'
}
})
const canMoveProjectToWorkspace = computed(
() => props.workspaceInfo.permissions.canMoveProjectToWorkspace
)
const showBillingAlert = computed(
() =>
props.workspaceInfo.plan?.status === WorkspacePlanStatuses.PaymentFailed ||
@@ -82,6 +82,11 @@ graphql(`
graphql(`
fragment WorkspaceMoveProjectManager_Project on Project {
...WorkspaceMoveProjectManager_ProjectBase
permissions {
canMoveToWorkspace {
...FullPermissionCheckResult
}
}
workspace {
id
permissions {
@@ -37,7 +37,7 @@
</div>
</div>
<div
:key="`${project.id}-${project.workspace?.permissions?.canMoveProjectToWorkspace?.code}`"
:key="`${project.id}-${project.permissions.canMoveToWorkspace.code}`"
v-tippy="getProjectTooltip(project)"
>
<FormButton
@@ -76,8 +76,8 @@ import {
useDebouncedTextInput
} from '@speckle/ui-components'
import type {
FullPermissionCheckResultFragment,
WorkspaceMoveProjectManager_ProjectFragment
WorkspaceMoveProjectManager_ProjectFragment,
WorkspacePermissionChecks
} from '~~/lib/common/generated/gql/graphql'
import { usePaginatedQuery } from '~/lib/common/composables/graphql'
import { workspaceMoveProjectManagerUserQuery } from '~/lib/workspaces/graphql/queries'
@@ -91,12 +91,7 @@ const emit = defineEmits<{
const props = defineProps<{
workspaceSlug?: string
canMoveToWorkspace: (permission: FullPermissionCheckResultFragment) => boolean
isLimitReached: (permission: FullPermissionCheckResultFragment) => boolean
isSsoRequired: (permission: FullPermissionCheckResultFragment) => boolean
getDisabledTooltip: (
permission: FullPermissionCheckResultFragment
) => string | undefined
workspacePermissions?: WorkspacePermissionChecks
}>()
const {
@@ -132,8 +127,11 @@ const isProjectDisabled = computed(
if (!props.workspaceSlug) {
return false
}
if (isProjectLimitReached.value(project)) {
return false
}
return !canMoveProject.value(project) && !isProjectLimitReached.value(project)
return !canMoveProject.value(project)
}
)
@@ -150,7 +148,7 @@ const showLoading = computed(() => loading.value && userProjects.value.length ==
const getProjectPermission = (project: WorkspaceMoveProjectManager_ProjectFragment) => {
return (
project.workspace?.permissions?.canMoveProjectToWorkspace || {
project.permissions?.canMoveToWorkspace || {
authorized: false,
code: '',
message: ''
@@ -161,24 +159,27 @@ const getProjectPermission = (project: WorkspaceMoveProjectManager_ProjectFragme
const canMoveProject = computed(
() => (project: WorkspaceMoveProjectManager_ProjectFragment) => {
const permission = getProjectPermission(project)
return props.canMoveToWorkspace(permission)
return permission.authorized
}
)
const isProjectLimitReached = computed(
() => (project: WorkspaceMoveProjectManager_ProjectFragment) => {
const permission = getProjectPermission(project)
return props.isLimitReached(permission)
return permission.code === 'WorkspaceLimitsReached'
}
)
const getProjectTooltip = computed(
() => (project: WorkspaceMoveProjectManager_ProjectFragment) => {
const permission = getProjectPermission(project)
if (props.isLimitReached(permission)) {
if (permission.authorized) {
return undefined
}
return props.getDisabledTooltip(permission)
if (permission.code === 'WorkspaceLimitsReached') {
return undefined
}
return permission.message
}
)
</script>
@@ -26,7 +26,7 @@
<template #text>
<div class="flex flex-col gap-2 items-start">
<CommonBadge
v-if="isSsoRequired(ws.permissions?.canMoveProjectToWorkspace)"
v-if="isSsoRequired(ws)"
color="secondary"
class="capitalize"
rounded
@@ -82,7 +82,7 @@ import { graphql } from '~~/lib/common/generated/gql'
import type {
WorkspaceMoveProjectManager_ProjectFragment,
WorkspaceMoveProjectManager_WorkspaceFragment,
FullPermissionCheckResultFragment
WorkspacePermissionChecks
} from '~~/lib/common/generated/gql/graphql'
import { useQuery } from '@vue/apollo-composable'
import { UserAvatarGroup } from '@speckle/ui-components'
@@ -109,12 +109,7 @@ graphql(`
const props = defineProps<{
project: WorkspaceMoveProjectManager_ProjectFragment
canMoveToWorkspace: (permission: FullPermissionCheckResultFragment) => boolean
isLimitReached: (permission: FullPermissionCheckResultFragment) => boolean
isSsoRequired: (permission: FullPermissionCheckResultFragment) => boolean
getDisabledTooltip: (
permission: FullPermissionCheckResultFragment
) => string | undefined
workspacePermissions?: WorkspacePermissionChecks
}>()
const emit = defineEmits<{
@@ -157,31 +152,38 @@ const isWorkspaceDisabled = computed(
return true
}
return (
!props.canMoveToWorkspace(workspace.permissions?.canMoveProjectToWorkspace) &&
!props.isLimitReached(workspace.permissions?.canMoveProjectToWorkspace)
)
const permission = workspace.permissions?.canMoveProjectToWorkspace
return !permission?.authorized && permission?.code !== 'WorkspaceLimitsReached'
}
)
const getWorkspaceTooltip = computed(
() => (workspace: WorkspaceMoveProjectManager_WorkspaceFragment) => {
if (workspace.permissions.canMoveProjectToWorkspace.authorized) {
return undefined
}
if (
workspace.permissions.canMoveProjectToWorkspace.code === 'WorkspaceLimitsReached'
) {
return undefined
}
if (!isWorkspaceAdmin.value(workspace)) {
return 'Only workspace administrators can move projects to this workspace'
}
return props.getDisabledTooltip(workspace.permissions?.canMoveProjectToWorkspace)
const permission = workspace.permissions?.canMoveProjectToWorkspace
return permission?.message
}
)
const sortedWorkspaces = computed(() => {
return [...workspaces.value].sort((a, b) => {
const aEnabled =
props.canMoveToWorkspace(a.permissions?.canMoveProjectToWorkspace) ||
props.isLimitReached(a.permissions?.canMoveProjectToWorkspace)
a.permissions?.canMoveProjectToWorkspace?.authorized ||
a.permissions?.canMoveProjectToWorkspace?.code === 'WorkspaceLimitsReached'
const bEnabled =
props.canMoveToWorkspace(b.permissions?.canMoveProjectToWorkspace) ||
props.isLimitReached(b.permissions?.canMoveProjectToWorkspace)
b.permissions?.canMoveProjectToWorkspace?.authorized ||
b.permissions?.canMoveProjectToWorkspace?.code === 'WorkspaceLimitsReached'
if (aEnabled && !bEnabled) return -1
if (!aEnabled && bEnabled) return 1
@@ -192,14 +194,24 @@ const sortedWorkspaces = computed(() => {
const handleWorkspaceClick = (
workspace: WorkspaceMoveProjectManager_WorkspaceFragment
) => {
if (props.isLimitReached(workspace.permissions?.canMoveProjectToWorkspace)) {
const permission = workspace.permissions?.canMoveProjectToWorkspace
if (permission?.code === 'WorkspaceLimitsReached') {
limitReachedWorkspace.value = workspace
showLimitDialog.value = true
return
}
if (props.canMoveToWorkspace(workspace.permissions?.canMoveProjectToWorkspace)) {
if (permission?.authorized) {
emit('workspace-selected', workspace)
}
}
const isSsoRequired = computed(
() => (workspace: WorkspaceMoveProjectManager_WorkspaceFragment) => {
return (
workspace.permissions?.canMoveProjectToWorkspace?.code ===
'WorkspaceSsoSessionNoAccess'
)
}
)
</script>
@@ -136,12 +136,12 @@ type Documents = {
"\n fragment ViewerModelVersionCardItem on Version {\n id\n message\n referencedObject\n sourceApplication\n createdAt\n previewUrl\n authorUser {\n ...LimitedUserAvatar\n }\n }\n": typeof types.ViewerModelVersionCardItemFragmentDoc,
"\n fragment WorkspaceProjectList_Workspace on Workspace {\n id\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...WorkspaceSecurity_Workspace\n ...WorkspaceHeader_Workspace\n ...BillingAlert_Workspace\n ...InviteDialogWorkspace_Workspace\n projects {\n ...WorkspaceProjectList_ProjectCollection\n }\n creationState {\n completed\n state\n }\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.WorkspaceProjectList_WorkspaceFragmentDoc,
"\n fragment WorkspaceProjectList_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...ProjectDashboardItem\n }\n cursor\n }\n": typeof types.WorkspaceProjectList_ProjectCollectionFragmentDoc,
"\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.WorkspaceHeader_WorkspaceFragmentDoc,
"\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n canMoveProjectToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.WorkspaceHeader_WorkspaceFragmentDoc,
"\n fragment WorkspaceInviteBanner_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.WorkspaceInviteBanner_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment WorkspaceInviteBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n workspaceId\n workspaceName\n token\n user {\n id\n name\n ...LimitedUserAvatar\n }\n title\n email\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": typeof types.WorkspaceInviteBlock_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest on WorkspaceJoinRequest {\n id\n user {\n id\n name\n }\n workspace {\n id\n }\n }\n": typeof types.WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequestFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_ProjectBase 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.WorkspaceMoveProjectManager_ProjectBaseFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n": typeof types.WorkspaceMoveProjectManager_ProjectFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n permissions {\n canMoveToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n": typeof types.WorkspaceMoveProjectManager_ProjectFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n projects {\n totalCount\n }\n team {\n items {\n user {\n id\n name\n avatar\n }\n }\n }\n }\n": typeof types.WorkspaceMoveProjectManager_WorkspaceFragmentDoc,
"\n fragment WorkspaceMoveProjectSelectWorkspace_User on User {\n workspaces {\n items {\n ...WorkspaceMoveProjectManager_Workspace\n }\n }\n projects(cursor: $cursor, filter: $filter) {\n items {\n ...WorkspaceMoveProjectManager_Project\n }\n cursor\n totalCount\n }\n }\n": typeof types.WorkspaceMoveProjectSelectWorkspace_UserFragmentDoc,
"\n fragment WorkspaceSidebarAbout_Workspace on Workspace {\n ...WorkspaceDashboardAbout_Workspace\n }\n": typeof types.WorkspaceSidebarAbout_WorkspaceFragmentDoc,
@@ -554,12 +554,12 @@ const documents: Documents = {
"\n fragment ViewerModelVersionCardItem on Version {\n id\n message\n referencedObject\n sourceApplication\n createdAt\n previewUrl\n authorUser {\n ...LimitedUserAvatar\n }\n }\n": types.ViewerModelVersionCardItemFragmentDoc,
"\n fragment WorkspaceProjectList_Workspace on Workspace {\n id\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...WorkspaceSecurity_Workspace\n ...WorkspaceHeader_Workspace\n ...BillingAlert_Workspace\n ...InviteDialogWorkspace_Workspace\n projects {\n ...WorkspaceProjectList_ProjectCollection\n }\n creationState {\n completed\n state\n }\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.WorkspaceProjectList_WorkspaceFragmentDoc,
"\n fragment WorkspaceProjectList_ProjectCollection on ProjectCollection {\n totalCount\n items {\n ...ProjectDashboardItem\n }\n cursor\n }\n": types.WorkspaceProjectList_ProjectCollectionFragmentDoc,
"\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.WorkspaceHeader_WorkspaceFragmentDoc,
"\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n canMoveProjectToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.WorkspaceHeader_WorkspaceFragmentDoc,
"\n fragment WorkspaceInviteBanner_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.WorkspaceInviteBanner_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment WorkspaceInviteBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator {\n id\n workspaceId\n workspaceName\n token\n user {\n id\n name\n ...LimitedUserAvatar\n }\n title\n email\n ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator\n }\n": types.WorkspaceInviteBlock_PendingWorkspaceCollaboratorFragmentDoc,
"\n fragment WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequest on WorkspaceJoinRequest {\n id\n user {\n id\n name\n }\n workspace {\n id\n }\n }\n": types.WorkspaceJoinRequestApproveDialog_WorkspaceJoinRequestFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_ProjectBase on Project {\n id\n name\n modelCount: models(limit: 0) {\n totalCount\n }\n versions(limit: 0) {\n totalCount\n }\n }\n": types.WorkspaceMoveProjectManager_ProjectBaseFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n": types.WorkspaceMoveProjectManager_ProjectFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n permissions {\n canMoveToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n": types.WorkspaceMoveProjectManager_ProjectFragmentDoc,
"\n fragment WorkspaceMoveProjectManager_Workspace on Workspace {\n id\n role\n name\n logo\n slug\n plan {\n name\n }\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n projects {\n totalCount\n }\n team {\n items {\n user {\n id\n name\n avatar\n }\n }\n }\n }\n": types.WorkspaceMoveProjectManager_WorkspaceFragmentDoc,
"\n fragment WorkspaceMoveProjectSelectWorkspace_User on User {\n workspaces {\n items {\n ...WorkspaceMoveProjectManager_Workspace\n }\n }\n projects(cursor: $cursor, filter: $filter) {\n items {\n ...WorkspaceMoveProjectManager_Project\n }\n cursor\n totalCount\n }\n }\n": types.WorkspaceMoveProjectSelectWorkspace_UserFragmentDoc,
"\n fragment WorkspaceSidebarAbout_Workspace on Workspace {\n ...WorkspaceDashboardAbout_Workspace\n }\n": types.WorkspaceSidebarAbout_WorkspaceFragmentDoc,
@@ -1355,7 +1355,7 @@ export function graphql(source: "\n fragment WorkspaceProjectList_ProjectCollec
/**
* 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 WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n"): (typeof documents)["\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n }\n }\n"];
export function graphql(source: "\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n canMoveProjectToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n }\n"): (typeof documents)["\n fragment WorkspaceHeader_Workspace on Workspace {\n ...WorkspaceBase_Workspace\n ...WorkspaceTeam_Workspace\n ...BillingAlert_Workspace\n slug\n readOnly\n permissions {\n canCreateProject {\n ...FullPermissionCheckResult\n }\n canMoveProjectToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -1375,7 +1375,7 @@ export function graphql(source: "\n fragment WorkspaceMoveProjectManager_Projec
/**
* 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 WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n"): (typeof documents)["\n fragment WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n"];
export function graphql(source: "\n fragment WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n permissions {\n canMoveToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\n ...FullPermissionCheckResult\n }\n }\n }\n }\n"): (typeof documents)["\n fragment WorkspaceMoveProjectManager_Project on Project {\n ...WorkspaceMoveProjectManager_ProjectBase\n permissions {\n canMoveToWorkspace {\n ...FullPermissionCheckResult\n }\n }\n workspace {\n id\n permissions {\n canMoveProjectToWorkspace(projectId: $projectId) {\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.
*/
File diff suppressed because one or more lines are too long
@@ -64,10 +64,10 @@
</div>
<WorkspaceMoveProjectManager
v-if="project"
v-if="project && isWorkspacesEnabled"
v-model:open="showMoveDialog"
event-source="project-page"
:project-id="project.id"
:project-id="projectId"
/>
</div>
</template>