@itwin/saved-views-react 1.2.1 → 1.2.3

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.
@@ -2,6 +2,7 @@ import { QueryRowFormat } from "@itwin/core-common";
2
2
  import { extensionHandlers } from "./translation/SavedViewsExtensionHandlers.js";
3
3
  import { extractClipVectorsFromLegacy } from "./translation/clipVectorsLegacyExtractor.js";
4
4
  import { extractDisplayStyle2dFromLegacy, extractDisplayStyle3dFromLegacy, } from "./translation/displayStyleExtractor.js";
5
+ import { extractViewDetails2dFromLegacy, extractViewDetails3dFromLegacy, } from "./translation/viewDetailsLegacyExtractor.js";
5
6
  /**
6
7
  * Captures current {@link Viewport} state into serializable format. The returned
7
8
  * data can later be used to restore viewport's view.
@@ -87,6 +88,7 @@ function createSpatialSavedViewObject(vp, hiddenCategories, hiddenModels) {
87
88
  },
88
89
  displayStyle: extractDisplayStyle3dFromLegacy(displayStyleProps),
89
90
  clipVectors: extractClipVectorsFromLegacy(viewDefinitionProps),
91
+ viewDetails: extractViewDetails3dFromLegacy(viewDefinitionProps),
90
92
  };
91
93
  }
92
94
  function toArrayVector3d(xyzProps) {
@@ -117,6 +119,7 @@ function createDrawingSavedViewObject(vp, hiddenCategories) {
117
119
  enabled: viewState.categorySelector.toJSON().categories,
118
120
  disabled: hiddenCategories,
119
121
  },
122
+ viewDetails: extractViewDetails2dFromLegacy(viewDefinitionProps),
120
123
  };
121
124
  }
122
125
  function createSheetSavedViewObject(vp, hiddenCategories) {
@@ -136,6 +139,7 @@ function createSheetSavedViewObject(vp, hiddenCategories) {
136
139
  width: viewState.sheetSize.x,
137
140
  height: viewState.sheetSize.y,
138
141
  sheetAttachments: viewState.attachmentIds,
142
+ viewDetails: extractViewDetails2dFromLegacy(viewDefinitionProps),
139
143
  };
140
144
  }
141
145
  function toArrayVector2d(xyzProps) {
@@ -7,6 +7,7 @@ import { DrawingViewState, SheetViewState, SpatialViewState, } from "@itwin/core
7
7
  import { queryMissingCategories, queryMissingModels, } from "./captureSavedViewData.js";
8
8
  import { extractClipVectors } from "./translation/clipVectorsExtractor.js";
9
9
  import { extractDisplayStyle, extractDisplayStyle3d, } from "./translation/displayStyleExtractor.js";
10
+ import { extractViewDetails2d, extractViewDetails3d } from "./translation/viewDetailsExtractor.js";
10
11
  /**
11
12
  * Creates {@link ViewStateProps} object out of Saved View data. It provides a lower-level
12
13
  * access to view data for advanced use.
@@ -104,7 +105,17 @@ async function createSpatialViewStateProps(iModel, viewData) {
104
105
  angles: viewData.angles,
105
106
  camera: viewData.camera ?? new Camera(),
106
107
  jsonProperties: {
107
- viewDetails: extractClipVectors(viewData),
108
+ viewDetails: {
109
+ acs: seedViewState.getAuxiliaryCoordinateSystemId(),
110
+ aspectSkew: seedViewState.getAspectRatioSkew(),
111
+ gridOrient: seedViewState.getGridOrientation(),
112
+ gridPerRef: seedViewState.getGridsPerRef(),
113
+ gridSpaceX: seedViewState.getGridSpacing().x,
114
+ gridSpaceY: seedViewState.getGridSpacing().y,
115
+ disable3dManipulations: !seedViewState.allow3dManipulations,
116
+ ...extractClipVectors(viewData),
117
+ ...extractViewDetails3d(viewData),
118
+ },
108
119
  },
109
120
  classFullName: seedViewState.classFullName,
110
121
  code: seedViewState.code,
@@ -150,7 +161,14 @@ async function createDrawingViewStateProps(iModel, viewData) {
150
161
  id: seedViewState.id,
151
162
  jsonProperties: {
152
163
  viewDetails: {
164
+ acs: seedViewState.getAuxiliaryCoordinateSystemId(),
165
+ aspectSkew: seedViewState.getAspectRatioSkew(),
153
166
  gridOrient: seedViewState.getGridOrientation(),
167
+ gridPerRef: seedViewState.getGridsPerRef(),
168
+ gridSpaceX: seedViewState.getGridSpacing().x,
169
+ gridSpaceY: seedViewState.getGridSpacing().y,
170
+ ...extractClipVectors(viewData),
171
+ ...extractViewDetails2d(viewData),
154
172
  },
155
173
  },
156
174
  code: cloneCode(seedViewState.code),
@@ -198,7 +216,14 @@ async function createSheetViewStateProps(iModel, viewData) {
198
216
  id: seedViewState.id,
199
217
  jsonProperties: {
200
218
  viewDetails: {
219
+ acs: seedViewState.getAuxiliaryCoordinateSystemId(),
220
+ aspectSkew: seedViewState.getAspectRatioSkew(),
201
221
  gridOrient: seedViewState.getGridOrientation(),
222
+ gridPerRef: seedViewState.getGridsPerRef(),
223
+ gridSpaceX: seedViewState.getGridSpacing().x,
224
+ gridSpaceY: seedViewState.getGridSpacing().y,
225
+ ...extractClipVectors(viewData),
226
+ ...extractViewDetails2d(viewData),
202
227
  },
203
228
  },
204
229
  code: cloneCode(seedViewState.code),
@@ -1,5 +1,5 @@
1
1
  import type { Id64Array } from "@itwin/core-bentley";
2
- import type { CategorySelectorProps, DisplayStyle3dProps, DisplayStyleProps, EmphasizeElementsProps, ModelSelectorProps, SectionDrawingViewProps, SheetProps, SpatialViewDefinitionProps, ViewDefinition2dProps } from "@itwin/core-common";
2
+ import type { CategorySelectorProps, DisplayStyle3dProps, DisplayStyleProps, EmphasizeElementsProps, ModelSelectorProps, SectionDrawingViewProps, SheetProps, SpatialViewDefinitionProps, ViewDefinition2dProps, ViewDetails3dProps, ViewDetailsProps } from "@itwin/core-common";
3
3
  import type { Range3dProps } from "@itwin/core-geometry";
4
4
  export interface LegacySavedView3d extends LegacySavedViewBase {
5
5
  displayStyleProps: DisplayStyle3dProps;
@@ -7,6 +7,7 @@ export interface LegacySavedView3d extends LegacySavedViewBase {
7
7
  viewDefinitionProps: SpatialViewDefinitionProps;
8
8
  perModelCategoryVisibility?: PerModelCategoryVisibilityProps[];
9
9
  hiddenModels?: Id64Array;
10
+ viewDetails?: ViewDetails3dProps;
10
11
  }
11
12
  export interface PerModelCategoryVisibilityProps {
12
13
  modelId: string;
@@ -20,6 +21,7 @@ export interface LegacySavedView2d extends LegacySavedViewBase {
20
21
  sheetProps?: SheetProps;
21
22
  sheetAttachments?: Id64Array;
22
23
  modelExtents?: Range3dProps;
24
+ viewDetails?: ViewDetailsProps;
23
25
  }
24
26
  export interface LegacySavedViewBase {
25
27
  id: string;
@@ -1,3 +1,5 @@
1
+ import { type ExtractionFunc } from "./extractionUtilities.js";
2
+ export declare const clipVectorMappings: ExtractionFunc<void, void>[];
1
3
  /**
2
4
  * Extracts the clip vectors from a legacy view
3
5
  * @param input
@@ -28,7 +28,7 @@ const clipPlaneMappings = [
28
28
  const clipPrimitivePlaneMappings = [
29
29
  extractObject([extractArray2d(clipPlaneMappings, "clips"), extractBoolean("invisible")], "planes"),
30
30
  ];
31
- const clipVectorMappings = [
31
+ export const clipVectorMappings = [
32
32
  extractArrayConditionally([
33
33
  {
34
34
  discriminator: "planes",
@@ -1,3 +1,5 @@
1
1
  import type { SpatialViewDefinitionProps } from "@itwin/core-common";
2
2
  import type { ClipPrimitivePlaneProps, ClipPrimitiveShapeProps } from "@itwin/saved-views-client";
3
+ export declare function isValidClipPrimitive(value: ClipPrimitivePlaneProps | ClipPrimitiveShapeProps): boolean;
3
4
  export declare function extractClipVectorsFromLegacy(input: SpatialViewDefinitionProps): Array<ClipPrimitivePlaneProps | ClipPrimitiveShapeProps> | undefined;
5
+ export declare const clipVectorLegacyMappings: ((input: any, output: any) => void)[];
@@ -1,4 +1,8 @@
1
1
  import { applyExtraction, extractArray2d, extractArrayConditionally, extractBoolean, extractNumber, extractObject, extractSimpleArray, simpleTypeOf, } from "./extractionUtilities.js";
2
+ export function isValidClipPrimitive(value) {
3
+ const hasPlanes = "planes" in value;
4
+ return (!hasPlanes || (value.planes && Object.keys(value.planes).length > 0));
5
+ }
2
6
  export function extractClipVectorsFromLegacy(input) {
3
7
  const viewDetails = input.jsonProperties?.viewDetails;
4
8
  if (!viewDetails || !("clip" in viewDetails)) {
@@ -6,10 +10,7 @@ export function extractClipVectorsFromLegacy(input) {
6
10
  }
7
11
  const output = {};
8
12
  applyExtraction(viewDetails, output, clipVectorLegacyMappings);
9
- output.clipVectors = output.clipVectors?.filter((value) => {
10
- const hasPlanes = "planes" in value;
11
- return (!hasPlanes || (value.planes && Object.keys(value.planes).length > 0));
12
- });
13
+ output.clipVectors = output.clipVectors?.filter(isValidClipPrimitive);
13
14
  return output.clipVectors;
14
15
  }
15
16
  const clipPlaneLegacyMappings = [
@@ -31,7 +32,7 @@ const clipPrimitiveShapeLegacyMappings = [
31
32
  extractBoolean("invisible"),
32
33
  ], "shape"),
33
34
  ];
34
- const clipVectorLegacyMappings = [
35
+ export const clipVectorLegacyMappings = [
35
36
  extractArrayConditionally([
36
37
  { discriminator: "planes", mappings: clipPrimitivePlaneLegacyMappings },
37
38
  { discriminator: "shape", mappings: clipPrimitiveShapeLegacyMappings },
@@ -0,0 +1,4 @@
1
+ import type { ViewITwin2d, ViewITwin3d } from "@itwin/saved-views-client";
2
+ export declare const extractViewDetails2d: (input: ViewITwin2d) => any;
3
+ export declare const extractViewDetails3d: (input: ViewITwin3d) => any;
4
+ export declare const viewDetailsMappings: import("./extractionUtilities.js").ExtractionFunc<void, void>[];
@@ -0,0 +1,40 @@
1
+ import { clipVectorMappings } from "./clipVectorsExtractor.js";
2
+ import { applyExtraction, extractArray, extractBoolean, extractNumber, extractSimpleArray, extractString, simpleTypeOf, } from "./extractionUtilities.js";
3
+ export const extractViewDetails2d = (input) => {
4
+ const viewDetails = input.viewDetails;
5
+ if (!viewDetails) {
6
+ return undefined;
7
+ }
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ const output = {};
10
+ applyExtraction(viewDetails, output, viewDetailsMappings);
11
+ return output;
12
+ };
13
+ export const extractViewDetails3d = (input) => {
14
+ const viewDetails = input.viewDetails;
15
+ if (!viewDetails) {
16
+ return undefined;
17
+ }
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ const output = {};
20
+ applyExtraction(viewDetails, output, viewDetails3dMappings);
21
+ return output;
22
+ };
23
+ export const viewDetailsMappings = [
24
+ extractString("acs"),
25
+ extractNumber("aspectSkew"),
26
+ extractNumber("gridOrient"), // enum GridOrientationType
27
+ extractNumber("gridPerRef"),
28
+ extractNumber("gridSpaceX"),
29
+ extractNumber("gridSpaceY"),
30
+ // clip is already extracted in clipVectors property of the view
31
+ ];
32
+ const modelClipGroupMappings = [
33
+ ...clipVectorMappings,
34
+ extractSimpleArray(simpleTypeOf("string"), "models"),
35
+ ];
36
+ const viewDetails3dMappings = [
37
+ ...viewDetailsMappings,
38
+ extractBoolean("disable3dManipulations"),
39
+ extractArray(modelClipGroupMappings, "modelClipGroups"),
40
+ ];
@@ -0,0 +1,4 @@
1
+ import type { SpatialViewDefinitionProps, ViewDefinition2dProps } from "@itwin/core-common";
2
+ import type { ViewDetails3dProps, ViewDetailsProps } from "@itwin/saved-views-client";
3
+ export declare function extractViewDetails2dFromLegacy(input: ViewDefinition2dProps): ViewDetailsProps | undefined;
4
+ export declare function extractViewDetails3dFromLegacy(input: SpatialViewDefinitionProps): ViewDetails3dProps | undefined;
@@ -0,0 +1,34 @@
1
+ import { clipVectorLegacyMappings, isValidClipPrimitive, } from "./clipVectorsLegacyExtractor.js";
2
+ import { applyExtraction, extractArray, extractBoolean, extractSimpleArray, simpleTypeOf, } from "./extractionUtilities.js";
3
+ import { viewDetailsMappings } from "./viewDetailsExtractor.js";
4
+ export function extractViewDetails2dFromLegacy(input) {
5
+ const viewDetails = input.jsonProperties?.viewDetails;
6
+ if (!viewDetails) {
7
+ return undefined;
8
+ }
9
+ const output = {};
10
+ applyExtraction(viewDetails, output, viewDetailsMappings);
11
+ return output;
12
+ }
13
+ export function extractViewDetails3dFromLegacy(input) {
14
+ const viewDetails = input.jsonProperties?.viewDetails;
15
+ if (!viewDetails) {
16
+ return undefined;
17
+ }
18
+ const output = {};
19
+ applyExtraction(viewDetails, output, viewDetails3dLegacyMappings);
20
+ // Filter out any plane clipVectors that have no planes actually defined
21
+ for (const clipGroup of output?.modelClipGroups ?? []) {
22
+ clipGroup.clipVectors = clipGroup.clipVectors?.filter(isValidClipPrimitive);
23
+ }
24
+ return viewDetails;
25
+ }
26
+ const modelClipGroupLegacyMappings = [
27
+ ...clipVectorLegacyMappings,
28
+ extractSimpleArray(simpleTypeOf("string"), "models"),
29
+ ];
30
+ const viewDetails3dLegacyMappings = [
31
+ ...viewDetailsMappings,
32
+ extractBoolean("disable3dManipulations"),
33
+ extractArray(modelClipGroupLegacyMappings, "modelClipGroups"),
34
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/saved-views-react",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,16 +41,16 @@
41
41
  "@types/react": "^18.0.0",
42
42
  "@types/recursive-readdir": "^2.2.2",
43
43
  "@vitejs/plugin-react-swc": "^3.5.0",
44
- "@vitest/coverage-v8": "^3.2.4",
44
+ "@vitest/coverage-v8": "^4.0.16",
45
45
  "cpx2": "^5.0.0",
46
- "happy-dom": "^15.11.4",
46
+ "happy-dom": "^20.0.0",
47
47
  "npm-run-all": "^4.1.5",
48
48
  "react": "^18.0.0",
49
49
  "react-dom": "^18.0.0",
50
50
  "recursive-readdir": "^2.2.3",
51
51
  "typescript": "^5.5.4",
52
52
  "vite": "^6.0.0",
53
- "vitest": "^3.2.4"
53
+ "vitest": "^4.0.16"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "@itwin/core-common": "^5.2.0",
@@ -66,7 +66,7 @@
66
66
  "@itwin/itwinui-icons-react": "^2.9.0",
67
67
  "@itwin/itwinui-react": "^3.15.0",
68
68
  "fuse.js": "^6.6.2",
69
- "@itwin/saved-views-client": "^0.6.0"
69
+ "@itwin/saved-views-client": "^0.6.2"
70
70
  },
71
71
  "scripts": {
72
72
  "build": "run-p build:*",