From 32497eeb5ac3410a2de397984d595f4bd022d70a Mon Sep 17 00:00:00 2001 From: Alexandru Popovici Date: Tue, 21 Jan 2025 18:20:45 +0200 Subject: [PATCH 1/2] fix(viewer-lib): Handles WEB-2491. (#3856) - Section outlines are no longer visible behind other geometry. They are depth tested now for all view modes - Shaded mode aka BastiMode now properly updates the section planes --- packages/viewer-sandbox/src/main.ts | 4 ++-- .../src/modules/pipeline/Passes/BasitPass.ts | 7 +++++++ .../pipeline/Pipelines/ArcticViewPipeline.ts | 9 +++----- .../pipeline/Pipelines/BasitViewPipeline.ts | 8 ++----- .../pipeline/Pipelines/DefaultPipeline.ts | 9 +++----- .../pipeline/Pipelines/EdgesPipeline.ts | 9 +++----- .../Pipelines/MRT/MRTEdgesPipeline.ts | 18 +++++++++------- .../Pipelines/MRT/MRTPenViewPipeline.ts | 8 ++----- .../Pipelines/MRT/MRTShadedViewPipeline.ts | 21 +++++++++++-------- .../pipeline/Pipelines/PenViewPipeline.ts | 2 +- .../pipeline/Pipelines/ShadedViewPipeline.ts | 9 +++----- .../modules/pipeline/Pipelines/TAAPipeline.ts | 9 +++----- 12 files changed, 51 insertions(+), 62 deletions(-) diff --git a/packages/viewer-sandbox/src/main.ts b/packages/viewer-sandbox/src/main.ts index 8abf6834a..e97ace85a 100644 --- a/packages/viewer-sandbox/src/main.ts +++ b/packages/viewer-sandbox/src/main.ts @@ -113,7 +113,7 @@ const getStream = () => { // prettier-ignore // 'https://app.speckle.systems/streams/da9e320dad/commits/5388ef24b8?c=%5B-7.66134,10.82932,6.41935,-0.07739,-13.88552,1.8697,0,1%5D' // Revit sample house (good for bim-like stuff with many display meshes) - // 'https://app.speckle.systems/streams/da9e320dad/commits/5388ef24b8' + 'https://app.speckle.systems/streams/da9e320dad/commits/5388ef24b8' // 'https://latest.speckle.systems/streams/c1faab5c62/commits/ab1a1ab2b6' // 'https://app.speckle.systems/streams/da9e320dad/commits/5388ef24b8' // 'https://latest.speckle.systems/streams/58b5648c4d/commits/60371ecb2d' @@ -469,7 +469,7 @@ const getStream = () => { // 'https://app.speckle.systems/projects/e89b61b65c/models/2a0995f124' // 'https://latest.speckle.systems/projects/3fe1880c36/models/65bb4287a8' - 'https://latest.speckle.systems/projects/db06488e1c/models/21f3930771' + // 'https://latest.speckle.systems/projects/db06488e1c/models/21f3930771' ) } diff --git a/packages/viewer/src/modules/pipeline/Passes/BasitPass.ts b/packages/viewer/src/modules/pipeline/Passes/BasitPass.ts index 02ccc68ed..6925f2066 100644 --- a/packages/viewer/src/modules/pipeline/Passes/BasitPass.ts +++ b/packages/viewer/src/modules/pipeline/Passes/BasitPass.ts @@ -3,6 +3,7 @@ import { DoubleSide, OrthographicCamera, PerspectiveCamera, + Plane, Scene, WebGLRenderer } from 'three' @@ -40,6 +41,12 @@ export class BasitPass extends BaseGPass { return 'BASIT' } + public setClippingPlanes(planes: Plane[]) { + for (const k in this.materialMap) { + this.materialMap[k][2].clippingPlanes = planes + } + } + protected buildMaterials() { const batches: MeshBatch[] = this.speckleRenderer.batcher.getBatches( undefined, diff --git a/packages/viewer/src/modules/pipeline/Pipelines/ArcticViewPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/ArcticViewPipeline.ts index c381578e7..e1aaac253 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/ArcticViewPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/ArcticViewPipeline.ts @@ -30,7 +30,8 @@ export class ArcticViewPipeline extends ProgressivePipeline { ObjectLayers.STREAM_CONTENT_LINE, ObjectLayers.STREAM_CONTENT_POINT, ObjectLayers.STREAM_CONTENT_POINT_CLOUD, - ObjectLayers.STREAM_CONTENT_TEXT + ObjectLayers.STREAM_CONTENT_TEXT, + ObjectLayers.PROPS ]) viewportPass.setVisibility(ObjectVisibility.OPAQUE) viewportPass.options = { minIntensity: 0.75 } @@ -72,11 +73,7 @@ export class ArcticViewPipeline extends ProgressivePipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.dynamicStage.push( stencilPass, diff --git a/packages/viewer/src/modules/pipeline/Pipelines/BasitViewPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/BasitViewPipeline.ts index b93b22c62..fbc25d2b0 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/BasitViewPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/BasitViewPipeline.ts @@ -12,7 +12,7 @@ export class BasitPipeline extends Pipeline { super(speckleRenderer) const basitPass = new BasitPass(tree, speckleRenderer) - basitPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH]) + basitPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH, ObjectLayers.PROPS]) basitPass.setClearColor(0x000000, 0) basitPass.setClearFlags(ClearFlags.COLOR) basitPass.outputTarget = null @@ -34,11 +34,7 @@ export class BasitPipeline extends Pipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.passList.push( stencilPass, diff --git a/packages/viewer/src/modules/pipeline/Pipelines/DefaultPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/DefaultPipeline.ts index 68c3bbab0..69331706c 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/DefaultPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/DefaultPipeline.ts @@ -27,7 +27,8 @@ export class DefaultPipeline extends ProgressivePipeline { ObjectLayers.STREAM_CONTENT_LINE, ObjectLayers.STREAM_CONTENT_POINT, ObjectLayers.STREAM_CONTENT_POINT_CLOUD, - ObjectLayers.STREAM_CONTENT_TEXT + ObjectLayers.STREAM_CONTENT_TEXT, + ObjectLayers.PROPS ]) opaqueColorPass.setVisibility(ObjectVisibility.OPAQUE) @@ -63,11 +64,7 @@ export class DefaultPipeline extends ProgressivePipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.dynamicStage.push( stencilPass, diff --git a/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts index 64b7e2fef..a001c30ad 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts @@ -49,7 +49,8 @@ export class EdgesPipeline extends ProgressivePipeline { ObjectLayers.STREAM_CONTENT_LINE, ObjectLayers.STREAM_CONTENT_POINT, ObjectLayers.STREAM_CONTENT_POINT_CLOUD, - ObjectLayers.STREAM_CONTENT_TEXT + ObjectLayers.STREAM_CONTENT_TEXT, + ObjectLayers.PROPS ]) opaqueColorPass.setVisibility(ObjectVisibility.OPAQUE) @@ -103,11 +104,7 @@ export class EdgesPipeline extends ProgressivePipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.dynamicStage.push( depthPassDynamic, diff --git a/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTEdgesPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTEdgesPipeline.ts index 99120f061..9a2ca2e6e 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTEdgesPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTEdgesPipeline.ts @@ -79,6 +79,9 @@ export class MRTEdgesPipeline extends ProgressivePipeline { blendPassDynamic.setTexture('tEdges', edgesPassDynamic.outputTarget?.texture) blendPassDynamic.accumulationFrames = this.accumulationFrameCount + const postBlendGeometryPass = new GeometryPass() + postBlendGeometryPass.setLayers([ObjectLayers.PROPS]) + const stencilPass = new StencilPass() stencilPass.setVisibility(ObjectVisibility.STENCIL) stencilPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH]) @@ -89,11 +92,7 @@ export class MRTEdgesPipeline extends ProgressivePipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.dynamicStage.push( depthPassNormalDynamic, @@ -101,8 +100,9 @@ export class MRTEdgesPipeline extends ProgressivePipeline { stencilPass, opaqueColorPass, transparentColorPass, - stencilMaskPass, blendPassDynamic, + postBlendGeometryPass, + stencilMaskPass, overlayPass ) this.progressiveStage.push( @@ -113,16 +113,18 @@ export class MRTEdgesPipeline extends ProgressivePipeline { stencilPass, opaqueColorPass, transparentColorPass, - stencilMaskPass, blendPass, + postBlendGeometryPass, + stencilMaskPass, overlayPass ) this.passthroughStage.push( stencilPass, opaqueColorPass, transparentColorPass, - stencilMaskPass, blendPass, + postBlendGeometryPass, + stencilMaskPass, overlayPass ) diff --git a/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTPenViewPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTPenViewPipeline.ts index d5944f827..16aca9891 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTPenViewPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTPenViewPipeline.ts @@ -96,7 +96,7 @@ export class MRTPenViewPipeline extends ProgressivePipeline { return +a.material.colorWrite - +b.material.colorWrite } })() - geometryPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH]) + geometryPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH, ObjectLayers.PROPS]) const stencilMaskPass = new StencilMaskPass() stencilMaskPass.setVisibility(ObjectVisibility.STENCIL) @@ -104,11 +104,7 @@ export class MRTPenViewPipeline extends ProgressivePipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS, - ObjectLayers.PROPS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) const outputPass = new OutputPass() outputPass.setTexture('tDiffuse', taaPass.outputTarget?.texture) diff --git a/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTShadedViewPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTShadedViewPipeline.ts index b915edb14..178501186 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTShadedViewPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/MRT/MRTShadedViewPipeline.ts @@ -36,7 +36,8 @@ export class MRTShadedViewPipeline extends ProgressivePipeline { ObjectLayers.STREAM_CONTENT_LINE, ObjectLayers.STREAM_CONTENT_POINT, ObjectLayers.STREAM_CONTENT_POINT_CLOUD, - ObjectLayers.STREAM_CONTENT_TEXT + ObjectLayers.STREAM_CONTENT_TEXT, + ObjectLayers.PROPS ]) viewportPass.options = { matcapTexture: { @@ -71,6 +72,9 @@ export class MRTShadedViewPipeline extends ProgressivePipeline { blendPassDynamic.setTexture('tEdges', edgesPassDynamic.outputTarget?.texture) blendPassDynamic.accumulationFrames = this.accumulationFrameCount + const postBlendGeometryPass = new GeometryPass() + postBlendGeometryPass.setLayers([ObjectLayers.PROPS]) + const stencilPass = new StencilPass() stencilPass.setVisibility(ObjectVisibility.STENCIL) stencilPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH]) @@ -81,11 +85,7 @@ export class MRTShadedViewPipeline extends ProgressivePipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.dynamicStage.push( depthPassNormalDynamic, @@ -93,8 +93,9 @@ export class MRTShadedViewPipeline extends ProgressivePipeline { stencilPass, shadowcatcherPass, viewportPass, - stencilMaskPass, blendPassDynamic, + postBlendGeometryPass, + stencilMaskPass, overlayPass ) this.progressiveStage.push( @@ -104,16 +105,18 @@ export class MRTShadedViewPipeline extends ProgressivePipeline { stencilPass, shadowcatcherPass, viewportPass, - stencilMaskPass, blendPass, + postBlendGeometryPass, + stencilMaskPass, overlayPass ) this.passthroughStage.push( stencilPass, shadowcatcherPass, viewportPass, - stencilMaskPass, blendPass, + stencilMaskPass, + postBlendGeometryPass, overlayPass ) diff --git a/packages/viewer/src/modules/pipeline/Pipelines/PenViewPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/PenViewPipeline.ts index 4a793daeb..ef231872e 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/PenViewPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/PenViewPipeline.ts @@ -110,7 +110,7 @@ export class PenViewPipeline extends ProgressivePipeline { return +a.material.colorWrite - +b.material.colorWrite } })() - geometryPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH]) + geometryPass.setLayers([ObjectLayers.STREAM_CONTENT_MESH, ObjectLayers.PROPS]) const stencilMaskPass = new StencilMaskPass() stencilMaskPass.setVisibility(ObjectVisibility.STENCIL) diff --git a/packages/viewer/src/modules/pipeline/Pipelines/ShadedViewPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/ShadedViewPipeline.ts index 35d908117..acb96d900 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/ShadedViewPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/ShadedViewPipeline.ts @@ -46,7 +46,8 @@ export class ShadedViewPipeline extends ProgressivePipeline { ObjectLayers.STREAM_CONTENT_LINE, ObjectLayers.STREAM_CONTENT_POINT, ObjectLayers.STREAM_CONTENT_POINT_CLOUD, - ObjectLayers.STREAM_CONTENT_TEXT + ObjectLayers.STREAM_CONTENT_TEXT, + ObjectLayers.PROPS ]) viewportPass.options = { matcapTexture: { @@ -91,11 +92,7 @@ export class ShadedViewPipeline extends ProgressivePipeline { stencilMaskPass.setClearFlags(ClearFlags.DEPTH) const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.dynamicStage.push( depthPassDynamic, diff --git a/packages/viewer/src/modules/pipeline/Pipelines/TAAPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/TAAPipeline.ts index f7c28ea94..520534aa6 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/TAAPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/TAAPipeline.ts @@ -39,7 +39,8 @@ export class TAAPipeline extends ProgressivePipeline { ObjectLayers.STREAM_CONTENT_LINE, ObjectLayers.STREAM_CONTENT_POINT, ObjectLayers.STREAM_CONTENT_POINT_CLOUD, - ObjectLayers.STREAM_CONTENT_TEXT + ObjectLayers.STREAM_CONTENT_TEXT, + ObjectLayers.PROPS ]) opaqueColorPass.setVisibility(ObjectVisibility.OPAQUE) @@ -131,11 +132,7 @@ export class TAAPipeline extends ProgressivePipeline { jitteredStencilMaskPass.outputTarget = renderTarget const overlayPass = new GeometryPass() - overlayPass.setLayers([ - ObjectLayers.PROPS, - ObjectLayers.OVERLAY, - ObjectLayers.MEASUREMENTS - ]) + overlayPass.setLayers([ObjectLayers.OVERLAY, ObjectLayers.MEASUREMENTS]) this.dynamicStage.push( stencilPass, From 87e8c10d51b594c229a677a1c2598f0bcc9c49be Mon Sep 17 00:00:00 2001 From: Mike Date: Tue, 21 Jan 2025 17:39:08 +0100 Subject: [PATCH 2/2] Fix: Only list project in workspace in automation project select (#3821) --- .../automate/automation/CreateDialog.vue | 1 + .../create-dialog/AutomationDetailsStep.vue | 2 ++ .../components/form/select/Projects.vue | 13 ++++++++++--- .../frontend-2/lib/common/generated/gql/gql.ts | 4 ++-- .../lib/common/generated/gql/graphql.ts | 3 ++- packages/frontend-2/lib/form/graphql/queries.ts | 15 +++++++++++++-- packages/frontend-2/pages/functions/[fid].vue | 6 +++--- 7 files changed, 33 insertions(+), 11 deletions(-) diff --git a/packages/frontend-2/components/automate/automation/CreateDialog.vue b/packages/frontend-2/components/automate/automation/CreateDialog.vue index 3266e3123..d4cc2f9b4 100644 --- a/packages/frontend-2/components/automate/automation/CreateDialog.vue +++ b/packages/frontend-2/components/automate/automation/CreateDialog.vue @@ -61,6 +61,7 @@ v-model:automation-name="automationName" :preselected-project="preselectedProject" :is-test-automation="isTestAutomation" + :workspace-id="workspaceId" /> isTestAutomation: boolean + workspaceId?: string }>() const project = defineModel>('project', { required: true diff --git a/packages/frontend-2/components/form/select/Projects.vue b/packages/frontend-2/components/form/select/Projects.vue index 44b033ca2..b1c343dbb 100644 --- a/packages/frontend-2/components/form/select/Projects.vue +++ b/packages/frontend-2/components/form/select/Projects.vue @@ -133,6 +133,12 @@ const props = defineProps({ ownedOnly: { type: Boolean, default: false + }, + /** + * Whether to only return projects within a specific workspace + */ + workspaceId: { + type: String as PropType> } }) @@ -155,10 +161,11 @@ const invokeSearch = async (search: string) => { if (!isLoggedIn.value) return [] const results = await apollo.query({ query: searchProjectsQuery, - variables: { + variables: computed(() => ({ search: search.trim().length ? search : null, - onlyWithRoles: props.ownedOnly ? [Roles.Stream.Owner] : null - } + onlyWithRoles: props.ownedOnly ? [Roles.Stream.Owner] : null, + ...(props.workspaceId && { workspaceId: props.workspaceId }) + })).value }) return results.data.activeUser?.projects.items || [] } diff --git a/packages/frontend-2/lib/common/generated/gql/gql.ts b/packages/frontend-2/lib/common/generated/gql/gql.ts index 2ab6c3705..4a877779d 100644 --- a/packages/frontend-2/lib/common/generated/gql/gql.ts +++ b/packages/frontend-2/lib/common/generated/gql/gql.ts @@ -191,7 +191,7 @@ const documents = { "\n query DeveloperSettingsAccessTokens {\n activeUser {\n id\n apiTokens {\n id\n name\n lastUsed\n lastChars\n createdAt\n scopes\n }\n }\n }\n": types.DeveloperSettingsAccessTokensDocument, "\n query DeveloperSettingsApplications {\n activeUser {\n createdApps {\n id\n secret\n name\n description\n redirectUrl\n scopes {\n name\n description\n }\n }\n id\n }\n }\n": types.DeveloperSettingsApplicationsDocument, "\n query DeveloperSettingsAuthorizedApps {\n activeUser {\n id\n authorizedApps {\n id\n description\n name\n author {\n id\n name\n avatar\n }\n }\n }\n }\n": types.DeveloperSettingsAuthorizedAppsDocument, - "\n query SearchProjects($search: String, $onlyWithRoles: [String!] = null) {\n activeUser {\n projects(limit: 10, filter: { search: $search, onlyWithRoles: $onlyWithRoles }) {\n totalCount\n items {\n ...FormSelectProjects_Project\n }\n }\n }\n }\n": types.SearchProjectsDocument, + "\n query SearchProjects(\n $search: String\n $onlyWithRoles: [String!] = null\n $workspaceId: ID\n ) {\n activeUser {\n projects(\n limit: 10\n filter: {\n search: $search\n onlyWithRoles: $onlyWithRoles\n workspaceId: $workspaceId\n }\n ) {\n totalCount\n items {\n ...FormSelectProjects_Project\n }\n }\n }\n }\n": types.SearchProjectsDocument, "\n query SearchProjectModels($search: String, $projectId: String!) {\n project(id: $projectId) {\n id\n models(limit: 10, filter: { search: $search }) {\n totalCount\n items {\n ...FormSelectModels_Model\n }\n }\n }\n }\n": types.SearchProjectModelsDocument, "\n query ActiveUserGendoLimits {\n activeUser {\n id\n gendoAICredits {\n used\n limit\n resetDate\n }\n }\n }\n": types.ActiveUserGendoLimitsDocument, "\n mutation requestGendoAIRender($input: GendoAIRenderInput!) {\n versionMutations {\n requestGendoAIRender(input: $input)\n }\n }\n": types.RequestGendoAiRenderDocument, @@ -1118,7 +1118,7 @@ export function graphql(source: "\n query DeveloperSettingsAuthorizedApps {\n /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n query SearchProjects($search: String, $onlyWithRoles: [String!] = null) {\n activeUser {\n projects(limit: 10, filter: { search: $search, onlyWithRoles: $onlyWithRoles }) {\n totalCount\n items {\n ...FormSelectProjects_Project\n }\n }\n }\n }\n"): (typeof documents)["\n query SearchProjects($search: String, $onlyWithRoles: [String!] = null) {\n activeUser {\n projects(limit: 10, filter: { search: $search, onlyWithRoles: $onlyWithRoles }) {\n totalCount\n items {\n ...FormSelectProjects_Project\n }\n }\n }\n }\n"]; +export function graphql(source: "\n query SearchProjects(\n $search: String\n $onlyWithRoles: [String!] = null\n $workspaceId: ID\n ) {\n activeUser {\n projects(\n limit: 10\n filter: {\n search: $search\n onlyWithRoles: $onlyWithRoles\n workspaceId: $workspaceId\n }\n ) {\n totalCount\n items {\n ...FormSelectProjects_Project\n }\n }\n }\n }\n"): (typeof documents)["\n query SearchProjects(\n $search: String\n $onlyWithRoles: [String!] = null\n $workspaceId: ID\n ) {\n activeUser {\n projects(\n limit: 10\n filter: {\n search: $search\n onlyWithRoles: $onlyWithRoles\n workspaceId: $workspaceId\n }\n ) {\n totalCount\n items {\n ...FormSelectProjects_Project\n }\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/packages/frontend-2/lib/common/generated/gql/graphql.ts b/packages/frontend-2/lib/common/generated/gql/graphql.ts index 172a3f940..6ac75adaf 100644 --- a/packages/frontend-2/lib/common/generated/gql/graphql.ts +++ b/packages/frontend-2/lib/common/generated/gql/graphql.ts @@ -5266,6 +5266,7 @@ export type DeveloperSettingsAuthorizedAppsQuery = { __typename?: 'Query', activ export type SearchProjectsQueryVariables = Exact<{ search?: InputMaybe; onlyWithRoles?: InputMaybe | Scalars['String']['input']>; + workspaceId?: InputMaybe; }>; @@ -6727,7 +6728,7 @@ export const RevokeAppAccessDocument = {"kind":"Document","definitions":[{"kind" export const DeveloperSettingsAccessTokensDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DeveloperSettingsAccessTokens"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"apiTokens"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"lastUsed"}},{"kind":"Field","name":{"kind":"Name","value":"lastChars"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"scopes"}}]}}]}}]}}]} as unknown as DocumentNode; export const DeveloperSettingsApplicationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DeveloperSettingsApplications"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createdApps"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"secret"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"redirectUrl"}},{"kind":"Field","name":{"kind":"Name","value":"scopes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; export const DeveloperSettingsAuthorizedAppsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DeveloperSettingsAuthorizedApps"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"authorizedApps"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatar"}}]}}]}}]}}]}}]} as unknown as DocumentNode; -export const SearchProjectsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SearchProjects"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"onlyWithRoles"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},"defaultValue":{"kind":"NullValue"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"projects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"onlyWithRoles"},"value":{"kind":"Variable","name":{"kind":"Name","value":"onlyWithRoles"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FormSelectProjects_Project"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FormSelectProjects_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; +export const SearchProjectsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SearchProjects"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"onlyWithRoles"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},"defaultValue":{"kind":"NullValue"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"projects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"onlyWithRoles"},"value":{"kind":"Variable","name":{"kind":"Name","value":"onlyWithRoles"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FormSelectProjects_Project"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FormSelectProjects_Project"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Project"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; export const SearchProjectModelsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SearchProjectModels"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"search"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"projectId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"models"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"10"}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"search"},"value":{"kind":"Variable","name":{"kind":"Name","value":"search"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"FormSelectModels_Model"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"FormSelectModels_Model"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Model"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode; export const ActiveUserGendoLimitsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ActiveUserGendoLimits"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"gendoAICredits"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"used"}},{"kind":"Field","name":{"kind":"Name","value":"limit"}},{"kind":"Field","name":{"kind":"Name","value":"resetDate"}}]}}]}}]}}]} as unknown as DocumentNode; export const RequestGendoAiRenderDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"requestGendoAIRender"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GendoAIRenderInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"versionMutations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"requestGendoAIRender"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]}}]} as unknown as DocumentNode; diff --git a/packages/frontend-2/lib/form/graphql/queries.ts b/packages/frontend-2/lib/form/graphql/queries.ts index 06f6717c1..13896e03b 100644 --- a/packages/frontend-2/lib/form/graphql/queries.ts +++ b/packages/frontend-2/lib/form/graphql/queries.ts @@ -1,9 +1,20 @@ import { graphql } from '~~/lib/common/generated/gql' export const searchProjectsQuery = graphql(` - query SearchProjects($search: String, $onlyWithRoles: [String!] = null) { + query SearchProjects( + $search: String + $onlyWithRoles: [String!] = null + $workspaceId: ID + ) { activeUser { - projects(limit: 10, filter: { search: $search, onlyWithRoles: $onlyWithRoles }) { + projects( + limit: 10 + filter: { + search: $search + onlyWithRoles: $onlyWithRoles + workspaceId: $workspaceId + } + ) { totalCount items { ...FormSelectProjects_Project diff --git a/packages/frontend-2/pages/functions/[fid].vue b/packages/frontend-2/pages/functions/[fid].vue index e68fff572..07fe7e1de 100644 --- a/packages/frontend-2/pages/functions/[fid].vue +++ b/packages/frontend-2/pages/functions/[fid].vue @@ -16,6 +16,7 @@ result.value?.automateFunction) +const fnWorkspaceId = computed(() => fn.value?.workspaceIds?.at(0)) const isOwner = computed( () => !!( @@ -114,8 +116,6 @@ const editModel = computed((): Optional => { const func = fn.value if (!func) return undefined - const workspaceId = func.workspaceIds?.at(0) - return { name: func.name, description: func.description, @@ -125,7 +125,7 @@ const editModel = computed((): Optional => { ), tags: func.tags, workspace: activeUserWorkspaces.value.find( - (workspace) => workspace.id === workspaceId + (workspace) => workspace.id === fnWorkspaceId.value ) } })