From 3ecb7acb8e40308d4ee0a5b812b093f2aca13195 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 10 Jun 2026 14:46:57 +0200 Subject: [PATCH 01/23] fix(modelColor): Fix model color Inheritance --- .../Viewer/Generic/Model/ModelStyleCard.vue | 45 +++++++++---------- .../data_style/model/index.nuxt.test.js | 29 ++++++++++++ 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/app/components/Viewer/Generic/Model/ModelStyleCard.vue b/app/components/Viewer/Generic/Model/ModelStyleCard.vue index e415744c..e8f2027a 100644 --- a/app/components/Viewer/Generic/Model/ModelStyleCard.vue +++ b/app/components/Viewer/Generic/Model/ModelStyleCard.vue @@ -91,38 +91,35 @@ const colorModes = [ { title: "Random", value: "random" }, ]; -const modelComponentsColorMode = ref("constant"); - -const modelComponentsColor = computed({ - get: () => { - if (selection.value.length > 0) { - return dataStyleStore.getModelComponentColor(modelId.value, selection.value[0]); - } - return { red: 255, green: 255, blue: 255 }; - }, - set: async (color) => { - if (selection.value.length > 0) { - await dataStyleStore.setModelComponentsColor( - modelId.value, - selection.value, - color, - modelComponentsColorMode.value, - ); - hybridViewerStore.remoteRender(); - } +const modelComponentsColorMode = computed({ + get: () => dataStyleStore.getStyle(modelId.value).color_mode || "constant", + set: async (colorMode) => { + await dataStyleStore.mutateStyle(modelId.value, { color_mode: colorMode }); + await dataStyleStore.setModelComponentsColor( + modelId.value, + selection.value, + colorMode === "random" ? undefined : modelComponentsColor.value, + colorMode, + ); + hybridViewerStore.remoteRender(); }, }); -watch(modelComponentsColorMode, async (colorMode) => { - if (colorMode === "random" && selection.value.length > 0) { +const modelComponentsColor = computed({ + get: () => + dataStyleStore.getStyle(modelId.value).color || + dataStyleStore.getModelComponentColor(modelId.value, selection.value[0]) || + { red: 255, green: 255, blue: 255 }, + set: async (color) => { + await dataStyleStore.mutateStyle(modelId.value, { color }); await dataStyleStore.setModelComponentsColor( modelId.value, selection.value, - undefined, - colorMode, + color, + modelComponentsColorMode.value, ); hybridViewerStore.remoteRender(); - } + }, }); diff --git a/tests/integration/stores/data_style/model/index.nuxt.test.js b/tests/integration/stores/data_style/model/index.nuxt.test.js index 01f6bd40..7a2eed83 100644 --- a/tests/integration/stores/data_style/model/index.nuxt.test.js +++ b/tests/integration/stores/data_style/model/index.nuxt.test.js @@ -6,6 +6,7 @@ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schem import { beforeAllTimeout, setupIntegrationTests } from "@ogw_tests/integration/setup"; import { Status } from "@ogw_front/utils/status"; import { cleanupBackend } from "@ogw_front/utils/local/cleanup"; +import { useDataStore } from "@ogw_front/stores/data"; import { useDataStyleStore } from "@ogw_front/stores/data_style"; import { useViewerStore } from "@ogw_front/stores/viewer"; @@ -58,4 +59,32 @@ describe("model", () => { expect(viewerStore.status).toBe(Status.CONNECTED); }); }); + + describe("model color inheritance", () => { + test("inheritance workflow model > surfaces > surface", async () => { + const dataStyleStore = useDataStyleStore(); + const dataStore = useDataStore(); + + const surface_ids = await dataStore.getSurfacesGeodeIds(id); + const [surface_id] = surface_ids; + + const red = { red: 255, green: 0, blue: 0, alpha: 1 }; + const green = { red: 0, green: 255, blue: 0, alpha: 1 }; + const blue = { red: 0, green: 0, blue: 255, alpha: 1 }; + + await dataStyleStore.mutateStyle(id, { color: red, color_mode: "constant" }); + await dataStyleStore.setModelComponentsColor(id, surface_ids, red); + await sleep(SLEEP_MS); + + await dataStyleStore.setModelComponentTypeColor(id, "Surface", green); + await sleep(SLEEP_MS); + + await dataStyleStore.setModelSurfacesColor(id, [surface_id], blue); + await sleep(SLEEP_MS); + + expect(dataStyleStore.getStyle(id).color).toStrictEqual(red); + expect(dataStyleStore.modelComponentTypeColor(id, "Surface")).toStrictEqual(green); + expect(dataStyleStore.modelSurfaceColor(id, surface_id)).toStrictEqual(blue); + }); + }); }); From 793b2618eba0abd04b4c27f9158b61f0cb1be961 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:53:24 +0000 Subject: [PATCH 02/23] Apply prepare changes --- app/components/Viewer/Generic/Model/ModelStyleCard.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/components/Viewer/Generic/Model/ModelStyleCard.vue b/app/components/Viewer/Generic/Model/ModelStyleCard.vue index e8f2027a..6710c5cf 100644 --- a/app/components/Viewer/Generic/Model/ModelStyleCard.vue +++ b/app/components/Viewer/Generic/Model/ModelStyleCard.vue @@ -108,8 +108,11 @@ const modelComponentsColorMode = computed({ const modelComponentsColor = computed({ get: () => dataStyleStore.getStyle(modelId.value).color || - dataStyleStore.getModelComponentColor(modelId.value, selection.value[0]) || - { red: 255, green: 255, blue: 255 }, + dataStyleStore.getModelComponentColor(modelId.value, selection.value[0]) || { + red: 255, + green: 255, + blue: 255, + }, set: async (color) => { await dataStyleStore.mutateStyle(modelId.value, { color }); await dataStyleStore.setModelComponentsColor( From b5fe1c911570b9d6f66c271e0521b89efab90685 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 10 Jun 2026 15:38:38 +0200 Subject: [PATCH 03/23] model default color and color_mode --- .../Viewer/Generic/Model/ModelStyleCard.vue | 11 +++-------- app/utils/default_styles/constants.js | 5 +++++ app/utils/default_styles/index.js | 2 +- app/utils/default_styles/models.js | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/app/components/Viewer/Generic/Model/ModelStyleCard.vue b/app/components/Viewer/Generic/Model/ModelStyleCard.vue index 6710c5cf..2ce78bbd 100644 --- a/app/components/Viewer/Generic/Model/ModelStyleCard.vue +++ b/app/components/Viewer/Generic/Model/ModelStyleCard.vue @@ -1,4 +1,5 @@