@api-client/ui 0.2.2 → 0.2.3

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 (170) hide show
  1. package/package.json +7 -2
  2. package/test/env.ts +15 -0
  3. package/test/tsconfig.json +1 -7
  4. package/web-test-runner.config.js +5 -1
  5. package/build/src/visualization/elements/VizAssociationElement.d.ts +0 -4
  6. package/build/src/visualization/elements/VizAssociationElement.d.ts.map +0 -1
  7. package/build/src/visualization/elements/VizAssociationElement.js +0 -4
  8. package/build/src/visualization/elements/VizAssociationElement.js.map +0 -1
  9. package/build/src/visualization/elements/VizWorkspaceElement.d.ts +0 -110
  10. package/build/src/visualization/elements/VizWorkspaceElement.d.ts.map +0 -1
  11. package/build/src/visualization/elements/VizWorkspaceElement.js +0 -321
  12. package/build/src/visualization/elements/VizWorkspaceElement.js.map +0 -1
  13. package/build/src/visualization/elements/WorkspaceStyles.d.ts +0 -3
  14. package/build/src/visualization/elements/WorkspaceStyles.d.ts.map +0 -1
  15. package/build/src/visualization/elements/WorkspaceStyles.js +0 -168
  16. package/build/src/visualization/elements/WorkspaceStyles.js.map +0 -1
  17. package/build/src/visualization/lib/AnchorFinder.d.ts +0 -64
  18. package/build/src/visualization/lib/AnchorFinder.d.ts.map +0 -1
  19. package/build/src/visualization/lib/AnchorFinder.js +0 -107
  20. package/build/src/visualization/lib/AnchorFinder.js.map +0 -1
  21. package/build/src/visualization/lib/AnchorUtils.d.ts +0 -10
  22. package/build/src/visualization/lib/AnchorUtils.d.ts.map +0 -1
  23. package/build/src/visualization/lib/AnchorUtils.js +0 -44
  24. package/build/src/visualization/lib/AnchorUtils.js.map +0 -1
  25. package/build/src/visualization/lib/AssociationAnchors.d.ts +0 -134
  26. package/build/src/visualization/lib/AssociationAnchors.d.ts.map +0 -1
  27. package/build/src/visualization/lib/AssociationAnchors.js +0 -351
  28. package/build/src/visualization/lib/AssociationAnchors.js.map +0 -1
  29. package/build/src/visualization/lib/LabelSketch.d.ts +0 -16
  30. package/build/src/visualization/lib/LabelSketch.d.ts.map +0 -1
  31. package/build/src/visualization/lib/LabelSketch.js +0 -53
  32. package/build/src/visualization/lib/LabelSketch.js.map +0 -1
  33. package/build/src/visualization/lib/LineSketch.d.ts +0 -26
  34. package/build/src/visualization/lib/LineSketch.d.ts.map +0 -1
  35. package/build/src/visualization/lib/LineSketch.js +0 -55
  36. package/build/src/visualization/lib/LineSketch.js.map +0 -1
  37. package/build/src/visualization/lib/Point.d.ts +0 -74
  38. package/build/src/visualization/lib/Point.d.ts.map +0 -1
  39. package/build/src/visualization/lib/Point.js +0 -121
  40. package/build/src/visualization/lib/Point.js.map +0 -1
  41. package/build/src/visualization/lib/PositionUtils.d.ts +0 -65
  42. package/build/src/visualization/lib/PositionUtils.d.ts.map +0 -1
  43. package/build/src/visualization/lib/PositionUtils.js +0 -205
  44. package/build/src/visualization/lib/PositionUtils.js.map +0 -1
  45. package/build/src/visualization/lib/SelectionManager.d.ts +0 -183
  46. package/build/src/visualization/lib/SelectionManager.d.ts.map +0 -1
  47. package/build/src/visualization/lib/SelectionManager.js +0 -481
  48. package/build/src/visualization/lib/SelectionManager.js.map +0 -1
  49. package/build/src/visualization/lib/ShapeArtist.d.ts +0 -45
  50. package/build/src/visualization/lib/ShapeArtist.d.ts.map +0 -1
  51. package/build/src/visualization/lib/ShapeArtist.js +0 -209
  52. package/build/src/visualization/lib/ShapeArtist.js.map +0 -1
  53. package/build/src/visualization/lib/SvgMarkers.d.ts +0 -14
  54. package/build/src/visualization/lib/SvgMarkers.d.ts.map +0 -1
  55. package/build/src/visualization/lib/SvgMarkers.js +0 -77
  56. package/build/src/visualization/lib/SvgMarkers.js.map +0 -1
  57. package/build/src/visualization/lib/TipSketch.d.ts +0 -26
  58. package/build/src/visualization/lib/TipSketch.d.ts.map +0 -1
  59. package/build/src/visualization/lib/TipSketch.js +0 -77
  60. package/build/src/visualization/lib/TipSketch.js.map +0 -1
  61. package/build/src/visualization/lib/TouchSupport.d.ts +0 -14
  62. package/build/src/visualization/lib/TouchSupport.d.ts.map +0 -1
  63. package/build/src/visualization/lib/TouchSupport.js +0 -55
  64. package/build/src/visualization/lib/TouchSupport.js.map +0 -1
  65. package/build/src/visualization/lib/Utils.d.ts +0 -25
  66. package/build/src/visualization/lib/Utils.d.ts.map +0 -1
  67. package/build/src/visualization/lib/Utils.js +0 -59
  68. package/build/src/visualization/lib/Utils.js.map +0 -1
  69. package/build/src/visualization/lib/VisualizationTypes.d.ts +0 -216
  70. package/build/src/visualization/lib/VisualizationTypes.d.ts.map +0 -1
  71. package/build/src/visualization/lib/VisualizationTypes.js +0 -3
  72. package/build/src/visualization/lib/VisualizationTypes.js.map +0 -1
  73. package/build/src/visualization/lib/WorkspaceAlignment.d.ts +0 -51
  74. package/build/src/visualization/lib/WorkspaceAlignment.d.ts.map +0 -1
  75. package/build/src/visualization/lib/WorkspaceAlignment.js +0 -243
  76. package/build/src/visualization/lib/WorkspaceAlignment.js.map +0 -1
  77. package/build/src/visualization/lib/WorkspaceDebugging.d.ts +0 -104
  78. package/build/src/visualization/lib/WorkspaceDebugging.d.ts.map +0 -1
  79. package/build/src/visualization/lib/WorkspaceDebugging.js +0 -286
  80. package/build/src/visualization/lib/WorkspaceDebugging.js.map +0 -1
  81. package/build/src/visualization/lib/WorkspaceEdges.d.ts +0 -293
  82. package/build/src/visualization/lib/WorkspaceEdges.d.ts.map +0 -1
  83. package/build/src/visualization/lib/WorkspaceEdges.js +0 -1073
  84. package/build/src/visualization/lib/WorkspaceEdges.js.map +0 -1
  85. package/build/src/visualization/lib/WorkspaceGestures.d.ts +0 -119
  86. package/build/src/visualization/lib/WorkspaceGestures.d.ts.map +0 -1
  87. package/build/src/visualization/lib/WorkspaceGestures.js +0 -376
  88. package/build/src/visualization/lib/WorkspaceGestures.js.map +0 -1
  89. package/build/src/visualization/lib/WorkspaceSizing.d.ts +0 -66
  90. package/build/src/visualization/lib/WorkspaceSizing.d.ts.map +0 -1
  91. package/build/src/visualization/lib/WorkspaceSizing.js +0 -168
  92. package/build/src/visualization/lib/WorkspaceSizing.js.map +0 -1
  93. package/build/src/visualization/lib/lines/RectilinearLine.d.ts +0 -114
  94. package/build/src/visualization/lib/lines/RectilinearLine.d.ts.map +0 -1
  95. package/build/src/visualization/lib/lines/RectilinearLine.js +0 -605
  96. package/build/src/visualization/lib/lines/RectilinearLine.js.map +0 -1
  97. package/build/src/visualization/lib/tips/RectilinearTip.d.ts +0 -26
  98. package/build/src/visualization/lib/tips/RectilinearTip.d.ts.map +0 -1
  99. package/build/src/visualization/lib/tips/RectilinearTip.js +0 -149
  100. package/build/src/visualization/lib/tips/RectilinearTip.js.map +0 -1
  101. package/build/src/visualization/lib/tips/TipArtist.d.ts +0 -22
  102. package/build/src/visualization/lib/tips/TipArtist.d.ts.map +0 -1
  103. package/build/src/visualization/lib/tips/TipArtist.js +0 -31
  104. package/build/src/visualization/lib/tips/TipArtist.js.map +0 -1
  105. package/build/src/visualization/lib/types.d.ts +0 -164
  106. package/build/src/visualization/lib/types.d.ts.map +0 -1
  107. package/build/src/visualization/lib/types.js +0 -2
  108. package/build/src/visualization/lib/types.js.map +0 -1
  109. package/build/src/visualization/plugin/dnd/DragAndDropPlugin.d.ts +0 -126
  110. package/build/src/visualization/plugin/dnd/DragAndDropPlugin.d.ts.map +0 -1
  111. package/build/src/visualization/plugin/dnd/DragAndDropPlugin.js +0 -260
  112. package/build/src/visualization/plugin/dnd/DragAndDropPlugin.js.map +0 -1
  113. package/build/src/visualization/plugin/group-selection/GroupSelection.d.ts +0 -93
  114. package/build/src/visualization/plugin/group-selection/GroupSelection.d.ts.map +0 -1
  115. package/build/src/visualization/plugin/group-selection/GroupSelection.js +0 -250
  116. package/build/src/visualization/plugin/group-selection/GroupSelection.js.map +0 -1
  117. package/build/src/visualization/plugin/positioning/DataModelLayout.d.ts +0 -10
  118. package/build/src/visualization/plugin/positioning/DataModelLayout.d.ts.map +0 -1
  119. package/build/src/visualization/plugin/positioning/DataModelLayout.js +0 -105
  120. package/build/src/visualization/plugin/positioning/DataModelLayout.js.map +0 -1
  121. package/build/src/visualization/plugin/positioning/WorkspaceLayout.d.ts +0 -93
  122. package/build/src/visualization/plugin/positioning/WorkspaceLayout.d.ts.map +0 -1
  123. package/build/src/visualization/plugin/positioning/WorkspaceLayout.js +0 -96
  124. package/build/src/visualization/plugin/positioning/WorkspaceLayout.js.map +0 -1
  125. package/build/src/visualization/viz-association.d.ts +0 -7
  126. package/build/src/visualization/viz-association.d.ts.map +0 -1
  127. package/build/src/visualization/viz-association.js +0 -3
  128. package/build/src/visualization/viz-association.js.map +0 -1
  129. package/build/src/visualization/viz-workspace.d.ts +0 -7
  130. package/build/src/visualization/viz-workspace.d.ts.map +0 -1
  131. package/build/src/visualization/viz-workspace.js +0 -3
  132. package/build/src/visualization/viz-workspace.js.map +0 -1
  133. package/src/visualization/elements/VizAssociationElement.ts +0 -3
  134. package/src/visualization/elements/VizWorkspaceElement.ts +0 -302
  135. package/src/visualization/elements/WorkspaceStyles.ts +0 -168
  136. package/src/visualization/lib/AnchorFinder.ts +0 -112
  137. package/src/visualization/lib/AnchorUtils.ts +0 -53
  138. package/src/visualization/lib/AssociationAnchors.ts +0 -418
  139. package/src/visualization/lib/LabelSketch.ts +0 -67
  140. package/src/visualization/lib/LineSketch.ts +0 -62
  141. package/src/visualization/lib/Point.ts +0 -134
  142. package/src/visualization/lib/PositionUtils.ts +0 -218
  143. package/src/visualization/lib/SelectionManager.ts +0 -513
  144. package/src/visualization/lib/ShapeArtist.ts +0 -222
  145. package/src/visualization/lib/SvgMarkers.ts +0 -80
  146. package/src/visualization/lib/TipSketch.ts +0 -91
  147. package/src/visualization/lib/TouchSupport.ts +0 -72
  148. package/src/visualization/lib/Utils.ts +0 -63
  149. package/src/visualization/lib/VisualizationTypes.ts +0 -232
  150. package/src/visualization/lib/WorkspaceAlignment.ts +0 -261
  151. package/src/visualization/lib/WorkspaceDebugging.ts +0 -313
  152. package/src/visualization/lib/WorkspaceEdges.ts +0 -1153
  153. package/src/visualization/lib/WorkspaceGestures.ts +0 -400
  154. package/src/visualization/lib/WorkspaceSizing.ts +0 -181
  155. package/src/visualization/lib/lines/RectilinearLine.ts +0 -589
  156. package/src/visualization/lib/tips/RectilinearTip.ts +0 -156
  157. package/src/visualization/lib/tips/TipArtist.ts +0 -34
  158. package/src/visualization/lib/types.ts +0 -173
  159. package/src/visualization/plugin/dnd/DragAndDropPlugin.ts +0 -294
  160. package/src/visualization/plugin/group-selection/GroupSelection.ts +0 -271
  161. package/src/visualization/plugin/positioning/DataModelLayout.ts +0 -114
  162. package/src/visualization/plugin/positioning/WorkspaceLayout.ts +0 -149
  163. package/src/visualization/viz-association.ts +0 -9
  164. package/src/visualization/viz-workspace.ts +0 -9
  165. package/test/env.d.ts +0 -9
  166. package/test/env.js +0 -7
  167. package/test/visualization/lib/AnchorFinder.test.ts +0 -313
  168. package/test/visualization/lib/AnchorUtils.test.ts +0 -178
  169. package/test/visualization/lib/PositionUtils.test.ts +0 -406
  170. package/test/visualization/lib/test-styles.css +0 -80
@@ -1,513 +0,0 @@
1
- import VizWorkspaceElement from '../elements/VizWorkspaceElement.js'
2
- import { ISelectedDomain } from './types.js'
3
-
4
- export const clickHandler = Symbol('clickHandler')
5
- export const observeItems = Symbol('observeItems')
6
- export const mutationHandler = Symbol('mutationHandler')
7
- export const mutationObserver = Symbol('mutationObserver')
8
- export const processAddedNodes = Symbol('processAddedNodes')
9
- export const processRemovedNodes = Symbol('processRemovedNodes')
10
- export const processAttributeChanged = Symbol('processAttributeChanged')
11
- export const propagateSelection = Symbol('propagateSelection')
12
- export const selectAssociations = Symbol('selectAssociation')
13
- export const selectReverseAssociations = Symbol('selectReverseAssociations')
14
- export const propagateDeselection = Symbol('propagateDeselection')
15
- export const deselectAssociations = Symbol('deselectAssociations')
16
- export const deselectReverseAssociations = Symbol('deselectReverseAssociations')
17
- export const notifyChanged = Symbol('notifyChanged')
18
- export const selectedItemsValue = Symbol('selectedItemsValue')
19
- export const selectedIdsValue = Symbol('selectedIdsValue')
20
-
21
- /**
22
- * A class that takes care of selection in the visualization workspace.
23
- */
24
- export class SelectionManager {
25
- /**
26
- * The list of currently selected elements
27
- */
28
- [selectedItemsValue] = new Set<Element>();
29
-
30
- /**
31
- * The list of currently selected domain ids
32
- */
33
- [selectedIdsValue]: ISelectedDomain[] = [];
34
-
35
- [mutationObserver]?: MutationObserver
36
-
37
- /**
38
- * @returns A set of currently selected items.
39
- */
40
- get selectedItems(): Set<Element> {
41
- return this[selectedItemsValue]
42
- }
43
-
44
- /**
45
- * @returns A list of currently selected domain ids.
46
- */
47
- get selected(): ISelectedDomain[] {
48
- return this[selectedIdsValue]
49
- }
50
-
51
- /**
52
- * @returns A list of all selectable items
53
- */
54
- get selectable(): Element[] {
55
- const nodes = this.target.querySelectorAll('[data-selectable]')
56
- return Array.from(nodes) as Element[]
57
- }
58
-
59
- constructor(public target: VizWorkspaceElement) {
60
- this[clickHandler] = this[clickHandler].bind(this)
61
- this[mutationHandler] = this[mutationHandler].bind(this)
62
- }
63
-
64
- /**
65
- * Initializes the library. Should be called when the workspace is ready to render content.
66
- */
67
- connect(): void {
68
- this.target.addEventListener('click', this[clickHandler] as EventListener)
69
- this[mutationObserver] = this[observeItems]()
70
- }
71
-
72
- /**
73
- * Cleans up and removes listeners
74
- */
75
- disconnect(): void {
76
- const mo = this[mutationObserver]
77
- if (mo) {
78
- mo.disconnect()
79
- this[mutationObserver] = undefined
80
- }
81
- this.target.removeEventListener('click', this[clickHandler] as EventListener)
82
- }
83
-
84
- /**
85
- * Checks if given element is marked as selectable target
86
- * @param selectable The element to test for `selectable` or `data-selectable` attribute
87
- * @returns True if the element can be selected
88
- */
89
- isSelectable(selectable: Element): boolean {
90
- return selectable.hasAttribute('data-selectable')
91
- }
92
-
93
- /**
94
- * Checks if given element is marked as selected
95
- * @param selectable The element to test for `selected` or `data-selected` attribute
96
- * @returns True if the element is marked as selected
97
- */
98
- isSelected(selectable: Element): boolean {
99
- return selectable.hasAttribute('data-selected')
100
- }
101
-
102
- /**
103
- * Marks an element as selected
104
- * @param selectable The element to add the selected mark to.
105
- */
106
- setSelected(selectable: Element): void {
107
- selectable.setAttribute('data-selected', '')
108
- }
109
-
110
- /**
111
- * Marks an element as not selected
112
- * @param selectable The element to remove the selected mark from.
113
- */
114
- setUnselected(selectable: Element): void {
115
- selectable.removeAttribute('data-selected')
116
- }
117
-
118
- /**
119
- * Deselects all currently selected items.
120
- */
121
- selectAll(): void {
122
- this.selectable.forEach((node) => {
123
- if (!this.isSelected(node)) {
124
- this.setSelected(node)
125
- }
126
- })
127
- }
128
-
129
- /**
130
- * Deselects all currently selected items.
131
- */
132
- deselectAll(): void {
133
- this.selectable.forEach((node) => {
134
- if (this.isSelected(node)) {
135
- this.setUnselected(node)
136
- }
137
- })
138
- const ids = [...this[selectedIdsValue]]
139
- ids.forEach((info) => {
140
- const elm = this.getDomainTarget(info.id)
141
- if (!elm) {
142
- const index = this[selectedIdsValue].indexOf(info)
143
- this[selectedIdsValue].splice(index, 1)
144
- } else if (this.isSelected(elm)) {
145
- this.setUnselected(elm)
146
- }
147
- })
148
- }
149
-
150
- /**
151
- * Selects objects that are selectable by their `key`.
152
- *
153
- * The `addToSelection` argument is equivalent of calling `deselectAll()` and then `select(...)`.
154
- *
155
- * @param keys The list of domain ids of objects to select.
156
- * @param addToSelection If true it adds to the current selection rather than replacing it.
157
- */
158
- select(keys: string[], addToSelection = false): void {
159
- if (!addToSelection) {
160
- this.deselectAll()
161
- }
162
- keys.forEach((id) => {
163
- const node = this.getSelectableDomainTarget(id)
164
- if (!node) {
165
- return
166
- }
167
- if (this.isSelectable(node) && !this.isSelected(node)) {
168
- this.setSelected(node)
169
- }
170
- })
171
- }
172
-
173
- /**
174
- * Removes objects from selection.
175
- *
176
- * @param keys The list of domain ids of objects to deselect.
177
- */
178
- deselect(keys: string[]): void {
179
- keys.forEach((id) => {
180
- const node = this.getSelectableDomainTarget(id)
181
- if (!node) {
182
- return
183
- }
184
- if (this.isSelectable(node) && this.isSelected(node)) {
185
- this.setUnselected(node)
186
- }
187
- })
188
- }
189
-
190
- /**
191
- * Synchronizes the selection state with the view
192
- */
193
- syncView(): void {
194
- const nodes = this.target.querySelectorAll(`[data-selectable][data-selected]`)
195
- if (this[selectedItemsValue].size !== nodes.length) {
196
- // eslint-disable-next-line no-console
197
- console.log('invalid selection', this[selectedItemsValue], nodes)
198
- }
199
- }
200
-
201
- /**
202
- * Reads the attribute value to get the `key` property.
203
- * @param selectable
204
- * @returns The domain id of the object or `null` when not found
205
- */
206
- readKey(selectable: Element): string | null {
207
- if (selectable.hasAttribute('data-key')) {
208
- return selectable.getAttribute('data-key')
209
- }
210
- return null
211
- }
212
-
213
- /**
214
- * Finds a workspace element that has the domain id.
215
- * @param id Target domain id
216
- */
217
- getDomainTarget(id: string): Element | null {
218
- return this.target.querySelector(`[data-key="${id}"]`)
219
- }
220
-
221
- /**
222
- * Finds a workspace element that has the domain id and is selectable.
223
- * @param id Target domain id
224
- */
225
- getSelectableDomainTarget(id: string): Element | null {
226
- const node = this.target.querySelector(`[data-key="${id}"][data-selectable]`)
227
- return node
228
- }
229
-
230
- // PRIVATE APIS
231
-
232
- [clickHandler](e: PointerEvent): void {
233
- const path = e.composedPath()
234
- const svg = this.target.associationSvg
235
- if (path[0] !== svg && path.includes(svg)) {
236
- // Selection of the edges is managed by the workspace edges manager.
237
- return
238
- }
239
- let selectableTarget
240
- while (path.length > 0) {
241
- const tmp = path.shift() as Node
242
- if (tmp.nodeType !== Node.ELEMENT_NODE) {
243
- continue
244
- }
245
- const typed = tmp as Element
246
- if (this.isSelectable(typed)) {
247
- selectableTarget = typed
248
- break
249
- }
250
- }
251
- if (!selectableTarget) {
252
- this.deselectAll()
253
- return
254
- }
255
- const isSelected = this.isSelected(selectableTarget)
256
- // note: if toggle mode is required then this should toggle the attribute
257
- if (isSelected) {
258
- if (e.shiftKey) {
259
- this.setUnselected(selectableTarget)
260
- }
261
- return
262
- }
263
- if (!e.shiftKey) {
264
- this.deselectAll()
265
- }
266
- this.setSelected(selectableTarget)
267
- }
268
-
269
- /**
270
- * Observe items change in the element's light DOM
271
- * @returns The observer handler
272
- */
273
- [observeItems](): MutationObserver {
274
- const config = { attributes: true, childList: true, subtree: true }
275
- const observer = new MutationObserver(this[mutationHandler])
276
- observer.observe(this.target, config)
277
- return observer
278
- }
279
-
280
- /**
281
- * Processes mutations in the workspace and manages selection state.
282
- * @param mutationsList List of mutations.
283
- */
284
- [mutationHandler](mutationsList: MutationRecord[]): void {
285
- for (const mutation of mutationsList) {
286
- if (mutation.type === 'childList') {
287
- this[processAddedNodes](mutation.addedNodes)
288
- this[processRemovedNodes](mutation.removedNodes)
289
- } else if (mutation.type === 'attributes') {
290
- const { attributeName, target } = mutation
291
- this[processAttributeChanged](target as Element, attributeName as string)
292
- }
293
- }
294
- requestAnimationFrame(() => this.syncView())
295
- }
296
-
297
- /**
298
- * Processes added to the canvas elements.
299
- * @param nodes The list of added nodes
300
- */
301
- [processAddedNodes](nodes: NodeList): void {
302
- nodes.forEach((node) => {
303
- if (node.nodeType !== Node.ELEMENT_NODE) {
304
- return
305
- }
306
- const typed = node as Element
307
- const children = typed.querySelectorAll('*')
308
- this[processAddedNodes](children)
309
- if (!this.isSelectable(typed)) {
310
- return
311
- }
312
- if (this.isSelected(typed)) {
313
- this[propagateSelection](typed)
314
- }
315
- })
316
- }
317
-
318
- /**
319
- * Processes removed from the canvas elements.
320
- * @param nodes The list of removed nodes
321
- */
322
- [processRemovedNodes](nodes: NodeList): void {
323
- nodes.forEach((node) => {
324
- if (node.nodeType !== Node.ELEMENT_NODE) {
325
- return
326
- }
327
- const typed = node as Element
328
- const children = typed.querySelectorAll('*')
329
- this[processRemovedNodes](children)
330
- // An item might not be selectable but it may have a secondary selection
331
- // through association.
332
- // if (!this.isSelectable(typed)) {
333
- // return;
334
- // }
335
- if (this.isSelected(typed)) {
336
- this[propagateDeselection](typed)
337
- }
338
- })
339
- }
340
-
341
- /**
342
- * Processes changed attribute on any element in the canvas
343
- * @param node Changed element
344
- * @param prop Changed property
345
- */
346
- [processAttributeChanged](node: Element, prop: string): void {
347
- if (!['data-selected'].includes(prop)) {
348
- return
349
- }
350
- if (node.hasAttribute(prop)) {
351
- this[propagateSelection](node)
352
- } else {
353
- this[propagateDeselection](node)
354
- }
355
- }
356
-
357
- /**
358
- * Sets selection to the elements that are related to the `selectable` element.
359
- *
360
- * A related element is an element that is an association target to the `selectable`
361
- * ot the `selectable` has `parent` attribute.
362
- *
363
- * The related are not added to the `selectedItems` set and does not have `selected` attribute.
364
- * They are marked with `second-selected` attribute.
365
- */
366
- [propagateSelection](selectable: Element): void {
367
- if (this.selectedItems.has(selectable)) {
368
- return
369
- }
370
- this.selectedItems.add(selectable)
371
- const id = this.readKey(selectable)
372
- if (!id) {
373
- this[notifyChanged]()
374
- return
375
- }
376
- const selected = this[selectedIdsValue]
377
- const index = selected.findIndex((item) => item.id === id)
378
- if (index === -1) {
379
- selected.push({
380
- id,
381
- name: selectable.localName,
382
- node: selectable,
383
- })
384
- }
385
- this[selectAssociations](selectable)
386
- this[selectReverseAssociations](selectable)
387
- this[notifyChanged]()
388
- }
389
-
390
- /**
391
- * Marks `viz-association` and referenced targets of the `selectable` as a secondary selection.
392
- */
393
- [selectAssociations](selectable: Element): void {
394
- const nodes = selectable.querySelectorAll('viz-association')
395
- if (!nodes.length) {
396
- return
397
- }
398
- Array.from(nodes).forEach((node) => {
399
- const target = node.getAttribute('data-target')
400
- if (!target) {
401
- return
402
- }
403
- node.setAttribute('secondary-selected', '')
404
- const targetElement = this.getDomainTarget(target)
405
- if (targetElement) {
406
- targetElement.setAttribute('secondary-selected', '')
407
- }
408
- })
409
- }
410
-
411
- /**
412
- * Similar to `[selectAssociations]()` but it selects associations where
413
- * the `selectable` is the target.
414
- */
415
- [selectReverseAssociations](selectable: Element): void {
416
- const id = this.readKey(selectable)
417
- if (!id) {
418
- return
419
- }
420
- const nodes = this.target.querySelectorAll(`viz-association[data-target="${id}"]`)
421
- if (!nodes.length) {
422
- return
423
- }
424
- Array.from(nodes).forEach((node) => {
425
- const target = node.getAttribute('data-target')
426
- if (!target) {
427
- return
428
- }
429
- node.setAttribute('secondary-selected', '')
430
- const targetElement = node.parentElement
431
- if (targetElement) {
432
- targetElement.setAttribute('secondary-selected', '')
433
- }
434
- })
435
- }
436
-
437
- /**
438
- * Removes secondary selection from the elements that are related to the `selectable` element.
439
- *
440
- * A related element is an element that is an association target to the `selectable`
441
- * ot the `selectable` has `parent` attribute.
442
- */
443
- [propagateDeselection](selectable: Element): void {
444
- if (!this.selectedItems.has(selectable)) {
445
- return
446
- }
447
- this.selectedItems.delete(selectable)
448
- const id = this.readKey(selectable)
449
- if (!id) {
450
- this[notifyChanged]()
451
- return
452
- }
453
- const selected = this[selectedIdsValue]
454
- const index = selected.findIndex((item) => item.id === id)
455
- if (index !== -1) {
456
- this[selectedIdsValue].splice(index, 1)
457
- }
458
- this[deselectAssociations](selectable)
459
- this[deselectReverseAssociations](selectable)
460
- this[notifyChanged]()
461
- }
462
-
463
- /**
464
- * Removes secondary selection mark from `viz-association`
465
- */
466
- [deselectAssociations](selectable: Element): void {
467
- const nodes = selectable.querySelectorAll('viz-association')
468
- if (!nodes.length) {
469
- return
470
- }
471
- Array.from(nodes).forEach((node) => {
472
- const target = node.getAttribute('data-target')
473
- if (!target) {
474
- return
475
- }
476
- node.removeAttribute('secondary-selected')
477
- const targetElement = this.getDomainTarget(target)
478
- if (targetElement) {
479
- targetElement.removeAttribute('secondary-selected')
480
- }
481
- })
482
- }
483
-
484
- /**
485
- * Similar to `[selectAssociation]()` but it selects associations where
486
- * the `selectable` is the target.
487
- */
488
- [deselectReverseAssociations](selectable: Element): void {
489
- const id = this.readKey(selectable)
490
- if (!id) {
491
- return
492
- }
493
- const nodes = this.target.querySelectorAll(`viz-association[data-target="${id}"]`)
494
- if (!nodes.length) {
495
- return
496
- }
497
- Array.from(nodes).forEach((node) => {
498
- const target = node.getAttribute('data-target')
499
- if (!target) {
500
- return
501
- }
502
- node.removeAttribute('secondary-selected')
503
- const targetElement = node.parentElement
504
- if (targetElement) {
505
- targetElement.removeAttribute('secondary-selected')
506
- }
507
- })
508
- }
509
-
510
- [notifyChanged](): void {
511
- this.target.dispatchEvent(new Event('selectedchange'))
512
- }
513
- }