@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,298 @@
1
+ import { SheetViewState } from "@itwin/core-frontend";
2
+ import { extractClipVectors } from "./clipVectorsExtractor.js";
3
+ import { extractDisplayStyle, extractDisplayStyle3d } from "./displayStyleExtractor.js";
4
+ import { convertAllLegacyUrlsToUrls, urlToLegacyUrl } from "./urlConverter.js";
5
+ const UNGROUPED_ID = "-1";
6
+ /**
7
+ * Extracts id from href
8
+ * @param href
9
+ */
10
+ export const extractIdFromHref = (href) => {
11
+ return href.split("/").pop();
12
+ };
13
+ /**
14
+ * Extract all the tags
15
+ * @param creator href for the creator
16
+ * @param tags the list of tags in the saved view
17
+ * @returns
18
+ */
19
+ const extractTags = (creator, tags) => {
20
+ return tags?.map((tag) => {
21
+ const legacyTag = {
22
+ name: tag.displayName,
23
+ createdByUserId: extractIdFromHref(creator) ?? "",
24
+ };
25
+ return legacyTag;
26
+ });
27
+ };
28
+ /**
29
+ * Transform a ViewDataITwinDrawing into a legacy SavedView if possible
30
+ * @param savedViewRsp
31
+ * @param iModelViewData
32
+ * @returns SavedView2d
33
+ */
34
+ export function savedViewItwinDrawingToLegacyDrawingView(savedViewRsp, seedDrawingViewState) {
35
+ convertAllLegacyUrlsToUrls(savedViewRsp.savedViewData, urlToLegacyUrl);
36
+ const iTwinDrawingView = savedViewRsp.savedViewData.itwinDrawingView;
37
+ seedDrawingViewState.displayStyle;
38
+ const legacyView = {
39
+ id: savedViewRsp.id,
40
+ is2d: true,
41
+ groupId: savedViewRsp._links.group
42
+ ? extractIdFromHref(savedViewRsp._links.group.href)
43
+ : UNGROUPED_ID ?? "",
44
+ tags: extractTags(savedViewRsp._links.creator?.href ?? "", savedViewRsp.tags),
45
+ name: savedViewRsp.displayName,
46
+ userId: extractIdFromHref(savedViewRsp._links.creator?.href ?? "") ?? "",
47
+ shared: savedViewRsp.shared,
48
+ thumbnailId: savedViewRsp.id ?? "",
49
+ categorySelectorProps: {
50
+ classFullName: seedDrawingViewState.categorySelector.classFullName,
51
+ categories: (iTwinDrawingView.categories?.enabled ?? []),
52
+ code: {
53
+ scope: seedDrawingViewState.categorySelector.code.scope,
54
+ spec: seedDrawingViewState.categorySelector.code.spec,
55
+ value: seedDrawingViewState.categorySelector.code.value,
56
+ },
57
+ model: seedDrawingViewState.categorySelector.model,
58
+ federationGuid: seedDrawingViewState.categorySelector.federationGuid ?? "",
59
+ id: seedDrawingViewState.categorySelector.id,
60
+ },
61
+ viewDefinitionProps: {
62
+ classFullName: seedDrawingViewState.classFullName,
63
+ id: seedDrawingViewState.id,
64
+ jsonProperties: {
65
+ viewDetails: {
66
+ gridOrient: seedDrawingViewState.getGridOrientation() ?? undefined,
67
+ },
68
+ },
69
+ code: {
70
+ scope: seedDrawingViewState.code.scope,
71
+ spec: seedDrawingViewState.code.spec,
72
+ value: seedDrawingViewState.code.value,
73
+ },
74
+ model: seedDrawingViewState.model,
75
+ federationGuid: seedDrawingViewState.federationGuid ?? "",
76
+ categorySelectorId: seedDrawingViewState.categorySelector.id,
77
+ displayStyleId: seedDrawingViewState.displayStyle.id,
78
+ isPrivate: seedDrawingViewState.isPrivate ?? false,
79
+ description: seedDrawingViewState.description ?? "",
80
+ origin: iTwinDrawingView.origin,
81
+ delta: iTwinDrawingView.delta,
82
+ angle: iTwinDrawingView.angle,
83
+ baseModelId: iTwinDrawingView.baseModelId,
84
+ },
85
+ displayStyleProps: {
86
+ classFullName: seedDrawingViewState.displayStyle.classFullName,
87
+ id: seedDrawingViewState.displayStyle.id,
88
+ jsonProperties: {
89
+ styles: extractDisplayStyle(iTwinDrawingView, seedDrawingViewState),
90
+ },
91
+ code: {
92
+ spec: seedDrawingViewState.displayStyle.code.spec,
93
+ scope: seedDrawingViewState.displayStyle.code.scope,
94
+ value: seedDrawingViewState.displayStyle.code.value,
95
+ },
96
+ model: seedDrawingViewState.displayStyle.model,
97
+ federationGuid: seedDrawingViewState.displayStyle.federationGuid ?? "",
98
+ },
99
+ };
100
+ appendHiddenCategoriesToLegacyView(iTwinDrawingView, legacyView);
101
+ return legacyView;
102
+ }
103
+ /**
104
+ * Transform a ViewDataITwinSheet into a legacy SavedView if possible
105
+ * @param savedViewRsp
106
+ * @param seedSheetViewState
107
+ * @returns SavedView2d
108
+ */
109
+ export function savedViewItwinSheetToLegacySheetSavedView(savedViewRsp, seedSheetViewState) {
110
+ convertAllLegacyUrlsToUrls(savedViewRsp.savedViewData, urlToLegacyUrl);
111
+ const itwinSheetView = savedViewRsp.savedViewData.itwinSheetView;
112
+ const legacyView = {
113
+ id: savedViewRsp.id,
114
+ is2d: true,
115
+ groupId: savedViewRsp._links.group
116
+ ? extractIdFromHref(savedViewRsp._links.group.href)
117
+ : UNGROUPED_ID,
118
+ tags: extractTags(savedViewRsp._links.creator?.href ?? "", savedViewRsp.tags),
119
+ name: savedViewRsp.displayName,
120
+ userId: extractIdFromHref(savedViewRsp._links.creator?.href ?? "") ?? "",
121
+ shared: savedViewRsp.shared,
122
+ thumbnailId: savedViewRsp.id ?? "",
123
+ categorySelectorProps: {
124
+ classFullName: seedSheetViewState.categorySelector.classFullName,
125
+ categories: (itwinSheetView.categories?.enabled ?? []),
126
+ code: {
127
+ scope: seedSheetViewState.categorySelector.code.scope,
128
+ spec: seedSheetViewState.categorySelector.code.spec,
129
+ value: seedSheetViewState.categorySelector.code.value,
130
+ },
131
+ model: seedSheetViewState.categorySelector.model,
132
+ federationGuid: seedSheetViewState.categorySelector.federationGuid,
133
+ id: seedSheetViewState.categorySelector.id,
134
+ },
135
+ viewDefinitionProps: {
136
+ classFullName: seedSheetViewState.classFullName,
137
+ id: seedSheetViewState.id,
138
+ jsonProperties: {
139
+ viewDetails: {
140
+ gridOrient: seedSheetViewState.getGridOrientation() ?? undefined,
141
+ },
142
+ },
143
+ code: {
144
+ scope: seedSheetViewState.code.scope,
145
+ spec: seedSheetViewState.code.spec,
146
+ value: seedSheetViewState.code.value,
147
+ },
148
+ model: seedSheetViewState.model,
149
+ federationGuid: seedSheetViewState.federationGuid ?? "",
150
+ categorySelectorId: seedSheetViewState.categorySelector.id,
151
+ displayStyleId: seedSheetViewState.displayStyle.id,
152
+ isPrivate: seedSheetViewState.isPrivate ?? false,
153
+ description: seedSheetViewState.description ?? "",
154
+ origin: itwinSheetView.origin,
155
+ delta: itwinSheetView.delta,
156
+ angle: itwinSheetView.angle,
157
+ baseModelId: itwinSheetView.baseModelId,
158
+ },
159
+ displayStyleProps: {
160
+ classFullName: seedSheetViewState.displayStyle.classFullName,
161
+ id: seedSheetViewState.displayStyle.id,
162
+ jsonProperties: {
163
+ styles: extractDisplayStyle(itwinSheetView, seedSheetViewState),
164
+ },
165
+ code: {
166
+ spec: seedSheetViewState.displayStyle.code.spec,
167
+ scope: seedSheetViewState.displayStyle.code.scope,
168
+ value: seedSheetViewState.displayStyle.code.value,
169
+ },
170
+ model: seedSheetViewState.displayStyle.model,
171
+ federationGuid: seedSheetViewState.displayStyle.federationGuid ?? "",
172
+ },
173
+ sheetProps: {
174
+ width: itwinSheetView.width ?? -1,
175
+ height: itwinSheetView.height ?? -1,
176
+ model: seedSheetViewState.displayStyle.model,
177
+ classFullName: SheetViewState.classFullName,
178
+ code: {
179
+ spec: seedSheetViewState.displayStyle.code.spec,
180
+ scope: seedSheetViewState.displayStyle.code.scope,
181
+ value: "",
182
+ },
183
+ },
184
+ sheetAttachments: itwinSheetView.sheetAttachments ?? [],
185
+ };
186
+ appendHiddenCategoriesToLegacyView(itwinSheetView, legacyView);
187
+ return legacyView;
188
+ }
189
+ /**
190
+ * Transform a ViewDataItwin3d into a legacy SavedView if possible
191
+ * @param savedViewRsp
192
+ * @param seedSpatialViewState
193
+ * @returns SavedView
194
+ */
195
+ export function savedViewITwin3dToLegacy3dSavedView(savedViewRsp, seedSpatialViewState) {
196
+ convertAllLegacyUrlsToUrls(savedViewRsp.savedViewData, urlToLegacyUrl);
197
+ const modelSelector = seedSpatialViewState.modelSelector;
198
+ const itwin3dView = savedViewRsp.savedViewData.itwin3dView;
199
+ const legacyView = {
200
+ id: savedViewRsp.id,
201
+ is2d: false,
202
+ groupId: savedViewRsp._links.group
203
+ ? extractIdFromHref(savedViewRsp._links.group.href)
204
+ : UNGROUPED_ID,
205
+ tags: extractTags(savedViewRsp._links.creator?.href ?? "", savedViewRsp.tags),
206
+ name: savedViewRsp.displayName,
207
+ userId: extractIdFromHref(savedViewRsp._links.creator?.href ?? "") ?? "",
208
+ shared: savedViewRsp.shared,
209
+ thumbnailId: savedViewRsp.id ?? "",
210
+ viewDefinitionProps: {
211
+ origin: itwin3dView.origin,
212
+ extents: itwin3dView.extents,
213
+ angles: itwin3dView.angles ?? {},
214
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
215
+ camera: itwin3dView.camera,
216
+ jsonProperties: {
217
+ viewDetails: extractClipVectors(itwin3dView) ?? {},
218
+ },
219
+ classFullName: seedSpatialViewState.classFullName,
220
+ code: seedSpatialViewState.code,
221
+ model: seedSpatialViewState.model,
222
+ categorySelectorId: seedSpatialViewState.categorySelector.id,
223
+ displayStyleId: seedSpatialViewState.displayStyle.id,
224
+ cameraOn: itwin3dView.camera !== undefined,
225
+ modelSelectorId: seedSpatialViewState.modelSelector.id,
226
+ },
227
+ modelSelectorProps: {
228
+ classFullName: modelSelector.classFullName,
229
+ code: {
230
+ spec: modelSelector.code.spec,
231
+ scope: modelSelector.code.scope,
232
+ value: modelSelector.code.value,
233
+ },
234
+ model: modelSelector.model,
235
+ models: (itwin3dView.models?.enabled ?? []),
236
+ },
237
+ categorySelectorProps: {
238
+ classFullName: seedSpatialViewState.categorySelector.classFullName,
239
+ categories: (itwin3dView.categories?.enabled ?? []),
240
+ code: {
241
+ scope: seedSpatialViewState.categorySelector.code.scope,
242
+ spec: seedSpatialViewState.categorySelector.code.spec,
243
+ value: seedSpatialViewState.categorySelector.code.value,
244
+ },
245
+ model: seedSpatialViewState.categorySelector.model,
246
+ },
247
+ displayStyleProps: {
248
+ id: seedSpatialViewState.displayStyle.id,
249
+ classFullName: seedSpatialViewState.displayStyle.classFullName,
250
+ code: seedSpatialViewState.displayStyle.code,
251
+ model: seedSpatialViewState.displayStyle.model,
252
+ jsonProperties: {
253
+ styles: extractDisplayStyle3d(savedViewRsp.savedViewData.itwin3dView),
254
+ },
255
+ },
256
+ };
257
+ appendHiddenCategoriesToLegacyView(itwin3dView, legacyView);
258
+ appendHiddenModelsTo3dLegacySavedView(itwin3dView, legacyView);
259
+ return legacyView;
260
+ }
261
+ /**
262
+ * append Hidden Categories Or Models To Legacy Saved View
263
+ * @param iTwinView new schema
264
+ * @param legacyView
265
+ * @returns iModelViewData
266
+ */
267
+ function appendHiddenCategoriesToLegacyView(iTwinView, legacyView) {
268
+ if (iTwinView.categories && iTwinView.categories.disabled) {
269
+ legacyView.hiddenCategories = iTwinView.categories.disabled;
270
+ }
271
+ }
272
+ /**
273
+ * append Hidden Categories Or Models To Legacy Saved View
274
+ * @param view new schema
275
+ * @param legacyView
276
+ * @returns iModelViewData
277
+ */
278
+ function appendHiddenModelsTo3dLegacySavedView(view, legacyView) {
279
+ if (view.models && view.models.disabled) {
280
+ legacyView.hiddenModels = view.models?.disabled;
281
+ }
282
+ }
283
+ /**
284
+ * removes null and undefined from legacy view model selectors props models
285
+ * @param savedView
286
+ * @returns SavedViewWithData
287
+ */
288
+ export const cleanLegacyViewModelSelectorPropsModels = (savedView) => {
289
+ if (savedView.savedViewData.legacyView?.modelSelectorProps) {
290
+ const savedViewCopy = structuredClone(savedView);
291
+ const legacyView = savedViewCopy.savedViewData.legacyView;
292
+ legacyView.modelSelectorProps.models =
293
+ legacyView.modelSelectorProps.models.filter((model) => !!model);
294
+ savedViewCopy.savedViewData.legacyView = legacyView;
295
+ return savedViewCopy;
296
+ }
297
+ return savedView;
298
+ };
@@ -0,0 +1,4 @@
1
+ export { createSavedViewOptions, type CreateSavedViewOptionsParams } from "./SavedViewTile/SavedViewOptions.js";
2
+ export { SavedViewsExpandableBlockWidget } from "./SavedViewsWidget/SavedViewsExpandableBlockWidget.js";
3
+ export { SavedViewsFolderWidget } from "./SavedViewsWidget/SavedViewsFolderWidget.js";
4
+ export { applyExtensionsToViewport, translateLegacySavedViewToITwinJsViewState, translateSavedViewResponseToLegacySavedViewResponse, } from "./api/utilities/translation/SavedViewTranslation.js";
@@ -0,0 +1,8 @@
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
+ export { createSavedViewOptions } from "./SavedViewTile/SavedViewOptions.js";
6
+ export { SavedViewsExpandableBlockWidget } from "./SavedViewsWidget/SavedViewsExpandableBlockWidget.js";
7
+ export { SavedViewsFolderWidget } from "./SavedViewsWidget/SavedViewsFolderWidget.js";
8
+ export { applyExtensionsToViewport, translateLegacySavedViewToITwinJsViewState, translateSavedViewResponseToLegacySavedViewResponse, } from "./api/utilities/translation/SavedViewTranslation.js";
package/lib/index.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export { LayeredDropdownMenu, LayeredMenuItem } from "./LayeredDropdownMenu/LayeredDropdownMenu.js";
2
+ export type { SavedView, SavedViewGroup, SavedViewTag } from "./SavedView.js";
3
+ export { SavedViewOptions } from "./SavedViewTile/SavedViewOptions.js";
4
+ export { SavedViewTile } from "./SavedViewTile/SavedViewTile.js";
5
+ export { useSavedViewTileContext, type SavedViewTileContext } from "./SavedViewTile/SavedViewTileContext.js";
6
+ export { ITwinSavedViewsClient } from "./SavedViewsClient/ITwinSavedViewsClient.js";
7
+ export type { SavedViewInfo, SavedViewsClient } from "./SavedViewsClient/SavedViewsClient.js";
8
+ export { SavedViewsContextProvider, type SavedViewsContext } from "./SavedViewsContext.js";
9
+ export { StickyExpandableBlock } from "./StickyExpandableBlock/StickyExpandableBlock.js";
10
+ export { TileGrid } from "./TileGrid/TileGrid.js";
11
+ export { defaultLocalization, type LocalizationStrings } from "./localization.js";
12
+ export { useSavedViews, type SavedViewActions } from "./useSavedViews.js";
package/lib/index.js ADDED
@@ -0,0 +1,14 @@
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
+ export { LayeredDropdownMenu, LayeredMenuItem } from "./LayeredDropdownMenu/LayeredDropdownMenu.js";
6
+ export { SavedViewOptions } from "./SavedViewTile/SavedViewOptions.js";
7
+ export { SavedViewTile } from "./SavedViewTile/SavedViewTile.js";
8
+ export { useSavedViewTileContext } from "./SavedViewTile/SavedViewTileContext.js";
9
+ export { ITwinSavedViewsClient } from "./SavedViewsClient/ITwinSavedViewsClient.js";
10
+ export { SavedViewsContextProvider } from "./SavedViewsContext.js";
11
+ export { StickyExpandableBlock } from "./StickyExpandableBlock/StickyExpandableBlock.js";
12
+ export { TileGrid } from "./TileGrid/TileGrid.js";
13
+ export { defaultLocalization } from "./localization.js";
14
+ export { useSavedViews } from "./useSavedViews.js";
@@ -0,0 +1,52 @@
1
+ export type LocalizationStrings = Customizable<typeof defaultLocalization>;
2
+ type Customizable<T> = {
3
+ -readonly [K in keyof T]?: T[K] extends string ? string | undefined : Customizable<T[K]> | undefined;
4
+ };
5
+ export declare const defaultLocalization: {
6
+ /** @default "Delete" */
7
+ readonly delete: "Delete";
8
+ /** @default "Rename" */
9
+ readonly rename: "Rename";
10
+ /** Strings used within `<SavedViewOptions.MoveToGroup />` component. */
11
+ readonly moveToGroupMenu: {
12
+ /** @default "Create group" */
13
+ readonly createGroup: "Create group:";
14
+ /** @default "(current)" */
15
+ readonly current: "(current)";
16
+ /** @default "Find a group" */
17
+ readonly findGroup: "Find a group";
18
+ /** @default "Find or create a new group" */
19
+ readonly findOrCreateGroup: "Find or create a new group";
20
+ /** @default "Move to group" */
21
+ readonly moveToGroup: "Move to group";
22
+ };
23
+ /** Strings used within `SavedViewOptions` components. */
24
+ readonly searchableMenu: {
25
+ /** @default "No search results" */
26
+ readonly noSearchResults: "No search results";
27
+ };
28
+ /** Strings used within `<SavedViewOptions.ManageTags />` component. */
29
+ readonly tagsMenu: {
30
+ /** @default "Create tag:" */
31
+ readonly createTag: "Create tag:";
32
+ /** @default "Find or create a new tag" */
33
+ readonly findOrCreateTag: "Find or create a new tag";
34
+ /** @default "Find a tag" */
35
+ readonly findTag: "Find a tag";
36
+ /** @default "Tags" */
37
+ readonly tags: "Tags";
38
+ };
39
+ /** Strings used within `<SavedViewTile />` component. */
40
+ readonly tile: {
41
+ /** @default "more" */
42
+ readonly moreTags: "more";
43
+ };
44
+ /** Strings used within `<TileGrid />` component. */
45
+ readonly tileGrid: {
46
+ /** @default "more available" */
47
+ readonly moreAvailable: "more available";
48
+ /** @default "Show more" */
49
+ readonly showMore: "Show more";
50
+ };
51
+ };
52
+ export {};
@@ -0,0 +1,51 @@
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
+ export const defaultLocalization = {
6
+ /** @default "Delete" */
7
+ delete: "Delete",
8
+ /** @default "Rename" */
9
+ rename: "Rename",
10
+ /** Strings used within `<SavedViewOptions.MoveToGroup />` component. */
11
+ moveToGroupMenu: {
12
+ /** @default "Create group" */
13
+ createGroup: "Create group:",
14
+ /** @default "(current)" */
15
+ current: "(current)",
16
+ /** @default "Find a group" */
17
+ findGroup: "Find a group",
18
+ /** @default "Find or create a new group" */
19
+ findOrCreateGroup: "Find or create a new group",
20
+ /** @default "Move to group" */
21
+ moveToGroup: "Move to group",
22
+ },
23
+ /** Strings used within `SavedViewOptions` components. */
24
+ searchableMenu: {
25
+ /** @default "No search results" */
26
+ noSearchResults: "No search results",
27
+ },
28
+ /** Strings used within `<SavedViewOptions.ManageTags />` component. */
29
+ tagsMenu: {
30
+ /** @default "Create tag:" */
31
+ createTag: "Create tag:",
32
+ /** @default "Find or create a new tag" */
33
+ findOrCreateTag: "Find or create a new tag",
34
+ /** @default "Find a tag" */
35
+ findTag: "Find a tag",
36
+ /** @default "Tags" */
37
+ tags: "Tags",
38
+ },
39
+ /** Strings used within `<SavedViewTile />` component. */
40
+ tile: {
41
+ /** @default "more" */
42
+ moreTags: "more",
43
+ },
44
+ /** Strings used within `<TileGrid />` component. */
45
+ tileGrid: {
46
+ /** @default "more available" */
47
+ moreAvailable: "more available",
48
+ /** @default "Show more" */
49
+ showMore: "Show more",
50
+ },
51
+ };
@@ -0,0 +1,31 @@
1
+ import { type FeatureAppearanceProps } from "@itwin/core-common";
2
+ import type { FeatureOverrideProvider, FeatureSymbology, Viewport } from "@itwin/core-frontend";
3
+ interface AppearanceOverrideProps {
4
+ ids: string[];
5
+ app: FeatureAppearanceProps;
6
+ }
7
+ /** Overrides given categories to provide emphasize functionality
8
+ * @public
9
+ */
10
+ export interface ModelCategoryOverrideProviderProps {
11
+ subCategoryOverrides?: AppearanceOverrideProps[];
12
+ modelOverrides?: AppearanceOverrideProps[];
13
+ catEmphasizeOverride?: AppearanceOverrideProps;
14
+ modelEmphasizeOverride?: AppearanceOverrideProps;
15
+ }
16
+ /** Model & Category override provider (override plus emphasize)
17
+ * @public
18
+ */
19
+ export declare class ModelCategoryOverrideProvider implements FeatureOverrideProvider {
20
+ private readonly _subCategoryOverrides;
21
+ private readonly _modelOverrides;
22
+ private readonly _emphasizedSubcats;
23
+ private readonly _emphasizedModels;
24
+ private _catDefaultAppearance?;
25
+ private _modelDefaultAppearance?;
26
+ static get(vp: Viewport): ModelCategoryOverrideProvider | undefined;
27
+ static getOrCreate(vp: Viewport): ModelCategoryOverrideProvider;
28
+ addFeatureOverrides(overrides: FeatureSymbology.Overrides, _vp: Viewport): void;
29
+ fromJSON(props: ModelCategoryOverrideProviderProps): boolean;
30
+ }
31
+ export {};
@@ -0,0 +1,88 @@
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 { FeatureAppearance } from "@itwin/core-common";
6
+ /** Model & Category override provider (override plus emphasize)
7
+ * @public
8
+ */
9
+ export class ModelCategoryOverrideProvider {
10
+ _subCategoryOverrides = new Map();
11
+ _modelOverrides = new Map();
12
+ _emphasizedSubcats = [];
13
+ _emphasizedModels = [];
14
+ _catDefaultAppearance;
15
+ _modelDefaultAppearance;
16
+ static get(vp) {
17
+ return vp.findFeatureOverrideProviderOfType(ModelCategoryOverrideProvider);
18
+ }
19
+ static getOrCreate(vp) {
20
+ let provider = this.get(vp);
21
+ if (!provider) {
22
+ provider = new ModelCategoryOverrideProvider();
23
+ vp.addFeatureOverrideProvider(provider);
24
+ }
25
+ return provider;
26
+ }
27
+ addFeatureOverrides(overrides, _vp) {
28
+ this._subCategoryOverrides.forEach((appearance, ids, _map) => {
29
+ ids.forEach((id) => {
30
+ overrides.override({ subCategoryId: id, appearance });
31
+ });
32
+ });
33
+ this._modelOverrides.forEach((appearance, ids, _map) => {
34
+ ids.forEach((id) => {
35
+ overrides.override({ modelId: id, appearance });
36
+ });
37
+ });
38
+ if (0 !== this._emphasizedSubcats.length) {
39
+ if (this._catDefaultAppearance) {
40
+ overrides.setDefaultOverrides(this._catDefaultAppearance, true);
41
+ }
42
+ // Override with nothing so that we keep the category looking normal and override the default appearance of everything else
43
+ const override = FeatureAppearance.fromJSON({});
44
+ this._emphasizedSubcats.forEach((id) => {
45
+ overrides.override({
46
+ subCategoryId: id,
47
+ appearance: override,
48
+ onConflict: "replace",
49
+ });
50
+ });
51
+ }
52
+ if (0 !== this._emphasizedModels.length) {
53
+ if (this._modelDefaultAppearance) {
54
+ overrides.setDefaultOverrides(this._modelDefaultAppearance, true);
55
+ }
56
+ // Override with nothing so that we keep the category looking normal and override the default appearance of everything else
57
+ const override = FeatureAppearance.fromJSON({});
58
+ this._emphasizedModels.forEach((id) => {
59
+ overrides.override({
60
+ modelId: id,
61
+ appearance: override,
62
+ onConflict: "replace",
63
+ });
64
+ });
65
+ }
66
+ }
67
+ fromJSON(props) {
68
+ if (props.subCategoryOverrides) {
69
+ props.subCategoryOverrides.forEach((appProps) => {
70
+ this._subCategoryOverrides.set(appProps.ids, FeatureAppearance.fromJSON(appProps.app));
71
+ });
72
+ }
73
+ if (props.modelOverrides) {
74
+ props.modelOverrides.forEach((appProps) => {
75
+ this._modelOverrides.set(appProps.ids, FeatureAppearance.fromJSON(appProps.app));
76
+ });
77
+ }
78
+ if (props.catEmphasizeOverride) {
79
+ this._emphasizedSubcats.push(...props.catEmphasizeOverride.ids);
80
+ this._catDefaultAppearance = FeatureAppearance.fromJSON(props.catEmphasizeOverride.app);
81
+ }
82
+ if (props.modelEmphasizeOverride) {
83
+ this._emphasizedModels.push(...props.modelEmphasizeOverride.ids);
84
+ this._modelDefaultAppearance = FeatureAppearance.fromJSON(props.modelEmphasizeOverride.app);
85
+ }
86
+ return true;
87
+ }
88
+ }
@@ -0,0 +1,52 @@
1
+ import type { ViewData } from "@itwin/saved-views-client";
2
+ import type { SavedView, SavedViewGroup, SavedViewTag } from "./SavedView.js";
3
+ import type { SavedViewsClient } from "./SavedViewsClient/SavedViewsClient.js";
4
+ interface UseSavedViewsParams {
5
+ /** iTwin identifier. */
6
+ iTwinId: string;
7
+ /** iModel identifier. */
8
+ iModelId: string;
9
+ /** Implements communication with Saved Views store. */
10
+ client: SavedViewsClient;
11
+ /**
12
+ * Invoked when any of {@linkcode SavedViewActions} is triggered. Does not get called again until either
13
+ * {@linkcode onUpdateComplete} or {@linkcode onUpdateError} is invoked.
14
+ */
15
+ onUpdateInProgress?: (() => void) | undefined;
16
+ /** Invoked once after {@linkcode onUpdateInProgress} when the data is successfully synchronised with the store. */
17
+ onUpdateComplete?: (() => void) | undefined;
18
+ /** Invoked once after {@linkcode onUpdateInProgress} when data synchronisation with the store fails. */
19
+ onUpdateError?: ((error: unknown) => void) | undefined;
20
+ }
21
+ interface UseSavedViewsResult {
22
+ savedViews: Map<string, SavedView>;
23
+ groups: Map<string, SavedViewGroup>;
24
+ tags: Map<string, SavedViewTag>;
25
+ actions: SavedViewActions;
26
+ }
27
+ export interface SavedViewActions {
28
+ createSavedView: (savedViewName: string, savedViewData: ViewData) => void;
29
+ renameSavedView: (savedViewId: string, newName: string) => void;
30
+ shareSavedView: (savedViewId: string, share: boolean) => void;
31
+ deleteSavedView: (savedViewId: string) => void;
32
+ createGroup: (groupName: string) => void;
33
+ renameGroup: (groupId: string, newName: string) => void;
34
+ shareGroup: (groupId: string, share: boolean) => void;
35
+ moveToGroup: (savedViewId: string, groupId: string) => void;
36
+ moveToNewGroup: (savedViewId: string, groupName: string) => void;
37
+ deleteGroup: (groupId: string) => void;
38
+ addTag: (savedViewId: string, tagId: string) => void;
39
+ addNewTag: (savedViewId: string, tagName: string) => void;
40
+ removeTag: (savedViewId: string, tagId: string) => void;
41
+ }
42
+ /**
43
+ * Pulls Saved View data from a store and provides means to update and synchronize the data back to it. Interaction with
44
+ * the store is performed via {@linkcode SavedViewsClient} interface which could communicate, for instance, with
45
+ * [iTwin Saved Views API](https://developer.bentley.com/apis/savedviews/overview/) using `ITwinSavedViewsClient`.
46
+ *
47
+ * Note on the current implementation limitations. While the result of the first update action is reflected immediately,
48
+ * subsequent actions are put in a queue and executed serially. This may cause the UI to feel sluggish when user makes
49
+ * changes to Saved Views faster than the Saved Views store can be updated.
50
+ */
51
+ export declare function useSavedViews(args: UseSavedViewsParams): UseSavedViewsResult | undefined;
52
+ export {};