@syncfusion/ej2-filemanager 20.1.52-10460 → 20.1.52-10461

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