@itwin/saved-views-react 0.1.0

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 (77) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +131 -0
  3. package/lib/LayeredDropdownMenu/LayeredDropdownMenu.css +11 -0
  4. package/lib/LayeredDropdownMenu/LayeredDropdownMenu.d.ts +39 -0
  5. package/lib/LayeredDropdownMenu/LayeredDropdownMenu.js +53 -0
  6. package/lib/SavedView.d.ts +18 -0
  7. package/lib/SavedView.js +1 -0
  8. package/lib/SavedViewTile/SavedViewOptions.css +26 -0
  9. package/lib/SavedViewTile/SavedViewOptions.d.ts +139 -0
  10. package/lib/SavedViewTile/SavedViewOptions.js +173 -0
  11. package/lib/SavedViewTile/SavedViewTile.css +89 -0
  12. package/lib/SavedViewTile/SavedViewTile.d.ts +55 -0
  13. package/lib/SavedViewTile/SavedViewTile.js +110 -0
  14. package/lib/SavedViewTile/SavedViewTileContext.d.ts +14 -0
  15. package/lib/SavedViewTile/SavedViewTileContext.js +20 -0
  16. package/lib/SavedViewsClient/ITwinSavedViewsClient.d.ts +30 -0
  17. package/lib/SavedViewsClient/ITwinSavedViewsClient.js +132 -0
  18. package/lib/SavedViewsClient/SavedViewsClient.d.ts +72 -0
  19. package/lib/SavedViewsClient/SavedViewsClient.js +1 -0
  20. package/lib/SavedViewsContext.d.ts +13 -0
  21. package/lib/SavedViewsContext.js +38 -0
  22. package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupOptions.d.ts +9 -0
  23. package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupOptions.js +14 -0
  24. package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTile.d.ts +14 -0
  25. package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTile.js +37 -0
  26. package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTileContext.d.ts +14 -0
  27. package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTileContext.js +20 -0
  28. package/lib/SavedViewsWidget/SavedViewsExpandableBlockWidget.css +50 -0
  29. package/lib/SavedViewsWidget/SavedViewsExpandableBlockWidget.d.ts +36 -0
  30. package/lib/SavedViewsWidget/SavedViewsExpandableBlockWidget.js +36 -0
  31. package/lib/SavedViewsWidget/SavedViewsFolderWidget.d.ts +14 -0
  32. package/lib/SavedViewsWidget/SavedViewsFolderWidget.js +60 -0
  33. package/lib/StickyExpandableBlock/StickyExpandableBlock.css +20 -0
  34. package/lib/StickyExpandableBlock/StickyExpandableBlock.d.ts +29 -0
  35. package/lib/StickyExpandableBlock/StickyExpandableBlock.js +63 -0
  36. package/lib/TileGrid/TileGrid.css +28 -0
  37. package/lib/TileGrid/TileGrid.d.ts +48 -0
  38. package/lib/TileGrid/TileGrid.js +32 -0
  39. package/lib/api/clients/IModelQueryClient.d.ts +10 -0
  40. package/lib/api/clients/IModelQueryClient.js +45 -0
  41. package/lib/api/clients/ISavedViewsClient.d.ts +9 -0
  42. package/lib/api/clients/ISavedViewsClient.js +16 -0
  43. package/lib/api/utilities/SavedViewTypes.d.ts +48 -0
  44. package/lib/api/utilities/SavedViewTypes.js +1 -0
  45. package/lib/api/utilities/translation/ModelsAndCategoriesHelper.d.ts +3 -0
  46. package/lib/api/utilities/translation/ModelsAndCategoriesHelper.js +57 -0
  47. package/lib/api/utilities/translation/RgbColor.d.ts +29 -0
  48. package/lib/api/utilities/translation/RgbColor.js +1 -0
  49. package/lib/api/utilities/translation/SavedViewTranslation.d.ts +22 -0
  50. package/lib/api/utilities/translation/SavedViewTranslation.js +246 -0
  51. package/lib/api/utilities/translation/SavedViewsExtensionHandlers.d.ts +13 -0
  52. package/lib/api/utilities/translation/SavedViewsExtensionHandlers.js +42 -0
  53. package/lib/api/utilities/translation/clipVectorsExtractor.d.ts +5 -0
  54. package/lib/api/utilities/translation/clipVectorsExtractor.js +56 -0
  55. package/lib/api/utilities/translation/displayStyleExtractor.d.ts +17 -0
  56. package/lib/api/utilities/translation/displayStyleExtractor.js +499 -0
  57. package/lib/api/utilities/translation/extensionExtractor.d.ts +18 -0
  58. package/lib/api/utilities/translation/extensionExtractor.js +79 -0
  59. package/lib/api/utilities/translation/extractionUtilities.d.ts +209 -0
  60. package/lib/api/utilities/translation/extractionUtilities.js +515 -0
  61. package/lib/api/utilities/translation/urlConverter.d.ts +7 -0
  62. package/lib/api/utilities/translation/urlConverter.js +42 -0
  63. package/lib/api/utilities/translation/viewExtractorSavedViewToLegacySavedView.d.ts +35 -0
  64. package/lib/api/utilities/translation/viewExtractorSavedViewToLegacySavedView.js +298 -0
  65. package/lib/experimental.d.ts +4 -0
  66. package/lib/experimental.js +8 -0
  67. package/lib/index.d.ts +12 -0
  68. package/lib/index.js +14 -0
  69. package/lib/localization.d.ts +52 -0
  70. package/lib/localization.js +51 -0
  71. package/lib/ui/viewlist/ModelCategoryOverrideProvider.d.ts +31 -0
  72. package/lib/ui/viewlist/ModelCategoryOverrideProvider.js +88 -0
  73. package/lib/useSavedViews.d.ts +52 -0
  74. package/lib/useSavedViews.js +514 -0
  75. package/lib/utils.d.ts +1 -0
  76. package/lib/utils.js +7 -0
  77. package/package.json +75 -0
@@ -0,0 +1,48 @@
1
+ import type { Id64Array } from "@itwin/core-bentley";
2
+ import type { CategorySelectorProps, DisplayStyle3dProps, DisplayStyleProps, EmphasizeElementsProps, ModelSelectorProps, SectionDrawingViewProps, SheetProps, SpatialViewDefinitionProps, ViewDefinition2dProps } from "@itwin/core-common";
3
+ import type { Range3dProps } from "@itwin/core-geometry";
4
+ import type { ModelCategoryOverrideProviderProps } from "../../ui/viewlist/ModelCategoryOverrideProvider.js";
5
+ /** Per Model Category Visibility Props */
6
+ export interface PerModelCategoryVisibilityProps {
7
+ modelId: string;
8
+ categoryId: string;
9
+ visible: boolean;
10
+ }
11
+ export interface LegacySavedViewBase {
12
+ id: string;
13
+ name: string;
14
+ shared: boolean;
15
+ is2d?: boolean;
16
+ groupId?: string;
17
+ userId?: string;
18
+ thumbnailId?: string;
19
+ thumbnail?: string;
20
+ categorySelectorProps: CategorySelectorProps;
21
+ emphasizeElementsProps?: EmphasizeElementsProps;
22
+ visibilityOverrideProps?: ModelCategoryOverrideProviderProps;
23
+ tags?: LegacyTag[];
24
+ hiddenCategories?: Id64Array;
25
+ extensions?: Map<string, string>;
26
+ }
27
+ export interface LegacySavedView2d extends LegacySavedViewBase {
28
+ viewDefinitionProps: ViewDefinition2dProps;
29
+ displayStyleProps: DisplayStyleProps;
30
+ sectionDrawing?: SectionDrawingViewProps;
31
+ sheetProps?: SheetProps;
32
+ sheetAttachments?: Id64Array;
33
+ }
34
+ /**
35
+ * Format for a saved view setting instance in the service
36
+ */
37
+ export interface LegacySavedView extends LegacySavedViewBase {
38
+ displayStyleProps: DisplayStyle3dProps;
39
+ modelSelectorProps: ModelSelectorProps;
40
+ modelExtents?: Range3dProps;
41
+ viewDefinitionProps: SpatialViewDefinitionProps;
42
+ perModelCategoryVisibility?: PerModelCategoryVisibilityProps[];
43
+ hiddenModels?: Id64Array;
44
+ }
45
+ export interface LegacyTag {
46
+ name: string;
47
+ createdByUserId: string;
48
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { IModelConnection, ViewState } from "@itwin/core-frontend";
2
+ import type { LegacySavedViewBase } from "../SavedViewTypes.js";
3
+ export declare function applyHiddenModelsAndCategories(viewState: ViewState, savedView: LegacySavedViewBase, iModelConnection: IModelConnection): Promise<void>;
@@ -0,0 +1,57 @@
1
+ import { IModelQueryClient } from "../../clients/IModelQueryClient.js";
2
+ import { isSavedView3d } from "../../clients/ISavedViewsClient.js";
3
+ function legacyViewHasValidHiddenModelsAndCategories(savedView) {
4
+ if (isSavedView3d(savedView)) {
5
+ return !!(savedView.hiddenCategories && savedView.hiddenModels);
6
+ }
7
+ return !!savedView.hiddenCategories;
8
+ }
9
+ export async function applyHiddenModelsAndCategories(viewState, savedView, iModelConnection) {
10
+ if (legacyViewHasValidHiddenModelsAndCategories(savedView)) {
11
+ const visible = await getVisibleModelsAndCategories(savedView, iModelConnection);
12
+ if (visible.categories) {
13
+ viewState.categorySelector.addCategories(visible.categories);
14
+ }
15
+ if (viewState.isSpatialView() && visible.models) {
16
+ viewState.modelSelector.addModels(visible.models);
17
+ }
18
+ await viewState.load();
19
+ }
20
+ }
21
+ async function getVisibleModelsAndCategories(savedView, iModelConnection) {
22
+ return {
23
+ models: isSavedView3d(savedView)
24
+ ? await getVisibleModels(savedView, iModelConnection)
25
+ : undefined,
26
+ categories: await getVisibleCategories(savedView, iModelConnection),
27
+ };
28
+ }
29
+ async function getVisibleModels(savedView, iModelConnection) {
30
+ const hiddenModels = savedView.hiddenModels;
31
+ return hiddenModels ? getMissingModels(hiddenModels, iModelConnection) : undefined;
32
+ }
33
+ async function getVisibleCategories(savedView, iModelConnection) {
34
+ const hiddenCategories = savedView.hiddenCategories;
35
+ return hiddenCategories
36
+ ? getMissingCategories(hiddenCategories, iModelConnection)
37
+ : undefined;
38
+ }
39
+ async function getMissingModels(models, iModelConnection) {
40
+ const allModels = await getAllModels(iModelConnection);
41
+ return getDiff(models, allModels);
42
+ }
43
+ async function getMissingCategories(categories, iModelConnection) {
44
+ const allCategories = await getAllCategories(iModelConnection);
45
+ return getDiff(categories, allCategories);
46
+ }
47
+ async function getAllModels(iModelConnection) {
48
+ return IModelQueryClient.getAllModels(iModelConnection);
49
+ }
50
+ async function getAllCategories(iModelConnection) {
51
+ return IModelQueryClient.getAllCategories(iModelConnection);
52
+ }
53
+ const getDiff = (arr1, arr2) => {
54
+ const set1 = new Set([...arr1]);
55
+ const set2 = new Set([...arr2].filter((x) => !set1.has(x)));
56
+ return [...set2];
57
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * JSON representation of an Rgb Color, with each component in the range [0, 255]
3
+ */
4
+ export interface RgbColorProps {
5
+ red: number;
6
+ green: number;
7
+ blue: number;
8
+ }
9
+ /**
10
+ * JSON representation of a color that contains an alpha channel, with each component in the range [0, 255]
11
+ */
12
+ export interface RgbaColorProps extends RgbColorProps {
13
+ alpha?: number;
14
+ }
15
+ /**
16
+ * JSON representation of a color that contains an alpha channel and transparency, with each component in the range [0, 255]
17
+ */
18
+ export interface RgbatColorProps extends RgbaColorProps {
19
+ transparency?: number;
20
+ }
21
+ /**
22
+ * JSON representation of a color with each component in the range [0, 255]
23
+ */
24
+ export interface Rgba {
25
+ r: number;
26
+ g: number;
27
+ b: number;
28
+ a?: number;
29
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { IModelConnection, ScreenViewport, ViewState } from "@itwin/core-frontend";
2
+ import { SavedViewWithDataRepresentation } from "@itwin/saved-views-client";
3
+ /**
4
+ * Converts a saved view response to a saved view response that includes a legacy view.
5
+ * @param savedViewResponse A saved view response with or without a legacy view.
6
+ * @param iModelConnection The {@link IModelConnection} for the saved view; used to query for additional information.
7
+ * @returns A {@link SavedViewWithDataRepresentation} that contains legacy saved view data (i.e., {@link ViewDataWithLegacy.legacyView}).
8
+ */
9
+ export declare function translateSavedViewResponseToLegacySavedViewResponse(savedViewResponse: SavedViewWithDataRepresentation, iModelConnection: IModelConnection): Promise<SavedViewWithDataRepresentation>;
10
+ /**
11
+ * Converts a legacy saved view (response) to an iTwin.js ViewState.
12
+ * @param legacySavedViewResponse A saved view response that includes a legacy view (i.e., {@link ViewDataWithLegacy.legacyView}).
13
+ * @param iModelConnection The {@link IModelConnection} for the saved view; used to query for additional information.
14
+ * @returns A {@link ViewState} with the saved view applied.
15
+ */
16
+ export declare function translateLegacySavedViewToITwinJsViewState(legacySavedViewResponse: SavedViewWithDataRepresentation, iModelConnection: IModelConnection): Promise<ViewState | undefined>;
17
+ /**
18
+ * Apply extension data (overrides) onto the supplied viewport. Only works with legacy-formatted extension data.
19
+ * @param viewport The {@link ScreenViewport} used to display the saved view and iModel.
20
+ * @param legacySavedViewResponse A saved view response that includes a legacy view (i.e., {@link ViewDataWithLegacy.legacyView}).
21
+ */
22
+ export declare function applyExtensionsToViewport(viewport: ScreenViewport, legacySavedViewResponse: SavedViewWithDataRepresentation | undefined): Promise<void>;
@@ -0,0 +1,246 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { IModelReadRpcInterface } from "@itwin/core-common";
6
+ import { DrawingViewState, EmphasizeElements, SheetViewState, SpatialViewState, } from "@itwin/core-frontend";
7
+ import { isDrawingSavedView, isSheetSavedView, isSpatialSavedView } from "../../clients/ISavedViewsClient.js";
8
+ import { applyHiddenModelsAndCategories } from "./ModelsAndCategoriesHelper.js";
9
+ import { SavedViewsExtensionHandlers } from "./SavedViewsExtensionHandlers.js";
10
+ import { cleanLegacyViewModelSelectorPropsModels, savedViewITwin3dToLegacy3dSavedView, savedViewItwinDrawingToLegacyDrawingView, savedViewItwinSheetToLegacySheetSavedView, } from "./viewExtractorSavedViewToLegacySavedView.js";
11
+ var ViewTypes;
12
+ (function (ViewTypes) {
13
+ ViewTypes[ViewTypes["SheetViewDefinition"] = 0] = "SheetViewDefinition";
14
+ ViewTypes[ViewTypes["ViewDefinition3d"] = 1] = "ViewDefinition3d";
15
+ ViewTypes[ViewTypes["DrawingViewDefinition"] = 2] = "DrawingViewDefinition";
16
+ })(ViewTypes || (ViewTypes = {}));
17
+ /**
18
+ * Type-check for {@link ViewDataItwin3d}
19
+ */
20
+ function isSavedViewItwin3d(savedViewData) {
21
+ return savedViewData.itwin3dView !== undefined;
22
+ }
23
+ /**
24
+ * Type-check for {@link ViewDataITwinSheet}
25
+ */
26
+ function isSavedViewItwinSheet(savedViewData) {
27
+ return savedViewData.itwinSheetView !== undefined;
28
+ }
29
+ /**
30
+ * Type-check for {@link ViewDataITwinDrawing}
31
+ */
32
+ function isSavedViewItwinDrawing(savedViewData) {
33
+ return savedViewData.itwinDrawingView !== undefined;
34
+ }
35
+ /**
36
+ * Extract the legacy saved view data from a legacy saved view response
37
+ * @param legacySavedViewResponse
38
+ * @returns SavedViewBase legacy view data
39
+ */
40
+ function legacyViewFrom(legacySavedViewResponse) {
41
+ return legacySavedViewResponse.savedViewData.legacyView;
42
+ }
43
+ /**
44
+ * Converts a saved view response to a saved view response that includes a legacy view.
45
+ * @param savedViewResponse A saved view response with or without a legacy view.
46
+ * @param iModelConnection The {@link IModelConnection} for the saved view; used to query for additional information.
47
+ * @returns A {@link SavedViewWithDataRepresentation} that contains legacy saved view data (i.e., {@link ViewDataWithLegacy.legacyView}).
48
+ */
49
+ export async function translateSavedViewResponseToLegacySavedViewResponse(savedViewResponse, iModelConnection) {
50
+ const legacySavedView = await translateSavedViewToLegacySavedView(savedViewResponse, iModelConnection);
51
+ const legacySavedViewResponse = savedViewResponse;
52
+ legacySavedViewResponse.savedViewData.legacyView = legacySavedView;
53
+ return legacySavedViewResponse;
54
+ }
55
+ /**
56
+ * Converts a legacy saved view (response) to an iTwin.js ViewState.
57
+ * @param legacySavedViewResponse A saved view response that includes a legacy view (i.e., {@link ViewDataWithLegacy.legacyView}).
58
+ * @param iModelConnection The {@link IModelConnection} for the saved view; used to query for additional information.
59
+ * @returns A {@link ViewState} with the saved view applied.
60
+ */
61
+ export async function translateLegacySavedViewToITwinJsViewState(legacySavedViewResponse, iModelConnection) {
62
+ const legacySavedView = legacyViewFrom(legacySavedViewResponse);
63
+ const viewState = await createViewState(iModelConnection, legacySavedView);
64
+ if (viewState) {
65
+ await applyHiddenModelsAndCategories(viewState, legacySavedView, iModelConnection);
66
+ }
67
+ return viewState;
68
+ }
69
+ /**
70
+ * Apply extension data (overrides) onto the supplied viewport. Only works with legacy-formatted extension data.
71
+ * @param viewport The {@link ScreenViewport} used to display the saved view and iModel.
72
+ * @param legacySavedViewResponse A saved view response that includes a legacy view (i.e., {@link ViewDataWithLegacy.legacyView}).
73
+ */
74
+ export async function applyExtensionsToViewport(viewport, legacySavedViewResponse) {
75
+ if (!legacySavedViewResponse) {
76
+ return;
77
+ }
78
+ await applyExtensionOverrides(legacyViewFrom(legacySavedViewResponse), viewport);
79
+ }
80
+ /**
81
+ * Creates legacy saved view data from a saved view response.
82
+ * @param savedViewResponse A saved view response with or without a legacy view.
83
+ * @param iModelConnection The {@link IModelConnection} for the saved view; used to query for additional information.
84
+ * @resolves The saved views formatted as a legacy SavedViewBase.
85
+ */
86
+ async function translateSavedViewToLegacySavedView(savedViewResponse, iModelConnection) {
87
+ const savedViewData = savedViewResponse.savedViewData;
88
+ // If the legacy view already exists, use that; otherwise, use extraction code to get the legacy view
89
+ let legacySavedView;
90
+ if (savedViewData.legacyView) {
91
+ savedViewResponse = cleanLegacyViewModelSelectorPropsModels(savedViewResponse);
92
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
93
+ legacySavedView = savedViewData.legacyView;
94
+ // legacySavedView.id = savedView.id; // Change legacy sv id to comboId
95
+ }
96
+ else if (isSavedViewItwin3d(savedViewData)) {
97
+ const iModelViewData = await fetchIModelViewData(ViewTypes.ViewDefinition3d, iModelConnection);
98
+ const actual = savedViewITwin3dToLegacy3dSavedView(savedViewResponse, iModelViewData);
99
+ legacySavedView = actual;
100
+ }
101
+ else if (isSavedViewItwinDrawing(savedViewData)) {
102
+ const iModelViewData = await fetchIModelViewData(ViewTypes.DrawingViewDefinition, iModelConnection);
103
+ const actual = savedViewItwinDrawingToLegacyDrawingView(savedViewResponse, iModelViewData);
104
+ legacySavedView = actual;
105
+ }
106
+ else if (isSavedViewItwinSheet(savedViewData)) {
107
+ const iModelViewData = await fetchIModelViewData(ViewTypes.SheetViewDefinition, iModelConnection);
108
+ const actual = savedViewItwinSheetToLegacySheetSavedView(savedViewResponse, iModelViewData);
109
+ legacySavedView = actual;
110
+ }
111
+ else {
112
+ throw new Error("Could not translate itwin-saved-views API response to a SavedViewBaseSetting");
113
+ }
114
+ // Append all extensions to the saved view
115
+ legacySavedView.extensions = new Map();
116
+ for (const ext of savedViewResponse.extensions) {
117
+ if (ext.extensionName && ext.data) {
118
+ legacySavedView.extensions.set(ext.extensionName, ext.data);
119
+ }
120
+ }
121
+ return legacySavedView;
122
+ }
123
+ /**
124
+ * Grabs Seeded SavedView From IModel
125
+ * @throws if iModel Connection of App is invalid
126
+ * @returns iModelViewData
127
+ */
128
+ async function fetchIModelViewData(viewClassName, iModelConnection) {
129
+ const viewId = await getDefaultViewIdFromClassName(iModelConnection, viewClassName);
130
+ const seedViewState = await iModelConnection.views.load(viewId);
131
+ return seedViewState;
132
+ }
133
+ async function getDefaultViewIdFromClassName(iModelConnection, savedViewType) {
134
+ let viewFullName = undefined;
135
+ switch (savedViewType) {
136
+ case ViewTypes.ViewDefinition3d:
137
+ viewFullName = SpatialViewState.classFullName;
138
+ break;
139
+ case ViewTypes.DrawingViewDefinition:
140
+ viewFullName = DrawingViewState.classFullName;
141
+ break;
142
+ case ViewTypes.SheetViewDefinition:
143
+ viewFullName = SheetViewState.classFullName;
144
+ break;
145
+ default:
146
+ throw new Error("Unrecognized View Type");
147
+ }
148
+ const viewId = await iModelConnection.views.queryDefaultViewId();
149
+ const params = {};
150
+ params.from = viewFullName;
151
+ params.where = "ECInstanceId=" + viewId;
152
+ // Check validity of default view
153
+ const viewProps = await IModelReadRpcInterface.getClient().queryElementProps(iModelConnection.getRpcProps(), params);
154
+ if (viewProps.length === 0) {
155
+ // Return the first view we can find
156
+ const viewList = await iModelConnection.views.getViewList({
157
+ from: viewFullName,
158
+ wantPrivate: false,
159
+ });
160
+ if (viewList.length === 0) {
161
+ return "";
162
+ }
163
+ return viewList[0].id;
164
+ }
165
+ return viewId;
166
+ }
167
+ /**
168
+ * Creates a ViewState from a SavedView object returned by the SavedViewsClient
169
+ * @param iModelConnection IModelConnection to use for requesting source view states
170
+ * @param savedView SavedView object obtained from SavedViewsClient
171
+ */
172
+ async function createViewState(iModelConnection, savedView) {
173
+ if (isSpatialSavedView(savedView)) {
174
+ return _createSpatialViewState(iModelConnection, savedView);
175
+ }
176
+ else if (isDrawingSavedView(savedView)) {
177
+ return _createDrawingViewState(iModelConnection, savedView);
178
+ }
179
+ else if (isSheetSavedView(savedView)) {
180
+ return _createSheetViewState(iModelConnection, savedView);
181
+ }
182
+ return undefined;
183
+ }
184
+ /** Creates a spatial view state from the saved view object props */
185
+ async function _createSpatialViewState(iModelConnection, savedView) {
186
+ const props = {
187
+ viewDefinitionProps: savedView.viewDefinitionProps,
188
+ categorySelectorProps: savedView.categorySelectorProps,
189
+ modelSelectorProps: savedView.modelSelectorProps,
190
+ displayStyleProps: savedView.displayStyleProps,
191
+ };
192
+ const viewState = SpatialViewState.createFromProps(props, iModelConnection);
193
+ await viewState.load();
194
+ return viewState;
195
+ }
196
+ /** Creates a drawing view state from the data object */
197
+ async function _createDrawingViewState(iModelConnection, savedView) {
198
+ const props = {
199
+ viewDefinitionProps: savedView.viewDefinitionProps,
200
+ categorySelectorProps: savedView.categorySelectorProps,
201
+ displayStyleProps: savedView.displayStyleProps,
202
+ };
203
+ const viewState = DrawingViewState.createFromProps(props, iModelConnection);
204
+ await viewState.load();
205
+ return viewState;
206
+ }
207
+ /** Creates a sheet view state from the data object */
208
+ async function _createSheetViewState(iModelConnection, savedView) {
209
+ if (savedView.sheetProps === undefined ||
210
+ savedView.sheetAttachments === undefined) {
211
+ return undefined;
212
+ }
213
+ const props = {
214
+ viewDefinitionProps: savedView.viewDefinitionProps,
215
+ categorySelectorProps: savedView.categorySelectorProps,
216
+ displayStyleProps: savedView.displayStyleProps,
217
+ sheetProps: savedView.sheetProps,
218
+ sheetAttachments: savedView.sheetAttachments,
219
+ };
220
+ const viewState = SheetViewState.createFromProps(props, iModelConnection);
221
+ await viewState.load();
222
+ return viewState;
223
+ }
224
+ /**
225
+ * Apply overrides onto the supplied viewportbased on extension data. Only works with legacy-formatted extension data.
226
+ * @param legacySavedView A legacy saved view.
227
+ * @param viewport The {@link ScreenViewport} used to display the saved view and iModel.
228
+ */
229
+ async function applyExtensionOverrides(legacySavedView, viewport) {
230
+ // Clear the current if there's any (this should always happen, even if there are no extensions)
231
+ if (EmphasizeElements.get(viewport)) {
232
+ EmphasizeElements.clear(viewport);
233
+ viewport.isFadeOutActive = false;
234
+ }
235
+ const defaultHandlers = [
236
+ SavedViewsExtensionHandlers.EmphasizeElements,
237
+ SavedViewsExtensionHandlers.PerModelCategoryVisibility,
238
+ SavedViewsExtensionHandlers.VisibilityOverride,
239
+ ];
240
+ for (const extHandler of defaultHandlers) {
241
+ const extData = legacySavedView.extensions?.get(extHandler.extensionName);
242
+ if (extData) {
243
+ await extHandler.onViewApply(extData, viewport);
244
+ }
245
+ }
246
+ }
@@ -0,0 +1,13 @@
1
+ import { type Viewport } from "@itwin/core-frontend";
2
+ export interface ExtensionHandler {
3
+ extensionName: string;
4
+ onViewApply: (extensionData: string, vp: Viewport) => Promise<void>;
5
+ }
6
+ /**
7
+ * Collection of default extension handlers
8
+ */
9
+ export declare class SavedViewsExtensionHandlers {
10
+ static EmphasizeElements: ExtensionHandler;
11
+ static PerModelCategoryVisibility: ExtensionHandler;
12
+ static VisibilityOverride: ExtensionHandler;
13
+ }
@@ -0,0 +1,42 @@
1
+ import { EmphasizeElements, PerModelCategoryVisibility } from "@itwin/core-frontend";
2
+ import { ModelCategoryOverrideProvider } from "../../../ui/viewlist/ModelCategoryOverrideProvider.js";
3
+ import { extractEmphasizeElements, extractPerModelCategoryVisibility, extractVisibilityOverride, } from "./extensionExtractor.js";
4
+ /**
5
+ * Collection of default extension handlers
6
+ */
7
+ export class SavedViewsExtensionHandlers {
8
+ static EmphasizeElements = {
9
+ extensionName: "EmphasizeElements",
10
+ onViewApply: async (extensionData, vp) => {
11
+ if (extensionData) {
12
+ const props = extractEmphasizeElements(extensionData);
13
+ if (props !== undefined) {
14
+ EmphasizeElements.getOrCreate(vp).fromJSON(props, vp);
15
+ }
16
+ }
17
+ },
18
+ };
19
+ static PerModelCategoryVisibility = {
20
+ extensionName: "PerModelCategoryVisibility",
21
+ onViewApply: async (extensionData, vp) => {
22
+ const props = extractPerModelCategoryVisibility(extensionData) ?? [];
23
+ vp.perModelCategoryVisibility.clearOverrides();
24
+ for (const override of props) {
25
+ vp.perModelCategoryVisibility.setOverride(override.modelId, override.categoryId, override.visible
26
+ ? PerModelCategoryVisibility.Override.Show
27
+ : PerModelCategoryVisibility.Override.Hide);
28
+ }
29
+ },
30
+ };
31
+ static VisibilityOverride = {
32
+ extensionName: "VisibilityOverride",
33
+ onViewApply: async (extensionData, vp) => {
34
+ if (extensionData) {
35
+ const props = extractVisibilityOverride(extensionData);
36
+ if (props !== undefined) {
37
+ ModelCategoryOverrideProvider.getOrCreate(vp).fromJSON(props);
38
+ }
39
+ }
40
+ },
41
+ };
42
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Extracts the clip vectors from a legacy view
3
+ * @param input
4
+ */
5
+ export declare const extractClipVectors: (input: object) => any;
@@ -0,0 +1,56 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { applyExtraction, extractArray2d, extractArrayConditionally, extractBoolean, extractNumber, extractObject, extractSimpleArray, simpleTypeOf, } from "./extractionUtilities.js";
6
+ const isPoint = (val) => Array.isArray(val) &&
7
+ val.length === 3 &&
8
+ val.every((num) => typeof num === "number");
9
+ const isTransformRow = (value) => Array.isArray(value) &&
10
+ value.length === 4 &&
11
+ value.every((num) => typeof num === "number");
12
+ const clipPrimitiveShapeMappings = [
13
+ extractObject([
14
+ extractSimpleArray(isPoint, "points"),
15
+ extractSimpleArray(isTransformRow, "transform", "trans"),
16
+ extractNumber("zLow", "zlow"),
17
+ extractNumber("zHigh", "zhigh"),
18
+ extractBoolean("mask"),
19
+ extractBoolean("invisible"),
20
+ ], "shape"),
21
+ ];
22
+ const clipPlaneMappings = [
23
+ extractSimpleArray(simpleTypeOf("number"), "normal"),
24
+ extractNumber("dist", "distance"),
25
+ extractBoolean("invisible"),
26
+ extractBoolean("interior"),
27
+ ];
28
+ const clipPrimitivePlaneMappings = [
29
+ extractObject([extractArray2d(clipPlaneMappings, "clips"), extractBoolean("invisible")], "planes"),
30
+ ];
31
+ const clipVectorMappings = [
32
+ extractArrayConditionally([
33
+ {
34
+ discriminator: "planes",
35
+ mappings: [...clipPrimitivePlaneMappings],
36
+ },
37
+ {
38
+ discriminator: "shape",
39
+ mappings: [...clipPrimitiveShapeMappings],
40
+ },
41
+ ], "clip", "clipVectors"),
42
+ ];
43
+ /**
44
+ * Extracts the clip vectors from a legacy view
45
+ * @param input
46
+ */
47
+ export const extractClipVectors = (input) => {
48
+ const viewDetails = input;
49
+ if (!("clipVectors" in input)) {
50
+ return undefined;
51
+ }
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ const output = {};
54
+ applyExtraction(viewDetails, output, clipVectorMappings);
55
+ return output.clipVectors;
56
+ };
@@ -0,0 +1,17 @@
1
+ import type { ViewState } from "@itwin/core-frontend";
2
+ import { type ExtractionFunc } from "./extractionUtilities.js";
3
+ export declare const featureAppearanceMappings: ExtractionFunc<void, void>[];
4
+ export declare const featureAppearanceLegacyMappings: ExtractionFunc<void, void>[];
5
+ /**
6
+ * Extracts the display style from a legacy view displayStyle field
7
+ * And transforms it into our schema
8
+ * @param data
9
+ * @param viewState
10
+ */
11
+ export declare const extractDisplayStyle: (data: object, viewState?: ViewState) => any;
12
+ /**
13
+ * Extracts the display style 3d from a legacy view displayStyle field
14
+ * And transforms it into our schema
15
+ * @param data
16
+ */
17
+ export declare const extractDisplayStyle3d: (data: object) => any;