@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 +64 -29
- package/dist/index.d.cts +42 -1
- package/dist/index.d.mts +42 -1
- package/dist/index.d.ts +42 -1
- package/dist/index.js +65 -30
- package/package.json +10 -6
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.
|
|
113
|
+
this.ruleMap.set(rule.type, rule);
|
|
113
114
|
});
|
|
114
115
|
return () => {
|
|
115
116
|
rules.forEach((rule) => {
|
|
116
|
-
if (this.ruleMap.get(rule.
|
|
117
|
-
this.ruleMap.delete(rule.
|
|
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, "
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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.
|
|
256
|
+
this.ruleMap.set(nodeRule.type, nodeRule);
|
|
231
257
|
}
|
|
232
258
|
for (const rule of config.rules || []) {
|
|
233
|
-
this.ruleMap.set(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.
|
|
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 [
|
|
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
|
|
269
|
-
if (
|
|
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.
|
|
107
|
+
this.ruleMap.set(rule.type, rule);
|
|
107
108
|
});
|
|
108
109
|
return () => {
|
|
109
110
|
rules.forEach((rule) => {
|
|
110
|
-
if (this.ruleMap.get(rule.
|
|
111
|
-
this.ruleMap.delete(rule.
|
|
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, "
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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.
|
|
250
|
+
this.ruleMap.set(nodeRule.type, nodeRule);
|
|
225
251
|
}
|
|
226
252
|
for (const rule of config.rules || []) {
|
|
227
|
-
this.ruleMap.set(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.
|
|
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 [
|
|
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
|
|
263
|
-
if (
|
|
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
|
+
"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.
|
|
34
|
-
"@knotx/decorators": "0.3.
|
|
36
|
+
"@knotx/core": "0.3.5",
|
|
37
|
+
"@knotx/decorators": "0.3.5"
|
|
35
38
|
},
|
|
36
39
|
"devDependencies": {
|
|
37
|
-
"@knotx/build-config": "0.3.
|
|
38
|
-
"@knotx/eslint-config": "0.3.
|
|
39
|
-
"@knotx/
|
|
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",
|