@syncfusion/ej2-filemanager 30.2.4 → 31.1.17

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