jqtree 1.7.4 → 1.8.0

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 (94) hide show
  1. package/.eslintrc +5 -1
  2. package/bower.json +1 -1
  3. package/config/babel.config.json +1 -1
  4. package/config/production +2 -0
  5. package/devserver/devserver_scroll.js +8 -0
  6. package/devserver/test_scroll.html +28 -0
  7. package/devserver/test_scroll_container.html +39 -0
  8. package/docs/_config.yml +1 -1
  9. package/docs/_entries/general/changelog.md +12 -0
  10. package/docs/package.json +1 -1
  11. package/docs/pnpm-lock.yaml +30 -30
  12. package/package.json +31 -27
  13. package/src/dataLoader.ts +44 -19
  14. package/src/dragAndDropHandler/dragElement.ts +42 -0
  15. package/src/dragAndDropHandler/hitAreasGenerator.ts +175 -0
  16. package/src/dragAndDropHandler/index.ts +470 -0
  17. package/src/dragAndDropHandler/types.ts +12 -0
  18. package/src/dragAndDropHandler/visibleNodeIterator.ts +97 -0
  19. package/src/elementsRenderer.ts +75 -40
  20. package/src/jqtreeMethodTypes.ts +40 -0
  21. package/src/jqtreeOptions.ts +43 -25
  22. package/src/keyHandler.ts +59 -38
  23. package/src/mouse.widget.ts +3 -3
  24. package/src/mouseWidgetTypes.ts +6 -0
  25. package/src/node.ts +32 -48
  26. package/src/nodeElement/borderDropHint.ts +32 -0
  27. package/src/nodeElement/folderElement.ts +133 -0
  28. package/src/nodeElement/ghostDropHint.ts +68 -0
  29. package/src/nodeElement/index.ts +101 -0
  30. package/src/nodeUtils.ts +10 -0
  31. package/src/playwright/coverage.ts +1 -4
  32. package/src/playwright/playwright.test.ts +203 -15
  33. package/src/playwright/testUtils.ts +23 -15
  34. package/src/saveStateHandler.ts +75 -26
  35. package/src/scrollHandler/containerScrollParent.ts +177 -0
  36. package/src/scrollHandler/createScrollParent.ts +50 -0
  37. package/src/scrollHandler/documentScrollParent.ts +182 -0
  38. package/src/scrollHandler/types.ts +7 -0
  39. package/src/scrollHandler.ts +36 -248
  40. package/src/selectNodeHandler.ts +10 -16
  41. package/src/test/jqTree/keyboard.test.ts +18 -23
  42. package/src/test/jqTree/loadOnDemand.test.ts +2 -3
  43. package/src/test/jqTree/methods.test.ts +33 -4
  44. package/src/test/jqTree/options.test.ts +15 -4
  45. package/src/test/node.test.ts +85 -26
  46. package/src/test/nodeUtils.test.ts +21 -0
  47. package/src/tree.jquery.ts +262 -83
  48. package/src/util.ts +3 -0
  49. package/src/version.ts +1 -1
  50. package/tree.jquery.debug.js +1922 -2608
  51. package/tree.jquery.debug.js.map +1 -1
  52. package/tree.jquery.js +2 -2
  53. package/tree.jquery.js.map +1 -1
  54. package/lib/dataLoader.js +0 -124
  55. package/lib/dragAndDropHandler.js +0 -596
  56. package/lib/elementsRenderer.js +0 -268
  57. package/lib/jqtreeOptions.js +0 -1
  58. package/lib/keyHandler.js +0 -115
  59. package/lib/mouse.widget.js +0 -256
  60. package/lib/node.js +0 -717
  61. package/lib/nodeElement.js +0 -277
  62. package/lib/playwright/coverage.js +0 -96
  63. package/lib/playwright/playwright.test.js +0 -228
  64. package/lib/playwright/testUtils.js +0 -184
  65. package/lib/saveStateHandler.js +0 -278
  66. package/lib/scrollHandler.js +0 -250
  67. package/lib/selectNodeHandler.js +0 -129
  68. package/lib/simple.widget.js +0 -159
  69. package/lib/test/global.d.js +0 -3
  70. package/lib/test/jqTree/accessibility.test.js +0 -37
  71. package/lib/test/jqTree/create.test.js +0 -48
  72. package/lib/test/jqTree/events.test.js +0 -210
  73. package/lib/test/jqTree/keyboard.test.js +0 -225
  74. package/lib/test/jqTree/loadOnDemand.test.js +0 -218
  75. package/lib/test/jqTree/methods.test.js +0 -1347
  76. package/lib/test/jqTree/options.test.js +0 -548
  77. package/lib/test/node.test.js +0 -1160
  78. package/lib/test/nodeUtil.test.js +0 -27
  79. package/lib/test/support/exampleData.js +0 -36
  80. package/lib/test/support/jqTreeMatchers.js +0 -70
  81. package/lib/test/support/matchers.d.js +0 -1
  82. package/lib/test/support/setupTests.js +0 -7
  83. package/lib/test/support/testUtil.js +0 -32
  84. package/lib/test/support/treeStructure.js +0 -39
  85. package/lib/test/util.test.js +0 -26
  86. package/lib/tree.jquery.d.js +0 -1
  87. package/lib/tree.jquery.js +0 -1106
  88. package/lib/types.js +0 -1
  89. package/lib/typings.d.js +0 -2
  90. package/lib/util.js +0 -18
  91. package/lib/version.js +0 -9
  92. package/src/dragAndDropHandler.ts +0 -719
  93. package/src/nodeElement.ts +0 -272
  94. package/src/types.ts +0 -19
@@ -1,719 +0,0 @@
1
- import { getPositionName, Node, Position } from "./node";
2
- import { DropHint, HitArea, PositionInfo } from "./types";
3
- import { NodeElement } from "./nodeElement";
4
- import { JqTreeWidget } from "./tree.jquery";
5
-
6
- interface Dimensions {
7
- left: number;
8
- top: number;
9
- right: number;
10
- bottom: number;
11
- }
12
-
13
- export class DragAndDropHandler {
14
- public hitAreas: HitArea[];
15
- public isDragging: boolean;
16
- public currentItem: NodeElement | null;
17
- public hoveredArea: HitArea | null;
18
- public positionInfo: PositionInfo | null;
19
-
20
- private treeWidget: JqTreeWidget;
21
- private dragElement: DragElement | null;
22
- private previousGhost: DropHint | null;
23
- private openFolderTimer: number | null;
24
-
25
- constructor(treeWidget: JqTreeWidget) {
26
- this.treeWidget = treeWidget;
27
-
28
- this.hoveredArea = null;
29
- this.hitAreas = [];
30
- this.isDragging = false;
31
- this.currentItem = null;
32
- this.positionInfo = null;
33
- }
34
-
35
- public mouseCapture(positionInfo: PositionInfo): boolean | null {
36
- const $element = jQuery(positionInfo.target);
37
-
38
- if (!this.mustCaptureElement($element)) {
39
- return null;
40
- }
41
-
42
- if (
43
- this.treeWidget.options.onIsMoveHandle &&
44
- !this.treeWidget.options.onIsMoveHandle($element)
45
- ) {
46
- return null;
47
- }
48
-
49
- let nodeElement = this.treeWidget._getNodeElement($element);
50
-
51
- if (nodeElement && this.treeWidget.options.onCanMove) {
52
- if (!this.treeWidget.options.onCanMove(nodeElement.node)) {
53
- nodeElement = null;
54
- }
55
- }
56
-
57
- this.currentItem = nodeElement;
58
- return this.currentItem != null;
59
- }
60
-
61
- public mouseStart(positionInfo: PositionInfo): boolean {
62
- if (
63
- !this.currentItem ||
64
- positionInfo.pageX === undefined ||
65
- positionInfo.pageY === undefined
66
- ) {
67
- return false;
68
- }
69
-
70
- this.refresh();
71
-
72
- const offset = jQuery(positionInfo.target).offset();
73
- const left = offset ? offset.left : 0;
74
- const top = offset ? offset.top : 0;
75
-
76
- const node = this.currentItem.node;
77
-
78
- this.dragElement = new DragElement(
79
- node.name,
80
- positionInfo.pageX - left,
81
- positionInfo.pageY - top,
82
- this.treeWidget.element,
83
- this.treeWidget.options.autoEscape ?? true
84
- );
85
-
86
- this.isDragging = true;
87
- this.positionInfo = positionInfo;
88
- this.currentItem.$element.addClass("jqtree-moving");
89
- return true;
90
- }
91
-
92
- public mouseDrag(positionInfo: PositionInfo): boolean {
93
- if (
94
- !this.currentItem ||
95
- !this.dragElement ||
96
- positionInfo.pageX === undefined ||
97
- positionInfo.pageY === undefined
98
- ) {
99
- return false;
100
- }
101
-
102
- this.dragElement.move(positionInfo.pageX, positionInfo.pageY);
103
- this.positionInfo = positionInfo;
104
-
105
- const area = this.findHoveredArea(
106
- positionInfo.pageX,
107
- positionInfo.pageY
108
- );
109
-
110
- if (area && this.canMoveToArea(area)) {
111
- if (!area.node.isFolder()) {
112
- this.stopOpenFolderTimer();
113
- }
114
-
115
- if (this.hoveredArea !== area) {
116
- this.hoveredArea = area;
117
-
118
- // If this is a closed folder, start timer to open it
119
- if (this.mustOpenFolderTimer(area)) {
120
- this.startOpenFolderTimer(area.node);
121
- } else {
122
- this.stopOpenFolderTimer();
123
- }
124
-
125
- this.updateDropHint();
126
- }
127
- } else {
128
- this.removeDropHint();
129
- this.stopOpenFolderTimer();
130
- this.hoveredArea = area;
131
- }
132
-
133
- if (!area) {
134
- if (this.treeWidget.options.onDragMove) {
135
- this.treeWidget.options.onDragMove(
136
- this.currentItem.node,
137
- positionInfo.originalEvent
138
- );
139
- }
140
- }
141
-
142
- return true;
143
- }
144
-
145
- public mouseStop(positionInfo: PositionInfo): boolean {
146
- this.moveItem(positionInfo);
147
- this.clear();
148
- this.removeHover();
149
- this.removeDropHint();
150
- this.removeHitAreas();
151
-
152
- const currentItem = this.currentItem;
153
-
154
- if (this.currentItem) {
155
- this.currentItem.$element.removeClass("jqtree-moving");
156
- this.currentItem = null;
157
- }
158
-
159
- this.isDragging = false;
160
- this.positionInfo = null;
161
-
162
- if (!this.hoveredArea && currentItem) {
163
- if (this.treeWidget.options.onDragStop) {
164
- this.treeWidget.options.onDragStop(
165
- currentItem.node,
166
- positionInfo.originalEvent
167
- );
168
- }
169
- }
170
-
171
- return false;
172
- }
173
-
174
- public refresh(): void {
175
- this.removeHitAreas();
176
-
177
- if (this.currentItem) {
178
- this.generateHitAreas();
179
-
180
- this.currentItem = this.treeWidget._getNodeElementForNode(
181
- this.currentItem.node
182
- );
183
-
184
- if (this.isDragging) {
185
- this.currentItem.$element.addClass("jqtree-moving");
186
- }
187
- }
188
- }
189
-
190
- private generateHitAreas(): void {
191
- if (!this.currentItem) {
192
- this.hitAreas = [];
193
- } else {
194
- const hitAreasGenerator = new HitAreasGenerator(
195
- this.treeWidget.tree,
196
- this.currentItem.node,
197
- this.getTreeDimensions().bottom
198
- );
199
- this.hitAreas = hitAreasGenerator.generate();
200
- }
201
- }
202
-
203
- private mustCaptureElement($element: JQuery<HTMLElement>): boolean {
204
- return !$element.is("input,select,textarea");
205
- }
206
-
207
- private canMoveToArea(area: HitArea): boolean {
208
- if (!this.treeWidget.options.onCanMoveTo) {
209
- return true;
210
- }
211
-
212
- if (!this.currentItem) {
213
- return false;
214
- }
215
-
216
- const positionName = getPositionName(area.position);
217
-
218
- return this.treeWidget.options.onCanMoveTo(
219
- this.currentItem.node,
220
- area.node,
221
- positionName
222
- );
223
- }
224
-
225
- private removeHitAreas(): void {
226
- this.hitAreas = [];
227
- }
228
-
229
- private clear(): void {
230
- if (this.dragElement) {
231
- this.dragElement.remove();
232
- this.dragElement = null;
233
- }
234
- }
235
-
236
- private removeDropHint(): void {
237
- if (this.previousGhost) {
238
- this.previousGhost.remove();
239
- }
240
- }
241
-
242
- private removeHover(): void {
243
- this.hoveredArea = null;
244
- }
245
-
246
- private findHoveredArea(x: number, y: number): HitArea | null {
247
- const dimensions = this.getTreeDimensions();
248
-
249
- if (
250
- x < dimensions.left ||
251
- y < dimensions.top ||
252
- x > dimensions.right ||
253
- y > dimensions.bottom
254
- ) {
255
- return null;
256
- }
257
-
258
- let low = 0;
259
- let high = this.hitAreas.length;
260
- while (low < high) {
261
- const mid = (low + high) >> 1;
262
- const area = this.hitAreas[mid];
263
-
264
- if (!area) {
265
- return null;
266
- }
267
-
268
- if (y < area.top) {
269
- high = mid;
270
- } else if (y > area.bottom) {
271
- low = mid + 1;
272
- } else {
273
- return area;
274
- }
275
- }
276
-
277
- return null;
278
- }
279
-
280
- private mustOpenFolderTimer(area: HitArea): boolean {
281
- const node = area.node;
282
-
283
- return (
284
- node.isFolder() &&
285
- !node.is_open &&
286
- area.position === Position.Inside
287
- );
288
- }
289
-
290
- private updateDropHint(): void {
291
- if (!this.hoveredArea) {
292
- return;
293
- }
294
-
295
- // remove previous drop hint
296
- this.removeDropHint();
297
-
298
- // add new drop hint
299
- const nodeElement = this.treeWidget._getNodeElementForNode(
300
- this.hoveredArea.node
301
- );
302
- this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);
303
- }
304
-
305
- private startOpenFolderTimer(folder: Node): void {
306
- const openFolder = (): void => {
307
- this.treeWidget._openNode(
308
- folder,
309
- this.treeWidget.options.slide,
310
- () => {
311
- this.refresh();
312
- this.updateDropHint();
313
- }
314
- );
315
- };
316
-
317
- this.stopOpenFolderTimer();
318
-
319
- const openFolderDelay = this.treeWidget.options.openFolderDelay;
320
-
321
- if (openFolderDelay !== false) {
322
- this.openFolderTimer = window.setTimeout(
323
- openFolder,
324
- openFolderDelay
325
- );
326
- }
327
- }
328
-
329
- private stopOpenFolderTimer(): void {
330
- if (this.openFolderTimer) {
331
- clearTimeout(this.openFolderTimer);
332
- this.openFolderTimer = null;
333
- }
334
- }
335
-
336
- private moveItem(positionInfo: PositionInfo): void {
337
- if (
338
- this.currentItem &&
339
- this.hoveredArea &&
340
- this.hoveredArea.position !== Position.None &&
341
- this.canMoveToArea(this.hoveredArea)
342
- ) {
343
- const movedNode = this.currentItem.node;
344
- const targetNode = this.hoveredArea.node;
345
- const position = this.hoveredArea.position;
346
- const previousParent = movedNode.parent;
347
-
348
- if (position === Position.Inside) {
349
- this.hoveredArea.node.is_open = true;
350
- }
351
-
352
- const doMove = (): void => {
353
- this.treeWidget.tree.moveNode(movedNode, targetNode, position);
354
- this.treeWidget.element.empty();
355
- this.treeWidget._refreshElements(null);
356
- };
357
-
358
- const event = this.treeWidget._triggerEvent("tree.move", {
359
- move_info: {
360
- moved_node: movedNode,
361
- target_node: targetNode,
362
- position: getPositionName(position),
363
- previous_parent: previousParent,
364
- do_move: doMove,
365
- original_event: positionInfo.originalEvent,
366
- },
367
- });
368
-
369
- if (!event.isDefaultPrevented()) {
370
- doMove();
371
- }
372
- }
373
- }
374
-
375
- private getTreeDimensions(): Dimensions {
376
- // Return the dimensions of the tree. Add a margin to the bottom to allow
377
- // to drag-and-drop after the last element.
378
- const offset = this.treeWidget.element.offset();
379
-
380
- if (!offset) {
381
- return { left: 0, top: 0, right: 0, bottom: 0 };
382
- } else {
383
- const el = this.treeWidget.element;
384
- const width = el.width() || 0;
385
- const height = el.height() || 0;
386
- const left = offset.left + this.treeWidget._getScrollLeft();
387
-
388
- return {
389
- left,
390
- top: offset.top,
391
- right: left + width,
392
- bottom: offset.top + height + 16,
393
- };
394
- }
395
- }
396
- }
397
-
398
- abstract class VisibleNodeIterator {
399
- private tree: Node;
400
-
401
- constructor(tree: Node) {
402
- this.tree = tree;
403
- }
404
-
405
- protected iterate(): void {
406
- let isFirstNode = true;
407
-
408
- const _iterateNode = (node: Node, nextNode: Node | null): void => {
409
- let mustIterateInside =
410
- (node.is_open || !node.element) && node.hasChildren();
411
-
412
- let $element: JQuery<HTMLElement> | null = null;
413
-
414
- if (node.element) {
415
- $element = jQuery(node.element);
416
-
417
- if (!$element.is(":visible")) {
418
- return;
419
- }
420
-
421
- if (isFirstNode) {
422
- this.handleFirstNode(node);
423
- isFirstNode = false;
424
- }
425
-
426
- if (!node.hasChildren()) {
427
- this.handleNode(node, nextNode, $element);
428
- } else if (node.is_open) {
429
- if (!this.handleOpenFolder(node, $element)) {
430
- mustIterateInside = false;
431
- }
432
- } else {
433
- this.handleClosedFolder(node, nextNode, $element);
434
- }
435
- }
436
-
437
- if (mustIterateInside) {
438
- const childrenLength = node.children.length;
439
- node.children.forEach((_, i) => {
440
- const child = node.children[i];
441
-
442
- if (child) {
443
- if (i === childrenLength - 1) {
444
- _iterateNode(child, null);
445
- } else {
446
- const nextChild = node.children[i + 1];
447
-
448
- if (nextChild) {
449
- _iterateNode(child, nextChild);
450
- }
451
- }
452
- }
453
- });
454
-
455
- if (node.is_open && $element) {
456
- this.handleAfterOpenFolder(node, nextNode);
457
- }
458
- }
459
- };
460
-
461
- _iterateNode(this.tree, null);
462
- }
463
-
464
- protected abstract handleNode(
465
- node: Node,
466
- nextNode: Node | null,
467
- $element: JQuery
468
- ): void;
469
-
470
- /*
471
- override
472
- return
473
- - true: continue iterating
474
- - false: stop iterating
475
- */
476
- protected abstract handleOpenFolder(node: Node, $element: JQuery): boolean;
477
-
478
- protected abstract handleClosedFolder(
479
- node: Node,
480
- nextNode: Node | null,
481
- $element: JQuery
482
- ): void;
483
-
484
- protected abstract handleAfterOpenFolder(
485
- node: Node,
486
- nextNode: Node | null
487
- ): void;
488
-
489
- protected abstract handleFirstNode(node: Node): void;
490
- }
491
-
492
- export class HitAreasGenerator extends VisibleNodeIterator {
493
- private currentNode: Node;
494
- private treeBottom: number;
495
- private positions: HitArea[];
496
- private lastTop: number;
497
-
498
- constructor(tree: Node, currentNode: Node, treeBottom: number) {
499
- super(tree);
500
-
501
- this.currentNode = currentNode;
502
- this.treeBottom = treeBottom;
503
- }
504
-
505
- public generate(): HitArea[] {
506
- this.positions = [];
507
- this.lastTop = 0;
508
-
509
- this.iterate();
510
-
511
- return this.generateHitAreas(this.positions);
512
- }
513
-
514
- protected generateHitAreas(positions: HitArea[]): HitArea[] {
515
- let previousTop = -1;
516
- let group = [];
517
- const hitAreas: HitArea[] = [];
518
-
519
- for (const position of positions) {
520
- if (position.top !== previousTop && group.length) {
521
- if (group.length) {
522
- this.generateHitAreasForGroup(
523
- hitAreas,
524
- group,
525
- previousTop,
526
- position.top
527
- );
528
- }
529
-
530
- previousTop = position.top;
531
- group = [];
532
- }
533
-
534
- group.push(position);
535
- }
536
-
537
- this.generateHitAreasForGroup(
538
- hitAreas,
539
- group,
540
- previousTop,
541
- this.treeBottom
542
- );
543
-
544
- return hitAreas;
545
- }
546
-
547
- protected handleOpenFolder(node: Node, $element: JQuery): boolean {
548
- if (node === this.currentNode) {
549
- // Cannot move inside current item
550
-
551
- // Dnd over the current element is not possible: add a position with type None for the top and the bottom.
552
- const top = this.getTop($element);
553
- const height = $element.height() || 0;
554
- this.addPosition(node, Position.None, top);
555
-
556
- if (height > 5) {
557
- // Subtract 5 pixels to allow more space for the next element.
558
- this.addPosition(node, Position.None, top + height - 5);
559
- }
560
-
561
- // Stop iterating
562
- return false;
563
- }
564
-
565
- // Cannot move before current item
566
- if (node.children[0] !== this.currentNode) {
567
- this.addPosition(node, Position.Inside, this.getTop($element));
568
- }
569
-
570
- // Continue iterating
571
- return true;
572
- }
573
-
574
- protected handleClosedFolder(
575
- node: Node,
576
- nextNode: Node,
577
- $element: JQuery
578
- ): void {
579
- const top = this.getTop($element);
580
-
581
- if (node === this.currentNode) {
582
- // Cannot move after current item
583
- this.addPosition(node, Position.None, top);
584
- } else {
585
- this.addPosition(node, Position.Inside, top);
586
-
587
- // Cannot move before current item
588
- if (nextNode !== this.currentNode) {
589
- this.addPosition(node, Position.After, top);
590
- }
591
- }
592
- }
593
-
594
- protected handleFirstNode(node: Node): void {
595
- if (node !== this.currentNode) {
596
- this.addPosition(
597
- node,
598
- Position.Before,
599
- this.getTop(jQuery(node.element))
600
- );
601
- }
602
- }
603
-
604
- protected handleAfterOpenFolder(node: Node, nextNode: Node): void {
605
- if (node === this.currentNode || nextNode === this.currentNode) {
606
- // Cannot move before or after current item
607
- this.addPosition(node, Position.None, this.lastTop);
608
- } else {
609
- this.addPosition(node, Position.After, this.lastTop);
610
- }
611
- }
612
-
613
- protected handleNode(node: Node, nextNode: Node, $element: JQuery): void {
614
- const top = this.getTop($element);
615
-
616
- if (node === this.currentNode) {
617
- // Cannot move inside current item
618
- this.addPosition(node, Position.None, top);
619
- } else {
620
- this.addPosition(node, Position.Inside, top);
621
- }
622
-
623
- if (nextNode === this.currentNode || node === this.currentNode) {
624
- // Cannot move before or after current item
625
- this.addPosition(node, Position.None, top);
626
- } else {
627
- this.addPosition(node, Position.After, top);
628
- }
629
- }
630
-
631
- private getTop($element: JQuery<HTMLElement>): number {
632
- const offset = $element.offset();
633
-
634
- return offset ? offset.top : 0;
635
- }
636
-
637
- private addPosition(node: Node, position: number, top: number): void {
638
- const area = {
639
- top,
640
- bottom: 0,
641
- node,
642
- position,
643
- };
644
-
645
- this.positions.push(area);
646
- this.lastTop = top;
647
- }
648
-
649
- private generateHitAreasForGroup(
650
- hitAreas: HitArea[],
651
- positionsInGroup: HitArea[],
652
- top: number,
653
- bottom: number
654
- ): void {
655
- // limit positions in group
656
- const positionCount = Math.min(positionsInGroup.length, 4);
657
-
658
- const areaHeight = Math.round((bottom - top) / positionCount);
659
- let areaTop = top;
660
-
661
- let i = 0;
662
- while (i < positionCount) {
663
- const position = positionsInGroup[i];
664
-
665
- if (position && position.position !== Position.None) {
666
- hitAreas.push({
667
- top: areaTop,
668
- bottom: areaTop + areaHeight,
669
- node: position.node,
670
- position: position.position,
671
- });
672
- }
673
-
674
- areaTop += areaHeight;
675
- i += 1;
676
- }
677
- }
678
- }
679
-
680
- class DragElement {
681
- private offsetX: number;
682
- private offsetY: number;
683
- private $element: JQuery;
684
-
685
- constructor(
686
- nodeName: string,
687
- offsetX: number,
688
- offsetY: number,
689
- $tree: JQuery,
690
- autoEscape: boolean
691
- ) {
692
- this.offsetX = offsetX;
693
- this.offsetY = offsetY;
694
-
695
- this.$element = jQuery("<span>").addClass(
696
- "jqtree-title jqtree-dragging"
697
- );
698
-
699
- if (autoEscape) {
700
- this.$element.text(nodeName);
701
- } else {
702
- this.$element.html(nodeName);
703
- }
704
-
705
- this.$element.css("position", "absolute");
706
- $tree.append(this.$element);
707
- }
708
-
709
- public move(pageX: number, pageY: number): void {
710
- this.$element.offset({
711
- left: pageX - this.offsetX,
712
- top: pageY - this.offsetY,
713
- });
714
- }
715
-
716
- public remove(): void {
717
- this.$element.remove();
718
- }
719
- }