Files
speckle-server/packages/frontend-2/lib/workspaces/composables/projects/permissions.ts
T
Kristaps Fabians Geikins 596312ab0e feat(frontend): personal project limit disclaimers & prompts (#4822)
* ProjectsAdd wrapper

* WorkspaceMoveProject wrapper added

* move wrapper finalized

* passing through location

* more cleanup

* model add wrapper

* permissions cleanup

* add invite wrapper

* vue-tippy bugfix

* ViewerLimitsDialog prep

* upgrade limit alert prep

* limit alerts

* movemanager fix

* new add flow

* slug update fix

* add model flow

* invites?

* some extra fixes

* move unmount fix?

* more fixes

* vue-tsc update

* style: remove h-32 for smaller screens

* vue-tsc parser fix

* prep for new viewer limits dialog

* updated viewer dialogs

* comment variant cleanup

* CR comments

---------

Co-authored-by: michalspeckle <michal@speckle.systems>
2025-05-28 12:12:18 +03:00

97 lines
2.6 KiB
TypeScript

import type { MaybeNullOrUndefined } from '@speckle/shared'
import { WorkspaceLimitsReachedError } from '@speckle/shared/authz'
import { usePermissionedAction } from '~/lib/common/composables/permissions'
import { graphql } from '~/lib/common/generated/gql'
import type {
UseCanCreateWorkspaceProject_WorkspaceFragment,
UseCanMoveProjectIntoWorkspace_ProjectFragment,
UseCanMoveProjectIntoWorkspace_WorkspaceFragment
} from '~/lib/common/generated/gql/graphql'
graphql(`
fragment UseCanCreateWorkspaceProject_Workspace on Workspace {
permissions {
canCreateProject {
...FullPermissionCheckResult
}
}
}
`)
export const useCanCreateWorkspaceProject = (params: {
workspace: MaybeRef<
MaybeNullOrUndefined<UseCanCreateWorkspaceProject_WorkspaceFragment>
>
}) => {
const {
canClickAction: canClickCreate,
canActuallyInvokeAction: canActuallyCreate,
cantClickErrorReason: cantClickCreateReason,
cantClickErrorCode: cantClickCreateCode
} = usePermissionedAction({
check: computed(() => unref(params.workspace)?.permissions?.canCreateProject),
disclaimerErrorCodes: [WorkspaceLimitsReachedError.code],
fallbackReason: 'Cannot create workspace project'
})
return {
canClickCreate,
canActuallyCreate,
cantClickCreateReason,
cantClickCreateCode
}
}
graphql(`
fragment UseCanMoveProjectIntoWorkspace_Workspace on Workspace {
permissions {
canMoveProjectToWorkspace {
...FullPermissionCheckResult
}
}
}
`)
graphql(`
fragment UseCanMoveProjectIntoWorkspace_Project on Project {
permissions {
canMoveToWorkspace {
...FullPermissionCheckResult
}
}
}
`)
export const useCanMoveProjectIntoWorkspace = (params: {
workspace?: MaybeRef<
MaybeNullOrUndefined<UseCanMoveProjectIntoWorkspace_WorkspaceFragment>
>
project?: MaybeRef<
MaybeNullOrUndefined<UseCanMoveProjectIntoWorkspace_ProjectFragment>
>
}) => {
const {
canClickAction: canClickMove,
canActuallyInvokeAction: canActuallyMove,
cantClickErrorReason: cantClickMoveReason,
cantClickErrorCode: cantClickMoveCode,
check
} = usePermissionedAction({
checks: computed(() => [
unref(params.workspace)?.permissions?.canMoveProjectToWorkspace,
unref(params.project)?.permissions?.canMoveToWorkspace
]),
disclaimerErrorCodes: [WorkspaceLimitsReachedError.code],
allowOnMissingCheck: true,
fallbackReason: 'Cannot move project into workspace'
})
return {
canClickMove,
canActuallyMove,
cantClickMoveReason,
cantClickMoveCode,
check
}
}