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

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