@itwin/unified-selection 0.2.0 → 0.4.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.
- package/CHANGELOG.md +169 -0
- package/README.md +34 -14
- package/lib/cjs/unified-selection/CachingHiliteSetProvider.d.ts +3 -7
- package/lib/cjs/unified-selection/CachingHiliteSetProvider.d.ts.map +1 -1
- package/lib/cjs/unified-selection/CachingHiliteSetProvider.js +14 -17
- package/lib/cjs/unified-selection/CachingHiliteSetProvider.js.map +1 -1
- package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts +91 -0
- package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts.map +1 -0
- package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.js +205 -0
- package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.js.map +1 -0
- package/lib/cjs/unified-selection/HiliteSetProvider.d.ts +2 -4
- package/lib/cjs/unified-selection/HiliteSetProvider.d.ts.map +1 -1
- package/lib/cjs/unified-selection/HiliteSetProvider.js +174 -131
- package/lib/cjs/unified-selection/HiliteSetProvider.js.map +1 -1
- package/lib/cjs/unified-selection/Selectable.d.ts +0 -3
- package/lib/cjs/unified-selection/Selectable.d.ts.map +1 -1
- package/lib/cjs/unified-selection/Selectable.js +2 -2
- package/lib/cjs/unified-selection/Selectable.js.map +1 -1
- package/lib/cjs/unified-selection/SelectionChangeEvent.d.ts +5 -3
- package/lib/cjs/unified-selection/SelectionChangeEvent.d.ts.map +1 -1
- package/lib/cjs/unified-selection/SelectionChangeEvent.js.map +1 -1
- package/lib/cjs/unified-selection/SelectionScope.d.ts +2 -2
- package/lib/cjs/unified-selection/SelectionScope.d.ts.map +1 -1
- package/lib/cjs/unified-selection/SelectionScope.js +87 -54
- package/lib/cjs/unified-selection/SelectionScope.js.map +1 -1
- package/lib/cjs/unified-selection/SelectionStorage.d.ts +20 -28
- package/lib/cjs/unified-selection/SelectionStorage.d.ts.map +1 -1
- package/lib/cjs/unified-selection/SelectionStorage.js +21 -18
- package/lib/cjs/unified-selection/SelectionStorage.js.map +1 -1
- package/lib/cjs/unified-selection/Utils.d.ts +7 -0
- package/lib/cjs/unified-selection/Utils.d.ts.map +1 -0
- package/lib/cjs/unified-selection/{queries/ECSqlCore.js → Utils.js} +2 -1
- package/lib/cjs/unified-selection/Utils.js.map +1 -0
- package/lib/cjs/unified-selection/types/IModel.d.ts +84 -0
- package/lib/cjs/unified-selection/types/IModel.d.ts.map +1 -0
- package/lib/cjs/unified-selection/types/IModel.js +24 -0
- package/lib/cjs/unified-selection/types/IModel.js.map +1 -0
- package/lib/cjs/unified-selection.d.ts +1 -6
- package/lib/cjs/unified-selection.d.ts.map +1 -1
- package/lib/cjs/unified-selection.js +3 -7
- package/lib/cjs/unified-selection.js.map +1 -1
- package/lib/esm/unified-selection/CachingHiliteSetProvider.d.ts +3 -7
- package/lib/esm/unified-selection/CachingHiliteSetProvider.d.ts.map +1 -1
- package/lib/esm/unified-selection/CachingHiliteSetProvider.js +14 -17
- package/lib/esm/unified-selection/CachingHiliteSetProvider.js.map +1 -1
- package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts +91 -0
- package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts.map +1 -0
- package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.js +200 -0
- package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.js.map +1 -0
- package/lib/esm/unified-selection/HiliteSetProvider.d.ts +2 -4
- package/lib/esm/unified-selection/HiliteSetProvider.d.ts.map +1 -1
- package/lib/esm/unified-selection/HiliteSetProvider.js +174 -131
- package/lib/esm/unified-selection/HiliteSetProvider.js.map +1 -1
- package/lib/esm/unified-selection/Selectable.d.ts +0 -3
- package/lib/esm/unified-selection/Selectable.d.ts.map +1 -1
- package/lib/esm/unified-selection/Selectable.js.map +1 -1
- package/lib/esm/unified-selection/SelectionChangeEvent.d.ts +5 -3
- package/lib/esm/unified-selection/SelectionChangeEvent.d.ts.map +1 -1
- package/lib/esm/unified-selection/SelectionChangeEvent.js.map +1 -1
- package/lib/esm/unified-selection/SelectionScope.d.ts +2 -2
- package/lib/esm/unified-selection/SelectionScope.d.ts.map +1 -1
- package/lib/esm/unified-selection/SelectionScope.js +84 -51
- package/lib/esm/unified-selection/SelectionScope.js.map +1 -1
- package/lib/esm/unified-selection/SelectionStorage.d.ts +20 -28
- package/lib/esm/unified-selection/SelectionStorage.d.ts.map +1 -1
- package/lib/esm/unified-selection/SelectionStorage.js +21 -18
- package/lib/esm/unified-selection/SelectionStorage.js.map +1 -1
- package/lib/esm/unified-selection/Utils.d.ts +7 -0
- package/lib/esm/unified-selection/Utils.d.ts.map +1 -0
- package/lib/esm/unified-selection/{queries/ECSqlCore.js → Utils.js} +2 -1
- package/lib/esm/unified-selection/Utils.js.map +1 -0
- package/lib/esm/unified-selection/types/IModel.d.ts +84 -0
- package/lib/esm/unified-selection/types/IModel.d.ts.map +1 -0
- package/lib/esm/unified-selection/types/IModel.js +21 -0
- package/lib/esm/unified-selection/types/IModel.js.map +1 -0
- package/lib/esm/unified-selection.d.ts +1 -6
- package/lib/esm/unified-selection.d.ts.map +1 -1
- package/lib/esm/unified-selection.js +1 -6
- package/lib/esm/unified-selection.js.map +1 -1
- package/package.json +23 -16
- package/lib/cjs/unified-selection/queries/ECMetadata.d.ts +0 -44
- package/lib/cjs/unified-selection/queries/ECMetadata.d.ts.map +0 -1
- package/lib/cjs/unified-selection/queries/ECMetadata.js +0 -17
- package/lib/cjs/unified-selection/queries/ECMetadata.js.map +0 -1
- package/lib/cjs/unified-selection/queries/ECSqlCore.d.ts +0 -69
- package/lib/cjs/unified-selection/queries/ECSqlCore.d.ts.map +0 -1
- package/lib/cjs/unified-selection/queries/ECSqlCore.js.map +0 -1
- package/lib/esm/unified-selection/queries/ECMetadata.d.ts +0 -44
- package/lib/esm/unified-selection/queries/ECMetadata.d.ts.map +0 -1
- package/lib/esm/unified-selection/queries/ECMetadata.js +0 -13
- package/lib/esm/unified-selection/queries/ECMetadata.js.map +0 -1
- package/lib/esm/unified-selection/queries/ECSqlCore.d.ts +0 -69
- package/lib/esm/unified-selection/queries/ECSqlCore.d.ts.map +0 -1
- package/lib/esm/unified-selection/queries/ECSqlCore.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,174 @@
|
|
|
1
1
|
# @itwin/unified-selection
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#558](https://github.com/iTwin/presentation/pull/558): Switched from `ECSchemaProvider` to `ECClassHierarchyInspector`, where appropriate.
|
|
8
|
+
|
|
9
|
+
Some of the APIs were accepting `ECSchemaProvider` as a parameter and used it to only inspect class hierarchy. This change switches them to accept `ECClassHierarchyInspector` instead - this reduces the surface area of the API and makes it more clear that only class hierarchy is being inspected, while also possibly improving performance.
|
|
10
|
+
|
|
11
|
+
This is a breaking change for the following APIs:
|
|
12
|
+
|
|
13
|
+
- `createHiliteSetProvider` prop `imodelAccess`.
|
|
14
|
+
- `createCachingHiliteSetProvider` prop `imodelProvider`.
|
|
15
|
+
- `enableUnifiedSelectionSyncWithIModel` prop `imodelAccess`.
|
|
16
|
+
|
|
17
|
+
Migration example:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import {
|
|
21
|
+
createECSqlQueryExecutor,
|
|
22
|
+
createECSchemaProvider,
|
|
23
|
+
} from "@itwin/presentation-core-interop";
|
|
24
|
+
import { createCachingECClassHierarchyInspector } from "@itwin/presentation-shared";
|
|
25
|
+
import { createHiliteSetProvider } from "@itwin/unified-selection";
|
|
26
|
+
|
|
27
|
+
// before:
|
|
28
|
+
const hiliteProvider = createHiliteSetProvider({
|
|
29
|
+
imodelAccess: {
|
|
30
|
+
...createECSqlQueryExecutor(imodel),
|
|
31
|
+
...createECSchemaProvider(MyAppFrontend.getSchemaContext(imodel)),
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// after:
|
|
36
|
+
const hiliteProvider = createHiliteSetProvider({
|
|
37
|
+
imodelAccess: {
|
|
38
|
+
...createECSqlQueryExecutor(imodel),
|
|
39
|
+
...createCachingECClassHierarchyInspector({
|
|
40
|
+
schemaProvider: createECSchemaProvider(
|
|
41
|
+
MyAppFrontend.getSchemaContext(imodel),
|
|
42
|
+
),
|
|
43
|
+
cacheSize: 100,
|
|
44
|
+
}),
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Patch Changes
|
|
50
|
+
|
|
51
|
+
- [#557](https://github.com/iTwin/presentation/pull/557): Fixed `computeSelection` returning duplicate selectables when using `Functional` selection scope and non-3D elements.
|
|
52
|
+
|
|
53
|
+
## 0.3.0
|
|
54
|
+
|
|
55
|
+
### Minor Changes
|
|
56
|
+
|
|
57
|
+
- [#530](https://github.com/iTwin/presentation/pull/530): Added `enableUnifiedSelectionSyncWithIModel` for enabling synchronization between iModel's tool selection and unified selection storage.
|
|
58
|
+
- [#544](https://github.com/iTwin/presentation/pull/544): Breaking API changes
|
|
59
|
+
|
|
60
|
+
- The type of ECSQL query executor's `createQueryReader` function was changed from:
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
// createQueryReader(ecsql: string, bindings?: ECSqlBinding[], config?: ECSqlQueryReaderOptions): ECSqlQueryReader;
|
|
64
|
+
// usage:
|
|
65
|
+
const reader = executor.createQueryReader(
|
|
66
|
+
`
|
|
67
|
+
WITH RECURSIVE
|
|
68
|
+
ChildElements(ECInstanceId) AS (
|
|
69
|
+
SELECT ECInstanceId FROM bis.Element WHERE Parent.Id = ?
|
|
70
|
+
UNION ALL
|
|
71
|
+
SELECT c.ECInstanceId FROM bis.Element c JOIN ChildElements p ON c.Parent.Id = p.ECInstanceId
|
|
72
|
+
)
|
|
73
|
+
SELECT * FROM ChildElements
|
|
74
|
+
`,
|
|
75
|
+
[{ type: "id", value: "0x1" }],
|
|
76
|
+
{ rowFormat: "Indexes" },
|
|
77
|
+
);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
to:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
// createQueryReader(query: { ctes?: string; ecsql: string; bindings?: ECSqlBinding[] }, config?: ECSqlQueryReaderOptions): ECSqlQueryReader;
|
|
84
|
+
// usage:
|
|
85
|
+
const reader = executor.createQueryReader(
|
|
86
|
+
{
|
|
87
|
+
ctes: [
|
|
88
|
+
`
|
|
89
|
+
ChildElements(ECInstanceId) AS (
|
|
90
|
+
SELECT ECInstanceId FROM bis.Element WHERE Parent.Id = ?
|
|
91
|
+
UNION ALL
|
|
92
|
+
SELECT c.ECInstanceId FROM bis.Element c JOIN ChildElements p ON c.Parent.Id = p.ECInstanceId
|
|
93
|
+
)
|
|
94
|
+
`,
|
|
95
|
+
],
|
|
96
|
+
ecsql: "SELECT * FROM ChildElements",
|
|
97
|
+
bindings: [{ type: "id", value: "0x1" }],
|
|
98
|
+
},
|
|
99
|
+
{ rowFormat: "Indexes" },
|
|
100
|
+
);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
This makes the API consistent with other Presentation packages and allows additional manipulation on ECSQL, which was not possible previously when ECSQL contained CTEs.
|
|
104
|
+
|
|
105
|
+
The change affects the following public APIs:
|
|
106
|
+
|
|
107
|
+
- `computeSelection` (`queryExecutor` prop),
|
|
108
|
+
- `createHiliteSetProvider` (previously `queryExecutor` prop, now `imodelAccess` prop),
|
|
109
|
+
- `createCachingHiliteSetProvider` (`iModelProvider` prop).
|
|
110
|
+
|
|
111
|
+
- `createHiliteSetProvider` function props `queryExecutor` and `schemaProvider` were merged into a single `imodelAccess` prop with merged type.
|
|
112
|
+
|
|
113
|
+
Previously:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
createHiliteSetProvider({
|
|
117
|
+
queryExecutor: createECSqlQueryExecutor(iModel),
|
|
118
|
+
schemaProvider: createECSchemaProvider(iModel),
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Now:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
createHiliteSetProvider({
|
|
126
|
+
imodelAccess: {
|
|
127
|
+
...createECSqlQueryExecutor(iModel),
|
|
128
|
+
...createECSchemaProvider(iModel),
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
- `createCachingHiliteSetProvider` function prop `iModelProvider` was changed to return an object of merged type `ECSchemaProvider & ECSqlQueryExecutor` rather than `{ queryExecutor: ECSqlQueryExecutor; schemaProvider: ECSchemaProvider }`.
|
|
134
|
+
|
|
135
|
+
Previously:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
createCachingHiliteSetProvider({
|
|
139
|
+
selectionStorage,
|
|
140
|
+
iModelProvider: (key) => ({
|
|
141
|
+
queryExecutor: createECSqlQueryExecutor(iModel),
|
|
142
|
+
schemaProvider: createECSchemaProvider(iModel),
|
|
143
|
+
}),
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Now:
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
createCachingHiliteSetProvider({
|
|
151
|
+
selectionStorage,
|
|
152
|
+
iModelProvider: (key) => ({
|
|
153
|
+
...createECSqlQueryExecutor(iModel),
|
|
154
|
+
...createECSchemaProvider(iModel),
|
|
155
|
+
}),
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
- [#551](https://github.com/iTwin/presentation/pull/551): Changed `iModel` in attribute names to `imodel`. The change was made to be consistent with other Presentation packages and affects the following APIs:
|
|
160
|
+
|
|
161
|
+
- `SelectionStorage` methods now accept `imodelKey` prop rather than `iModelKey`. It's `selectionChangeEvent` is also now raised with `imodelKey` prop in `StorageSelectionChangeEventArgs`.
|
|
162
|
+
- `CachingHiliteSetProvider.getHiliteSet` now accepts an `imodelKey` prop rather than `iModelKey`.
|
|
163
|
+
- `createCachingHiliteSetProvider` props now accept `imodelProvider` callback rather than `iModelProvider`.
|
|
164
|
+
|
|
165
|
+
- [#553](https://github.com/iTwin/presentation/pull/553): Expose types from `@itwin/presentation-shared` rather than having our own copies.
|
|
166
|
+
|
|
167
|
+
### Patch Changes
|
|
168
|
+
|
|
169
|
+
- Updated dependencies:
|
|
170
|
+
- @itwin/presentation-shared@0.1.0
|
|
171
|
+
|
|
3
172
|
## 0.2.0
|
|
4
173
|
|
|
5
174
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -32,14 +32,14 @@ const unifiedSelection = createStore();
|
|
|
32
32
|
|
|
33
33
|
// the store should to be cleaned up when iModels are closed to free up memory, e.g.:
|
|
34
34
|
import { IModelConnection } from "@itwin/core-frontend";
|
|
35
|
-
IModelConnection.onClose.addListener((
|
|
36
|
-
unifiedSelection.clearStorage(
|
|
35
|
+
IModelConnection.onClose.addListener((imodel) => {
|
|
36
|
+
unifiedSelection.clearStorage(imodel.key);
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
// add a demo selection listener
|
|
40
40
|
import { Selectables } from "@itwin/unified-selection";
|
|
41
|
-
unifiedSelection.selectionChangeEvent.addListener(({
|
|
42
|
-
const suffix = `in ${
|
|
41
|
+
unifiedSelection.selectionChangeEvent.addListener(({ imodelKey, source, changeType, selectables }) => {
|
|
42
|
+
const suffix = `in ${imodelKey} iModel from ${source} component`;
|
|
43
43
|
const numSelectables = Selectables.size(selectables);
|
|
44
44
|
switch (changeType) {
|
|
45
45
|
case "add":
|
|
@@ -58,8 +58,8 @@ unifiedSelection.selectionChangeEvent.addListener(({ iModelKey, source, changeTy
|
|
|
58
58
|
});
|
|
59
59
|
|
|
60
60
|
// in some component
|
|
61
|
-
MyComponent.onECInstanceSelected((
|
|
62
|
-
unifiedSelection.addToSelection({
|
|
61
|
+
MyComponent.onECInstanceSelected((imodel: IModelConnection, key: { className: string; id: Id64String }) => {
|
|
62
|
+
unifiedSelection.addToSelection({ imodelKey: imodel.key, source: "MyComponent", selectables: [key] });
|
|
63
63
|
});
|
|
64
64
|
```
|
|
65
65
|
|
|
@@ -109,11 +109,13 @@ The `@itwin/unified-selection` package delivers APIs for creating a `HiliteSet`
|
|
|
109
109
|
```ts
|
|
110
110
|
// Components may want to get a hilite set for arbitrary set of Selectables - use `createHiliteSetProvider` for that.
|
|
111
111
|
import { IModelConnection } from "@itwin/core-frontend";
|
|
112
|
-
import { createECSqlQueryExecutor,
|
|
112
|
+
import { createECSqlQueryExecutor, createECSchemaProvider } from "@itwin/presentation-core-interop";
|
|
113
113
|
import { createHiliteSetProvider } from "@itwin/unified-selection";
|
|
114
114
|
const hiliteProvider = createHiliteSetProvider({
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
imodelAccess: {
|
|
116
|
+
...createECSchemaProvider(imodel),
|
|
117
|
+
...createECSqlQueryExecutor(imodel),
|
|
118
|
+
},
|
|
117
119
|
});
|
|
118
120
|
const hiliteSet = await hiliteProvider.getHiliteSet({ selectables });
|
|
119
121
|
|
|
@@ -121,11 +123,8 @@ const hiliteSet = await hiliteProvider.getHiliteSet({ selectables });
|
|
|
121
123
|
// recommended to keep a single instance of this provider per application as it caches hilite sets per each iModel's selection.
|
|
122
124
|
import { createCachingHiliteSetProvider } from "@itwin/unified-selection";
|
|
123
125
|
const selectionHiliteProvider = createCachingHiliteSetProvider({
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
queryExecutor: IECSqlQueryExecutor;
|
|
127
|
-
metadataProvider: IMetadataProvider;
|
|
128
|
-
},
|
|
126
|
+
selectionStorage,
|
|
127
|
+
imodelProvider: (imodelKey: string) => getIModelByKey(imodelKey),
|
|
129
128
|
});
|
|
130
129
|
const selectionHiliteSet = await selectionHiliteProvider.getHiliteSet({ imodel.key });
|
|
131
130
|
// The caching provider registers a selection change listener and should be disposed, in case its lifetime
|
|
@@ -166,3 +165,24 @@ const queryExecutor = createECSqlQueryExecutor(imodel);
|
|
|
166
165
|
// Returns the parent element, or the element itself if it does not have a parent, for each element specified in `elementIds` argument.
|
|
167
166
|
const selection = computeSelection({ queryExecutor, elementIds, scope: { id: "element", ancestorLevel: 1 } });
|
|
168
167
|
```
|
|
168
|
+
|
|
169
|
+
## iModel selection synchronization with unified selection
|
|
170
|
+
|
|
171
|
+
The `@itwin/unified-selection` package delivers a `enableUnifiedSelectionSyncWithIModel` function to enable selection synchronization between an iModel and a `SelectionStorage`. When called, it returns a cleanup function that should be used to disable the synchronization. There should only be one active synchronization between a single iModel and a `SelectionStorage` at a given time. For example, this function could be used inside a `useEffect` hook in a component that holds an iModel:
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
import { createECSqlQueryExecutor, createECSchemaProvider } from "@itwin/presentation-core-interop";
|
|
175
|
+
useEffect(() => {
|
|
176
|
+
return enableUnifiedSelectionSyncWithIModel({
|
|
177
|
+
imodelAccess: {
|
|
178
|
+
...createECSqlQueryExecutor(imodel),
|
|
179
|
+
...createECSchemaProvider(imodel),
|
|
180
|
+
key: imodel.key,
|
|
181
|
+
hiliteSet: imodel.hilited,
|
|
182
|
+
selectionSet: imodel.selectionSet,
|
|
183
|
+
},
|
|
184
|
+
selectionStorage,
|
|
185
|
+
activeScopeProvider: () => "element",
|
|
186
|
+
});
|
|
187
|
+
}, [imodel]);
|
|
188
|
+
```
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
+
import { ECClassHierarchyInspector, ECSqlQueryExecutor } from "@itwin/presentation-shared";
|
|
1
2
|
import { HiliteSet } from "./HiliteSetProvider";
|
|
2
|
-
import { IMetadataProvider } from "./queries/ECMetadata";
|
|
3
|
-
import { IECSqlQueryExecutor } from "./queries/ECSqlCore";
|
|
4
3
|
import { SelectionStorage } from "./SelectionStorage";
|
|
5
4
|
/**
|
|
6
5
|
* Props for creating a `CachingHiliteSetProvider` instance.
|
|
@@ -8,10 +7,7 @@ import { SelectionStorage } from "./SelectionStorage";
|
|
|
8
7
|
*/
|
|
9
8
|
export interface CachingHiliteSetProviderProps {
|
|
10
9
|
selectionStorage: SelectionStorage;
|
|
11
|
-
|
|
12
|
-
queryExecutor: IECSqlQueryExecutor;
|
|
13
|
-
metadataProvider: IMetadataProvider;
|
|
14
|
-
};
|
|
10
|
+
imodelProvider: (imodelKey: string) => ECClassHierarchyInspector & ECSqlQueryExecutor;
|
|
15
11
|
}
|
|
16
12
|
/**
|
|
17
13
|
* Defines return value of `createCachingHiliteSetProvider`.
|
|
@@ -23,7 +19,7 @@ export interface CachingHiliteSetProvider {
|
|
|
23
19
|
/** Get the current hilite set iterator for the specified imodel */
|
|
24
20
|
getHiliteSet(props: {
|
|
25
21
|
/** iModel to get hilite set for */
|
|
26
|
-
|
|
22
|
+
imodelKey: string;
|
|
27
23
|
}): AsyncIterableIterator<HiliteSet>;
|
|
28
24
|
/** Disposes the cache. */
|
|
29
25
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CachingHiliteSetProvider.d.ts","sourceRoot":"","sources":["../../../src/unified-selection/CachingHiliteSetProvider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CachingHiliteSetProvider.d.ts","sourceRoot":"","sources":["../../../src/unified-selection/CachingHiliteSetProvider.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAA2B,SAAS,EAAqB,MAAM,qBAAqB,CAAC;AAE5F,OAAO,EAAuC,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3F;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,yBAAyB,GAAG,kBAAkB,CAAC;CACvF;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,mEAAmE;IACnE,YAAY,CAAC,KAAK,EAAE;QAClB,mCAAmC;QACnC,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAErC,0BAA0B;IAC1B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,6BAA6B,GAAG,wBAAwB,CAE7G"}
|
|
@@ -5,9 +5,6 @@
|
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.createCachingHiliteSetProvider = void 0;
|
|
8
|
-
/** @packageDocumentation
|
|
9
|
-
* @module UnifiedSelection
|
|
10
|
-
*/
|
|
11
8
|
const rxjs_1 = require("rxjs");
|
|
12
9
|
const rxjs_for_await_1 = require("rxjs-for-await");
|
|
13
10
|
const HiliteSetProvider_1 = require("./HiliteSetProvider");
|
|
@@ -26,25 +23,25 @@ class CachingHiliteSetProviderImpl {
|
|
|
26
23
|
_hiliteSetProviders = new Map();
|
|
27
24
|
_cache = new Map();
|
|
28
25
|
_removeListener;
|
|
29
|
-
|
|
26
|
+
_imodelProvider;
|
|
30
27
|
constructor(props) {
|
|
31
28
|
this._selectionStorage = props.selectionStorage;
|
|
32
|
-
this.
|
|
29
|
+
this._imodelProvider = props.imodelProvider;
|
|
33
30
|
this._removeListener = this._selectionStorage.selectionChangeEvent.addListener((args) => {
|
|
34
|
-
this._cache.delete(args.
|
|
31
|
+
this._cache.delete(args.imodelKey);
|
|
35
32
|
if (args.changeType === "clear" && args.source === SelectionStorage_1.IMODEL_CLOSE_SELECTION_CLEAR_SOURCE) {
|
|
36
|
-
this._hiliteSetProviders.delete(args.
|
|
33
|
+
this._hiliteSetProviders.delete(args.imodelKey);
|
|
37
34
|
}
|
|
38
35
|
});
|
|
39
36
|
}
|
|
40
|
-
getHiliteSet({
|
|
41
|
-
const
|
|
42
|
-
const provider = this.getHiliteSetProvider(
|
|
43
|
-
let hiliteSet = this._cache.get(
|
|
37
|
+
getHiliteSet({ imodelKey }) {
|
|
38
|
+
const imodelAccess = this._imodelProvider(imodelKey);
|
|
39
|
+
const provider = this.getHiliteSetProvider(imodelKey, imodelAccess);
|
|
40
|
+
let hiliteSet = this._cache.get(imodelKey);
|
|
44
41
|
if (!hiliteSet) {
|
|
45
|
-
const selectables = this._selectionStorage.getSelection({
|
|
42
|
+
const selectables = this._selectionStorage.getSelection({ imodelKey });
|
|
46
43
|
hiliteSet = (0, rxjs_1.from)(provider.getHiliteSet({ selectables })).pipe((0, rxjs_1.shareReplay)({ refCount: true }));
|
|
47
|
-
this._cache.set(
|
|
44
|
+
this._cache.set(imodelKey, hiliteSet);
|
|
48
45
|
}
|
|
49
46
|
return (0, rxjs_for_await_1.eachValueFrom)(hiliteSet);
|
|
50
47
|
}
|
|
@@ -53,11 +50,11 @@ class CachingHiliteSetProviderImpl {
|
|
|
53
50
|
this._hiliteSetProviders = new Map();
|
|
54
51
|
this._cache = new Map();
|
|
55
52
|
}
|
|
56
|
-
getHiliteSetProvider(
|
|
57
|
-
let provider = this._hiliteSetProviders.get(
|
|
53
|
+
getHiliteSetProvider(imodelKey, imodelAccess) {
|
|
54
|
+
let provider = this._hiliteSetProviders.get(imodelKey);
|
|
58
55
|
if (!provider) {
|
|
59
|
-
provider = (0, HiliteSetProvider_1.createHiliteSetProvider)({
|
|
60
|
-
this._hiliteSetProviders.set(
|
|
56
|
+
provider = (0, HiliteSetProvider_1.createHiliteSetProvider)({ imodelAccess });
|
|
57
|
+
this._hiliteSetProviders.set(imodelKey, provider);
|
|
61
58
|
}
|
|
62
59
|
return provider;
|
|
63
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CachingHiliteSetProvider.js","sourceRoot":"","sources":["../../../src/unified-selection/CachingHiliteSetProvider.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG
|
|
1
|
+
{"version":3,"file":"CachingHiliteSetProvider.js","sourceRoot":"","sources":["../../../src/unified-selection/CachingHiliteSetProvider.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,+BAAqD;AACrD,mDAA+C;AAE/C,2DAA4F;AAE5F,yDAA2F;AA4B3F;;;;GAIG;AACH,SAAgB,8BAA8B,CAAC,KAAoC;IACjF,OAAO,IAAI,4BAA4B,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAFD,wEAEC;AAED,MAAM,4BAA4B;IACxB,iBAAiB,CAAmB;IACpC,mBAAmB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC3D,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;IAClD,eAAe,CAAa;IAC5B,eAAe,CAAwE;IAE/F,YAAY,KAAoC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,IAAqC,EAAE,EAAE;YACvH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,sDAAmC,EAAE,CAAC;gBACvF,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,EAAE,SAAS,EAAyB;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACpE,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACvE,SAAS,GAAG,IAAA,WAAI,EAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAA,kBAAW,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/F,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,IAAA,8BAAa,EAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC;IAEO,oBAAoB,CAAC,SAAiB,EAAE,YAA4D;QAC1G,IAAI,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAA,2CAAuB,EAAC,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { from, Observable, shareReplay } from \"rxjs\";\nimport { eachValueFrom } from \"rxjs-for-await\";\nimport { ECClassHierarchyInspector, ECSqlQueryExecutor } from \"@itwin/presentation-shared\";\nimport { createHiliteSetProvider, HiliteSet, HiliteSetProvider } from \"./HiliteSetProvider\";\nimport { StorageSelectionChangeEventArgs } from \"./SelectionChangeEvent\";\nimport { IMODEL_CLOSE_SELECTION_CLEAR_SOURCE, SelectionStorage } from \"./SelectionStorage\";\n\n/**\n * Props for creating a `CachingHiliteSetProvider` instance.\n * @internal Not exported through barrel, but used in public API as an argument. May be supplemented with optional attributes any time.\n */\nexport interface CachingHiliteSetProviderProps {\n selectionStorage: SelectionStorage;\n imodelProvider: (imodelKey: string) => ECClassHierarchyInspector & ECSqlQueryExecutor;\n}\n\n/**\n * Defines return value of `createCachingHiliteSetProvider`.\n *\n * @beta Used in public API as a return value. Not expected to be created / extended by package\n * consumers, may be supplemented with required attributes any time.\n */\nexport interface CachingHiliteSetProvider {\n /** Get the current hilite set iterator for the specified imodel */\n getHiliteSet(props: {\n /** iModel to get hilite set for */\n imodelKey: string;\n }): AsyncIterableIterator<HiliteSet>;\n\n /** Disposes the cache. */\n dispose(): void;\n}\n\n/**\n * Creates a hilite set provider that caches hilite set for current selection for given iModel so any subsequent\n * hilite set requests for the same iModel don't cost until selection in given selection storage changes.\n * @beta\n */\nexport function createCachingHiliteSetProvider(props: CachingHiliteSetProviderProps): CachingHiliteSetProvider {\n return new CachingHiliteSetProviderImpl(props);\n}\n\nclass CachingHiliteSetProviderImpl implements CachingHiliteSetProvider {\n private _selectionStorage: SelectionStorage;\n private _hiliteSetProviders = new Map<string, HiliteSetProvider>();\n private _cache = new Map<string, Observable<HiliteSet>>();\n private _removeListener: () => void;\n private _imodelProvider: (imodelKey: string) => ECClassHierarchyInspector & ECSqlQueryExecutor;\n\n constructor(props: CachingHiliteSetProviderProps) {\n this._selectionStorage = props.selectionStorage;\n this._imodelProvider = props.imodelProvider;\n this._removeListener = this._selectionStorage.selectionChangeEvent.addListener((args: StorageSelectionChangeEventArgs) => {\n this._cache.delete(args.imodelKey);\n if (args.changeType === \"clear\" && args.source === IMODEL_CLOSE_SELECTION_CLEAR_SOURCE) {\n this._hiliteSetProviders.delete(args.imodelKey);\n }\n });\n }\n\n public getHiliteSet({ imodelKey }: { imodelKey: string }): AsyncIterableIterator<HiliteSet> {\n const imodelAccess = this._imodelProvider(imodelKey);\n const provider = this.getHiliteSetProvider(imodelKey, imodelAccess);\n let hiliteSet = this._cache.get(imodelKey);\n\n if (!hiliteSet) {\n const selectables = this._selectionStorage.getSelection({ imodelKey });\n hiliteSet = from(provider.getHiliteSet({ selectables })).pipe(shareReplay({ refCount: true }));\n this._cache.set(imodelKey, hiliteSet);\n }\n\n return eachValueFrom(hiliteSet);\n }\n\n public dispose(): void {\n this._removeListener();\n this._hiliteSetProviders = new Map();\n this._cache = new Map();\n }\n\n private getHiliteSetProvider(imodelKey: string, imodelAccess: ECClassHierarchyInspector & ECSqlQueryExecutor) {\n let provider = this._hiliteSetProviders.get(imodelKey);\n if (!provider) {\n provider = createHiliteSetProvider({ imodelAccess });\n this._hiliteSetProviders.set(imodelKey, provider);\n }\n return provider;\n }\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ECClassHierarchyInspector, ECSqlQueryExecutor } from "@itwin/presentation-shared";
|
|
2
|
+
import { CachingHiliteSetProvider } from "./CachingHiliteSetProvider";
|
|
3
|
+
import { ComputeSelectionProps } from "./SelectionScope";
|
|
4
|
+
import { SelectionStorage } from "./SelectionStorage";
|
|
5
|
+
import { CoreIModelHiliteSet, CoreIModelSelectionSet } from "./types/IModel";
|
|
6
|
+
/**
|
|
7
|
+
* Props for `enableUnifiedSelectionSyncWithIModel`.
|
|
8
|
+
* @internal Not exported through barrel, but used in public API as an argument. May be supplemented with optional attributes any time.
|
|
9
|
+
*/
|
|
10
|
+
export interface EnableUnifiedSelectionSyncWithIModelProps {
|
|
11
|
+
/**
|
|
12
|
+
* Provides access to different iModel's features: query executing, class hierarchy, selection and hilite sets.
|
|
13
|
+
* It's recommended to use `@itwin/presentation-core-interop` to create `ECSqlQueryExecutor` and `ECSchemaProvider` from
|
|
14
|
+
* [IModelConnection](https://www.itwinjs.org/reference/core-frontend/imodelconnection/imodelconnection/) and map its `key`,
|
|
15
|
+
* `hilited` and `selectionSet` attributes like this:
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { createECSqlQueryExecutor, createECSchemaProvider } from "@itwin/presentation-core-interop";
|
|
19
|
+
* import { createCachingECClassHierarchyInspector } from "@itwin/presentation-shared";
|
|
20
|
+
* import { IModelConnection } from "@itwin/core-frontend";
|
|
21
|
+
*
|
|
22
|
+
* const imodel: IModelConnection = ...
|
|
23
|
+
* const imodelAccess = {
|
|
24
|
+
* ...createECSqlQueryExecutor(imodel),
|
|
25
|
+
* ...createCachingECClassHierarchyInspector({ schemaProvider: createECSchemaProvider(MyAppFrontend.getSchemaContext(imodel)) }),
|
|
26
|
+
* key: imodel.key,
|
|
27
|
+
* hiliteSet: imodel.hilited,
|
|
28
|
+
* selectionSet: imodel.selectionSet,
|
|
29
|
+
* };
|
|
30
|
+
* ```.
|
|
31
|
+
*/
|
|
32
|
+
imodelAccess: ECSqlQueryExecutor & ECClassHierarchyInspector & {
|
|
33
|
+
/** Key of the iModel. Generally taken from `IModelConnection.key`. */
|
|
34
|
+
readonly key: string;
|
|
35
|
+
/** The set of currently hilited elements taken from `IModelConnection.hilited`. */
|
|
36
|
+
readonly hiliteSet: CoreIModelHiliteSet;
|
|
37
|
+
/** The set of currently selected elements taken from `IModelConnection.selectionSet`. */
|
|
38
|
+
readonly selectionSet: CoreIModelSelectionSet;
|
|
39
|
+
};
|
|
40
|
+
/** Selection storage to synchronize IModel's tool selection with. */
|
|
41
|
+
selectionStorage: SelectionStorage;
|
|
42
|
+
/** Active scope provider. */
|
|
43
|
+
activeScopeProvider: () => ComputeSelectionProps["scope"];
|
|
44
|
+
/**
|
|
45
|
+
* A caching hilite set provider used to retrieve hilite sets for an iModel. If not provided, a new `CachingHiliteSetProvider`
|
|
46
|
+
* will be created for the given iModel using the provided `imodelAccess`.
|
|
47
|
+
* If the consuming application already has a `CachingHiliteSetProvider` defined, it should be provided instead
|
|
48
|
+
* to reuse the cache and avoid creating new providers for each iModel.
|
|
49
|
+
*/
|
|
50
|
+
cachingHiliteSetProvider?: CachingHiliteSetProvider;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Enables synchronization between iModel selection and unified selection.
|
|
54
|
+
* @returns function for disposing the synchronization.
|
|
55
|
+
* @beta
|
|
56
|
+
*/
|
|
57
|
+
export declare function enableUnifiedSelectionSyncWithIModel(props: EnableUnifiedSelectionSyncWithIModelProps): () => void;
|
|
58
|
+
/**
|
|
59
|
+
* A handler that syncs selection between unified selection storage
|
|
60
|
+
* (`SelectionStorage`) and an iModel (`iModel.selectionSet`, `iModel.hilited`).
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
export declare class IModelSelectionHandler {
|
|
64
|
+
private _selectionSourceName;
|
|
65
|
+
private _imodelAccess;
|
|
66
|
+
private _selectionStorage;
|
|
67
|
+
private _hiliteSetProvider;
|
|
68
|
+
private _cachingHiliteSetProvider;
|
|
69
|
+
private _activeScopeProvider;
|
|
70
|
+
private _isSuspended;
|
|
71
|
+
private _cancelOngoingChanges;
|
|
72
|
+
private _unifiedSelectionListenerDisposeFunc;
|
|
73
|
+
private _imodelListenerDisposeFunc;
|
|
74
|
+
private _hasCustomCachingHiliteSetProvider;
|
|
75
|
+
constructor(props: EnableUnifiedSelectionSyncWithIModelProps);
|
|
76
|
+
dispose(): void;
|
|
77
|
+
/** Temporarily suspends tool selection synchronization until the returned `IDisposable` is disposed. */
|
|
78
|
+
suspendIModelToolSelectionSync(): {
|
|
79
|
+
dispose: () => boolean;
|
|
80
|
+
};
|
|
81
|
+
private handleUnifiedSelectionChange;
|
|
82
|
+
private onUnifiedSelectionChanged;
|
|
83
|
+
private applyCurrentHiliteSet;
|
|
84
|
+
private addHiliteSet;
|
|
85
|
+
private removeHiliteSet;
|
|
86
|
+
private onIModelSelectionChanged;
|
|
87
|
+
private handleIModelSelectionChange;
|
|
88
|
+
private getSelectionSetChangeIds;
|
|
89
|
+
private idArgToIds;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=EnableUnifiedSelectionSyncWithIModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnableUnifiedSelectionSyncWithIModel.d.ts","sourceRoot":"","sources":["../../../src/unified-selection/EnableUnifiedSelectionSyncWithIModel.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAkC,MAAM,4BAA4B,CAAC;AAItG,OAAO,EAAoB,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAA0D,MAAM,gBAAgB,CAAC;AAErI;;;GAGG;AACH,MAAM,WAAW,yCAAyC;IACxD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,YAAY,EAAE,kBAAkB,GAC9B,yBAAyB,GAAG;QAC1B,sEAAsE;QACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,mFAAmF;QACnF,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;QACxC,yFAAyF;QACzF,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;KAC/C,CAAC;IAEJ,qEAAqE;IACrE,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE1D;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;CACrD;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,yCAAyC,GAAG,MAAM,IAAI,CAGjH;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,oBAAoB,CAAU;IAEtC,OAAO,CAAC,aAAa,CAA4D;IACjF,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,yBAAyB,CAA2B;IAC5D,OAAO,CAAC,oBAAoB,CAAuC;IAEnE,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,oCAAoC,CAAa;IACzD,OAAO,CAAC,0BAA0B,CAAa;IAC/C,OAAO,CAAC,kCAAkC,CAAU;gBAEjC,KAAK,EAAE,yCAAyC;IAuB5D,OAAO;IASd,wGAAwG;IACjG,8BAA8B;;;IAQrC,OAAO,CAAC,4BAA4B;IA6BpC,OAAO,CAAC,yBAAyB,CAU/B;IAEF,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,wBAAwB,CAa9B;YAEY,2BAA2B;IAiBzC,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,UAAU;CASnB"}
|