@knotx/plugins-selection 0.3.3 → 0.3.5

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/dist/index.cjs CHANGED
@@ -73,8 +73,8 @@ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use
73
73
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
74
74
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
75
75
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
76
- var _destroy_dec, _clearSelection_dec, _select_dec, _getSelected_dec, _init_dec, _interaction_dec, _registerRules_dec, _selected_dec, _a, _init;
77
- class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.register("selected")], _registerRules_dec = [decorators.register("registerRules")], _interaction_dec = [decorators.inject.interaction()], _init_dec = [decorators.OnInit], _getSelected_dec = [decorators.tool("Get selected items", {})], _select_dec = [decorators.tool("Items that match the registered rules will be selected, manifested as the item showing a selected style.", {
76
+ var _destroy_dec, _clearSelection_dec, _select_dec, _getSelected_dec, _init_dec, _edgeScroll_dec, _interaction_dec, _setElementOverlap_dec, _setClearSelectionBeforeStart_dec, _clearSelectionBeforeStart_dec, _setRuleEnabled_dec, _registerRules_dec, _selected_dec, _a, _init;
77
+ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.register("selected")], _registerRules_dec = [decorators.register("registerRules")], _setRuleEnabled_dec = [decorators.register("setRuleEnabled")], _clearSelectionBeforeStart_dec = [decorators.observable()], _setClearSelectionBeforeStart_dec = [decorators.register("setClearSelectionBeforeStart")], _setElementOverlap_dec = [decorators.register("setElementOverlap")], _interaction_dec = [decorators.inject.interaction()], _edgeScroll_dec = [decorators.inject.canvas.edgeScroll()], _init_dec = [decorators.OnInit], _getSelected_dec = [decorators.tool("Get selected items", {})], _select_dec = [decorators.tool("Items that match the registered rules will be selected, manifested as the item showing a selected style.", {
78
78
  type: "array",
79
79
  items: {
80
80
  type: "object",
@@ -105,21 +105,39 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
105
105
  __publicField(this, "ruleMap", /* @__PURE__ */ new Map());
106
106
  __publicField(this, "enableDrag", true);
107
107
  __publicField(this, "isDragging", false);
108
+ __publicField(this, "enableEdgeScroll", false);
108
109
  __publicField(this, "updateFrameId");
109
110
  __publicField(this, "selected", __runInitializers(_init, 8, this, [])), __runInitializers(_init, 11, this);
110
111
  __publicField(this, "registerRules", __runInitializers(_init, 12, this, (rules) => {
111
112
  rules.forEach((rule) => {
112
- this.ruleMap.set(rule.className, rule);
113
+ this.ruleMap.set(rule.type, rule);
113
114
  });
114
115
  return () => {
115
116
  rules.forEach((rule) => {
116
- if (this.ruleMap.get(rule.className) === rule) {
117
- this.ruleMap.delete(rule.className);
117
+ if (this.ruleMap.get(rule.type) === rule) {
118
+ this.ruleMap.delete(rule.type);
118
119
  }
119
120
  });
120
121
  };
121
122
  })), __runInitializers(_init, 15, this);
122
- __publicField(this, "interaction", __runInitializers(_init, 16, this)), __runInitializers(_init, 19, this);
123
+ __publicField(this, "setRuleEnabled", __runInitializers(_init, 16, this, (type, enabled) => {
124
+ const rule = this.ruleMap.get(type);
125
+ if (rule) {
126
+ rule.enabled = enabled;
127
+ }
128
+ })), __runInitializers(_init, 19, this);
129
+ __publicField(this, "clearSelectionBeforeStart", __runInitializers(_init, 20, this, true)), __runInitializers(_init, 23, this);
130
+ __publicField(this, "setClearSelectionBeforeStart", __runInitializers(_init, 24, this, (clearSelectionBeforeStart) => {
131
+ this.clearSelectionBeforeStart = clearSelectionBeforeStart;
132
+ })), __runInitializers(_init, 27, this);
133
+ __publicField(this, "setElementOverlap", __runInitializers(_init, 28, this, (overlap) => {
134
+ try {
135
+ this.selection._options.behaviour.overlap = overlap;
136
+ } catch (e) {
137
+ }
138
+ })), __runInitializers(_init, 31, this);
139
+ __publicField(this, "interaction", __runInitializers(_init, 32, this)), __runInitializers(_init, 35, this);
140
+ __publicField(this, "edgeScroll", __runInitializers(_init, 36, this)), __runInitializers(_init, 39, this);
123
141
  __publicField(this, "onBeforeStart", (_) => {
124
142
  });
125
143
  __publicField(this, "onBeforeDrag", () => {
@@ -129,15 +147,20 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
129
147
  __publicField(this, "onStart", ({ event, store }) => {
130
148
  var _a2;
131
149
  this.interaction.start(this.pluginId, "select", core.InteractionPriority.MarqueeSelection);
150
+ if (this.enableEdgeScroll && this.edgeScroll) {
151
+ this.edgeScroll.setConfig({ enabled: true });
152
+ }
132
153
  if (!(event == null ? void 0 : event.ctrlKey) && !(event == null ? void 0 : event.metaKey) && !(event == null ? void 0 : event.shiftKey)) {
133
- store.stored.forEach((element) => {
134
- const rule = this.getElementRule(element);
135
- if (rule == null ? void 0 : rule.activeClassName) {
136
- element.classList.remove(rule.activeClassName);
154
+ if (this.clearSelectionBeforeStart) {
155
+ store.stored.forEach((element) => {
156
+ const rule = this.getElementRule(element);
157
+ if (rule == null ? void 0 : rule.activeClassName) {
158
+ element.classList.remove(rule.activeClassName);
159
+ }
137
160
  element.removeAttribute("data-selected");
138
- }
139
- });
140
- (_a2 = this.selection) == null ? void 0 : _a2.clearSelection(true, true);
161
+ });
162
+ (_a2 = this.selection) == null ? void 0 : _a2.clearSelection(true, true);
163
+ }
141
164
  }
142
165
  });
143
166
  __publicField(this, "onMove", ({ store: { stored, changed: { added, removed } }, selection }) => {
@@ -171,8 +194,8 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
171
194
  }
172
195
  if (rule.activeClassName) {
173
196
  element.classList.remove(rule.activeClassName);
174
- element.removeAttribute("data-selected");
175
197
  }
198
+ element.removeAttribute("data-selected");
176
199
  });
177
200
  added.forEach((element) => {
178
201
  const rule = this.getElementRule(element);
@@ -182,7 +205,7 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
182
205
  const type = rule.type;
183
206
  const id = rule.idGetter(element);
184
207
  for (const [, rule2] of this.ruleMap) {
185
- if (rule2.onSelected) {
208
+ if (rule2.enabled !== false && rule2.onSelected) {
186
209
  if (!rule2.onSelected(__spreadValues({ element, type, id }, context))) {
187
210
  selection.deselect(element, true);
188
211
  return;
@@ -191,12 +214,15 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
191
214
  }
192
215
  if (rule.activeClassName) {
193
216
  element.classList.add(rule.activeClassName);
194
- element.setAttribute("data-selected", "true");
195
217
  }
218
+ element.setAttribute("data-selected", "true");
196
219
  });
197
220
  });
198
221
  __publicField(this, "onStop", ({ event }) => {
199
222
  this.interaction.end(this.pluginId, "select");
223
+ if (this.enableEdgeScroll && this.edgeScroll) {
224
+ this.edgeScroll.setConfig({ enabled: false });
225
+ }
200
226
  if (event) {
201
227
  if (this.isDragging) {
202
228
  this.isDragging = false;
@@ -208,7 +234,7 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
208
234
  __publicField(this, "updateSelected", () => {
209
235
  var _a2;
210
236
  const selected = [];
211
- for (const element of ((_a2 = this.selection) == null ? void 0 : _a2.getSelection()) || []) {
237
+ for (const element of new Set(((_a2 = this.selection) == null ? void 0 : _a2.getSelection()) || [])) {
212
238
  const rule = this.getElementRule(element);
213
239
  if (rule) {
214
240
  selected.push({ type: rule.type, id: rule.idGetter(element) });
@@ -227,14 +253,17 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
227
253
  activeClassName: core.bem("node", "wrapper", "selected"),
228
254
  idGetter: (element) => element.getAttribute("data-node-id") || ""
229
255
  };
230
- this.ruleMap.set(nodeRule.className, nodeRule);
256
+ this.ruleMap.set(nodeRule.type, nodeRule);
231
257
  }
232
258
  for (const rule of config.rules || []) {
233
- this.ruleMap.set(rule.className, rule);
259
+ this.ruleMap.set(rule.type, rule);
234
260
  }
235
261
  if (config.enableDrag !== void 0) {
236
262
  this.enableDrag = config.enableDrag;
237
263
  }
264
+ if (config.enableEdgeScroll !== void 0) {
265
+ this.enableEdgeScroll = config.enableEdgeScroll;
266
+ }
238
267
  queueMicrotask(() => this.createSelection());
239
268
  }
240
269
  createSelection() {
@@ -243,12 +272,17 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
243
272
  // container,
244
273
  boundaries: [container],
245
274
  selectionAreaClass: this.selectionAreaClassName,
246
- selectables: Array.from(this.ruleMap.keys()).map((className) => `.${className}`)
275
+ selectables: Array.from(new Set(Array.from(this.ruleMap.values()).map(({ className }) => `.${className}`))),
276
+ behaviour: {
277
+ scrolling: {
278
+ manualSpeed: 0
279
+ }
280
+ }
247
281
  }).on("beforedrag", this.onBeforeDrag).on("beforestart", this.onBeforeStart).on("start", this.onStart).on("move", this.onMove).on("stop", this.onStop);
248
282
  }
249
283
  getElementRule(element) {
250
- for (const [className, rule] of this.ruleMap) {
251
- if (element.classList.contains(className)) {
284
+ for (const [, rule] of this.ruleMap) {
285
+ if (rule.enabled !== false && element.classList.contains(rule.className)) {
252
286
  return rule;
253
287
  }
254
288
  }
@@ -259,15 +293,11 @@ class Selection extends (_a = core.BasePlugin, _selected_dec = [decorators.regis
259
293
  }
260
294
  select(items) {
261
295
  var _a2;
262
- const typeToClassName = /* @__PURE__ */ new Map();
263
- this.ruleMap.forEach((rule, className) => {
264
- typeToClassName.set(rule.type, className);
265
- });
266
296
  const selectors = [];
267
297
  for (const item of items) {
268
- const className = typeToClassName.get(item.type);
269
- if (className) {
270
- selectors.push(`.${className}[data-${item.type}-id="${item.id}"]`);
298
+ const rule = this.ruleMap.get(item.type);
299
+ if (rule) {
300
+ selectors.push(`.${rule.className}[data-${rule.dataSelectorType || item.type}-id="${item.id}"]`);
271
301
  }
272
302
  }
273
303
  (_a2 = this.selection) == null ? void 0 : _a2.select(selectors);
@@ -290,7 +320,12 @@ __decorateElement(_init, 1, "clearSelection", _clearSelection_dec, Selection);
290
320
  __decorateElement(_init, 1, "destroy", _destroy_dec, Selection);
291
321
  __decorateElement(_init, 5, "selected", _selected_dec, Selection);
292
322
  __decorateElement(_init, 5, "registerRules", _registerRules_dec, Selection);
323
+ __decorateElement(_init, 5, "setRuleEnabled", _setRuleEnabled_dec, Selection);
324
+ __decorateElement(_init, 5, "clearSelectionBeforeStart", _clearSelectionBeforeStart_dec, Selection);
325
+ __decorateElement(_init, 5, "setClearSelectionBeforeStart", _setClearSelectionBeforeStart_dec, Selection);
326
+ __decorateElement(_init, 5, "setElementOverlap", _setElementOverlap_dec, Selection);
293
327
  __decorateElement(_init, 5, "interaction", _interaction_dec, Selection);
328
+ __decorateElement(_init, 5, "edgeScroll", _edgeScroll_dec, Selection);
294
329
  __decoratorMetadata(_init, Selection);
295
330
 
296
331
  exports.Selection = Selection;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
- import { BasePlugin } from '@knotx/core';
1
+ import { BasePlugin, PluginData } from '@knotx/core';
2
+ import { OverlapMode } from '@viselect/vanilla';
2
3
 
3
4
  interface SelectionSelectedItem {
4
5
  type: string;
@@ -9,6 +10,25 @@ declare module '@knotx/core' {
9
10
  selection: {
10
11
  selected: SelectionSelectedItem[];
11
12
  registerRules: (rules: SelectionRule[]) => () => void;
13
+ /**
14
+ * 启用/禁用规则
15
+ * @param type
16
+ * @param enabled
17
+ * @returns
18
+ */
19
+ setRuleEnabled: (type: string, enabled: boolean) => void;
20
+ /**
21
+ * 是否在开始选择前清除选择
22
+ * @param isClearSelectionBeforeStart
23
+ * @returns
24
+ */
25
+ setClearSelectionBeforeStart: (isClearSelectionBeforeStart: boolean) => void;
26
+ /**
27
+ * 设置元素在选中状态下被二次选中时的行为
28
+ * @param overlap
29
+ * @returns
30
+ */
31
+ setElementOverlap: (overlap: OverlapMode) => void;
12
32
  };
13
33
  }
14
34
  interface PluginTools {
@@ -42,6 +62,16 @@ interface SelectionRule {
42
62
  select: (elements: Element[]) => void;
43
63
  deselect: (elements: Element[]) => void;
44
64
  }) => boolean;
65
+ /**
66
+ * 数据选择器类型,用于匹配 dom 元素的 data-${type}-id 属性
67
+ * default: `type
68
+ */
69
+ dataSelectorType?: string;
70
+ /**
71
+ * 是否启用规则
72
+ * default: true
73
+ */
74
+ enabled?: boolean;
45
75
  }
46
76
  interface SelectionConfig {
47
77
  selectionAreaClassName?: string;
@@ -59,6 +89,11 @@ interface SelectionConfig {
59
89
  * default: bemSelector('canvas', 'wrapper')
60
90
  */
61
91
  container?: string;
92
+ /**
93
+ * 是否启用边缘滚动
94
+ * default: false
95
+ */
96
+ enableEdgeScroll?: boolean;
62
97
  }
63
98
  declare class Selection extends BasePlugin<'selection', SelectionConfig> {
64
99
  name: "selection";
@@ -68,10 +103,16 @@ declare class Selection extends BasePlugin<'selection', SelectionConfig> {
68
103
  private ruleMap;
69
104
  private enableDrag;
70
105
  private isDragging;
106
+ private enableEdgeScroll;
71
107
  private updateFrameId;
72
108
  selected: SelectionSelectedItem[];
73
109
  registerRules: (rules: SelectionRule[]) => () => void;
110
+ setRuleEnabled: (type: string, enabled: boolean) => void;
111
+ clearSelectionBeforeStart: boolean;
112
+ setClearSelectionBeforeStart: (clearSelectionBeforeStart: boolean) => void;
113
+ setElementOverlap: (overlap: OverlapMode) => void;
74
114
  private interaction;
115
+ edgeScroll: PluginData['canvas']['edgeScroll'];
75
116
  init(config?: SelectionConfig): void;
76
117
  private createSelection;
77
118
  private onBeforeStart;
package/dist/index.d.mts CHANGED
@@ -1,4 +1,5 @@
1
- import { BasePlugin } from '@knotx/core';
1
+ import { BasePlugin, PluginData } from '@knotx/core';
2
+ import { OverlapMode } from '@viselect/vanilla';
2
3
 
3
4
  interface SelectionSelectedItem {
4
5
  type: string;
@@ -9,6 +10,25 @@ declare module '@knotx/core' {
9
10
  selection: {
10
11
  selected: SelectionSelectedItem[];
11
12
  registerRules: (rules: SelectionRule[]) => () => void;
13
+ /**
14
+ * 启用/禁用规则
15
+ * @param type
16
+ * @param enabled
17
+ * @returns
18
+ */
19
+ setRuleEnabled: (type: string, enabled: boolean) => void;
20
+ /**
21
+ * 是否在开始选择前清除选择
22
+ * @param isClearSelectionBeforeStart
23
+ * @returns
24
+ */
25
+ setClearSelectionBeforeStart: (isClearSelectionBeforeStart: boolean) => void;
26
+ /**
27
+ * 设置元素在选中状态下被二次选中时的行为
28
+ * @param overlap
29
+ * @returns
30
+ */
31
+ setElementOverlap: (overlap: OverlapMode) => void;
12
32
  };
13
33
  }
14
34
  interface PluginTools {
@@ -42,6 +62,16 @@ interface SelectionRule {
42
62
  select: (elements: Element[]) => void;
43
63
  deselect: (elements: Element[]) => void;
44
64
  }) => boolean;
65
+ /**
66
+ * 数据选择器类型,用于匹配 dom 元素的 data-${type}-id 属性
67
+ * default: `type
68
+ */
69
+ dataSelectorType?: string;
70
+ /**
71
+ * 是否启用规则
72
+ * default: true
73
+ */
74
+ enabled?: boolean;
45
75
  }
46
76
  interface SelectionConfig {
47
77
  selectionAreaClassName?: string;
@@ -59,6 +89,11 @@ interface SelectionConfig {
59
89
  * default: bemSelector('canvas', 'wrapper')
60
90
  */
61
91
  container?: string;
92
+ /**
93
+ * 是否启用边缘滚动
94
+ * default: false
95
+ */
96
+ enableEdgeScroll?: boolean;
62
97
  }
63
98
  declare class Selection extends BasePlugin<'selection', SelectionConfig> {
64
99
  name: "selection";
@@ -68,10 +103,16 @@ declare class Selection extends BasePlugin<'selection', SelectionConfig> {
68
103
  private ruleMap;
69
104
  private enableDrag;
70
105
  private isDragging;
106
+ private enableEdgeScroll;
71
107
  private updateFrameId;
72
108
  selected: SelectionSelectedItem[];
73
109
  registerRules: (rules: SelectionRule[]) => () => void;
110
+ setRuleEnabled: (type: string, enabled: boolean) => void;
111
+ clearSelectionBeforeStart: boolean;
112
+ setClearSelectionBeforeStart: (clearSelectionBeforeStart: boolean) => void;
113
+ setElementOverlap: (overlap: OverlapMode) => void;
74
114
  private interaction;
115
+ edgeScroll: PluginData['canvas']['edgeScroll'];
75
116
  init(config?: SelectionConfig): void;
76
117
  private createSelection;
77
118
  private onBeforeStart;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { BasePlugin } from '@knotx/core';
1
+ import { BasePlugin, PluginData } from '@knotx/core';
2
+ import { OverlapMode } from '@viselect/vanilla';
2
3
 
3
4
  interface SelectionSelectedItem {
4
5
  type: string;
@@ -9,6 +10,25 @@ declare module '@knotx/core' {
9
10
  selection: {
10
11
  selected: SelectionSelectedItem[];
11
12
  registerRules: (rules: SelectionRule[]) => () => void;
13
+ /**
14
+ * 启用/禁用规则
15
+ * @param type
16
+ * @param enabled
17
+ * @returns
18
+ */
19
+ setRuleEnabled: (type: string, enabled: boolean) => void;
20
+ /**
21
+ * 是否在开始选择前清除选择
22
+ * @param isClearSelectionBeforeStart
23
+ * @returns
24
+ */
25
+ setClearSelectionBeforeStart: (isClearSelectionBeforeStart: boolean) => void;
26
+ /**
27
+ * 设置元素在选中状态下被二次选中时的行为
28
+ * @param overlap
29
+ * @returns
30
+ */
31
+ setElementOverlap: (overlap: OverlapMode) => void;
12
32
  };
13
33
  }
14
34
  interface PluginTools {
@@ -42,6 +62,16 @@ interface SelectionRule {
42
62
  select: (elements: Element[]) => void;
43
63
  deselect: (elements: Element[]) => void;
44
64
  }) => boolean;
65
+ /**
66
+ * 数据选择器类型,用于匹配 dom 元素的 data-${type}-id 属性
67
+ * default: `type
68
+ */
69
+ dataSelectorType?: string;
70
+ /**
71
+ * 是否启用规则
72
+ * default: true
73
+ */
74
+ enabled?: boolean;
45
75
  }
46
76
  interface SelectionConfig {
47
77
  selectionAreaClassName?: string;
@@ -59,6 +89,11 @@ interface SelectionConfig {
59
89
  * default: bemSelector('canvas', 'wrapper')
60
90
  */
61
91
  container?: string;
92
+ /**
93
+ * 是否启用边缘滚动
94
+ * default: false
95
+ */
96
+ enableEdgeScroll?: boolean;
62
97
  }
63
98
  declare class Selection extends BasePlugin<'selection', SelectionConfig> {
64
99
  name: "selection";
@@ -68,10 +103,16 @@ declare class Selection extends BasePlugin<'selection', SelectionConfig> {
68
103
  private ruleMap;
69
104
  private enableDrag;
70
105
  private isDragging;
106
+ private enableEdgeScroll;
71
107
  private updateFrameId;
72
108
  selected: SelectionSelectedItem[];
73
109
  registerRules: (rules: SelectionRule[]) => () => void;
110
+ setRuleEnabled: (type: string, enabled: boolean) => void;
111
+ clearSelectionBeforeStart: boolean;
112
+ setClearSelectionBeforeStart: (clearSelectionBeforeStart: boolean) => void;
113
+ setElementOverlap: (overlap: OverlapMode) => void;
74
114
  private interaction;
115
+ edgeScroll: PluginData['canvas']['edgeScroll'];
75
116
  init(config?: SelectionConfig): void;
76
117
  private createSelection;
77
118
  private onBeforeStart;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { bemSelector, bem, BasePlugin, InteractionPriority } from '@knotx/core';
2
- import { register, inject, tool, OnInit, OnDestroy } from '@knotx/decorators';
2
+ import { register, observable, inject, tool, OnInit, OnDestroy } from '@knotx/decorators';
3
3
  import SelectionArea from '@viselect/vanilla';
4
4
 
5
5
  var __create = Object.create;
@@ -67,8 +67,8 @@ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use
67
67
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
68
68
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
69
69
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
70
- var _destroy_dec, _clearSelection_dec, _select_dec, _getSelected_dec, _init_dec, _interaction_dec, _registerRules_dec, _selected_dec, _a, _init;
71
- class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")], _registerRules_dec = [register("registerRules")], _interaction_dec = [inject.interaction()], _init_dec = [OnInit], _getSelected_dec = [tool("Get selected items", {})], _select_dec = [tool("Items that match the registered rules will be selected, manifested as the item showing a selected style.", {
70
+ var _destroy_dec, _clearSelection_dec, _select_dec, _getSelected_dec, _init_dec, _edgeScroll_dec, _interaction_dec, _setElementOverlap_dec, _setClearSelectionBeforeStart_dec, _clearSelectionBeforeStart_dec, _setRuleEnabled_dec, _registerRules_dec, _selected_dec, _a, _init;
71
+ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")], _registerRules_dec = [register("registerRules")], _setRuleEnabled_dec = [register("setRuleEnabled")], _clearSelectionBeforeStart_dec = [observable()], _setClearSelectionBeforeStart_dec = [register("setClearSelectionBeforeStart")], _setElementOverlap_dec = [register("setElementOverlap")], _interaction_dec = [inject.interaction()], _edgeScroll_dec = [inject.canvas.edgeScroll()], _init_dec = [OnInit], _getSelected_dec = [tool("Get selected items", {})], _select_dec = [tool("Items that match the registered rules will be selected, manifested as the item showing a selected style.", {
72
72
  type: "array",
73
73
  items: {
74
74
  type: "object",
@@ -99,21 +99,39 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
99
99
  __publicField(this, "ruleMap", /* @__PURE__ */ new Map());
100
100
  __publicField(this, "enableDrag", true);
101
101
  __publicField(this, "isDragging", false);
102
+ __publicField(this, "enableEdgeScroll", false);
102
103
  __publicField(this, "updateFrameId");
103
104
  __publicField(this, "selected", __runInitializers(_init, 8, this, [])), __runInitializers(_init, 11, this);
104
105
  __publicField(this, "registerRules", __runInitializers(_init, 12, this, (rules) => {
105
106
  rules.forEach((rule) => {
106
- this.ruleMap.set(rule.className, rule);
107
+ this.ruleMap.set(rule.type, rule);
107
108
  });
108
109
  return () => {
109
110
  rules.forEach((rule) => {
110
- if (this.ruleMap.get(rule.className) === rule) {
111
- this.ruleMap.delete(rule.className);
111
+ if (this.ruleMap.get(rule.type) === rule) {
112
+ this.ruleMap.delete(rule.type);
112
113
  }
113
114
  });
114
115
  };
115
116
  })), __runInitializers(_init, 15, this);
116
- __publicField(this, "interaction", __runInitializers(_init, 16, this)), __runInitializers(_init, 19, this);
117
+ __publicField(this, "setRuleEnabled", __runInitializers(_init, 16, this, (type, enabled) => {
118
+ const rule = this.ruleMap.get(type);
119
+ if (rule) {
120
+ rule.enabled = enabled;
121
+ }
122
+ })), __runInitializers(_init, 19, this);
123
+ __publicField(this, "clearSelectionBeforeStart", __runInitializers(_init, 20, this, true)), __runInitializers(_init, 23, this);
124
+ __publicField(this, "setClearSelectionBeforeStart", __runInitializers(_init, 24, this, (clearSelectionBeforeStart) => {
125
+ this.clearSelectionBeforeStart = clearSelectionBeforeStart;
126
+ })), __runInitializers(_init, 27, this);
127
+ __publicField(this, "setElementOverlap", __runInitializers(_init, 28, this, (overlap) => {
128
+ try {
129
+ this.selection._options.behaviour.overlap = overlap;
130
+ } catch (e) {
131
+ }
132
+ })), __runInitializers(_init, 31, this);
133
+ __publicField(this, "interaction", __runInitializers(_init, 32, this)), __runInitializers(_init, 35, this);
134
+ __publicField(this, "edgeScroll", __runInitializers(_init, 36, this)), __runInitializers(_init, 39, this);
117
135
  __publicField(this, "onBeforeStart", (_) => {
118
136
  });
119
137
  __publicField(this, "onBeforeDrag", () => {
@@ -123,15 +141,20 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
123
141
  __publicField(this, "onStart", ({ event, store }) => {
124
142
  var _a2;
125
143
  this.interaction.start(this.pluginId, "select", InteractionPriority.MarqueeSelection);
144
+ if (this.enableEdgeScroll && this.edgeScroll) {
145
+ this.edgeScroll.setConfig({ enabled: true });
146
+ }
126
147
  if (!(event == null ? void 0 : event.ctrlKey) && !(event == null ? void 0 : event.metaKey) && !(event == null ? void 0 : event.shiftKey)) {
127
- store.stored.forEach((element) => {
128
- const rule = this.getElementRule(element);
129
- if (rule == null ? void 0 : rule.activeClassName) {
130
- element.classList.remove(rule.activeClassName);
148
+ if (this.clearSelectionBeforeStart) {
149
+ store.stored.forEach((element) => {
150
+ const rule = this.getElementRule(element);
151
+ if (rule == null ? void 0 : rule.activeClassName) {
152
+ element.classList.remove(rule.activeClassName);
153
+ }
131
154
  element.removeAttribute("data-selected");
132
- }
133
- });
134
- (_a2 = this.selection) == null ? void 0 : _a2.clearSelection(true, true);
155
+ });
156
+ (_a2 = this.selection) == null ? void 0 : _a2.clearSelection(true, true);
157
+ }
135
158
  }
136
159
  });
137
160
  __publicField(this, "onMove", ({ store: { stored, changed: { added, removed } }, selection }) => {
@@ -165,8 +188,8 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
165
188
  }
166
189
  if (rule.activeClassName) {
167
190
  element.classList.remove(rule.activeClassName);
168
- element.removeAttribute("data-selected");
169
191
  }
192
+ element.removeAttribute("data-selected");
170
193
  });
171
194
  added.forEach((element) => {
172
195
  const rule = this.getElementRule(element);
@@ -176,7 +199,7 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
176
199
  const type = rule.type;
177
200
  const id = rule.idGetter(element);
178
201
  for (const [, rule2] of this.ruleMap) {
179
- if (rule2.onSelected) {
202
+ if (rule2.enabled !== false && rule2.onSelected) {
180
203
  if (!rule2.onSelected(__spreadValues({ element, type, id }, context))) {
181
204
  selection.deselect(element, true);
182
205
  return;
@@ -185,12 +208,15 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
185
208
  }
186
209
  if (rule.activeClassName) {
187
210
  element.classList.add(rule.activeClassName);
188
- element.setAttribute("data-selected", "true");
189
211
  }
212
+ element.setAttribute("data-selected", "true");
190
213
  });
191
214
  });
192
215
  __publicField(this, "onStop", ({ event }) => {
193
216
  this.interaction.end(this.pluginId, "select");
217
+ if (this.enableEdgeScroll && this.edgeScroll) {
218
+ this.edgeScroll.setConfig({ enabled: false });
219
+ }
194
220
  if (event) {
195
221
  if (this.isDragging) {
196
222
  this.isDragging = false;
@@ -202,7 +228,7 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
202
228
  __publicField(this, "updateSelected", () => {
203
229
  var _a2;
204
230
  const selected = [];
205
- for (const element of ((_a2 = this.selection) == null ? void 0 : _a2.getSelection()) || []) {
231
+ for (const element of new Set(((_a2 = this.selection) == null ? void 0 : _a2.getSelection()) || [])) {
206
232
  const rule = this.getElementRule(element);
207
233
  if (rule) {
208
234
  selected.push({ type: rule.type, id: rule.idGetter(element) });
@@ -221,14 +247,17 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
221
247
  activeClassName: bem("node", "wrapper", "selected"),
222
248
  idGetter: (element) => element.getAttribute("data-node-id") || ""
223
249
  };
224
- this.ruleMap.set(nodeRule.className, nodeRule);
250
+ this.ruleMap.set(nodeRule.type, nodeRule);
225
251
  }
226
252
  for (const rule of config.rules || []) {
227
- this.ruleMap.set(rule.className, rule);
253
+ this.ruleMap.set(rule.type, rule);
228
254
  }
229
255
  if (config.enableDrag !== void 0) {
230
256
  this.enableDrag = config.enableDrag;
231
257
  }
258
+ if (config.enableEdgeScroll !== void 0) {
259
+ this.enableEdgeScroll = config.enableEdgeScroll;
260
+ }
232
261
  queueMicrotask(() => this.createSelection());
233
262
  }
234
263
  createSelection() {
@@ -237,12 +266,17 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
237
266
  // container,
238
267
  boundaries: [container],
239
268
  selectionAreaClass: this.selectionAreaClassName,
240
- selectables: Array.from(this.ruleMap.keys()).map((className) => `.${className}`)
269
+ selectables: Array.from(new Set(Array.from(this.ruleMap.values()).map(({ className }) => `.${className}`))),
270
+ behaviour: {
271
+ scrolling: {
272
+ manualSpeed: 0
273
+ }
274
+ }
241
275
  }).on("beforedrag", this.onBeforeDrag).on("beforestart", this.onBeforeStart).on("start", this.onStart).on("move", this.onMove).on("stop", this.onStop);
242
276
  }
243
277
  getElementRule(element) {
244
- for (const [className, rule] of this.ruleMap) {
245
- if (element.classList.contains(className)) {
278
+ for (const [, rule] of this.ruleMap) {
279
+ if (rule.enabled !== false && element.classList.contains(rule.className)) {
246
280
  return rule;
247
281
  }
248
282
  }
@@ -253,15 +287,11 @@ class Selection extends (_a = BasePlugin, _selected_dec = [register("selected")]
253
287
  }
254
288
  select(items) {
255
289
  var _a2;
256
- const typeToClassName = /* @__PURE__ */ new Map();
257
- this.ruleMap.forEach((rule, className) => {
258
- typeToClassName.set(rule.type, className);
259
- });
260
290
  const selectors = [];
261
291
  for (const item of items) {
262
- const className = typeToClassName.get(item.type);
263
- if (className) {
264
- selectors.push(`.${className}[data-${item.type}-id="${item.id}"]`);
292
+ const rule = this.ruleMap.get(item.type);
293
+ if (rule) {
294
+ selectors.push(`.${rule.className}[data-${rule.dataSelectorType || item.type}-id="${item.id}"]`);
265
295
  }
266
296
  }
267
297
  (_a2 = this.selection) == null ? void 0 : _a2.select(selectors);
@@ -284,7 +314,12 @@ __decorateElement(_init, 1, "clearSelection", _clearSelection_dec, Selection);
284
314
  __decorateElement(_init, 1, "destroy", _destroy_dec, Selection);
285
315
  __decorateElement(_init, 5, "selected", _selected_dec, Selection);
286
316
  __decorateElement(_init, 5, "registerRules", _registerRules_dec, Selection);
317
+ __decorateElement(_init, 5, "setRuleEnabled", _setRuleEnabled_dec, Selection);
318
+ __decorateElement(_init, 5, "clearSelectionBeforeStart", _clearSelectionBeforeStart_dec, Selection);
319
+ __decorateElement(_init, 5, "setClearSelectionBeforeStart", _setClearSelectionBeforeStart_dec, Selection);
320
+ __decorateElement(_init, 5, "setElementOverlap", _setElementOverlap_dec, Selection);
287
321
  __decorateElement(_init, 5, "interaction", _interaction_dec, Selection);
322
+ __decorateElement(_init, 5, "edgeScroll", _edgeScroll_dec, Selection);
288
323
  __decoratorMetadata(_init, Selection);
289
324
 
290
325
  export { Selection };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knotx/plugins-selection",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Selection Plugin for Knotx",
5
5
  "author": "boenfu",
6
6
  "license": "MIT",
@@ -27,16 +27,20 @@
27
27
  "files": [
28
28
  "dist"
29
29
  ],
30
+ "peerDependencies": {
31
+ "@knotx/plugins-canvas": "0.3.5"
32
+ },
30
33
  "dependencies": {
31
34
  "@viselect/vanilla": "^3.9.0",
32
35
  "rxjs": "^7.8.1",
33
- "@knotx/core": "0.3.3",
34
- "@knotx/decorators": "0.3.3"
36
+ "@knotx/core": "0.3.5",
37
+ "@knotx/decorators": "0.3.5"
35
38
  },
36
39
  "devDependencies": {
37
- "@knotx/build-config": "0.3.3",
38
- "@knotx/eslint-config": "0.3.3",
39
- "@knotx/typescript-config": "0.3.3"
40
+ "@knotx/build-config": "0.3.5",
41
+ "@knotx/eslint-config": "0.3.5",
42
+ "@knotx/plugins-canvas": "0.3.5",
43
+ "@knotx/typescript-config": "0.3.5"
40
44
  },
41
45
  "scripts": {
42
46
  "build": "unbuild",