@buerli.io/core 1.0.1 → 1.1.0-beta.7
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/README.md +19 -19
- package/build/cjs/geometry/ThreeGeometryCreator.js +320 -320
- package/build/cjs/geometry/index.js +17 -17
- package/build/cjs/graphic/filters.js +25 -25
- package/build/cjs/index.js +26 -26
- package/build/cjs/re-export.js +29 -29
- package/build/cjs/store/index.js +41 -37
- package/build/cjs/store/states/buerli.js +98 -98
- package/build/cjs/store/states/cad.js +47 -47
- package/build/cjs/store/states/drawing.js +49 -49
- package/build/cjs/store/states/geometry.js +157 -157
- package/build/cjs/store/states/graphic.js +115 -115
- package/build/cjs/store/states/interaction.js +55 -55
- package/build/cjs/store/states/message.js +32 -25
- package/build/cjs/store/states/plugin.js +115 -115
- package/build/cjs/store/states/selection.js +267 -267
- package/build/cjs/store/states/structure.js +250 -250
- package/build/cjs/store/store.js +9 -9
- package/build/cjs/store/subscribtion/selection.js +49 -49
- package/build/cjs/store/subscribtion/subscribeToDrawing.js +13 -13
- package/build/cjs/types/InteractionInfo.js +11 -11
- package/build/cjs/types/index.js +34 -34
- package/build/cjs/utils/Math.js +91 -91
- package/build/cjs/utils/Measure.js +576 -576
- package/build/cjs/utils/Timing.js +34 -34
- package/build/esm/geometry/ThreeGeometryCreator.js +291 -291
- package/build/esm/geometry/index.js +1 -1
- package/build/esm/graphic/filters.js +12 -12
- package/build/esm/index.js +10 -10
- package/build/esm/re-export.js +23 -23
- package/build/esm/store/index.js +29 -26
- package/build/esm/store/states/buerli.js +92 -92
- package/build/esm/store/states/cad.js +42 -42
- package/build/esm/store/states/drawing.js +45 -45
- package/build/esm/store/states/geometry.js +129 -129
- package/build/esm/store/states/graphic.js +110 -110
- package/build/esm/store/states/interaction.js +50 -50
- package/build/esm/store/states/message.js +28 -21
- package/build/esm/store/states/plugin.js +109 -109
- package/build/esm/store/states/selection.js +261 -261
- package/build/esm/store/states/structure.js +219 -219
- package/build/esm/store/store.js +3 -3
- package/build/esm/store/subscribtion/selection.js +44 -44
- package/build/esm/store/subscribtion/subscribeToDrawing.js +9 -9
- package/build/esm/types/InteractionInfo.js +6 -6
- package/build/esm/types/index.js +16 -16
- package/build/esm/utils/Math.js +65 -65
- package/build/esm/utils/Measure.js +550 -550
- package/build/esm/utils/Timing.js +31 -31
- package/build/types/geometry/ThreeGeometryCreator.d.ts +256 -256
- package/build/types/geometry/index.d.ts +1 -1
- package/build/types/graphic/filters.d.ts +11 -11
- package/build/types/index.d.ts +38 -38
- package/build/types/re-export.d.ts +70 -70
- package/build/types/store/index.d.ts +17 -16
- package/build/types/store/states/buerli.d.ts +41 -41
- package/build/types/store/states/cad.d.ts +56 -56
- package/build/types/store/states/drawing.d.ts +45 -45
- package/build/types/store/states/geometry.d.ts +64 -64
- package/build/types/store/states/graphic.d.ts +21 -21
- package/build/types/store/states/interaction.d.ts +34 -34
- package/build/types/store/states/message.d.ts +32 -30
- package/build/types/store/states/plugin.d.ts +53 -53
- package/build/types/store/states/selection.d.ts +69 -69
- package/build/types/store/states/structure.d.ts +47 -47
- package/build/types/store/store.d.ts +2 -2
- package/build/types/store/subscribtion/selection.d.ts +7 -7
- package/build/types/store/subscribtion/subscribeToDrawing.d.ts +4 -4
- package/build/types/types/InteractionInfo.d.ts +42 -42
- package/build/types/types/index.d.ts +7 -7
- package/build/types/utils/Math.d.ts +21 -21
- package/build/types/utils/Measure.d.ts +64 -64
- package/build/types/utils/Timing.d.ts +8 -8
- package/package.json +2 -2
|
@@ -1,261 +1,261 @@
|
|
|
1
|
-
import { subscribeItems, unsubscribeItems } from '../subscribtion/selection';
|
|
2
|
-
////////////////////////////////////////////////////
|
|
3
|
-
// CONSTANTS
|
|
4
|
-
////////////////////////////////////////////////////
|
|
5
|
-
export const BuerliScope = 'ClassCAD';
|
|
6
|
-
export const selectionData = () => ({
|
|
7
|
-
refs: {},
|
|
8
|
-
active: null,
|
|
9
|
-
});
|
|
10
|
-
export const selectionApi = (set, get, buerliApi) => ({
|
|
11
|
-
unselectAll(selectorId, options) {
|
|
12
|
-
const { selection, id: drawingId } = get();
|
|
13
|
-
const selId = (selectorId || selection.active);
|
|
14
|
-
if (selId) {
|
|
15
|
-
const selector = selection.refs[selId];
|
|
16
|
-
const unselItems = selector.items;
|
|
17
|
-
if (unselItems.length === 0) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
unsubscribeItems(buerliApi, drawingId, selId, unselItems);
|
|
21
|
-
if (selector.customUnSelect) {
|
|
22
|
-
selector.customUnSelect(selId, [], unselItems, options);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
set(state => {
|
|
26
|
-
const selector_ = state.selection.refs[selId];
|
|
27
|
-
return {
|
|
28
|
-
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, selector_), { items: [] }) }) }),
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
unselect(items, selectorId, options) {
|
|
35
|
-
const { selection, id: drawingId } = get();
|
|
36
|
-
const selId = (selectorId || selection.active);
|
|
37
|
-
if (selId) {
|
|
38
|
-
const unselItems = Array.isArray(items) ? items : [items];
|
|
39
|
-
// Remove unselItems from selector's items
|
|
40
|
-
const selector = selection.refs[selId];
|
|
41
|
-
const newItems = selector.items.filter(item => unselItems.find(uItem => uItem.id === item.id) === undefined);
|
|
42
|
-
unsubscribeItems(buerliApi, drawingId, selId, unselItems);
|
|
43
|
-
if (selector.customUnSelect) {
|
|
44
|
-
// Find recently unselected items
|
|
45
|
-
const diff = selector.items.filter(item1 => {
|
|
46
|
-
return newItems.find(item2 => item2.id === item1.id) === undefined;
|
|
47
|
-
});
|
|
48
|
-
selector.customUnSelect(selId, newItems, diff, options);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
set(state => {
|
|
52
|
-
return {
|
|
53
|
-
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, state.selection.refs[selId]), { items: newItems }) }) }),
|
|
54
|
-
};
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
this.setHovered(null, selId);
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
select(items, selectorId, options) {
|
|
61
|
-
const { selection, api, id: drawingId } = get();
|
|
62
|
-
const selId = (selectorId || selection.active);
|
|
63
|
-
if (selId) {
|
|
64
|
-
const { isItemSelected } = api.selection;
|
|
65
|
-
const newItems = Array.isArray(items) ? items : [items];
|
|
66
|
-
const selector = selection.refs[selId];
|
|
67
|
-
const curItems = selector.items;
|
|
68
|
-
// Remove duplicates
|
|
69
|
-
let filteredItems = newItems.filter((item1, idx) => newItems.findIndex(item2 => item2.id === item1.id) === idx);
|
|
70
|
-
// Remove already selected items and duplicates
|
|
71
|
-
filteredItems = filteredItems.filter(item => !isItemSelected(item, selId));
|
|
72
|
-
let unsubItems = [];
|
|
73
|
-
let result = [...curItems, ...filteredItems];
|
|
74
|
-
if (selector.maxLen > 0) {
|
|
75
|
-
if (filteredItems.length === selector.maxLen) {
|
|
76
|
-
result = [...filteredItems];
|
|
77
|
-
unsubItems = [...curItems];
|
|
78
|
-
}
|
|
79
|
-
else if (filteredItems.length > selector.maxLen) {
|
|
80
|
-
const extraItems = filteredItems.length - selector.maxLen;
|
|
81
|
-
// If filteredItems has bigger length then selector.maxLen, remove last few items from filteredItems.
|
|
82
|
-
result = filteredItems.slice(0, -extraItems);
|
|
83
|
-
unsubItems = [...curItems];
|
|
84
|
-
}
|
|
85
|
-
else if (filteredItems.length + curItems.length >= selector.maxLen) {
|
|
86
|
-
const extraItems = filteredItems.length + curItems.length - selector.maxLen;
|
|
87
|
-
const allItems = [...curItems, ...filteredItems];
|
|
88
|
-
// If filteredItems.len + curItems.len > selector.maxLen, remove first few items from union of curItems and filteredItems.
|
|
89
|
-
result = allItems.slice(extraItems);
|
|
90
|
-
unsubItems = allItems.slice(0, extraItems);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (selector.customSelect !== undefined) {
|
|
94
|
-
// Find items which weren't selected before.
|
|
95
|
-
const diff = result.filter(item1 => {
|
|
96
|
-
return selector.items.find(item2 => item2.id === item1.id) === undefined;
|
|
97
|
-
});
|
|
98
|
-
selector.customSelect(selId, result, diff, options);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
// subscribe items which will be selected
|
|
102
|
-
subscribeItems(buerliApi, drawingId, selId, result);
|
|
103
|
-
// unsubscribe items which will be unselected
|
|
104
|
-
unsubscribeItems(buerliApi, drawingId, selId, unsubItems);
|
|
105
|
-
set(state => {
|
|
106
|
-
return {
|
|
107
|
-
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, selector), { items: result, hoveredItem: null }) }) }),
|
|
108
|
-
};
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
setHovered(item, selectorId) {
|
|
114
|
-
const { selection } = get();
|
|
115
|
-
if (selection.active === null && selectorId === undefined)
|
|
116
|
-
return;
|
|
117
|
-
const selId = (selectorId || selection.active);
|
|
118
|
-
set(state => ({
|
|
119
|
-
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, state.selection.refs[selId]), { hoveredItem: item }) }) }),
|
|
120
|
-
}));
|
|
121
|
-
},
|
|
122
|
-
activateSelector(selectorId) {
|
|
123
|
-
set(state => {
|
|
124
|
-
const refs = state.selection.refs;
|
|
125
|
-
const curSelectorId = state.selection.active;
|
|
126
|
-
if (curSelectorId) {
|
|
127
|
-
// Reset hoveredItem
|
|
128
|
-
refs[curSelectorId] = Object.assign(Object.assign({}, refs[curSelectorId]), { hoveredItem: null });
|
|
129
|
-
}
|
|
130
|
-
return {
|
|
131
|
-
selection: Object.assign(Object.assign({}, state.selection), { active: state.selection.active === selectorId ? null : selectorId, refs: Object.assign({}, refs) }),
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
},
|
|
135
|
-
createSelector(selectorId, filter, activate = false, initialItems = [], maxLen = -1, customSelect, customUnSelect) {
|
|
136
|
-
if (maxLen > 0 && initialItems.length > maxLen)
|
|
137
|
-
console.error('Number initialItems should be less or equal to selector.maxLen');
|
|
138
|
-
set(state => ({
|
|
139
|
-
selection: Object.assign(Object.assign({}, state.selection), { active: activate ? selectorId : state.selection.active, refs: Object.assign(Object.assign({}, state.selection.refs), { [selectorId]: {
|
|
140
|
-
items: maxLen > 0 && initialItems.length > maxLen ? [] : initialItems,
|
|
141
|
-
hoveredItem: null,
|
|
142
|
-
isSelectable: filter,
|
|
143
|
-
maxLen,
|
|
144
|
-
customSelect,
|
|
145
|
-
customUnSelect,
|
|
146
|
-
} }) }),
|
|
147
|
-
}));
|
|
148
|
-
return () => {
|
|
149
|
-
if (get && get()) {
|
|
150
|
-
const drawingId = get().id;
|
|
151
|
-
unsubscribeItems(buerliApi, drawingId, selectorId);
|
|
152
|
-
set(state => {
|
|
153
|
-
const refs = state.selection.refs;
|
|
154
|
-
delete refs[selectorId];
|
|
155
|
-
return {
|
|
156
|
-
selection: Object.assign(Object.assign({}, state.selection), { active: state.selection.active === selectorId ? null : state.selection.active, refs }),
|
|
157
|
-
};
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
},
|
|
162
|
-
areItemsSelected: (items, selectorId) => {
|
|
163
|
-
const { selection } = get();
|
|
164
|
-
if (selection.active === null && selectorId === undefined)
|
|
165
|
-
return false;
|
|
166
|
-
const selId = (selectorId || selection.active);
|
|
167
|
-
const selector = selection.refs[selId];
|
|
168
|
-
let res = true;
|
|
169
|
-
items.forEach(item => {
|
|
170
|
-
const itemSelected = Boolean(selector.items.find(i => areItemsEqual(i, item)));
|
|
171
|
-
if (!itemSelected) {
|
|
172
|
-
res = false;
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
return res;
|
|
176
|
-
},
|
|
177
|
-
isItemSelected: (item, selectorId) => {
|
|
178
|
-
const { selection } = get();
|
|
179
|
-
if (selection.active === null && selectorId === undefined)
|
|
180
|
-
return false;
|
|
181
|
-
const selId = (selectorId || selection.active);
|
|
182
|
-
const selector = selection.refs[selId];
|
|
183
|
-
return Boolean(selector.items.find(i => areItemsEqual(i, item)));
|
|
184
|
-
},
|
|
185
|
-
setItems(id, items) {
|
|
186
|
-
var _a;
|
|
187
|
-
const { selection, id: drawingId } = get();
|
|
188
|
-
const curItems = ((_a = selection.refs[id]) === null || _a === void 0 ? void 0 : _a.items) || [];
|
|
189
|
-
unsubscribeItems(buerliApi, drawingId, id, curItems);
|
|
190
|
-
subscribeItems(buerliApi, drawingId, id, items);
|
|
191
|
-
set(state => {
|
|
192
|
-
const selector = state.selection.refs[id];
|
|
193
|
-
return {
|
|
194
|
-
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [id]: Object.assign(Object.assign({}, selector), { items }) }) }),
|
|
195
|
-
};
|
|
196
|
-
});
|
|
197
|
-
},
|
|
198
|
-
selectGraphic: (selectorId, items, options) => {
|
|
199
|
-
const { api } = get();
|
|
200
|
-
const selItems = items
|
|
201
|
-
.map(i => api.selection.getGraphicItem(i.productId, i.containerId, i.graphicId))
|
|
202
|
-
.filter(i => Boolean(i));
|
|
203
|
-
if (options === null || options === void 0 ? void 0 : options.unselectExisting) {
|
|
204
|
-
api.selection.setItems(selectorId, selItems);
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
api.selection.select(selItems, selectorId);
|
|
208
|
-
}
|
|
209
|
-
},
|
|
210
|
-
getGraphicItem: (productId, containerId, graphicId) => {
|
|
211
|
-
const { cache } = get().geometry;
|
|
212
|
-
const container = cache[containerId];
|
|
213
|
-
let useContainer = false;
|
|
214
|
-
if (container) {
|
|
215
|
-
if (graphicId === undefined) {
|
|
216
|
-
const ids = Object.getOwnPropertyNames(container.map);
|
|
217
|
-
graphicId = ids.length > 0 ? Number(ids[0]) : undefined;
|
|
218
|
-
useContainer = true;
|
|
219
|
-
}
|
|
220
|
-
if (graphicId !== undefined) {
|
|
221
|
-
let geomElem = container.map[graphicId];
|
|
222
|
-
if (!geomElem) {
|
|
223
|
-
geomElem = container.points.find(p => p.graphicId === graphicId);
|
|
224
|
-
}
|
|
225
|
-
if (geomElem) {
|
|
226
|
-
geomElem.graphicId = useContainer ? containerId : geomElem.graphicId;
|
|
227
|
-
geomElem.type = useContainer ? container.type : geomElem.type;
|
|
228
|
-
return createGraphicItem(productId, geomElem);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return null;
|
|
233
|
-
},
|
|
234
|
-
});
|
|
235
|
-
////////////////////////////////////////////////////
|
|
236
|
-
//#region GLOBAL FUNCTIONS
|
|
237
|
-
const areItemsEqual = (a, b) => a.id === b.id && a.scope === b.scope;
|
|
238
|
-
const getLabel = (type) => {
|
|
239
|
-
const uppLetters = type.replace(/[a-z]/g, '');
|
|
240
|
-
if (uppLetters.length >= 2) {
|
|
241
|
-
return uppLetters[0] + uppLetters[1];
|
|
242
|
-
}
|
|
243
|
-
else if (uppLetters.length === 1) {
|
|
244
|
-
return (type[0] + uppLetters[0]).toUpperCase();
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
return (type[0] + type[1]).toUpperCase();
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
const createGraphicIdent = (productId, graphicId, type) => {
|
|
251
|
-
return {
|
|
252
|
-
id: `${productId}|${graphicId}|${type}`,
|
|
253
|
-
scope: BuerliScope,
|
|
254
|
-
label: getLabel(type),
|
|
255
|
-
};
|
|
256
|
-
};
|
|
257
|
-
export const createGraphicItem = (productId, el) => {
|
|
258
|
-
return Object.assign(Object.assign({}, createGraphicIdent(productId, el.graphicId, el.type)), { data: Object.assign(Object.assign({}, el), { productId }) });
|
|
259
|
-
};
|
|
260
|
-
//#endregion GLOBAL FUNCTIONS
|
|
261
|
-
////////////////////////////////////////////////////
|
|
1
|
+
import { subscribeItems, unsubscribeItems } from '../subscribtion/selection';
|
|
2
|
+
////////////////////////////////////////////////////
|
|
3
|
+
// CONSTANTS
|
|
4
|
+
////////////////////////////////////////////////////
|
|
5
|
+
export const BuerliScope = 'ClassCAD';
|
|
6
|
+
export const selectionData = () => ({
|
|
7
|
+
refs: {},
|
|
8
|
+
active: null,
|
|
9
|
+
});
|
|
10
|
+
export const selectionApi = (set, get, buerliApi) => ({
|
|
11
|
+
unselectAll(selectorId, options) {
|
|
12
|
+
const { selection, id: drawingId } = get();
|
|
13
|
+
const selId = (selectorId || selection.active);
|
|
14
|
+
if (selId) {
|
|
15
|
+
const selector = selection.refs[selId];
|
|
16
|
+
const unselItems = selector.items;
|
|
17
|
+
if (unselItems.length === 0) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
unsubscribeItems(buerliApi, drawingId, selId, unselItems);
|
|
21
|
+
if (selector.customUnSelect) {
|
|
22
|
+
selector.customUnSelect(selId, [], unselItems, options);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
set(state => {
|
|
26
|
+
const selector_ = state.selection.refs[selId];
|
|
27
|
+
return {
|
|
28
|
+
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, selector_), { items: [] }) }) }),
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
unselect(items, selectorId, options) {
|
|
35
|
+
const { selection, id: drawingId } = get();
|
|
36
|
+
const selId = (selectorId || selection.active);
|
|
37
|
+
if (selId) {
|
|
38
|
+
const unselItems = Array.isArray(items) ? items : [items];
|
|
39
|
+
// Remove unselItems from selector's items
|
|
40
|
+
const selector = selection.refs[selId];
|
|
41
|
+
const newItems = selector.items.filter(item => unselItems.find(uItem => uItem.id === item.id) === undefined);
|
|
42
|
+
unsubscribeItems(buerliApi, drawingId, selId, unselItems);
|
|
43
|
+
if (selector.customUnSelect) {
|
|
44
|
+
// Find recently unselected items
|
|
45
|
+
const diff = selector.items.filter(item1 => {
|
|
46
|
+
return newItems.find(item2 => item2.id === item1.id) === undefined;
|
|
47
|
+
});
|
|
48
|
+
selector.customUnSelect(selId, newItems, diff, options);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
set(state => {
|
|
52
|
+
return {
|
|
53
|
+
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, state.selection.refs[selId]), { items: newItems }) }) }),
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
this.setHovered(null, selId);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
select(items, selectorId, options) {
|
|
61
|
+
const { selection, api, id: drawingId } = get();
|
|
62
|
+
const selId = (selectorId || selection.active);
|
|
63
|
+
if (selId) {
|
|
64
|
+
const { isItemSelected } = api.selection;
|
|
65
|
+
const newItems = Array.isArray(items) ? items : [items];
|
|
66
|
+
const selector = selection.refs[selId];
|
|
67
|
+
const curItems = selector.items;
|
|
68
|
+
// Remove duplicates
|
|
69
|
+
let filteredItems = newItems.filter((item1, idx) => newItems.findIndex(item2 => item2.id === item1.id) === idx);
|
|
70
|
+
// Remove already selected items and duplicates
|
|
71
|
+
filteredItems = filteredItems.filter(item => !isItemSelected(item, selId));
|
|
72
|
+
let unsubItems = [];
|
|
73
|
+
let result = [...curItems, ...filteredItems];
|
|
74
|
+
if (selector.maxLen > 0) {
|
|
75
|
+
if (filteredItems.length === selector.maxLen) {
|
|
76
|
+
result = [...filteredItems];
|
|
77
|
+
unsubItems = [...curItems];
|
|
78
|
+
}
|
|
79
|
+
else if (filteredItems.length > selector.maxLen) {
|
|
80
|
+
const extraItems = filteredItems.length - selector.maxLen;
|
|
81
|
+
// If filteredItems has bigger length then selector.maxLen, remove last few items from filteredItems.
|
|
82
|
+
result = filteredItems.slice(0, -extraItems);
|
|
83
|
+
unsubItems = [...curItems];
|
|
84
|
+
}
|
|
85
|
+
else if (filteredItems.length + curItems.length >= selector.maxLen) {
|
|
86
|
+
const extraItems = filteredItems.length + curItems.length - selector.maxLen;
|
|
87
|
+
const allItems = [...curItems, ...filteredItems];
|
|
88
|
+
// If filteredItems.len + curItems.len > selector.maxLen, remove first few items from union of curItems and filteredItems.
|
|
89
|
+
result = allItems.slice(extraItems);
|
|
90
|
+
unsubItems = allItems.slice(0, extraItems);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (selector.customSelect !== undefined) {
|
|
94
|
+
// Find items which weren't selected before.
|
|
95
|
+
const diff = result.filter(item1 => {
|
|
96
|
+
return selector.items.find(item2 => item2.id === item1.id) === undefined;
|
|
97
|
+
});
|
|
98
|
+
selector.customSelect(selId, result, diff, options);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// subscribe items which will be selected
|
|
102
|
+
subscribeItems(buerliApi, drawingId, selId, result);
|
|
103
|
+
// unsubscribe items which will be unselected
|
|
104
|
+
unsubscribeItems(buerliApi, drawingId, selId, unsubItems);
|
|
105
|
+
set(state => {
|
|
106
|
+
return {
|
|
107
|
+
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, selector), { items: result, hoveredItem: null }) }) }),
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
setHovered(item, selectorId) {
|
|
114
|
+
const { selection } = get();
|
|
115
|
+
if (selection.active === null && selectorId === undefined)
|
|
116
|
+
return;
|
|
117
|
+
const selId = (selectorId || selection.active);
|
|
118
|
+
set(state => ({
|
|
119
|
+
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [selId]: Object.assign(Object.assign({}, state.selection.refs[selId]), { hoveredItem: item }) }) }),
|
|
120
|
+
}));
|
|
121
|
+
},
|
|
122
|
+
activateSelector(selectorId) {
|
|
123
|
+
set(state => {
|
|
124
|
+
const refs = state.selection.refs;
|
|
125
|
+
const curSelectorId = state.selection.active;
|
|
126
|
+
if (curSelectorId) {
|
|
127
|
+
// Reset hoveredItem
|
|
128
|
+
refs[curSelectorId] = Object.assign(Object.assign({}, refs[curSelectorId]), { hoveredItem: null });
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
selection: Object.assign(Object.assign({}, state.selection), { active: state.selection.active === selectorId ? null : selectorId, refs: Object.assign({}, refs) }),
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
createSelector(selectorId, filter, activate = false, initialItems = [], maxLen = -1, customSelect, customUnSelect) {
|
|
136
|
+
if (maxLen > 0 && initialItems.length > maxLen)
|
|
137
|
+
console.error('Number initialItems should be less or equal to selector.maxLen');
|
|
138
|
+
set(state => ({
|
|
139
|
+
selection: Object.assign(Object.assign({}, state.selection), { active: activate ? selectorId : state.selection.active, refs: Object.assign(Object.assign({}, state.selection.refs), { [selectorId]: {
|
|
140
|
+
items: maxLen > 0 && initialItems.length > maxLen ? [] : initialItems,
|
|
141
|
+
hoveredItem: null,
|
|
142
|
+
isSelectable: filter,
|
|
143
|
+
maxLen,
|
|
144
|
+
customSelect,
|
|
145
|
+
customUnSelect,
|
|
146
|
+
} }) }),
|
|
147
|
+
}));
|
|
148
|
+
return () => {
|
|
149
|
+
if (get && get()) {
|
|
150
|
+
const drawingId = get().id;
|
|
151
|
+
unsubscribeItems(buerliApi, drawingId, selectorId);
|
|
152
|
+
set(state => {
|
|
153
|
+
const refs = state.selection.refs;
|
|
154
|
+
delete refs[selectorId];
|
|
155
|
+
return {
|
|
156
|
+
selection: Object.assign(Object.assign({}, state.selection), { active: state.selection.active === selectorId ? null : state.selection.active, refs }),
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
areItemsSelected: (items, selectorId) => {
|
|
163
|
+
const { selection } = get();
|
|
164
|
+
if (selection.active === null && selectorId === undefined)
|
|
165
|
+
return false;
|
|
166
|
+
const selId = (selectorId || selection.active);
|
|
167
|
+
const selector = selection.refs[selId];
|
|
168
|
+
let res = true;
|
|
169
|
+
items.forEach(item => {
|
|
170
|
+
const itemSelected = Boolean(selector.items.find(i => areItemsEqual(i, item)));
|
|
171
|
+
if (!itemSelected) {
|
|
172
|
+
res = false;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
return res;
|
|
176
|
+
},
|
|
177
|
+
isItemSelected: (item, selectorId) => {
|
|
178
|
+
const { selection } = get();
|
|
179
|
+
if (selection.active === null && selectorId === undefined)
|
|
180
|
+
return false;
|
|
181
|
+
const selId = (selectorId || selection.active);
|
|
182
|
+
const selector = selection.refs[selId];
|
|
183
|
+
return Boolean(selector.items.find(i => areItemsEqual(i, item)));
|
|
184
|
+
},
|
|
185
|
+
setItems(id, items) {
|
|
186
|
+
var _a;
|
|
187
|
+
const { selection, id: drawingId } = get();
|
|
188
|
+
const curItems = ((_a = selection.refs[id]) === null || _a === void 0 ? void 0 : _a.items) || [];
|
|
189
|
+
unsubscribeItems(buerliApi, drawingId, id, curItems);
|
|
190
|
+
subscribeItems(buerliApi, drawingId, id, items);
|
|
191
|
+
set(state => {
|
|
192
|
+
const selector = state.selection.refs[id];
|
|
193
|
+
return {
|
|
194
|
+
selection: Object.assign(Object.assign({}, state.selection), { refs: Object.assign(Object.assign({}, state.selection.refs), { [id]: Object.assign(Object.assign({}, selector), { items }) }) }),
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
},
|
|
198
|
+
selectGraphic: (selectorId, items, options) => {
|
|
199
|
+
const { api } = get();
|
|
200
|
+
const selItems = items
|
|
201
|
+
.map(i => api.selection.getGraphicItem(i.productId, i.containerId, i.graphicId))
|
|
202
|
+
.filter(i => Boolean(i));
|
|
203
|
+
if (options === null || options === void 0 ? void 0 : options.unselectExisting) {
|
|
204
|
+
api.selection.setItems(selectorId, selItems);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
api.selection.select(selItems, selectorId);
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
getGraphicItem: (productId, containerId, graphicId) => {
|
|
211
|
+
const { cache } = get().geometry;
|
|
212
|
+
const container = cache[containerId];
|
|
213
|
+
let useContainer = false;
|
|
214
|
+
if (container) {
|
|
215
|
+
if (graphicId === undefined) {
|
|
216
|
+
const ids = Object.getOwnPropertyNames(container.map);
|
|
217
|
+
graphicId = ids.length > 0 ? Number(ids[0]) : undefined;
|
|
218
|
+
useContainer = true;
|
|
219
|
+
}
|
|
220
|
+
if (graphicId !== undefined) {
|
|
221
|
+
let geomElem = container.map[graphicId];
|
|
222
|
+
if (!geomElem) {
|
|
223
|
+
geomElem = container.points.find(p => p.graphicId === graphicId);
|
|
224
|
+
}
|
|
225
|
+
if (geomElem) {
|
|
226
|
+
geomElem.graphicId = useContainer ? containerId : geomElem.graphicId;
|
|
227
|
+
geomElem.type = useContainer ? container.type : geomElem.type;
|
|
228
|
+
return createGraphicItem(productId, geomElem);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return null;
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
////////////////////////////////////////////////////
|
|
236
|
+
//#region GLOBAL FUNCTIONS
|
|
237
|
+
const areItemsEqual = (a, b) => a.id === b.id && a.scope === b.scope;
|
|
238
|
+
const getLabel = (type) => {
|
|
239
|
+
const uppLetters = type.replace(/[a-z]/g, '');
|
|
240
|
+
if (uppLetters.length >= 2) {
|
|
241
|
+
return uppLetters[0] + uppLetters[1];
|
|
242
|
+
}
|
|
243
|
+
else if (uppLetters.length === 1) {
|
|
244
|
+
return (type[0] + uppLetters[0]).toUpperCase();
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
return (type[0] + type[1]).toUpperCase();
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
const createGraphicIdent = (productId, graphicId, type) => {
|
|
251
|
+
return {
|
|
252
|
+
id: `${productId}|${graphicId}|${type}`,
|
|
253
|
+
scope: BuerliScope,
|
|
254
|
+
label: getLabel(type),
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
export const createGraphicItem = (productId, el) => {
|
|
258
|
+
return Object.assign(Object.assign({}, createGraphicIdent(productId, el.graphicId, el.type)), { data: Object.assign(Object.assign({}, el), { productId }) });
|
|
259
|
+
};
|
|
260
|
+
//#endregion GLOBAL FUNCTIONS
|
|
261
|
+
////////////////////////////////////////////////////
|