@itwin/saved-views-react 0.1.0 → 0.2.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 (28) hide show
  1. package/lib/LayeredDropdownMenu/LayeredDropdownMenu.css +9 -5
  2. package/lib/SavedViewTile/SavedViewOptions.css +19 -16
  3. package/lib/SavedViewTile/SavedViewTile.css +72 -69
  4. package/lib/SavedViewsClient/ITwinSavedViewsClient.d.ts +4 -3
  5. package/lib/SavedViewsClient/ITwinSavedViewsClient.js +7 -0
  6. package/lib/SavedViewsClient/SavedViewsClient.d.ts +8 -2
  7. package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTile.js +1 -1
  8. package/lib/SavedViewsWidget/SavedViewsExpandableBlockWidget.css +2 -22
  9. package/lib/SavedViewsWidget/SavedViewsFolderWidget.js +1 -1
  10. package/lib/StickyExpandableBlock/StickyExpandableBlock.css +14 -11
  11. package/lib/TileGrid/TileGrid.css +2 -1
  12. package/lib/api/utilities/translation/SavedViewTranslation.d.ts +7 -7
  13. package/lib/api/utilities/translation/SavedViewTranslation.js +7 -24
  14. package/lib/api/utilities/translation/clipVectorsLegacyExtractor.d.ts +3 -0
  15. package/lib/api/utilities/translation/clipVectorsLegacyExtractor.js +41 -0
  16. package/lib/api/utilities/translation/displayStyleExtractor.d.ts +4 -5
  17. package/lib/api/utilities/translation/displayStyleExtractor.js +13 -6
  18. package/lib/api/utilities/translation/viewExtractorSavedViewToLegacySavedView.d.ts +5 -5
  19. package/lib/api/utilities/translation/viewExtractorSavedViewToLegacySavedView.js +1 -6
  20. package/lib/captureSavedViewData.d.ts +13 -0
  21. package/lib/captureSavedViewData.js +149 -0
  22. package/lib/captureSavedViewThumbnail.d.ts +3 -0
  23. package/lib/captureSavedViewThumbnail.js +25 -0
  24. package/lib/index.d.ts +2 -0
  25. package/lib/index.js +2 -0
  26. package/lib/useSavedViews.d.ts +2 -1
  27. package/lib/useSavedViews.js +50 -26
  28. package/package.json +6 -4
@@ -2,10 +2,14 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- .svr-layered-dropdown--back {
6
- display: flex;
7
- gap: var(--iui-size-s);
8
- align-items: center;
5
+ @layer itwinui;
6
+
7
+ @layer itwin-svr {
8
+ .svr-layered-dropdown--back {
9
+ display: flex;
10
+ gap: var(--iui-size-s);
11
+ align-items: center;
12
+ }
9
13
  }
10
14
 
11
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MYXllcmVkRHJvcGRvd25NZW51L0xheWVyZWREcm9wZG93bk1lbnUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IkxheWVyZWREcm9wZG93bk1lbnUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi5zdnItbGF5ZXJlZC1kcm9wZG93bi0tYmFjayB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogdmFyKC0taXVpLXNpemUtcyk7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4iXX0= */
15
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MYXllcmVkRHJvcGRvd25NZW51L0xheWVyZWREcm9wZG93bk1lbnUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IkxheWVyZWREcm9wZG93bk1lbnUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbkBsYXllciBpdHdpbnVpO1xuXG5AbGF5ZXIgaXR3aW4tc3ZyIHtcbiAgLnN2ci1sYXllcmVkLWRyb3Bkb3duLS1iYWNrIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGdhcDogdmFyKC0taXVpLXNpemUtcyk7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxufVxuIl19 */
@@ -2,25 +2,28 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ @layer itwinui;
5
6
 
6
- .svr-searchable-submenu {
7
- display: grid;
8
- grid: auto minmax(0, 1fr) / 1fr;
9
- gap: var(--iui-size-xs);
10
- height: calc(var(--iui-menu-max-height) - 2 * var(--iui-component-height) - 1px);
11
- user-select: none;
12
- }
7
+ @layer itwin-svr {
8
+ .svr-searchable-submenu {
9
+ display: grid;
10
+ grid: auto minmax(0, 1fr) / 1fr;
11
+ gap: var(--iui-size-xs);
12
+ height: calc(var(--iui-menu-max-height) - 2 * var(--iui-component-height) - 1px);
13
+ user-select: none;
14
+ }
13
15
 
14
- .svr-searchable-submenu > div {
15
- overflow: auto;
16
- }
16
+ .svr-searchable-submenu > div {
17
+ overflow: auto;
18
+ }
17
19
 
18
- .svr-searchable-submenu-item {
19
- width: calc(10 * var(--iui-size-l));
20
- }
20
+ .svr-searchable-submenu-item {
21
+ width: calc(10 * var(--iui-size-l));
22
+ }
21
23
 
22
- .svr-semibold {
23
- font-weight: var(--iui-font-weight-semibold);
24
+ .svr-semibold {
25
+ font-weight: var(--iui-font-weight-semibold);
26
+ }
24
27
  }
25
28
 
26
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TYXZlZFZpZXdUaWxlL1NhdmVkVmlld09wdGlvbnMuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IlNhdmVkVmlld09wdGlvbnMuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLnN2ci1zZWFyY2hhYmxlLXN1Ym1lbnUge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkOiBhdXRvIG1pbm1heCgwLCAxZnIpIC8gMWZyO1xuICBnYXA6IHZhcigtLWl1aS1zaXplLXhzKTtcbiAgaGVpZ2h0OiBjYWxjKHZhcigtLWl1aS1tZW51LW1heC1oZWlnaHQpIC0gMiAqIHZhcigtLWl1aS1jb21wb25lbnQtaGVpZ2h0KSAtIDFweCk7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uc3ZyLXNlYXJjaGFibGUtc3VibWVudSA+IGRpdiB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4uc3ZyLXNlYXJjaGFibGUtc3VibWVudS1pdGVtIHtcbiAgd2lkdGg6IGNhbGMoMTAgKiB2YXIoLS1pdWktc2l6ZS1sKSk7XG59XG5cbi5zdnItc2VtaWJvbGQge1xuICBmb250LXdlaWdodDogdmFyKC0taXVpLWZvbnQtd2VpZ2h0LXNlbWlib2xkKTtcbn1cbiJdfQ== */
29
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TYXZlZFZpZXdUaWxlL1NhdmVkVmlld09wdGlvbnMuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IlNhdmVkVmlld09wdGlvbnMuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbkBsYXllciBpdHdpbnVpO1xuXG5AbGF5ZXIgaXR3aW4tc3ZyIHtcbiAgLnN2ci1zZWFyY2hhYmxlLXN1Ym1lbnUge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZDogYXV0byBtaW5tYXgoMCwgMWZyKSAvIDFmcjtcbiAgICBnYXA6IHZhcigtLWl1aS1zaXplLXhzKTtcbiAgICBoZWlnaHQ6IGNhbGModmFyKC0taXVpLW1lbnUtbWF4LWhlaWdodCkgLSAyICogdmFyKC0taXVpLWNvbXBvbmVudC1oZWlnaHQpIC0gMXB4KTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgfVxuXG4gIC5zdnItc2VhcmNoYWJsZS1zdWJtZW51ID4gZGl2IHtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxuXG4gIC5zdnItc2VhcmNoYWJsZS1zdWJtZW51LWl0ZW0ge1xuICAgIHdpZHRoOiBjYWxjKDEwICogdmFyKC0taXVpLXNpemUtbCkpO1xuICB9XG5cbiAgLnN2ci1zZW1pYm9sZCB7XG4gICAgZm9udC13ZWlnaHQ6IHZhcigtLWl1aS1mb250LXdlaWdodC1zZW1pYm9sZCk7XG4gIH1cbn1cbiJdfQ== */
@@ -2,88 +2,91 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ @layer itwinui;
5
6
 
6
- .svr-tile {
7
- width: var(--itwin-svr-tile-width, calc(8 * var(--iui-size-xl)));
8
- }
7
+ @layer itwin-svr {
8
+ .svr-tile {
9
+ width: var(--itwin-svr-tile-width, calc(8 * var(--iui-size-xl)));
10
+ }
9
11
 
10
- .svr-tile .svr-tile-thumbnail {
11
- height: var(--itwin-svr-thumbnail-height, calc(4 * var(--iui-size-xl)));
12
- }
12
+ .svr-tile .svr-tile-thumbnail {
13
+ height: var(--itwin-svr-thumbnail-height, calc(4 * var(--iui-size-xl)));
14
+ }
13
15
 
14
- .svr-tile .svr-tile-name {
15
- height: calc(var(--iui-size-l) + 2px);
16
- user-select: unset;
17
- }
16
+ .svr-tile .svr-tile-name {
17
+ height: calc(var(--iui-size-l) + 2px);
18
+ user-select: unset;
19
+ }
18
20
 
19
- .svr-tile--metadata {
20
- display: grid;
21
- grid: 1fr / auto minmax(0, 1fr) auto;
22
- align-items: center;
23
- }
21
+ .svr-tile--metadata {
22
+ display: grid;
23
+ grid: 1fr / auto minmax(0, 1fr) auto;
24
+ align-items: center;
25
+ }
24
26
 
25
- .svr-tile--metadata > svg {
26
- margin-right: var(--iui-size-xs);
27
- }
27
+ .svr-tile--metadata > svg {
28
+ margin-right: var(--iui-size-xs);
29
+ }
28
30
 
29
- .svr-tile--tag-container {
30
- display: flex;
31
- gap: var(--iui-size-s);
32
- }
31
+ .svr-tile--tag-container {
32
+ display: flex;
33
+ gap: var(--iui-size-s);
34
+ }
33
35
 
34
- .svr-tile--tag {
35
- align-items: center;
36
- text-overflow: ellipsis;
37
- white-space: nowrap;
38
- overflow: hidden;
39
- min-width: 0;
40
- }
36
+ .svr-tile--tag {
37
+ align-items: center;
38
+ text-overflow: ellipsis;
39
+ white-space: nowrap;
40
+ overflow: hidden;
41
+ min-width: 0;
42
+ }
41
43
 
42
- .svr-tile--tag-overflow {
43
- margin-left: var(--iui-size-s);
44
- }
44
+ .svr-tile--tag-overflow {
45
+ margin-left: var(--iui-size-s);
46
+ }
45
47
 
46
- .svr-tile--more-options {
47
- z-index: 2;
48
- grid-area: 1 / 1 / -1 / -1;
49
- place-self: end;
50
- margin: 0;
51
- margin-inline-end: calc(-1*var(--iui-size-2xs));
52
- display: grid;
53
- position: absolute;
54
- }
48
+ .svr-tile--more-options {
49
+ z-index: 2;
50
+ grid-area: 1 / 1 / -1 / -1;
51
+ place-self: end;
52
+ margin: 0;
53
+ margin-inline-end: calc(-1*var(--iui-size-2xs));
54
+ display: grid;
55
+ position: absolute;
56
+ }
55
57
 
56
- .svr-tile:not(:hover, :focus-within) .svr-tile--more-options:where(:not(.svr-visible)) {
57
- visibility: hidden;
58
- }
58
+ .svr-tile:not(:hover, :focus-within) .svr-tile--more-options:where(:not(.svr-visible)) {
59
+ visibility: hidden;
60
+ }
59
61
 
60
- .svr-tile--icon-container {
61
- display: flex;
62
- margin-top: calc(0.5 * var(--iui-size-s));
63
- margin-inline: var(--iui-size-xs);
64
- gap: var(--iui-size-2xs);
65
- z-index: 1;
66
- }
62
+ .svr-tile--icon-container {
63
+ display: flex;
64
+ margin-top: calc(0.5 * var(--iui-size-s));
65
+ margin-inline: var(--iui-size-xs);
66
+ gap: var(--iui-size-2xs);
67
+ z-index: 1;
68
+ }
67
69
 
68
- .svr-tile--icon {
69
- border-radius: 50%;
70
- background: rgb(0, 0, 0, var(--iui-opacity-3));
71
- min-width: var(--iui-component-height-small);
72
- min-height: var(--iui-component-height-small);
73
- display: flex;
74
- place-items: center;
75
- padding-inline: var(--iui-size-2xs);
76
- border: 1px solid transparent;
77
- }
70
+ .svr-tile--icon {
71
+ border-radius: 50%;
72
+ background: rgb(0, 0, 0, var(--iui-opacity-3));
73
+ min-width: var(--iui-component-height-small);
74
+ min-height: var(--iui-component-height-small);
75
+ display: flex;
76
+ place-items: center;
77
+ padding-inline: var(--iui-size-2xs);
78
+ border: 1px solid transparent;
79
+ }
78
80
 
79
- .svr-tile--icon svg {
80
- fill: var(--iui-color-white);
81
- }
81
+ .svr-tile--icon svg {
82
+ fill: var(--iui-color-white);
83
+ }
82
84
 
83
- .svr-tile--editable-title > span {
84
- display: flex;
85
- align-items: center;
86
- gap: var(--iui-size-s);
85
+ .svr-tile--editable-title > span {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: var(--iui-size-s);
89
+ }
87
90
  }
88
91
 
89
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TYXZlZFZpZXdUaWxlL1NhdmVkVmlld1RpbGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IlNhdmVkVmlld1RpbGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLnN2ci10aWxlIHtcbiAgd2lkdGg6IHZhcigtLWl0d2luLXN2ci10aWxlLXdpZHRoLCBjYWxjKDggKiB2YXIoLS1pdWktc2l6ZS14bCkpKTtcbn1cblxuLnN2ci10aWxlIC5zdnItdGlsZS10aHVtYm5haWwge1xuICBoZWlnaHQ6IHZhcigtLWl0d2luLXN2ci10aHVtYm5haWwtaGVpZ2h0LCBjYWxjKDQgKiB2YXIoLS1pdWktc2l6ZS14bCkpKTtcbn1cblxuLnN2ci10aWxlIC5zdnItdGlsZS1uYW1lIHtcbiAgaGVpZ2h0OiBjYWxjKHZhcigtLWl1aS1zaXplLWwpICsgMnB4KTtcbiAgdXNlci1zZWxlY3Q6IHVuc2V0O1xufVxuXG4uc3ZyLXRpbGUtLW1ldGFkYXRhIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZDogMWZyIC8gYXV0byBtaW5tYXgoMCwgMWZyKSBhdXRvO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uc3ZyLXRpbGUtLW1ldGFkYXRhID4gc3ZnIHtcbiAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1pdWktc2l6ZS14cyk7XG59XG5cbi5zdnItdGlsZS0tdGFnLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogdmFyKC0taXVpLXNpemUtcyk7XG59XG5cbi5zdnItdGlsZS0tdGFnIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIG1pbi13aWR0aDogMDtcbn1cblxuLnN2ci10aWxlLS10YWctb3ZlcmZsb3cge1xuICBtYXJnaW4tbGVmdDogdmFyKC0taXVpLXNpemUtcyk7XG59XG5cbi5zdnItdGlsZS0tbW9yZS1vcHRpb25zIHtcbiAgei1pbmRleDogMjtcbiAgZ3JpZC1hcmVhOiAxIC8gMSAvIC0xIC8gLTE7XG4gIHBsYWNlLXNlbGY6IGVuZDtcbiAgbWFyZ2luOiAwO1xuICBtYXJnaW4taW5saW5lLWVuZDogY2FsYygtMSp2YXIoLS1pdWktc2l6ZS0yeHMpKTtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uc3ZyLXRpbGU6bm90KDpob3ZlciwgOmZvY3VzLXdpdGhpbikgLnN2ci10aWxlLS1tb3JlLW9wdGlvbnM6d2hlcmUoOm5vdCguc3ZyLXZpc2libGUpKSB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLnN2ci10aWxlLS1pY29uLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1hcmdpbi10b3A6IGNhbGMoMC41ICogdmFyKC0taXVpLXNpemUtcykpO1xuICBtYXJnaW4taW5saW5lOiB2YXIoLS1pdWktc2l6ZS14cyk7XG4gIGdhcDogdmFyKC0taXVpLXNpemUtMnhzKTtcbiAgei1pbmRleDogMTtcbn1cblxuLnN2ci10aWxlLS1pY29uIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCwgdmFyKC0taXVpLW9wYWNpdHktMykpO1xuICBtaW4td2lkdGg6IHZhcigtLWl1aS1jb21wb25lbnQtaGVpZ2h0LXNtYWxsKTtcbiAgbWluLWhlaWdodDogdmFyKC0taXVpLWNvbXBvbmVudC1oZWlnaHQtc21hbGwpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nLWlubGluZTogdmFyKC0taXVpLXNpemUtMnhzKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi5zdnItdGlsZS0taWNvbiBzdmcge1xuICBmaWxsOiB2YXIoLS1pdWktY29sb3Itd2hpdGUpO1xufVxuXG4uc3ZyLXRpbGUtLWVkaXRhYmxlLXRpdGxlID4gc3BhbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogdmFyKC0taXVpLXNpemUtcyk7XG59XG4iXX0= */
92
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TYXZlZFZpZXdUaWxlL1NhdmVkVmlld1RpbGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IlNhdmVkVmlld1RpbGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbkBsYXllciBpdHdpbnVpO1xuXG5AbGF5ZXIgaXR3aW4tc3ZyIHtcbiAgLnN2ci10aWxlIHtcbiAgICB3aWR0aDogdmFyKC0taXR3aW4tc3ZyLXRpbGUtd2lkdGgsIGNhbGMoOCAqIHZhcigtLWl1aS1zaXplLXhsKSkpO1xuICB9XG5cbiAgLnN2ci10aWxlIC5zdnItdGlsZS10aHVtYm5haWwge1xuICAgIGhlaWdodDogdmFyKC0taXR3aW4tc3ZyLXRodW1ibmFpbC1oZWlnaHQsIGNhbGMoNCAqIHZhcigtLWl1aS1zaXplLXhsKSkpO1xuICB9XG5cbiAgLnN2ci10aWxlIC5zdnItdGlsZS1uYW1lIHtcbiAgICBoZWlnaHQ6IGNhbGModmFyKC0taXVpLXNpemUtbCkgKyAycHgpO1xuICAgIHVzZXItc2VsZWN0OiB1bnNldDtcbiAgfVxuXG4gIC5zdnItdGlsZS0tbWV0YWRhdGEge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZDogMWZyIC8gYXV0byBtaW5tYXgoMCwgMWZyKSBhdXRvO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAuc3ZyLXRpbGUtLW1ldGFkYXRhID4gc3ZnIHtcbiAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLWl1aS1zaXplLXhzKTtcbiAgfVxuXG4gIC5zdnItdGlsZS0tdGFnLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBnYXA6IHZhcigtLWl1aS1zaXplLXMpO1xuICB9XG5cbiAgLnN2ci10aWxlLS10YWcge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIG1pbi13aWR0aDogMDtcbiAgfVxuXG4gIC5zdnItdGlsZS0tdGFnLW92ZXJmbG93IHtcbiAgICBtYXJnaW4tbGVmdDogdmFyKC0taXVpLXNpemUtcyk7XG4gIH1cblxuICAuc3ZyLXRpbGUtLW1vcmUtb3B0aW9ucyB7XG4gICAgei1pbmRleDogMjtcbiAgICBncmlkLWFyZWE6IDEgLyAxIC8gLTEgLyAtMTtcbiAgICBwbGFjZS1zZWxmOiBlbmQ7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1hcmdpbi1pbmxpbmUtZW5kOiBjYWxjKC0xKnZhcigtLWl1aS1zaXplLTJ4cykpO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICB9XG5cbiAgLnN2ci10aWxlOm5vdCg6aG92ZXIsIDpmb2N1cy13aXRoaW4pIC5zdnItdGlsZS0tbW9yZS1vcHRpb25zOndoZXJlKDpub3QoLnN2ci12aXNpYmxlKSkge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxuXG4gIC5zdnItdGlsZS0taWNvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLXRvcDogY2FsYygwLjUgKiB2YXIoLS1pdWktc2l6ZS1zKSk7XG4gICAgbWFyZ2luLWlubGluZTogdmFyKC0taXVpLXNpemUteHMpO1xuICAgIGdhcDogdmFyKC0taXVpLXNpemUtMnhzKTtcbiAgICB6LWluZGV4OiAxO1xuICB9XG5cbiAgLnN2ci10aWxlLS1pY29uIHtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYmFja2dyb3VuZDogcmdiKDAsIDAsIDAsIHZhcigtLWl1aS1vcGFjaXR5LTMpKTtcbiAgICBtaW4td2lkdGg6IHZhcigtLWl1aS1jb21wb25lbnQtaGVpZ2h0LXNtYWxsKTtcbiAgICBtaW4taGVpZ2h0OiB2YXIoLS1pdWktY29tcG9uZW50LWhlaWdodC1zbWFsbCk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBwbGFjZS1pdGVtczogY2VudGVyO1xuICAgIHBhZGRpbmctaW5saW5lOiB2YXIoLS1pdWktc2l6ZS0yeHMpO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICB9XG5cbiAgLnN2ci10aWxlLS1pY29uIHN2ZyB7XG4gICAgZmlsbDogdmFyKC0taXVpLWNvbG9yLXdoaXRlKTtcbiAgfVxuXG4gIC5zdnItdGlsZS0tZWRpdGFibGUtdGl0bGUgPiBzcGFuIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiB2YXIoLS1pdWktc2l6ZS1zKTtcbiAgfVxufVxuIl19 */
@@ -1,6 +1,6 @@
1
- import { type SavedViewWithDataRepresentation } from "@itwin/saved-views-client";
1
+ import { type SavedViewRepresentation } from "@itwin/saved-views-client";
2
2
  import type { SavedView, SavedViewGroup, SavedViewTag } from "../SavedView.js";
3
- import type { CreateGroupParams, CreateSavedViewParams, CreateTagParams, DeleteGroupParams, DeleteSavedViewParams, DeleteTagParams, GetSavedViewInfoParams, GetSingularSavedViewParams, GetThumbnailUrlParams, SavedViewInfo, SavedViewsClient, UpdateGroupParams, UpdateSavedViewParams, UpdateTagParams } from "./SavedViewsClient.js";
3
+ import type { CreateGroupParams, CreateSavedViewParams, CreateTagParams, DeleteGroupParams, DeleteSavedViewParams, DeleteTagParams, GetSavedViewInfoParams, GetSingularSavedViewParams, GetThumbnailUrlParams, SavedViewInfo, SavedViewsClient, UpdateGroupParams, UpdateSavedViewParams, UpdateTagParams, UploadThumbnailParams } from "./SavedViewsClient.js";
4
4
  interface ITwinSavedViewsClientParams {
5
5
  /** @default "https://api.bentley.com/savedviews" */
6
6
  getAccessToken: () => Promise<string>;
@@ -15,8 +15,9 @@ export declare class ITwinSavedViewsClient implements SavedViewsClient {
15
15
  private client;
16
16
  constructor(args: ITwinSavedViewsClientParams);
17
17
  getSavedViewInfo(args: GetSavedViewInfoParams): Promise<SavedViewInfo>;
18
- getSingularSavedView(args: GetSingularSavedViewParams): Promise<SavedViewWithDataRepresentation>;
18
+ getSingularSavedView(args: GetSingularSavedViewParams): Promise<SavedViewRepresentation>;
19
19
  getThumbnailUrl(args: GetThumbnailUrlParams): Promise<string | undefined>;
20
+ uploadThumbnail(args: UploadThumbnailParams): Promise<void>;
20
21
  createSavedView(args: CreateSavedViewParams): Promise<SavedView>;
21
22
  updateSavedView(args: UpdateSavedViewParams): Promise<SavedView>;
22
23
  deleteSavedView(args: DeleteSavedViewParams): Promise<void>;
@@ -36,6 +36,13 @@ export class ITwinSavedViewsClient {
36
36
  });
37
37
  return response.href;
38
38
  }
39
+ async uploadThumbnail(args) {
40
+ await this.client.updateImage({
41
+ savedViewId: args.savedViewId,
42
+ image: args.image,
43
+ signal: args.signal,
44
+ });
45
+ }
39
46
  async createSavedView(args) {
40
47
  const { savedView } = await this.client.createSavedView({
41
48
  iTwinId: args.iTwinId,
@@ -1,4 +1,4 @@
1
- import type { ExtensionMin, ExtensionSavedViewCreate, SavedViewWithDataRepresentation, ViewData } from "@itwin/saved-views-client";
1
+ import type { ExtensionMin, ExtensionSavedViewCreate, SavedViewRepresentation, ViewData } from "@itwin/saved-views-client";
2
2
  import type { SavedView, SavedViewGroup, SavedViewTag } from "../SavedView.js";
3
3
  export interface SavedViewInfo {
4
4
  savedViews: SavedView[];
@@ -7,8 +7,9 @@ export interface SavedViewInfo {
7
7
  }
8
8
  export interface SavedViewsClient {
9
9
  getSavedViewInfo: (args: GetSavedViewInfoParams) => Promise<SavedViewInfo>;
10
- getSingularSavedView: (args: GetSingularSavedViewParams) => Promise<SavedViewWithDataRepresentation>;
10
+ getSingularSavedView: (args: GetSingularSavedViewParams) => Promise<SavedViewRepresentation>;
11
11
  getThumbnailUrl: (args: GetThumbnailUrlParams) => Promise<string | undefined>;
12
+ uploadThumbnail: (args: UploadThumbnailParams) => Promise<void>;
12
13
  createSavedView: (args: CreateSavedViewParams) => Promise<SavedView>;
13
14
  updateSavedView: (args: UpdateSavedViewParams) => Promise<SavedView>;
14
15
  deleteSavedView: (args: DeleteSavedViewParams) => Promise<void>;
@@ -29,6 +30,11 @@ export interface GetSingularSavedViewParams extends CommonParams {
29
30
  export interface GetThumbnailUrlParams extends CommonParams {
30
31
  savedViewId: string;
31
32
  }
33
+ export interface UploadThumbnailParams extends CommonParams {
34
+ savedViewId: string;
35
+ /** Image data encoded as base64 data URL. */
36
+ image: string;
37
+ }
32
38
  export interface CreateSavedViewParams extends CommonParams {
33
39
  iTwinId: string;
34
40
  iModelId?: string | undefined;
@@ -33,5 +33,5 @@ export function SavedViewGroupTile(props) {
33
33
  props.onRename?.(props.group.id, newName);
34
34
  }
35
35
  },
36
- } }), thumbnail: _jsxs("div", { className: "svr-folder-edit", onClick: dispatchOpenGroup, children: [_jsx("div", { style: { position: "absolute" } }), _jsx(SvgFolder, { className: "iui-thumbnail-icon" })] }), isActionable: !props.editable && !editingName, moreOptions: (props.options && props.options.length > 0) ? props.options : undefined, onClick: dispatchOpenGroup, children: _jsxs(Text, { isMuted: true, children: [props.numItems, " items"] }) }) }) }));
36
+ } }), thumbnail: _jsx(SvgFolder, { className: "iui-thumbnail-icon" }), isActionable: !props.editable && !editingName, moreOptions: (props.options && props.options.length > 0) ? props.options : undefined, onClick: dispatchOpenGroup, children: _jsxs(Text, { isMuted: true, children: [props.numItems, " items"] }) }) }) }));
37
37
  }
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ @layer itwinui;
5
6
 
6
7
  @layer itwin-svr {
7
8
  .svr-saved-views-widget {
@@ -19,27 +20,6 @@
19
20
  position: relative;
20
21
  }
21
22
 
22
- .svr-folder-edit.svr-folder-edit {
23
- width: 100%;
24
- height: 100%;
25
- display: grid;
26
- place-items: center;
27
- cursor: pointer;
28
- }
29
-
30
- .svr-folder-edit.svr-folder-edit > div {
31
- height: 100%;
32
- width: 100%;
33
- visibility: hidden;
34
- display: grid;
35
- place-items: center;
36
- background: var(--iui-color-background-transparent-hover);
37
- }
38
-
39
- .svr-folder .svr-folder-edit.svr-folder-edit:hover > div {
40
- visibility: visible;
41
- }
42
-
43
23
  .svr-borderless-expandable-block-title {
44
24
  display: flex;
45
25
  gap: var(--iui-size-xs);
@@ -47,4 +27,4 @@
47
27
  }
48
28
  }
49
29
 
50
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TYXZlZFZpZXdzV2lkZ2V0L1NhdmVkVmlld3NFeHBhbmRhYmxlQmxvY2tXaWRnZXQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IlNhdmVkVmlld3NFeHBhbmRhYmxlQmxvY2tXaWRnZXQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuQGxheWVyIGl0d2luLXN2ciB7XG4gIC5zdnItc2F2ZWQtdmlld3Mtd2lkZ2V0IHtcbiAgICAtLWl0d2luLXN2ci10aWxlLXdpZHRoOiBjYWxjKDggKiB2YXIoLS1pdWktc2l6ZS14bCkpO1xuICAgIC0taXR3aW4tc3ZyLXRodW1ibmFpbC1oZWlnaHQ6IGNhbGMoNCAqIHZhcigtLWl1aS1zaXplLXhsKSk7XG5cbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxuXG4gIC5zdnItZ3JvdXAtZ3JpZCB7XG4gICAgLS1pdHdpbi1zdnItdGlsZS13aWR0aDogY2FsYygzICogdmFyKC0taXVpLXNpemUtM3hsKSk7XG4gIH1cblxuICAuc3ZyLWZvbGRlciAuaXVpLXRpbGUtdGh1bWJuYWlsIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAuc3ZyLWZvbGRlci1lZGl0LnN2ci1mb2xkZXItZWRpdCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cblxuICAuc3ZyLWZvbGRlci1lZGl0LnN2ci1mb2xkZXItZWRpdCA+IGRpdiB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZDogdmFyKC0taXVpLWNvbG9yLWJhY2tncm91bmQtdHJhbnNwYXJlbnQtaG92ZXIpO1xuICB9XG5cbiAgLnN2ci1mb2xkZXIgLnN2ci1mb2xkZXItZWRpdC5zdnItZm9sZGVyLWVkaXQ6aG92ZXIgPiBkaXYge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIH1cblxuICAuc3ZyLWJvcmRlcmxlc3MtZXhwYW5kYWJsZS1ibG9jay10aXRsZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBnYXA6IHZhcigtLWl1aS1zaXplLXhzKTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG4iXX0= */
30
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TYXZlZFZpZXdzV2lkZ2V0L1NhdmVkVmlld3NFeHBhbmRhYmxlQmxvY2tXaWRnZXQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IlNhdmVkVmlld3NFeHBhbmRhYmxlQmxvY2tXaWRnZXQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbkBsYXllciBpdHdpbnVpO1xuXG5AbGF5ZXIgaXR3aW4tc3ZyIHtcbiAgLnN2ci1zYXZlZC12aWV3cy13aWRnZXQge1xuICAgIC0taXR3aW4tc3ZyLXRpbGUtd2lkdGg6IGNhbGMoOCAqIHZhcigtLWl1aS1zaXplLXhsKSk7XG4gICAgLS1pdHdpbi1zdnItdGh1bWJuYWlsLWhlaWdodDogY2FsYyg0ICogdmFyKC0taXVpLXNpemUteGwpKTtcblxuICAgIG92ZXJmbG93OiBhdXRvO1xuICB9XG5cbiAgLnN2ci1ncm91cC1ncmlkIHtcbiAgICAtLWl0d2luLXN2ci10aWxlLXdpZHRoOiBjYWxjKDMgKiB2YXIoLS1pdWktc2l6ZS0zeGwpKTtcbiAgfVxuXG4gIC5zdnItZm9sZGVyIC5pdWktdGlsZS10aHVtYm5haWwge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuXG4gIC5zdnItYm9yZGVybGVzcy1leHBhbmRhYmxlLWJsb2NrLXRpdGxlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGdhcDogdmFyKC0taXVpLXNpemUteHMpO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cbiJdfQ== */
@@ -56,5 +56,5 @@ function SavedViewsGroupScreen(props) {
56
56
  gap: "var(--iui-size-s)",
57
57
  background: "var(--iui-color-background)",
58
58
  padding: "var(--iui-size-s)",
59
- }, children: [_jsx(Button, { startIcon: _jsx(SvgChevronLeft, {}), onClick: () => props.setActiveGroup(undefined), children: "Back" }), _jsxs(Breadcrumbs, { children: [_jsx(IconButton, { onClick: () => props.setActiveGroup(undefined), children: _jsx(SvgHome, {}) }), _jsx(DropdownButton, { menuItems: (close) => groups.map((group) => _jsx(MenuItem, { onClick: () => { close(); props.setActiveGroup(group.id); }, children: group.displayName }, group.id)), children: props.activeGroup.displayName })] })] }), _jsx("div", { style: { overflow: "auto" }, children: _jsx(TileGrid, { gridItems: props.savedViews, children: (savedView) => (_jsx(SavedViewTile, { savedView: savedView, tags: props.tags, editable: props.editable, options: props.options?.(savedView), onClick: props.onTileClick }, savedView.id)) }) })] }));
59
+ }, children: [_jsx(Button, { styleType: "borderless", startIcon: _jsx(SvgChevronLeft, {}), onClick: () => props.setActiveGroup(undefined), children: "Back" }), _jsxs(Breadcrumbs, { children: [_jsx(IconButton, { styleType: "borderless", onClick: () => props.setActiveGroup(undefined), children: _jsx(SvgHome, {}) }), _jsx(DropdownButton, { styleType: "borderless", menuItems: (close) => groups.map((group) => _jsx(MenuItem, { onClick: () => { close(); props.setActiveGroup(group.id); }, children: group.displayName }, group.id)), children: props.activeGroup.displayName })] })] }), _jsx("div", { style: { overflow: "auto" }, children: _jsx(TileGrid, { gridItems: props.savedViews, children: (savedView) => (_jsx(SavedViewTile, { savedView: savedView, tags: props.tags, editable: props.editable, options: props.options?.(savedView), onClick: props.onTileClick }, savedView.id)) }) })] }));
60
60
  }
@@ -2,19 +2,22 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ @layer itwinui;
5
6
 
6
- .svr-expandable-block-header {
7
- position: sticky;
8
- top: 0;
9
- z-index: 1;
10
- }
7
+ @layer itwin-svr {
8
+ .svr-expandable-block-header {
9
+ position: sticky;
10
+ top: 0;
11
+ z-index: 1;
12
+ }
11
13
 
12
- .svr-expandable-block-header[data-stuck=true] {
13
- box-shadow: var(--iui-shadow-1);
14
- }
14
+ .svr-expandable-block-header[data-stuck=true] {
15
+ box-shadow: var(--iui-shadow-1);
16
+ }
15
17
 
16
- .svr-expandable-block-header:not(:hover) {
17
- background: var(--iui-color-background);
18
+ .svr-expandable-block-header:not(:hover) {
19
+ background: var(--iui-color-background);
20
+ }
18
21
  }
19
22
 
20
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TdGlja3lFeHBhbmRhYmxlQmxvY2svU3RpY2t5RXhwYW5kYWJsZUJsb2NrLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiJTdGlja3lFeHBhbmRhYmxlQmxvY2suY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLnN2ci1leHBhbmRhYmxlLWJsb2NrLWhlYWRlciB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHRvcDogMDtcbiAgei1pbmRleDogMTtcbn1cblxuLnN2ci1leHBhbmRhYmxlLWJsb2NrLWhlYWRlcltkYXRhLXN0dWNrPXRydWVdIHtcbiAgYm94LXNoYWRvdzogdmFyKC0taXVpLXNoYWRvdy0xKTtcbn1cblxuLnN2ci1leHBhbmRhYmxlLWJsb2NrLWhlYWRlcjpub3QoOmhvdmVyKSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWl1aS1jb2xvci1iYWNrZ3JvdW5kKTtcbn1cbiJdfQ== */
23
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TdGlja3lFeHBhbmRhYmxlQmxvY2svU3RpY2t5RXhwYW5kYWJsZUJsb2NrLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiJTdGlja3lFeHBhbmRhYmxlQmxvY2suY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbkBsYXllciBpdHdpbnVpO1xuXG5AbGF5ZXIgaXR3aW4tc3ZyIHtcbiAgLnN2ci1leHBhbmRhYmxlLWJsb2NrLWhlYWRlciB7XG4gICAgcG9zaXRpb246IHN0aWNreTtcbiAgICB0b3A6IDA7XG4gICAgei1pbmRleDogMTtcbiAgfVxuXG4gIC5zdnItZXhwYW5kYWJsZS1ibG9jay1oZWFkZXJbZGF0YS1zdHVjaz10cnVlXSB7XG4gICAgYm94LXNoYWRvdzogdmFyKC0taXVpLXNoYWRvdy0xKTtcbiAgfVxuXG4gIC5zdnItZXhwYW5kYWJsZS1ibG9jay1oZWFkZXI6bm90KDpob3Zlcikge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWl1aS1jb2xvci1iYWNrZ3JvdW5kKTtcbiAgfVxufVxuIl19 */
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ @layer itwinui;
5
6
 
6
7
  @layer itwin-svr {
7
8
  .svr-tile-grid {
@@ -25,4 +26,4 @@
25
26
  }
26
27
  }
27
28
 
28
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UaWxlR3JpZC9UaWxlR3JpZC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiVGlsZUdyaWQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuQGxheWVyIGl0d2luLXN2ciB7XG4gIC5zdnItdGlsZS1ncmlkIHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgdmFyKC0taXR3aW4tc3ZyLXRpbGUtd2lkdGgpKTtcbiAgICBwbGFjZS1jb250ZW50OiBzdGFydCBzcGFjZS1hcm91bmQ7XG4gICAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IHZhcigtLWl1aS1zaXplLW0pO1xuICAgIG1hcmdpbjogdmFyKC0taXVpLXNpemUteHMpIHZhcigtLWl1aS1zaXplLXMpO1xuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLWl1aS1zaXplLWwpO1xuICB9XG5cbiAgLnN2ci10aWxlLWdyaWQtLW1vcmUtaXRlbXMtdGlsZSB7XG4gICAgcGFkZGluZzogdmFyKC0taXVpLXNpemUtbSk7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBnYXA6IHZhcigtLWl1aS1zaXplLXMpO1xuICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgICB3aWR0aDogY2FsYygwLjggKiB2YXIoLS1pdHdpbi1zdnItdGlsZS13aWR0aCkpO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtaW4td2lkdGg6IG1pbi1jb250ZW50O1xuICB9XG59XG4iXX0= */
29
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UaWxlR3JpZC9UaWxlR3JpZC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiVGlsZUdyaWQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IChjKSBCZW50bGV5IFN5c3RlbXMsIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSB0ZXJtcyBhbmQgZnVsbCBjb3B5cmlnaHQgbm90aWNlLlxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbkBsYXllciBpdHdpbnVpO1xuXG5AbGF5ZXIgaXR3aW4tc3ZyIHtcbiAgLnN2ci10aWxlLWdyaWQge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCB2YXIoLS1pdHdpbi1zdnItdGlsZS13aWR0aCkpO1xuICAgIHBsYWNlLWNvbnRlbnQ6IHN0YXJ0IHNwYWNlLWFyb3VuZDtcbiAgICBwbGFjZS1pdGVtczogY2VudGVyO1xuICAgIGdhcDogdmFyKC0taXVpLXNpemUtbSk7XG4gICAgbWFyZ2luOiB2YXIoLS1pdWktc2l6ZS14cykgdmFyKC0taXVpLXNpemUtcyk7XG4gICAgbWFyZ2luLWJvdHRvbTogdmFyKC0taXVpLXNpemUtbCk7XG4gIH1cblxuICAuc3ZyLXRpbGUtZ3JpZC0tbW9yZS1pdGVtcy10aWxlIHtcbiAgICBwYWRkaW5nOiB2YXIoLS1pdWktc2l6ZS1tKTtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdhcDogdmFyKC0taXVpLXNpemUtcyk7XG4gICAganVzdGlmeS1pdGVtczogY2VudGVyO1xuICAgIHdpZHRoOiBjYWxjKDAuOCAqIHZhcigtLWl0d2luLXN2ci10aWxlLXdpZHRoKSk7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1pbi13aWR0aDogbWluLWNvbnRlbnQ7XG4gIH1cbn1cbiJdfQ== */
@@ -1,22 +1,22 @@
1
1
  import { IModelConnection, ScreenViewport, ViewState } from "@itwin/core-frontend";
2
- import { SavedViewWithDataRepresentation } from "@itwin/saved-views-client";
2
+ import { type SavedViewRepresentation } from "@itwin/saved-views-client";
3
3
  /**
4
4
  * Converts a saved view response to a saved view response that includes a legacy view.
5
5
  * @param savedViewResponse A saved view response with or without a legacy view.
6
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}).
7
+ * @returns A {@link SavedViewRepresentation} that contains legacy saved view data.
8
8
  */
9
- export declare function translateSavedViewResponseToLegacySavedViewResponse(savedViewResponse: SavedViewWithDataRepresentation, iModelConnection: IModelConnection): Promise<SavedViewWithDataRepresentation>;
9
+ export declare function translateSavedViewResponseToLegacySavedViewResponse(savedViewResponse: SavedViewRepresentation, iModelConnection: IModelConnection): Promise<SavedViewRepresentation>;
10
10
  /**
11
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}).
12
+ * @param legacySavedViewResponse A saved view response that includes a legacy view.
13
13
  * @param iModelConnection The {@link IModelConnection} for the saved view; used to query for additional information.
14
14
  * @returns A {@link ViewState} with the saved view applied.
15
15
  */
16
- export declare function translateLegacySavedViewToITwinJsViewState(legacySavedViewResponse: SavedViewWithDataRepresentation, iModelConnection: IModelConnection): Promise<ViewState | undefined>;
16
+ export declare function translateLegacySavedViewToITwinJsViewState(legacySavedViewResponse: SavedViewRepresentation, iModelConnection: IModelConnection): Promise<ViewState | undefined>;
17
17
  /**
18
18
  * Apply extension data (overrides) onto the supplied viewport. Only works with legacy-formatted extension data.
19
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}).
20
+ * @param legacySavedViewResponse A saved view response that includes a legacy view.
21
21
  */
22
- export declare function applyExtensionsToViewport(viewport: ScreenViewport, legacySavedViewResponse: SavedViewWithDataRepresentation | undefined): Promise<void>;
22
+ export declare function applyExtensionsToViewport(viewport: ScreenViewport, legacySavedViewResponse: SavedViewRepresentation | undefined): Promise<void>;
@@ -4,6 +4,7 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { IModelReadRpcInterface } from "@itwin/core-common";
6
6
  import { DrawingViewState, EmphasizeElements, SheetViewState, SpatialViewState, } from "@itwin/core-frontend";
7
+ import { isViewDataITwin3d, isViewDataITwinDrawing, isViewDataITwinSheet, } from "@itwin/saved-views-client";
7
8
  import { isDrawingSavedView, isSheetSavedView, isSpatialSavedView } from "../../clients/ISavedViewsClient.js";
8
9
  import { applyHiddenModelsAndCategories } from "./ModelsAndCategoriesHelper.js";
9
10
  import { SavedViewsExtensionHandlers } from "./SavedViewsExtensionHandlers.js";
@@ -14,24 +15,6 @@ var ViewTypes;
14
15
  ViewTypes[ViewTypes["ViewDefinition3d"] = 1] = "ViewDefinition3d";
15
16
  ViewTypes[ViewTypes["DrawingViewDefinition"] = 2] = "DrawingViewDefinition";
16
17
  })(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
18
  /**
36
19
  * Extract the legacy saved view data from a legacy saved view response
37
20
  * @param legacySavedViewResponse
@@ -44,7 +27,7 @@ function legacyViewFrom(legacySavedViewResponse) {
44
27
  * Converts a saved view response to a saved view response that includes a legacy view.
45
28
  * @param savedViewResponse A saved view response with or without a legacy view.
46
29
  * @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}).
30
+ * @returns A {@link SavedViewRepresentation} that contains legacy saved view data.
48
31
  */
49
32
  export async function translateSavedViewResponseToLegacySavedViewResponse(savedViewResponse, iModelConnection) {
50
33
  const legacySavedView = await translateSavedViewToLegacySavedView(savedViewResponse, iModelConnection);
@@ -54,7 +37,7 @@ export async function translateSavedViewResponseToLegacySavedViewResponse(savedV
54
37
  }
55
38
  /**
56
39
  * 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}).
40
+ * @param legacySavedViewResponse A saved view response that includes a legacy view.
58
41
  * @param iModelConnection The {@link IModelConnection} for the saved view; used to query for additional information.
59
42
  * @returns A {@link ViewState} with the saved view applied.
60
43
  */
@@ -69,7 +52,7 @@ export async function translateLegacySavedViewToITwinJsViewState(legacySavedView
69
52
  /**
70
53
  * Apply extension data (overrides) onto the supplied viewport. Only works with legacy-formatted extension data.
71
54
  * @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}).
55
+ * @param legacySavedViewResponse A saved view response that includes a legacy view.
73
56
  */
74
57
  export async function applyExtensionsToViewport(viewport, legacySavedViewResponse) {
75
58
  if (!legacySavedViewResponse) {
@@ -93,17 +76,17 @@ async function translateSavedViewToLegacySavedView(savedViewResponse, iModelConn
93
76
  legacySavedView = savedViewData.legacyView;
94
77
  // legacySavedView.id = savedView.id; // Change legacy sv id to comboId
95
78
  }
96
- else if (isSavedViewItwin3d(savedViewData)) {
79
+ else if (isViewDataITwin3d(savedViewData)) {
97
80
  const iModelViewData = await fetchIModelViewData(ViewTypes.ViewDefinition3d, iModelConnection);
98
81
  const actual = savedViewITwin3dToLegacy3dSavedView(savedViewResponse, iModelViewData);
99
82
  legacySavedView = actual;
100
83
  }
101
- else if (isSavedViewItwinDrawing(savedViewData)) {
84
+ else if (isViewDataITwinDrawing(savedViewData)) {
102
85
  const iModelViewData = await fetchIModelViewData(ViewTypes.DrawingViewDefinition, iModelConnection);
103
86
  const actual = savedViewItwinDrawingToLegacyDrawingView(savedViewResponse, iModelViewData);
104
87
  legacySavedView = actual;
105
88
  }
106
- else if (isSavedViewItwinSheet(savedViewData)) {
89
+ else if (isViewDataITwinSheet(savedViewData)) {
107
90
  const iModelViewData = await fetchIModelViewData(ViewTypes.SheetViewDefinition, iModelConnection);
108
91
  const actual = savedViewItwinSheetToLegacySheetSavedView(savedViewResponse, iModelViewData);
109
92
  legacySavedView = actual;
@@ -0,0 +1,3 @@
1
+ import type { SpatialViewDefinitionProps } from "@itwin/core-common";
2
+ import type { ClipPrimitivePlaneProps, ClipPrimitiveShapeProps } from "@itwin/saved-views-client";
3
+ export declare function extractClipVectorsFromLegacy(input: SpatialViewDefinitionProps): Array<ClipPrimitivePlaneProps | ClipPrimitiveShapeProps> | undefined;
@@ -0,0 +1,41 @@
1
+ import { applyExtraction, extractArray2d, extractArrayConditionally, extractBoolean, extractNumber, extractObject, extractSimpleArray, simpleTypeOf, } from "./extractionUtilities.js";
2
+ export function extractClipVectorsFromLegacy(input) {
3
+ const viewDetails = input.jsonProperties?.viewDetails;
4
+ if (!viewDetails || !("clip" in viewDetails)) {
5
+ return undefined;
6
+ }
7
+ const output = {};
8
+ applyExtraction(viewDetails, output, clipVectorLegacyMappings);
9
+ return output.clipVectors;
10
+ }
11
+ const clipPlaneLegacyMappings = [
12
+ extractSimpleArray(simpleTypeOf("number"), "normal"),
13
+ extractNumber("dist", "distance"),
14
+ extractBoolean("invisible"),
15
+ extractBoolean("interior"),
16
+ ];
17
+ const clipPrimitivePlaneLegacyMappings = [
18
+ extractObject([extractArray2d(clipPlaneLegacyMappings, "clips"), extractBoolean("invisible")], "planes"),
19
+ ];
20
+ const clipPrimitiveShapeLegacyMappings = [
21
+ extractObject([
22
+ extractSimpleArray(isPoint, "points"),
23
+ extractSimpleArray(isTransformRow, "trans", "transform"),
24
+ extractNumber("zlow", "zLow"),
25
+ extractNumber("zhigh", "zHigh"),
26
+ extractBoolean("mask"),
27
+ extractBoolean("invisible"),
28
+ ], "shape"),
29
+ ];
30
+ const clipVectorLegacyMappings = [
31
+ extractArrayConditionally([
32
+ { discriminator: "planes", mappings: clipPrimitivePlaneLegacyMappings },
33
+ { discriminator: "shape", mappings: clipPrimitiveShapeLegacyMappings },
34
+ ], "clip", "clipVectors"),
35
+ ];
36
+ function isPoint(val) {
37
+ return Array.isArray(val) && val.length === 3 && val.every((num) => typeof num === "number");
38
+ }
39
+ function isTransformRow(value) {
40
+ return Array.isArray(value) && value.length === 4 && value.every((num) => typeof num === "number");
41
+ }
@@ -1,4 +1,6 @@
1
+ import type { DisplayStyle3dProps, DisplayStyleProps } from "@itwin/core-common";
1
2
  import type { ViewState } from "@itwin/core-frontend";
3
+ import type { DisplayStyle3dSettingsProps, DisplayStyleSettingsProps } from "@itwin/saved-views-client";
2
4
  import { type ExtractionFunc } from "./extractionUtilities.js";
3
5
  export declare const featureAppearanceMappings: ExtractionFunc<void, void>[];
4
6
  export declare const featureAppearanceLegacyMappings: ExtractionFunc<void, void>[];
@@ -9,9 +11,6 @@ export declare const featureAppearanceLegacyMappings: ExtractionFunc<void, void>
9
11
  * @param viewState
10
12
  */
11
13
  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
- */
14
+ export declare function extractDisplayStyle2dFromLegacy(data: DisplayStyleProps): DisplayStyleSettingsProps;
17
15
  export declare const extractDisplayStyle3d: (data: object) => any;
16
+ export declare function extractDisplayStyle3dFromLegacy(data: DisplayStyle3dProps): DisplayStyle3dSettingsProps;
@@ -429,7 +429,7 @@ const displayStyle3dMapping = [
429
429
  const displayStyle3dLegacyMapping = [
430
430
  ...displayStylesLegacyMapping,
431
431
  extractObject(environmentLegacyMappings, "environment"),
432
- extractObject(ambientOcclusionMappings, "ambientOcclusion", "ao"),
432
+ extractObject(ambientOcclusionMappings, "ao", "ambientOcclusion"),
433
433
  extractObject(solarShadowMappings, "solarShadows"),
434
434
  extractObject(lightsMappings, "lights"),
435
435
  extractPlainTypedMap(planProjectionSettingsMappings, simpleTypeOf("string"), "planProjections"),
@@ -460,11 +460,12 @@ export const extractDisplayStyle = (data, viewState) => {
460
460
  }
461
461
  return output;
462
462
  };
463
- /**
464
- * Extracts the display style 3d from a legacy view displayStyle field
465
- * And transforms it into our schema
466
- * @param data
467
- */
463
+ export function extractDisplayStyle2dFromLegacy(data) {
464
+ const styles = data.jsonProperties?.styles;
465
+ const output = {};
466
+ applyExtraction(styles, output, displayStyle3dLegacyMapping);
467
+ return output;
468
+ }
468
469
  export const extractDisplayStyle3d = (data) => {
469
470
  let styles;
470
471
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -482,6 +483,12 @@ export const extractDisplayStyle3d = (data) => {
482
483
  }
483
484
  return output;
484
485
  };
486
+ export function extractDisplayStyle3dFromLegacy(data) {
487
+ const output = {};
488
+ const styles = data.jsonProperties?.styles;
489
+ applyExtraction(styles, output, displayStyle3dLegacyMapping);
490
+ return output;
491
+ }
485
492
  function appendAcsAndGridViewFlagsToOutput(drawingViewState,
486
493
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
487
494
  output) {
@@ -1,5 +1,5 @@
1
1
  import { SheetViewState, type DrawingViewState, type SpatialViewState } from "@itwin/core-frontend";
2
- import type { SavedViewWithDataRepresentation } from "@itwin/saved-views-client";
2
+ import type { SavedViewRepresentation } from "@itwin/saved-views-client";
3
3
  import type { LegacySavedView, LegacySavedView2d } from "../SavedViewTypes.js";
4
4
  /**
5
5
  * Extracts id from href
@@ -12,24 +12,24 @@ export declare const extractIdFromHref: (href: string) => string | undefined;
12
12
  * @param iModelViewData
13
13
  * @returns SavedView2d
14
14
  */
15
- export declare function savedViewItwinDrawingToLegacyDrawingView(savedViewRsp: SavedViewWithDataRepresentation, seedDrawingViewState: DrawingViewState): LegacySavedView2d;
15
+ export declare function savedViewItwinDrawingToLegacyDrawingView(savedViewRsp: SavedViewRepresentation, seedDrawingViewState: DrawingViewState): LegacySavedView2d;
16
16
  /**
17
17
  * Transform a ViewDataITwinSheet into a legacy SavedView if possible
18
18
  * @param savedViewRsp
19
19
  * @param seedSheetViewState
20
20
  * @returns SavedView2d
21
21
  */
22
- export declare function savedViewItwinSheetToLegacySheetSavedView(savedViewRsp: SavedViewWithDataRepresentation, seedSheetViewState: SheetViewState): LegacySavedView2d;
22
+ export declare function savedViewItwinSheetToLegacySheetSavedView(savedViewRsp: SavedViewRepresentation, seedSheetViewState: SheetViewState): LegacySavedView2d;
23
23
  /**
24
24
  * Transform a ViewDataItwin3d into a legacy SavedView if possible
25
25
  * @param savedViewRsp
26
26
  * @param seedSpatialViewState
27
27
  * @returns SavedView
28
28
  */
29
- export declare function savedViewITwin3dToLegacy3dSavedView(savedViewRsp: SavedViewWithDataRepresentation, seedSpatialViewState: SpatialViewState): LegacySavedView;
29
+ export declare function savedViewITwin3dToLegacy3dSavedView(savedViewRsp: SavedViewRepresentation, seedSpatialViewState: SpatialViewState): LegacySavedView;
30
30
  /**
31
31
  * removes null and undefined from legacy view model selectors props models
32
32
  * @param savedView
33
33
  * @returns SavedViewWithData
34
34
  */
35
- export declare const cleanLegacyViewModelSelectorPropsModels: (savedView: SavedViewWithDataRepresentation) => SavedViewWithDataRepresentation;
35
+ export declare const cleanLegacyViewModelSelectorPropsModels: (savedView: SavedViewRepresentation) => SavedViewRepresentation;
@@ -258,12 +258,7 @@ export function savedViewITwin3dToLegacy3dSavedView(savedViewRsp, seedSpatialVie
258
258
  appendHiddenModelsTo3dLegacySavedView(itwin3dView, legacyView);
259
259
  return legacyView;
260
260
  }
261
- /**
262
- * append Hidden Categories Or Models To Legacy Saved View
263
- * @param iTwinView new schema
264
- * @param legacyView
265
- * @returns iModelViewData
266
- */
261
+ /** Append Hidden Categories Or Models To Legacy Saved View. */
267
262
  function appendHiddenCategoriesToLegacyView(iTwinView, legacyView) {
268
263
  if (iTwinView.categories && iTwinView.categories.disabled) {
269
264
  legacyView.hiddenCategories = iTwinView.categories.disabled;
@@ -0,0 +1,13 @@
1
+ import { type Viewport } from "@itwin/core-frontend";
2
+ import { type ViewData } from "@itwin/saved-views-client";
3
+ interface CaptureSavedViewDataArgs {
4
+ /** Viewport to capture the view from. */
5
+ viewport: Viewport;
6
+ /**
7
+ * Collect a list of models and categories that are currently not enabled in the {@linkcode viewport}.
8
+ * @default true
9
+ */
10
+ captureHiddenModelsAndCategories?: boolean | undefined;
11
+ }
12
+ export declare function captureSavedViewData(args: CaptureSavedViewDataArgs): Promise<ViewData>;
13
+ export {};
@@ -0,0 +1,149 @@
1
+ import { QueryRowFormat } from "@itwin/core-common";
2
+ import { extractClipVectorsFromLegacy } from "./api/utilities/translation/clipVectorsLegacyExtractor.js";
3
+ import { extractDisplayStyle2dFromLegacy, extractDisplayStyle3dFromLegacy, } from "./api/utilities/translation/displayStyleExtractor.js";
4
+ export async function captureSavedViewData(args) {
5
+ const { captureHiddenModelsAndCategories = true } = args;
6
+ const hiddenCategoriesPromise = captureHiddenModelsAndCategories ? getHiddenCategories(args.viewport) : undefined;
7
+ if (args.viewport.view.isSpatialView()) {
8
+ const [hiddenCategories, hiddenModels] = await Promise.all([
9
+ hiddenCategoriesPromise,
10
+ captureHiddenModelsAndCategories ? getHiddenModels(args.viewport) : undefined,
11
+ ]);
12
+ return createSpatialSavedViewObject(args.viewport, hiddenCategories, hiddenModels);
13
+ }
14
+ if (args.viewport.view.isDrawingView()) {
15
+ return createDrawingSavedViewObject(args.viewport, await hiddenCategoriesPromise);
16
+ }
17
+ return createSheetSavedViewObject(args.viewport, await hiddenCategoriesPromise);
18
+ }
19
+ function createSpatialSavedViewObject(vp, hiddenCategories, hiddenModels) {
20
+ const viewState = vp.view;
21
+ const displayStyleProps = viewState.displayStyle.toJSON();
22
+ // Clear the timePoint if no schedule script is available on the viewState
23
+ if (viewState.is3d() && displayStyleProps.jsonProperties?.styles?.timePoint && !viewState.displayStyle.scheduleScript) {
24
+ displayStyleProps.jsonProperties.styles.timePoint = undefined;
25
+ }
26
+ // Omit the schedule script - may cause excessively large JSON.
27
+ if (displayStyleProps.jsonProperties?.styles?.scheduleScript) {
28
+ displayStyleProps.jsonProperties.styles.scheduleScript = undefined;
29
+ }
30
+ const viewDefinitionProps = viewState.toJSON();
31
+ return {
32
+ itwin3dView: {
33
+ origin: toArrayVector3d(viewDefinitionProps.origin),
34
+ extents: toArrayVector3d(viewDefinitionProps.extents),
35
+ angles: viewDefinitionProps.angles && toYawPitchRoll(viewDefinitionProps.angles),
36
+ camera: viewDefinitionProps.cameraOn ? {
37
+ lens: toDegrees(viewDefinitionProps.camera.lens) ?? 0,
38
+ focusDist: viewDefinitionProps.camera.focusDist,
39
+ eye: toArrayVector3d(viewDefinitionProps.camera.eye),
40
+ } : undefined,
41
+ categories: {
42
+ enabled: viewState.categorySelector.toJSON().categories,
43
+ disabled: hiddenCategories,
44
+ },
45
+ models: {
46
+ enabled: viewState.modelSelector.toJSON().models,
47
+ disabled: hiddenModels,
48
+ },
49
+ displayStyle: extractDisplayStyle3dFromLegacy(displayStyleProps),
50
+ clipVectors: extractClipVectorsFromLegacy(viewDefinitionProps),
51
+ },
52
+ };
53
+ }
54
+ function toArrayVector3d(xyzProps) {
55
+ if (Array.isArray(xyzProps)) {
56
+ return [xyzProps[0] ?? 0, xyzProps[1] ?? 0, xyzProps[2] ?? 0];
57
+ }
58
+ return [xyzProps.x ?? 0, xyzProps.y ?? 0, xyzProps.z ?? 0];
59
+ }
60
+ function toYawPitchRoll(angles) {
61
+ return {
62
+ yaw: angles.yaw !== undefined ? toDegrees(angles.yaw) : undefined,
63
+ pitch: angles.pitch !== undefined ? toDegrees(angles.pitch) : undefined,
64
+ roll: angles.roll !== undefined ? toDegrees(angles.roll) : undefined,
65
+ };
66
+ }
67
+ function createDrawingSavedViewObject(vp, hiddenCategories) {
68
+ const viewState = vp.view;
69
+ const viewDefinitionProps = viewState.toJSON();
70
+ return {
71
+ itwinDrawingView: {
72
+ modelExtents: {},
73
+ baseModelId: viewDefinitionProps.baseModelId,
74
+ origin: toArrayVector2d(viewDefinitionProps.origin),
75
+ delta: toArrayVector2d(viewDefinitionProps.delta),
76
+ angle: toDegrees(viewDefinitionProps.angle) ?? 0,
77
+ displayStyle: extractDisplayStyle2dFromLegacy(viewState.displayStyle.toJSON()),
78
+ categories: {
79
+ enabled: viewState.categorySelector.toJSON().categories,
80
+ disabled: hiddenCategories,
81
+ },
82
+ },
83
+ };
84
+ }
85
+ function createSheetSavedViewObject(vp, hiddenCategories) {
86
+ const viewState = vp.view;
87
+ const viewDefinitionProps = viewState.toJSON();
88
+ return {
89
+ itwinSheetView: {
90
+ baseModelId: viewDefinitionProps.baseModelId,
91
+ origin: toArrayVector2d(viewDefinitionProps.origin),
92
+ delta: toArrayVector2d(viewDefinitionProps.delta),
93
+ angle: toDegrees(viewDefinitionProps.angle) ?? 0,
94
+ displayStyle: extractDisplayStyle2dFromLegacy(viewState.displayStyle.toJSON()),
95
+ categories: {
96
+ enabled: viewState.categorySelector.toJSON().categories,
97
+ disabled: hiddenCategories,
98
+ },
99
+ width: viewState.sheetSize.x,
100
+ height: viewState.sheetSize.y,
101
+ sheetAttachments: viewState.attachmentIds,
102
+ },
103
+ };
104
+ }
105
+ function toArrayVector2d(xyzProps) {
106
+ if (Array.isArray(xyzProps)) {
107
+ return [xyzProps[0] ?? 0, xyzProps[1] ?? 0];
108
+ }
109
+ return [xyzProps.x ?? 0, xyzProps.y ?? 0];
110
+ }
111
+ function toDegrees(angle) {
112
+ if (typeof angle === "number") {
113
+ return angle;
114
+ }
115
+ if ("degrees" in angle) {
116
+ return angle.degrees;
117
+ }
118
+ if ("radians" in angle) {
119
+ return angle.radians * (180 / Math.PI);
120
+ }
121
+ return undefined;
122
+ }
123
+ async function getHiddenModels(vp) {
124
+ const allModels = await getAllModels(vp.iModel);
125
+ const visibleModels = new Set(vp.view.modelSelector.toJSON().models);
126
+ return allModels.map(({ id }) => id).filter((model) => !visibleModels.has(model));
127
+ }
128
+ async function getAllModels(iModel) {
129
+ // Note: IsNotSpatiallyLocated was introduced in a later version of the BisCore ECSchema. If the iModel has an earlier
130
+ // version, the statement will throw because the property does not exist. If the iModel was created from an earlier
131
+ // version and later upgraded to a newer version, the property may be NULL for models created prior to the upgrade.
132
+ try {
133
+ return await executeQuery(iModel, "SELECT ECInstanceId FROM Bis.GeometricModel3D WHERE IsPrivate = false AND IsTemplate = false AND (IsNotSpatiallyLocated IS NULL OR IsNotSpatiallyLocated = false)");
134
+ }
135
+ catch {
136
+ return executeQuery(iModel, "SELECT ECInstanceId FROM Bis.GeometricModel3D WHERE IsPrivate = false AND IsTemplate = false");
137
+ }
138
+ }
139
+ async function getHiddenCategories(vp) {
140
+ const visibleCategories = new Set(vp.view.categorySelector.toJSON().categories);
141
+ const allCategories = await getAllCategories(vp.iModel);
142
+ return allCategories.map(({ id }) => id).filter((category) => !visibleCategories.has(category));
143
+ }
144
+ async function getAllCategories(iModel) {
145
+ return executeQuery(iModel, "SELECT DISTINCT Category.Id AS id FROM BisCore.GeometricElement3d WHERE Category.Id IN (SELECT ECInstanceId FROM BisCore.SpatialCategory)");
146
+ }
147
+ async function executeQuery(iModel, query) {
148
+ return iModel.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames }).toArray();
149
+ }
@@ -0,0 +1,3 @@
1
+ import { type Viewport } from "@itwin/core-frontend";
2
+ /** Generates Saved View thumbnail based on what is currently visible in the {@linkcode viewport}. */
3
+ export declare function captureSavedViewThumbnail(viewport: Viewport, width?: number, height?: number): string | undefined;
@@ -0,0 +1,25 @@
1
+ import { getCenteredViewRect, imageBufferToCanvas } from "@itwin/core-frontend";
2
+ import { Point2d } from "@itwin/core-geometry";
3
+ /** Generates Saved View thumbnail based on what is currently visible in the {@linkcode viewport}. */
4
+ export function captureSavedViewThumbnail(viewport, width = 280, height = 200) {
5
+ const thumbnail = getThumbnail(viewport, width, height);
6
+ if (!thumbnail) {
7
+ return undefined;
8
+ }
9
+ const canvas = imageBufferToCanvas(thumbnail);
10
+ return canvas?.toDataURL("image/png", 1.0);
11
+ }
12
+ function getThumbnail(vp, width, height) {
13
+ const size = new Point2d(width, height);
14
+ // Passing in vp.target.viewRect instead of vp.viewRect because currently vp.viewRect is not updated correctly in some
15
+ // cases when a new dialog is created. The bottom property would be 2px higher than the renderRect in readImageBuffer
16
+ // which caused the method to return undefined. vp.target.viewRect allows us to have the correct dimensions when
17
+ // creating the thumbnail.
18
+ const thumbnail = vp.readImageBuffer({ rect: getCenteredViewRect(vp.target.viewRect), size });
19
+ if (thumbnail) {
20
+ return thumbnail;
21
+ }
22
+ // Since using vp.target.viewRect while creating thumbnail returns undefined for some, we switch back to using
23
+ // vp.viewRect
24
+ return vp.readImageBuffer({ rect: getCenteredViewRect(vp.viewRect), size });
25
+ }
package/lib/index.d.ts CHANGED
@@ -8,5 +8,7 @@ export type { SavedViewInfo, SavedViewsClient } from "./SavedViewsClient/SavedVi
8
8
  export { SavedViewsContextProvider, type SavedViewsContext } from "./SavedViewsContext.js";
9
9
  export { StickyExpandableBlock } from "./StickyExpandableBlock/StickyExpandableBlock.js";
10
10
  export { TileGrid } from "./TileGrid/TileGrid.js";
11
+ export { captureSavedViewData } from "./captureSavedViewData.js";
12
+ export { captureSavedViewThumbnail } from "./captureSavedViewThumbnail.js";
11
13
  export { defaultLocalization, type LocalizationStrings } from "./localization.js";
12
14
  export { useSavedViews, type SavedViewActions } from "./useSavedViews.js";
package/lib/index.js CHANGED
@@ -10,5 +10,7 @@ export { ITwinSavedViewsClient } from "./SavedViewsClient/ITwinSavedViewsClient.
10
10
  export { SavedViewsContextProvider } from "./SavedViewsContext.js";
11
11
  export { StickyExpandableBlock } from "./StickyExpandableBlock/StickyExpandableBlock.js";
12
12
  export { TileGrid } from "./TileGrid/TileGrid.js";
13
+ export { captureSavedViewData } from "./captureSavedViewData.js";
14
+ export { captureSavedViewThumbnail } from "./captureSavedViewThumbnail.js";
13
15
  export { defaultLocalization } from "./localization.js";
14
16
  export { useSavedViews } from "./useSavedViews.js";
@@ -25,7 +25,7 @@ interface UseSavedViewsResult {
25
25
  actions: SavedViewActions;
26
26
  }
27
27
  export interface SavedViewActions {
28
- createSavedView: (savedViewName: string, savedViewData: ViewData) => void;
28
+ createSavedView: (savedViewName: string, savedViewData: ViewData) => Promise<string>;
29
29
  renameSavedView: (savedViewId: string, newName: string) => void;
30
30
  shareSavedView: (savedViewId: string, share: boolean) => void;
31
31
  deleteSavedView: (savedViewId: string) => void;
@@ -38,6 +38,7 @@ export interface SavedViewActions {
38
38
  addTag: (savedViewId: string, tagId: string) => void;
39
39
  addNewTag: (savedViewId: string, tagName: string) => void;
40
40
  removeTag: (savedViewId: string, tagId: string) => void;
41
+ uploadThumbnail: (savedViewId: string, imageDataUrl: string) => void;
41
42
  }
42
43
  /**
43
44
  * Pulls Saved View data from a store and provides means to update and synchronize the data back to it. Interaction with
@@ -130,6 +130,7 @@ function createSavedViewActions(iTwinId, iModelId, client, setState, ref, onUpda
130
130
  signal,
131
131
  });
132
132
  updateSavedViews((savedViews) => savedViews.set(savedView.id, savedView));
133
+ return savedView.id;
133
134
  }),
134
135
  renameSavedView: actionWrapper(async (savedViewId, newName) => {
135
136
  let prevName;
@@ -395,43 +396,66 @@ function createSavedViewActions(iTwinId, iModelId, client, setState, ref, onUpda
395
396
  throw error;
396
397
  }
397
398
  }),
399
+ uploadThumbnail: actionWrapper(async (savedViewId, imageDataUrl) => {
400
+ let prevThumnbnail;
401
+ updateSavedView(savedViewId, (savedView) => {
402
+ prevThumnbnail = savedView.thumbnail;
403
+ savedView.thumbnail = imageDataUrl;
404
+ });
405
+ try {
406
+ await client.uploadThumbnail({ savedViewId, image: imageDataUrl, signal });
407
+ }
408
+ catch (error) {
409
+ if (prevThumnbnail !== undefined) {
410
+ const restoredDisplayName = prevThumnbnail;
411
+ updateSavedView(savedViewId, (savedView) => {
412
+ savedView.thumbnail = restoredDisplayName;
413
+ });
414
+ }
415
+ throw error;
416
+ }
417
+ }),
398
418
  };
399
- /** Serializes action execution and notifies when action processing begins and ends. Silences cancellation errors. */
419
+ /**
420
+ * Serializes action execution and notifies when action processing begins and ends. Continues to execute actions
421
+ * after cancellation.
422
+ */
400
423
  function actionWrapper(callback) {
401
424
  return async (...args) => {
402
- ref.current.actionQueue.push(async () => {
403
- if (signal.aborted) {
404
- return;
405
- }
406
- try {
407
- await callback(...args);
408
- }
409
- catch (error) {
410
- if (error && typeof error === "object" && "name" in error && error.name === "AbortError") {
411
- // It's a cancellation error
425
+ // eslint-disable-next-line no-async-promise-executor
426
+ return new Promise(async (resolve, reject) => {
427
+ ref.current.actionQueue.push(async () => {
428
+ if (signal.aborted) {
429
+ reject(signal.reason);
430
+ return;
412
431
  }
413
- else {
414
- throw error;
415
- }
416
- }
417
- });
418
- // If there are no other queued actions, start executing the queue
419
- if (ref.current.actionQueue.length === 1) {
420
- onUpdateInProgress();
421
- // By the time the first action completes, other actions may have been queued
422
- while (ref.current.actionQueue.length > 0) {
423
432
  try {
424
- await ref.current.actionQueue[0]();
433
+ resolve(await callback(...args));
425
434
  }
426
435
  catch (error) {
427
- onUpdateError(error);
436
+ reject(error);
437
+ if (error && typeof error === "object" && "name" in error && error.name === "AbortError") {
438
+ // It's a cancellation error, no need to report it
439
+ }
440
+ else {
441
+ try {
442
+ onUpdateError(error);
443
+ }
444
+ catch { }
445
+ }
428
446
  }
429
- finally {
447
+ });
448
+ // If there are no other queued actions, start executing the queue
449
+ if (ref.current.actionQueue.length === 1) {
450
+ onUpdateInProgress();
451
+ // By the time the first action completes, other actions may have been queued
452
+ while (ref.current.actionQueue.length > 0) {
453
+ await ref.current.actionQueue[0]();
430
454
  ref.current.actionQueue.shift();
431
455
  }
456
+ onUpdateComplete();
432
457
  }
433
- onUpdateComplete();
434
- }
458
+ });
435
459
  };
436
460
  }
437
461
  function updateSavedViews(callback) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/saved-views-react",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -13,6 +13,7 @@
13
13
  "url": "https://www.bentley.com"
14
14
  },
15
15
  "type": "module",
16
+ "types": "./lib/index.d.ts",
16
17
  "exports": {
17
18
  ".": {
18
19
  "types": "./lib/index.d.ts",
@@ -45,13 +46,14 @@
45
46
  "react": "^17.0.0",
46
47
  "react-dom": "^17.0.0",
47
48
  "recursive-readdir": "^2.2.3",
48
- "typescript": "^5.1.6",
49
- "vite": "^5.0.12",
50
- "vitest": "^1.0.4"
49
+ "typescript": "^5.3.3",
50
+ "vite": "^5.0.13",
51
+ "vitest": "^1.4.0"
51
52
  },
52
53
  "peerDependencies": {
53
54
  "@itwin/core-common": "^4.0.6",
54
55
  "@itwin/core-frontend": "^4.0.6",
56
+ "@itwin/core-geometry": "^4.0.6",
55
57
  "react": "^17.0.0 || ^18.0.0",
56
58
  "react-dom": "^17.0.0 || ^18.0.0"
57
59
  },