@syncfusion/ej2-filemanager 29.2.10 → 30.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/.eslintrc.json +2 -0
  2. package/dist/ej2-filemanager.min.js +2 -2
  3. package/dist/ej2-filemanager.umd.min.js +2 -2
  4. package/dist/ej2-filemanager.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-filemanager.es2015.js +179 -20
  6. package/dist/es6/ej2-filemanager.es2015.js.map +1 -1
  7. package/dist/es6/ej2-filemanager.es5.js +180 -20
  8. package/dist/es6/ej2-filemanager.es5.js.map +1 -1
  9. package/dist/global/ej2-filemanager.min.js +2 -2
  10. package/dist/global/ej2-filemanager.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/dist/ts/file-manager/actions/breadcrumb-bar.d.ts +60 -0
  13. package/dist/ts/file-manager/actions/breadcrumb-bar.ts +423 -0
  14. package/dist/ts/file-manager/actions/index.d.ts +6 -0
  15. package/dist/ts/file-manager/actions/index.ts +6 -0
  16. package/dist/ts/file-manager/actions/toolbar.d.ts +54 -0
  17. package/dist/ts/file-manager/actions/toolbar.ts +609 -0
  18. package/dist/ts/file-manager/actions/virtualization.d.ts +93 -0
  19. package/dist/ts/file-manager/actions/virtualization.ts +324 -0
  20. package/dist/ts/file-manager/base/classes.d.ts +224 -0
  21. package/dist/ts/file-manager/base/classes.ts +225 -0
  22. package/dist/ts/file-manager/base/constant.d.ts +136 -0
  23. package/dist/ts/file-manager/base/constant.ts +137 -0
  24. package/dist/ts/file-manager/base/file-manager-model.d.ts +520 -0
  25. package/dist/ts/file-manager/base/file-manager.d.ts +867 -0
  26. package/dist/ts/file-manager/base/file-manager.ts +2061 -0
  27. package/dist/ts/file-manager/base/index.d.ts +8 -0
  28. package/dist/ts/file-manager/base/index.ts +8 -0
  29. package/dist/ts/file-manager/base/interface.d.ts +952 -0
  30. package/dist/ts/file-manager/base/interface.ts +931 -0
  31. package/dist/ts/file-manager/common/index.d.ts +5 -0
  32. package/dist/ts/file-manager/common/index.ts +5 -0
  33. package/dist/ts/file-manager/common/operations.d.ts +122 -0
  34. package/dist/ts/file-manager/common/operations.ts +1369 -0
  35. package/dist/ts/file-manager/common/utility.d.ts +644 -0
  36. package/dist/ts/file-manager/common/utility.ts +1728 -0
  37. package/dist/ts/file-manager/index.d.ts +9 -0
  38. package/dist/ts/file-manager/index.ts +9 -0
  39. package/dist/ts/file-manager/layout/details-view.d.ts +152 -0
  40. package/dist/ts/file-manager/layout/details-view.ts +1990 -0
  41. package/dist/ts/file-manager/layout/index.d.ts +6 -0
  42. package/dist/ts/file-manager/layout/index.ts +6 -0
  43. package/dist/ts/file-manager/layout/large-icons-view.d.ts +157 -0
  44. package/dist/ts/file-manager/layout/large-icons-view.ts +1684 -0
  45. package/dist/ts/file-manager/layout/navigation-pane.d.ts +104 -0
  46. package/dist/ts/file-manager/layout/navigation-pane.ts +919 -0
  47. package/dist/ts/file-manager/models/ajax-settings-model.d.ts +36 -0
  48. package/dist/ts/file-manager/models/ajax-settings.d.ts +30 -0
  49. package/dist/ts/file-manager/models/ajax-settings.ts +39 -0
  50. package/dist/ts/file-manager/models/column-model.d.ts +155 -0
  51. package/dist/ts/file-manager/models/column.d.ts +179 -0
  52. package/dist/ts/file-manager/models/column.ts +216 -0
  53. package/dist/ts/file-manager/models/contextMenu-settings-model.d.ts +36 -0
  54. package/dist/ts/file-manager/models/contextMenu-settings.d.ts +33 -0
  55. package/dist/ts/file-manager/models/contextMenu-settings.ts +44 -0
  56. package/dist/ts/file-manager/models/default-locale.d.ts +4 -0
  57. package/dist/ts/file-manager/models/default-locale.ts +101 -0
  58. package/dist/ts/file-manager/models/details-view-settings-model.d.ts +30 -0
  59. package/dist/ts/file-manager/models/details-view-settings.d.ts +31 -0
  60. package/dist/ts/file-manager/models/details-view-settings.ts +54 -0
  61. package/dist/ts/file-manager/models/index.d.ts +19 -0
  62. package/dist/ts/file-manager/models/index.ts +19 -0
  63. package/dist/ts/file-manager/models/navigation-pane-settings-model.d.ts +40 -0
  64. package/dist/ts/file-manager/models/navigation-pane-settings.d.ts +34 -0
  65. package/dist/ts/file-manager/models/navigation-pane-settings.ts +42 -0
  66. package/dist/ts/file-manager/models/search-settings-model.d.ts +42 -0
  67. package/dist/ts/file-manager/models/search-settings.d.ts +44 -0
  68. package/dist/ts/file-manager/models/search-settings.ts +53 -0
  69. package/dist/ts/file-manager/models/toolbar-settings-model.d.ts +197 -0
  70. package/dist/ts/file-manager/models/toolbar-settings.d.ts +174 -0
  71. package/dist/ts/file-manager/models/toolbar-settings.ts +198 -0
  72. package/dist/ts/file-manager/models/upload-settings-model.d.ts +70 -0
  73. package/dist/ts/file-manager/models/upload-settings.d.ts +61 -0
  74. package/dist/ts/file-manager/models/upload-settings.ts +75 -0
  75. package/dist/ts/file-manager/pop-up/context-menu.d.ts +64 -0
  76. package/dist/ts/file-manager/pop-up/context-menu.ts +693 -0
  77. package/dist/ts/file-manager/pop-up/dialog.d.ts +31 -0
  78. package/dist/ts/file-manager/pop-up/dialog.ts +1009 -0
  79. package/dist/ts/file-manager/pop-up/index.d.ts +5 -0
  80. package/dist/ts/file-manager/pop-up/index.ts +5 -0
  81. package/dist/ts/index.d.ts +4 -0
  82. package/dist/ts/index.ts +4 -0
  83. package/package.json +56 -21
  84. package/src/file-manager/base/interface.d.ts +10 -0
  85. package/src/file-manager/common/operations.d.ts +18 -1
  86. package/src/file-manager/common/operations.js +59 -0
  87. package/src/file-manager/common/utility.d.ts +3 -3
  88. package/src/file-manager/common/utility.js +20 -6
  89. package/src/file-manager/layout/details-view.js +4 -3
  90. package/src/file-manager/layout/large-icons-view.d.ts +3 -0
  91. package/src/file-manager/layout/large-icons-view.js +67 -9
  92. package/src/file-manager/pop-up/dialog.d.ts +3 -3
  93. package/src/file-manager/pop-up/dialog.js +34 -6
  94. package/styles/bds-lite.css +51 -1
  95. package/styles/bds.css +51 -1
  96. package/styles/bootstrap-dark-lite.css +51 -0
  97. package/styles/bootstrap-dark.css +51 -0
  98. package/styles/bootstrap-lite.css +51 -0
  99. package/styles/bootstrap.css +51 -0
  100. package/styles/bootstrap4-lite.css +51 -0
  101. package/styles/bootstrap4.css +51 -0
  102. package/styles/bootstrap5-dark-lite.css +51 -1
  103. package/styles/bootstrap5-dark.css +51 -1
  104. package/styles/bootstrap5-lite.css +51 -1
  105. package/styles/bootstrap5.3-lite.css +51 -0
  106. package/styles/bootstrap5.3.css +51 -0
  107. package/styles/bootstrap5.css +51 -1
  108. package/styles/fabric-dark-lite.css +51 -0
  109. package/styles/fabric-dark.css +51 -0
  110. package/styles/fabric-lite.css +51 -0
  111. package/styles/fabric.css +51 -0
  112. package/styles/file-manager/_bds-definition.scss +1 -0
  113. package/styles/file-manager/_bootstrap5-definition.scss +1 -0
  114. package/styles/file-manager/_layout.scss +46 -4
  115. package/styles/file-manager/_material3-definition.scss +2 -2
  116. package/styles/file-manager/_tailwind-definition.scss +1 -0
  117. package/styles/file-manager/_tailwind3-definition.scss +1 -0
  118. package/styles/file-manager/bds.css +51 -1
  119. package/styles/file-manager/bootstrap-dark.css +51 -0
  120. package/styles/file-manager/bootstrap.css +51 -0
  121. package/styles/file-manager/bootstrap4.css +51 -0
  122. package/styles/file-manager/bootstrap5-dark.css +51 -1
  123. package/styles/file-manager/bootstrap5.3.css +51 -0
  124. package/styles/file-manager/bootstrap5.css +51 -1
  125. package/styles/file-manager/fabric-dark.css +51 -0
  126. package/styles/file-manager/fabric.css +51 -0
  127. package/styles/file-manager/fluent-dark.css +51 -0
  128. package/styles/file-manager/fluent.css +51 -0
  129. package/styles/file-manager/fluent2.css +51 -0
  130. package/styles/file-manager/highcontrast-light.css +51 -0
  131. package/styles/file-manager/highcontrast.css +51 -0
  132. package/styles/file-manager/material-dark.css +51 -0
  133. package/styles/file-manager/material.css +51 -0
  134. package/styles/file-manager/material3-dark.css +53 -2
  135. package/styles/file-manager/material3.css +53 -2
  136. package/styles/file-manager/tailwind-dark.css +51 -1
  137. package/styles/file-manager/tailwind.css +51 -1
  138. package/styles/file-manager/tailwind3.css +51 -0
  139. package/styles/fluent-dark-lite.css +51 -0
  140. package/styles/fluent-dark.css +51 -0
  141. package/styles/fluent-lite.css +51 -0
  142. package/styles/fluent.css +51 -0
  143. package/styles/fluent2-lite.css +51 -0
  144. package/styles/fluent2.css +51 -0
  145. package/styles/highcontrast-light-lite.css +51 -0
  146. package/styles/highcontrast-light.css +51 -0
  147. package/styles/highcontrast-lite.css +51 -0
  148. package/styles/highcontrast.css +51 -0
  149. package/styles/material-dark-lite.css +51 -0
  150. package/styles/material-dark.css +51 -0
  151. package/styles/material-lite.css +51 -0
  152. package/styles/material.css +51 -0
  153. package/styles/material3-dark-lite.css +51 -0
  154. package/styles/material3-dark.css +53 -2
  155. package/styles/material3-lite.css +51 -0
  156. package/styles/material3.css +53 -2
  157. package/styles/tailwind-dark-lite.css +51 -1
  158. package/styles/tailwind-dark.css +51 -1
  159. package/styles/tailwind-lite.css +51 -1
  160. package/styles/tailwind.css +51 -1
  161. package/styles/tailwind3-lite.css +51 -0
  162. package/styles/tailwind3.css +51 -0
@@ -0,0 +1,1009 @@
1
+ import { Dialog, BeforeOpenEventArgs, BeforeCloseEventArgs } from '@syncfusion/ej2-popups';
2
+ import { select, isNullOrUndefined as isNOU, createElement, Internationalization, Fetch } from '@syncfusion/ej2-base';
3
+ import { getValue, remove, selectAll } from '@syncfusion/ej2-base';
4
+ import { IFileManager, ReadArgs, DialogOptions, FileDetails, FileDragEventArgs, BeforeImageLoadEventArgs } from '../base/interface';
5
+ import { BeforePopupOpenCloseEventArgs, PopupOpenCloseEventArgs } from '../base/interface';
6
+ import { createFolder } from '../common/operations';
7
+ import * as CLS from '../base/classes';
8
+ import * as events from '../base/constant';
9
+ import { paste, rename, triggerFetchFailure, triggerFetchSuccess } from '../common/operations';
10
+ import { getLocaleText, getDuplicateData, objectToString, getCssClass, getTargetPath } from '../common/utility';
11
+ import { SelectedEventArgs, Input } from '@syncfusion/ej2-inputs';
12
+ import { CheckBox, ChangeEventArgs } from '@syncfusion/ej2-buttons';
13
+
14
+ /**
15
+ *
16
+ * @param {IFileManager} parent - Specifies the parent element
17
+ * @param {string} text - specifies the text string.
18
+ * @param {ReadArgs | SelectedEventArgs} e - specifies the type of event args.
19
+ * @param {FileDetails} details - specifies the file details.
20
+ * @returns {void}
21
+ * @private
22
+ */
23
+ export function createDialog(parent: IFileManager,
24
+ text: string, e?: ReadArgs | SelectedEventArgs, details?: FileDetails): void {
25
+ const options: DialogOptions = getOptions(parent, text, e, details);
26
+ if (isNOU(parent.dialogObj)) {
27
+ parent.dialogObj = new Dialog({
28
+ beforeOpen: keydownAction.bind(this, parent, options.dialogName),
29
+ beforeClose: (args: BeforeCloseEventArgs) => {
30
+ triggerPopupBeforeClose(parent, parent.dialogObj, args, options.dialogName);
31
+ },
32
+ header: options.header,
33
+ content: options.content,
34
+ buttons: options.buttons,
35
+ animationSettings: { effect: 'None' },
36
+ showCloseIcon: true,
37
+ closeOnEscape: true,
38
+ visible: true,
39
+ allowDragging: true,
40
+ isModal: true,
41
+ target: parent.popupTarget ? parent.popupTarget : '#' + parent.element.id,
42
+ cssClass: getCssClass(parent, parent.isMobile ? CLS.MOB_POPUP : CLS.ROOT_POPUP),
43
+ width: '350px',
44
+ open: options.open,
45
+ close: options.close,
46
+ enableRtl: parent.enableRtl,
47
+ enableHtmlSanitizer: parent.enableHtmlSanitizer,
48
+ locale: parent.locale
49
+ });
50
+ parent.dialogObj.isStringTemplate = true;
51
+ parent.dialogObj.appendTo('#' + parent.element.id + CLS.DIALOG_ID);
52
+ } else {
53
+ changeOptions(parent, options);
54
+ }
55
+ }
56
+ /**
57
+ *
58
+ * @param {IFileManager} parent - Specifies the parent element.
59
+ * @param {string} text - specifies the text string.
60
+ * @param {string[]} replaceItems - specifies the replacement items.
61
+ * @param {string} newPath - specifies the new path.
62
+ * @returns {void}
63
+ * @private
64
+ */
65
+ export function createExtDialog(parent: IFileManager, text: string, replaceItems?: string[], newPath?: string): void {
66
+ const extOptions: DialogOptions = getExtOptions(parent, text, replaceItems, newPath);
67
+ parent.isApplySame = false;
68
+ if (isNOU(parent.extDialogObj)) {
69
+ parent.extDialogObj = new Dialog({
70
+ beforeOpen: beforeExtOpen.bind(this, parent, extOptions.dialogName),
71
+ beforeClose: (args: BeforeCloseEventArgs) => {
72
+ triggerPopupBeforeClose(parent, parent.extDialogObj, args, extOptions.dialogName);
73
+ },
74
+ content: extOptions.content,
75
+ header: extOptions.header,
76
+ closeOnEscape: true,
77
+ allowDragging: true,
78
+ animationSettings: { effect: 'None' },
79
+ target: parent.popupTarget ? parent.popupTarget : '#' + parent.element.id,
80
+ cssClass: getCssClass(parent, parent.isMobile ? CLS.MOB_POPUP : CLS.ROOT_POPUP),
81
+ enableRtl: parent.enableRtl,
82
+ showCloseIcon: true,
83
+ isModal: true,
84
+ width: 350,
85
+ buttons: extOptions.buttons,
86
+ open: extOptions.open,
87
+ close: extOptions.close,
88
+ enableHtmlSanitizer: parent.enableHtmlSanitizer,
89
+ locale: parent.locale
90
+ });
91
+ parent.extDialogObj.isStringTemplate = true;
92
+ parent.extDialogObj.appendTo('#' + parent.element.id + CLS.EXTN_DIALOG_ID);
93
+ } else {
94
+ parent.extDialogObj.header = extOptions.header;
95
+ parent.extDialogObj.close = extOptions.close;
96
+ parent.extDialogObj.open = extOptions.open;
97
+ parent.extDialogObj.close = extOptions.close;
98
+ parent.extDialogObj.content = extOptions.content;
99
+ parent.extDialogObj.buttons = extOptions.buttons;
100
+ parent.extDialogObj.enableRtl = parent.enableRtl;
101
+ parent.extDialogObj.locale = parent.locale;
102
+ parent.extDialogObj.beforeOpen = beforeExtOpen.bind(this, parent, extOptions.dialogName);
103
+ parent.extDialogObj.beforeClose = (args: BeforeCloseEventArgs) => {
104
+ triggerPopupBeforeClose(parent, parent.extDialogObj, args, extOptions.dialogName);
105
+ };
106
+ parent.extDialogObj.dataBind();
107
+ parent.extDialogObj.show();
108
+ }
109
+ }
110
+ /**
111
+ *
112
+ * @param {IFileManager} parent - Specifies the parent element.
113
+ * @param {Dialog} dlgModule - Specifies the dialog module.
114
+ * @param {BeforeOpenEventArgs} args - specifies the before open arguements.
115
+ * @param {string} dialogName - specifies the dialog name.
116
+ * @returns {void}
117
+ * @private
118
+ */
119
+ function triggerPopupBeforeOpen(parent: IFileManager, dlgModule: Dialog, args: BeforeOpenEventArgs, dialogName: string): void {
120
+ const eventArgs: BeforePopupOpenCloseEventArgs = {
121
+ cancel: args.cancel, popupName: dialogName, popupModule: dlgModule
122
+ };
123
+ parent.trigger('beforePopupOpen', eventArgs, (eventargs: BeforePopupOpenCloseEventArgs) => {
124
+ args.cancel = eventargs.cancel;
125
+ });
126
+ }
127
+
128
+ /**
129
+ *
130
+ * @param {IFileManager} parent - specifies the parent element.
131
+ * @param {Dialog} dlgModule - specifies the dialog module.
132
+ * @param {BeforeCloseEventArgs} args - specifies the before close event arguements.
133
+ * @param {string} dialogName - specifies the dialog name.
134
+ * @returns {void}
135
+ * @private
136
+ */
137
+ function triggerPopupBeforeClose(parent: IFileManager, dlgModule: Dialog, args: BeforeCloseEventArgs, dialogName: string): void {
138
+ const eventArgs: BeforePopupOpenCloseEventArgs = {
139
+ cancel: args.cancel, popupModule: dlgModule, popupName: dialogName
140
+ };
141
+ parent.trigger('beforePopupClose', eventArgs, (eventargs: BeforePopupOpenCloseEventArgs) => {
142
+ args.cancel = eventargs.cancel;
143
+ if (!args.cancel && args.isInteracted && ((dialogName === 'Rename') || (dialogName === 'Create Folder'))) {
144
+ parent.trigger(events.actionFailure, {});
145
+ }
146
+ });
147
+ }
148
+
149
+ /**
150
+ *
151
+ * @param {IFileManager} parent - specifies the parent element.
152
+ * @param {Dialog} dlgModule - specifies the dialog module.
153
+ * @param {string} dialogName - specifies the dialog name.
154
+ * @returns {void}
155
+ * @private
156
+ */
157
+ function triggerPopupOpen(parent: IFileManager, dlgModule: Dialog, dialogName: string): void {
158
+ const args: PopupOpenCloseEventArgs = { popupModule: dlgModule, element: dlgModule.element, popupName: dialogName };
159
+ parent.trigger('popupOpen', args);
160
+ }
161
+
162
+ /**
163
+ *
164
+ * @param {IFileManager} parent - specifies the parent element.
165
+ * @param {Dialog} dlgModule - specifies the dialog module.
166
+ * @param {string} dialogName - specifies the dialog name.
167
+ * @returns {void}
168
+ * @private
169
+ */
170
+ function triggerPopupClose(parent: IFileManager, dlgModule: Dialog, dialogName: string): void {
171
+ const args: PopupOpenCloseEventArgs = { popupModule: dlgModule, element: dlgModule.element, popupName: dialogName };
172
+ parent.trigger('popupClose', args);
173
+ }
174
+
175
+ /**
176
+ *
177
+ * @param {IFileManager} parent - Specifies the parent element.
178
+ * @param {string} text - specifies the text string.
179
+ * @param {string[]} replaceItems - specifies the replacement items.
180
+ * @param {string} newPath - specifies the new path.
181
+ * @returns {DialogOptions} - returns the dialog options.
182
+ * @private
183
+ */
184
+ function getExtOptions(parent: IFileManager, text: string, replaceItems?: string[], newPath?: string): DialogOptions {
185
+ const options: DialogOptions = {
186
+ header: '', content: '', buttons: [], dialogName: ''
187
+ };
188
+ let duplicateContent: string;
189
+ let item: string;
190
+ let index: number;
191
+ options.open = () => { triggerPopupOpen(parent, parent.extDialogObj, options.dialogName); };
192
+ options.close = () => { triggerPopupClose(parent, parent.extDialogObj, options.dialogName); };
193
+ switch (text) {
194
+ case 'Extension':
195
+ options.header = getLocaleText(parent, 'Header-Rename-Confirmation');
196
+ options.content = '<div>' + getLocaleText(parent, 'Content-Rename-Confirmation') + '</div>';
197
+ options.buttons = [{
198
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Yes') },
199
+ click: () => {
200
+ parent.extDialogObj.hide();
201
+ rename(parent, newPath, parent.renameText);
202
+ }
203
+ },
204
+ {
205
+ buttonModel: { content: getLocaleText(parent, 'Button-No') },
206
+ click: () => {
207
+ parent.extDialogObj.hide();
208
+ parent.dialogObj.hide();
209
+ }
210
+ }];
211
+ options.dialogName = 'Extension Change';
212
+ break;
213
+ case 'DuplicateItems':
214
+ options.dialogName = 'Duplicate Items';
215
+ parent.replaceItems = replaceItems;
216
+ item = parent.replaceItems[parent.fileLength];
217
+ index = item.lastIndexOf('/');
218
+ item = index === -1 ? item : item.substring(index);
219
+ options.header = getLocaleText(parent, 'Header-Duplicate');
220
+ duplicateContent = '<div>' + getLocaleText(parent, 'Content-Duplicate') + '</div>';
221
+ options.content = (duplicateContent).replace('{0}', item);
222
+ options.close = () => {
223
+ if (!parent.isDropEnd && parent.duplicateItems.length === 0) {
224
+ const args: FileDragEventArgs = { fileDetails: parent.droppedObjects };
225
+ parent.trigger('fileDropped', args);
226
+ parent.isDropEnd = parent.isDragDrop = false;
227
+ }
228
+ triggerPopupClose(parent, parent.extDialogObj, options.dialogName);
229
+ };
230
+ options.buttons = [
231
+ {
232
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Yes') },
233
+ click: () => {
234
+ parent.duplicateItems.push(parent.replaceItems[parent.fileLength]);
235
+ parent.duplicateRecords.push(getDuplicateData(parent, parent.replaceItems[parent.fileLength]));
236
+ parent.fileLength++;
237
+ if (replaceItems[parent.fileLength]) {
238
+ let item: string = parent.replaceItems[parent.fileLength];
239
+ const indexval: number = item.lastIndexOf('/');
240
+ item = indexval === -1 ? item : item.substring(indexval);
241
+ parent.extDialogObj.content = (duplicateContent).replace('{0}', item);
242
+ parent.extDialogObj.show();
243
+ } else {
244
+ parent.extDialogObj.hide();
245
+ const targetPath: string = parent.isDragDrop ? parent.dragPath : parent.targetPath;
246
+ const path: string = parent.isDragDrop ? parent.dropPath : ((parent.folderPath === '') ? parent.path :
247
+ parent.folderPath);
248
+ const action: string = parent.isDragDrop ? 'move' : parent.fileAction;
249
+ paste(
250
+ parent, targetPath, parent.duplicateItems, path,
251
+ action, parent.duplicateItems, parent.duplicateRecords);
252
+ }
253
+ }
254
+ },
255
+ {
256
+ buttonModel: { content: getLocaleText(parent, 'Button-No') },
257
+ click: () => {
258
+ parent.fileLength++;
259
+ if (replaceItems[parent.fileLength]) {
260
+ let item: string = parent.replaceItems[parent.fileLength];
261
+ const ind: number = item.lastIndexOf('/');
262
+ item = ind === -1 ? item : item.substring(ind);
263
+ parent.extDialogObj.content = (duplicateContent).replace('{0}', item);
264
+ parent.extDialogObj.show();
265
+ } else {
266
+ parent.extDialogObj.hide();
267
+ if (parent.duplicateItems.length !== 0) {
268
+ const action: string = parent.isDragDrop ? 'move' : parent.fileAction;
269
+ const targetPath: string = parent.isDragDrop ? parent.dragPath : parent.targetPath;
270
+ const path: string = parent.isDragDrop ? parent.dropPath : ((parent.folderPath === '') ? parent.path :
271
+ parent.folderPath);
272
+ paste(
273
+ parent, targetPath, parent.duplicateItems, path,
274
+ action, parent.duplicateItems, parent.duplicateRecords);
275
+ }
276
+ }
277
+ }
278
+ }
279
+ ];
280
+ break;
281
+ case 'UploadRetry':
282
+ options.dialogName = 'Retry Upload';
283
+ options.header = getLocaleText(parent, 'Header-Retry');
284
+ options.content = parent.retryFiles[0].name + '<div class="e-fe-retrycontent">' +
285
+ (getLocaleText(parent, 'Content-Retry')) + '</div>';
286
+ options.open = onRetryOpen.bind(this, parent);
287
+ options.close = () => {
288
+ parent.isRetryOpened = false;
289
+ retryDlgClose(parent);
290
+ triggerPopupClose(parent, parent.extDialogObj, options.dialogName);
291
+ };
292
+ options.buttons = [
293
+ {
294
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Keep-Both') },
295
+ click: () => {
296
+ retryDlgUpdate(parent, true);
297
+ }
298
+ },
299
+ {
300
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Replace') },
301
+ click: () => {
302
+ retryDlgUpdate(parent, false);
303
+ }
304
+ },
305
+ {
306
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Skip') },
307
+ click: () => {
308
+ let count: number = 0;
309
+ if (parent.isApplySame) {
310
+ count = parent.retryFiles.length;
311
+ parent.retryFiles = [];
312
+ retryDlgClose(parent);
313
+ } else {
314
+ count = 1;
315
+ parent.retryFiles.splice(0, 1);
316
+ if (parent.retryFiles.length !== 0) { createExtDialog(parent, 'UploadRetry'); } else { retryDlgClose(parent); }
317
+ }
318
+ parent.notify(events.skipUpload, { count: count });
319
+ }
320
+ }
321
+ ];
322
+ break;
323
+ }
324
+ return options;
325
+ }
326
+ /**
327
+ *
328
+ * @param {IFileManager} parent - specifies the parent element.
329
+ * @param {boolean} isKeepBoth - checks the arguement to keep both.
330
+ * @returns {void}
331
+ * @private
332
+ */
333
+ function retryDlgUpdate(parent: IFileManager, isKeepBoth: boolean): void {
334
+ if (parent.isApplySame) {
335
+ if (isKeepBoth) { onKeepBothAll(parent); } else { onReplaceAll(parent); }
336
+ retryDlgClose(parent);
337
+ } else {
338
+ parent.retryArgs.push({
339
+ action: isKeepBoth ? 'keepboth' : 'replace',
340
+ file: parent.retryFiles[0]
341
+ });
342
+ parent.uploadObj.retry(parent.retryFiles[0]);
343
+ parent.retryFiles.splice(0, 1);
344
+ if (parent.retryFiles.length !== 0) { createExtDialog(parent, 'UploadRetry'); } else { retryDlgClose(parent); }
345
+ }
346
+ }
347
+
348
+ /**
349
+ *
350
+ * @param {IFileManager} parent - specifies the parent element.
351
+ * @returns {void}
352
+ * @private
353
+ */
354
+ function retryDlgClose(parent: IFileManager): void {
355
+ let flag: boolean = true;
356
+ if (parent.isRetryOpened) { parent.isRetryOpened = false; } else { flag = false; }
357
+ const ele: Element = select('.e-dlg-checkbox', parent.extDialogObj.element);
358
+ if (ele) { remove(ele); }
359
+ if (flag) { parent.extDialogObj.hide(); } else {
360
+ parent.retryFiles = [];
361
+ }
362
+ }
363
+
364
+ /**
365
+ *
366
+ * @param {IFileManager} parent - specifies the parent element.
367
+ * @param {object} args - specifies the arguements.
368
+ * @returns {void}
369
+ * @private
370
+ */
371
+ function onRetryOpen(parent: IFileManager, args: object): void {
372
+ parent.isRetryOpened = true;
373
+ const dialogEle: Element = getValue('element', args);
374
+ const container: Element = select('.e-dlg-content', dialogEle);
375
+ const checkContainer: Element = parent.createElement('div', {
376
+ className: 'e-dlg-checkbox'
377
+ });
378
+ const checkbox: Element = parent.createElement('input', {
379
+ id: parent.element.id + '_applyall'
380
+ });
381
+ checkContainer.appendChild(checkbox);
382
+ container.appendChild(checkContainer);
383
+ const checkBoxObj: CheckBox = new CheckBox({
384
+ label: getLocaleText(parent, 'ApplyAll-Label'),
385
+ change: (args: ChangeEventArgs) => {
386
+ parent.isApplySame = args.checked;
387
+ }
388
+ });
389
+ checkBoxObj.appendTo('#' + parent.element.id + '_applyall');
390
+ triggerPopupOpen(parent, parent.extDialogObj, 'Retry Upload');
391
+ }
392
+
393
+ /**
394
+ *
395
+ * @param {IFileManager} parent - specifies the parent element.
396
+ * @returns {void}
397
+ * @private
398
+ */
399
+ function onKeepBothAll(parent: IFileManager): void {
400
+ while (parent.retryFiles.length !== 0) {
401
+ parent.retryArgs.push({ action: 'keepboth', file: parent.retryFiles[0] });
402
+ parent.uploadObj.retry(parent.retryFiles[0]);
403
+ parent.retryFiles.splice(0, 1);
404
+ }
405
+ }
406
+
407
+ /**
408
+ *
409
+ * @param {IFileManager} parent - specifies the parent element.
410
+ * @returns {void}
411
+ * @private
412
+ */
413
+ function onReplaceAll(parent: IFileManager): void {
414
+ while (parent.retryFiles.length !== 0) {
415
+ parent.retryArgs.push({ action: 'replace', file: parent.retryFiles[0] });
416
+ parent.uploadObj.retry(parent.retryFiles[0]);
417
+ parent.retryFiles.splice(0, 1);
418
+ }
419
+ }
420
+
421
+ /**
422
+ *
423
+ * @param {IFileManager} parent - specifies the parent element.
424
+ * @returns {void}
425
+ * @private
426
+ */
427
+ function focusInput(parent: IFileManager): void {
428
+ const ele: HTMLInputElement = (select('#newname', parent.dialogObj.element) as HTMLInputElement);
429
+ ele.focus();
430
+ ele.value = '';
431
+ const len: number = ele.value.length;
432
+ ele.setSelectionRange(0, len);
433
+ }
434
+
435
+ /**
436
+ *
437
+ * @param {IFileManager} parent - specifies the parent element.
438
+ * @returns {void}
439
+ * @private
440
+ */
441
+ function onFolderDialogOpen(parent: IFileManager): void {
442
+ const ele: HTMLInputElement = (select('#newname', parent.dialogObj.element) as HTMLInputElement);
443
+ if (!ele.parentElement.classList.contains('e-control-wrapper')) {
444
+ createInput(ele, getLocaleText(parent, 'Content-NewFolder'));
445
+ }
446
+ ele.parentElement.nextElementSibling.innerHTML = '';
447
+ ele.oninput = () => {
448
+ onValidate(parent, ele);
449
+ };
450
+ ele.onkeyup = (e: KeyboardEvent) => {
451
+ const code: number = getKeyCode(e);
452
+ if (code === 13) {
453
+ onSubmit(parent);
454
+ }
455
+ };
456
+ focusInput(parent);
457
+ triggerPopupOpen(parent, parent.dialogObj, 'Create Folder');
458
+ }
459
+
460
+ /**
461
+ *
462
+ * @param {IFileManager} parent - specifies the parent element.
463
+ * @returns {void}
464
+ * @private
465
+ */
466
+ function onRenameDialogOpen(parent: IFileManager): void {
467
+ const inputEle: HTMLInputElement = (select('#rename', parent.dialogObj.element) as HTMLInputElement);
468
+ if (!inputEle.parentElement.classList.contains('e-control-wrapper')) {
469
+ createInput(inputEle, getLocaleText(parent, 'Content-Rename'));
470
+ }
471
+ inputEle.parentElement.nextElementSibling.innerHTML = '';
472
+ inputEle.oninput = () => {
473
+ onValidate(parent, inputEle);
474
+ };
475
+ inputEle.onkeyup = (e: KeyboardEvent) => {
476
+ const code: number = getKeyCode(e);
477
+ if (code === 13) {
478
+ onReSubmit(parent);
479
+ }
480
+ };
481
+ onFocusRenameInput(parent, inputEle);
482
+ triggerPopupOpen(parent, parent.dialogObj, 'Rename');
483
+ }
484
+
485
+ /**
486
+ *
487
+ * @param {IFileManager} parent - specifies the parent element.
488
+ * @param {HTMLInputElement} inputEle - specifies the input element.
489
+ * @returns {void}
490
+ * @private
491
+ */
492
+ function onFocusRenameInput(parent: IFileManager, inputEle: HTMLInputElement): void {
493
+ inputEle.focus();
494
+ let txt: string = '';
495
+ if (parent.isFile && !parent.showFileExtension) {
496
+ const index: number = parent.currentItemText.lastIndexOf('.');
497
+ txt = (index === -1) ? parent.currentItemText : parent.currentItemText.substring(0, index);
498
+ } else {
499
+ txt = parent.currentItemText;
500
+ }
501
+ inputEle.value = txt;
502
+ if (parent.isFile && parent.showFileExtension && (inputEle.value.indexOf('.') !== -1)) {
503
+ inputEle.setSelectionRange(0, inputEle.value.lastIndexOf('.'));
504
+ } else {
505
+ inputEle.setSelectionRange(0, inputEle.value.length);
506
+ }
507
+ }
508
+
509
+ /**
510
+ *
511
+ * @param {HTMLInputElement} ele - specifies the element.
512
+ * @param {string} placeholder - specifies the place holder.
513
+ * @returns {void}
514
+ * @private
515
+ */
516
+ function createInput(ele: HTMLInputElement, placeholder: string): void {
517
+ Input.createInput({
518
+ element: ele,
519
+ properties: {
520
+ placeholder: placeholder
521
+ }
522
+ });
523
+ }
524
+
525
+ /**
526
+ *
527
+ * @param {IFileManager} parent - specifies the parent element.
528
+ * @param {string} text - specifies the text string.
529
+ * @param {ReadArgs | SelectedEventArgs} e - specifies the event arguements.
530
+ * @param {FileDetails} details - specifies the file details.
531
+ * @returns {DialogOptions} - specifies the dialog options.
532
+ * @private
533
+ */
534
+ function getOptions(parent: IFileManager, text: string, e?: ReadArgs | SelectedEventArgs,
535
+ details?: FileDetails): DialogOptions {
536
+ const options: DialogOptions = {
537
+ header: '', content: '', buttons: [], dialogName: ''
538
+ };
539
+ let permission: string; let formattedString: string; let intl: Internationalization;
540
+ let strArr: string[]; let fileType: string; let location: string;
541
+ options.open = () => { triggerPopupOpen(parent, parent.dialogObj, options.dialogName); };
542
+ options.close = () => { triggerPopupClose(parent, parent.dialogObj, options.dialogName); };
543
+ text = (details && details.multipleFiles === true) ? 'MultipleFileDetails' : text;
544
+ let index: number;
545
+ switch (text) {
546
+ case 'NewFolder':
547
+ options.dialogName = 'Create Folder';
548
+ options.header = getLocaleText(parent, 'Header-NewFolder');
549
+ options.content = '<input type="text" value="New folder" id="newname"><div class="e-fe-error"></div>';
550
+ options.buttons = [
551
+ {
552
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Create') },
553
+ click: (e: KeyboardEvent) => {
554
+ if (e.type === 'keydown') { return; }
555
+ onSubmit(parent);
556
+ }
557
+ }
558
+ ];
559
+ options.open = onFolderDialogOpen.bind(this, parent);
560
+ break;
561
+ case 'Delete':
562
+ options.dialogName = 'Delete';
563
+ if (parent.selectedItems.length > 1) {
564
+ options.content = ('<div>' + getLocaleText(parent, 'Content-Multiple-Delete') + '</div>')
565
+ .replace('{0}', parent.selectedItems.length.toString());
566
+ options.header = getLocaleText(parent, 'Header-Multiple-Delete');
567
+ } else {
568
+ options.content = '<div>' + getLocaleText(parent, parent.isFile ? 'Content-Delete' : 'Content-Folder-Delete') + '</div>';
569
+ options.header = getLocaleText(parent, parent.isFile ? 'Header-Delete' : 'Header-Folder-Delete');
570
+ }
571
+ options.buttons = [
572
+ {
573
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Yes') },
574
+ click: () => {
575
+ onDeleteSubmit(parent);
576
+ }
577
+ },
578
+ {
579
+ buttonModel: { content: getLocaleText(parent, 'Button-No') },
580
+ click: () => {
581
+ parent.dialogObj.hide();
582
+ }
583
+ }
584
+ ];
585
+ break;
586
+ case 'Rename':
587
+ options.dialogName = 'Rename';
588
+ options.header = getLocaleText(parent, 'Header-Rename');
589
+ options.content = '<input type="text" class="e-input" id="rename"><div class="e-fe-error"></div>';
590
+ options.buttons = [
591
+ {
592
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Save') },
593
+ click: (e: KeyboardEvent) => {
594
+ if (e.type === 'keydown') { return; }
595
+ onReSubmit(parent);
596
+ }
597
+ }
598
+ ];
599
+ options.open = onRenameDialogOpen.bind(this, parent);
600
+ break;
601
+ case 'details':
602
+ options.dialogName = 'File Details';
603
+ intl = new Internationalization(parent.locale);
604
+ formattedString = intl.formatDate(new Date(details.modified), { format: 'MMMM dd, yyyy HH:mm:ss' });
605
+ permission = '';
606
+ if (!isNOU(details.permission)) {
607
+ permission = '<tr><td>' + getLocaleText(parent, 'Permission') + '</td><td class="' + CLS.VALUE + '" >'
608
+ + objectToString(details.permission) + '</td></tr>';
609
+ }
610
+ options.header = details.name;
611
+ options.content = '<table>' +
612
+ '<tr><td>' + getLocaleText(parent, 'Type') + '</td><td class="' + CLS.VALUE + '" title="' +
613
+ (details.isFile ? 'File' : 'Folder') + '">' + (details.isFile ? 'File' : 'Folder') + '</td></tr>' +
614
+ '<tr><td>' + getLocaleText(parent, 'Size') + '</td><td><span class="' + CLS.VALUE + '" title ="' +
615
+ details.size + '">' + details.size + '</span></td></tr>' +
616
+ '<tr><td>' + getLocaleText(parent, 'Location') + '</td><td class="' + CLS.VALUE + '" title="' +
617
+ details.location + '">' + details.location + '</td></tr>' +
618
+ '<tr><td>' + getLocaleText(parent, 'Modified') + '</td><td class="' + CLS.VALUE + '" >'
619
+ + formattedString + '</td></tr>'
620
+ + permission + '</table>';
621
+ options.buttons = [
622
+ {
623
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Ok') },
624
+ click: () => {
625
+ parent.dialogObj.hide();
626
+ }
627
+ }
628
+ ];
629
+ break;
630
+ case 'MultipleFileDetails':
631
+ options.dialogName = 'File Details';
632
+ strArr = parent.itemData.map((val: FileDetails) => {
633
+ index = val.name.indexOf('.') + 1;
634
+ return (index === 0 && (!val.isFile)) ? 'Folder' : ((index !== 0) ? val.name.substr(index).replace(' ', '') : 'undetermined');
635
+ });
636
+ if (strArr[0] === undefined) {
637
+ strArr = details.name.split(',').map((val: string) => {
638
+ index = val.indexOf('.') + 1;
639
+ return (index === 0) ? 'Folder' : val.substr(index).replace(' ', '');
640
+ });
641
+ }
642
+ fileType = strArr.every((val: string, i: number, arr: string[]) => val === arr[0]) ?
643
+ ((strArr[0] === 'Folder') ? 'Folder' : strArr[0].toLocaleUpperCase() + ' Type') : 'Multiple Types';
644
+ location = details.location;
645
+ options.header = details.name;
646
+ options.content = '<table><tr><td>' + getLocaleText(parent, 'Type')
647
+ + ':</td><td class="' + CLS.VALUE + '">' + fileType + '</td></tr>' +
648
+ '<tr><td>' + getLocaleText(parent, 'Size') + ':</td><td>' +
649
+ details.size + '<span class="' + CLS.VALUE + '" title ="' + details.size
650
+ + '"></span></td></tr>' + '<tr><td>' + getLocaleText(parent, 'Location') +
651
+ ':</td><td class="' + CLS.VALUE + '" title="' + location + '">'
652
+ + location + '</td></tr>' + '</table>';
653
+ options.buttons = [
654
+ {
655
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Ok') },
656
+ click: (e: KeyboardEvent) => {
657
+ if (e.type === 'keydown') { return; }
658
+ parent.dialogObj.hide();
659
+ }
660
+ }
661
+ ];
662
+ break;
663
+ case 'Error':
664
+ parent.notify(events.actionFailure, {});
665
+ options.dialogName = 'Error';
666
+ if ((<ReadArgs>e).error.code === '401') {
667
+ options.header = '<span class="e-fe-icon e-fe-access-error"></span><div class="e-fe-access-header">' +
668
+ getLocaleText(parent, 'Access-Denied') + '</div>';
669
+ } else {
670
+ options.header = getLocaleText(parent, 'Error');
671
+ }
672
+ options.content = '<div class="' + CLS.ERROR_CONTENT + '">' + (<ReadArgs>e).error.message + '</div>';
673
+ options.buttons = [
674
+ {
675
+ buttonModel: { isPrimary: true, content: getLocaleText(parent, 'Button-Ok') },
676
+ click: () => {
677
+ parent.dialogObj.hide();
678
+ }
679
+ }
680
+ ];
681
+ break;
682
+ }
683
+ return options;
684
+ }
685
+
686
+ /**
687
+ *
688
+ * @param {IFileManager} parent - specifies the parent element.
689
+ * @param {string} dialogName - specifies the dialog name.
690
+ * @param {BeforeOpenEventArgs} args - specifies the before open event arguements.
691
+ * @returns {void}
692
+ * @private
693
+ */
694
+ function keydownAction(parent: IFileManager, dialogName: string, args: BeforeOpenEventArgs): void {
695
+ const btnElement: HTMLInputElement[] = (selectAll('.e-btn', parent.dialogObj.element) as HTMLInputElement[]);
696
+ preventKeydown(btnElement);
697
+ triggerPopupBeforeOpen(parent, parent.dialogObj, args, dialogName);
698
+ }
699
+
700
+ /**
701
+ *
702
+ * @param {IFileManager} parent - specifies the parent element.
703
+ * @param {string} dlgName - specifies the dialog name.
704
+ * @param {BeforeOpenEventArgs} args - specifies the before open event arguements.
705
+ * @returns {void}
706
+ * @private
707
+ */
708
+ function beforeExtOpen(parent: IFileManager, dlgName: string, args: BeforeOpenEventArgs): void {
709
+ const btnElement: HTMLInputElement[] = (selectAll('.e-btn', parent.extDialogObj.element) as HTMLInputElement[]);
710
+ preventKeydown(btnElement);
711
+ triggerPopupBeforeOpen(parent, parent.extDialogObj, args, dlgName);
712
+ }
713
+
714
+ /**
715
+ *
716
+ * @param {HTMLInputElement[]} btnElement - specifies the button element.
717
+ * @returns {void}
718
+ * @private
719
+ */
720
+ function preventKeydown(btnElement: HTMLInputElement[]): void {
721
+ for (let btnCount: number = 0; btnCount < btnElement.length; btnCount++) {
722
+ btnElement[btnCount as number].onkeydown = (e: KeyboardEvent) => {
723
+ if (e.keyCode === 13) {
724
+ e.preventDefault();
725
+ }
726
+ };
727
+ btnElement[btnCount as number].onkeyup = (e: KeyboardEvent) => {
728
+ if (e.keyCode === 13) {
729
+ btnElement[btnCount as number].click();
730
+ }
731
+ };
732
+ }
733
+ }
734
+
735
+ /**
736
+ *
737
+ * @param {IFileManager} parent - specifies the parent element.
738
+ * @param {DialogOptions} options - specifies the dialog options.
739
+ * @returns {void}
740
+ * @private
741
+ */
742
+ function changeOptions(parent: IFileManager, options: DialogOptions): void {
743
+ parent.dialogObj.header = options.header;
744
+ parent.dialogObj.content = options.content;
745
+ parent.dialogObj.buttons = options.buttons;
746
+ parent.dialogObj.enableRtl = parent.enableRtl;
747
+ parent.dialogObj.open = options.open;
748
+ parent.dialogObj.close = options.close;
749
+ parent.dialogObj.beforeOpen = keydownAction.bind(this, parent, options.dialogName);
750
+ parent.dialogObj.beforeClose = (args: BeforeCloseEventArgs) => {
751
+ triggerPopupBeforeClose(parent, parent.dialogObj, args, options.dialogName);
752
+ };
753
+ parent.dialogObj.dataBind();
754
+ parent.dialogObj.show();
755
+ }
756
+
757
+ /**
758
+ *
759
+ * @param {IFileManager} parent - specifies the parent element.
760
+ * @returns {void}
761
+ * @private
762
+ */
763
+ function onSubmit(parent: IFileManager): void {
764
+ const ele: HTMLInputElement = select('#newname', parent.dialogObj.element) as HTMLInputElement;
765
+ onSubmitValidate(parent, ele);
766
+ if (ele.parentElement.nextElementSibling.innerHTML !== '') {
767
+ return;
768
+ }
769
+ createFolder(parent, ele.value);
770
+ }
771
+ /* istanbul ignore next */
772
+ /**
773
+ *
774
+ * @param {IFileManager} parent - specifies the parent element.
775
+ * @returns {void}
776
+ * @private
777
+ */
778
+ function onReSubmit(parent: IFileManager): void {
779
+ const ele: HTMLInputElement = select('#rename', parent.dialogObj.element) as HTMLInputElement;
780
+ onSubmitValidate(parent, ele);
781
+ if (ele.parentElement.nextElementSibling.innerHTML !== '') {
782
+ return;
783
+ }
784
+ let text: string = ele.value;
785
+ const oIndex: number = parent.currentItemText.lastIndexOf('.');
786
+ if (parent.isFile && !parent.showFileExtension) {
787
+ const extn: string = (oIndex === -1) ? '' : parent.currentItemText.substr(oIndex);
788
+ text += extn;
789
+ }
790
+ parent.renameText = text;
791
+ if (parent.currentItemText === text) {
792
+ parent.dialogObj.hide();
793
+ return;
794
+ }
795
+ let newPath: string = '';
796
+ if (parent.activeModule === 'navigationpane') {
797
+ newPath = getTargetPath(parent, parent.itemData[0]);
798
+ }
799
+ else {
800
+ newPath = parent.path;
801
+ }
802
+ parent.renamedId = getValue('id', parent.itemData[0]);
803
+ if (parent.isFile) {
804
+ const oldExtension: string = (oIndex === -1) ? '' : parent.currentItemText.substr(oIndex);
805
+ const nIndex: number = text.lastIndexOf('.');
806
+ const newExtension: string = (nIndex === -1) ? '' : text.substr(nIndex);
807
+ if (parent.showFileExtension && oldExtension !== newExtension) {
808
+ createExtDialog(parent, 'Extension', null, newPath);
809
+ } else {
810
+ rename(parent, newPath, text);
811
+ }
812
+ } else {
813
+ rename(parent, newPath, text);
814
+ }
815
+ }
816
+
817
+ /**
818
+ *
819
+ * @param {IFileManager} parent - specifies the parent element.
820
+ * @returns {void}
821
+ * @private
822
+ */
823
+ function onDeleteSubmit(parent: IFileManager): void {
824
+ parent.dialogObj.hide();
825
+ parent.notify(events.deleteInit, {});
826
+ }
827
+
828
+ /**
829
+ *
830
+ * @param {IFileManager} parent - specifies the parent element.
831
+ * @param {HTMLInputElement} ele - specifies the input element.
832
+ * @returns {void}
833
+ * @private
834
+ */
835
+ function onValidate(parent: IFileManager, ele: HTMLInputElement): void {
836
+ if (/[/\\|*?"<>:]/.test(ele.value)) {
837
+ addInvalid(parent, ele);
838
+ } else if (ele.value === '') {
839
+ ele.parentElement.nextElementSibling.innerHTML = getLocaleText(parent, 'Validation-Empty');
840
+ } else {
841
+ ele.parentElement.nextElementSibling.innerHTML = '';
842
+ }
843
+ }
844
+
845
+ /**
846
+ *
847
+ * @param {IFileManager} parent - specifies the parent element.
848
+ * @param {HTMLInputElement} ele - specifies the input element.
849
+ * @returns {void}
850
+ * @private
851
+ */
852
+ function onSubmitValidate(parent: IFileManager, ele: HTMLInputElement): void {
853
+ onValidate(parent, ele);
854
+ const len: number = ele.value.length - 1;
855
+ if (ele.value !== '' && ((ele.value.lastIndexOf('.') === len) || (ele.value.lastIndexOf(' ') === len)) &&
856
+ (parent.showFileExtension || (ele.value.lastIndexOf('.') === -1 || ele.value.substring(ele.value.indexOf('.') + 1).length === 0))) {
857
+ addInvalid(parent, ele);
858
+ }
859
+ }
860
+
861
+ /**
862
+ *
863
+ * @param {IFileManager} parent - specifies the parent element.
864
+ * @param {HTMLInputElement} ele - specifies the input element.
865
+ * @returns {void}
866
+ * @private
867
+ */
868
+ function addInvalid(parent: IFileManager, ele: HTMLInputElement): void {
869
+ const error: string = getLocaleText(parent, 'Validation-Invalid').replace('{0}', '"' + ele.value + '"');
870
+ if (parent.enableHtmlSanitizer) {
871
+ ele.parentElement.nextElementSibling.textContent = error;
872
+ }
873
+ else {
874
+ ele.parentElement.nextElementSibling.innerHTML = error;
875
+ }
876
+ }
877
+
878
+ /**
879
+ *
880
+ * @param {KeyboardEvent} e - specifies the keyboard event.
881
+ * @returns {number} - returns the key code.
882
+ * @private
883
+ */
884
+ function getKeyCode(e: KeyboardEvent): number {
885
+ let code: number;
886
+ if (e.keyCode) {
887
+ code = e.keyCode;
888
+ } else if (e.which) {
889
+ code = e.which;
890
+ } else {
891
+ code = e.charCode;
892
+ }
893
+ return code;
894
+ }
895
+
896
+ /**
897
+ *
898
+ * @param {IFileManager} parent - specifies the parent element.
899
+ * @param {string} header - specifies the header element.
900
+ * @param {BeforeImageLoadEventArgs} imageData - specifies the image eventargs.
901
+ * @returns {void}
902
+ * @private
903
+ */
904
+ export function createImageDialog(parent: IFileManager, header: string, imageData: BeforeImageLoadEventArgs): void {
905
+ const content: HTMLElement = createElement('div', { className: 'e-image-wrap' });
906
+ if (imageData.useImageAsUrl) {
907
+ const image: HTMLElement = createElement('img', { className: 'e-image', attrs: { src: imageData.imageUrl, alt: header } });
908
+ content.appendChild(image);
909
+ }
910
+ else {
911
+ const fetch: Fetch = new Fetch({
912
+ url: getValue('url', imageData.ajaxSettings),
913
+ type: getValue('type', imageData.ajaxSettings),
914
+ contentType: getValue('contentType', imageData.ajaxSettings),
915
+ responseType: getValue('responseType', imageData.ajaxSettings),
916
+ beforeSend: getValue('beforeSend', imageData.ajaxSettings),
917
+ onSuccess: (e: Blob) => {
918
+ const blobUrl: string = URL.createObjectURL(e);
919
+ const image: HTMLElement = createElement('img', { className: 'e-image', attrs: { src: blobUrl, alt: header } });
920
+ content.appendChild(image);
921
+ triggerFetchSuccess(parent, imageData.ajaxSettings);
922
+ },
923
+ onFailure: (e: Response) => {
924
+ const result: ReadArgs = {
925
+ error: {
926
+ code: e.status.toString(),
927
+ message: getLocaleText(parent, 'Network-Error') + ' ' + getValue('url', imageData.ajaxSettings)
928
+ }
929
+ };
930
+ triggerFetchFailure(parent, imageData.ajaxSettings, result);
931
+ }
932
+ });
933
+ const data: object = getValue('data', imageData.ajaxSettings);
934
+ fetch.send(data);
935
+ }
936
+ if (isNOU(parent.viewerObj)) {
937
+ parent.viewerObj = new Dialog({
938
+ header: header,
939
+ content: content,
940
+ animationSettings: { effect: 'None' },
941
+ showCloseIcon: true,
942
+ closeOnEscape: true,
943
+ visible: true,
944
+ isModal: true,
945
+ width: '350px',
946
+ height: '350px',
947
+ target: parent.popupTarget ? parent.popupTarget : '#' + parent.element.id,
948
+ cssClass: getCssClass(parent, parent.isMobile ? CLS.MOB_POPUP : CLS.ROOT_POPUP),
949
+ locale: parent.locale,
950
+ enableResize: true,
951
+ allowDragging: true,
952
+ enableHtmlSanitizer: parent.enableHtmlSanitizer,
953
+ position: { X: 'center', Y: 'center' },
954
+ enableRtl: parent.enableRtl,
955
+ open: openImage.bind(this, parent),
956
+ close: () => { triggerPopupClose(parent, parent.viewerObj, 'Image Preview'); },
957
+ beforeOpen: (args: BeforeOpenEventArgs) => {
958
+ triggerPopupBeforeOpen(parent, parent.viewerObj, args, 'Image Preview');
959
+ },
960
+ beforeClose: (args: BeforeCloseEventArgs) => {
961
+ triggerPopupBeforeClose(parent, parent.viewerObj, args, 'Image Preview');
962
+ },
963
+ resizing: updateImage.bind(this, parent),
964
+ resizeStop: updateImage.bind(this, parent)
965
+ });
966
+ parent.viewerObj.isStringTemplate = true;
967
+ parent.viewerObj.appendTo('#' + parent.element.id + CLS.IMG_DIALOG_ID);
968
+ } else {
969
+ parent.viewerObj.refresh();
970
+ parent.viewerObj.header = header;
971
+ parent.viewerObj.content = content;
972
+ parent.viewerObj.enableRtl = parent.enableRtl;
973
+ parent.viewerObj.dataBind();
974
+ parent.viewerObj.show();
975
+ }
976
+ }
977
+
978
+
979
+ /**
980
+ *
981
+ * @param {IFileManager} parent - specifies the parent element.
982
+ * @returns {void}
983
+ * @private
984
+ */
985
+ function openImage(parent: IFileManager): void {
986
+ setTimeout(() => {
987
+ if (parent.viewerObj) {
988
+ parent.viewerObj.element.focus();
989
+ }
990
+ });
991
+ updateImage(parent);
992
+ triggerPopupOpen(parent, parent.viewerObj, 'Image Preview');
993
+ }
994
+
995
+ /**
996
+ *
997
+ * @param {IFileManager} parent - specifies the parent element.
998
+ * @returns {void}
999
+ * @private
1000
+ */
1001
+ function updateImage(parent: IFileManager): void {
1002
+ const content: HTMLElement = <HTMLElement>select('.e-dlg-content', parent.viewerObj.element);
1003
+ const imgWrap: HTMLElement = <HTMLElement>select('.e-image-wrap', parent.viewerObj.element);
1004
+ const cssObj: CSSStyleDeclaration = window.getComputedStyle(content, null);
1005
+ const paddingWidth: number = cssObj ? (2 * parseFloat(cssObj.paddingRight)) : 36;
1006
+ const paddingHeight: number = cssObj ? (2 * parseFloat(cssObj.paddingBottom)) : 20;
1007
+ imgWrap.style.width = (content.offsetWidth - paddingWidth) + 'px';
1008
+ imgWrap.style.height = (content.offsetHeight - paddingHeight) + 'px';
1009
+ }