vease 1.58.1 → 1.59.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/.build/tests/e2e/utils/app_interaction.js +5 -4
  2. package/.build/tests/e2e/utils/crs.js +128 -0
  3. package/.build/tests/e2e/utils/data/index.js +2 -2
  4. package/.build/tests/e2e/utils/data/model/attribute.js +20 -2
  5. package/.build/tests/e2e/utils/data/model/color.js +17 -0
  6. package/.build/tests/e2e/utils/data/model/edges/components.js +7 -0
  7. package/.build/tests/e2e/utils/data/model/index.js +2 -2
  8. package/.build/tests/e2e/utils/data/model/points/components.js +7 -0
  9. package/.build/tests/e2e/utils/data/model/style_menu.js +9 -0
  10. package/.build/tests/e2e/utils/extension.js +1 -1
  11. package/.build/tests/e2e/utils/fixtures.js +1 -1
  12. package/.build/tests/e2e/utils/load.js +1 -1
  13. package/.build/tests/e2e/utils/model_tabs.js +35 -0
  14. package/.build/tests/e2e/utils/navigate.js +6 -2
  15. package/.build/tests/e2e/utils/object_trees/model_components_object_tree.js +4 -4
  16. package/.build/tests/e2e/utils/viewer_interaction.js +10 -5
  17. package/.build/utils/browser_console.js +8 -2
  18. package/package.json +8 -8
  19. package/tests/e2e/utils/app_interaction.ts +9 -4
  20. package/tests/e2e/utils/crs.ts +231 -0
  21. package/tests/e2e/utils/data/model/attribute.ts +25 -1
  22. package/tests/e2e/utils/data/model/color.ts +17 -0
  23. package/tests/e2e/utils/data/model/edges/components.ts +8 -0
  24. package/tests/e2e/utils/data/model/points/components.ts +8 -0
  25. package/tests/e2e/utils/data/model/style_menu.ts +11 -0
  26. package/tests/e2e/utils/model_tabs.ts +61 -0
  27. package/tests/e2e/utils/navigate.ts +8 -1
  28. package/tests/e2e/utils/object_trees/model_components_object_tree.ts +3 -3
  29. package/tests/e2e/utils/viewer_interaction.ts +26 -5
  30. package/utils/browser_console.ts +10 -2
@@ -9,10 +9,11 @@ async function closeAllMenus(window) {
9
9
  await waitForActionSettled(window);
10
10
  }
11
11
  async function closeFeedbackSnackbar(window) {
12
- const snackbar = window.getByTestId("feedbackSnackbar");
13
- if (await snackbar.isVisible()) {
14
- await snackbar.getByRole("button").click();
15
- await expect(snackbar).not.toBeVisible();
12
+ const snackbars = window.getByTestId("feedbackSnackbar");
13
+ while (await snackbars.count() > 0) {
14
+ const count = await snackbars.count();
15
+ await snackbars.first().getByTestId("feedbackCloseBtn").click();
16
+ await expect(snackbars).toHaveCount(count - 1);
16
17
  }
17
18
  }
18
19
  //#endregion
@@ -0,0 +1,128 @@
1
+ import { waitForActionSettled } from "./wait_for_action_settled.js";
2
+ import { closeFeedbackSnackbar } from "./app_interaction.js";
3
+ import { expandGeodeObjectTypeInTree, getTreeRowByTextAndParent } from "./object_trees/common.js";
4
+ import { getMainObjectTree } from "./object_trees/main_object_tree.js";
5
+ import { getDataTableRow } from "./data_manager.js";
6
+ import { expect } from "@playwright/test";
7
+ //#region tests/e2e/utils/crs.ts
8
+ async function expectDataRows(window, itemNames) {
9
+ for (const itemName of itemNames) await expect(getDataTableRow(window, itemName)).toBeVisible();
10
+ }
11
+ async function openCrsByButton(window, itemName) {
12
+ await getDataTableRow(window, itemName).getByTestId("crsCell").click();
13
+ await waitForActionSettled(window);
14
+ }
15
+ async function expectRowCrs(window, itemName, expected) {
16
+ await expect(getDataTableRow(window, itemName).getByTestId("crsCell")).toContainText(expected);
17
+ }
18
+ async function getDataTreeRow(window, geodeObjectType, dataName) {
19
+ const tree = getMainObjectTree(window);
20
+ await expandGeodeObjectTypeInTree(window, geodeObjectType, tree);
21
+ return getTreeRowByTextAndParent(window, geodeObjectType, dataName, tree);
22
+ }
23
+ async function openCrsFromTree(window, geodeObjectType, dataName) {
24
+ await (await getDataTreeRow(window, geodeObjectType, dataName)).getByTestId("treeItemLabel").first().hover();
25
+ await waitForActionSettled(window);
26
+ const editButton = window.locator(".v-overlay--active").getByTestId("editCrsBtn");
27
+ await editButton.hover();
28
+ await editButton.click();
29
+ await waitForActionSettled(window);
30
+ }
31
+ async function openCrsFromInfoCard(window, geodeObjectType, dataName) {
32
+ await (await getDataTreeRow(window, geodeObjectType, dataName)).click({ button: "right" });
33
+ await waitForActionSettled(window);
34
+ await window.getByTestId("circularMenuCenterButton").click();
35
+ await window.getByTestId("infoEditCrsBtn").click();
36
+ await waitForActionSettled(window);
37
+ }
38
+ async function openCrsFromWarning(window, geodeObjectType, dataName) {
39
+ await (await getDataTreeRow(window, geodeObjectType, dataName)).getByTestId("crsMismatchIcon").click();
40
+ await waitForActionSettled(window);
41
+ }
42
+ async function openCrsFromFeedback(window, text) {
43
+ const snackbar = window.getByTestId("feedbackSnackbar").filter({ hasText: text });
44
+ await expect(snackbar).toBeVisible();
45
+ await snackbar.getByTestId("feedbackActionBtn").click();
46
+ await waitForActionSettled(window);
47
+ }
48
+ async function selectCrs(window, crsName) {
49
+ await window.getByTestId("crsSearchInput").locator("input").fill(crsName);
50
+ await window.locator("tr").filter({ hasText: crsName }).locator("input").first().check();
51
+ await waitForActionSettled(window);
52
+ }
53
+ async function confirmAssign(window) {
54
+ await window.getByTestId("crsAssignButton").click();
55
+ await waitForActionSettled(window);
56
+ await closeFeedbackSnackbar(window);
57
+ }
58
+ async function expectCurrentCrs(window, expected) {
59
+ await expect(window.getByTestId("crsCurrentValue")).toContainText(expected);
60
+ }
61
+ async function selectAssignMode(window) {
62
+ await window.getByTestId("crsModeAssign").click();
63
+ await waitForActionSettled(window);
64
+ }
65
+ async function clickAssign(window) {
66
+ await window.getByTestId("crsAssignButton").click();
67
+ await waitForActionSettled(window);
68
+ }
69
+ async function expectFeedback(window, text) {
70
+ await expect(window.getByTestId("feedbackSnackbar").filter({ hasText: text })).toBeVisible();
71
+ await closeFeedbackSnackbar(window);
72
+ }
73
+ async function selectConvertMode(window) {
74
+ await window.getByTestId("crsModeConvert").click();
75
+ await waitForActionSettled(window);
76
+ }
77
+ async function confirmConvert(window) {
78
+ await window.getByTestId("crsConvertButton").click();
79
+ await waitForActionSettled(window);
80
+ await closeFeedbackSnackbar(window);
81
+ }
82
+ async function startAlignment(window) {
83
+ await window.getByTestId("crsModeAlign").click();
84
+ await window.getByTestId("crsStartAlignButton").click();
85
+ await waitForActionSettled(window);
86
+ }
87
+ async function selectAlignMode(window, mode) {
88
+ await window.getByTestId(`crsAlignMode-${mode}`).click();
89
+ await waitForActionSettled(window);
90
+ }
91
+ async function fillAlignPoints(window, prefix, points) {
92
+ for (const [index, { x, y }] of points.entries()) {
93
+ const inputs = window.getByTestId(`${prefix}-${index}`).locator("input");
94
+ await inputs.nth(0).fill(String(x));
95
+ await inputs.nth(1).fill(String(y));
96
+ }
97
+ }
98
+ async function selectAlignmentCrs(window, crsName) {
99
+ const panel = window.getByTestId("crsAlignPanel");
100
+ await panel.getByTestId("crsSearchInput").locator("input").fill(crsName);
101
+ await panel.locator("tr").filter({ hasText: crsName }).locator("input").first().check();
102
+ await waitForActionSettled(window);
103
+ }
104
+ async function selectScope(window, scope, testId = "crsScope") {
105
+ await window.getByTestId(`${testId}-${scope}`).locator("input").check();
106
+ await waitForActionSettled(window);
107
+ }
108
+ async function expectCrsMismatch(window, geodeObjectType, dataName, expected) {
109
+ const icon = (await getDataTreeRow(window, geodeObjectType, dataName)).getByTestId("crsMismatchIcon");
110
+ if (expected) await expect(icon).toBeVisible();
111
+ else await expect(icon).toBeHidden();
112
+ }
113
+ async function openProjectCrs(window) {
114
+ await window.getByTestId("projectCrs").click();
115
+ await waitForActionSettled(window);
116
+ }
117
+ async function confirmProjectCrs(window) {
118
+ await window.getByTestId("projectCrsApply").click();
119
+ await waitForActionSettled(window);
120
+ await closeFeedbackSnackbar(window);
121
+ }
122
+ async function applyAlignment(window) {
123
+ await window.getByTestId("crsAlignApplyButton").click();
124
+ await waitForActionSettled(window);
125
+ await closeFeedbackSnackbar(window);
126
+ }
127
+ //#endregion
128
+ export { applyAlignment, clickAssign, confirmAssign, confirmConvert, confirmProjectCrs, expectCrsMismatch, expectCurrentCrs, expectDataRows, expectFeedback, expectRowCrs, fillAlignPoints, openCrsByButton, openCrsFromFeedback, openCrsFromInfoCard, openCrsFromTree, openCrsFromWarning, openProjectCrs, selectAlignMode, selectAlignmentCrs, selectAssignMode, selectConvertMode, selectCrs, selectScope, startAlignment };
@@ -17,7 +17,7 @@ import { openMeshPolyhedraMenu, setMeshPolyhedraColorMap, setMeshPolyhedraItem,
17
17
  import { copyMeshPolyhedraColor, pasteMeshPolyhedraColorInput, setMeshPolyhedraColor, setMeshPolyhedraColorBlack, setMeshPolyhedraColorInput, setMeshPolyhedraColorWithSlider, setMeshPolyhedraColoringStyle, setMeshPolyhedraOpacity } from "./mesh/polyhedra/color.js";
18
18
  import { setMeshPolyhedraVisibility } from "./mesh/polyhedra/visibility.js";
19
19
  import "./mesh/index.js";
20
- import { setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor } from "./model/attribute.js";
20
+ import { setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor, setModelTimeStep } from "./model/attribute.js";
21
21
  import { copyModelEdgesColor, copyModelPointsColor, copyModelPolygonsColor, copyModelPolyhedraColor, pasteModelEdgesColorInput, pasteModelPointsColorInput, pasteModelPolygonsColorInput, pasteModelPolyhedraColorInput, setModelColor, setModelColorWithSlider, setModelColoringStyle, setModelEdgesColorInput, setModelOpacity, setModelPointsColorInput, setModelPolygonsColorInput, setModelPolyhedraColorInput } from "./model/color.js";
22
22
  import { setModelComponentsEdgesColor, setModelComponentsEdgesVertexAttribute, setModelComponentsEdgesVisibility, setModelComponentsEdgesWidth } from "./model/edges/components.js";
23
23
  import { setModelEdgesVisibility } from "./model/edges/visibility.js";
@@ -25,4 +25,4 @@ import { setModelComponentsPointsColor, setModelComponentsPointsSize, setModelCo
25
25
  import { setModelPointsVisibility } from "./model/points/visibility.js";
26
26
  import { setModelSurfacesVisibility } from "./model/surfaces/visibility.js";
27
27
  import "./model/index.js";
28
- export { copyMeshCellsColor, copyMeshEdgesColor, copyMeshPointsColor, copyMeshPolygonsColor, copyMeshPolyhedraColor, copyModelEdgesColor, copyModelPointsColor, copyModelPolygonsColor, copyModelPolyhedraColor, openMeshCellsMenu, openMeshEdgesMenu, openMeshPointsMenu, openMeshPolygonsMenu, openMeshPolyhedraMenu, pasteMeshCellsColorInput, pasteMeshEdgesColorInput, pasteMeshPointsColorInput, pasteMeshPolygonsColorInput, pasteMeshPolyhedraColorInput, pasteModelEdgesColorInput, pasteModelPointsColorInput, pasteModelPolygonsColorInput, pasteModelPolyhedraColorInput, setMeshCellsCellAttribute, setMeshCellsColor, setMeshCellsColorInput, setMeshCellsColorMap, setMeshCellsColorWithSlider, setMeshCellsColoringStyle, setMeshCellsItem, setMeshCellsNoDataColor, setMeshCellsOpacity, setMeshCellsVertexAttribute, setMeshCellsVisibility, setMeshEdgesColor, setMeshEdgesColorInput, setMeshEdgesColorMap, setMeshEdgesColorWithSlider, setMeshEdgesColoringStyle, setMeshEdgesEdgeAttribute, setMeshEdgesItem, setMeshEdgesNoDataColor, setMeshEdgesOpacity, setMeshEdgesVertexAttribute, setMeshEdgesVisibility, setMeshEdgesWidth, setMeshPointsColor, setMeshPointsColorInput, setMeshPointsColorWithSlider, setMeshPointsColoringStyle, setMeshPointsNoDataColor, setMeshPointsOpacity, setMeshPointsSize, setMeshPointsVertexAttribute, setMeshPointsVisibility, setMeshPolygonsColor, setMeshPolygonsColorInput, setMeshPolygonsColorMap, setMeshPolygonsColorWithSlider, setMeshPolygonsColoringStyle, setMeshPolygonsItem, setMeshPolygonsNoDataColor, setMeshPolygonsOpacity, setMeshPolygonsPolygonAttribute, setMeshPolygonsTextures, setMeshPolygonsTimeStep, setMeshPolygonsVertexAttribute, setMeshPolygonsVisibility, setMeshPolyhedraColor, setMeshPolyhedraColorBlack, setMeshPolyhedraColorInput, setMeshPolyhedraColorMap, setMeshPolyhedraColorWithSlider, setMeshPolyhedraColoringStyle, setMeshPolyhedraItem, setMeshPolyhedraNoDataColor, setMeshPolyhedraOpacity, setMeshPolyhedraPolyhedronAttribute, setMeshPolyhedraVertexAttribute, setMeshPolyhedraVisibility, setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelColor, setModelColorWithSlider, setModelColoringStyle, setModelComponentsEdgesColor, setModelComponentsEdgesVertexAttribute, setModelComponentsEdgesVisibility, setModelComponentsEdgesWidth, setModelComponentsPointsColor, setModelComponentsPointsSize, setModelComponentsPointsVertexAttribute, setModelComponentsPointsVisibility, setModelEdgesColorInput, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelEdgesVisibility, setModelOpacity, setModelPointsColorInput, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPointsVisibility, setModelPolygonsColorInput, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraColorInput, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor, setModelSurfacesVisibility };
28
+ export { copyMeshCellsColor, copyMeshEdgesColor, copyMeshPointsColor, copyMeshPolygonsColor, copyMeshPolyhedraColor, copyModelEdgesColor, copyModelPointsColor, copyModelPolygonsColor, copyModelPolyhedraColor, openMeshCellsMenu, openMeshEdgesMenu, openMeshPointsMenu, openMeshPolygonsMenu, openMeshPolyhedraMenu, pasteMeshCellsColorInput, pasteMeshEdgesColorInput, pasteMeshPointsColorInput, pasteMeshPolygonsColorInput, pasteMeshPolyhedraColorInput, pasteModelEdgesColorInput, pasteModelPointsColorInput, pasteModelPolygonsColorInput, pasteModelPolyhedraColorInput, setMeshCellsCellAttribute, setMeshCellsColor, setMeshCellsColorInput, setMeshCellsColorMap, setMeshCellsColorWithSlider, setMeshCellsColoringStyle, setMeshCellsItem, setMeshCellsNoDataColor, setMeshCellsOpacity, setMeshCellsVertexAttribute, setMeshCellsVisibility, setMeshEdgesColor, setMeshEdgesColorInput, setMeshEdgesColorMap, setMeshEdgesColorWithSlider, setMeshEdgesColoringStyle, setMeshEdgesEdgeAttribute, setMeshEdgesItem, setMeshEdgesNoDataColor, setMeshEdgesOpacity, setMeshEdgesVertexAttribute, setMeshEdgesVisibility, setMeshEdgesWidth, setMeshPointsColor, setMeshPointsColorInput, setMeshPointsColorWithSlider, setMeshPointsColoringStyle, setMeshPointsNoDataColor, setMeshPointsOpacity, setMeshPointsSize, setMeshPointsVertexAttribute, setMeshPointsVisibility, setMeshPolygonsColor, setMeshPolygonsColorInput, setMeshPolygonsColorMap, setMeshPolygonsColorWithSlider, setMeshPolygonsColoringStyle, setMeshPolygonsItem, setMeshPolygonsNoDataColor, setMeshPolygonsOpacity, setMeshPolygonsPolygonAttribute, setMeshPolygonsTextures, setMeshPolygonsTimeStep, setMeshPolygonsVertexAttribute, setMeshPolygonsVisibility, setMeshPolyhedraColor, setMeshPolyhedraColorBlack, setMeshPolyhedraColorInput, setMeshPolyhedraColorMap, setMeshPolyhedraColorWithSlider, setMeshPolyhedraColoringStyle, setMeshPolyhedraItem, setMeshPolyhedraNoDataColor, setMeshPolyhedraOpacity, setMeshPolyhedraPolyhedronAttribute, setMeshPolyhedraVertexAttribute, setMeshPolyhedraVisibility, setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelColor, setModelColorWithSlider, setModelColoringStyle, setModelComponentsEdgesColor, setModelComponentsEdgesVertexAttribute, setModelComponentsEdgesVisibility, setModelComponentsEdgesWidth, setModelComponentsPointsColor, setModelComponentsPointsSize, setModelComponentsPointsVertexAttribute, setModelComponentsPointsVisibility, setModelEdgesColorInput, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelEdgesVisibility, setModelOpacity, setModelPointsColorInput, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPointsVisibility, setModelPolygonsColorInput, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraColorInput, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor, setModelSurfacesVisibility, setModelTimeStep };
@@ -1,7 +1,9 @@
1
1
  import { cellAttributeType, edgeAttributeType, polygonAttributeType, polyhedronAttributeType, vertexAttributeType } from "../../constants.js";
2
- import { applyAttribute, setFeatureNoDataColor } from "../helpers/attribute.js";
2
+ import { applyAttribute, setFeatureNoDataColor, setFeatureTimeStep } from "../helpers/attribute.js";
3
+ import { showModelStyleOptions } from "./style_menu.js";
3
4
  //#region tests/e2e/utils/data/model/attribute.ts
4
5
  async function setModelPointsVertexAttribute(window, attributeName, options = {}) {
6
+ await showModelStyleOptions(window);
5
7
  await applyAttribute(window, "modelStyleMenu", {
6
8
  attributeType: vertexAttributeType,
7
9
  attributeName,
@@ -9,9 +11,11 @@ async function setModelPointsVertexAttribute(window, attributeName, options = {}
9
11
  });
10
12
  }
11
13
  async function setModelPointsVertexAttributeNoDataColor(window) {
14
+ await showModelStyleOptions(window);
12
15
  await setFeatureNoDataColor(window, "modelStyleMenu");
13
16
  }
14
17
  async function setModelEdgesVertexAttribute(window, attributeName, options = {}) {
18
+ await showModelStyleOptions(window);
15
19
  await applyAttribute(window, "modelStyleMenu", {
16
20
  attributeType: vertexAttributeType,
17
21
  attributeName,
@@ -19,9 +23,11 @@ async function setModelEdgesVertexAttribute(window, attributeName, options = {})
19
23
  });
20
24
  }
21
25
  async function setModelEdgesVertexAttributeNoDataColor(window) {
26
+ await showModelStyleOptions(window);
22
27
  await setFeatureNoDataColor(window, "modelStyleMenu");
23
28
  }
24
29
  async function setModelPolygonsVertexAttribute(window, attributeName, options = {}) {
30
+ await showModelStyleOptions(window);
25
31
  await applyAttribute(window, "modelStyleMenu", {
26
32
  attributeType: vertexAttributeType,
27
33
  attributeName,
@@ -29,9 +35,11 @@ async function setModelPolygonsVertexAttribute(window, attributeName, options =
29
35
  });
30
36
  }
31
37
  async function setModelPolygonsVertexAttributeNoDataColor(window) {
38
+ await showModelStyleOptions(window);
32
39
  await setFeatureNoDataColor(window, "modelStyleMenu");
33
40
  }
34
41
  async function setModelPolyhedraVertexAttribute(window, attributeName, options = {}) {
42
+ await showModelStyleOptions(window);
35
43
  await applyAttribute(window, "modelStyleMenu", {
36
44
  attributeType: vertexAttributeType,
37
45
  attributeName,
@@ -39,9 +47,11 @@ async function setModelPolyhedraVertexAttribute(window, attributeName, options =
39
47
  });
40
48
  }
41
49
  async function setModelPolyhedraVertexAttributeNoDataColor(window) {
50
+ await showModelStyleOptions(window);
42
51
  await setFeatureNoDataColor(window, "modelStyleMenu");
43
52
  }
44
53
  async function setModelCellsVertexAttribute(window, attributeName, options = {}) {
54
+ await showModelStyleOptions(window);
45
55
  await applyAttribute(window, "modelStyleMenu", {
46
56
  attributeType: vertexAttributeType,
47
57
  attributeName,
@@ -49,6 +59,7 @@ async function setModelCellsVertexAttribute(window, attributeName, options = {})
49
59
  });
50
60
  }
51
61
  async function setModelEdgesEdgeAttribute(window, attributeName, options = {}) {
62
+ await showModelStyleOptions(window);
52
63
  await applyAttribute(window, "modelStyleMenu", {
53
64
  attributeType: edgeAttributeType,
54
65
  attributeName,
@@ -56,6 +67,7 @@ async function setModelEdgesEdgeAttribute(window, attributeName, options = {}) {
56
67
  });
57
68
  }
58
69
  async function setModelPolygonsPolygonAttribute(window, attributeName, options = {}) {
70
+ await showModelStyleOptions(window);
59
71
  await applyAttribute(window, "modelStyleMenu", {
60
72
  attributeType: polygonAttributeType,
61
73
  attributeName,
@@ -63,6 +75,7 @@ async function setModelPolygonsPolygonAttribute(window, attributeName, options =
63
75
  });
64
76
  }
65
77
  async function setModelPolyhedraPolyhedronAttribute(window, attributeName, options = {}) {
78
+ await showModelStyleOptions(window);
66
79
  await applyAttribute(window, "modelStyleMenu", {
67
80
  attributeType: polyhedronAttributeType,
68
81
  attributeName,
@@ -70,11 +83,16 @@ async function setModelPolyhedraPolyhedronAttribute(window, attributeName, optio
70
83
  });
71
84
  }
72
85
  async function setModelCellsCellAttribute(window, attributeName, options = {}) {
86
+ await showModelStyleOptions(window);
73
87
  await applyAttribute(window, "modelStyleMenu", {
74
88
  attributeType: cellAttributeType,
75
89
  attributeName,
76
90
  ...options
77
91
  });
78
92
  }
93
+ async function setModelTimeStep(window, timeStep) {
94
+ await showModelStyleOptions(window);
95
+ await setFeatureTimeStep(window, window.getByTestId("modelStyleMenu"), timeStep);
96
+ }
79
97
  //#endregion
80
- export { setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor };
98
+ export { setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor, setModelTimeStep };
@@ -1,51 +1,68 @@
1
1
  import { copyColor, pasteColorInput, setColor, setColorInput, setColorWithSlider, setColoringStyle, setOpacity } from "../helpers/color.js";
2
+ import { showModelStyleOptions } from "./style_menu.js";
2
3
  //#region tests/e2e/utils/data/model/color.ts
3
4
  async function setModelOpacity(window, percent) {
5
+ await showModelStyleOptions(window);
4
6
  await setOpacity(window, "modelStyleMenu", percent);
5
7
  }
6
8
  async function setModelColor(window) {
9
+ await showModelStyleOptions(window);
7
10
  await setColor(window, "modelStyleMenu");
8
11
  }
9
12
  async function setModelColorWithSlider(window) {
13
+ await showModelStyleOptions(window);
10
14
  await setColorWithSlider(window, "modelStyleMenu");
11
15
  }
12
16
  async function setModelColoringStyle(window, style) {
17
+ await showModelStyleOptions(window);
13
18
  await setColoringStyle(window, "modelStyleMenu", style);
14
19
  }
15
20
  async function copyModelPointsColor(window) {
21
+ await showModelStyleOptions(window);
16
22
  await copyColor(window, "modelStyleMenu");
17
23
  }
18
24
  async function setModelPointsColorInput(window, colorText) {
25
+ await showModelStyleOptions(window);
19
26
  await setColorInput(window, "modelStyleMenu", colorText);
20
27
  }
21
28
  async function pasteModelPointsColorInput(window) {
29
+ await showModelStyleOptions(window);
22
30
  await pasteColorInput(window, "modelStyleMenu");
23
31
  }
24
32
  async function copyModelEdgesColor(window) {
33
+ await showModelStyleOptions(window);
25
34
  await copyColor(window, "modelStyleMenu");
26
35
  }
27
36
  async function setModelEdgesColorInput(window, colorText) {
37
+ await showModelStyleOptions(window);
28
38
  await setColorInput(window, "modelStyleMenu", colorText);
29
39
  }
30
40
  async function pasteModelEdgesColorInput(window) {
41
+ await showModelStyleOptions(window);
31
42
  await pasteColorInput(window, "modelStyleMenu");
32
43
  }
33
44
  async function copyModelPolygonsColor(window) {
45
+ await showModelStyleOptions(window);
34
46
  await copyColor(window, "modelStyleMenu");
35
47
  }
36
48
  async function setModelPolygonsColorInput(window, colorText) {
49
+ await showModelStyleOptions(window);
37
50
  await setColorInput(window, "modelStyleMenu", colorText);
38
51
  }
39
52
  async function pasteModelPolygonsColorInput(window) {
53
+ await showModelStyleOptions(window);
40
54
  await pasteColorInput(window, "modelStyleMenu");
41
55
  }
42
56
  async function copyModelPolyhedraColor(window) {
57
+ await showModelStyleOptions(window);
43
58
  await copyColor(window, "modelStyleMenu");
44
59
  }
45
60
  async function setModelPolyhedraColorInput(window, colorText) {
61
+ await showModelStyleOptions(window);
46
62
  await setColorInput(window, "modelStyleMenu", colorText);
47
63
  }
48
64
  async function pasteModelPolyhedraColorInput(window) {
65
+ await showModelStyleOptions(window);
49
66
  await pasteColorInput(window, "modelStyleMenu");
50
67
  }
51
68
  //#endregion
@@ -1,5 +1,6 @@
1
1
  import { vertexAttributeType } from "../../../constants.js";
2
2
  import { waitForActionSettled } from "../../../wait_for_action_settled.js";
3
+ import { selectModelTab } from "../../../model_tabs.js";
3
4
  import { ensureFeatureVisible, ensureMenuOpen } from "../../../viewer_interaction.js";
4
5
  import { applyAttribute } from "../../helpers/attribute.js";
5
6
  import { setColor } from "../../helpers/color.js";
@@ -8,9 +9,15 @@ const modelEdgesMenuTestId = "modelEdgesMenu";
8
9
  function getModelEdgesSection(window, section) {
9
10
  return window.getByTestId(section).filter({ visible: true }).first();
10
11
  }
12
+ const SECTION_TABS = {
13
+ modelEdgesComponentsOptions: "components",
14
+ modelEdgesComponentTypeOptions: "type",
15
+ modelEdgesComponentOptions: "component"
16
+ };
11
17
  async function setModelComponentsEdgesVisibility(window, section, visibility) {
12
18
  await ensureMenuOpen(window, modelEdgesMenuTestId);
13
19
  await ensureFeatureVisible(window, modelEdgesMenuTestId);
20
+ await selectModelTab(window, SECTION_TABS[section]);
14
21
  const visibilitySwitch = getModelEdgesSection(window, section).getByTestId("modelComponentEdgesVisibilitySwitch").getByRole("checkbox");
15
22
  if (await visibilitySwitch.isChecked() !== visibility) {
16
23
  await visibilitySwitch.setChecked(visibility, { force: true });
@@ -1,4 +1,4 @@
1
- import { setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor } from "./attribute.js";
1
+ import { setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor, setModelTimeStep } from "./attribute.js";
2
2
  import { copyModelEdgesColor, copyModelPointsColor, copyModelPolygonsColor, copyModelPolyhedraColor, pasteModelEdgesColorInput, pasteModelPointsColorInput, pasteModelPolygonsColorInput, pasteModelPolyhedraColorInput, setModelColor, setModelColorWithSlider, setModelColoringStyle, setModelEdgesColorInput, setModelOpacity, setModelPointsColorInput, setModelPolygonsColorInput, setModelPolyhedraColorInput } from "./color.js";
3
3
  import { setModelComponentsEdgesColor, setModelComponentsEdgesVertexAttribute, setModelComponentsEdgesVisibility, setModelComponentsEdgesWidth } from "./edges/components.js";
4
4
  import { setModelEdgesVisibility } from "./edges/visibility.js";
@@ -8,4 +8,4 @@ import { setModelPointsVisibility } from "./points/visibility.js";
8
8
  import "./points/index.js";
9
9
  import { setModelSurfacesVisibility } from "./surfaces/visibility.js";
10
10
  import "./surfaces/index.js";
11
- export { copyModelEdgesColor, copyModelPointsColor, copyModelPolygonsColor, copyModelPolyhedraColor, pasteModelEdgesColorInput, pasteModelPointsColorInput, pasteModelPolygonsColorInput, pasteModelPolyhedraColorInput, setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelColor, setModelColorWithSlider, setModelColoringStyle, setModelComponentsEdgesColor, setModelComponentsEdgesVertexAttribute, setModelComponentsEdgesVisibility, setModelComponentsEdgesWidth, setModelComponentsPointsColor, setModelComponentsPointsSize, setModelComponentsPointsVertexAttribute, setModelComponentsPointsVisibility, setModelEdgesColorInput, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelEdgesVisibility, setModelOpacity, setModelPointsColorInput, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPointsVisibility, setModelPolygonsColorInput, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraColorInput, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor, setModelSurfacesVisibility };
11
+ export { copyModelEdgesColor, copyModelPointsColor, copyModelPolygonsColor, copyModelPolyhedraColor, pasteModelEdgesColorInput, pasteModelPointsColorInput, pasteModelPolygonsColorInput, pasteModelPolyhedraColorInput, setModelCellsCellAttribute, setModelCellsVertexAttribute, setModelColor, setModelColorWithSlider, setModelColoringStyle, setModelComponentsEdgesColor, setModelComponentsEdgesVertexAttribute, setModelComponentsEdgesVisibility, setModelComponentsEdgesWidth, setModelComponentsPointsColor, setModelComponentsPointsSize, setModelComponentsPointsVertexAttribute, setModelComponentsPointsVisibility, setModelEdgesColorInput, setModelEdgesEdgeAttribute, setModelEdgesVertexAttribute, setModelEdgesVertexAttributeNoDataColor, setModelEdgesVisibility, setModelOpacity, setModelPointsColorInput, setModelPointsVertexAttribute, setModelPointsVertexAttributeNoDataColor, setModelPointsVisibility, setModelPolygonsColorInput, setModelPolygonsPolygonAttribute, setModelPolygonsVertexAttribute, setModelPolygonsVertexAttributeNoDataColor, setModelPolyhedraColorInput, setModelPolyhedraPolyhedronAttribute, setModelPolyhedraVertexAttribute, setModelPolyhedraVertexAttributeNoDataColor, setModelSurfacesVisibility, setModelTimeStep };
@@ -1,5 +1,6 @@
1
1
  import { vertexAttributeType } from "../../../constants.js";
2
2
  import { waitForActionSettled } from "../../../wait_for_action_settled.js";
3
+ import { selectModelTab } from "../../../model_tabs.js";
3
4
  import { ensureFeatureVisible, ensureMenuOpen } from "../../../viewer_interaction.js";
4
5
  import { applyAttribute } from "../../helpers/attribute.js";
5
6
  import { setColor } from "../../helpers/color.js";
@@ -8,9 +9,15 @@ const modelPointsMenuTestId = "modelPointsMenu";
8
9
  function getModelPointsSection(window, section) {
9
10
  return window.getByTestId(section).filter({ visible: true }).first();
10
11
  }
12
+ const SECTION_TABS = {
13
+ modelPointsComponentsOptions: "components",
14
+ modelPointsComponentTypeOptions: "type",
15
+ modelPointsComponentOptions: "component"
16
+ };
11
17
  async function setModelComponentsPointsVisibility(window, section, visibility) {
12
18
  await ensureMenuOpen(window, modelPointsMenuTestId);
13
19
  await ensureFeatureVisible(window, modelPointsMenuTestId);
20
+ await selectModelTab(window, SECTION_TABS[section]);
14
21
  const visibilitySwitch = getModelPointsSection(window, section).getByTestId("modelComponentPointsVisibilitySwitch").getByRole("checkbox");
15
22
  if (await visibilitySwitch.isChecked() !== visibility) {
16
23
  await visibilitySwitch.setChecked(visibility, { force: true });
@@ -0,0 +1,9 @@
1
+ import { selectModelOptionsTab } from "../../model_tabs.js";
2
+ import { ensureMenuOpen } from "../../viewer_interaction.js";
3
+ //#region tests/e2e/utils/data/model/style_menu.ts
4
+ async function showModelStyleOptions(window) {
5
+ await ensureMenuOpen(window, "modelStyleMenu");
6
+ await selectModelOptionsTab(window);
7
+ }
8
+ //#endregion
9
+ export { showModelStyleOptions };
@@ -1,8 +1,8 @@
1
1
  import { modalTransitionWait } from "./constants.js";
2
2
  import { waitForLoadingScreen } from "./other.js";
3
3
  import { navigateToExtensionsPage } from "./navigate.js";
4
- import path from "node:path";
5
4
  import { consola } from "consola";
5
+ import path from "node:path";
6
6
  //#region tests/e2e/utils/extension.ts
7
7
  async function loadExtension(window, extensionFilePath) {
8
8
  await waitForLoadingScreen(window);
@@ -1,8 +1,8 @@
1
1
  import { waitForActionSettled } from "./wait_for_action_settled.js";
2
2
  import { navigateToApp } from "./navigate.js";
3
3
  import { expect, test as test$1 } from "@playwright/test";
4
- import path from "node:path";
5
4
  import { consola } from "consola";
5
+ import path from "node:path";
6
6
  import fs from "node:fs";
7
7
  import os from "node:os";
8
8
  //#region tests/e2e/utils/fixtures.ts
@@ -1,7 +1,7 @@
1
1
  import { waitForActionSettled } from "./wait_for_action_settled.js";
2
2
  import { expect } from "@playwright/test";
3
- import path from "node:path";
4
3
  import { consola } from "consola";
4
+ import path from "node:path";
5
5
  //#region tests/e2e/utils/load.ts
6
6
  const __dirname = import.meta.dirname;
7
7
  const loadWorkflowTimeout = 8e3;
@@ -0,0 +1,35 @@
1
+ import { waitForActionSettled } from "./wait_for_action_settled.js";
2
+ //#region tests/e2e/utils/model_tabs.ts
3
+ const MODEL_TAB_SWITCHES = /* @__PURE__ */ new Set([
4
+ "modelStyleVisibilitySwitch",
5
+ "modelEdgesVisibilitySwitch",
6
+ "modelPointsVisibilitySwitch"
7
+ ]);
8
+ const COMPONENT_TYPE_TAB_SWITCHES = /* @__PURE__ */ new Set([
9
+ "modelSurfacesVisibilitySwitch",
10
+ "modelLinesVisibilitySwitch",
11
+ "modelCornersVisibilitySwitch",
12
+ "modelBlocksVisibilitySwitch"
13
+ ]);
14
+ async function selectModelTab(window, tab) {
15
+ const tabButton = window.getByTestId(`modelTab_${tab}`).filter({ visible: true }).first();
16
+ if (await tabButton.isVisible()) {
17
+ await tabButton.click();
18
+ await waitForActionSettled(window);
19
+ }
20
+ }
21
+ async function selectModelOptionsTab(window) {
22
+ await selectModelTab(window, await window.getByTestId("modelTab_type").filter({ visible: true }).first().isVisible() ? "type" : "components");
23
+ }
24
+ async function getActiveModelTabTestId(window) {
25
+ const activeTab = window.locator("[data-testid^=\"modelTab_\"].v-btn--active").filter({ visible: true }).first();
26
+ if (await activeTab.count() === 0) return;
27
+ return await activeTab.getAttribute("data-testid") ?? void 0;
28
+ }
29
+ async function restoreModelTab(window, tabTestId) {
30
+ if (tabTestId === void 0) return;
31
+ await window.getByTestId(tabTestId).filter({ visible: true }).first().click();
32
+ await waitForActionSettled(window);
33
+ }
34
+ //#endregion
35
+ export { COMPONENT_TYPE_TAB_SWITCHES, MODEL_TAB_SWITCHES, getActiveModelTabTestId, restoreModelTab, selectModelOptionsTab, selectModelTab };
@@ -1,8 +1,8 @@
1
1
  import { logBrowserConsole } from "../../../utils/browser_console.js";
2
2
  import { expect } from "@playwright/test";
3
3
  import { isWindows } from "std-env";
4
- import path from "node:path";
5
4
  import { consola } from "consola";
5
+ import path from "node:path";
6
6
  import { execSync } from "node:child_process";
7
7
  import fs from "node:fs";
8
8
  import { setTimeout } from "node:timers/promises";
@@ -108,6 +108,10 @@ async function runDesktopBuild() {
108
108
  firstWindow
109
109
  };
110
110
  }
111
+ function errorMessage(error) {
112
+ if (error instanceof Error) return error.message;
113
+ return String(error);
114
+ }
111
115
  async function navigateToCloudApp(page, url, maxRetries) {
112
116
  consola.info(`Navigating to: ${url}`);
113
117
  const navigationTimeout = SECONDS_NAVIGATION_TIMEOUT * MILLISECONDS;
@@ -124,7 +128,7 @@ async function navigateToCloudApp(page, url, maxRetries) {
124
128
  break;
125
129
  } catch (error) {
126
130
  lastError = error;
127
- const message = error instanceof Error ? error.message : String(error);
131
+ const message = errorMessage(error);
128
132
  consola.info(`Attempt ${attempt} failed: ${message}`);
129
133
  if (attempt < maxRetries) await setTimeout(MILLISECONDS);
130
134
  }
@@ -1,15 +1,15 @@
1
1
  import { waitForActionSettled } from "../wait_for_action_settled.js";
2
2
  import { closeAllMenus, moveMouseOutOfTheWay } from "../app_interaction.js";
3
3
  import { ensureMenuOpen, resetMenuScroll } from "../viewer_interaction.js";
4
- import { setModelColor } from "../data/model/color.js";
5
4
  import { clickCollapseOrExpandAll, collapseGeodeObjectTypeInTree, collapseTreeGroup, expandGeodeObjectTypeInTree, getTreeRowByTextAndParent } from "./common.js";
6
5
  import { expandGeodeObjectType, getMainObjectTree } from "./main_object_tree.js";
6
+ import { setModelColor } from "../data/model/color.js";
7
7
  //#region tests/e2e/utils/object_trees/model_components_object_tree.ts
8
8
  function getModelComponentsObjectTree(window) {
9
9
  return window.getByTestId("modelComponentsObjectTree");
10
10
  }
11
- function getModelComponentTypeOptions(window) {
12
- return window.getByTestId("modelComponentTypeOptions");
11
+ function getModelComponentTypeTab(window) {
12
+ return window.getByTestId("modelTab_type");
13
13
  }
14
14
  async function collapseModelComponentsObjectTree(window) {
15
15
  const modelComponentsObjectTree = getModelComponentsObjectTree(window);
@@ -107,4 +107,4 @@ async function hideAllComponentLeafRows(window, categoryName) {
107
107
  await waitForActionSettled(window);
108
108
  }
109
109
  //#endregion
110
- export { closeModelComponentsTree, collapseMeshComponentType, collapseModelComponentTypes, collapseModelComponentsObjectTree, collapseModelComponentsObjectTreeGroup, expandMeshComponentType, expandModelComponentsObjectTree, getModelComponentTypeOptions, getModelComponentsObjectTree, hideAllComponentLeafRows, hoverCorners, hoverLines, hoverModelBlock, hoverSurfaces, openModelComponentContextMenu, openModelComponentTypeContextMenu, openModelComponentsTree, setModelTreeRowColorRandom, toggleModelTreeRow };
110
+ export { closeModelComponentsTree, collapseMeshComponentType, collapseModelComponentTypes, collapseModelComponentsObjectTree, collapseModelComponentsObjectTreeGroup, expandMeshComponentType, expandModelComponentsObjectTree, getModelComponentTypeTab, getModelComponentsObjectTree, hideAllComponentLeafRows, hoverCorners, hoverLines, hoverModelBlock, hoverSurfaces, openModelComponentContextMenu, openModelComponentTypeContextMenu, openModelComponentsTree, setModelTreeRowColorRandom, toggleModelTreeRow };
@@ -1,6 +1,7 @@
1
1
  import { afterActionWait } from "./constants.js";
2
2
  import { waitForActionSettled } from "./wait_for_action_settled.js";
3
3
  import { closeFeedbackSnackbar, moveMouseOutOfTheWay } from "./app_interaction.js";
4
+ import { COMPONENT_TYPE_TAB_SWITCHES, MODEL_TAB_SWITCHES, getActiveModelTabTestId, restoreModelTab, selectModelTab } from "./model_tabs.js";
4
5
  //#region tests/e2e/utils/viewer_interaction.ts
5
6
  function noopCleanup() {}
6
7
  function getHybridViewerCanvas(window) {
@@ -114,11 +115,13 @@ async function ensureMenuOpen(window, menuTestId) {
114
115
  }
115
116
  async function ensureFeatureVisible(window, menuTestId) {
116
117
  const switchTestId = menuTestId.replace("Menu", "VisibilitySwitch");
117
- const visibilitySwitch = window.getByTestId(switchTestId).getByRole("checkbox");
118
- if (!await visibilitySwitch.isChecked()) {
119
- await visibilitySwitch.check({ force: true });
120
- await window.waitForTimeout(500);
121
- }
118
+ const visibilitySwitch = window.getByTestId(switchTestId).getByRole("checkbox", { includeHidden: true });
119
+ if (await visibilitySwitch.isChecked()) return;
120
+ const activeTabTestId = await getActiveModelTabTestId(window);
121
+ if (MODEL_TAB_SWITCHES.has(switchTestId)) await selectModelTab(window, "model");
122
+ await visibilitySwitch.check({ force: true });
123
+ await window.waitForTimeout(500);
124
+ await restoreModelTab(window, activeTabTestId);
122
125
  }
123
126
  async function dragElement(window, locator, { startX: fromX, startY: fromY, targetX, targetY, deltaX = 0, deltaY = 0 } = {}) {
124
127
  const box = await locator.boundingBox();
@@ -154,6 +157,8 @@ async function stabilizeHoverTooltip(window) {
154
157
  }
155
158
  async function setVisibilityGeneric(window, menuTestId, switchTestId, visibility) {
156
159
  await ensureMenuOpen(window, menuTestId);
160
+ if (MODEL_TAB_SWITCHES.has(switchTestId)) await selectModelTab(window, "model");
161
+ else if (COMPONENT_TYPE_TAB_SWITCHES.has(switchTestId)) await selectModelTab(window, "type");
157
162
  const checkbox = window.getByTestId(switchTestId).getByRole("checkbox");
158
163
  if (visibility) await checkbox.check();
159
164
  else await checkbox.uncheck();
@@ -21,8 +21,14 @@ function logBrowserConsole(level, message, prefix = "") {
21
21
  const parts = (match.groups.badge ?? "").split(":");
22
22
  const last = parts.at(-1) ?? "";
23
23
  const type = isLogType(last) ? last : fallbackType;
24
- const tag = (isLogType(last) ? parts.slice(0, -1) : parts).join(":");
25
- (tag ? consola.withTag(tag) : consola)[type](`${prefix}${text}`);
24
+ let tagParts = parts;
25
+ if (isLogType(last)) tagParts = parts.slice(0, -1);
26
+ const tag = tagParts.join(":");
27
+ if (tag) {
28
+ consola.withTag(tag)[type](`${prefix}${text}`);
29
+ return;
30
+ }
31
+ consola[type](`${prefix}${text}`);
26
32
  }
27
33
  //#endregion
28
34
  export { logBrowserConsole };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vease",
3
- "version": "1.58.1",
3
+ "version": "1.59.0-rc.2",
4
4
  "description": "Desktop and cloud software for data visualization",
5
5
  "keywords": [
6
6
  "Desktop",
@@ -81,7 +81,7 @@
81
81
  "test:e2e:cloud": "npm run test:e2e -- --project=cloud",
82
82
  "test:e2e:desktop": "npm run test:e2e -- --project=desktop",
83
83
  "test:e2e:update_snapshots": "npm run test:e2e:browser:chrome -- --update-snapshots",
84
- "prepare:types": "cross-env MODE=BROWSER nuxi prepare"
84
+ "prepare:types": "cross-env MODE=BROWSER npx nuxi prepare"
85
85
  },
86
86
  "dependencies": {
87
87
  "@ai-sdk/gateway": "4.0.75",
@@ -90,12 +90,12 @@
90
90
  "@ai-sdk/vue": "4.0.93",
91
91
  "@fontsource/michroma": "5.2.6",
92
92
  "@fontsource/roboto": "5.2.10",
93
- "@geode/cloud-api": "latest",
94
- "@geode/opengeodeweb-back": "latest",
95
- "@geode/opengeodeweb-front": "latest",
96
- "@geode/opengeodeweb-viewer": "latest",
97
- "@geode/vease-back": "latest",
98
- "@geode/vease-viewer": "latest",
93
+ "@geode/cloud-api": "next",
94
+ "@geode/opengeodeweb-back": "next",
95
+ "@geode/opengeodeweb-front": "next",
96
+ "@geode/opengeodeweb-viewer": "next",
97
+ "@geode/vease-back": "next",
98
+ "@geode/vease-viewer": "next",
99
99
  "@nuxtjs/mcp-toolkit": "0.18.1",
100
100
  "ai": "7.0.93",
101
101
  "bowser": "2.14.1",