+
@@ -15,7 +20,7 @@
@@ -106,7 +111,7 @@ import {
useInjectedViewerState
} from '~~/lib/viewer/composables/setup'
-import type { ExplorerNode } from '~~/lib/viewer/helpers/sceneExplorer'
+import { ModelsSubView, type ExplorerNode } from '~~/lib/viewer/helpers/sceneExplorer'
import type { ViewerLoadedResourcesQuery } from '~~/lib/common/generated/gql/graphql'
import type { Get } from 'type-fest'
import { useDiffUtilities, useSelectionUtilities } from '~~/lib/viewer/composables/ui'
@@ -118,12 +123,11 @@ import { useVirtualList, useDebounceFn } from '@vueuse/core'
type ModelItem = NonNullable
>
-defineEmits(['close'])
-
-const showVersions = ref(false)
-const showAddModel = ref(false)
+const subView = defineModel('subView', { default: ModelsSubView.Main })
const expandedModelId = ref(null)
+const showAddModel = ref(false)
+
const expandedNodes = ref>(new Set())
const expandedModels = ref>(new Set())
const disableScrollOnNextSelection = ref(false)
@@ -139,7 +143,8 @@ const {
const {
resources: {
response: { resourceItems: stateResourceItems }
- }
+ },
+ ui: { diff: diffState }
} = useInjectedViewerState()
const {
objects: selectedObjects,
@@ -147,7 +152,7 @@ const {
clearSelection,
removeFromSelection
} = useSelectionUtilities()
-const { diffModelVersions } = useDiffUtilities()
+const { diffModelVersions, endDiff } = useDiffUtilities()
const {
flattenModelTree,
getRootNodesForModel,
@@ -211,22 +216,31 @@ const modelHeaderPositions = computed(() => {
return headers
})
+const hasDiffActive = computed(() => {
+ return !!(diffState.oldVersion.value && diffState.newVersion.value)
+})
+
const handleShowVersions = (modelId: string) => {
expandedModelId.value = modelId
- showVersions.value = true
+ subView.value = ModelsSubView.Versions
}
const handleShowDiff = async (modelId: string, versionA: string, versionB: string) => {
await diffModelVersions(modelId, versionA, versionB)
expandedModelId.value = modelId
- showVersions.value = true
+ subView.value = ModelsSubView.Diff
}
const handleVersionsClose = () => {
- showVersions.value = false
+ subView.value = ModelsSubView.Main
expandedModelId.value = null
}
+const handleDiffClose = async () => {
+ await endDiff()
+ subView.value = ModelsSubView.Versions
+}
+
const toggleModelExpansion = (modelId: string) => {
if (expandedModels.value.has(modelId)) {
expandedModels.value.delete(modelId)
@@ -383,6 +397,18 @@ const handleScroll = (e: Event) => {
watch(selectedObjects, handleSelectionChange, { deep: true })
+watch(subView, (newSubView) => {
+ if (newSubView === ModelsSubView.Main) {
+ expandedModelId.value = null
+ }
+})
+
+watch(hasDiffActive, (isActive) => {
+ if (isActive && subView.value !== ModelsSubView.Diff) {
+ subView.value = ModelsSubView.Diff
+ }
+})
+
// Initialize and update sticky header when models change
watch(
unifiedVirtualItems,
diff --git a/packages/frontend-2/components/viewer/models/versions/Versions.vue b/packages/frontend-2/components/viewer/models/versions/Versions.vue
index b3773f815..1f0e1b06f 100644
--- a/packages/frontend-2/components/viewer/models/versions/Versions.vue
+++ b/packages/frontend-2/components/viewer/models/versions/Versions.vue
@@ -1,58 +1,51 @@
-
-
-
-
-
-
+
+
+
+ Exit versions
+
+ Versions
+
+
+
+
+
+
diff --git a/packages/frontend-2/lib/viewer/helpers/sceneExplorer.ts b/packages/frontend-2/lib/viewer/helpers/sceneExplorer.ts
index 68473ea58..604cb7fea 100644
--- a/packages/frontend-2/lib/viewer/helpers/sceneExplorer.ts
+++ b/packages/frontend-2/lib/viewer/helpers/sceneExplorer.ts
@@ -32,3 +32,9 @@ export type TreeItemComponentModel = {
}
export type { SpeckleObject, SpeckleReference }
+
+export enum ModelsSubView {
+ Main = 'main',
+ Versions = 'versions',
+ Diff = 'diff'
+}