From 8c2a9e01940251e99fee6a2c3f21f2100c2e8d93 Mon Sep 17 00:00:00 2001 From: andrewwallacespeckle Date: Fri, 3 Oct 2025 10:30:33 +0100 Subject: [PATCH 01/10] fix(fe): prevent duplicate object selection --- packages/frontend-2/lib/viewer/composables/ui.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/frontend-2/lib/viewer/composables/ui.ts b/packages/frontend-2/lib/viewer/composables/ui.ts index 1bcc5132e..f4a30f622 100644 --- a/packages/frontend-2/lib/viewer/composables/ui.ts +++ b/packages/frontend-2/lib/viewer/composables/ui.ts @@ -262,7 +262,13 @@ export function useSelectionUtilities() { const addToSelectionFromObjectIds = (objectIds: string[]) => { const originalObjects = selectedObjects.value.slice() setSelectionFromObjectIds(objectIds) - selectedObjects.value = [...originalObjects, ...selectedObjects.value] + + // Filter out duplicates by checking if objects with the same ID already exist + const newObjects = selectedObjects.value.filter( + (newObj) => !originalObjects.some((existingObj) => existingObj.id === newObj.id) + ) + + selectedObjects.value = [...originalObjects, ...newObjects] } const removeFromSelectionObjectIds = (objectIds: string[]) => { From d394e1cd9b9e42c0256d73ca678507cbe19951cf Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Fri, 3 Oct 2025 11:39:59 +0200 Subject: [PATCH 02/10] fix: various presentations mode fixes related to resetting (#5635) * better workspace feature flag ops * user activity is correctly tracked * more fixes --- .../components/header/nav/Share.vue | 35 +---- .../presentation/controls/Controls.vue | 4 +- .../presentation/slideList/Slide.vue | 5 +- .../presentation/viewer/PostSetup.vue | 12 ++ .../presentation/viewer/Wrapper.vue | 10 +- .../components/viewer/AnchoredPoints.vue | 2 +- .../lib/common/generated/gql/graphql.ts | 4 +- .../lib/common/helpers/debugging.ts | 2 +- .../lib/presentations/composables/setup.ts | 31 ---- .../lib/presentations/composables/utils.ts | 27 ++++ .../composables/viewerPostSetup.ts | 44 ++++++ .../lib/viewer/composables/activity.ts | 140 +++++++++++------- .../viewer/composables/savedViews/state.ts | 17 ++- packages/frontend-2/plugins/010-logger.ts | 1 - .../typedefs/workspaces.graphql | 6 +- .../modules/core/graph/generated/graphql.ts | 4 +- .../modules/gatekeeper/domain/billing.ts | 10 +- .../gatekeeper/repositories/billing.ts | 21 ++- .../workspaces/graph/resolvers/workspaces.ts | 26 +++- workspace.code-workspace | 3 +- 20 files changed, 258 insertions(+), 146 deletions(-) create mode 100644 packages/frontend-2/components/presentation/viewer/PostSetup.vue create mode 100644 packages/frontend-2/lib/presentations/composables/utils.ts create mode 100644 packages/frontend-2/lib/presentations/composables/viewerPostSetup.ts diff --git a/packages/frontend-2/components/header/nav/Share.vue b/packages/frontend-2/components/header/nav/Share.vue index 86c6f3851..5e67c5d23 100644 --- a/packages/frontend-2/components/header/nav/Share.vue +++ b/packages/frontend-2/components/header/nav/Share.vue @@ -74,7 +74,6 @@ import { SpeckleViewer } from '@speckle/shared' import { keyboardClick } from '@speckle/ui-components' import { graphql } from '~/lib/common/generated/gql/gql' import type { HeaderNavShare_ProjectFragment } from '~~/lib/common/generated/gql/graphql' -import { useCopyModelLink } from '~~/lib/projects/composables/modelManagement' graphql(` fragment HeaderNavShare_Project on Project { @@ -90,7 +89,6 @@ const props = defineProps<{ }>() const { copy } = useClipboard() -const copyModelLink = useCopyModelLink() const menuButtonId = useId() const embedDialogOpen = ref(false) @@ -99,37 +97,16 @@ const parsedResourceIds = computed(() => SpeckleViewer.ViewerRoute.parseUrlParameters(props.resourceIdString) ) -const firstResource = computed(() => parsedResourceIds.value[0] || {}) - -const versionId = computed(() => { - if (SpeckleViewer.ViewerRoute.isModelResource(firstResource.value)) { - return firstResource.value.versionId - } - return '' -}) - -const modelId = computed(() => { - if (SpeckleViewer.ViewerRoute.isModelResource(firstResource.value)) { - return firstResource.value.modelId // Assuming your firstResource object has a modelId property - } - return '' -}) - const isFederated = computed(() => parsedResourceIds.value.length > 1) -const handleCopyId = () => { - copy(props.resourceIdString, { successMessage: 'ID copied to clipboard' }) +const handleCopyId = async () => { + await copy(props.resourceIdString, { successMessage: 'ID copied to clipboard' }) } -const handleCopyLink = () => { - const modelIdValue = modelId.value - const versionIdValue = versionId.value ? versionId.value : undefined - void copyModelLink({ - model: { - projectId: props.project.id, - id: modelIdValue - }, - versionId: versionIdValue +const handleCopyLink = async () => { + if (import.meta.server) return + await copy(window.location.href, { + successMessage: 'Copied link to clipboard' }) } diff --git a/packages/frontend-2/components/presentation/controls/Controls.vue b/packages/frontend-2/components/presentation/controls/Controls.vue index 275ac6f20..f6817dfc3 100644 --- a/packages/frontend-2/components/presentation/controls/Controls.vue +++ b/packages/frontend-2/components/presentation/controls/Controls.vue @@ -29,6 +29,7 @@ import { LucideChevronLeft, LucideChevronRight, LucideRotateCcw } from 'lucide-v import { useInjectedPresentationState } from '~/lib/presentations/composables/setup' import { clamp } from 'lodash-es' import { useEventListener } from '@vueuse/core' +import { useResetViewUtils } from '~/lib/presentations/composables/utils' defineProps<{ hideUi?: boolean @@ -36,8 +37,9 @@ defineProps<{ const { ui: { slideIdx: currentVisibleIndex, slideCount }, - viewer: { resetView, hasViewChanged } + viewer: { hasViewChanged } } = useInjectedPresentationState() +const { resetView } = useResetViewUtils() const disablePrevious = computed(() => currentVisibleIndex.value === 0) const disableNext = computed(() => diff --git a/packages/frontend-2/components/presentation/slideList/Slide.vue b/packages/frontend-2/components/presentation/slideList/Slide.vue index 50f7a2933..da7d98c7b 100644 --- a/packages/frontend-2/components/presentation/slideList/Slide.vue +++ b/packages/frontend-2/components/presentation/slideList/Slide.vue @@ -26,6 +26,7 @@ import { graphql } from '~~/lib/common/generated/gql' import type { PresentationSlideListSlide_SavedViewFragment } from '~~/lib/common/generated/gql/graphql' import { useInjectedPresentationState } from '~/lib/presentations/composables/setup' import { useAuthManager } from '~~/lib/auth/composables/auth' +import { useResetViewUtils } from '~/lib/presentations/composables/utils' graphql(` fragment PresentationSlideListSlide_SavedView on SavedView { @@ -42,10 +43,10 @@ const props = defineProps<{ }>() const { - ui: { slideIdx: currentSlideIdx, slide: currentSlide }, - viewer: { resetView } + ui: { slideIdx: currentSlideIdx, slide: currentSlide } } = useInjectedPresentationState() const { presentationToken } = useAuthManager() +const { resetView } = useResetViewUtils() const isCurrentSlide = computed(() => currentSlide.value?.id === props.slide.id) diff --git a/packages/frontend-2/components/presentation/viewer/PostSetup.vue b/packages/frontend-2/components/presentation/viewer/PostSetup.vue new file mode 100644 index 000000000..7b9a7fed1 --- /dev/null +++ b/packages/frontend-2/components/presentation/viewer/PostSetup.vue @@ -0,0 +1,12 @@ + + diff --git a/packages/frontend-2/components/presentation/viewer/Wrapper.vue b/packages/frontend-2/components/presentation/viewer/Wrapper.vue index 02ae024fb..48dfbaf83 100644 --- a/packages/frontend-2/components/presentation/viewer/Wrapper.vue +++ b/packages/frontend-2/components/presentation/viewer/Wrapper.vue @@ -1,9 +1,11 @@ From 05e00d2c5c6008392d3276e02c103f9caad1d639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuzhan=20Koral?= <45078678+oguzhankoral@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:54:17 +0300 Subject: [PATCH 06/10] feat(acc): revamp (#5501) * chore(acc): put permission gql in correct place * feat(acc): swap to new rvt import * fix(acc): add oda secrets * feat(acc): auth cookies * feat(acc): introduce integrations as workspace setting * feat(acc): create sync item from models * fix(acc): bump * fix(acc): naming lost in merge * feat(acc): no acc tab - table under settings * chore(acc): new sync but will disapper * feat(acc): see statuses over model list * chore(acc): fix return type * chore(acc): type saga * chore(acc): status badge * chore(acc): refactor acc gql (#5556) * checkpoint * fix(acc): refactor gql items * feat(acc): double button * chore(acc): gqlgen * fix(acc): model ids are not project ids * chore(acc): bump function version * chore(acc): split up clients * feat(acc): more-optimised gql folder fetching schema * feat(acc): acc folder contents gql impl * feat(acc): apollo cache optimisations * chore(acc): gqlgen * fix(acc): return something for * fix(acc): handle null values correctly * chore(acc): specify prod functions --------- Co-authored-by: Chuck Driesler --- .../assets/images/integrations/acc.png | Bin 0 -> 6019 bytes .../components/integrations/acc/Card.vue | 107 ++++++ .../integrations/acc/FileSelector.vue | 95 +++++ .../integrations/acc/FolderContents.vue | 56 +++ .../integrations/acc/FolderNode.vue | 104 ++++++ .../page => integrations}/acc/Hubs.vue | 0 .../page => integrations}/acc/ModelItem.vue | 0 .../acc/ModelSelector.vue | 4 +- .../page => integrations}/acc/Projects.vue | 0 .../page => integrations}/acc/SyncStatus.vue | 0 .../integrations/acc/SyncStatusModelItem.vue | 59 +++ .../components/integrations/acc/Syncs.vue | 142 ++++++++ .../integrations/acc/dialog/CreateSync.vue | 198 ++++++++++ .../project/page/acc/FileSelector.vue | 128 ------- .../project/page/acc/FolderNode.vue | 49 --- .../components/project/page/acc/Syncs.vue | 339 ------------------ .../components/project/page/acc/Tab.vue | 152 -------- .../components/project/page/models/Header.vue | 88 ++++- .../project/page/models/StructureItem.vue | 11 + .../components/project/page/models/Tab.vue | 1 + .../project/page/settings/acc/Tab.vue | 64 ++++ .../frontend-2/lib/acc/composables/useAcc.ts | 272 -------------- .../lib/acc/composables/useAccAuthManager.ts | 177 +++++++++ .../lib/acc/composables/useAccFiles.ts | 179 +++++++++ .../lib/acc/composables/useAccFolderData.ts | 81 +++++ .../lib/acc/composables/useAccUser.ts | 34 ++ .../frontend-2/lib/acc/graphql/fragments.ts | 8 +- .../frontend-2/lib/acc/graphql/queries.ts | 21 ++ packages/frontend-2/lib/acc/types.ts | 12 + .../lib/common/generated/gql/gql.ts | 60 +++- .../lib/common/generated/gql/graphql.ts | 295 +++++++++++++-- .../frontend-2/lib/common/helpers/route.ts | 8 + .../composables/useAccIntegration.ts | 69 ++++ packages/frontend-2/lib/integrations/types.ts | 10 + .../lib/settings/composables/menu.ts | 6 + .../lib/workspaces/graphql/queries.ts | 8 + .../frontend-2/pages/projects/[id]/index.vue | 15 +- .../pages/projects/[id]/index/acc.vue | 21 -- .../pages/projects/[id]/index/settings.vue | 20 +- .../[id]/index/settings/integrations.vue | 7 + .../workspaces/[slug]/integrations.vue | 33 ++ .../server/assets/acc/typedefs/acc.graphql | 74 ++++ .../assets/acc/typedefs/integrations.graphql | 5 + .../assets/acc/typedefs/permissions.graphql | 3 + ...accSyncItems.graphql => syncItems.graphql} | 10 +- .../assets/core/typedefs/permissions.graphql | 1 - packages/server/codegen.ts | 6 + .../server/modules/acc/clients/autodesk.ts | 310 ---------------- .../modules/acc/clients/autodesk/acc.ts | 211 +++++++++++ .../modules/acc/clients/autodesk/helpers.ts | 61 ++++ .../modules/acc/clients/autodesk/tokens.ts | 167 +++++++++ .../modules/acc/domain/acc/constants.ts | 25 ++ .../modules/acc/domain/{ => acc}/events.ts | 2 +- .../acc/domain/{ => acc}/operations.ts | 11 +- .../modules/acc/domain/{ => acc}/types.ts | 32 +- .../server/modules/acc/domain/constants.ts | 30 +- packages/server/modules/acc/errors/acc.ts | 35 ++ .../modules/acc/events/eventListeners.ts | 2 +- .../modules/acc/graph/dataloaders/acc.ts | 94 +++++ .../resolvers/{accSyncItems.ts => acc.ts} | 151 +++++++- .../acc/graph/resolvers/integrations.ts | 9 + packages/server/modules/acc/helpers/acc.ts | 50 +++ .../server/modules/acc/helpers/graphTypes.ts | 23 +- .../server/modules/acc/helpers/svfUtils.ts | 2 +- .../modules/acc/repositories/accSyncItems.ts | 28 +- packages/server/modules/acc/rest/oidc.ts | 29 +- .../server/modules/acc/services/automate.ts | 23 +- packages/server/modules/acc/services/cron.ts | 24 +- .../server/modules/acc/services/management.ts | 50 ++- .../server/modules/acc/services/webhooks.ts | 4 +- .../modules/core/graph/dataloaders/index.ts | 12 - .../modules/core/graph/generated/graphql.ts | 241 ++++++++++++- .../modules/shared/helpers/envHelper.ts | 8 + .../modules/shared/helpers/typeHelper.ts | 2 + .../modules/shared/services/eventBus.ts | 2 +- packages/server/type-augmentations/acc.d.ts | 2 +- packages/shared/src/acc/helpers/types.ts | 3 +- .../speckle-server/templates/_helpers.tpl | 9 + .../templates/objects/serviceaccount.yml | 1 + .../templates/server/serviceaccount.yml | 1 + 80 files changed, 3210 insertions(+), 1476 deletions(-) create mode 100644 packages/frontend-2/assets/images/integrations/acc.png create mode 100644 packages/frontend-2/components/integrations/acc/Card.vue create mode 100644 packages/frontend-2/components/integrations/acc/FileSelector.vue create mode 100644 packages/frontend-2/components/integrations/acc/FolderContents.vue create mode 100644 packages/frontend-2/components/integrations/acc/FolderNode.vue rename packages/frontend-2/components/{project/page => integrations}/acc/Hubs.vue (100%) rename packages/frontend-2/components/{project/page => integrations}/acc/ModelItem.vue (100%) rename packages/frontend-2/components/{project/page => integrations}/acc/ModelSelector.vue (96%) rename packages/frontend-2/components/{project/page => integrations}/acc/Projects.vue (100%) rename packages/frontend-2/components/{project/page => integrations}/acc/SyncStatus.vue (100%) create mode 100644 packages/frontend-2/components/integrations/acc/SyncStatusModelItem.vue create mode 100644 packages/frontend-2/components/integrations/acc/Syncs.vue create mode 100644 packages/frontend-2/components/integrations/acc/dialog/CreateSync.vue delete mode 100644 packages/frontend-2/components/project/page/acc/FileSelector.vue delete mode 100644 packages/frontend-2/components/project/page/acc/FolderNode.vue delete mode 100644 packages/frontend-2/components/project/page/acc/Syncs.vue delete mode 100644 packages/frontend-2/components/project/page/acc/Tab.vue create mode 100644 packages/frontend-2/components/project/page/settings/acc/Tab.vue delete mode 100644 packages/frontend-2/lib/acc/composables/useAcc.ts create mode 100644 packages/frontend-2/lib/acc/composables/useAccAuthManager.ts create mode 100644 packages/frontend-2/lib/acc/composables/useAccFiles.ts create mode 100644 packages/frontend-2/lib/acc/composables/useAccFolderData.ts create mode 100644 packages/frontend-2/lib/acc/composables/useAccUser.ts create mode 100644 packages/frontend-2/lib/integrations/composables/useAccIntegration.ts create mode 100644 packages/frontend-2/lib/integrations/types.ts delete mode 100644 packages/frontend-2/pages/projects/[id]/index/acc.vue create mode 100644 packages/frontend-2/pages/projects/[id]/index/settings/integrations.vue create mode 100644 packages/frontend-2/pages/settings/workspaces/[slug]/integrations.vue create mode 100644 packages/server/assets/acc/typedefs/acc.graphql create mode 100644 packages/server/assets/acc/typedefs/integrations.graphql create mode 100644 packages/server/assets/acc/typedefs/permissions.graphql rename packages/server/assets/acc/typedefs/{accSyncItems.graphql => syncItems.graphql} (96%) delete mode 100644 packages/server/modules/acc/clients/autodesk.ts create mode 100644 packages/server/modules/acc/clients/autodesk/acc.ts create mode 100644 packages/server/modules/acc/clients/autodesk/helpers.ts create mode 100644 packages/server/modules/acc/clients/autodesk/tokens.ts create mode 100644 packages/server/modules/acc/domain/acc/constants.ts rename packages/server/modules/acc/domain/{ => acc}/events.ts (90%) rename packages/server/modules/acc/domain/{ => acc}/operations.ts (74%) rename packages/server/modules/acc/domain/{ => acc}/types.ts (69%) create mode 100644 packages/server/modules/acc/graph/dataloaders/acc.ts rename packages/server/modules/acc/graph/resolvers/{accSyncItems.ts => acc.ts} (73%) create mode 100644 packages/server/modules/acc/graph/resolvers/integrations.ts create mode 100644 packages/server/modules/acc/helpers/acc.ts diff --git a/packages/frontend-2/assets/images/integrations/acc.png b/packages/frontend-2/assets/images/integrations/acc.png new file mode 100644 index 0000000000000000000000000000000000000000..abe0b74efa70297d3dcca395b088b58dc21cfad6 GIT binary patch literal 6019 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 CjU~4L literal 0 HcmV?d00001 diff --git a/packages/frontend-2/components/integrations/acc/Card.vue b/packages/frontend-2/components/integrations/acc/Card.vue new file mode 100644 index 000000000..2a52fe01e --- /dev/null +++ b/packages/frontend-2/components/integrations/acc/Card.vue @@ -0,0 +1,107 @@ + + + diff --git a/packages/frontend-2/components/integrations/acc/FileSelector.vue b/packages/frontend-2/components/integrations/acc/FileSelector.vue new file mode 100644 index 000000000..06f537282 --- /dev/null +++ b/packages/frontend-2/components/integrations/acc/FileSelector.vue @@ -0,0 +1,95 @@ + + + diff --git a/packages/frontend-2/components/integrations/acc/FolderContents.vue b/packages/frontend-2/components/integrations/acc/FolderContents.vue new file mode 100644 index 000000000..30892fde2 --- /dev/null +++ b/packages/frontend-2/components/integrations/acc/FolderContents.vue @@ -0,0 +1,56 @@ + + + diff --git a/packages/frontend-2/components/integrations/acc/FolderNode.vue b/packages/frontend-2/components/integrations/acc/FolderNode.vue new file mode 100644 index 000000000..c255347f4 --- /dev/null +++ b/packages/frontend-2/components/integrations/acc/FolderNode.vue @@ -0,0 +1,104 @@ + + + diff --git a/packages/frontend-2/components/project/page/acc/Hubs.vue b/packages/frontend-2/components/integrations/acc/Hubs.vue similarity index 100% rename from packages/frontend-2/components/project/page/acc/Hubs.vue rename to packages/frontend-2/components/integrations/acc/Hubs.vue diff --git a/packages/frontend-2/components/project/page/acc/ModelItem.vue b/packages/frontend-2/components/integrations/acc/ModelItem.vue similarity index 100% rename from packages/frontend-2/components/project/page/acc/ModelItem.vue rename to packages/frontend-2/components/integrations/acc/ModelItem.vue diff --git a/packages/frontend-2/components/project/page/acc/ModelSelector.vue b/packages/frontend-2/components/integrations/acc/ModelSelector.vue similarity index 96% rename from packages/frontend-2/components/project/page/acc/ModelSelector.vue rename to packages/frontend-2/components/integrations/acc/ModelSelector.vue index 5267c403c..16f148226 100644 --- a/packages/frontend-2/components/project/page/acc/ModelSelector.vue +++ b/packages/frontend-2/components/integrations/acc/ModelSelector.vue @@ -11,12 +11,12 @@ /> -