feat(fe): Disable file upload menu item in some cases
This commit is contained in:
@@ -50,6 +50,7 @@ import { useMixpanel } from '~~/lib/core/composables/mp'
|
||||
import { HorizontalDirection } from '~~/lib/common/composables/window'
|
||||
import { useActiveUser } from '~~/lib/auth/composables/activeUser'
|
||||
import { modelVersionsRoute } from '~/lib/common/helpers/route'
|
||||
import { useWorkspacePlan } from '~/lib/workspaces/composables/plan'
|
||||
|
||||
graphql(`
|
||||
fragment ProjectPageModelsActions on Model {
|
||||
@@ -72,6 +73,10 @@ graphql(`
|
||||
graphql(`
|
||||
fragment ProjectPageModelsActions_Project on Project {
|
||||
id
|
||||
workspace {
|
||||
id
|
||||
slug
|
||||
}
|
||||
...ProjectsModelPageEmbed_Project
|
||||
}
|
||||
`)
|
||||
@@ -105,6 +110,8 @@ const { copy } = useClipboard()
|
||||
const menuId = useId()
|
||||
const { isLoggedIn } = useActiveUser()
|
||||
const router = useRouter()
|
||||
const mp = useMixpanel()
|
||||
const { statusIsCanceled } = useWorkspacePlan(props.project.workspace?.slug || '')
|
||||
|
||||
const showActionsMenu = ref(false)
|
||||
const openDialog = ref(null as Nullable<ActionTypes>)
|
||||
@@ -114,6 +121,33 @@ const canEdit = computed(() => props.model.permissions.canUpdate)
|
||||
const canDelete = computed(() => props.model.permissions.canDelete)
|
||||
const canCreateVersion = computed(() => props.model.permissions.canCreateVersion)
|
||||
|
||||
const uploadVersionDisabled = computed(() => {
|
||||
if (canCreateVersion.value.code === 'WORKSPACES_NOT_AUTHORIZED_ERROR') {
|
||||
return {
|
||||
disabled: true,
|
||||
tooltip: `Your project role doesn't allow creating new model versions`
|
||||
}
|
||||
}
|
||||
if (statusIsCanceled.value) {
|
||||
return {
|
||||
disabled: true,
|
||||
tooltip:
|
||||
"The workspace's subscription is cancelled, so no new model versions can be created"
|
||||
}
|
||||
}
|
||||
if (!canCreateVersion.value.authorized) {
|
||||
return {
|
||||
disabled: true,
|
||||
tooltip: canCreateVersion.value.message || 'Insufficient permissions'
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
tooltip: ''
|
||||
}
|
||||
})
|
||||
|
||||
const actionsItems = computed<LayoutMenuItem[][]>(() => [
|
||||
...(isLoggedIn.value
|
||||
? [
|
||||
@@ -137,9 +171,8 @@ const actionsItems = computed<LayoutMenuItem[][]>(() => [
|
||||
{
|
||||
title: 'Upload new version...',
|
||||
id: ActionTypes.UploadVersion,
|
||||
disabled: !canCreateVersion.value.authorized,
|
||||
disabledTooltip:
|
||||
canCreateVersion.value.message || 'Insufficient permissions'
|
||||
disabled: uploadVersionDisabled.value.disabled,
|
||||
disabledTooltip: uploadVersionDisabled.value.tooltip
|
||||
}
|
||||
]
|
||||
: [])
|
||||
@@ -173,8 +206,6 @@ const isDeleteDialogOpen = computed({
|
||||
set: (isOpen) => (openDialog.value = isOpen ? ActionTypes.Delete : null)
|
||||
})
|
||||
|
||||
const mp = useMixpanel()
|
||||
|
||||
const onActionChosen = (params: { item: LayoutMenuItem; event: MouseEvent }) => {
|
||||
const { item } = params
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ type Documents = {
|
||||
"\n fragment ProjectDiscussionsPageHeader_Project on Project {\n id\n name\n }\n": typeof types.ProjectDiscussionsPageHeader_ProjectFragmentDoc,
|
||||
"\n fragment ProjectDiscussionsPageResults_Project on Project {\n id\n }\n": typeof types.ProjectDiscussionsPageResults_ProjectFragmentDoc,
|
||||
"\n fragment ProjectPageModelsActions on Model {\n id\n name\n permissions {\n canUpdate {\n ...FullPermissionCheckResult\n }\n canDelete {\n ...FullPermissionCheckResult\n }\n canCreateVersion {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.ProjectPageModelsActionsFragmentDoc,
|
||||
"\n fragment ProjectPageModelsActions_Project on Project {\n id\n ...ProjectsModelPageEmbed_Project\n }\n": typeof types.ProjectPageModelsActions_ProjectFragmentDoc,
|
||||
"\n fragment ProjectPageModelsActions_Project on Project {\n id\n workspace {\n id\n slug\n }\n ...ProjectsModelPageEmbed_Project\n }\n": typeof types.ProjectPageModelsActions_ProjectFragmentDoc,
|
||||
"\n fragment ProjectPageModelsCardProject on Project {\n id\n role\n visibility\n ...ProjectPageModelsActions_Project\n permissions {\n canCreateModel {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.ProjectPageModelsCardProjectFragmentDoc,
|
||||
"\n fragment ProjectModelsPageHeader_Project on Project {\n id\n name\n sourceApps\n role\n models {\n totalCount\n }\n team {\n id\n user {\n ...FormUsersSelectItem\n }\n }\n workspace {\n id\n role\n slug\n name\n readOnly\n plan {\n name\n }\n }\n permissions {\n canCreateModel {\n ...FullPermissionCheckResult\n }\n }\n }\n": typeof types.ProjectModelsPageHeader_ProjectFragmentDoc,
|
||||
"\n fragment ProjectModelsPageResults_Project on Project {\n ...ProjectPageLatestItemsModels\n }\n": typeof types.ProjectModelsPageResults_ProjectFragmentDoc,
|
||||
@@ -490,7 +490,7 @@ const documents: Documents = {
|
||||
"\n fragment ProjectDiscussionsPageHeader_Project on Project {\n id\n name\n }\n": types.ProjectDiscussionsPageHeader_ProjectFragmentDoc,
|
||||
"\n fragment ProjectDiscussionsPageResults_Project on Project {\n id\n }\n": types.ProjectDiscussionsPageResults_ProjectFragmentDoc,
|
||||
"\n fragment ProjectPageModelsActions on Model {\n id\n name\n permissions {\n canUpdate {\n ...FullPermissionCheckResult\n }\n canDelete {\n ...FullPermissionCheckResult\n }\n canCreateVersion {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.ProjectPageModelsActionsFragmentDoc,
|
||||
"\n fragment ProjectPageModelsActions_Project on Project {\n id\n ...ProjectsModelPageEmbed_Project\n }\n": types.ProjectPageModelsActions_ProjectFragmentDoc,
|
||||
"\n fragment ProjectPageModelsActions_Project on Project {\n id\n workspace {\n id\n slug\n }\n ...ProjectsModelPageEmbed_Project\n }\n": types.ProjectPageModelsActions_ProjectFragmentDoc,
|
||||
"\n fragment ProjectPageModelsCardProject on Project {\n id\n role\n visibility\n ...ProjectPageModelsActions_Project\n permissions {\n canCreateModel {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.ProjectPageModelsCardProjectFragmentDoc,
|
||||
"\n fragment ProjectModelsPageHeader_Project on Project {\n id\n name\n sourceApps\n role\n models {\n totalCount\n }\n team {\n id\n user {\n ...FormUsersSelectItem\n }\n }\n workspace {\n id\n role\n slug\n name\n readOnly\n plan {\n name\n }\n }\n permissions {\n canCreateModel {\n ...FullPermissionCheckResult\n }\n }\n }\n": types.ProjectModelsPageHeader_ProjectFragmentDoc,
|
||||
"\n fragment ProjectModelsPageResults_Project on Project {\n ...ProjectPageLatestItemsModels\n }\n": types.ProjectModelsPageResults_ProjectFragmentDoc,
|
||||
@@ -1113,7 +1113,7 @@ export function graphql(source: "\n fragment ProjectPageModelsActions on Model
|
||||
/**
|
||||
* 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 ProjectPageModelsActions_Project on Project {\n id\n ...ProjectsModelPageEmbed_Project\n }\n"): (typeof documents)["\n fragment ProjectPageModelsActions_Project on Project {\n id\n ...ProjectsModelPageEmbed_Project\n }\n"];
|
||||
export function graphql(source: "\n fragment ProjectPageModelsActions_Project on Project {\n id\n workspace {\n id\n slug\n }\n ...ProjectsModelPageEmbed_Project\n }\n"): (typeof documents)["\n fragment ProjectPageModelsActions_Project on Project {\n id\n workspace {\n id\n slug\n }\n ...ProjectsModelPageEmbed_Project\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