diff --git a/.husky/pre-commit b/.husky/pre-commit index 655ecfb61..dfc982ab4 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -2,7 +2,7 @@ # shellcheck disable=SC1091 set -e -if [ -n "$CI" ] +if [ -n "$CI" ] then echo "running eslint" yarn eslint:projectwide @@ -16,7 +16,6 @@ else yarn lint-staged fi - echo "🔍 looking for additional linter dependencies" check_dependencies_available() { diff --git a/package.json b/package.json index cfa811979..87fe21974 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "node": "^22.6.0" }, "scripts": { - "build": "yarn workspaces foreach -ptvW run build", - "build:public": "yarn workspaces foreach -ptvW --no-private run build", - "build:tailwind-deps": "yarn workspaces foreach -ivW -j unlimited --include '{@speckle/shared,@speckle/tailwind-theme,@speckle/ui-components}' run build", + "build": "yarn workspaces foreach --parallel --topological --verbose --worktree run build", + "build:public": "yarn ensure:tailwind-deps && yarn workspace @speckle/frontend-2 build:postinstall && yarn workspaces foreach --parallel --topological --verbose --worktree --no-private run build", + "build:tailwind-deps": "yarn workspaces foreach --interlaced --verbose --worktree --jobs unlimited --include '{@speckle/shared,@speckle/tailwind-theme,@speckle/ui-components}' run build", "ensure:tailwind-deps": "node ./utils/ensure-tailwind-deps.mjs", "helm:readme:generate": "./utils/helm/update-schema-json.sh", "prettier:check": "prettier --check .", @@ -28,10 +28,10 @@ "dev:kind:helm:up": "yarn dev:kind:up && tilt up --file ./.circleci/deployment/Tiltfile.helm --context kind-speckle-server", "dev:kind:helm:down": "tilt down --file ./.circleci/deployment/Tiltfile.helm --context kind-speckle-server", "dev:kind:helm:ci": "tilt ci --file ./.circleci/deployment/Tiltfile.helm --context kind-speckle-server --timeout 10m", - "dev": "yarn workspaces foreach -pivW -j unlimited run dev", - "dev:no-server": "yarn workspaces foreach --exclude @speckle/server -pivW -j unlimited run dev", - "dev:minimal": "yarn workspaces foreach -pivW -j unlimited --include '{@speckle/server,@speckle/frontend-2}' run dev", - "gqlgen": "yarn workspaces foreach -pivW -j unlimited --include '{@speckle/server,@speckle/frontend,@speckle/frontend-2}' run gqlgen", + "dev": "yarn workspaces foreach --parallel --interlaced --verbose --worktree --jobs unlimited run dev", + "dev:no-server": "yarn workspaces foreach --exclude @speckle/server --parallel --interlaced --verbose --worktree --jobs unlimited run dev", + "dev:minimal": "yarn workspaces foreach --parallel --interlaced --verbose --worktree --jobs unlimited --include '{@speckle/server,@speckle/frontend-2}' run dev", + "gqlgen": "yarn workspaces foreach --parallel --interlaced --verbose --worktree --jobs unlimited --include '{@speckle/server,@speckle/frontend-2}' run gqlgen", "dev:server": "yarn workspace @speckle/server dev", "dev:frontend-2": "yarn workspace @speckle/frontend-2 dev", "dev:shared": "yarn workspace @speckle/shared dev", diff --git a/packages/frontend-2/components/project/model-page/dialog/embed/Embed.vue b/packages/frontend-2/components/project/model-page/dialog/embed/Embed.vue index ab8dc68dc..fe948bc96 100644 --- a/packages/frontend-2/components/project/model-page/dialog/embed/Embed.vue +++ b/packages/frontend-2/components/project/model-page/dialog/embed/Embed.vue @@ -65,6 +65,59 @@ {{ option.label }} +
+ +
route.params.modelId as string) @@ -176,6 +244,14 @@ const updatedUrl = computed(() => { } }) + if ( + hideSpeckleBranding.value && + isWorkspacesEnabled.value && + !workspaceHideSpeckleBrandingEnabled.value + ) { + embedOptions['hideSpeckleBranding'] = true + } + // Serialize the embedOptions into a hash fragment const hashFragment = encodeURIComponent(JSON.stringify(embedOptions)) url.hash = `embed=${hashFragment}` @@ -228,6 +304,25 @@ const nonDiscoverableButtons = computed((): LayoutDialogButton[] => [ } ]) +const workspaceSlug = computed(() => { + return props.project.workspace?.slug +}) +const canEditEmbedOptions = computed(() => { + return props.project.workspace?.permissions?.canEditEmbedOptions +}) +const workspaceHideSpeckleBrandingEnabled = computed(() => { + if (!isWorkspacesEnabled.value) return false + return props.project.workspace?.embedOptions?.hideSpeckleBranding +}) + +const hideSpeckleBrandingTooltip = computed(() => { + if (!isWorkspacesEnabled.value) return '' + if (workspaceHideSpeckleBrandingEnabled.value) { + return 'Speckle branding is disabled for all embeds in this workspace' + } + return '' +}) + const handleEmbedCodeCopy = async (value: string) => { await copy(value, { successMessage: 'Embed code copied to clipboard', @@ -292,4 +387,15 @@ const embedDialogOptions = [ value: manuallyLoadModel } ] + +watch( + () => props.project.workspace?.embedOptions?.hideSpeckleBranding, + () => { + if (isWorkspacesEnabled.value) { + hideSpeckleBranding.value = + props.project.workspace?.embedOptions?.hideSpeckleBranding ?? false + } + }, + { immediate: true } +) diff --git a/packages/frontend-2/components/viewer/PreSetupWrapper.vue b/packages/frontend-2/components/viewer/PreSetupWrapper.vue index 842c2769f..9620a4c58 100644 --- a/packages/frontend-2/components/viewer/PreSetupWrapper.vue +++ b/packages/frontend-2/components/viewer/PreSetupWrapper.vue @@ -102,7 +102,7 @@ :name="modelName || 'Loading...'" :date="lastUpdate" :url="route.path" - :hide-speckle-branding="hideSpeckleBranding" + :hide-speckle-branding="hideSpeckleLogo" :disable-model-link="disableModelLink" /> @@ -142,6 +142,7 @@ graphql(` embedOptions { hideSpeckleBranding } + hasAccessToFeature(featureName: hideSpeckleBranding) } `) @@ -177,7 +178,8 @@ const { hideSelectionInfo, isTransparent, showControls, - disableModelLink + disableModelLink, + hideSpeckleBranding } = useEmbed() const mp = useMixpanel() @@ -262,8 +264,15 @@ const lastUpdate = computed(() => { } else return undefined }) -const hideSpeckleBranding = computed(() => { - return project.value ? project.value?.embedOptions?.hideSpeckleBranding : true +const canEditEmbedOptions = computed(() => { + return project.value?.hasAccessToFeature +}) + +const hideSpeckleLogo = computed(() => { + if (!project.value?.workspace) return true + if (!canEditEmbedOptions.value) return false + if (project.value?.embedOptions?.hideSpeckleBranding) return true + else return hideSpeckleBranding.value }) useHead({ title }) diff --git a/packages/frontend-2/components/viewer/embed/Footer.vue b/packages/frontend-2/components/viewer/embed/Footer.vue index bd673433b..587f060ff 100644 --- a/packages/frontend-2/components/viewer/embed/Footer.vue +++ b/packages/frontend-2/components/viewer/embed/Footer.vue @@ -48,7 +48,7 @@ defineProps<{ date?: string name?: string url?: string - hideSpeckleBranding?: boolean + hideSpeckleBranding?: MaybeNullOrUndefined disableModelLink?: MaybeNullOrUndefined }>() diff --git a/packages/frontend-2/components/workspace/Card.vue b/packages/frontend-2/components/workspace/Card.vue index cb3ffa957..220b3f5f3 100644 --- a/packages/frontend-2/components/workspace/Card.vue +++ b/packages/frontend-2/components/workspace/Card.vue @@ -1,6 +1,6 @@