@syncfusion/ej2-filemanager 25.2.3 → 26.1.35

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 (104) hide show
  1. package/.eslintrc.json +3 -2
  2. package/dist/ej2-filemanager.min.js +2 -2
  3. package/dist/ej2-filemanager.umd.min.js +2 -2
  4. package/dist/ej2-filemanager.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-filemanager.es2015.js +931 -464
  6. package/dist/es6/ej2-filemanager.es2015.js.map +1 -1
  7. package/dist/es6/ej2-filemanager.es5.js +975 -517
  8. package/dist/es6/ej2-filemanager.es5.js.map +1 -1
  9. package/dist/global/ej2-filemanager.min.js +2 -2
  10. package/dist/global/ej2-filemanager.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/package.json +16 -16
  13. package/src/file-manager/actions/breadcrumb-bar.js +0 -4
  14. package/src/file-manager/actions/toolbar.js +1 -13
  15. package/src/file-manager/actions/virtualization.d.ts +28 -8
  16. package/src/file-manager/actions/virtualization.js +36 -12
  17. package/src/file-manager/base/file-manager-model.d.ts +107 -36
  18. package/src/file-manager/base/file-manager.d.ts +100 -25
  19. package/src/file-manager/base/file-manager.js +46 -20
  20. package/src/file-manager/base/interface.d.ts +224 -2
  21. package/src/file-manager/base/interface.js +0 -1
  22. package/src/file-manager/common/operations.d.ts +7 -0
  23. package/src/file-manager/common/operations.js +596 -94
  24. package/src/file-manager/common/utility.d.ts +22 -0
  25. package/src/file-manager/common/utility.js +117 -65
  26. package/src/file-manager/layout/details-view.d.ts +1 -1
  27. package/src/file-manager/layout/details-view.js +23 -68
  28. package/src/file-manager/layout/large-icons-view.js +24 -46
  29. package/src/file-manager/layout/navigation-pane.js +18 -41
  30. package/src/file-manager/models/column-model.d.ts +1 -3
  31. package/src/file-manager/models/default-locale.js +0 -1
  32. package/src/file-manager/models/details-view-settings.js +2 -1
  33. package/src/file-manager/pop-up/context-menu.js +26 -27
  34. package/src/file-manager/pop-up/dialog.d.ts +1 -2
  35. package/src/file-manager/pop-up/dialog.js +12 -35
  36. package/styles/bootstrap-dark.css +116 -105
  37. package/styles/bootstrap-dark.scss +16 -1
  38. package/styles/bootstrap.css +117 -106
  39. package/styles/bootstrap.scss +16 -1
  40. package/styles/bootstrap4.css +116 -105
  41. package/styles/bootstrap4.scss +16 -1
  42. package/styles/bootstrap5-dark.css +98 -98
  43. package/styles/bootstrap5-dark.scss +16 -1
  44. package/styles/bootstrap5.css +98 -98
  45. package/styles/bootstrap5.scss +16 -1
  46. package/styles/fabric-dark.css +116 -105
  47. package/styles/fabric-dark.scss +16 -1
  48. package/styles/fabric.css +116 -105
  49. package/styles/fabric.scss +16 -1
  50. package/styles/file-manager/_bds-definition.scss +1 -1
  51. package/styles/file-manager/_bootstrap5-definition.scss +2 -1
  52. package/styles/file-manager/_bootstrap5.3-definition.scss +240 -0
  53. package/styles/file-manager/_fluent-definition.scss +1 -1
  54. package/styles/file-manager/_fluent2-definition.scss +249 -0
  55. package/styles/file-manager/_layout.scss +255 -396
  56. package/styles/file-manager/_material-dark-definition.scss +1 -0
  57. package/styles/file-manager/_material-definition.scss +1 -0
  58. package/styles/file-manager/_material3-definition.scss +1 -27
  59. package/styles/file-manager/_tailwind-definition.scss +1 -1
  60. package/styles/file-manager/_theme.scss +37 -85
  61. package/styles/file-manager/bootstrap-dark.css +116 -105
  62. package/styles/file-manager/bootstrap.css +117 -106
  63. package/styles/file-manager/bootstrap4.css +116 -105
  64. package/styles/file-manager/bootstrap5-dark.css +98 -98
  65. package/styles/file-manager/bootstrap5.css +98 -98
  66. package/styles/file-manager/fabric-dark.css +116 -105
  67. package/styles/file-manager/fabric.css +116 -105
  68. package/styles/file-manager/fluent-dark.css +107 -102
  69. package/styles/file-manager/fluent.css +107 -102
  70. package/styles/file-manager/fluent2.css +2872 -0
  71. package/styles/file-manager/fluent2.scss +16 -0
  72. package/styles/file-manager/highcontrast-light.css +116 -105
  73. package/styles/file-manager/highcontrast.css +116 -105
  74. package/styles/file-manager/icons/_bootstrap5.3.scss +235 -0
  75. package/styles/file-manager/icons/_fluent2.scss +235 -0
  76. package/styles/file-manager/material-dark.css +140 -108
  77. package/styles/file-manager/material.css +156 -112
  78. package/styles/file-manager/material3-dark.css +134 -109
  79. package/styles/file-manager/material3.css +134 -109
  80. package/styles/file-manager/tailwind-dark.css +93 -95
  81. package/styles/file-manager/tailwind.css +93 -95
  82. package/styles/fluent-dark.css +107 -102
  83. package/styles/fluent-dark.scss +16 -1
  84. package/styles/fluent.css +107 -102
  85. package/styles/fluent.scss +16 -1
  86. package/styles/fluent2.css +2872 -0
  87. package/styles/fluent2.scss +16 -0
  88. package/styles/highcontrast-light.css +116 -105
  89. package/styles/highcontrast-light.scss +16 -1
  90. package/styles/highcontrast.css +116 -105
  91. package/styles/highcontrast.scss +16 -1
  92. package/styles/material-dark.css +140 -108
  93. package/styles/material-dark.scss +16 -1
  94. package/styles/material.css +156 -112
  95. package/styles/material.scss +16 -1
  96. package/styles/material3-dark.css +134 -109
  97. package/styles/material3-dark.scss +16 -1
  98. package/styles/material3.css +134 -109
  99. package/styles/material3.scss +16 -1
  100. package/styles/tailwind-dark.css +93 -95
  101. package/styles/tailwind-dark.scss +16 -1
  102. package/styles/tailwind.css +93 -95
  103. package/styles/tailwind.scss +16 -1
  104. package/CHANGELOG.md +0 -467
@@ -3,7 +3,9 @@ import { isNullOrUndefined as isNOU, setValue, getValue } from '@syncfusion/ej2-
3
3
  import * as events from '../base/constant';
4
4
  import { createDialog, createExtDialog } from '../pop-up/dialog';
5
5
  import { fileType, setNodeId, getLocaleText, setDateObject, doPasteUpdate, getPathObject } from '../common/utility';
6
- import { generatePath } from '../common/utility';
6
+ import { generatePath, getAccessDetails } from '../common/utility';
7
+ import { getUid } from '@syncfusion/ej2-grids';
8
+ /* eslint-disable @typescript-eslint/no-explicit-any */
7
9
  /**
8
10
  * Function to read the content from given path in File Manager.
9
11
  *
@@ -14,14 +16,12 @@ import { generatePath } from '../common/utility';
14
16
  * @private
15
17
  */
16
18
  export function read(parent, event, path) {
17
- // eslint-disable-next-line
18
19
  var itemData = parent.itemData;
19
20
  for (var i = 0; i < itemData.length; i++) {
20
21
  if (isNOU(getValue('hasChild', itemData[i]))) {
21
22
  setValue('hasChild', false, itemData[i]);
22
23
  }
23
24
  }
24
- // eslint-disable-next-line
25
25
  var data = { action: 'read', path: path, showHiddenItems: parent.showHiddenItems, data: itemData };
26
26
  createAjax(parent, data, readSuccess, event);
27
27
  }
@@ -34,7 +34,6 @@ export function read(parent, event, path) {
34
34
  * @private
35
35
  */
36
36
  export function createFolder(parent, itemName) {
37
- // eslint-disable-next-line
38
37
  var data = { action: 'create', path: parent.path, name: itemName, data: parent.itemData };
39
38
  createAjax(parent, data, createSuccess, itemName);
40
39
  }
@@ -47,11 +46,8 @@ export function createFolder(parent, itemName) {
47
46
  * @private
48
47
  */
49
48
  export function filter(parent, event) {
50
- // eslint-disable-next-line
51
49
  var data = { action: 'filter', path: parent.path, showHiddenItems: parent.showHiddenItems, data: [getPathObject(parent)] };
52
- // eslint-disable-next-line
53
50
  var filterData;
54
- // eslint-disable-next-line
55
51
  var filterDataVal = parent.filterData ? extend(filterData, data, parent.filterData) : data;
56
52
  createAjax(parent, filterDataVal, filterSuccess, event, getValue('action', filterDataVal));
57
53
  }
@@ -83,7 +79,6 @@ export function rename(parent, path, itemNewName) {
83
79
  newName = fPath.replace(path, '') + itemNewName;
84
80
  }
85
81
  }
86
- // eslint-disable-next-line
87
82
  var data = {
88
83
  action: 'rename', path: path, name: name, newName: newName, data: parent.itemData, showFileExtension: parent.showFileExtension
89
84
  };
@@ -102,10 +97,7 @@ export function rename(parent, path, itemNewName) {
102
97
  * @returns {void}
103
98
  * @private
104
99
  */
105
- export function paste(parent, path, names, targetPath, pasteOperation,
106
- // eslint-disable-next-line
107
- renameItems, actionRecords) {
108
- // eslint-disable-next-line
100
+ export function paste(parent, path, names, targetPath, pasteOperation, renameItems, actionRecords) {
109
101
  var data = {
110
102
  action: pasteOperation, path: path, targetData: parent.itemData[0],
111
103
  targetPath: targetPath, names: names, renameFiles: renameItems, data: actionRecords
@@ -124,7 +116,6 @@ renameItems, actionRecords) {
124
116
  * @private
125
117
  */
126
118
  export function Delete(parent, items, path, operation) {
127
- // eslint-disable-next-line
128
119
  var data = { action: operation, path: path, names: items, data: parent.itemData };
129
120
  createAjax(parent, data, deleteSuccess, path);
130
121
  }
@@ -140,25 +131,22 @@ export function Delete(parent, items, path, operation) {
140
131
  * @private
141
132
  */
142
133
  export function GetDetails(parent, names, path, operation) {
143
- // eslint-disable-next-line
144
134
  var data = { action: operation, path: path, names: names, data: parent.itemData };
145
135
  createAjax(parent, data, detailsSuccess, path, operation);
146
136
  }
147
137
  /**
148
- * Function for createAjax in File Manager.
138
+ * Function for getDateFormat in File Manager.
149
139
  *
150
140
  * @param {IFileManager} parent - specifies the parent element.
151
- * @param {Object} data - specifies the data.
152
- * @param {Function} fn - specifies the fn.
153
- * @param {string} event - specifies the event.
154
- * @param {string} operation - specifies the operation.
155
- * @param {string} targetPath - specifies the target path.
156
141
  * @returns {void}
157
142
  * @private
158
143
  */
159
144
  function getDateFormat(parent) {
160
145
  var columns = parent.detailsViewSettings.columns;
161
146
  var dateFormat;
147
+ if (!columns) {
148
+ return null;
149
+ }
162
150
  for (var i = 0; i < columns.length; i++) {
163
151
  if (columns[i].field === '_fm_modified') {
164
152
  if (!isNOU(columns[i].format)) {
@@ -169,10 +157,393 @@ function getDateFormat(parent) {
169
157
  }
170
158
  return dateFormat;
171
159
  }
172
- function createAjax(
173
- // eslint-disable-next-line
174
- parent, data, fn, event, operation, targetPath) {
175
- // eslint-disable-next-line
160
+ /**
161
+ * Checks whether fileSystemData is enabled.
162
+ *
163
+ * @param {IFileManager} parent - specifies the parent element.
164
+ * @returns {boolean} - returns the boolean value.
165
+ */
166
+ export function isFileSystemData(parent) {
167
+ var isFileSystemData = parent.fileSystemData.length >= 0 && isNOU(parent.ajaxSettings.url);
168
+ return isFileSystemData;
169
+ }
170
+ /**
171
+ * Function to check whether file already exist or not.
172
+ *
173
+ * @param {Record<string, any>} fileSystemData - specifies the file data.
174
+ * @param {string} name - specifies the name.
175
+ * @returns {boolean} - returns the boolean value.
176
+ * @private
177
+ */
178
+ function isFileExists(fileSystemData, name) {
179
+ var isExists = fileSystemData.some(function (item) { return item.name === name; });
180
+ return isExists;
181
+ }
182
+ /**
183
+ * Function to find the index value of a file or folder.
184
+ *
185
+ * @param {IFileManager} parent - specifies the parent element.
186
+ * @param {number} id - specifies the id.
187
+ * @returns {number} - returns the index value.
188
+ * @private
189
+ */
190
+ function findIndexById(parent, id) {
191
+ var index = parent.fileSystemData.findIndex(function (item) { return String(item.id) === String(id); });
192
+ return index;
193
+ }
194
+ /**
195
+ * Function to get the entire data of a file or folder using id value.
196
+ *
197
+ * @param {IFileManager} parent - specifies the parent element.
198
+ * @param {number | string} id - specifies the id.
199
+ * @returns {Object} - returns the data.
200
+ * @private
201
+ */
202
+ function filterById(parent, id) {
203
+ var data = parent.fileSystemData.filter(function (item) { return String(item.id) === String(id); })[0];
204
+ return data;
205
+ }
206
+ /**
207
+ * Function to get the entire data of a file or folder for a parent.
208
+ *
209
+ * @param {IFileManager} parent - specifies the parent element.
210
+ * @param {number | string} parentId - specifies the parent id.
211
+ * @returns {Object[]} - returns the data.
212
+ * @private
213
+ */
214
+ function filterByParent(parent, parentId) {
215
+ var data = parent.fileSystemData.filter(function (item) { return String(item.parentId) === String(parentId); });
216
+ return data;
217
+ }
218
+ /**
219
+ * Function to create a new copied file or folder.
220
+ *
221
+ * @param {Record<string, any>} data - specifies the file or folder data.
222
+ * @param {Record<string, any>} target - specifies the target data.
223
+ * @param {string} itemName - specifies the item name.
224
+ * @param {boolean} isCopy - specifies the copy operation.
225
+ * @returns {Record<string, Object>} - returns the data.
226
+ * @private
227
+ */
228
+ function createNewItem(data, target, itemName, isCopy) {
229
+ var newItem = {};
230
+ //Construct the new folder details.
231
+ for (var key in data) {
232
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
233
+ newItem[key] = null;
234
+ }
235
+ }
236
+ var currentDate = new Date();
237
+ var folderPath = target.id !== 0 ? target.filterPath + target.name : '\\';
238
+ Object.assign(newItem, {
239
+ dateCreated: currentDate,
240
+ dateModified: currentDate,
241
+ filterPath: folderPath,
242
+ hasChild: isCopy ? data.hasChild : false,
243
+ id: getUid(itemName === null ? data.name : itemName),
244
+ isFile: isCopy ? data.isFile : false,
245
+ name: itemName === null ? data.name : itemName,
246
+ parentId: target.id,
247
+ size: isCopy ? data.size : 0,
248
+ type: isCopy ? data.type : ''
249
+ });
250
+ return newItem;
251
+ }
252
+ /**
253
+ * Function to create an error response.
254
+ *
255
+ * @param {IFileManager} parent - specifies the parent element.
256
+ * @param {string} message - specifies the error message.
257
+ * @param {string} code - specifies the error code.
258
+ * @param {Object[]} fileName - specifies the file name.
259
+ * @returns {void}
260
+ * @private
261
+ */
262
+ function createErrorObject(parent, message, code, fileName) {
263
+ parent.responseData = {
264
+ cwd: null,
265
+ details: null,
266
+ error: {
267
+ code: code,
268
+ message: message,
269
+ fileExists: fileName != null ? fileName : null
270
+ },
271
+ files: null
272
+ };
273
+ }
274
+ /**
275
+ * Function to trigger folder creation.
276
+ *
277
+ * @param {IFileManager} parent - specifies the parent element.
278
+ * @param {Object} data - specifies the data.
279
+ * @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
280
+ * @returns {void}
281
+ * @private
282
+ */
283
+ function triggerFolderCreation(parent, data, eventArgs) {
284
+ var createEventArgs = {
285
+ folderName: getValue('name', data),
286
+ cancel: false,
287
+ path: getValue('path', data),
288
+ parentFolder: getValue('data', data)
289
+ };
290
+ parent.trigger('beforeFolderCreate', createEventArgs, function (args) {
291
+ if (args.cancel) {
292
+ eventArgs.cancel = true;
293
+ return;
294
+ }
295
+ if (isFileSystemData(parent)) {
296
+ if (!isFileExists(parent.fileSystemData, args.folderName)) {
297
+ var data_1 = args.parentFolder[0];
298
+ var newObject = createNewItem(data_1, data_1, args.folderName, false);
299
+ parent.fileSystemData.push(newObject);
300
+ }
301
+ else {
302
+ var message = 'A file or folder with the name ' + args.folderName + ' already exists.';
303
+ createErrorObject(parent, message, '400', null);
304
+ }
305
+ }
306
+ });
307
+ }
308
+ /**
309
+ * Function to trigger delete operation.
310
+ *
311
+ * @param {IFileManager} parent - specifies the parent element.
312
+ * @param {Object} data - specifies the data.
313
+ * @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
314
+ * @returns {void}
315
+ * @private
316
+ */
317
+ function triggerDeleteOperation(parent, data, eventArgs) {
318
+ var deleteEventArgs = {
319
+ cancel: false,
320
+ itemData: getValue('data', data),
321
+ path: getValue('path', data)
322
+ };
323
+ parent.trigger('beforeDelete', deleteEventArgs, function (args) {
324
+ if (args.cancel) {
325
+ eventArgs.cancel = true;
326
+ return;
327
+ }
328
+ if (isFileSystemData(parent)) {
329
+ args.itemData.forEach(function (itemData) {
330
+ var index = findIndexById(parent, itemData.id);
331
+ if (index !== -1) {
332
+ parent.fileSystemData.splice(index, 1);
333
+ }
334
+ if (!itemData.isFile) {
335
+ var subItems = parent.fileSystemData.filter(function (obj) { return obj.filterPath.includes(itemData.name); });
336
+ subItems.forEach(function (subItem) {
337
+ var index = findIndexById(parent, subItem.id);
338
+ if (index !== -1) {
339
+ parent.fileSystemData.splice(index, 1);
340
+ }
341
+ });
342
+ }
343
+ });
344
+ }
345
+ });
346
+ }
347
+ /**
348
+ * Function to trigger rename operation.
349
+ *
350
+ * @param {IFileManager} parent - specifies the parent element.
351
+ * @param {Object} data - specifies the data.
352
+ * @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
353
+ * @returns {void}
354
+ * @private
355
+ */
356
+ function triggerRenameOperation(parent, data, eventArgs) {
357
+ var renameEventArgs = {
358
+ cancel: false,
359
+ newName: getValue('newName', data),
360
+ itemData: getValue('data', data),
361
+ path: getValue('path', data)
362
+ };
363
+ parent.trigger('beforeRename', renameEventArgs, function (args) {
364
+ if (args.cancel) {
365
+ eventArgs.cancel = true;
366
+ return;
367
+ }
368
+ if (isFileSystemData(parent)) {
369
+ if (!isFileExists(parent.fileSystemData, args.newName)) {
370
+ var fileData = filterById(parent, args.itemData[0].id);
371
+ fileData.name = args.newName;
372
+ }
373
+ else {
374
+ var message = 'Cannot rename' + args.itemData[0].name + 'to' + args.newName + ': destination already exists.';
375
+ createErrorObject(parent, message, '400', null);
376
+ }
377
+ }
378
+ });
379
+ }
380
+ /**
381
+ * Function to trigger move or copy operation.
382
+ *
383
+ * @param {IFileManager} parent - specifies the parent element.
384
+ * @param {Object} data - specifies the data.
385
+ * @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
386
+ * @returns {void}
387
+ * @private
388
+ */
389
+ function triggerMoveOrCopyOperation(parent, data, eventArgs) {
390
+ var moveEventArgs = {
391
+ cancel: false,
392
+ itemData: getValue('data', data),
393
+ isCopy: getValue('action', data) === 'copy' ? true : false,
394
+ path: getValue('path', data),
395
+ targetData: getValue('targetData', data),
396
+ targetPath: getValue('targetPath', data)
397
+ };
398
+ parent.trigger('beforeMove', moveEventArgs, function (args) {
399
+ if (args.cancel) {
400
+ eventArgs.cancel = true;
401
+ return;
402
+ }
403
+ if (isFileSystemData(parent)) {
404
+ var message = 'File Already Exists';
405
+ var action = getValue('action', data);
406
+ var itemPermission = getAccessDetails(parent, args.itemData, action, false);
407
+ var pathPermission = getAccessDetails(parent, [args.targetData], action, true);
408
+ var file_1 = [];
409
+ parent.pasteNodes = [];
410
+ if (itemPermission === '' && pathPermission === '') {
411
+ if (args.isCopy) {
412
+ var folderSubItems_1 = filterByParent(parent, args.targetData.id);
413
+ var copiedFolders = args.itemData;
414
+ copiedFolders.forEach(function (itemData) {
415
+ if (!isFileExists(folderSubItems_1, itemData.name) || getValue('renameFiles', data).length > 0) {
416
+ if (getValue('renameFiles', data).length > 0) {
417
+ var names = itemData.name.split('.');
418
+ var name_1 = itemData.name.includes('.') ? names[0] + '(' + parent.existingFileCount + ').' + names[1] : names[0] + '(' + parent.existingFileCount + ')';
419
+ copyFolderItems(parent, itemData, args.targetData, name_1);
420
+ parent.responseData.error = null;
421
+ parent.existingFileCount++;
422
+ return;
423
+ }
424
+ copyFolderItems(parent, itemData, args.targetData, null);
425
+ }
426
+ else {
427
+ file_1.push(itemData.name);
428
+ }
429
+ });
430
+ if (file_1.length > 0) {
431
+ createErrorObject(parent, message, '400', file_1);
432
+ }
433
+ return;
434
+ }
435
+ var target = args.targetData;
436
+ var getTargetFiles = filterByParent(parent, target.id);
437
+ for (var i = 0; i < args.itemData.length; i++) {
438
+ var currItem = args.itemData[i];
439
+ if (!isFileExists(getTargetFiles, currItem.name) || getValue('renameFiles', data).length > 0) {
440
+ if (!target.hasChild) {
441
+ target.hasChild = !currItem.isFile;
442
+ }
443
+ if (!currItem.isFile) {
444
+ //Check whether the source folder include other sub folders or not.
445
+ var subItems = currItem.parentId !== 0
446
+ ? filterByParent(parent, currItem.parentID) : [];
447
+ var itemData = filterById(parent, currItem.parentId);
448
+ itemData.hasChild = subItems.length > 1 ? true : false;
449
+ }
450
+ var fileData = filterById(parent, currItem.id);
451
+ if (getValue('renameFiles', data).length > 0) {
452
+ var names = currItem.name.split('.');
453
+ currItem.name = currItem.name.includes('.') ? names[0] + '(' + parent.existingFileCount + ').' + names[1] : names[0] + '(' + parent.existingFileCount + ')';
454
+ fileData.name = currItem.name;
455
+ parent.responseData.error = null;
456
+ parent.existingFileCount++;
457
+ parent.dropData = target;
458
+ parent.dropPath = args.path;
459
+ var pathArray = args.targetPath.replace(/^\/|\/$/g, '').split('/');
460
+ target = filterById(parent, pathArray[pathArray.length - 1]);
461
+ }
462
+ fileData.parentId = target.id;
463
+ fileData.filterPath = target.id === 0 ? '\\' : target.filterPath + target.name + '\\';
464
+ }
465
+ else {
466
+ file_1.push(currItem.name);
467
+ }
468
+ }
469
+ if (file_1.length > 0) {
470
+ createErrorObject(parent, message, '400', file_1);
471
+ }
472
+ }
473
+ }
474
+ });
475
+ }
476
+ /**
477
+ * Function to trigger search operation.
478
+ *
479
+ * @param {IFileManager} parent - specifies the parent element.
480
+ * @param {Object} data - specifies the data.
481
+ * @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
482
+ * @returns {void}
483
+ * @private
484
+ */
485
+ function triggerSearchOperation(parent, data, eventArgs) {
486
+ var searchEventArgs = {
487
+ searchResults: getValue('data', data),
488
+ cancel: false,
489
+ path: getValue('path', data),
490
+ searchText: getValue('searchString', data),
491
+ caseSensitive: getValue('caseSensitive', data),
492
+ showHiddenItems: getValue('showHiddenItems', data)
493
+ };
494
+ parent.trigger('search', searchEventArgs, function (args) {
495
+ if (args.cancel) {
496
+ eventArgs.cancel = true;
497
+ }
498
+ });
499
+ }
500
+ /**
501
+ * Function to trigger client side events.
502
+ *
503
+ * @param {IFileManager} parent - specifies the parent element.
504
+ * @param {Object} data - specifies the data.
505
+ * @param {BeforeSendEventArgs} eventArgs - specifies the eventArgs.
506
+ * @returns {void}
507
+ * @private
508
+ */
509
+ function triggerClientEvents(parent, data, eventArgs) {
510
+ switch (getValue('action', data)) {
511
+ case 'create': {
512
+ triggerFolderCreation(parent, data, eventArgs);
513
+ break;
514
+ }
515
+ case 'delete': {
516
+ triggerDeleteOperation(parent, data, eventArgs);
517
+ break;
518
+ }
519
+ case 'rename': {
520
+ triggerRenameOperation(parent, data, eventArgs);
521
+ break;
522
+ }
523
+ case 'move':
524
+ case 'copy': {
525
+ triggerMoveOrCopyOperation(parent, data, eventArgs);
526
+ break;
527
+ }
528
+ case 'search': {
529
+ triggerSearchOperation(parent, data, eventArgs);
530
+ break;
531
+ }
532
+ }
533
+ }
534
+ /**
535
+ * Creates an AJAX request for the file manager.
536
+ *
537
+ * @param {IFileManager} parent - The parent file manager instance.
538
+ * @param {Object} data - The data object for the AJAX request.
539
+ * @param {Function} fn - The callback function to be executed after the AJAX request.
540
+ * @param {string} [event] - The event type for the AJAX request.
541
+ * @param {string} [operation] - The operation type for the AJAX request.
542
+ * @param {string} [targetPath] - The target path for the AJAX request.
543
+ * @returns {void}
544
+ * @private
545
+ */
546
+ function createAjax(parent, data, fn, event, operation, targetPath) {
176
547
  var ajaxSettings = {
177
548
  url: parent.ajaxSettings.url,
178
549
  type: 'POST',
@@ -185,9 +556,64 @@ parent, data, fn, event, operation, targetPath) {
185
556
  beforeSend: null
186
557
  };
187
558
  var eventArgs = { action: getValue('action', data), ajaxSettings: ajaxSettings, cancel: false };
559
+ triggerClientEvents(parent, data, eventArgs);
188
560
  parent.trigger('beforeSend', eventArgs, function (beforeSendArgs) {
189
561
  if (!beforeSendArgs.cancel) {
190
562
  parent.notify(events.beforeRequest, {});
563
+ if (isFileSystemData(parent)) {
564
+ var filePath = event === 'node-expand' || event === 'finalize-end' ? getValue('path', data) : parent.path;
565
+ var pathArray = filePath.replace(/^\/|\/$/g, '').split('/');
566
+ var idValue = event === 'rename-end-parent' || (event === 'path-changed' && getValue('data', data).length != 0)
567
+ || (event === 'paste-end' && (parent.targetModule === 'largeiconsview' || parent.targetModule === 'detailsview'))
568
+ ? getValue('data', data)[0].id : pathArray[pathArray.length - 1];
569
+ var action = getValue('action', data);
570
+ var isFileOperation = (action === 'move' || action === 'rename' || action === 'copy' || action === 'delete' || action === 'search') && event !== 'rename-end';
571
+ if (action === 'read' || action === 'create' || event === 'rename-end') {
572
+ parent.responseData = {
573
+ cwd: filterById(parent, parent.path === '/' && event !== 'node-expand' && event != 'rename-end-parent' ? 0 : idValue),
574
+ details: null,
575
+ error: null,
576
+ files: filterByParent(parent, parent.path === '/' && event !== 'node-expand' && event != 'rename-end-parent' ? 0 : idValue)
577
+ };
578
+ if (isNOU(parent.responseData.cwd)) {
579
+ var message = 'Cannot load empty data within the File Manager.';
580
+ createErrorObject(parent, message, '400', null);
581
+ }
582
+ }
583
+ else if (isFileOperation && parent.responseData.error === null) {
584
+ var itemData = action === 'search' || action === 'delete' ? getValue('data', data) : [];
585
+ if (itemData.length === 0) {
586
+ itemData = getValue('data', data).map(function (item) { return filterById(parent, item.id); });
587
+ }
588
+ parent.responseData = {
589
+ cwd: null,
590
+ details: null,
591
+ error: null,
592
+ files: itemData
593
+ };
594
+ }
595
+ else if (getValue('action', data) === 'details') {
596
+ var itemData = getValue('data', data);
597
+ var details = itemData[0];
598
+ var isMultipleFiles = itemData.length > 1;
599
+ var itemNames = itemData.map(function (item) { return item.name; });
600
+ var totalSize = isMultipleFiles ? getSize(itemData.reduce(function (accumulator, currentObject) { return accumulator + (currentObject.size || 0); }, 0)) : getSize(details.size);
601
+ var path = (parent.pathNames.includes(details.name) ? parent.pathNames.join('/') : parent.pathNames.join('/') + '/' + details.name);
602
+ parent.responseData.details = Object.assign({
603
+ location: isMultipleFiles ? null : path,
604
+ multipleFiles: isMultipleFiles,
605
+ name: itemNames.join(', '),
606
+ size: totalSize
607
+ }, isMultipleFiles ? {} : {
608
+ created: details.dateCreated,
609
+ isFile: details.isFile,
610
+ modified: details.dateModified,
611
+ permission: details.permission
612
+ });
613
+ }
614
+ performReadOperation(parent, parent.responseData, fn, data, event, operation, targetPath, beforeSendArgs);
615
+ return;
616
+ }
191
617
  var ajax = new Ajax({
192
618
  url: getValue('url', beforeSendArgs.ajaxSettings),
193
619
  type: getValue('type', beforeSendArgs.ajaxSettings),
@@ -212,61 +638,7 @@ parent, data, fn, event, operation, targetPath) {
212
638
  if (typeof (result) === 'string') {
213
639
  result = JSON.parse(result);
214
640
  }
215
- parent.notify(events.afterRequest, { action: 'success' });
216
- var id = parent.expandedId ? parent.expandedId : parent.pathId[parent.pathId.length - 1];
217
- if (!isNOU(result.cwd) && (getValue('action', data) === 'read')) {
218
- result.cwd.name = (parent.pathId.length === 1) ? (parent.rootAliasName || result.cwd.name) : result.cwd.name;
219
- setValue('_fm_id', id, result.cwd);
220
- setValue(id, result.cwd, parent.feParent);
221
- if (!isNOU(result.files) || result.error.code === '401') {
222
- if ((event === 'finalize-end' || event === 'initial-end') && parent.pathNames.length === 0) {
223
- // eslint-disable-next-line
224
- var root = getValue(parent.pathId[0], parent.feParent);
225
- parent.pathNames[0] = getValue('name', root);
226
- parent.hasId = !isNOU(getValue('id', root));
227
- }
228
- if (event === 'finalize-end') {
229
- generatePath(parent);
230
- }
231
- }
232
- }
233
- var intl = new Internationalization(parent.locale);
234
- if (!isNOU(result.files)) {
235
- setDateObject(result.files, intl, getDateFormat(parent));
236
- for (var i = 0, len = result.files.length; i < len; i++) {
237
- // eslint-disable-next-line
238
- var item = result.files[i];
239
- setValue('_fm_iconClass', fileType(item), item);
240
- }
241
- if (getValue('action', data) === 'read') {
242
- setNodeId(result, id);
243
- setValue(id, result.files, parent.feFiles);
244
- }
245
- }
246
- if (!isNOU(result.details) && !isNOU(parent.rootAliasName)) {
247
- var rootName = parent.rootAliasName || getValue('name', result.details);
248
- var location_1 = getValue('location', result.details).replace(new RegExp('/', 'g'), '\\');
249
- if ((getValue('path', data) === '/') || (parent.hasId && getValue('path', data).match(/[/]/g).length === 1)) {
250
- if (getValue('names', data).length === 0) {
251
- setValue('name', rootName, result.details);
252
- location_1 = rootName;
253
- }
254
- else {
255
- location_1 = location_1.replace(location_1.substring(0, location_1.indexOf('\\')), rootName);
256
- }
257
- }
258
- else {
259
- location_1 = location_1.replace(location_1.substring(0, location_1.indexOf('\\')), rootName);
260
- }
261
- setValue('location', location_1, result.details);
262
- }
263
- fn(parent, result, event, operation, targetPath);
264
- if (!isNOU(result.files) && (event === 'path-changed' || event === 'finalize-end' || event === 'open-end' || event === 'drop-path')) {
265
- parent.notify(events.searchTextChange, result);
266
- }
267
- if (typeof getValue('onSuccess', beforeSendArgs.ajaxSettings) === 'function') {
268
- getValue('onSuccess', beforeSendArgs.ajaxSettings)();
269
- }
641
+ performReadOperation(parent, result, fn, data, event, operation, targetPath, beforeSendArgs);
270
642
  },
271
643
  onFailure: function () {
272
644
  var result = {
@@ -284,6 +656,117 @@ parent, data, fn, event, operation, targetPath) {
284
656
  }
285
657
  });
286
658
  }
659
+ /**
660
+ * Function to get file size.
661
+ *
662
+ * @param {number} size - specifies the size.
663
+ * @returns {string} - returns the size.
664
+ * @private
665
+ */
666
+ function getSize(size) {
667
+ var hz;
668
+ if (size < 1024) {
669
+ hz = size + ' B';
670
+ }
671
+ else if (size < 1024 * 1024) {
672
+ hz = (size / 1024).toFixed(2) + ' KB';
673
+ }
674
+ else if (size < 1024 * 1024 * 1024) {
675
+ hz = (size / 1024 / 1024).toFixed(2) + ' MB';
676
+ }
677
+ else {
678
+ hz = (size / 1024 / 1024 / 1024).toFixed(2) + ' GB';
679
+ }
680
+ return hz;
681
+ }
682
+ /**
683
+ * Function to perform read operation.
684
+ *
685
+ * @param {IFileManager} parent - specifies the parent element.
686
+ * @param {ReadArgs} result - specifies the result.
687
+ * @param {Function} fn - specifies the function.
688
+ * @param {Object} data - specifies the data.
689
+ * @param {string} event - specifies the event.
690
+ * @param {string} operation - specifies the operation.
691
+ * @param {string} targetPath - specifies the targetPath.
692
+ * @param {BeforeSendEventArgs} beforeSendArgs - specifies the eventArgs.
693
+ * @returns {void}
694
+ * @private
695
+ */
696
+ function performReadOperation(parent, result, fn, data, event, operation, targetPath, beforeSendArgs) {
697
+ parent.notify(events.afterRequest, { action: 'success' });
698
+ var id = parent.expandedId ? parent.expandedId : parent.pathId[parent.pathId.length - 1];
699
+ if (!isNOU(result.cwd) && (getValue('action', data) === 'read')) {
700
+ result.cwd.name = (parent.pathId.length === 1) ? (parent.rootAliasName || result.cwd.name) : result.cwd.name;
701
+ setValue('_fm_id', id, result.cwd);
702
+ setValue(id, result.cwd, parent.feParent);
703
+ if (!isNOU(result.files) || result.error.code === '401') {
704
+ if ((event === 'finalize-end' || event === 'initial-end') && parent.pathNames.length === 0) {
705
+ var root = getValue(parent.pathId[0], parent.feParent);
706
+ parent.pathNames[0] = getValue('name', root);
707
+ parent.hasId = !isNOU(getValue('id', root));
708
+ }
709
+ if (event === 'finalize-end') {
710
+ generatePath(parent);
711
+ }
712
+ }
713
+ }
714
+ var intl = new Internationalization(parent.locale);
715
+ if (!isNOU(result.files)) {
716
+ setDateObject(result.files, intl, getDateFormat(parent));
717
+ for (var i = 0, len = result.files.length; i < len; i++) {
718
+ var item = result.files[i];
719
+ setValue('_fm_iconClass', fileType(item), item);
720
+ }
721
+ if (getValue('action', data) === 'read' || isFileSystemData(parent) && getValue('action', data) === 'search') {
722
+ setNodeId(result, id);
723
+ setValue(id, result.files, parent.feFiles);
724
+ }
725
+ }
726
+ if (!isNOU(result.details) && !isNOU(parent.rootAliasName)) {
727
+ var rootName = parent.rootAliasName || getValue('name', result.details);
728
+ var location_1 = getValue('location', result.details).replace(new RegExp('/', 'g'), '\\');
729
+ if ((getValue('path', data) === '/') || (parent.hasId && getValue('path', data).match(/[/]/g).length === 1)) {
730
+ if (getValue('names', data).length === 0) {
731
+ setValue('name', rootName, result.details);
732
+ location_1 = rootName;
733
+ }
734
+ else {
735
+ location_1 = location_1.replace(location_1.substring(0, location_1.indexOf('\\')), rootName);
736
+ }
737
+ }
738
+ else {
739
+ location_1 = location_1.replace(location_1.substring(0, location_1.indexOf('\\')), rootName);
740
+ }
741
+ setValue('location', location_1, result.details);
742
+ }
743
+ fn(parent, result, event, operation, targetPath);
744
+ if (!isNOU(result.files) && (event === 'path-changed' || event === 'finalize-end' || event === 'open-end' || event === 'drop-path')) {
745
+ parent.notify(events.searchTextChange, result);
746
+ }
747
+ if (typeof getValue('onSuccess', beforeSendArgs.ajaxSettings) === 'function') {
748
+ getValue('onSuccess', beforeSendArgs.ajaxSettings)();
749
+ }
750
+ }
751
+ /**
752
+ * Function to copy operation.
753
+ *
754
+ * @param {IFileManager} parent - specifies the parent element.
755
+ * @param {Object} data - specifies the data.
756
+ * @param {string} target - specifies the target.
757
+ * @param {string} itemName - specifies the item name.
758
+ * @returns {void}
759
+ * @private
760
+ */
761
+ function copyFolderItems(parent, data, target, itemName) {
762
+ var newObject = createNewItem(data, target, itemName, true);
763
+ parent.fileSystemData.push(newObject);
764
+ parent.pasteNodes.push(newObject.id);
765
+ var copiedItems = filterByParent(parent, data.id);
766
+ for (var i = 0; i < copiedItems.length; i++) {
767
+ copyFolderItems(parent, copiedItems[i], newObject, null);
768
+ }
769
+ }
287
770
  /**
288
771
  * Function for trigger Ajax failure in File Manager.
289
772
  *
@@ -297,9 +780,7 @@ parent, data, fn, event, operation, targetPath) {
297
780
  * @returns {void}
298
781
  * @private
299
782
  */
300
- function triggerAjaxFailure(
301
- // eslint-disable-next-line
302
- parent, beforeSendArgs, fn, result, event, operation, targetPath) {
783
+ function triggerAjaxFailure(parent, beforeSendArgs, fn, result, event, operation, targetPath) {
303
784
  parent.notify(events.afterRequest, { action: 'failure' });
304
785
  fn(parent, result, event, operation, targetPath);
305
786
  if (typeof getValue('onFailure', beforeSendArgs.ajaxSettings) === 'function') {
@@ -375,8 +856,14 @@ function createSuccess(parent, result, itemName) {
375
856
  if (parent.dialogObj && parent.dialogObj.visible) {
376
857
  parent.dialogObj.hide();
377
858
  }
378
- parent.createdItem = result.files[0];
859
+ parent.createdItem = isFileSystemData(parent) ? result.files[result.files.length - 1] : result.files[0];
379
860
  parent.breadcrumbbarModule.searchObj.value = '';
861
+ var createEventArgs = {
862
+ folderName: itemName,
863
+ path: parent.path,
864
+ parentFolder: parent.itemData
865
+ };
866
+ parent.trigger('folderCreate', createEventArgs);
380
867
  var args = { action: 'create', result: result };
381
868
  parent.trigger('success', args);
382
869
  parent.itemData = [getPathObject(parent)];
@@ -417,11 +904,10 @@ function createSuccess(parent, result, itemName) {
417
904
  *
418
905
  * @param {IFileManager} parent - specifies the parent element.
419
906
  * @param {ReadArgs} result - specifies the result.
420
- * @param {string} path - specifies the path
421
907
  * @returns {void}
422
908
  * @private
423
909
  */
424
- function renameSuccess(parent, result, path) {
910
+ function renameSuccess(parent, result) {
425
911
  if (!isNOU(result.files)) {
426
912
  if (!isNOU(parent.dialogObj)) {
427
913
  parent.dialogObj.hide();
@@ -429,15 +915,22 @@ function renameSuccess(parent, result, path) {
429
915
  var args = { action: 'rename', result: result };
430
916
  parent.trigger('success', args);
431
917
  parent.renamedItem = Array.isArray(result.files) ? result.files[0] : result.files;
918
+ var renameEventArgs = {
919
+ newName: parent.renamedItem.name,
920
+ itemData: parent.renamedItem,
921
+ path: parent.path
922
+ };
923
+ parent.trigger('rename', renameEventArgs);
432
924
  if (parent.activeModule === 'navigationpane') {
433
925
  parent.pathId.pop();
434
926
  parent.itemData = [getValue(parent.pathId[parent.pathId.length - 1], parent.feParent)];
435
927
  read(parent, events.renameEndParent, getValue('filterPath', parent.renamedItem).replace(/\\/g, '/'));
436
928
  parent.itemData[0] = parent.renamedItem;
437
- read(parent, events.pathChanged, parent.path === '/' ? parent.path : getValue('filterPath', parent.renamedItem).replace(/\\/g, '/') + parent.renamedItem.name + '/');
438
929
  if (getValue('filterPath', parent.renamedItem) === getValue('filterPath', parent.itemData[0]) && parent.pathNames.length > 1) {
439
930
  parent.pathNames[parent.pathNames.length - 1] = parent.renameText;
440
931
  }
932
+ read(parent, events.pathChanged, parent.path === '/' ? parent.path : getValue('filterPath', parent.renamedItem).replace(/\\/g, '/') + parent.renamedItem.name + '/');
933
+ parent.renamedItem = null;
441
934
  }
442
935
  else {
443
936
  parent.itemData = [getPathObject(parent)];
@@ -483,6 +976,14 @@ function renameSuccess(parent, result, path) {
483
976
  * @private
484
977
  */
485
978
  function pasteSuccess(parent, result, path, operation) {
979
+ var moveorcopyEventArgs = {
980
+ itemData: result.files,
981
+ isCopy: operation === 'copy' ? true : false,
982
+ path: path,
983
+ targetData: parent.itemData[0],
984
+ targetPath: parent.path
985
+ };
986
+ parent.trigger('move', moveorcopyEventArgs);
486
987
  if (result.error && result.error.fileExists) {
487
988
  parent.fileLength = 0;
488
989
  if (!isNOU(result.files)) {
@@ -517,6 +1018,11 @@ function pasteSuccess(parent, result, path, operation) {
517
1018
  * @private
518
1019
  */
519
1020
  function deleteSuccess(parent, result, path) {
1021
+ var deleteEventArgs = {
1022
+ itemData: result.files,
1023
+ path: path
1024
+ };
1025
+ parent.trigger('delete', deleteEventArgs);
520
1026
  if (!isNOU(result.files)) {
521
1027
  parent.setProperties({ path: path }, true);
522
1028
  parent.itemData = [getPathObject(parent)];
@@ -581,10 +1087,7 @@ function onFailure(parent, result, action) {
581
1087
  * @returns {void}
582
1088
  * @private
583
1089
  */
584
- export function Search(
585
- // eslint:disable-next-line
586
- parent, event, path, searchString, showHiddenItems, caseSensitive) {
587
- // eslint-disable-next-line
1090
+ export function Search(parent, event, path, searchString, showHiddenItems, caseSensitive) {
588
1091
  var data = {
589
1092
  action: 'search', path: path, searchString: searchString, showHiddenItems: showHiddenItems, caseSensitive: caseSensitive,
590
1093
  data: parent.itemData
@@ -623,7 +1126,6 @@ function searchSuccess(parent, result, event) {
623
1126
  */
624
1127
  export function Download(parent, path, items) {
625
1128
  var downloadUrl = parent.ajaxSettings.downloadUrl ? parent.ajaxSettings.downloadUrl : parent.ajaxSettings.url;
626
- // eslint-disable-next-line
627
1129
  var data = { 'action': 'download', 'path': path, 'names': items, 'data': parent.itemData };
628
1130
  var ajaxSettings = {
629
1131
  url: downloadUrl,
@@ -687,12 +1189,12 @@ export function Download(parent, path, items) {
687
1189
  var result = {
688
1190
  error: {
689
1191
  code: e.status.toString(),
690
- message: getLocaleText(parent, 'Network-Error') + ' ' + parent.ajaxSettings.downloadUrl,
691
- },
1192
+ message: getLocaleText(parent, 'Network-Error') + ' ' + parent.ajaxSettings.downloadUrl
1193
+ }
692
1194
  };
693
1195
  createDialog(parent, 'Error', result);
694
1196
  parent.trigger('failure', downloadArgs);
695
- },
1197
+ }
696
1198
  });
697
1199
  fetch_1.send(JSON.stringify(downloadArgs.data));
698
1200
  }