@syncfusion/ej2-filemanager 29.2.4 → 30.1.37

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 (163) hide show
  1. package/.eslintrc.json +2 -0
  2. package/dist/ej2-filemanager.min.js +2 -2
  3. package/dist/ej2-filemanager.umd.min.js +2 -2
  4. package/dist/ej2-filemanager.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-filemanager.es2015.js +181 -20
  6. package/dist/es6/ej2-filemanager.es2015.js.map +1 -1
  7. package/dist/es6/ej2-filemanager.es5.js +182 -20
  8. package/dist/es6/ej2-filemanager.es5.js.map +1 -1
  9. package/dist/global/ej2-filemanager.min.js +2 -2
  10. package/dist/global/ej2-filemanager.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/dist/ts/file-manager/actions/breadcrumb-bar.d.ts +60 -0
  13. package/dist/ts/file-manager/actions/breadcrumb-bar.ts +423 -0
  14. package/dist/ts/file-manager/actions/index.d.ts +6 -0
  15. package/dist/ts/file-manager/actions/index.ts +6 -0
  16. package/dist/ts/file-manager/actions/toolbar.d.ts +54 -0
  17. package/dist/ts/file-manager/actions/toolbar.ts +609 -0
  18. package/dist/ts/file-manager/actions/virtualization.d.ts +93 -0
  19. package/dist/ts/file-manager/actions/virtualization.ts +324 -0
  20. package/dist/ts/file-manager/base/classes.d.ts +224 -0
  21. package/dist/ts/file-manager/base/classes.ts +225 -0
  22. package/dist/ts/file-manager/base/constant.d.ts +136 -0
  23. package/dist/ts/file-manager/base/constant.ts +137 -0
  24. package/dist/ts/file-manager/base/file-manager-model.d.ts +520 -0
  25. package/dist/ts/file-manager/base/file-manager.d.ts +867 -0
  26. package/dist/ts/file-manager/base/file-manager.ts +2061 -0
  27. package/dist/ts/file-manager/base/index.d.ts +8 -0
  28. package/dist/ts/file-manager/base/index.ts +8 -0
  29. package/dist/ts/file-manager/base/interface.d.ts +952 -0
  30. package/dist/ts/file-manager/base/interface.ts +931 -0
  31. package/dist/ts/file-manager/common/index.d.ts +5 -0
  32. package/dist/ts/file-manager/common/index.ts +5 -0
  33. package/dist/ts/file-manager/common/operations.d.ts +122 -0
  34. package/dist/ts/file-manager/common/operations.ts +1369 -0
  35. package/dist/ts/file-manager/common/utility.d.ts +644 -0
  36. package/dist/ts/file-manager/common/utility.ts +1728 -0
  37. package/dist/ts/file-manager/index.d.ts +9 -0
  38. package/dist/ts/file-manager/index.ts +9 -0
  39. package/dist/ts/file-manager/layout/details-view.d.ts +152 -0
  40. package/dist/ts/file-manager/layout/details-view.ts +1990 -0
  41. package/dist/ts/file-manager/layout/index.d.ts +6 -0
  42. package/dist/ts/file-manager/layout/index.ts +6 -0
  43. package/dist/ts/file-manager/layout/large-icons-view.d.ts +157 -0
  44. package/dist/ts/file-manager/layout/large-icons-view.ts +1684 -0
  45. package/dist/ts/file-manager/layout/navigation-pane.d.ts +104 -0
  46. package/dist/ts/file-manager/layout/navigation-pane.ts +919 -0
  47. package/dist/ts/file-manager/models/ajax-settings-model.d.ts +36 -0
  48. package/dist/ts/file-manager/models/ajax-settings.d.ts +30 -0
  49. package/dist/ts/file-manager/models/ajax-settings.ts +39 -0
  50. package/dist/ts/file-manager/models/column-model.d.ts +155 -0
  51. package/dist/ts/file-manager/models/column.d.ts +179 -0
  52. package/dist/ts/file-manager/models/column.ts +216 -0
  53. package/dist/ts/file-manager/models/contextMenu-settings-model.d.ts +36 -0
  54. package/dist/ts/file-manager/models/contextMenu-settings.d.ts +33 -0
  55. package/dist/ts/file-manager/models/contextMenu-settings.ts +44 -0
  56. package/dist/ts/file-manager/models/default-locale.d.ts +4 -0
  57. package/dist/ts/file-manager/models/default-locale.ts +101 -0
  58. package/dist/ts/file-manager/models/details-view-settings-model.d.ts +30 -0
  59. package/dist/ts/file-manager/models/details-view-settings.d.ts +31 -0
  60. package/dist/ts/file-manager/models/details-view-settings.ts +54 -0
  61. package/dist/ts/file-manager/models/index.d.ts +19 -0
  62. package/dist/ts/file-manager/models/index.ts +19 -0
  63. package/dist/ts/file-manager/models/navigation-pane-settings-model.d.ts +40 -0
  64. package/dist/ts/file-manager/models/navigation-pane-settings.d.ts +34 -0
  65. package/dist/ts/file-manager/models/navigation-pane-settings.ts +42 -0
  66. package/dist/ts/file-manager/models/search-settings-model.d.ts +42 -0
  67. package/dist/ts/file-manager/models/search-settings.d.ts +44 -0
  68. package/dist/ts/file-manager/models/search-settings.ts +53 -0
  69. package/dist/ts/file-manager/models/toolbar-settings-model.d.ts +197 -0
  70. package/dist/ts/file-manager/models/toolbar-settings.d.ts +174 -0
  71. package/dist/ts/file-manager/models/toolbar-settings.ts +198 -0
  72. package/dist/ts/file-manager/models/upload-settings-model.d.ts +70 -0
  73. package/dist/ts/file-manager/models/upload-settings.d.ts +61 -0
  74. package/dist/ts/file-manager/models/upload-settings.ts +75 -0
  75. package/dist/ts/file-manager/pop-up/context-menu.d.ts +64 -0
  76. package/dist/ts/file-manager/pop-up/context-menu.ts +693 -0
  77. package/dist/ts/file-manager/pop-up/dialog.d.ts +31 -0
  78. package/dist/ts/file-manager/pop-up/dialog.ts +1009 -0
  79. package/dist/ts/file-manager/pop-up/index.d.ts +5 -0
  80. package/dist/ts/file-manager/pop-up/index.ts +5 -0
  81. package/dist/ts/index.d.ts +4 -0
  82. package/dist/ts/index.ts +4 -0
  83. package/package.json +16 -17
  84. package/src/file-manager/base/interface.d.ts +10 -0
  85. package/src/file-manager/common/operations.d.ts +18 -1
  86. package/src/file-manager/common/operations.js +59 -0
  87. package/src/file-manager/common/utility.d.ts +3 -3
  88. package/src/file-manager/common/utility.js +20 -6
  89. package/src/file-manager/layout/details-view.js +4 -3
  90. package/src/file-manager/layout/large-icons-view.d.ts +3 -0
  91. package/src/file-manager/layout/large-icons-view.js +67 -9
  92. package/src/file-manager/layout/navigation-pane.js +2 -0
  93. package/src/file-manager/pop-up/dialog.d.ts +3 -3
  94. package/src/file-manager/pop-up/dialog.js +34 -6
  95. package/styles/bds-lite.css +51 -1
  96. package/styles/bds.css +51 -1
  97. package/styles/bootstrap-dark-lite.css +51 -0
  98. package/styles/bootstrap-dark.css +51 -0
  99. package/styles/bootstrap-lite.css +51 -0
  100. package/styles/bootstrap.css +51 -0
  101. package/styles/bootstrap4-lite.css +51 -0
  102. package/styles/bootstrap4.css +51 -0
  103. package/styles/bootstrap5-dark-lite.css +51 -1
  104. package/styles/bootstrap5-dark.css +51 -1
  105. package/styles/bootstrap5-lite.css +51 -1
  106. package/styles/bootstrap5.3-lite.css +51 -0
  107. package/styles/bootstrap5.3.css +51 -0
  108. package/styles/bootstrap5.css +51 -1
  109. package/styles/fabric-dark-lite.css +51 -0
  110. package/styles/fabric-dark.css +51 -0
  111. package/styles/fabric-lite.css +51 -0
  112. package/styles/fabric.css +51 -0
  113. package/styles/file-manager/_bds-definition.scss +1 -0
  114. package/styles/file-manager/_bootstrap5-definition.scss +1 -0
  115. package/styles/file-manager/_layout.scss +46 -4
  116. package/styles/file-manager/_material3-definition.scss +2 -2
  117. package/styles/file-manager/_tailwind-definition.scss +1 -0
  118. package/styles/file-manager/_tailwind3-definition.scss +1 -0
  119. package/styles/file-manager/bds.css +51 -1
  120. package/styles/file-manager/bootstrap-dark.css +51 -0
  121. package/styles/file-manager/bootstrap.css +51 -0
  122. package/styles/file-manager/bootstrap4.css +51 -0
  123. package/styles/file-manager/bootstrap5-dark.css +51 -1
  124. package/styles/file-manager/bootstrap5.3.css +51 -0
  125. package/styles/file-manager/bootstrap5.css +51 -1
  126. package/styles/file-manager/fabric-dark.css +51 -0
  127. package/styles/file-manager/fabric.css +51 -0
  128. package/styles/file-manager/fluent-dark.css +51 -0
  129. package/styles/file-manager/fluent.css +51 -0
  130. package/styles/file-manager/fluent2.css +51 -0
  131. package/styles/file-manager/highcontrast-light.css +51 -0
  132. package/styles/file-manager/highcontrast.css +51 -0
  133. package/styles/file-manager/material-dark.css +51 -0
  134. package/styles/file-manager/material.css +51 -0
  135. package/styles/file-manager/material3-dark.css +53 -2
  136. package/styles/file-manager/material3.css +53 -2
  137. package/styles/file-manager/tailwind-dark.css +51 -1
  138. package/styles/file-manager/tailwind.css +51 -1
  139. package/styles/file-manager/tailwind3.css +51 -0
  140. package/styles/fluent-dark-lite.css +51 -0
  141. package/styles/fluent-dark.css +51 -0
  142. package/styles/fluent-lite.css +51 -0
  143. package/styles/fluent.css +51 -0
  144. package/styles/fluent2-lite.css +51 -0
  145. package/styles/fluent2.css +51 -0
  146. package/styles/highcontrast-light-lite.css +51 -0
  147. package/styles/highcontrast-light.css +51 -0
  148. package/styles/highcontrast-lite.css +51 -0
  149. package/styles/highcontrast.css +51 -0
  150. package/styles/material-dark-lite.css +51 -0
  151. package/styles/material-dark.css +51 -0
  152. package/styles/material-lite.css +51 -0
  153. package/styles/material.css +51 -0
  154. package/styles/material3-dark-lite.css +51 -0
  155. package/styles/material3-dark.css +53 -2
  156. package/styles/material3-lite.css +51 -0
  157. package/styles/material3.css +53 -2
  158. package/styles/tailwind-dark-lite.css +51 -1
  159. package/styles/tailwind-dark.css +51 -1
  160. package/styles/tailwind-lite.css +51 -1
  161. package/styles/tailwind.css +51 -1
  162. package/styles/tailwind3-lite.css +51 -0
  163. package/styles/tailwind3.css +51 -0
@@ -0,0 +1,919 @@
1
+ import { TreeView as BaseTreeView, NodeSelectEventArgs, NodeExpandEventArgs, DrawNodeEventArgs } from '@syncfusion/ej2-navigations';
2
+ import { NodeEditEventArgs, NodeClickEventArgs } from '@syncfusion/ej2-navigations';
3
+ import { isNullOrUndefined as isNOU, select, setValue, getValue, DragEventArgs, Draggable } from '@syncfusion/ej2-base';
4
+ import { KeyboardEvents, KeyboardEventArgs, Touch, closest } from '@syncfusion/ej2-base';
5
+ import { DataManager, Query } from '@syncfusion/ej2-data';
6
+ import * as events from '../base/constant';
7
+ import * as CLS from '../base/classes';
8
+ import { IFileManager, ReadArgs, FileLoadEventArgs, NotifyArgs, FileOpenEventArgs, FileSelectEventArgs } from '../base/interface';
9
+ import { read, Download, GetDetails, Delete, isFileSystemData } from '../common/operations';
10
+ import { createDialog } from '../pop-up/dialog';
11
+ import { updatePath, getPath, getDirectories } from '../common/utility';
12
+ import { createVirtualDragElement, dragStopHandler, dragStartHandler, draggingHandler, getDirectoryPath, getModule, getPathId } from '../common/index';
13
+ import { copyFiles, cutFiles, removeActive, pasteHandler, getParentPath, readDropPath } from '../common/index';
14
+ import { hasEditAccess, createDeniedDialog, hasDownloadAccess, getAccessClass } from '../common/index';
15
+
16
+ /**
17
+ * NavigationPane module
18
+ */
19
+ export class NavigationPane {
20
+
21
+ /* Internal variables */
22
+ private parent: IFileManager;
23
+ public treeObj: BaseTreeView;
24
+ public activeNode: Element;
25
+ private keyboardModule: KeyboardEvents;
26
+ private keyConfigs: { [key: string]: string };
27
+ private expandNodeTarget: string;
28
+ public removeNodes: string[] = [];
29
+ public moveNames: string[] = [];
30
+ public touchClickObj: Touch;
31
+ // Specifies the previously selected nodes in the treeview control.
32
+ public previousSelected: string[] = [];
33
+ private isDrag: boolean = false;
34
+ private dragObj: Draggable;
35
+ private isPathDragged: boolean = false;
36
+ private isRenameParent: boolean = false;
37
+ private isRightClick: boolean = false;
38
+ private isSameNodeClicked: boolean = false;
39
+ private isNodeExpandCalled: boolean = false;
40
+ private renameParent: string = null;
41
+ // Specifies whether the nodeClicked event of the treeview control is triggered or not.
42
+ private isNodeClickCalled: boolean = false;
43
+ // Specifies whether to restrict node selection in the treeview control.
44
+ private restrictSelecting: boolean = false;
45
+ /**
46
+ * Constructor for the TreeView module
47
+ *
48
+ * @param {IFileManager} parent - specifies the parent element.
49
+ * @hidden
50
+ */
51
+ /* istanbul ignore next */
52
+ constructor(parent?: IFileManager) {
53
+ this.parent = parent;
54
+ this.addEventListener();
55
+ this.keyConfigs = {
56
+ altEnter: 'alt+enter',
57
+ esc: 'escape',
58
+ del: 'delete',
59
+ ctrlX: this.parent.isMac ? 'cmd+x' : 'ctrl+x',
60
+ ctrlC: this.parent.isMac ? 'cmd+c' : 'ctrl+c',
61
+ ctrlV: this.parent.isMac ? 'cmd+v' : 'ctrl+v',
62
+ ctrlShiftN: 'ctrl+shift+n',
63
+ shiftF10: 'shift+F10',
64
+ f2: 'f2'
65
+ };
66
+ }
67
+
68
+ private onInit(): void {
69
+ if (!isNOU(this.treeObj)) { return; }
70
+ const rootData: { [key: string]: Object; } = getValue(this.parent.pathId[0], this.parent.feParent);
71
+ setValue('_fm_icon', 'e-fe-folder', rootData);
72
+ const attr: Object = {};
73
+ const id: string = getValue('id', rootData);
74
+ if (!isNOU(id)) {
75
+ setValue('data-id', id, attr);
76
+ }
77
+ if (!hasEditAccess(rootData)) {
78
+ setValue('class', getAccessClass(rootData), attr);
79
+ }
80
+ if (!isNOU(attr)) {
81
+ setValue('_fm_htmlAttr', attr, rootData);
82
+ }
83
+ this.treeObj = new BaseTreeView({
84
+ fields: {
85
+ dataSource: [rootData], id: '_fm_id', parentID: '_fm_pId', expanded: '_fm_expanded', selected: '_fm_selected', text: 'name',
86
+ hasChildren: 'hasChild', iconCss: '_fm_icon', htmlAttributes: '_fm_htmlAttr', tooltip: 'name'
87
+ },
88
+ enableHtmlSanitizer: this.parent.enableHtmlSanitizer,
89
+ sortOrder: this.parent.navigationPaneSettings.sortOrder,
90
+ nodeSelecting: this.onNodeSelecting.bind(this),
91
+ nodeSelected: this.onNodeSelected.bind(this),
92
+ nodeExpanding: this.onNodeExpand.bind(this),
93
+ nodeClicked: this.onNodeClicked.bind(this),
94
+ allowEditing: true,
95
+ nodeEditing: this.onNodeEditing.bind(this),
96
+ drawNode: this.onDrowNode.bind(this),
97
+ enableRtl: this.parent.enableRtl,
98
+ dataBound: this.addDragDrop.bind(this)
99
+ });
100
+ this.treeObj.isStringTemplate = true;
101
+ this.treeObj.appendTo('#' + this.parent.element.id + CLS.TREE_ID);
102
+ this.wireEvents();
103
+ }
104
+
105
+ private addDragDrop(): void {
106
+ if (!this.parent.isMobile && this.treeObj) {
107
+ if (this.parent.allowDragAndDrop && isNOU(this.dragObj)) {
108
+ this.dragObj = new Draggable(this.treeObj.element, {
109
+ cursorAt: this.parent.dragCursorPosition,
110
+ dragTarget: '.' + CLS.FULLROW,
111
+ distance: 5,
112
+ dragArea: this.parent.element,
113
+ drag: draggingHandler.bind(this, this.parent),
114
+ dragStart: (args: DragEventArgs) => {
115
+ dragStartHandler(this.parent, args, this.dragObj);
116
+ },
117
+ dragStop: dragStopHandler.bind(this, this.parent),
118
+ enableTailMode: true,
119
+ enableAutoScroll: false,
120
+ helper: this.dragHelper.bind(this)
121
+ });
122
+ } else if (!this.parent.allowDragAndDrop && this.dragObj) {
123
+ this.dragObj.destroy();
124
+ this.dragObj = null;
125
+ }
126
+ }
127
+ }
128
+
129
+ public dragHelper(args: { element: HTMLElement, sender: MouseEvent & TouchEvent }): HTMLElement {
130
+ const dragTarget: Element = <Element>args.sender.target;
131
+ if (!dragTarget.classList.contains(CLS.FULLROW)) { return null; }
132
+ const dragLi: Element = closest(dragTarget, 'li');
133
+ this.parent.dragPath = '';
134
+ this.parent.dragData = [];
135
+ this.parent.activeElements = [];
136
+ this.parent.activeElements = [dragLi];
137
+ this.parent.dragNodes = [];
138
+ getModule(this.parent, dragLi);
139
+ this.parent.dragData = <{ [key: string]: Object; }[]>this.getTreeData(dragLi);
140
+ this.parent.dragPath = this.getDragPath(dragLi, <string>this.parent.dragData[0].name);
141
+ this.parent.dragNodes.push(<string>this.parent.dragData[0].name);
142
+ createVirtualDragElement(this.parent);
143
+ return this.parent.virtualDragElement;
144
+ }
145
+
146
+ private getDragPath(dragLi: Element, text: string): string {
147
+ const path: string = this.getDropPath(dragLi, text);
148
+ return getParentPath(path);
149
+ }
150
+
151
+ private getDropPath(node: Element, text: string): string {
152
+ const id: string = node.getAttribute('data-id');
153
+ const newText: string = this.parent.hasId ? id : text;
154
+ return getPath(node, newText, this.parent.hasId);
155
+ }
156
+
157
+ private onDrowNode(args: DrawNodeEventArgs): void {
158
+ const eventArgs: FileLoadEventArgs = {
159
+ element: args.node,
160
+ fileDetails: args.nodeData,
161
+ module: 'NavigationPane'
162
+ };
163
+ this.parent.trigger('fileLoad', eventArgs);
164
+ }
165
+
166
+ private addChild(files: { [key: string]: Object; }[], target: string, prevent: boolean): void {
167
+ const directories: Object[] = getDirectories(files);
168
+ const targetDirectory: object[] = this.getTreeData(target);
169
+ if ( directories.length > 0 && targetDirectory.length > 0 &&
170
+ ((directories[0] as { [key: string]: Object }).filterPath == null ||
171
+ isNOU(targetDirectory[0])
172
+ && (targetDirectory[0] as { [key: string]: Object }).filterPath == null
173
+ || (directories[0] as { [key: string]: Object }).filterPath !==
174
+ (targetDirectory[0] as { [key: string]: Object }).filterPath)
175
+ ) {
176
+ let length: number = 0;
177
+ const folders: { [key: string]: Object; }[] = <{ [key: string]: Object; }[]>directories;
178
+ while (length < directories.length) {
179
+ // eslint-disable-next-line camelcase
180
+ folders[parseInt(length.toString(), 10)]._fm_icon = 'e-fe-folder';
181
+ const attr: Object = {};
182
+ const id: string = getValue('id', folders[length as number]);
183
+ if (!isNOU(id)) {
184
+ setValue('data-id', id, attr);
185
+ }
186
+ if (!hasEditAccess(folders[length as number])) {
187
+ setValue('class', getAccessClass(folders[length as number]), attr);
188
+ }
189
+ if (!isNOU(attr)) {
190
+ setValue('_fm_htmlAttr', attr, folders[length as number]);
191
+ }
192
+ length++;
193
+ }
194
+ const element: Element = select('[data-uid="' + target + '"]', this.treeObj.element);
195
+ const childElements: Element = select('ul', element);
196
+ if (isNOU(childElements)) {
197
+ this.treeObj.addNodes(directories as { [key: string]: Object; }[], target, null, prevent);
198
+ }
199
+ }
200
+ }
201
+
202
+ // Node Selecting event handler
203
+ private onNodeSelecting(args: NodeSelectEventArgs): void {
204
+ if (!args.isInteracted && !this.isRightClick &&
205
+ !this.isSameNodeClicked && !this.isPathDragged && !this.isRenameParent || this.restrictSelecting) {
206
+ this.restrictSelecting = false;
207
+ this.isNodeClickCalled = false;
208
+ return;
209
+ }
210
+ if (!this.renameParent) {
211
+ this.parent.activeModule = 'navigationpane';
212
+ const nodeData: Object[] = this.getTreeData(getValue('id', args.nodeData));
213
+ if (args.node.getAttribute('data-uid') !== this.parent.pathId[this.parent.pathId.length - 1] && !this.isRightClick && !this.isNodeClickCalled || this.isSameNodeClicked || this.isPathDragged) {
214
+ this.isNodeClickCalled = false;
215
+ if (!this.isSameNodeClicked)
216
+ {
217
+ this.isSameNodeClicked = true;
218
+ const selecEventArgs: FileSelectEventArgs =
219
+ { action: args.action, fileDetails: nodeData[0], isInteracted: args.isInteracted };
220
+ this.parent.trigger('fileSelect', selecEventArgs);
221
+ }
222
+ if (!this.isRightClick)
223
+ {
224
+ const eventArgs: FileOpenEventArgs = { cancel: false, fileDetails: nodeData[0], module: 'NavigationPane' };
225
+ this.parent.trigger('fileOpen', eventArgs);
226
+ args.cancel = eventArgs.cancel;
227
+ }
228
+ if (args.cancel) {
229
+ this.restrictSelecting = this.isNodeClickCalled ? this.previousSelected[0] !== args.node.getAttribute('data-uid') : false;
230
+ this.isNodeClickCalled = true;
231
+ this.isSameNodeClicked = false;
232
+ this.isPathDragged = false;
233
+ this.previousSelected = this.treeObj.selectedNodes;
234
+ this.treeObj.setProperties({selectedNodes: [args.node.getAttribute('data-uid')]});
235
+ }
236
+ }
237
+ else if (this.previousSelected[0] !== args.node.getAttribute('data-uid')){
238
+ this.isSameNodeClicked = true;
239
+ const selecEventArgs: FileSelectEventArgs =
240
+ { action: args.action, fileDetails: nodeData[0], isInteracted: this.isNodeClickCalled };
241
+ this.parent.trigger('fileSelect', selecEventArgs);
242
+ }
243
+ }
244
+ }
245
+
246
+ // Opens the folder while clicking open context menu item in the treeview.
247
+ public openFileOnContextMenuClick(node: HTMLLIElement): void {
248
+ const data: object[] = this.treeObj.getTreeData(node);
249
+ this.parent.selectedItems = [];
250
+ this.parent.itemData = data;
251
+ this.activeNode = node;
252
+ this.parent.activeModule = 'navigationpane';
253
+ const eventArgs: FileOpenEventArgs = { cancel: false, fileDetails: data[0], module: 'NavigationPane' };
254
+ this.parent.trigger('fileOpen', eventArgs);
255
+ this.isNodeClickCalled = true;
256
+ if (!eventArgs.cancel){
257
+ updatePath(node, this.parent.itemData[0], this.parent);
258
+ read(this.parent, this.isPathDragged ? events.pasteEnd : events.pathChanged, this.parent.path);
259
+ this.parent.visitedItem = node;
260
+ this.isPathDragged = this.isRenameParent = this.isRightClick = false;
261
+ this.treeObj.setProperties({selectedNodes: [node.getAttribute('data-uid')]});
262
+ }
263
+ }
264
+
265
+ private onNodeSelected(args: NodeSelectEventArgs): void {
266
+ if (this.parent.breadcrumbbarModule && this.parent.breadcrumbbarModule.searchObj && !this.renameParent) {
267
+ this.parent.breadcrumbbarModule.searchObj.element.value = '';
268
+ this.parent.isFiltered = false;
269
+ this.isNodeClickCalled = false;
270
+ }
271
+ this.parent.searchedItems = [];
272
+ if (!args.isInteracted && !this.isRightClick && !this.isSameNodeClicked && !this.isPathDragged && !this.isRenameParent) {
273
+ this.parent.pathId = getPathId(args.node);
274
+ return;
275
+ }
276
+ this.activeNode = args.node;
277
+ this.parent.activeModule = 'navigationpane';
278
+ const nodeData: Object[] = this.getTreeData(getValue('id', args.nodeData));
279
+ this.parent.selectedItems = [];
280
+ this.parent.itemData = nodeData;
281
+ const previousPath: string = this.parent.path;
282
+ if (!this.isRightClick && this.isSameNodeClicked ) {
283
+ updatePath(args.node, this.parent.itemData[0], this.parent);
284
+ }
285
+ else {
286
+ this.parent.pathId = getPathId(args.node);
287
+ this.parent.visitedItem = args.node;
288
+ }
289
+ if (args.node.querySelector('.' + CLS.ICONS) && args.node.querySelector('.' + CLS.LIST_ITEM) === null) {
290
+ this.expandNodeTarget = 'add';
291
+ }
292
+ if (previousPath !== this.parent.path) {
293
+ if (!this.isRightClick && this.isSameNodeClicked) {
294
+ read(this.parent, this.isPathDragged ? events.pasteEnd : events.pathChanged, this.parent.path);
295
+ this.isNodeClickCalled = true;
296
+ }
297
+ this.parent.visitedItem = args.node;
298
+ }
299
+ this.isPathDragged = this.isRenameParent = this.isRightClick = this.isSameNodeClicked = false;
300
+ }
301
+ /* istanbul ignore next */
302
+ private onPathDrag(args: object[]): void {
303
+ this.isPathDragged = true;
304
+ this.selectResultNode(args[0]);
305
+ }
306
+ /* istanbul ignore next */
307
+ private onNodeExpand(args: NodeExpandEventArgs): void {
308
+ if (!args.isInteracted && !this.isDrag) { return; }
309
+ if (args.node.querySelector('.' + CLS.LIST_ITEM) === null) {
310
+ this.isNodeExpandCalled = true;
311
+ const text: string = getValue('text', args.nodeData);
312
+ const id: string = args.node.getAttribute('data-id');
313
+ const isId: boolean = isNOU(id) ? false : true;
314
+ const newText: string = isNOU(id) ? text : id;
315
+ const path: string = getPath(args.node, newText, isId);
316
+ this.expandNodeTarget = args.node.getAttribute('data-uid');
317
+ this.parent.expandedId = this.expandNodeTarget;
318
+ this.parent.itemData = this.getTreeData(getValue('id', args.nodeData));
319
+ this.parent.pathId.push(getValue('id', args.nodeData));
320
+ read(this.parent, events.nodeExpand, path);
321
+ }
322
+ }
323
+
324
+ /* istanbul ignore next */
325
+ private onNodeExpanded(args: ReadArgs): void {
326
+ this.addChild(args.files, this.expandNodeTarget, false);
327
+ this.parent.expandedId = null;
328
+ this.isNodeExpandCalled = false;
329
+ }
330
+
331
+ private onNodeClicked(args: NodeClickEventArgs): void {
332
+ this.parent.activeModule = 'navigationpane';
333
+ this.previousSelected = this.treeObj.selectedNodes;
334
+ this.activeNode = args.node;
335
+ if ((args.event.which === 3) && (args.node.getAttribute('data-uid') !== this.treeObj.selectedNodes[0])) {
336
+ this.isRightClick = true;
337
+ this.isNodeClickCalled = true;
338
+ this.treeObj.setProperties({selectedNodes: [args.node.getAttribute('data-uid')]});
339
+ } else if (args.node.getAttribute('data-uid') === this.treeObj.selectedNodes[0] && this.parent.selectedItems.length !== 0) {
340
+ this.parent.setProperties({ selectedItems: [] }, true);
341
+ const layout: string = (this.parent.view === 'LargeIcons') ? 'largeiconsview' : 'detailsview';
342
+ this.parent.notify(events.modelChanged, { module: layout, newProp: { selectedItems: [] } });
343
+ } else if (args.node.getAttribute('data-uid') === this.treeObj.selectedNodes[0] && !this.isNodeClickCalled && !this.isNodeExpandCalled) {
344
+ if (args.event.which === 3)
345
+ {
346
+ this.isRightClick = true;
347
+ }
348
+ this.isSameNodeClicked = true;
349
+ this.isNodeClickCalled = true;
350
+ }
351
+ }
352
+
353
+ /* istanbul ignore next */
354
+ private onNodeEditing(args: NodeEditEventArgs): void {
355
+ if (!isNOU(args.innerHtml)) {
356
+ args.cancel = true;
357
+ }
358
+ }
359
+
360
+ private onPathChanged(args: ReadArgs): void {
361
+ this.parent.isCut = false;
362
+ const currFiles: { [key: string]: Object; }[] = getValue(this.parent.pathId[this.parent.pathId.length - 1], this.parent.feFiles);
363
+ if (this.expandNodeTarget === 'add') {
364
+ const sNode: Element = select('[data-uid="' + this.treeObj.selectedNodes[0] + '"]', this.treeObj.element);
365
+ const ul: Element = (!isNOU(sNode)) ? select('.' + CLS.LIST_PARENT, sNode) : null;
366
+ if (isNOU(ul)) {
367
+ this.addChild(args.files, this.treeObj.selectedNodes[0], true);
368
+ }
369
+ this.expandNodeTarget = '';
370
+ }
371
+ if (isNOU(currFiles)) {
372
+ setValue(this.parent.pathId[this.parent.pathId.length - 1], args.files, this.parent.feFiles);
373
+ }
374
+ if (this.parent.uploadObj.directoryUpload && !(this.parent.hasId)) {
375
+ this.updateTree(args);
376
+ }
377
+ }
378
+
379
+ private updateTree(args: ReadArgs): void {
380
+ if (this.treeObj) {
381
+ const id: string = this.treeObj.selectedNodes[0];
382
+ this.updateTreeNode(args, id);
383
+ }
384
+ }
385
+
386
+ private updateTreeNode(args: ReadArgs, id: string): void {
387
+ const toExpand: boolean = this.treeObj.expandedNodes.indexOf(id) === -1 ? false : true;
388
+ this.removeChildNodes(id);
389
+ this.addChild(args.files, id, !toExpand);
390
+ }
391
+
392
+ private removeChildNodes(id: string): void {
393
+ const sNode: Element = select('[data-uid="' + id + '"]', this.treeObj.element);
394
+ const parent: Element = select('.' + CLS.LIST_PARENT, sNode);
395
+ const childs: Element[] = parent ? Array.prototype.slice.call(parent.children) : null;
396
+ if (childs) { this.treeObj.removeNodes(childs); }
397
+ }
398
+
399
+ private onOpenEnd(args: ReadArgs): void {
400
+ const sleId: string = this.parent.pathId[this.parent.pathId.length - 1];
401
+ this.treeObj.expandAll(this.treeObj.selectedNodes);
402
+ this.treeObj.setProperties({selectedNodes: [sleId]});
403
+ this.expandNodeTarget = 'add';
404
+ this.onPathChanged(args);
405
+ }
406
+
407
+ private onOpenInit(args: NotifyArgs): void {
408
+ if (this.parent.activeModule === 'navigationpane') {
409
+ if (args.target.querySelector('.' + CLS.ICONS)) {
410
+ this.treeObj.expandAll(this.treeObj.selectedNodes);
411
+ }
412
+ }
413
+ }
414
+
415
+ private onInitialEnd(args: ReadArgs): void {
416
+ this.onInit();
417
+ this.addChild(args.files, getValue('_fm_id', args.cwd), false);
418
+ }
419
+
420
+ private onFinalizeEnd(args: ReadArgs): void {
421
+ this.onInit();
422
+ const id: string = getValue('_fm_id', args.cwd);
423
+ this.addChild(args.files, id, false);
424
+ this.treeObj.setProperties({ selectedNodes: [this.parent.pathId[this.parent.pathId.length - 1]]});
425
+ }
426
+
427
+ private onCreateEnd(args: ReadArgs): void {
428
+ this.updateTree(args);
429
+ }
430
+
431
+ private onSelectedData(): void {
432
+ if (this.parent.activeModule === 'navigationpane') {
433
+ this.updateItemData();
434
+ }
435
+ }
436
+
437
+ private onDeleteInit(): void {
438
+ if (this.parent.activeModule === 'navigationpane') {
439
+ this.updateActionData();
440
+ const name: string = getValue('name', this.parent.itemData[0]);
441
+ Delete(this.parent, [name], this.parent.path, 'delete');
442
+ }
443
+ }
444
+
445
+ /* istanbul ignore next */
446
+ private onDeleteEnd(args: ReadArgs): void {
447
+ if (this.parent.activeModule === 'navigationpane') {
448
+ const selectedNode: string = this.treeObj.selectedNodes[0];
449
+ const selcetedEle: Element = select('[data-uid="' + selectedNode + '"]', this.treeObj.element);
450
+ const selectedNodeEle: HTMLElement = closest(selcetedEle, '.' + CLS.LIST_PARENT).parentElement;
451
+ this.treeObj.selectedNodes = [selectedNodeEle.getAttribute('data-uid')];
452
+ this.treeObj.dataBind();
453
+ }
454
+ this.updateTree(args);
455
+ }
456
+
457
+ private onRefreshEnd(args: ReadArgs): void {
458
+ this.updateTree(args);
459
+ }
460
+
461
+ private onRenameInit(): void {
462
+ if (this.parent.activeModule === 'navigationpane') {
463
+ this.updateRenameData();
464
+ }
465
+ }
466
+ /* istanbul ignore next */
467
+ private onRenameEndParent(args: ReadArgs): void {
468
+ const id: string = this.renameParent ? this.renameParent : this.parent.pathId[this.parent.pathId.length - 1];
469
+ this.updateTreeNode(args, id);
470
+ this.parent.expandedId = null;
471
+ if (this.renameParent) {
472
+ this.renameParent = null;
473
+ } else {
474
+ let resultData: Object[] = [];
475
+ if (this.parent.hasId) {
476
+ resultData = new DataManager(this.treeObj.getTreeData()).
477
+ executeLocal(new Query().where('id', 'equal', this.parent.renamedId, false));
478
+ } else {
479
+ const nData: Object[] = new DataManager(this.treeObj.getTreeData()).
480
+ executeLocal(new Query().where(this.treeObj.fields.text, 'equal', this.parent.renameText, false));
481
+ if (nData.length > 0) {
482
+ resultData = new DataManager(nData).
483
+ executeLocal(new Query().where('_fm_pId', 'equal', id, false));
484
+ }
485
+ }
486
+ if (resultData.length > 0) {
487
+ const id: string = this.previousSelected.length > 0 && this.treeObj.getTreeData(this.previousSelected[0]).length !== 0
488
+ ? this.previousSelected[0] : getValue(this.treeObj.fields.id, resultData[0]);
489
+ this.treeObj.selectedNodes = [id];
490
+ this.treeObj.dataBind();
491
+ this.updateItemData();
492
+ }
493
+ }
494
+ }
495
+
496
+ /* istanbul ignore next */
497
+ private onRenameEnd(args: ReadArgs): void {
498
+ if (this.parent.breadcrumbbarModule.searchObj.element.value === '' && !this.parent.isFiltered) {
499
+ this.updateTree(args);
500
+ } else {
501
+ const data: { [key: string]: Object; }[] = this.treeObj.getTreeData();
502
+ let resultData: Object[] = [];
503
+ if (this.parent.hasId) {
504
+ resultData = new DataManager(data).
505
+ executeLocal(new Query().where('id', 'equal', this.parent.renamedId, false));
506
+ } else {
507
+ const nData: Object[] = new DataManager(data).
508
+ executeLocal(new Query().where(this.treeObj.fields.text, 'equal', this.parent.currentItemText, false));
509
+ if (nData.length > 0) {
510
+ resultData = new DataManager(nData).
511
+ executeLocal(new Query().where('filterPath', 'equal', this.parent.filterPath, false));
512
+ }
513
+ }
514
+ if (resultData.length > 0) {
515
+ this.renameParent = getValue(this.treeObj.fields.parentID, resultData[0]);
516
+ this.parent.expandedId = this.renameParent;
517
+ this.parent.itemData = this.getTreeData(this.renameParent);
518
+ read(this.parent, events.renameEndParent, this.parent.filterPath.replace(/\\/g, '/'));
519
+ }
520
+ }
521
+ }
522
+
523
+ private onPropertyChanged(e: NotifyArgs): void {
524
+ if (e.module !== this.getModuleName() && e.module !== 'common') {
525
+ /* istanbul ignore next */
526
+ return;
527
+ }
528
+ for (const prop of Object.keys(e.newProp)) {
529
+ switch (prop) {
530
+ case 'allowDragAndDrop':
531
+ this.addDragDrop();
532
+ break;
533
+ case 'navigationPaneSettings':
534
+ read(this.parent, events.finalizeEnd, this.parent.path);
535
+ if (e.oldProp.navigationPaneSettings.sortOrder !== e.newProp.navigationPaneSettings.sortOrder) {
536
+ this.treeObj.sortOrder = e.newProp.navigationPaneSettings.sortOrder;
537
+ }
538
+ break;
539
+ }
540
+ }
541
+ }
542
+
543
+ /* istanbul ignore next */
544
+ private onDownLoadInit(): void {
545
+ this.doDownload();
546
+ }
547
+
548
+ private onSelectionChanged(e: NotifyArgs): void {
549
+ this.treeObj.setProperties({selectedNodes: [e.selectedNode]});
550
+ }
551
+
552
+ private onClearPathInit(e: NotifyArgs): void {
553
+ this.removeChildNodes(e.selectedNode);
554
+ }
555
+
556
+ private onDragEnd(args: ReadArgs): void {
557
+ if (isFileSystemData(this.parent)) {
558
+ this.moveNames = [];
559
+ const obj: object[] = this.parent.dragData;
560
+ for (let i: number = 0; i < obj.length; i++) {
561
+ if (getValue('isFile', obj[i as number]) === false) {
562
+ this.moveNames.push(getValue('_fm_id', obj[i as number]));
563
+ }
564
+ }
565
+ }
566
+ let moveNames: string[] = [];
567
+ if (this.parent.isPasteError || this.parent.isSearchDrag) {
568
+ moveNames = this.getMoveNames(args.files, this.parent.isSearchDrag, this.parent.dragPath);
569
+ } else {
570
+ moveNames = this.moveNames;
571
+ }
572
+ this.treeObj.removeNodes(moveNames);
573
+ }
574
+ private getMoveNames(files: { [key: string]: Object; }[], flag: boolean, path: string): string[] {
575
+ const moveNames: string[] = [];
576
+ for (let i: number = 0; i < files.length; i++) {
577
+ if (!files[i as number].isFile) {
578
+ if (!this.parent.hasId) {
579
+ let name: string = <string>(files[i as number].previousName);
580
+ if (flag) {
581
+ path = path + files[i as number].previousName;
582
+ const index: number = path.lastIndexOf('/');
583
+ name = path.substring(index + 1);
584
+ path = path.substring(0, index + 1);
585
+ }
586
+ const resultData: Object[] = new DataManager(this.treeObj.getTreeData()).
587
+ executeLocal(new Query().where(this.treeObj.fields.text, 'equal', name, false));
588
+ for (let j: number = 0; j < resultData.length; j++) {
589
+ let fPath: string = getValue('filterPath', resultData[j as number]);
590
+ fPath = fPath.replace(/\\/g, '/');
591
+ if (fPath === path) {
592
+ moveNames.push(getValue(this.treeObj.fields.id, resultData[j as number]));
593
+ break;
594
+ }
595
+ }
596
+ }
597
+ }
598
+ }
599
+ return moveNames;
600
+ }
601
+
602
+ private onCutEnd(args: ReadArgs): void {
603
+ let moveNames: string[] = [];
604
+ if (this.parent.isPasteError || this.parent.isSearchCut) {
605
+ this.moveNames = this.getMoveNames(args.files, this.parent.isSearchCut, this.parent.targetPath);
606
+ } else {
607
+ moveNames = this.moveNames;
608
+ }
609
+ this.treeObj.removeNodes(moveNames);
610
+ }
611
+ /* istanbul ignore next */
612
+ private selectResultNode(resultObj: object): void {
613
+ if (!this.parent.hasId) {
614
+ const path: string = getValue('filterPath', resultObj);
615
+ const itemname: string = getValue('name', resultObj);
616
+ const data: Object[] = new DataManager(this.treeObj.getTreeData()).
617
+ executeLocal(new Query().where(this.treeObj.fields.text, 'equal', itemname, false));
618
+ if (data.length > 0) {
619
+ const resultData: Object[] = new DataManager(data).
620
+ executeLocal(new Query().where('filterPath', 'equal', path, false));
621
+ if (resultData.length > 0) {
622
+ const id: string = getValue(this.treeObj.fields.id, resultData[0]);
623
+ this.treeObj.selectedNodes = [id];
624
+ this.treeObj.dataBind();
625
+ }
626
+ }
627
+ } else {
628
+ const selectedNode: { [key: string]: Object; } =
629
+ this.treeObj.getTreeData().filter((obj: {name: string}) => obj.name === (resultObj as {name: string}).name)[0];
630
+ this.treeObj.selectedNodes = [getValue('_fm_id', selectedNode)];
631
+ this.treeObj.dataBind();
632
+ }
633
+ }
634
+ private onDropPath(args: ReadArgs): void {
635
+ this.onpasteEnd(args);
636
+ this.selectResultNode(this.parent.dropData);
637
+ this.parent.isDropEnd = !this.parent.isPasteError;
638
+ }
639
+
640
+ private onpasteEnd(args: ReadArgs): void {
641
+ let resultData: Object[] = [];
642
+ if (this.parent.hasId) {
643
+ resultData = new DataManager(this.treeObj.getTreeData()).
644
+ executeLocal(new Query().where('id', 'equal', getValue('id', args.cwd), false));
645
+ } else {
646
+ const nData: Object[] = new DataManager(this.treeObj.getTreeData()).
647
+ executeLocal(new Query().where(this.treeObj.fields.text, 'equal', getValue('name', args.cwd), false));
648
+ if (nData.length > 0) {
649
+ resultData = new DataManager(nData).
650
+ executeLocal(new Query().where('filterPath', 'equal', getValue('filterPath', args.cwd), false));
651
+ }
652
+ }
653
+ if (resultData.length > 0) {
654
+ const id: string = getValue(this.treeObj.fields.id, resultData[0]);
655
+ const toExpand: boolean = this.treeObj.expandedNodes.indexOf(id) === -1;
656
+ this.removeChildNodes(id);
657
+ this.addChild(args.files, id, toExpand);
658
+ }
659
+ this.parent.expandedId = null;
660
+ this.onPathChanged(args);
661
+ if (this.parent.isDragDrop) { this.checkDropPath(args); }
662
+ }
663
+ /* istanbul ignore next */
664
+ private checkDropPath(args: ReadArgs): void {
665
+ if (isFileSystemData(this.parent) && (this.parent.path === this.parent.dropPath || this.parent.targetModule === 'navigationpane')) {
666
+ return;
667
+ }
668
+ if ((this.parent.dropPath.indexOf(getDirectoryPath(this.parent, args)) === -1)) {
669
+ this.parent.isDropEnd = false;
670
+ readDropPath(this.parent);
671
+ } else {
672
+ this.parent.isDropEnd = !this.parent.isPasteError;
673
+ }
674
+ }
675
+
676
+ private onpasteInit(): void {
677
+ if (this.parent.activeModule === this.getModuleName()) {
678
+ this.updateItemData();
679
+ }
680
+ this.moveNames = [];
681
+ const obj: object[] = this.parent.isDragDrop ? this.parent.dragData : this.parent.actionRecords;
682
+ for (let i: number = 0; i < obj.length; i++) {
683
+ if (getValue('isFile', obj[i as number]) === false) {
684
+ this.moveNames.push(getValue('_fm_id', obj[i as number]));
685
+ }
686
+ }
687
+ }
688
+ private oncutCopyInit(): void {
689
+ if (this.parent.activeModule === this.getModuleName()) {
690
+ this.parent.activeRecords = this.getTreeData(this.treeObj.selectedNodes[0]);
691
+ this.parent.activeElements = [this.activeNode];
692
+ }
693
+ }
694
+
695
+ private addEventListener(): void {
696
+ this.parent.on(events.modelChanged, this.onPropertyChanged, this);
697
+ this.parent.on(events.downloadInit, this.onDownLoadInit, this);
698
+ this.parent.on(events.initialEnd, this.onInitialEnd, this);
699
+ this.parent.on(events.finalizeEnd, this.onFinalizeEnd, this);
700
+ this.parent.on(events.pathChanged, this.onPathChanged, this);
701
+ this.parent.on(events.pasteEnd, this.onpasteEnd, this);
702
+ this.parent.on(events.cutEnd, this.onCutEnd, this);
703
+ this.parent.on(events.pasteInit, this.onpasteInit, this);
704
+ this.parent.on(events.nodeExpand, this.onNodeExpanded, this);
705
+ this.parent.on(events.createEnd, this.onCreateEnd, this);
706
+ this.parent.on(events.selectedData, this.onSelectedData, this);
707
+ this.parent.on(events.deleteInit, this.onDeleteInit, this);
708
+ this.parent.on(events.deleteEnd, this.onDeleteEnd, this);
709
+ this.parent.on(events.refreshEnd, this.onRefreshEnd, this);
710
+ this.parent.on(events.updateTreeSelection, this.onSelectionChanged, this);
711
+ this.parent.on(events.openInit, this.onOpenInit, this);
712
+ this.parent.on(events.openEnd, this.onOpenEnd, this);
713
+ this.parent.on(events.destroy, this.destroy, this);
714
+ this.parent.on(events.renameInit, this.onRenameInit, this);
715
+ this.parent.on(events.renameEnd, this.onRenameEnd, this);
716
+ this.parent.on(events.renameEndParent, this.onRenameEndParent, this);
717
+ this.parent.on(events.clearPathInit, this.onClearPathInit, this);
718
+ this.parent.on(events.cutCopyInit, this.oncutCopyInit, this);
719
+ this.parent.on(events.dropInit, this.onDropInit, this);
720
+ this.parent.on(events.menuItemData, this.onMenuItemData, this);
721
+ this.parent.on(events.dragEnd, this.onDragEnd, this);
722
+ this.parent.on(events.dragging, this.onDragging, this);
723
+ this.parent.on(events.dropPath, this.onDropPath, this);
724
+ this.parent.on(events.detailsInit, this.onDetailsInit, this);
725
+ this.parent.on(events.pathDrag, this.onPathDrag, this);
726
+ }
727
+
728
+ private removeEventListener(): void {
729
+ this.parent.off(events.initialEnd, this.onInitialEnd);
730
+ this.parent.off(events.downloadInit, this.onDownLoadInit);
731
+ this.parent.off(events.finalizeEnd, this.onFinalizeEnd);
732
+ this.parent.off(events.selectedData, this.onSelectedData);
733
+ this.parent.off(events.modelChanged, this.onPropertyChanged);
734
+ this.parent.off(events.pathChanged, this.onPathChanged);
735
+ this.parent.off(events.pasteEnd, this.onpasteEnd);
736
+ this.parent.off(events.cutEnd, this.onCutEnd);
737
+ this.parent.off(events.pasteInit, this.onpasteInit);
738
+ this.parent.off(events.updateTreeSelection, this.onSelectionChanged);
739
+ this.parent.off(events.nodeExpand, this.onNodeExpanded);
740
+ this.parent.off(events.createEnd, this.onCreateEnd);
741
+ this.parent.off(events.refreshEnd, this.onRefreshEnd);
742
+ this.parent.off(events.openInit, this.onOpenInit);
743
+ this.parent.off(events.openEnd, this.onOpenEnd);
744
+ this.parent.off(events.destroy, this.destroy);
745
+ this.parent.off(events.renameInit, this.onRenameInit);
746
+ this.parent.off(events.renameEnd, this.onRenameEnd);
747
+ this.parent.off(events.renameEndParent, this.onRenameEndParent);
748
+ this.parent.off(events.clearPathInit, this.onClearPathInit);
749
+ this.parent.off(events.deleteInit, this.onDeleteInit);
750
+ this.parent.off(events.deleteEnd, this.onDeleteEnd);
751
+ this.parent.off(events.cutCopyInit, this.oncutCopyInit);
752
+ this.parent.off(events.dropInit, this.onDropInit);
753
+ this.parent.off(events.dragEnd, this.onDragEnd);
754
+ this.parent.off(events.dragging, this.onDragging);
755
+ this.parent.off(events.dropPath, this.onDropPath);
756
+ this.parent.off(events.detailsInit, this.onDetailsInit);
757
+ this.parent.off(events.menuItemData, this.onMenuItemData);
758
+ this.parent.off(events.pathDrag, this.onPathDrag);
759
+ }
760
+
761
+ /* istanbul ignore next */
762
+ private onDetailsInit(): void {
763
+ if (this.parent.activeModule === this.getModuleName()) {
764
+ const dataobj: Object[] = this.getTreeData(this.treeObj.selectedNodes[0]);
765
+ this.parent.itemData = dataobj;
766
+ }
767
+ }
768
+
769
+ private onMenuItemData(args: { [key: string]: Object; }): void {
770
+ if (this.parent.activeModule === this.getModuleName()) {
771
+ const liEle: Element = closest(<Element>args.target, 'li');
772
+ this.parent.itemData = this.getTreeData(liEle.getAttribute('data-uid'));
773
+ }
774
+ }
775
+
776
+ /* istanbul ignore next */
777
+ private onDragging(args: DragEventArgs): void {
778
+ const ele: Element = closest(args.target, 'li');
779
+ if (ele.classList.contains('e-node-collapsed')) {
780
+ this.isDrag = true;
781
+ const level: number = parseInt(ele.getAttribute('aria-level'), 10);
782
+ this.treeObj.expandAll([ele.getAttribute('data-uid')], level + 1);
783
+ this.isDrag = false;
784
+ }
785
+ }
786
+
787
+ private onDropInit(args: DragEventArgs): void {
788
+ if (this.parent.targetModule === this.getModuleName()) {
789
+ const dropLi: Element = closest(args.target, 'li');
790
+ this.parent.dropData = this.getTreeData(dropLi)[0];
791
+ this.parent.dropPath = this.getDropPath(dropLi, getValue('name', this.parent.dropData));
792
+ }
793
+ }
794
+
795
+ /**
796
+ * For internal use only - Get the module name.
797
+ *
798
+ * @returns {string} - returns the module name.
799
+ * @private
800
+ */
801
+ private getModuleName(): string {
802
+ return 'navigationpane';
803
+ }
804
+
805
+ public destroy(): void {
806
+ if (this.parent.isDestroyed) { return; }
807
+ this.removeEventListener();
808
+ if (this.treeObj) {
809
+ this.unWireEvents();
810
+ this.treeObj.destroy();
811
+ }
812
+ }
813
+ private wireEvents(): void {
814
+ this.keyboardModule = new KeyboardEvents(
815
+ this.treeObj.element,
816
+ {
817
+ keyAction: this.keyDown.bind(this),
818
+ keyConfigs: this.keyConfigs,
819
+ eventName: 'keydown'
820
+ }
821
+ );
822
+ }
823
+
824
+ private unWireEvents(): void {
825
+ this.keyboardModule.destroy();
826
+ }
827
+
828
+ /* istanbul ignore next */
829
+ private keyDown(e: KeyboardEventArgs): void {
830
+ const action: string = e.action;
831
+ switch (action) {
832
+ case 'altEnter':
833
+ this.parent.notify(events.detailsInit, {});
834
+ GetDetails(this.parent, [], this.parent.path, 'details');
835
+ break;
836
+ case 'esc':
837
+ removeActive(this.parent);
838
+ break;
839
+ case 'del':
840
+ if (this.parent.pathId[0] !== this.activeNode.getAttribute('data-uid')) {
841
+ this.updateItemData();
842
+ if (!hasEditAccess(this.parent.itemData[0])) {
843
+ createDeniedDialog(this.parent, this.parent.itemData[0], events.permissionEdit);
844
+ } else {
845
+ this.removeNodes = [];
846
+ createDialog(this.parent, 'Delete');
847
+ }
848
+ }
849
+ break;
850
+ case 'ctrlC':
851
+ copyFiles(this.parent);
852
+ break;
853
+ case 'ctrlV':
854
+ this.parent.folderPath = '';
855
+ pasteHandler(this.parent);
856
+ break;
857
+ case 'ctrlX':
858
+ cutFiles(this.parent);
859
+ break;
860
+ case 'shiftF10':
861
+ this.updateItemData();
862
+ if (!hasDownloadAccess(this.parent.itemData[0])) {
863
+ createDeniedDialog(this.parent, this.parent.itemData[0], events.permissionDownload);
864
+ return;
865
+ }
866
+ if (this.parent.selectedItems.length !== 0) {
867
+ this.doDownload();
868
+ }
869
+ break;
870
+ case 'f2':
871
+ if (this.parent.selectedItems.length === 0) {
872
+ const data: Object = this.getTreeData(this.treeObj.selectedNodes[0])[0];
873
+ if (!hasEditAccess(data)) {
874
+ createDeniedDialog(this.parent, data, events.permissionEdit);
875
+ } else {
876
+ this.updateRenameData();
877
+ createDialog(this.parent, 'Rename');
878
+ }
879
+ }
880
+ break;
881
+ }
882
+ }
883
+
884
+ private getTreeData(args: string | Element): object[] {
885
+ const data: object[] = this.treeObj.getTreeData(args);
886
+ for (let i: number = 0; i < data.length; i++) {
887
+ if (isNOU(getValue('hasChild', data[i as number]))) { setValue('hasChild', false, data[i as number]); }
888
+ }
889
+ return data;
890
+ }
891
+
892
+ private updateRenameData(): void {
893
+ this.updateItemData();
894
+ this.parent.currentItemText = getValue('name', this.parent.itemData[0]);
895
+ }
896
+
897
+ private updateItemData(): void {
898
+ const data: Object = this.getTreeData(this.treeObj.selectedNodes[0])[0];
899
+ this.parent.itemData = [data];
900
+ this.parent.isFile = false;
901
+ }
902
+
903
+ private updateActionData(): void {
904
+ this.updateItemData();
905
+ const node: HTMLLIElement = select('[data-uid="' + this.parent.pathId[this.parent.pathId.length - 1] + '"]', this.treeObj.element);
906
+ updatePath(node, this.parent.itemData[0], this.parent);
907
+ const newPath: string = getParentPath(this.parent.path);
908
+ this.parent.setProperties({ path: newPath }, true);
909
+ this.parent.pathId.pop();
910
+ this.parent.pathNames.pop();
911
+ }
912
+ /* istanbul ignore next */
913
+ private doDownload(): void {
914
+ const newPath: string = getParentPath(this.parent.path);
915
+ const itemId: string = this.treeObj.selectedNodes[0];
916
+ const name: string = (itemId === this.parent.pathId[0]) ? '' : getValue('name', this.parent.itemData[0]);
917
+ Download(this.parent, newPath, [name]);
918
+ }
919
+ }