tree-element 0.1.0 → 0.2.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 (149) hide show
  1. package/README.md +49 -29
  2. package/lib/animation.js +5 -5
  3. package/lib/animation.js.map +1 -1
  4. package/lib/classNames.d.ts.map +1 -1
  5. package/lib/classNames.js +2 -2
  6. package/lib/classNames.js.map +1 -1
  7. package/lib/dataLoader.d.ts.map +1 -1
  8. package/lib/dataLoader.js +18 -21
  9. package/lib/dataLoader.js.map +1 -1
  10. package/lib/dragAndDropHandler/binarySearch.js +3 -3
  11. package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
  12. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
  13. package/lib/dragAndDropHandler/dragElement.js +9 -12
  14. package/lib/dragAndDropHandler/dragElement.js.map +1 -1
  15. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
  16. package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
  17. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
  18. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  19. package/lib/dragAndDropHandler/index.js +90 -114
  20. package/lib/dragAndDropHandler/index.js.map +1 -1
  21. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
  22. package/lib/dragAndDropHandler/iterateVisibleNodes.js +10 -10
  23. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
  24. package/lib/dragAndDropHandler/types.d.ts.map +1 -1
  25. package/lib/elementsRenderer.d.ts +15 -6
  26. package/lib/elementsRenderer.d.ts.map +1 -1
  27. package/lib/elementsRenderer.js +157 -121
  28. package/lib/elementsRenderer.js.map +1 -1
  29. package/lib/events.d.ts +11 -4
  30. package/lib/events.d.ts.map +1 -1
  31. package/lib/index.d.ts +5 -5
  32. package/lib/index.d.ts.map +1 -1
  33. package/lib/index.js +249 -252
  34. package/lib/index.js.map +1 -1
  35. package/lib/keyHandler.d.ts +2 -3
  36. package/lib/keyHandler.d.ts.map +1 -1
  37. package/lib/keyHandler.js +26 -25
  38. package/lib/keyHandler.js.map +1 -1
  39. package/lib/methodTypes.d.ts +1 -1
  40. package/lib/methodTypes.d.ts.map +1 -1
  41. package/lib/mouseHandler.d.ts.map +1 -1
  42. package/lib/mouseHandler.js +26 -42
  43. package/lib/mouseHandler.js.map +1 -1
  44. package/lib/mouseUtils.d.ts.map +1 -1
  45. package/lib/mouseUtils.js +2 -2
  46. package/lib/mouseUtils.js.map +1 -1
  47. package/lib/node.d.ts +2 -1
  48. package/lib/node.d.ts.map +1 -1
  49. package/lib/node.js +36 -35
  50. package/lib/node.js.map +1 -1
  51. package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
  52. package/lib/nodeElement/borderDropHint.js +4 -5
  53. package/lib/nodeElement/borderDropHint.js.map +1 -1
  54. package/lib/nodeElement/folderElement.d.ts +7 -4
  55. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  56. package/lib/nodeElement/folderElement.js +61 -42
  57. package/lib/nodeElement/folderElement.js.map +1 -1
  58. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
  59. package/lib/nodeElement/ghostDropHint.js +5 -9
  60. package/lib/nodeElement/ghostDropHint.js.map +1 -1
  61. package/lib/nodeElement/index.d.ts +2 -1
  62. package/lib/nodeElement/index.d.ts.map +1 -1
  63. package/lib/nodeElement/index.js +34 -26
  64. package/lib/nodeElement/index.js.map +1 -1
  65. package/lib/nodeUtils.d.ts.map +1 -1
  66. package/lib/nodeUtils.js +1 -1
  67. package/lib/nodeUtils.js.map +1 -1
  68. package/lib/options.d.ts.map +1 -1
  69. package/lib/positionUtils.js +3 -3
  70. package/lib/positionUtils.js.map +1 -1
  71. package/lib/requestUrl.d.ts +1 -1
  72. package/lib/requestUrl.d.ts.map +1 -1
  73. package/lib/requestUrl.js +4 -6
  74. package/lib/requestUrl.js.map +1 -1
  75. package/lib/saveStateHandler.d.ts.map +1 -1
  76. package/lib/saveStateHandler.js +38 -48
  77. package/lib/saveStateHandler.js.map +1 -1
  78. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
  79. package/lib/scrollHandler/containerScrollParent.js +9 -11
  80. package/lib/scrollHandler/containerScrollParent.js.map +1 -1
  81. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
  82. package/lib/scrollHandler/createScrollParent.js +10 -10
  83. package/lib/scrollHandler/createScrollParent.js.map +1 -1
  84. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
  85. package/lib/scrollHandler/documentScrollParent.js +16 -19
  86. package/lib/scrollHandler/documentScrollParent.js.map +1 -1
  87. package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
  88. package/lib/scrollHandler/scrollParent.js +11 -17
  89. package/lib/scrollHandler/scrollParent.js.map +1 -1
  90. package/lib/scrollHandler.d.ts.map +1 -1
  91. package/lib/scrollHandler.js +11 -14
  92. package/lib/scrollHandler.js.map +1 -1
  93. package/lib/selectNodeHandler.d.ts +2 -2
  94. package/lib/selectNodeHandler.d.ts.map +1 -1
  95. package/lib/selectNodeHandler.js +45 -54
  96. package/lib/selectNodeHandler.js.map +1 -1
  97. package/lib/setDefaultOptions.d.ts.map +1 -1
  98. package/lib/setDefaultOptions.js +23 -28
  99. package/lib/setDefaultOptions.js.map +1 -1
  100. package/lib/triggerCustomEvent.d.ts.map +1 -1
  101. package/lib/triggerCustomEvent.js +2 -2
  102. package/lib/triggerCustomEvent.js.map +1 -1
  103. package/lib/util.d.ts.map +1 -1
  104. package/lib/util.js +2 -2
  105. package/lib/util.js.map +1 -1
  106. package/lib/version.d.ts +1 -1
  107. package/lib/version.js +1 -1
  108. package/lib/version.js.map +1 -1
  109. package/package.json +7 -3
  110. package/src/animation.ts +1 -1
  111. package/src/classNames.ts +52 -52
  112. package/src/dataLoader.ts +68 -70
  113. package/src/dragAndDropHandler/binarySearch.ts +17 -17
  114. package/src/dragAndDropHandler/dragElement.ts +50 -50
  115. package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
  116. package/src/dragAndDropHandler/index.ts +342 -351
  117. package/src/dragAndDropHandler/iterateVisibleNodes.ts +59 -63
  118. package/src/dragAndDropHandler/types.ts +5 -5
  119. package/src/elementsRenderer.ts +351 -298
  120. package/src/events.ts +216 -209
  121. package/src/header.txt +1 -1
  122. package/src/index.ts +52 -82
  123. package/src/keyHandler.ts +125 -115
  124. package/src/methodTypes.ts +4 -7
  125. package/src/mouseHandler.ts +314 -317
  126. package/src/mouseUtils.ts +14 -14
  127. package/src/node.ts +761 -766
  128. package/src/nodeElement/borderDropHint.ts +25 -25
  129. package/src/nodeElement/folderElement.ts +135 -112
  130. package/src/nodeElement/ghostDropHint.ts +62 -62
  131. package/src/nodeElement/index.ts +88 -74
  132. package/src/nodeUtils.ts +5 -5
  133. package/src/options.ts +6 -2
  134. package/src/requestUrl.ts +3 -3
  135. package/src/saveStateHandler.ts +204 -206
  136. package/src/scrollHandler/containerScrollParent.ts +49 -52
  137. package/src/scrollHandler/createScrollParent.ts +27 -27
  138. package/src/scrollHandler/documentScrollParent.ts +70 -70
  139. package/src/scrollHandler/scrollParent.ts +98 -98
  140. package/src/scrollHandler.ts +45 -45
  141. package/src/selectNodeHandler.ts +176 -166
  142. package/src/setDefaultOptions.ts +25 -22
  143. package/src/triggerCustomEvent.ts +7 -3
  144. package/src/util.ts +2 -2
  145. package/src/version.ts +1 -1
  146. package/tree_element.debug.js +3770 -3799
  147. package/tree_element.debug.js.map +1 -1
  148. package/tree_element.js +2 -2
  149. package/tree_element.js.map +1 -1
@@ -1,62 +1,62 @@
1
1
  import type { ClassNames } from "../classNames";
2
2
 
3
3
  interface DragElementParams {
4
- autoEscape: boolean;
5
- classNames: ClassNames;
6
- nodeName: string;
7
- offsetX: number;
8
- offsetY: number;
9
- treeElement: HTMLElement;
4
+ autoEscape: boolean;
5
+ classNames: ClassNames;
6
+ nodeName: string;
7
+ offsetX: number;
8
+ offsetY: number;
9
+ treeElement: HTMLElement;
10
10
  }
11
11
 
12
12
  class DragElement {
13
- private element: HTMLElement;
14
- private offsetX: number;
15
- private offsetY: number;
16
-
17
- constructor({
18
- autoEscape,
19
- classNames,
20
- nodeName,
21
- offsetX,
22
- offsetY,
23
- treeElement,
24
- }: DragElementParams) {
25
- this.offsetX = offsetX;
26
- this.offsetY = offsetY;
27
-
28
- this.element = this.createElement(nodeName, autoEscape, classNames);
29
-
30
- treeElement.appendChild(this.element);
13
+ private element: HTMLElement;
14
+ private offsetX: number;
15
+ private offsetY: number;
16
+
17
+ constructor({
18
+ autoEscape,
19
+ classNames,
20
+ nodeName,
21
+ offsetX,
22
+ offsetY,
23
+ treeElement,
24
+ }: DragElementParams) {
25
+ this.offsetX = offsetX;
26
+ this.offsetY = offsetY;
27
+
28
+ this.element = this.createElement(nodeName, autoEscape, classNames);
29
+
30
+ treeElement.appendChild(this.element);
31
+ }
32
+
33
+ public move(pageX: number, pageY: number): void {
34
+ this.element.style.left = `${pageX - this.offsetX}px`;
35
+ this.element.style.top = `${pageY - this.offsetY}px`;
36
+ }
37
+
38
+ public remove(): void {
39
+ this.element.remove();
40
+ }
41
+
42
+ private createElement(
43
+ nodeName: string,
44
+ autoEscape: boolean,
45
+ classNames: ClassNames,
46
+ ) {
47
+ const element = document.createElement("span");
48
+ element.classList.add(classNames.title, classNames.dragging);
49
+
50
+ if (autoEscape) {
51
+ element.textContent = nodeName;
52
+ } else {
53
+ element.innerHTML = nodeName;
31
54
  }
32
55
 
33
- public move(pageX: number, pageY: number): void {
34
- this.element.style.left = `${pageX - this.offsetX}px`;
35
- this.element.style.top = `${pageY - this.offsetY}px`;
36
- }
37
-
38
- public remove(): void {
39
- this.element.remove();
40
- }
41
-
42
- private createElement(
43
- nodeName: string,
44
- autoEscape: boolean,
45
- classNames: ClassNames,
46
- ) {
47
- const element = document.createElement("span");
48
- element.classList.add(classNames.title, classNames.dragging);
56
+ element.style.position = "absolute";
49
57
 
50
- if (autoEscape) {
51
- element.textContent = nodeName;
52
- } else {
53
- element.innerHTML = nodeName;
54
- }
55
-
56
- element.style.position = "absolute";
57
-
58
- return element;
59
- }
58
+ return element;
59
+ }
60
60
  }
61
61
 
62
62
  export default DragElement;
@@ -5,191 +5,186 @@ import { getOffsetTop } from "../positionUtils";
5
5
  import iterateVisibleNodes from "./iterateVisibleNodes";
6
6
 
7
7
  interface HitPosition {
8
- node: Node;
9
- position: null | Position;
10
- top: number;
8
+ node: Node;
9
+ position: null | Position;
10
+ top: number;
11
11
  }
12
12
 
13
13
  export const generateHitPositions = (
14
- tree: Node,
15
- currentNode: Node,
14
+ tree: Node,
15
+ currentNode: Node,
16
16
  ): HitPosition[] => {
17
- const hitPositions: HitPosition[] = [];
18
- let lastTop = 0;
19
-
20
- const addHitPosition = (
21
- node: Node,
22
- position: null | Position,
23
- top: number,
24
- ) => {
25
- hitPositions.push({
26
- node,
27
- position,
28
- top,
29
- });
30
- lastTop = top;
31
- };
32
-
33
- const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {
34
- if (node === currentNode || nextNode === currentNode) {
35
- // Cannot move before or after current item
36
- addHitPosition(node, null, lastTop);
37
- } else {
38
- addHitPosition(node, "after", lastTop);
39
- }
40
- };
41
-
42
- const handleClosedFolder = (
43
- node: Node,
44
- nextNode: Node | null,
45
- element: HTMLElement,
46
- ) => {
47
- const top = getOffsetTop(element);
48
-
49
- if (node === currentNode) {
50
- // Cannot move after current item
51
- addHitPosition(node, null, top);
52
- } else {
53
- addHitPosition(node, "inside", top);
54
-
55
- // Cannot move before current item
56
- if (nextNode !== currentNode) {
57
- addHitPosition(node, "after", top);
58
- }
59
- }
60
- };
61
-
62
- const handleFirstNode = (node: Node) => {
63
- if (node !== currentNode && node.element) {
64
- addHitPosition(node, "before", getOffsetTop(node.element));
65
- }
66
- };
67
-
68
- const handleNode = (
69
- node: Node,
70
- nextNode: Node | null,
71
- element: HTMLElement,
72
- ) => {
73
- const top = getOffsetTop(element);
74
-
75
- if (node === currentNode) {
76
- // Cannot move inside current item
77
- addHitPosition(node, null, top);
78
- } else {
79
- addHitPosition(node, "inside", top);
80
- }
81
-
82
- if (nextNode === currentNode || node === currentNode) {
83
- // Cannot move before or after current item
84
- addHitPosition(node, null, top);
85
- } else {
86
- addHitPosition(node, "after", top);
87
- }
88
- };
89
-
90
- const handleOpenFolder = (node: Node, element: HTMLElement) => {
91
- if (node === currentNode) {
92
- // Cannot move inside current item
93
-
94
- // Dnd over the current element is not possible: add a position with type None for the top and the bottom.
95
- const top = getOffsetTop(element);
96
- const height = element.clientHeight;
97
- addHitPosition(node, null, top);
98
-
99
- if (height > 5) {
100
- // Subtract 5 pixels to allow more space for the next element.
101
- addHitPosition(node, null, top + height - 5);
102
- }
103
-
104
- // Stop iterating
105
- return false;
106
- }
107
-
108
- // Cannot move before current item
109
- if (node.children[0] !== currentNode) {
110
- addHitPosition(node, "inside", getOffsetTop(element));
111
- }
112
-
113
- // Continue iterating
114
- return true;
115
- };
116
-
117
- iterateVisibleNodes(tree, {
118
- handleAfterOpenFolder,
119
- handleClosedFolder,
120
- handleFirstNode,
121
- handleNode,
122
- handleOpenFolder,
17
+ const hitPositions: HitPosition[] = [];
18
+ let lastTop = 0;
19
+
20
+ const addHitPosition = (
21
+ node: Node,
22
+ position: null | Position,
23
+ top: number,
24
+ ) => {
25
+ hitPositions.push({
26
+ node,
27
+ position,
28
+ top,
123
29
  });
30
+ lastTop = top;
31
+ };
32
+
33
+ const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {
34
+ if (node === currentNode || nextNode === currentNode) {
35
+ // Cannot move before or after current item
36
+ addHitPosition(node, null, lastTop);
37
+ } else {
38
+ addHitPosition(node, "after", lastTop);
39
+ }
40
+ };
41
+
42
+ const handleClosedFolder = (
43
+ node: Node,
44
+ nextNode: Node | null,
45
+ element: HTMLElement,
46
+ ) => {
47
+ const top = getOffsetTop(element);
48
+
49
+ if (node === currentNode) {
50
+ // Cannot move after current item
51
+ addHitPosition(node, null, top);
52
+ } else {
53
+ addHitPosition(node, "inside", top);
54
+
55
+ // Cannot move before current item
56
+ if (nextNode !== currentNode) {
57
+ addHitPosition(node, "after", top);
58
+ }
59
+ }
60
+ };
124
61
 
125
- return hitPositions;
126
- };
62
+ const handleFirstNode = (node: Node) => {
63
+ if (node !== currentNode && node.element) {
64
+ addHitPosition(node, "before", getOffsetTop(node.element));
65
+ }
66
+ };
67
+
68
+ const handleNode = (
69
+ node: Node,
70
+ nextNode: Node | null,
71
+ element: HTMLElement,
72
+ ) => {
73
+ const top = getOffsetTop(element);
74
+
75
+ if (node === currentNode) {
76
+ // Cannot move inside current item
77
+ addHitPosition(node, null, top);
78
+ } else {
79
+ addHitPosition(node, "inside", top);
80
+ }
127
81
 
128
- export const generateHitAreasForGroup = (
129
- hitAreas: HitArea[],
130
- positionsInGroup: HitPosition[],
131
- top: number,
132
- bottom: number,
133
- ) => {
134
- // limit positions in group
135
- const positionCount = Math.min(positionsInGroup.length, 4);
82
+ if (nextNode === currentNode || node === currentNode) {
83
+ // Cannot move before or after current item
84
+ addHitPosition(node, null, top);
85
+ } else {
86
+ addHitPosition(node, "after", top);
87
+ }
88
+ };
89
+
90
+ const handleOpenFolder = (node: Node, element: HTMLElement) => {
91
+ if (node === currentNode) {
92
+ // Cannot move inside current item
136
93
 
137
- const areaHeight = Math.round((bottom - top) / positionCount);
138
- let areaTop = top;
94
+ // Dnd over the current element is not possible: add a position with type None for the top and the bottom.
95
+ const top = getOffsetTop(element);
96
+ const height = element.clientHeight;
97
+ addHitPosition(node, null, top);
139
98
 
140
- for (let i = 0; i < positionCount; i++) {
141
- const position = positionsInGroup[i] as HitPosition;
99
+ if (height > 5) {
100
+ // Subtract 5 pixels to allow more space for the next element.
101
+ addHitPosition(node, null, top + height - 5);
102
+ }
142
103
 
143
- if (position.position) {
144
- hitAreas.push({
145
- bottom: areaTop + areaHeight,
146
- node: position.node,
147
- position: position.position,
148
- top: areaTop,
149
- });
150
- }
104
+ // Stop iterating
105
+ return false;
106
+ }
151
107
 
152
- areaTop += areaHeight;
108
+ // Cannot move before current item
109
+ if (node.children[0] !== currentNode) {
110
+ addHitPosition(node, "inside", getOffsetTop(element));
153
111
  }
112
+
113
+ // Continue iterating
114
+ return true;
115
+ };
116
+
117
+ iterateVisibleNodes(tree, {
118
+ handleAfterOpenFolder,
119
+ handleClosedFolder,
120
+ handleFirstNode,
121
+ handleNode,
122
+ handleOpenFolder,
123
+ });
124
+
125
+ return hitPositions;
154
126
  };
155
127
 
156
- export const generateHitAreasFromPositions = (
157
- hitPositions: HitPosition[],
158
- treeBottom: number,
159
- ): HitArea[] => {
160
- if (!hitPositions.length) {
161
- return [];
128
+ export const generateHitAreasForGroup = (
129
+ hitAreas: HitArea[],
130
+ positionsInGroup: HitPosition[],
131
+ top: number,
132
+ bottom: number,
133
+ ) => {
134
+ // limit positions in group
135
+ const positionCount = Math.min(positionsInGroup.length, 4);
136
+
137
+ const areaHeight = Math.round((bottom - top) / positionCount);
138
+ let areaTop = top;
139
+
140
+ for (let i = 0; i < positionCount; i++) {
141
+ const position = positionsInGroup[i] as HitPosition;
142
+
143
+ if (position.position) {
144
+ hitAreas.push({
145
+ bottom: areaTop + areaHeight,
146
+ node: position.node,
147
+ position: position.position,
148
+ top: areaTop,
149
+ });
162
150
  }
163
151
 
164
- let previousTop = (hitPositions[0] as HitPosition).top;
165
- let group: HitPosition[] = [];
166
- const hitAreas: HitArea[] = [];
152
+ areaTop += areaHeight;
153
+ }
154
+ };
155
+
156
+ export const generateHitAreasFromPositions = (
157
+ hitPositions: HitPosition[],
158
+ treeBottom: number,
159
+ ): HitArea[] => {
160
+ if (!hitPositions.length) {
161
+ return [];
162
+ }
167
163
 
168
- for (const position of hitPositions) {
169
- if (position.top !== previousTop && group.length) {
170
- generateHitAreasForGroup(
171
- hitAreas,
172
- group,
173
- previousTop,
174
- position.top,
175
- );
164
+ let previousTop = (hitPositions[0] as HitPosition).top;
165
+ let group: HitPosition[] = [];
166
+ const hitAreas: HitArea[] = [];
176
167
 
177
- previousTop = position.top;
178
- group = [];
179
- }
168
+ for (const position of hitPositions) {
169
+ if (position.top !== previousTop && group.length) {
170
+ generateHitAreasForGroup(hitAreas, group, previousTop, position.top);
180
171
 
181
- group.push(position);
172
+ previousTop = position.top;
173
+ group = [];
182
174
  }
183
175
 
184
- generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);
176
+ group.push(position);
177
+ }
178
+
179
+ generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);
185
180
 
186
- return hitAreas;
181
+ return hitAreas;
187
182
  };
188
183
 
189
184
  const generateHitAreas = (tree: Node, currentNode: Node, treeBottom: number) =>
190
- generateHitAreasFromPositions(
191
- generateHitPositions(tree, currentNode),
192
- treeBottom,
193
- );
185
+ generateHitAreasFromPositions(
186
+ generateHitPositions(tree, currentNode),
187
+ treeBottom,
188
+ );
194
189
 
195
190
  export default generateHitAreas;