@progress/kendo-vue-treeview 3.2.2-dev.202204181420

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 (87) hide show
  1. package/LICENSE.md +11 -0
  2. package/NOTICE.txt +86 -0
  3. package/README.md +53 -0
  4. package/dist/cdn/js/kendo-vue-treeview.js +1 -0
  5. package/dist/es/ItemRenderProps.d.ts +13 -0
  6. package/dist/es/ItemRenderProps.js +1 -0
  7. package/dist/es/TreeView.d.ts +45 -0
  8. package/dist/es/TreeView.js +359 -0
  9. package/dist/es/TreeViewDragAnalyzer.d.ts +135 -0
  10. package/dist/es/TreeViewDragAnalyzer.js +184 -0
  11. package/dist/es/TreeViewDragClue.d.ts +135 -0
  12. package/dist/es/TreeViewDragClue.js +78 -0
  13. package/dist/es/TreeViewItem.d.ts +69 -0
  14. package/dist/es/TreeViewItem.js +359 -0
  15. package/dist/es/TreeViewOperationDescriptors.d.ts +76 -0
  16. package/dist/es/TreeViewOperationDescriptors.js +1 -0
  17. package/dist/es/TreeViewProps.d.ts +122 -0
  18. package/dist/es/TreeViewProps.js +0 -0
  19. package/dist/es/additionalTypes.ts +9 -0
  20. package/dist/es/events.d.ts +135 -0
  21. package/dist/es/events.js +0 -0
  22. package/dist/es/handleTreeViewCheckChange.d.ts +67 -0
  23. package/dist/es/handleTreeViewCheckChange.js +195 -0
  24. package/dist/es/main.d.ts +12 -0
  25. package/dist/es/main.js +8 -0
  26. package/dist/es/moveTreeViewItem.d.ts +109 -0
  27. package/dist/es/moveTreeViewItem.js +156 -0
  28. package/dist/es/package-metadata.d.ts +5 -0
  29. package/dist/es/package-metadata.js +11 -0
  30. package/dist/es/processTreeViewItems.d.ts +51 -0
  31. package/dist/es/processTreeViewItems.js +166 -0
  32. package/dist/es/utils/FieldsService.d.ts +26 -0
  33. package/dist/es/utils/FieldsService.js +50 -0
  34. package/dist/es/utils/SortedPublicItemIds.d.ts +8 -0
  35. package/dist/es/utils/SortedPublicItemIds.js +26 -0
  36. package/dist/es/utils/consts.d.ts +40 -0
  37. package/dist/es/utils/consts.js +40 -0
  38. package/dist/es/utils/getItemIdUponKeyboardNavigation.d.ts +5 -0
  39. package/dist/es/utils/getItemIdUponKeyboardNavigation.js +77 -0
  40. package/dist/es/utils/itemIdUtils.d.ts +60 -0
  41. package/dist/es/utils/itemIdUtils.js +117 -0
  42. package/dist/es/utils/itemUtils.d.ts +45 -0
  43. package/dist/es/utils/itemUtils.js +191 -0
  44. package/dist/es/utils/misc.d.ts +9 -0
  45. package/dist/es/utils/misc.js +17 -0
  46. package/dist/npm/ItemRenderProps.d.ts +13 -0
  47. package/dist/npm/ItemRenderProps.js +3 -0
  48. package/dist/npm/TreeView.d.ts +45 -0
  49. package/dist/npm/TreeView.js +376 -0
  50. package/dist/npm/TreeViewDragAnalyzer.d.ts +135 -0
  51. package/dist/npm/TreeViewDragAnalyzer.js +186 -0
  52. package/dist/npm/TreeViewDragClue.d.ts +135 -0
  53. package/dist/npm/TreeViewDragClue.js +88 -0
  54. package/dist/npm/TreeViewItem.d.ts +69 -0
  55. package/dist/npm/TreeViewItem.js +373 -0
  56. package/dist/npm/TreeViewOperationDescriptors.d.ts +76 -0
  57. package/dist/npm/TreeViewOperationDescriptors.js +3 -0
  58. package/dist/npm/TreeViewProps.d.ts +122 -0
  59. package/dist/npm/TreeViewProps.js +2 -0
  60. package/dist/npm/additionalTypes.ts +9 -0
  61. package/dist/npm/events.d.ts +135 -0
  62. package/dist/npm/events.js +2 -0
  63. package/dist/npm/handleTreeViewCheckChange.d.ts +67 -0
  64. package/dist/npm/handleTreeViewCheckChange.js +199 -0
  65. package/dist/npm/main.d.ts +12 -0
  66. package/dist/npm/main.js +17 -0
  67. package/dist/npm/moveTreeViewItem.d.ts +109 -0
  68. package/dist/npm/moveTreeViewItem.js +159 -0
  69. package/dist/npm/package-metadata.d.ts +5 -0
  70. package/dist/npm/package-metadata.js +14 -0
  71. package/dist/npm/processTreeViewItems.d.ts +51 -0
  72. package/dist/npm/processTreeViewItems.js +169 -0
  73. package/dist/npm/utils/FieldsService.d.ts +26 -0
  74. package/dist/npm/utils/FieldsService.js +52 -0
  75. package/dist/npm/utils/SortedPublicItemIds.d.ts +8 -0
  76. package/dist/npm/utils/SortedPublicItemIds.js +28 -0
  77. package/dist/npm/utils/consts.d.ts +40 -0
  78. package/dist/npm/utils/consts.js +43 -0
  79. package/dist/npm/utils/getItemIdUponKeyboardNavigation.d.ts +5 -0
  80. package/dist/npm/utils/getItemIdUponKeyboardNavigation.js +80 -0
  81. package/dist/npm/utils/itemIdUtils.d.ts +60 -0
  82. package/dist/npm/utils/itemIdUtils.js +132 -0
  83. package/dist/npm/utils/itemUtils.d.ts +45 -0
  84. package/dist/npm/utils/itemUtils.js +205 -0
  85. package/dist/npm/utils/misc.d.ts +9 -0
  86. package/dist/npm/utils/misc.js +22 -0
  87. package/package.json +56 -0
@@ -0,0 +1,376 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TreeViewVue2 = exports.TreeView = void 0; // @ts-ignore
7
+
8
+ var Vue = require("vue");
9
+
10
+ var allVue = Vue;
11
+ var gh = allVue.h;
12
+
13
+ var kendo_vue_common_1 = require("@progress/kendo-vue-common");
14
+
15
+ var getItemIdUponKeyboardNavigation_1 = require("./utils/getItemIdUponKeyboardNavigation");
16
+
17
+ var itemUtils_1 = require("./utils/itemUtils");
18
+
19
+ var TreeViewItem_1 = require("./TreeViewItem");
20
+
21
+ var itemIdUtils_1 = require("./utils/itemIdUtils");
22
+
23
+ var FieldsService_1 = require("./utils/FieldsService");
24
+
25
+ var package_metadata_1 = require("./package-metadata");
26
+
27
+ var consts_1 = require("./utils/consts");
28
+
29
+ var sizeMap = kendo_vue_common_1.kendoThemeMaps.sizeMap; // tslint:enable:max-line-length
30
+
31
+ var TreeViewVue2 = {
32
+ name: 'KendoTreeView',
33
+ props: {
34
+ dataItems: Array,
35
+ animate: {
36
+ type: Boolean,
37
+ default: true
38
+ },
39
+ tabIndex: Number,
40
+ focusIdField: String,
41
+ getFocusHierarchicalIndex: Function,
42
+ expandField: {
43
+ type: String,
44
+ default: consts_1.EXPAND_FIELD
45
+ },
46
+ selectField: {
47
+ type: String,
48
+ default: consts_1.SELECT_FIELD
49
+ },
50
+ childrenField: {
51
+ type: String,
52
+ default: consts_1.CHILDREN_FIELD
53
+ },
54
+ hasChildrenField: {
55
+ type: String,
56
+ default: consts_1.HAS_CHILDREN_FIELD
57
+ },
58
+ expandIcons: Boolean,
59
+ checkboxes: Boolean,
60
+ textField: {
61
+ type: String,
62
+ default: consts_1.TEXT_FIELD
63
+ },
64
+ disableField: {
65
+ type: String,
66
+ default: consts_1.DISABLED_FIELD
67
+ },
68
+ checkField: {
69
+ type: String,
70
+ default: consts_1.CHECK_FIELD
71
+ },
72
+ checkIndeterminateField: {
73
+ type: String,
74
+ default: consts_1.CHECK_INDETERMINATE_FIELD
75
+ },
76
+ item: [Object, String, Function],
77
+ ariaMultiSelectable: [String, Boolean],
78
+ ariaLabel: String,
79
+ ariaLabelledby: String,
80
+ size: {
81
+ type: String,
82
+ default: 'medium',
83
+ validator: function validator(value) {
84
+ return [null, 'small', 'medium', 'large'].includes(value);
85
+ }
86
+ }
87
+ },
88
+ data: function data() {
89
+ return {
90
+ focusedItemId: undefined,
91
+ focusedItemPublicId: undefined,
92
+ tabbableItemId: itemIdUtils_1.ZERO_LEVEL_ZERO_NODE_ID
93
+ };
94
+ },
95
+ created: function created() {
96
+ kendo_vue_common_1.validatePackage(package_metadata_1.packageMetadata);
97
+ this.allowExplicitFocus = false;
98
+ this.treeGuid = kendo_vue_common_1.guid();
99
+ },
100
+ updated: function updated() {
101
+ this.allowExplicitFocus = false;
102
+ this.refocusDueToFocusIdField();
103
+ },
104
+ // @ts-ignore
105
+ setup: !gh ? undefined : function () {
106
+ var v3 = !!gh;
107
+ return {
108
+ v3: v3
109
+ };
110
+ },
111
+ // @ts-ignore
112
+ render: function render(createElement) {
113
+ var _a;
114
+
115
+ var h = gh || createElement;
116
+ this.fieldsSvc = new FieldsService_1.default(this.$props);
117
+ var size = this.$props.size;
118
+ return h("div", {
119
+ "class": kendo_vue_common_1.classNames('k-treeview', (_a = {}, _a["k-treeview-" + (sizeMap[size] || size)] = size, _a)),
120
+ onKeydown: this.onKeyDown,
121
+ on: this.v3 ? undefined : {
122
+ "keydown": this.onKeyDown,
123
+ "focusin": this.onFocus,
124
+ "focusout": this.onBlur
125
+ },
126
+ onFocusin: this.onFocus,
127
+ onFocusout: this.onBlur,
128
+ role: "tree",
129
+ attrs: this.v3 ? undefined : {
130
+ role: "tree",
131
+ "aria-multiselectable": this.ariaMultiSelectable ? true : undefined,
132
+ "aria-label": this.$props['aria-label'],
133
+ "aria-labelledby": this.$props['aria-labelledby'],
134
+ tabIndex: this.$props.tabIndex
135
+ },
136
+ "aria-multiselectable": this.ariaMultiSelectable ? true : undefined,
137
+ "aria-label": this.$props['aria-label'],
138
+ "aria-labelledby": this.$props['aria-labelledby'],
139
+ tabIndex: this.$props.tabIndex
140
+ }, [h("ul", {
141
+ "class": "k-treeview-lines k-treeview-group",
142
+ role: "group",
143
+ attrs: this.v3 ? undefined : {
144
+ role: "group"
145
+ }
146
+ }, [this.dataItems.map(function (item, index) {
147
+ return h(TreeViewItem_1.TreeViewItem, {
148
+ item: item,
149
+ attrs: this.v3 ? undefined : {
150
+ item: item,
151
+ itemId: index.toString(),
152
+ treeGuid: this.treeGuid,
153
+ animate: this.$props.animate,
154
+ focusedItemId: this.focusedItemId,
155
+ tabbableItemId: this.tabbableItemId,
156
+ fieldsService: this.fieldsSvc,
157
+ itemUI: this.$props.item,
158
+ checkboxes: this.$props.checkboxes,
159
+ ariaMultiSelectable: this.ariaMultiSelectable,
160
+ draggable: this.$props.draggable,
161
+ expandIcons: this.$props.expandIcons,
162
+ size: size
163
+ },
164
+ itemId: index.toString(),
165
+ treeGuid: this.treeGuid,
166
+ animate: this.$props.animate,
167
+ focusedItemId: this.focusedItemId,
168
+ tabbableItemId: this.tabbableItemId,
169
+ fieldsService: this.fieldsSvc,
170
+ itemUI: this.$props.item,
171
+ checkboxes: this.$props.checkboxes,
172
+ ariaMultiSelectable: this.ariaMultiSelectable,
173
+ onItemclick: this.onItemClick,
174
+ on: this.v3 ? undefined : {
175
+ "itemclick": this.onItemClick,
176
+ "focusdomelneeded": this.onFocusDomElNeeded,
177
+ "press": this.onPress,
178
+ "drag": this.onDrag,
179
+ "release": this.onRelease,
180
+ "expandchange": this.onExpandChange,
181
+ "checkchange": this.onCheckChange
182
+ },
183
+ onFocusdomelneeded: this.onFocusDomElNeeded,
184
+ draggable: this.$props.draggable,
185
+ onPress: this.onPress,
186
+ onDrag: this.onDrag,
187
+ onRelease: this.onRelease,
188
+ expandIcons: this.$props.expandIcons,
189
+ onExpandchange: this.onExpandChange,
190
+ onCheckchange: this.onCheckChange,
191
+ key: index,
192
+ size: size
193
+ });
194
+ }, this)])]);
195
+ },
196
+ methods: {
197
+ onFocusDomElNeeded: function onFocusDomElNeeded(domItem) {
198
+ if (this.allowExplicitFocus) {
199
+ this.focusDomItem(domItem);
200
+ }
201
+ },
202
+ onCheckChange: function onCheckChange(event, item, itemId) {
203
+ this.setFocus(itemId);
204
+ this.dispatchCheckChange(event, item, itemId);
205
+ },
206
+ onExpandChange: function onExpandChange(event, item, itemId) {
207
+ this.setFocus(itemId);
208
+ this.dispatchExpandChange(event, item, itemId);
209
+ },
210
+ onPress: function onPress(_event, item, itemId) {
211
+ if (this.$props.onItemDragStart) {
212
+ this.$props.onItemDragStart.call(undefined, {
213
+ target: this,
214
+ item: item,
215
+ itemHierarchicalIndex: itemId
216
+ });
217
+ }
218
+ },
219
+ onDrag: function onDrag(event, item, itemId) {
220
+ var pageX = event.pageX,
221
+ pageY = event.pageY,
222
+ clientX = event.clientX,
223
+ clientY = event.clientY;
224
+
225
+ if (this.$props.onItemDragOver) {
226
+ this.$props.onItemDragOver.call(undefined, {
227
+ target: this,
228
+ item: item,
229
+ itemHierarchicalIndex: itemId,
230
+ pageX: pageX,
231
+ pageY: pageY,
232
+ clientX: clientX,
233
+ clientY: clientY
234
+ });
235
+ }
236
+ },
237
+ onRelease: function onRelease(event, item, itemId) {
238
+ var pageX = event.pageX,
239
+ pageY = event.pageY,
240
+ clientX = event.clientX,
241
+ clientY = event.clientY;
242
+
243
+ if (this.$props.onItemDragEnd) {
244
+ this.$props.onItemDragEnd.call(undefined, {
245
+ target: this,
246
+ item: item,
247
+ itemHierarchicalIndex: itemId,
248
+ pageX: pageX,
249
+ pageY: pageY,
250
+ clientX: clientX,
251
+ clientY: clientY
252
+ });
253
+ }
254
+ },
255
+ onItemClick: function onItemClick(event, item, itemId) {
256
+ this.setFocus(itemId);
257
+ this.dispatchItemClick(event, item, itemId);
258
+ },
259
+ onFocus: function onFocus() {
260
+ clearTimeout(this.blurRequest);
261
+
262
+ if (this.focusedItemId === undefined && this.dataItems.length) {
263
+ this.setFocus(this.tabbableItemId);
264
+ }
265
+ },
266
+ onBlur: function onBlur() {
267
+ var _this = this;
268
+
269
+ clearTimeout(this.blurRequest);
270
+ this.blurRequest = window.setTimeout(function () {
271
+ return _this.setFocus(undefined);
272
+ }, 0);
273
+ },
274
+ onKeyDown: function onKeyDown(event) {
275
+ var focusedItem = this.getFocusedItem();
276
+
277
+ if (focusedItem) {
278
+ var newItemId = getItemIdUponKeyboardNavigation_1.default(focusedItem, this.focusedItemId, this.dataItems, event.keyCode, this.fieldsSvc);
279
+
280
+ if (newItemId !== this.focusedItemId) {
281
+ // This disables the auto-scroll. The scroll is achieved via item focusing.
282
+ event.preventDefault();
283
+ this.allowExplicitFocus = true;
284
+ this.setFocus(newItemId);
285
+ }
286
+
287
+ this.dispatchEventsOnKeyDown(event, focusedItem);
288
+ }
289
+ },
290
+ dispatchEventsOnKeyDown: function dispatchEventsOnKeyDown(event, focusedItem) {
291
+ var _this = this; // isEnabled is the most expensive op and that is why is left last.
292
+
293
+
294
+ var isEnabled = function isEnabled() {
295
+ return itemUtils_1.isEnabledAndAllParentsEnabled(_this.focusedItemId, _this.dataItems, _this.fieldsSvc);
296
+ };
297
+
298
+ if (event.keyCode === kendo_vue_common_1.Keys.left && this.fieldsSvc.expanded(focusedItem) && isEnabled()) {
299
+ this.dispatchExpandChange(event, focusedItem, this.focusedItemId);
300
+ } else if (event.keyCode === kendo_vue_common_1.Keys.right && !this.fieldsSvc.expanded(focusedItem) && (this.fieldsSvc.hasChildren(focusedItem) || itemUtils_1.hasChildren(focusedItem, this.$props.childrenField)) && isEnabled()) {
301
+ this.dispatchExpandChange(event, focusedItem, this.focusedItemId);
302
+ } else if (event.keyCode === kendo_vue_common_1.Keys.enter && isEnabled()) {
303
+ this.dispatchItemClick(event, focusedItem, this.focusedItemId);
304
+ } else if (event.keyCode === kendo_vue_common_1.Keys.space && isEnabled()) {
305
+ // W/o preventDefault() long TreeViews gets incorrectly scrolled.
306
+ event.preventDefault();
307
+ this.dispatchCheckChange(event, focusedItem, this.focusedItemId);
308
+ }
309
+ },
310
+ setFocus: function setFocus(focusedItemId) {
311
+ if (focusedItemId) {
312
+ if (this.fieldsSvc.focusIdField) {
313
+ var item = this.getItemById(focusedItemId);
314
+ this.focusedItemId = focusedItemId;
315
+ this.focusedItemPublicId = this.fieldsSvc.focusId(item);
316
+ } else {
317
+ this.focusedItemId = focusedItemId;
318
+ }
319
+ } else {
320
+ this.focusedItemId = undefined;
321
+ this.focusedItemPublicId = undefined;
322
+ this.tabbableItemId = this.focusedItemId;
323
+ }
324
+ },
325
+ getFocusedItem: function getFocusedItem() {
326
+ return this.focusedItemId ? this.getItemById(this.focusedItemId) : undefined;
327
+ },
328
+ getItemById: function getItemById(itemId) {
329
+ return itemIdUtils_1.getItemById(itemId, this.dataItems, this.$props.childrenField || consts_1.CHILDREN_FIELD);
330
+ },
331
+ dispatchCheckChange: function dispatchCheckChange(_dispatchedEvent, item, itemId) {
332
+ this.$emit('checkchange', {
333
+ item: item,
334
+ itemHierarchicalIndex: itemId
335
+ });
336
+ },
337
+ dispatchExpandChange: function dispatchExpandChange(_dispatchedEvent, item, itemId) {
338
+ this.$emit('expandchange', {
339
+ item: item,
340
+ itemHierarchicalIndex: itemId
341
+ });
342
+ },
343
+ dispatchItemClick: function dispatchItemClick(_dispatchedEvent, item, itemId) {
344
+ this.$emit('itemclick', {
345
+ item: item,
346
+ itemHierarchicalIndex: itemId
347
+ });
348
+ },
349
+ refocusDueToFocusIdField: function refocusDueToFocusIdField() {
350
+ if (this.fieldsSvc.focusIdField) {
351
+ var focusedItemPublicId = this.focusedItemPublicId;
352
+
353
+ if (focusedItemPublicId) {
354
+ var focusedItemId = this.$props.getFocusHierarchicalIndex ? this.$props.getFocusHierarchicalIndex(focusedItemPublicId) : itemUtils_1.resolveItemId(focusedItemPublicId, this.fieldsSvc.focusIdField, this.dataItems, this.$props.childrenField);
355
+
356
+ if (focusedItemId !== this.focusedItemId) {
357
+ this.allowExplicitFocus = true;
358
+ this.focusedItemId = focusedItemId;
359
+ }
360
+ }
361
+ }
362
+ },
363
+ // private get ariaMultiSelectable() {
364
+ // return this.$props['aria-multiselectable'] === true || this.$props['aria-multiselectable'] === 'true';
365
+ // }
366
+ focusDomItem: function focusDomItem(domItem) {
367
+ domItem.focus();
368
+ },
369
+ guid: function guid() {
370
+ return this.treeGuid;
371
+ }
372
+ }
373
+ };
374
+ exports.TreeViewVue2 = TreeViewVue2;
375
+ var TreeView = TreeViewVue2;
376
+ exports.TreeView = TreeView;
@@ -0,0 +1,135 @@
1
+ import { TreeViewItemDragOverEvent, TreeViewItemDragEndEvent } from './events';
2
+ /**
3
+ * A class which provides an API for analyzing the `drag` events
4
+ * of the TreeView.
5
+ *
6
+ * @example
7
+ * ```jsx
8
+ * class App extends React.Component {
9
+ * dragClue;
10
+ * state = { tree };
11
+ *
12
+ * render() {
13
+ * return (
14
+ * <div>
15
+ * <TreeView data={this.state.tree} draggable={true}
16
+ * onItemDragOver={this.onItemDragOver} onItemDragEnd={this.onItemDragEnd} />
17
+ * <TreeViewDragClue ref={dragClue => this.dragClue = dragClue} />
18
+ * </div>
19
+ * );
20
+ * }
21
+ *
22
+ * onItemDragOver = (event) => {
23
+ * this.dragClue.show(event.pageY + 10, event.pageX, event.item.text, this.getClueClassName(event));
24
+ * }
25
+ * onItemDragEnd = (event) => {
26
+ * this.dragClue.hide();
27
+ * const eventAnalyzer = new TreeViewDragAnalyzer(event).init();
28
+ *
29
+ * if (eventAnalyzer.isDropAllowed) {
30
+ * const updatedTree = moveTreeViewItem(
31
+ * event.itemHierarchicalIndex,
32
+ * this.state.tree,
33
+ * eventAnalyzer.getDropOperation(),
34
+ * eventAnalyzer.destinationMeta.itemHierarchicalIndex,
35
+ * );
36
+ *
37
+ * this.setState({ tree: updatedTree });
38
+ * }
39
+ * }
40
+ * getClueClassName(event) {
41
+ * const eventAnalyzer = new TreeViewDragAnalyzer(event).init();
42
+ * const itemIndex = eventAnalyzer.destinationMeta.itemHierarchicalIndex;
43
+ *
44
+ * if (eventAnalyzer.isDropAllowed) {
45
+ * switch (eventAnalyzer.getDropOperation()) {
46
+ * case 'child':
47
+ * return 'k-i-plus';
48
+ * case 'before':
49
+ * return itemIndex === '0' || itemIndex.endsWith(`${SEPARATOR}0`) ?
50
+ * 'k-i-insert-up' : 'k-i-insert-middle';
51
+ * case 'after':
52
+ * const siblings = getSiblings(itemIndex, this.state.tree);
53
+ * const lastIndex = Number(itemIndex.split(SEPARATOR).pop());
54
+ *
55
+ * return lastIndex < siblings.length - 1 ? 'k-i-insert-middle' : 'k-i-insert-down';
56
+ * default:
57
+ * break;
58
+ * }
59
+ * }
60
+ *
61
+ * return 'k-i-cancel';
62
+ * }
63
+ * }
64
+ *
65
+ * function getSiblings(itemIndex, data) {
66
+ * let result = data;
67
+ *
68
+ * const indices = itemIndex.split(SEPARATOR).map(index => Number(index));
69
+ * for (let i = 0; i < indices.length - 1; i++) {
70
+ * result = result[indices[i]].items;
71
+ * }
72
+ *
73
+ * return result;
74
+ * }
75
+ *
76
+ * const SEPARATOR = '_';
77
+ * const tree = [{
78
+ * text: 'Furniture', expanded: true, items: [
79
+ * { text: 'Tables & Chairs', expanded: true },
80
+ * { text: 'Sofas', expanded: true },
81
+ * { text: 'Occasional Furniture', expanded: true }]
82
+ * }, {
83
+ * text: 'Decor', expanded: true, items: [
84
+ * { text: 'Bed Linen', expanded: true },
85
+ * { text: 'Curtains & Blinds', expanded: true },
86
+ * { text: 'Carpets', expanded: true }]
87
+ * }];
88
+ *
89
+ * ReactDOM.render(<App />, document.querySelector('my-app'));
90
+ * ```
91
+ */
92
+ export default class TreeViewDragAnalyzer {
93
+ private event;
94
+ private itemId;
95
+ private treeViewGuid;
96
+ private initialized;
97
+ private destDomNodeWithMeta;
98
+ private destItemId;
99
+ private destTreeViewGuid;
100
+ /**
101
+ * @param event - The event that will be analyzed.
102
+ */
103
+ constructor(event: TreeViewItemDragOverEvent | TreeViewItemDragEndEvent);
104
+ /**
105
+ * The method which initializes the analyzer.
106
+ * Invoke the method before you call any other methods.
107
+ *
108
+ * @returns - The analyzer object of the `drag` event.
109
+ */
110
+ init(): this;
111
+ /**
112
+ * Returns `true` if dropping is allowed. Otherwise, returns `false`.
113
+ */
114
+ get isDropAllowed(): boolean;
115
+ /**
116
+ * Returns an object which contains:
117
+ * * The `itemHierarchicalIndex` of the destination item (the item below the dragged item) and
118
+ * * The `guid` of the destination TreeView (the TreeView which renders the destination item).
119
+ */
120
+ get destinationMeta(): {
121
+ itemHierarchicalIndex: string;
122
+ treeViewGuid: string;
123
+ };
124
+ /**
125
+ * Returns the specific drop operation.
126
+ *
127
+ * @returns - The following values are returned:
128
+ * * `before`&mdash;Indicates that the dragged item is positioned at the beginning of the destination item.
129
+ * * `after`&mdash;Indicates that the dragged item is positioned at the end of the destination item.
130
+ * * `child`&mdash;Indicates that the dragged item is positioned in the middle of the destination item.
131
+ * * `undefined`&mdash;Indicates that dropping is not allowed.
132
+ */
133
+ getDropOperation(): "before" | "after" | "child";
134
+ private setDestimationMeta;
135
+ }
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var consts_1 = require("./utils/consts");
4
+ var DROPZONE_BOUNDARY_DELTA = 6;
5
+ /**
6
+ * A class which provides an API for analyzing the `drag` events
7
+ * of the TreeView.
8
+ *
9
+ * @example
10
+ * ```jsx
11
+ * class App extends React.Component {
12
+ * dragClue;
13
+ * state = { tree };
14
+ *
15
+ * render() {
16
+ * return (
17
+ * <div>
18
+ * <TreeView data={this.state.tree} draggable={true}
19
+ * onItemDragOver={this.onItemDragOver} onItemDragEnd={this.onItemDragEnd} />
20
+ * <TreeViewDragClue ref={dragClue => this.dragClue = dragClue} />
21
+ * </div>
22
+ * );
23
+ * }
24
+ *
25
+ * onItemDragOver = (event) => {
26
+ * this.dragClue.show(event.pageY + 10, event.pageX, event.item.text, this.getClueClassName(event));
27
+ * }
28
+ * onItemDragEnd = (event) => {
29
+ * this.dragClue.hide();
30
+ * const eventAnalyzer = new TreeViewDragAnalyzer(event).init();
31
+ *
32
+ * if (eventAnalyzer.isDropAllowed) {
33
+ * const updatedTree = moveTreeViewItem(
34
+ * event.itemHierarchicalIndex,
35
+ * this.state.tree,
36
+ * eventAnalyzer.getDropOperation(),
37
+ * eventAnalyzer.destinationMeta.itemHierarchicalIndex,
38
+ * );
39
+ *
40
+ * this.setState({ tree: updatedTree });
41
+ * }
42
+ * }
43
+ * getClueClassName(event) {
44
+ * const eventAnalyzer = new TreeViewDragAnalyzer(event).init();
45
+ * const itemIndex = eventAnalyzer.destinationMeta.itemHierarchicalIndex;
46
+ *
47
+ * if (eventAnalyzer.isDropAllowed) {
48
+ * switch (eventAnalyzer.getDropOperation()) {
49
+ * case 'child':
50
+ * return 'k-i-plus';
51
+ * case 'before':
52
+ * return itemIndex === '0' || itemIndex.endsWith(`${SEPARATOR}0`) ?
53
+ * 'k-i-insert-up' : 'k-i-insert-middle';
54
+ * case 'after':
55
+ * const siblings = getSiblings(itemIndex, this.state.tree);
56
+ * const lastIndex = Number(itemIndex.split(SEPARATOR).pop());
57
+ *
58
+ * return lastIndex < siblings.length - 1 ? 'k-i-insert-middle' : 'k-i-insert-down';
59
+ * default:
60
+ * break;
61
+ * }
62
+ * }
63
+ *
64
+ * return 'k-i-cancel';
65
+ * }
66
+ * }
67
+ *
68
+ * function getSiblings(itemIndex, data) {
69
+ * let result = data;
70
+ *
71
+ * const indices = itemIndex.split(SEPARATOR).map(index => Number(index));
72
+ * for (let i = 0; i < indices.length - 1; i++) {
73
+ * result = result[indices[i]].items;
74
+ * }
75
+ *
76
+ * return result;
77
+ * }
78
+ *
79
+ * const SEPARATOR = '_';
80
+ * const tree = [{
81
+ * text: 'Furniture', expanded: true, items: [
82
+ * { text: 'Tables & Chairs', expanded: true },
83
+ * { text: 'Sofas', expanded: true },
84
+ * { text: 'Occasional Furniture', expanded: true }]
85
+ * }, {
86
+ * text: 'Decor', expanded: true, items: [
87
+ * { text: 'Bed Linen', expanded: true },
88
+ * { text: 'Curtains & Blinds', expanded: true },
89
+ * { text: 'Carpets', expanded: true }]
90
+ * }];
91
+ *
92
+ * ReactDOM.render(<App />, document.querySelector('my-app'));
93
+ * ```
94
+ */
95
+ var TreeViewDragAnalyzer = /** @class */ (function () {
96
+ /**
97
+ * @param event - The event that will be analyzed.
98
+ */
99
+ function TreeViewDragAnalyzer(event) {
100
+ this.event = event;
101
+ this.initialized = false;
102
+ this.itemId = event.itemHierarchicalIndex;
103
+ this.treeViewGuid = event.target.guid;
104
+ }
105
+ /**
106
+ * The method which initializes the analyzer.
107
+ * Invoke the method before you call any other methods.
108
+ *
109
+ * @returns - The analyzer object of the `drag` event.
110
+ */
111
+ TreeViewDragAnalyzer.prototype.init = function () {
112
+ if (!this.initialized) {
113
+ this.setDestimationMeta(document.elementFromPoint(this.event.clientX, this.event.clientY));
114
+ this.initialized = true;
115
+ }
116
+ return this;
117
+ };
118
+ Object.defineProperty(TreeViewDragAnalyzer.prototype, "isDropAllowed", {
119
+ /**
120
+ * Returns `true` if dropping is allowed. Otherwise, returns `false`.
121
+ */
122
+ get: function () {
123
+ if (this.initialized && this.destItemId && this.destTreeViewGuid) {
124
+ // Disallow circular references.
125
+ return !((this.destTreeViewGuid + "_" + this.destItemId + "_").
126
+ startsWith(this.treeViewGuid + "_" + this.itemId + "_"));
127
+ }
128
+ else {
129
+ return false;
130
+ }
131
+ },
132
+ enumerable: false,
133
+ configurable: true
134
+ });
135
+ Object.defineProperty(TreeViewDragAnalyzer.prototype, "destinationMeta", {
136
+ /**
137
+ * Returns an object which contains:
138
+ * * The `itemHierarchicalIndex` of the destination item (the item below the dragged item) and
139
+ * * The `guid` of the destination TreeView (the TreeView which renders the destination item).
140
+ */
141
+ get: function () {
142
+ return { itemHierarchicalIndex: this.destItemId, treeViewGuid: this.destTreeViewGuid };
143
+ },
144
+ enumerable: false,
145
+ configurable: true
146
+ });
147
+ /**
148
+ * Returns the specific drop operation.
149
+ *
150
+ * @returns - The following values are returned:
151
+ * * `before`&mdash;Indicates that the dragged item is positioned at the beginning of the destination item.
152
+ * * `after`&mdash;Indicates that the dragged item is positioned at the end of the destination item.
153
+ * * `child`&mdash;Indicates that the dragged item is positioned in the middle of the destination item.
154
+ * * `undefined`&mdash;Indicates that dropping is not allowed.
155
+ */
156
+ TreeViewDragAnalyzer.prototype.getDropOperation = function () {
157
+ if (this.initialized && this.isDropAllowed) {
158
+ var _a = this.destDomNodeWithMeta.getBoundingClientRect(), top_1 = _a.top, height = _a.height;
159
+ if (top_1 + height - this.event.clientY < DROPZONE_BOUNDARY_DELTA) {
160
+ return 'after';
161
+ }
162
+ else if (this.event.clientY - top_1 < DROPZONE_BOUNDARY_DELTA) {
163
+ return 'before';
164
+ }
165
+ else {
166
+ return 'child';
167
+ }
168
+ }
169
+ else {
170
+ return undefined;
171
+ }
172
+ };
173
+ TreeViewDragAnalyzer.prototype.setDestimationMeta = function (element) {
174
+ var node = element;
175
+ while (node && !node[consts_1.DOM_KENDO_ITEM_ID_FIELD]) {
176
+ node = node.parentNode;
177
+ }
178
+ if (node && node[consts_1.DOM_KENDO_ITEM_ID_FIELD]) {
179
+ this.destDomNodeWithMeta = node;
180
+ this.destItemId = node[consts_1.DOM_KENDO_ITEM_ID_FIELD];
181
+ this.destTreeViewGuid = node[consts_1.DOM_KENDO_TREEVIEW_GUID_FIELD];
182
+ }
183
+ };
184
+ return TreeViewDragAnalyzer;
185
+ }());
186
+ exports.default = TreeViewDragAnalyzer;