@umbraci/jsmind 0.10.18 → 1.0.1-beta

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 (56) hide show
  1. package/README.md +7 -7
  2. package/dist/jsmind.draggable-node.js +7 -472
  3. package/dist/jsmind.draggable-node.js.map +1 -1
  4. package/dist/jsmind.history.js +7 -980
  5. package/dist/jsmind.history.js.map +1 -1
  6. package/dist/jsmind.js +7 -2624
  7. package/dist/jsmind.js.map +1 -1
  8. package/dist/jsmind.multi-select.js +7 -671
  9. package/dist/jsmind.multi-select.js.map +1 -1
  10. package/dist/jsmind.multiline-text.js +7 -156
  11. package/dist/jsmind.multiline-text.js.map +1 -1
  12. package/dist/jsmind.screenshot.js +7 -156
  13. package/dist/jsmind.screenshot.js.map +1 -1
  14. package/es/jsmind.draggable-node.js +7 -443
  15. package/es/jsmind.draggable-node.js.map +1 -1
  16. package/es/jsmind.history.js +7 -944
  17. package/es/jsmind.history.js.map +1 -1
  18. package/es/jsmind.js +7 -2570
  19. package/es/jsmind.js.map +1 -1
  20. package/es/jsmind.multi-select.js +7 -621
  21. package/es/jsmind.multi-select.js.map +1 -1
  22. package/es/jsmind.multiline-text.js +7 -136
  23. package/es/jsmind.multiline-text.js.map +1 -1
  24. package/es/jsmind.screenshot.js +7 -136
  25. package/es/jsmind.screenshot.js.map +1 -1
  26. package/lib/jsmind.draggable-node.js +7 -450
  27. package/lib/jsmind.draggable-node.js.map +1 -1
  28. package/lib/jsmind.history.js +7 -946
  29. package/lib/jsmind.history.js.map +1 -1
  30. package/lib/jsmind.js +7 -2571
  31. package/lib/jsmind.js.map +1 -1
  32. package/lib/jsmind.multi-select.js +7 -623
  33. package/lib/jsmind.multi-select.js.map +1 -1
  34. package/lib/jsmind.multiline-text.js +7 -141
  35. package/lib/jsmind.multiline-text.js.map +1 -1
  36. package/lib/jsmind.screenshot.js +7 -145
  37. package/lib/jsmind.screenshot.js.map +1 -1
  38. package/package.json +26 -25
  39. package/types/generated/jsmind.d.ts +21 -24
  40. package/types/generated/jsmind.mind.d.ts +7 -0
  41. package/types/generated/{jsmind.enhanced-plugin.d.ts → jsmind.plugin-system.d.ts} +10 -10
  42. package/types/generated/jsmind.plugin.d.ts +93 -13
  43. package/types/generated/jsmind.view_provider.d.ts +1 -1
  44. package/types/generated/plugins/history/history-diff.d.ts +10 -0
  45. package/types/generated/plugins/history/jsmind.history.d.ts +2 -2
  46. package/types/generated/plugins/jsmind.draggable-node.d.ts +13 -3
  47. package/types/generated/plugins/jsmind.multi-select.d.ts +3 -3
  48. package/types/generated/plugins/jsmind.multiline-text.d.ts +67 -21
  49. package/types/generated/plugins/jsmind.screenshot.d.ts +12 -3
  50. package/types/generated/plugins/multi-select/jsmind.multi-select.d.ts +109 -0
  51. package/types/tsconfig.declaration.json +6 -1
  52. package/dist/jsmind.copy-paste.js +0 -283
  53. package/dist/jsmind.copy-paste.js.map +0 -1
  54. package/es/jsmind.copy-paste.js +0 -260
  55. package/es/jsmind.copy-paste.js.map +0 -1
  56. package/types/generated/plugins/jsmind.multiline-text-v2.d.ts +0 -58
@@ -1,673 +1,9 @@
1
1
  /**
2
- * @license BSD-3-Clause
3
- * @copyright 2014-2025 hizzgdev@163.com
4
- *
5
- * Project Home:
6
- * https://github.com/hizzgdev/jsmind/
7
- */
8
- !(function (e, t) {
9
- 'object' == typeof exports && 'undefined' != typeof module
10
- ? t(exports)
11
- : 'function' == typeof define && define.amd
12
- ? define(['exports'], t)
13
- : t(
14
- ((e = 'undefined' != typeof globalThis ? globalThis : e || self).jsMindMultiSelect =
15
- {})
16
- );
17
- })(this, function (e) {
18
- 'use strict';
19
- 'function' != typeof String.prototype.startsWith &&
20
- (String.prototype.startsWith = function (e) {
21
- return this.slice(0, e.length) === e;
22
- });
23
- const t = 1,
24
- s = 4,
25
- i = 1,
26
- n = 2,
27
- l = 3,
28
- o = 4;
29
- var _ = function () {};
30
- let d =
31
- 'undefined' == typeof console
32
- ? { level: _, log: _, debug: _, info: _, warn: _, error: _ }
33
- : {
34
- level: function (e) {
35
- d.debug = e > i ? _ : console.debug;
36
- d.info = e > n ? _ : console.info;
37
- d.warn = e > l ? _ : console.warn;
38
- d.error = e > o ? _ : console.error;
39
- },
40
- log: console.log,
41
- debug: console.debug,
42
- info: console.info,
43
- warn: console.warn,
44
- error: console.error,
45
- };
46
- class c {
47
- static instanceName = '';
48
- static preload = !1;
49
- constructor({ jm: e, pluginOpt: t }) {
50
- (this.jm = e), (this.options = t || {});
51
- }
52
- beforePluginRemove() {}
53
- beforePluginDestroy() {
54
- this.beforePluginRemove();
55
- }
56
- }
57
- const r = {
58
- enable_multi_select: !1,
59
- include_descendants: !0,
60
- shift_simple_mode: !1,
61
- allow_ctrl: !0,
62
- allow_shift: !0,
63
- filter: null,
64
- };
65
- class h {
66
- constructor(e, t) {
67
- (this.jm = e),
68
- (this.options = t),
69
- this._ensure_selection_state(),
70
- (this._selection_mode = null),
71
- (this._last_selected_node = null);
72
- }
73
- _ensure_selection_state() {
74
- this.jm.mind || (this.jm.mind = {}),
75
- this.jm.mind.selected_nodes || (this.jm.mind.selected_nodes = new Set()),
76
- this.jm.view || (this.jm.view = {}),
77
- this.jm.view.multi_selected_nodes ||
78
- (this.jm.view.multi_selected_nodes = new Map());
79
- }
80
- get_selected_nodes() {
81
- return (
82
- this._ensure_selection_state(),
83
- this.jm.mind && this.jm.mind.selected_nodes
84
- ? Array.from(this.jm.mind.selected_nodes).map(e => e.id)
85
- : []
86
- );
87
- }
88
- is_node_selected(e) {
89
- const t = this._resolve_node(e);
90
- return (
91
- !(!t || !this.jm.mind) &&
92
- (this._ensure_selection_state(), this.jm.mind.selected_nodes.has(t))
93
- );
94
- }
95
- select_node(e) {
96
- const t = this._resolve_node(e);
97
- if (!t) return void d.error('[multiSelect] node not found: ' + e);
98
- if (
99
- (this._ensure_selection_state(),
100
- this._clear_selection_state(),
101
- this._ensure_selection_state(),
102
- !this.jm.mind || !this.jm.mind.selected_nodes)
103
- )
104
- return void d.error('[multiSelect] jm.mind or selected_nodes is not available');
105
- (this.jm.mind.selected = t),
106
- (this._last_selected_node = t),
107
- this.jm.mind.selected_nodes.has(t) || this.jm.mind.selected_nodes.add(t),
108
- this._mark_node_selected(t),
109
- (this._selection_mode = 'single');
110
- const s = [t.id];
111
- this._invoke_select_event({ evt: 'select_node', data: s, node: t.id, nodes: s });
112
- }
113
- select_clear() {
114
- this._ensure_selection_state(),
115
- this.jm.mind &&
116
- ((this.jm.mind.selected = null),
117
- (this._last_selected_node = null),
118
- this._clear_selection_state());
119
- }
120
- toggle_node_selection(e) {
121
- const t = this._resolve_node(e);
122
- if (t && this.jm.layout.is_visible(t))
123
- if ((this._ensure_selection_state(), this.jm.mind.selected_nodes.has(t)))
124
- this._deselect_subtree(t);
125
- else {
126
- this._selection_mode = 'multi';
127
- this._append_selection([t]).length &&
128
- ((this.jm.mind.selected = t),
129
- (this._last_selected_node = t),
130
- this._invoke_select_event({
131
- evt: 'multi_select',
132
- data: [t.id],
133
- node: t.id,
134
- nodes: [t.id],
135
- }));
136
- }
137
- }
138
- toggle_subtree_selection(e, t) {
139
- const s = this._resolve_node(e);
140
- if (!s) return void d.error('[multiSelect] node not found: ' + e);
141
- if (!this.jm.layout.is_visible(s)) return;
142
- const i =
143
- t && void 0 !== t.include_descendants
144
- ? !!t.include_descendants
145
- : !1 !== this.options.include_descendants;
146
- if (
147
- (this._ensure_selection_state(),
148
- this.jm.mind.selected_nodes.has(s) && 'multi' === this._selection_mode)
149
- ) {
150
- let e = this._collect_subtree_nodes(s, {
151
- includeChildren: !0,
152
- respectFilter: !1,
153
- skipRootFilter: !1,
154
- });
155
- e.length || (e = [s]);
156
- const t = this._remove_selection(e);
157
- if (t.length) {
158
- this.jm.mind.selected &&
159
- this.jm.mind.selected.id === s.id &&
160
- (this.jm.mind.selected = null),
161
- (this._selection_mode = this._derive_selection_mode());
162
- const e = t.map(e => e.id);
163
- this._invoke_select_event({
164
- evt: 'multi_deselect',
165
- data: e,
166
- node: s.id,
167
- nodes: e,
168
- });
169
- }
170
- } else {
171
- this._selection_mode = 'multi';
172
- let e = this._collect_subtree_nodes(s, {
173
- includeChildren: i,
174
- respectFilter: !0,
175
- skipRootFilter: !0,
176
- });
177
- e.length || (e = [s]);
178
- const t = this._append_selection(e, { focusNode: s });
179
- this._ensure_selection_state();
180
- const n =
181
- s.parent && !this.jm.mind.selected_nodes.has(s.parent)
182
- ? this._ensure_ancestor_selection([s], s, {
183
- requireAncestorChainSelected: !0,
184
- })
185
- : [],
186
- l = t.concat(n);
187
- if (l.length) {
188
- this.jm.mind.selected = s;
189
- const e = l.map(e => e.id);
190
- this._invoke_select_event({
191
- evt: 'multi_select',
192
- data: e,
193
- node: s.id,
194
- nodes: e,
195
- });
196
- }
197
- }
198
- }
199
- get_selection_mode() {
200
- return this._selection_mode;
201
- }
202
- _handle_node_click(e) {
203
- const { e: t, node: s, element: i } = e;
204
- if (!s || !i) return;
205
- this._ensure_selection_state();
206
- const n = this._get_multi_select_mode(t);
207
- if ('ctrl' === n) this.toggle_node_selection(s);
208
- else if ('shift' === n) {
209
- const e = this.jm.get_node(s);
210
- if (!e)
211
- return void d.warn('[multiSelect] Node not found for shift selection: ' + s);
212
- if (this.options.shift_simple_mode)
213
- this.is_node_selected(s)
214
- ? this._deselect_subtree(e)
215
- : this._range_select_nodes(s);
216
- else if (this.is_node_selected(s)) this._deselect_subtree(e);
217
- else {
218
- const t = !1 !== this.options.include_descendants;
219
- let s = this._collect_subtree_nodes(e, {
220
- includeChildren: t,
221
- respectFilter: !0,
222
- skipRootFilter: !0,
223
- });
224
- s.length || (s = [e]);
225
- const i = this._append_selection(s, { focusNode: e });
226
- if (i.length) {
227
- (this.jm.mind.selected = e),
228
- (this._last_selected_node = e),
229
- (this._selection_mode = this._derive_selection_mode());
230
- const t = i.map(e => e.id);
231
- this._invoke_select_event({
232
- evt: 'multi_select',
233
- data: t,
234
- node: e.id,
235
- nodes: t,
236
- });
237
- } else
238
- this._ensure_selection_state(),
239
- this.jm.mind.selected_nodes.has(e) ||
240
- (this.jm.mind.selected_nodes.add(e), this._mark_node_selected(e)),
241
- (this.jm.mind.selected = e),
242
- (this._last_selected_node = e),
243
- (this._selection_mode = this._derive_selection_mode()),
244
- this._invoke_select_event({
245
- evt: 'multi_select',
246
- data: [e.id],
247
- node: e.id,
248
- nodes: [e.id],
249
- });
250
- }
251
- } else this.select_node(s);
252
- }
253
- _handle_node_removed(e) {
254
- this._ensure_selection_state(),
255
- this.jm.mind.selected_nodes.has(e) && this.jm.mind.selected_nodes.delete(e),
256
- this._last_selected_node &&
257
- this._last_selected_node.id === e.id &&
258
- (this._last_selected_node = null),
259
- this.jm.view.multi_selected_nodes &&
260
- this.jm.view.multi_selected_nodes.has(e.id) &&
261
- this._unmark_node_selected(e);
262
- }
263
- _get_multi_select_mode(e) {
264
- return e
265
- ? !1 !== this.options.allow_shift && !0 === e.shiftKey
266
- ? 'shift'
267
- : !1 === this.options.allow_ctrl || (!0 !== e.ctrlKey && !0 !== e.metaKey)
268
- ? null
269
- : 'ctrl'
270
- : null;
271
- }
272
- _append_selection(e, t) {
273
- if (!e || !e.length) return [];
274
- if ((this._ensure_selection_state(), !this.jm.mind || !this.jm.mind.selected_nodes))
275
- return (
276
- d.warn('[multiSelect] Cannot append selection: selected_nodes not available'),
277
- []
278
- );
279
- const s = [];
280
- for (let t = 0; t < e.length; t++) {
281
- const i = e[t];
282
- this.jm.mind.selected_nodes.has(i) ||
283
- (this.jm.mind.selected_nodes.add(i), s.push(i));
284
- }
285
- if (s.length) {
286
- const e = t && t.focusNode ? t.focusNode : null;
287
- this._mark_nodes_selected(s, e || s[s.length - 1]);
288
- }
289
- return s;
290
- }
291
- _remove_selection(e) {
292
- if (!e || !e.length) return [];
293
- this._ensure_selection_state();
294
- const t = [];
295
- for (let s = 0; s < e.length; s++) {
296
- const i = e[s];
297
- this.jm.mind.selected_nodes.has(i) &&
298
- (this.jm.mind.selected_nodes.delete(i), t.push(i));
299
- }
300
- return t.length && this._unmark_nodes_selected(t), t;
301
- }
302
- _deselect_subtree(e) {
303
- let t = this._collect_subtree_nodes(e, {
304
- includeChildren: !0,
305
- respectFilter: !1,
306
- skipRootFilter: !1,
307
- });
308
- t.length || (t = [e]);
309
- const s = this._remove_selection(t);
310
- if (s.length) {
311
- this.jm.mind.selected &&
312
- this.jm.mind.selected.id === e.id &&
313
- (this.jm.mind.selected = null),
314
- (this._selection_mode = this._derive_selection_mode());
315
- const t = s.map(e => e.id);
316
- this._invoke_select_event({ evt: 'multi_deselect', data: t, node: e.id, nodes: t });
317
- }
318
- }
319
- _clear_selection_state() {
320
- if (
321
- (this._ensure_selection_state(),
322
- (this._selection_mode = null),
323
- (this.jm.mind && this.jm.mind.selected_nodes) || this._ensure_selection_state(),
324
- !this.jm.mind ||
325
- !this.jm.mind.selected_nodes ||
326
- 0 === this.jm.mind.selected_nodes.size)
327
- )
328
- return this._clear_all_selected_nodes_view(), [];
329
- const e = Array.from(this.jm.mind.selected_nodes);
330
- return this.jm.mind.selected_nodes.clear(), this._unmark_nodes_selected(e), e;
331
- }
332
- _collect_subtree_nodes(e, t) {
333
- const s = t || {},
334
- i = !1 !== s.includeChildren,
335
- n = !!s.respectFilter,
336
- l = !!s.skipRootFilter,
337
- o = n ? this._get_selection_filter() : null,
338
- _ = [],
339
- d = (e, t) => {
340
- let s = !0;
341
- if ((!o || (l && t) || (s = !1 !== o(e)), s && _.push(e), i && e.children))
342
- for (let t = 0; t < e.children.length; t++) d(e.children[t], !1);
343
- };
344
- return d(e, !0), _;
345
- }
346
- _ensure_ancestor_selection(e, t, s) {
347
- if (!e || !e.length) return [];
348
- this._ensure_selection_state();
349
- const i = !(!s || !s.requireAncestorChainSelected),
350
- n = [],
351
- l = Object.create(null);
352
- for (let t = 0; t < e.length; t++) {
353
- let s = e[t].parent;
354
- if (!s) continue;
355
- const o = [];
356
- let _ = !i;
357
- for (; s; ) {
358
- if (this.jm.mind.selected_nodes.has(s)) {
359
- _ = !0;
360
- break;
361
- }
362
- o.push(s), (s = s.parent);
363
- }
364
- if (_)
365
- for (let e = 0; e < o.length; e++) {
366
- const t = o[e];
367
- this.jm.mind.selected_nodes.has(t) ||
368
- l[t.id] ||
369
- (n.push(t), (l[t.id] = !0));
370
- }
371
- }
372
- if (!n.length) return [];
373
- const o = t || e[e.length - 1];
374
- return this._append_selection(n, { focusNode: o });
375
- }
376
- _get_selection_filter() {
377
- return this.options && 'function' == typeof this.options.filter
378
- ? this.options.filter
379
- : null;
380
- }
381
- _range_select_nodes(e) {
382
- const t = this._resolve_node(e);
383
- if (!t || !this.jm.layout.is_visible(t)) return;
384
- if ((this._ensure_selection_state(), 0 === this.jm.mind.selected_nodes.size)) {
385
- let e = this._collect_subtree_nodes(t, {
386
- includeChildren: !0,
387
- respectFilter: !0,
388
- skipRootFilter: !0,
389
- });
390
- e.length || (e = [t]);
391
- const s = this._append_selection(e);
392
- if (s.length) {
393
- (this.jm.mind.selected = t),
394
- (this._last_selected_node = t),
395
- (this._selection_mode = this._derive_selection_mode());
396
- const e = s.map(e => e.id);
397
- this._invoke_select_event({
398
- evt: 'multi_select',
399
- data: e,
400
- node: t.id,
401
- nodes: e,
402
- });
403
- }
404
- return;
405
- }
406
- this._ensure_selection_state();
407
- const s = Array.from(this.jm.mind.selected_nodes),
408
- i =
409
- this._last_selected_node &&
410
- this.jm.mind.selected_nodes.has(this._last_selected_node)
411
- ? this._last_selected_node
412
- : s[0],
413
- n = this._find_nodes_between(i, t);
414
- if (!n.length) {
415
- const e = [t],
416
- s = this._append_selection(e);
417
- if (s.length) {
418
- (this.jm.mind.selected = t),
419
- (this._last_selected_node = t),
420
- (this._selection_mode = this._derive_selection_mode());
421
- const e = s.map(e => e.id);
422
- this._invoke_select_event({
423
- evt: 'multi_select',
424
- data: e,
425
- node: t.id,
426
- nodes: e,
427
- });
428
- }
429
- return;
430
- }
431
- this._ensure_selection_state();
432
- const l = n.filter(e => !this.jm.mind.selected_nodes.has(e)),
433
- o = this._append_selection(l);
434
- if (o.length) {
435
- (this.jm.mind.selected = t),
436
- (this._last_selected_node = t),
437
- (this._selection_mode = this._derive_selection_mode());
438
- const e = o.map(e => e.id);
439
- this._invoke_select_event({ evt: 'multi_select', data: e, node: t.id, nodes: e });
440
- }
441
- }
442
- _find_nodes_between(e, t) {
443
- if (!e || !t) return [];
444
- const s = [],
445
- i = e => {
446
- if ((this.jm.layout.is_visible(e) && s.push(e), e.children))
447
- for (let t = 0; t < e.children.length; t++) i(e.children[t]);
448
- };
449
- this.jm.mind && this.jm.mind.root && i(this.jm.mind.root);
450
- let n = -1,
451
- l = -1;
452
- for (let i = 0; i < s.length; i++)
453
- s[i].id === e.id && (n = i), s[i].id === t.id && (l = i);
454
- if (-1 === n || -1 === l) return [];
455
- const o = Math.min(n, l),
456
- _ = Math.max(n, l);
457
- return s.slice(o, _ + 1);
458
- }
459
- _derive_selection_mode() {
460
- this._ensure_selection_state();
461
- const e = this.jm.mind.selected_nodes.size;
462
- return 0 === e ? null : e > 1 ? 'multi' : 'single';
463
- }
464
- _mark_nodes_selected(e, t) {
465
- if (e && e.length) {
466
- for (let t = 0; t < e.length; t++) this._mark_node_selected(e[t]);
467
- this.jm.view.selected_node = t || e[e.length - 1];
468
- }
469
- }
470
- _mark_node_selected(e) {
471
- if (!e || this.jm.view.multi_selected_nodes.has(e.id)) return;
472
- const t = e._data && e._data.view && e._data.view.element;
473
- t &&
474
- (t.classList
475
- ? t.classList.add('selected')
476
- : /(\s|^)selected(\s|$)/.test(t.className) || (t.className += ' selected'),
477
- this.jm.view.multi_selected_nodes.set(e.id, e));
478
- }
479
- _unmark_nodes_selected(e) {
480
- if (e && e.length) for (let t = 0; t < e.length; t++) this._unmark_node_selected(e[t]);
481
- }
482
- _unmark_node_selected(e) {
483
- if (e) {
484
- if (this.jm.view.multi_selected_nodes.has(e.id)) {
485
- const t = e._data && e._data.view && e._data.view.element;
486
- t &&
487
- (t.classList
488
- ? t.classList.remove('selected')
489
- : (t.className = t.className.replace(/\s*selected\b/i, ''))),
490
- this.jm.view.multi_selected_nodes.delete(e.id);
491
- }
492
- this.jm.view.selected_node &&
493
- this.jm.view.selected_node.id === e.id &&
494
- (this.jm.view.selected_node = null);
495
- }
496
- }
497
- _clear_all_selected_nodes_view() {
498
- if (
499
- (this._ensure_selection_state(),
500
- !this.jm.view.multi_selected_nodes || !this.jm.view.multi_selected_nodes.size)
501
- )
502
- return void (this.jm.view && (this.jm.view.selected_node = null));
503
- const e = Array.from(this.jm.view.multi_selected_nodes.values());
504
- for (let t = 0; t < e.length; t++) this._unmark_node_selected(e[t]);
505
- this.jm.view && (this.jm.view.selected_node = null);
506
- }
507
- _invoke_select_event(e) {
508
- try {
509
- e.nodes || (e.nodes = e.data || []),
510
- e.data || (e.data = e.nodes || []),
511
- this.jm.invoke_event_handle(s, e);
512
- } catch (e) {
513
- d.warn('[multiSelect] failed to invoke select event', e);
514
- }
515
- }
516
- _resolve_node(e) {
517
- return e ? ('string' == typeof e ? this.jm.get_node(e) : e) : null;
518
- }
519
- }
520
- class a extends c {
521
- static instanceName = 'multiSelectPlugin';
522
- static preload = !1;
523
- constructor({ jm: e, pluginOpt: t }) {
524
- super({ jm: e, pluginOpt: t });
525
- const s = Object.assign({}, r, t || {});
526
- (this.options = s),
527
- (this._mounted = !1),
528
- (this._core = null),
529
- (this._listener = null),
530
- (this._enabled = !!s.enable_multi_select),
531
- this._initCore();
532
- }
533
- _initCore() {
534
- const e = this.jm,
535
- s = this.options,
536
- i = this;
537
- (this._core = new h(e, s)),
538
- this._mountAPI(),
539
- (this._listener = (e, s) => {
540
- try {
541
- e === t && i._core.select_clear();
542
- } catch (e) {
543
- d.warn('[multiSelect] listener error', e);
544
- }
545
- }),
546
- e.add_event_listener(this._listener),
547
- (this._original_select_node = e.select_node.bind(e)),
548
- (this._original_select_clear = e.select_clear.bind(e)),
549
- (e.select_node = e =>
550
- i._enabled ? i._core.select_node(e) : i._original_select_node(e)),
551
- (e.select_clear = () =>
552
- i._enabled ? i._core.select_clear() : i._original_select_clear());
553
- const n = e.constructor.$;
554
- (this._domClickHandler = function (t) {
555
- if (!i._enabled) return;
556
- const s = t.target || t.currentTarget,
557
- n = e.view.get_binded_nodeid(s);
558
- n && e.view.is_node(s)
559
- ? (t.preventDefault(),
560
- t.stopPropagation(),
561
- t.stopImmediatePropagation && t.stopImmediatePropagation(),
562
- i._core._handle_node_click({ e: t, node: n, element: s, evt: 'click' }))
563
- : n || t.ctrlKey || t.metaKey || t.shiftKey || i._core.select_clear();
564
- }),
565
- e.view && e.view.e_nodes
566
- ? (n.on(e.view.e_nodes, 'click', this._domClickHandler),
567
- d.info('[multiSelect] plugin click handler attached'))
568
- : d.warn('[multiSelect] nodes container not ready; DOM handler not attached'),
569
- this._enabled &&
570
- 'function' == typeof e.disable_event_handle &&
571
- e.disable_event_handle('mousedown'),
572
- d.info('[multiSelect] API mounted and event listener attached.');
573
- }
574
- _mountAPI() {
575
- if (this._mounted) return;
576
- const e = this.jm,
577
- t = this,
578
- s = {
579
- get_selected_nodes: () =>
580
- t._core
581
- ? t._core.get_selected_nodes()
582
- : (d.warn('[multiSelect] Core not initialized'), []),
583
- is_node_selected: e => !!t._core && t._core.is_node_selected(e),
584
- select_node: e => {
585
- t._core
586
- ? t._core.select_node(e)
587
- : d.warn('[multiSelect] Core not initialized');
588
- },
589
- select_clear: () => {
590
- t._core && t._core.select_clear();
591
- },
592
- toggle_node_selection: e => {
593
- t._core
594
- ? t._core.toggle_node_selection(e)
595
- : d.warn('[multiSelect] Core not initialized');
596
- },
597
- toggle_subtree_selection: e => {
598
- t._core
599
- ? t._core.toggle_subtree_selection(e)
600
- : d.warn('[multiSelect] Core not initialized');
601
- },
602
- get_selection_mode: () => (t._core ? t._core.get_selection_mode() : null),
603
- getOptions: () => {
604
- const e = t._core ? t._core.options : t.options;
605
- return Object.assign({}, e, { enable_multi_select: t._enabled });
606
- },
607
- enable: () => t.setEnabled(!0),
608
- disable: () => t.setEnabled(!1),
609
- setEnabled: e => t.setEnabled(e),
610
- setOptions: e => t.setOptions(e),
611
- };
612
- Object.defineProperty(e, 'multiSelect', {
613
- value: s,
614
- configurable: !0,
615
- enumerable: !1,
616
- writable: !1,
617
- }),
618
- (this._mounted = !0),
619
- d.info('[multiSelect] API mounted.');
620
- }
621
- beforePluginRemove() {
622
- try {
623
- if (this._listener && this.jm && Array.isArray(this.jm.event_handles)) {
624
- const e = this.jm.event_handles.indexOf(this._listener);
625
- e >= 0 && this.jm.event_handles.splice(e, 1);
626
- }
627
- 'function' == typeof this.jm.enable_event_handle &&
628
- this.jm.enable_event_handle('mousedown'),
629
- this._domClickHandler &&
630
- this.jm &&
631
- this.jm.view &&
632
- this.jm.view.e_nodes &&
633
- (this._domClickHandler = null),
634
- this._original_select_node &&
635
- (this.jm.select_node = this._original_select_node),
636
- this._original_select_clear &&
637
- (this.jm.select_clear = this._original_select_clear),
638
- this.jm &&
639
- Object.prototype.hasOwnProperty.call(this.jm, 'multiSelect') &&
640
- delete this.jm.multiSelect,
641
- (this._mounted = !1);
642
- } catch (e) {
643
- d.error('[multiSelect] remove failed:', e);
644
- }
645
- }
646
- setEnabled(e) {
647
- const t = !!e;
648
- this._enabled !== t &&
649
- ((this._enabled = t),
650
- (this.options.enable_multi_select = this._enabled),
651
- this._enabled
652
- ? 'function' == typeof this.jm.disable_event_handle &&
653
- this.jm.disable_event_handle('mousedown')
654
- : 'function' == typeof this.jm.enable_event_handle &&
655
- this.jm.enable_event_handle('mousedown'));
656
- }
657
- setOptions(e) {
658
- const t = Object.assign({}, e || {});
659
- (this.options = Object.assign({}, this.options, t)),
660
- this._core &&
661
- this._core.options &&
662
- (this._core.options = Object.assign({}, this._core.options, t));
663
- }
664
- beforePluginDestroy() {
665
- d.debug('[multiSelect] beforePluginDestroy'), this.beforePluginRemove();
666
- }
667
- }
668
- (e.MultiSelectCore = h),
669
- (e.MultiSelectPlugin = a),
670
- (e.default = a),
671
- Object.defineProperty(e, '__esModule', { value: !0 });
672
- });
2
+ * @license BSD-3-Clause
3
+ * @copyright 2014-2025 hizzgdev@163.com
4
+ *
5
+ * Project Home:
6
+ * https://github.com/hizzgdev/jsmind/
7
+ */
8
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).jsMindMultiSelect={})}(this,function(e){"use strict";"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return this.slice(0,e.length)===e});const t=1,s=3,i=4,n=1,o=2,_=3,l=4;var d=function(){};let a="undefined"==typeof console?{level:d,log:d,debug:d,info:d,warn:d,error:d}:{level:function(e){a.debug=e>n?d:console.debug;a.info=e>o?d:console.info;a.warn=e>_?d:console.warn;a.error=e>l?d:console.error},log:console.log,debug:console.debug,info:console.info,warn:console.warn,error:console.error};class h{static instanceName="";static preload=!1;constructor({jm:e,pluginOpt:t}){this.jm=e,this.options=t||{}}beforePluginRemove(){}beforePluginDestroy(){this.beforePluginRemove()}}const r={enable_multi_select:!1,enable_ctrl_key_node_selection:!0,enable_box_selection:!0,use_left_key_selection_right_key_drag:!1};class c{constructor(e){this.jm=e,this._mode=null,this._last_selected_node=null,this._marked_ids=new Set,this._ensure_state()}_ensure_state(){this.jm.mind||(this.jm.mind={}),this.jm.mind.selected_nodes||(this.jm.mind.selected_nodes=new Set)}_resolve_node(e){return e?"string"==typeof e?this.jm.get_node(e):e:null}_is_visible(e){return!!(e&&this.jm.layout&&this.jm.layout.is_visible(e))}_derive_mode(){this._ensure_state();const e=this.jm.mind.selected_nodes.size;return 0===e?null:1===e?"single":"multi"}_set_focus(e){this.jm.mind.selected=e||null,this.jm.view&&(this.jm.view.selected_node=e||null),this._last_selected_node=e||null}_mark_node(e){if(!e)return;const t=e._data&&e._data.view&&e._data.view.element;t&&(t.classList?t.classList.add("selected"):/(\s|^)selected(\s|$)/.test(t.className)||(t.className+=" selected"),this._marked_ids.add(e.id))}_unmark_node(e){if(!e)return;const t=e._data&&e._data.view&&e._data.view.element;t&&(t.classList?t.classList.remove("selected"):t.className=t.className.replace(/\s*selected\b/i,"")),this._marked_ids.delete(e.id)}_sync_view_from_state(){this._ensure_state();const e=new Set,t=Array.from(this.jm.mind.selected_nodes);for(let s=0;s<t.length;s++)e.add(t[s].id);const s=[];this._marked_ids.forEach(t=>{e.has(t)||s.push(t)});for(let e=0;e<s.length;e++){const t=this.jm.get_node(s[e]);t?this._unmark_node(t):this._marked_ids.delete(s[e])}for(let e=0;e<t.length;e++)this._mark_node(t[e])}_emit(e,t,s){const n=(t||[]).map(e=>e.id);this.jm.invoke_event_handle(i,{evt:e,data:n,node:s?s.id:null,nodes:n})}get_selected_nodes(){return this._ensure_state(),Array.from(this.jm.mind.selected_nodes).map(e=>e.id)}get_selected_node_set(){return this._ensure_state(),new Set(this.jm.mind.selected_nodes)}is_node_selected(e){const t=this._resolve_node(e);return!!t&&(this._ensure_state(),this.jm.mind.selected_nodes.has(t))}get_selection_mode(){return this._mode}select_node(e){const t=this._resolve_node(e);if(!this._is_visible(t))return;this._ensure_state();const s=Array.from(this.jm.mind.selected_nodes);this.jm.mind.selected_nodes.clear(),this.jm.mind.selected_nodes.add(t),this._set_focus(t),this._mode="single",this._sync_view_from_state();const i=s.filter(e=>e.id!==t.id);i.length&&this._emit("multi_deselect",i,t),this._emit("select_node",[t],t)}select_clear(){if(this._ensure_state(),0===this.jm.mind.selected_nodes.size)return this._set_focus(null),void(this._mode=null);const e=Array.from(this.jm.mind.selected_nodes);this.jm.mind.selected_nodes.clear(),this._set_focus(null),this._mode=null,this._sync_view_from_state(),this._emit("clear_selection",e,null)}toggle_node_selection(e){const t=this._resolve_node(e);if(this._is_visible(t)){if(this._ensure_state(),this.jm.mind.selected_nodes.has(t)){if(this.jm.mind.selected_nodes.delete(t),this.jm.mind.selected===t){const e=Array.from(this.jm.mind.selected_nodes);this._set_focus(e.length?e[e.length-1]:null)}return this._mode=this._derive_mode(),this._sync_view_from_state(),void this._emit("multi_deselect",[t],this.jm.mind.selected||null)}this.jm.mind.selected_nodes.add(t),this._set_focus(t),this._mode=this._derive_mode(),this._sync_view_from_state(),this._emit("multi_select",[t],t)}}set_selection(e,t){this._ensure_state();const s=t||{},i=[],n=new Set;for(let t=0;t<e.length;t++){const s=e[t];s&&this._is_visible(s)&&!n.has(s.id)&&(n.add(s.id),i.push(s))}const o=Array.from(this.jm.mind.selected_nodes);this.jm.mind.selected_nodes.clear();for(let e=0;e<i.length;e++)this.jm.mind.selected_nodes.add(i[e]);const _=s.focusNode||(i.length?i[i.length-1]:null);if(this._set_focus(_),this._mode=this._derive_mode(),this._sync_view_from_state(),!1===s.emit)return;const l=new Set(o.map(e=>e.id)),d=new Set(i.map(e=>e.id)),a=i.filter(e=>!l.has(e.id)),h=o.filter(e=>!d.has(e.id));h.length&&this._emit("multi_deselect",h,_),a.length&&this._emit("multi_select",a,_),!a.length&&!h.length&&_&&s.forceSelectEvent&&this._emit("select_node",[_],_)}prune_removed(e){if(this._ensure_state(),!e||!e.length||0===this.jm.mind.selected_nodes.size)return;const t=new Set(e),s=[];if(this.jm.mind.selected_nodes.forEach(e=>{t.has(e.id)&&s.push(e)}),s.length){for(let e=0;e<s.length;e++)this.jm.mind.selected_nodes.delete(s[e]);if(this.jm.mind.selected&&t.has(this.jm.mind.selected.id)){const e=Array.from(this.jm.mind.selected_nodes);this._set_focus(e.length?e[e.length-1]:null)}this._mode=this._derive_mode(),this._sync_view_from_state(),this._emit("multi_deselect",s,this.jm.mind.selected||null)}}}class m{constructor(e,t,s,i){this.jm=e,this.state=t,this.getOptions=s,this.isEnabled=i,this._dragging=!1,this._active=!1,this._append_mode=!1,this._base_selected=[],this._start_client={x:0,y:0},this._current_client={x:0,y:0},this._overlay=null,this._on_mouse_move=this._on_mouse_move.bind(this),this._on_mouse_up=this._on_mouse_up.bind(this)}is_selecting(){return this._dragging}should_start(e){if(!this.isEnabled())return!1;const t=this.getOptions();return!!t.enable_box_selection&&(t.use_left_key_selection_right_key_drag?1===e.which:(e.ctrlKey||e.metaKey)&&3===e.which)}start(e){this._dragging||(this._dragging=!0,this._active=!1,this._append_mode=!(!e.ctrlKey&&!e.metaKey),this._base_selected=Array.from(this.state.get_selected_node_set()),this._start_client={x:e.clientX,y:e.clientY},this._current_client={x:e.clientX,y:e.clientY},this._append_mode||this.state.set_selection([],{emit:!1}),this._ensure_overlay(),this._update_overlay(),document.addEventListener("mousemove",this._on_mouse_move,!0),document.addEventListener("mouseup",this._on_mouse_up,!0))}_ensure_overlay(){if(this._overlay)return;const e=document.createElement("div");e.style.position="fixed",e.style.pointerEvents="none",e.style.border="1px solid #0984e3",e.style.background="rgba(9,132,227,0.2)",e.style.zIndex="2147483000",e.style.display="none",document.body.appendChild(e),this._overlay=e}_update_overlay(){if(!this._overlay)return;const e=Math.min(this._start_client.x,this._current_client.x),t=Math.min(this._start_client.y,this._current_client.y),s=Math.abs(this._start_client.x-this._current_client.x),i=Math.abs(this._start_client.y-this._current_client.y);this._overlay.style.left=e+"px",this._overlay.style.top=t+"px",this._overlay.style.width=s+"px",this._overlay.style.height=i+"px",this._overlay.style.display=this._active?"block":"none"}_collect_nodes_in_rect(){if(!this.jm.mind||!this.jm.mind.nodes)return[];const e=Math.min(this._start_client.x,this._current_client.x),t=Math.min(this._start_client.y,this._current_client.y),s=Math.max(this._start_client.x,this._current_client.x),i=Math.max(this._start_client.y,this._current_client.y),n=Object.values(this.jm.mind.nodes),o=[];for(let _=0;_<n.length;_++){const l=n[_];if(!this.jm.layout.is_visible(l))continue;const d=l._data&&l._data.view&&l._data.view.element;if(!d)continue;const a=d.getBoundingClientRect();!(a.right<e||a.left>s||a.bottom<t||a.top>i)&&o.push(l)}return o}_on_mouse_move(e){if(!this._dragging)return;this._current_client={x:e.clientX,y:e.clientY};const t=Math.abs(this._start_client.x-this._current_client.x),s=Math.abs(this._start_client.y-this._current_client.y);if(this._active=t>4||s>4,!this._active)return void this._update_overlay();const i=this._collect_nodes_in_rect(),n=this._append_mode?this._base_selected.concat(i.filter(e=>!this._base_selected.find(t=>t.id===e.id))):i;this.state.set_selection(n,{focusNode:n.length?n[n.length-1]:null,emit:!1}),this._update_overlay(),e.preventDefault(),e.stopPropagation()}_on_mouse_up(e){if(!this._dragging)return;const t=this._active;if(this._dragging=!1,this._active=!1,this._base_selected=[],this._overlay&&(this._overlay.style.display="none"),document.removeEventListener("mousemove",this._on_mouse_move,!0),document.removeEventListener("mouseup",this._on_mouse_up,!0),t){const t=Array.from(this.state.get_selected_node_set());this.state.set_selection(t,{focusNode:t.length?t[t.length-1]:null,emit:!0}),e.preventDefault(),e.stopPropagation()}}destroy(){this._dragging=!1,document.removeEventListener("mousemove",this._on_mouse_move,!0),document.removeEventListener("mouseup",this._on_mouse_up,!0),this._overlay&&this._overlay.parentNode&&this._overlay.parentNode.removeChild(this._overlay),this._overlay=null}}class u{constructor(e,t,s,i){this.jm=e,this.state=t,this.getOptions=s,this.isEnabled=i,this.selectBox=new m(e,t,s,i),this._on_nodes_mousedown=this._on_nodes_mousedown.bind(this),this._on_panel_contextmenu=this._on_panel_contextmenu.bind(this)}bind(){this.jm.view&&this.jm.view.e_nodes&&this.jm.view.e_panel?(this.jm.view.e_nodes.addEventListener("mousedown",this._on_nodes_mousedown,!0),this.jm.view.e_panel.addEventListener("contextmenu",this._on_panel_contextmenu,!0)):a.warn("[multiSelect] view is not ready, interaction skipped")}_on_panel_contextmenu(e){this.isEnabled()&&this.selectBox.is_selecting()&&(e.preventDefault(),e.stopPropagation())}_on_nodes_mousedown(e){if(!this.isEnabled())return;const t=this.getOptions(),s=e.target||e.currentTarget,i=this.jm.view.get_binded_nodeid(s);return i&&this.jm.view.is_node(s)?(t.enable_ctrl_key_node_selection&&(e.ctrlKey||e.metaKey)?this.state.toggle_node_selection(i):this.state.select_node(i),e.preventDefault(),e.stopPropagation(),void(e.stopImmediatePropagation&&e.stopImmediatePropagation())):!i&&this.selectBox.should_start(e)?(this.selectBox.start(e),e.preventDefault(),e.stopPropagation(),void(e.stopImmediatePropagation&&e.stopImmediatePropagation())):void(i||e.ctrlKey||e.metaKey||e.shiftKey||(this.state.select_clear(),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation()))}destroy(){this.jm.view&&this.jm.view.e_nodes&&this.jm.view.e_nodes.removeEventListener("mousedown",this._on_nodes_mousedown,!0),this.jm.view&&this.jm.view.e_panel&&this.jm.view.e_panel.removeEventListener("contextmenu",this._on_panel_contextmenu,!0),this.selectBox.destroy()}}class v extends h{static instanceName="multiSelectPlugin";static preload=!1;constructor({jm:e,pluginOpt:i}){super({jm:e,pluginOpt:i}),this.options=Object.assign({},r,i||{}),this._enabled=!!this.options.enable_multi_select,this._state=new c(e),this._interaction=new u(e,this._state,()=>this.options,()=>this._enabled),this._listener=(e,i)=>{this._enabled&&(e!==t?e===s&&i&&"remove_node"===i.evt&&this._state.prune_removed(i.data||[]):this._state.select_clear())},this._mountAPI(),this.jm.add_event_listener(this._listener),this._interaction.bind(),this._enabled&&"function"==typeof this.jm.disable_event_handle&&this.jm.disable_event_handle("mousedown")}_mountAPI(){const e=this,t={get_selected_nodes:()=>e._state.get_selected_nodes(),is_node_selected:t=>e._state.is_node_selected(t),select_node:t=>e._state.select_node(t),select_clear:()=>e._state.select_clear(),toggle_node_selection:t=>e._state.toggle_node_selection(t),get_selection_mode:()=>e._state.get_selection_mode(),getOptions:()=>Object.assign({},e.options,{enable_multi_select:e._enabled}),enable:()=>e.setEnabled(!0),disable:()=>e.setEnabled(!1),setEnabled:t=>e.setEnabled(t),setOptions:t=>e.setOptions(t)};Object.defineProperty(this.jm,"multiSelect",{value:t,configurable:!0,enumerable:!1,writable:!1})}setEnabled(e){this._enabled=!!e,this.options.enable_multi_select=this._enabled,this._enabled?"function"==typeof this.jm.disable_event_handle&&this.jm.disable_event_handle("mousedown"):"function"==typeof this.jm.enable_event_handle&&this.jm.enable_event_handle("mousedown")}setOptions(e){this.options=Object.assign({},this.options,e||{})}beforePluginRemove(){if("function"==typeof this.jm.enable_event_handle&&this.jm.enable_event_handle("mousedown"),this._enabled=!1,this._interaction&&this._interaction.destroy(),this._listener&&this.jm&&Array.isArray(this.jm.event_handles)){const e=this.jm.event_handles.indexOf(this._listener);e>=0&&this.jm.event_handles.splice(e,1)}this.jm&&Object.prototype.hasOwnProperty.call(this.jm,"multiSelect")&&delete this.jm.multiSelect}beforePluginDestroy(){this.beforePluginRemove()}}const p=c;e.MultiSelectCore=p,e.MultiSelectInteraction=u,e.MultiSelectPlugin=v,e.MultiSelectState=c,e.SelectBox=m,e.default=v,Object.defineProperty(e,"__esModule",{value:!0})});
673
9
  //# sourceMappingURL=jsmind.multi-select.js.map