Files
speckle-server/packages/frontend-2/components/viewer/PreSetupWrapper.vue
T
andrewwallacespeckle ff6433128a FE2 - Embedding (#1979)
* Add Dialog

* Add options to embed dialog

* Min Height of Clipboard Input multiline to 3 lines

* Check for visibility

* Link to change access of project

* Rename to guided mode

* Change icon when user clicks copy button

* Update Menu styles based on agi feedback

* Update graphql.ts

* Embed Options as hashState

* Auto grow Clipboard Input

* embed state and more options

* Tidyups

* Footer only shows when !embedOptions.isTransparent

* Add auto/manual Load

* Add Pre setup component

* WIP Button Group mobile

* Updates around manual load

* Viewer Share nav

* Add embed dialog to project page

* Minor fixes

* Check for federated

* Responsive Tidyups

* Responsive Fixes. Fix console issues

* Add Alert to Version Embed

* Disable Zoom

* GQL updates

* Comment Slideshow

* GraphQl changes

* Fix visibility

* Build fix

* Revert "Build fix"

This reverts commit 0e706cbd9fde78204032bb1ec4421b1742d023ac.

* remove unneeded change, revert yarn.lock

* Test Commit

* Remove commit test

* Fix build

* Update Tailwind. Add base url env

* fix for portal scope issue

* useLogger

* useLogger

* chore(fe2): include NUXT_PUBLIC_BASE_URL in deployment manifests

* lazy load optimization

* lint fixes

* Updates

* Re-add guided open Dialog sections

* Prevent login popup on embed

* Tidy up mobile combined button group

* Tidy up embed Dialogs

* Small styling issues

* Update scrolling in embed dialog

* Move selection info when embed

* Testing fixes

* Discuss in Speckle

* Responsive Dialog Changes

* Fix bug

* WIP Manual Load

* Fix nuxt errors

* Fix nuxt logger issue

* Fix embed dialog overflows

* New Dialog layout

* Responsive Breakpoint change

* Preview Image

* Fix bug with dialogSection

* Hide selection info on mobile when thread is open

* Footer Model Name

* Overflow on ClipboardInput

* Style fixes

* Tidy ups

* Responsive updates

* Responsive fixes

* Update button

* Changes from testing

* Fix embed height with footer

* Fix Dialog Section

* Fixes from testing

* Move "reset filters" on embed

* Small fixes

* Updates from CR 1

* CR Comments 2

* Updates from CR

* Add deserializeEmbedOptions helper

* DialogSection changes

* Revert changes in TextArea

* Updates from CR

* Only check for noscroll in watch

* Update useRoute

* Comment Slideshow mode

* Changes from testing

* Fix mobile share button

* onMounted warn fixes

* Updates from testing

* Remove nesting of ManualLoad

* Keep Speckle text on mobile

* minor cleanup & bugfixes

* Add target prop to Logo

* navbar flash fix + more cleanup

* Fix urls

* Footer Logo changes

* Remove viewer-transparent from layout

* Add Reply in Speckle

* Remove Anchored Points from embed

* Final changes pre CR

* Fix Anchored Points

* Update packages/frontend-2/components/project/model-page/dialog/embed/Embed.vue

Co-authored-by: Kristaps Fabians Geikins <fabians@speckle.systems>

* Fixes from CR

* Updates from cr

* Changes WIP

* Fix for dialog opening

* Changes from PR

* Updates to check embed in activity

* fix(fe2): project settings dialog error

* Make Team open section on click of "Manage"

* Fixes from merge

* Changes from cr

* Compare old to new in watch

* Fix logo in footer of embed

* Fixes from merge

* Fix build. Fix lazy load

* Updates from Benjamin

* Fix transparent bg

---------

Co-authored-by: Kristaps Fabians Geikins <fabis94@live.com>
Co-authored-by: Iain Sproat <68657+iainsproat@users.noreply.github.com>
Co-authored-by: Kristaps Fabians Geikins <fabians@speckle.systems>
2024-02-06 10:38:22 +00:00

150 lines
4.1 KiB
Vue

<template>
<div>
<ViewerPostSetupWrapper>
<div class="flex-1">
<!-- Nav -->
<Portal to="navigation">
<ViewerScope :state="state">
<HeaderNavLink
:to="`/projects/${project?.id}`"
:name="project?.name"
></HeaderNavLink>
<ViewerExplorerNavbarLink />
</ViewerScope>
</Portal>
<ClientOnly>
<!-- Tour host -->
<div
v-if="showTour"
class="fixed w-full h-[100dvh] flex justify-center items-center pointer-events-none z-[100]"
>
<TourOnboarding />
</div>
<!-- Viewer host -->
<div
class="special-gradient absolute z-10 overflow-hidden w-screen"
:class="
isEmbedEnabled
? isTransparent
? 'viewer-transparent h-[100dvh]'
: 'h-[calc(100dvh-3.5rem)]'
: 'h-[100dvh]'
"
>
<ViewerBase />
<Transition
enter-from-class="opacity-0"
enter-active-class="transition duration-1000"
>
<ViewerAnchoredPoints v-show="showControls" />
</Transition>
</div>
<!-- Global loading bar -->
<ViewerLoadingBar class="z-20" />
<!-- Sidebar controls -->
<Transition
enter-from-class="opacity-0"
enter-active-class="transition duration-1000"
>
<ViewerControls v-show="showControls" class="z-20" />
</Transition>
<!-- Viewer Object Selection Info Display -->
<Transition
v-if="!hideSelectionInfo"
enter-from-class="opacity-0"
enter-active-class="transition duration-1000"
>
<div v-show="showControls">
<ViewerSelectionSidebar class="z-20" />
</div>
</Transition>
<!-- Shows up when filters are applied for an easy return to normality -->
<ViewerGlobalFilterReset class="z-20" :embed="!!isEmbedEnabled" />
</ClientOnly>
</div>
</ViewerPostSetupWrapper>
<ViewerEmbedFooter
:name="modelName || 'Loading...'"
:date="lastUpdate"
:url="route.path"
/>
<Portal to="primary-actions">
<HeaderNavShare
v-if="project"
:resource-id-string="modelId"
:project-id="project.id"
:visibility="project.visibility"
/>
</Portal>
</div>
</template>
<script setup lang="ts">
import {
useSetupViewer,
type InjectableViewerState
} from '~~/lib/viewer/composables/setup'
import dayjs from 'dayjs'
import { graphql } from '~~/lib/common/generated/gql'
import { useEmbed } from '~/lib/viewer/composables/setup/embed'
import { useViewerTour } from '~/lib/viewer/composables/tour'
const emit = defineEmits<{
setup: [InjectableViewerState]
}>()
const route = useRoute()
const { showTour, showControls } = useViewerTour()
const modelId = computed(() => route.params.modelId as string)
const projectId = computed(() => route.params.id as string)
const state = useSetupViewer({
projectId
})
const { isEnabled: isEmbedEnabled, hideSelectionInfo, isTransparent } = useEmbed()
emit('setup', state)
const {
resources: {
response: { project }
}
} = state
graphql(`
fragment ModelPageProject on Project {
id
createdAt
name
visibility
}
`)
const title = computed(() =>
project.value?.name.length ? `Viewer - ${project.value.name}` : ''
)
const modelName = computed(() => {
if (project.value?.models?.items && project.value.models.items.length > 0) {
return project.value.models.items[0].name
} else {
return project.value?.name
}
})
const lastUpdate = computed(() => {
if (project.value?.models?.items[0] && project.value.models.items[0].updatedAt) {
return 'Updated ' + dayjs(project.value.models.items[0].updatedAt).fromNow()
} else if (project.value) {
return 'Created ' + dayjs(project.value.createdAt).fromNow()
} else return undefined
})
useHead({ title })
</script>