@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,498 @@
1
+ import { Toolbar as BaseToolbar, ItemModel, ClickEventArgs, MenuEventArgs, DisplayMode } from '@syncfusion/ej2-navigations';
2
+ import { select, isNullOrUndefined as isNOU, closest, selectAll } from '@syncfusion/ej2-base';
3
+ import { createDialog } from '../pop-up/dialog';
4
+ import * as events from '../base/constant';
5
+ import * as CLS from '../base/classes';
6
+ import { IFileManager, NotifyArgs, ToolbarClickEventArgs, ToolbarCreateEventArgs } from '../base/interface';
7
+ import { refresh, getPathObject, getLocaleText, getCssClass, sortbyClickHandler } from '../common/utility';
8
+ import { createDeniedDialog, updateLayout } from '../common/utility';
9
+ import { GetDetails } from '../common/operations';
10
+ import { DropDownButton, ItemModel as SplitButtonItemModel } from '@syncfusion/ej2-splitbuttons';
11
+ import { cutFiles, copyFiles, pasteHandler, hasEditAccess } from '../common/index';
12
+ import { doDownload, createNewFolder, uploadItem } from '../common/index';
13
+
14
+ /**
15
+ * Toolbar module
16
+ */
17
+ export class Toolbar {
18
+
19
+ /* Internal variables */
20
+ private parent: IFileManager;
21
+ private items: ItemModel[];
22
+ private buttonObj: DropDownButton;
23
+ private layoutBtnObj: DropDownButton;
24
+ private default: string[] = ['Delete', 'Rename', 'Download', 'Cut', 'Copy', 'Paste'];
25
+ private single: string[] = ['Delete', 'Rename', 'Download', 'Cut', 'Copy'];
26
+ private multiple: string[] = ['Delete', 'Download', 'Cut', 'Copy', 'Refresh'];
27
+ private selection: string[] = ['NewFolder', 'Upload', 'SortBy', 'Refresh'];
28
+
29
+ /* public variable */
30
+ public toolbarObj: BaseToolbar;
31
+
32
+ /**
33
+ * Constructor for the Toolbar module
34
+ *
35
+ * @hidden
36
+ * @param {IFileManager} parent - specifies the parent element.
37
+ * @private
38
+ */
39
+ constructor(parent?: IFileManager) {
40
+ this.parent = parent;
41
+ this.render();
42
+ this.addEventListener();
43
+ }
44
+
45
+ private render(): void {
46
+ this.items = this.toolbarItemData(this.getItems(this.parent.toolbarSettings.items.map((item: string) => item.trim())));
47
+ const eventArgs: ToolbarCreateEventArgs = { items: this.items };
48
+ this.parent.trigger('toolbarCreate', eventArgs, (toolbarCreateArgs: ToolbarCreateEventArgs) => {
49
+ this.items = toolbarCreateArgs.items;
50
+ this.toolbarObj = new BaseToolbar({
51
+ items: this.items,
52
+ created: this.toolbarCreateHandler.bind(this),
53
+ overflowMode: 'Popup',
54
+ clicked: this.onClicked.bind(this),
55
+ enableHtmlSanitizer: this.parent.enableHtmlSanitizer,
56
+ enableRtl: this.parent.enableRtl
57
+ });
58
+ this.toolbarObj.isStringTemplate = true;
59
+ this.toolbarObj.appendTo('#' + this.parent.element.id + CLS.TOOLBAR_ID);
60
+ });
61
+ }
62
+
63
+ public getItemIndex(item: string): number {
64
+ const itemId: string = this.getId(item);
65
+ for (let i: number = 0; i < this.items.length; i++) {
66
+ if (this.items[i].id === itemId) {
67
+ return i;
68
+ }
69
+ }
70
+ return -1;
71
+ }
72
+
73
+ private getItems(items: string[]): string[] {
74
+ const currItems: string[] = items.slice();
75
+ if (this.parent.isDevice && this.parent.allowMultiSelection) { currItems.push('SelectAll'); }
76
+ return currItems;
77
+ }
78
+ /* istanbul ignore next */
79
+ private onClicked(args: ClickEventArgs): void {
80
+ if (isNOU(args.item) || !args.item.id) { return; }
81
+ const tool: string = args.item.id.substr((this.parent.element.id + '_tb_').length);
82
+ // eslint-disable-next-line
83
+ let details: Object[];
84
+ if (tool === 'refresh' || tool === 'newfolder' || tool === 'upload') {
85
+ details = [getPathObject(this.parent)];
86
+ this.parent.itemData = details;
87
+ } else {
88
+ this.parent.notify(events.selectedData, {});
89
+ details = this.parent.itemData;
90
+ }
91
+ const eventArgs: ToolbarClickEventArgs = { cancel: false, fileDetails: details, item: args.item };
92
+ this.parent.trigger('toolbarClick', eventArgs, (toolbarClickArgs: ToolbarClickEventArgs) => {
93
+ let sItems: string[];
94
+ let target: Element;
95
+ if (!toolbarClickArgs.cancel) {
96
+ switch (tool) {
97
+ case 'sortby':
98
+ target = closest((args.originalEvent.target as Element), '.' + CLS.TB_ITEM);
99
+ if (target && target.classList.contains('e-toolbar-popup')) {
100
+ args.cancel = true;
101
+ }
102
+ break;
103
+ case 'newfolder':
104
+ createNewFolder(this.parent);
105
+ break;
106
+ case 'cut':
107
+ cutFiles(this.parent);
108
+ break;
109
+ case 'copy':
110
+ copyFiles(this.parent);
111
+ break;
112
+ case 'delete':
113
+ for (let i: number = 0; i < details.length; i++) {
114
+ if (!hasEditAccess(details[i])) {
115
+ createDeniedDialog(this.parent, details[i], events.permissionEdit);
116
+ return;
117
+ }
118
+ }
119
+ createDialog(this.parent, 'Delete');
120
+ break;
121
+ case 'details':
122
+ this.parent.notify(events.detailsInit, {});
123
+ sItems = this.parent.selectedItems;
124
+ if (this.parent.activeModule === 'navigationpane') {
125
+ sItems = [];
126
+ }
127
+ GetDetails(this.parent, sItems, this.parent.path, 'details');
128
+ break;
129
+ case 'paste':
130
+ this.parent.folderPath = '';
131
+ pasteHandler(this.parent);
132
+ break;
133
+ case 'refresh':
134
+ refresh(this.parent);
135
+ break;
136
+ case 'download':
137
+ doDownload(this.parent);
138
+ break;
139
+ case 'rename':
140
+ if (!hasEditAccess(details[0])) {
141
+ createDeniedDialog(this.parent, details[0], events.permissionEdit);
142
+ } else {
143
+ this.parent.notify(events.renameInit, {});
144
+ createDialog(this.parent, 'Rename');
145
+ }
146
+ break;
147
+ case 'upload':
148
+ uploadItem(this.parent);
149
+ break;
150
+ case 'selectall':
151
+ this.parent.notify(events.selectAllInit, {});
152
+ break;
153
+ case 'selection':
154
+ this.parent.notify(events.clearAllInit, {});
155
+ break;
156
+ }
157
+ }
158
+ });
159
+ }
160
+
161
+ private toolbarCreateHandler(): void {
162
+ if (!isNOU(select('#' + this.getId('SortBy'), this.parent.element))) {
163
+ const items: SplitButtonItemModel[] = [
164
+ { id: this.getPupupId('name'), text: getLocaleText(this.parent, 'Name'),
165
+ iconCss: this.parent.sortBy === 'name' ? CLS.TB_OPTION_DOT : '' },
166
+ { id: this.getPupupId('size'), text: getLocaleText(this.parent, 'Size'),
167
+ iconCss: this.parent.sortBy === 'size' ? CLS.TB_OPTION_DOT : '' },
168
+ { id: this.getPupupId('date'), text: getLocaleText(this.parent, 'DateModified'),
169
+ iconCss: this.parent.sortBy === '_fm_modified' ? CLS.TB_OPTION_DOT : '' },
170
+ { separator: true },
171
+ { id: this.getPupupId('ascending'), text: getLocaleText(this.parent, 'Ascending'),
172
+ iconCss: this.parent.sortOrder === 'Ascending' ? CLS.TB_OPTION_TICK : '' },
173
+ { id: this.getPupupId('descending'), text: getLocaleText(this.parent, 'Descending'),
174
+ iconCss: this.parent.sortOrder === 'Descending' ? CLS.TB_OPTION_TICK : '' },
175
+ { id: this.getPupupId('none'), text: getLocaleText(this.parent, 'None'),
176
+ iconCss: this.parent.sortOrder === 'None' ? CLS.TB_OPTION_TICK : '' }
177
+ ];
178
+ this.buttonObj = new DropDownButton({
179
+ items: items, cssClass: getCssClass(this.parent, CLS.ROOT_POPUP),
180
+ select: sortbyClickHandler.bind(this, this.parent as IFileManager),
181
+ enableHtmlSanitizer: this.parent.enableHtmlSanitizer,
182
+ enableRtl: this.parent.enableRtl, iconCss: CLS.ICON_SHORTBY
183
+ });
184
+ this.buttonObj.isStringTemplate = true;
185
+ this.buttonObj.appendTo('#' + this.getId('SortBy'));
186
+ }
187
+ if (!isNOU(select('#' + this.getId('View'), this.parent.element))) {
188
+ const gridSpan: string = '<span class="' + CLS.ICON_GRID + ' ' + CLS.MENU_ICON + '"></span>';
189
+ const largeIconSpan: string = '<span class="' + CLS.ICON_LARGE + ' ' + CLS.MENU_ICON + '"></span>';
190
+ const layoutItems: SplitButtonItemModel[] = [
191
+ {
192
+ id: this.getPupupId('large'), text: largeIconSpan + getLocaleText(this.parent, 'View-LargeIcons'),
193
+ iconCss: this.parent.view === 'Details' ? '' : CLS.TB_OPTION_TICK
194
+ },
195
+ {
196
+ id: this.getPupupId('details'), text: gridSpan + getLocaleText(this.parent, 'View-Details'),
197
+ iconCss: this.parent.view === 'Details' ? CLS.TB_OPTION_TICK : ''
198
+ }
199
+ ];
200
+ this.layoutBtnObj = new DropDownButton({
201
+ iconCss: this.parent.view === 'Details' ? CLS.ICON_GRID : CLS.ICON_LARGE,
202
+ cssClass: getCssClass(this.parent, 'e-caret-hide ' + CLS.ROOT_POPUP),
203
+ items: layoutItems, select: this.layoutChange.bind(this),
204
+ enableRtl: this.parent.enableRtl,
205
+ enableHtmlSanitizer: this.parent.enableHtmlSanitizer,
206
+ content: '<span class="e-tbar-btn-text">' + getLocaleText(this.parent, 'View') + '</span>'
207
+ });
208
+ this.layoutBtnObj.isStringTemplate = true;
209
+ this.layoutBtnObj.appendTo('#' + this.getId('View'));
210
+ }
211
+ this.hideItems(this.default, true);
212
+ this.hideStatus();
213
+
214
+ const btnElement: HTMLInputElement[] = (selectAll('.e-btn', this.toolbarObj.element) as HTMLInputElement[]);
215
+ for (let btnCount: number = 0; btnCount < btnElement.length; btnCount++) {
216
+ /* istanbul ignore next */
217
+ btnElement[btnCount].onkeydown = (e: KeyboardEvent) => {
218
+ if (e.keyCode === 13 && !(<HTMLElement>e.target).classList.contains('e-fe-popup')) {
219
+ e.preventDefault();
220
+ }
221
+ };
222
+ btnElement[btnCount].onkeyup = (e: KeyboardEvent) => {
223
+ if (e.keyCode === 13 && !(<HTMLElement>e.target).classList.contains('e-fe-popup')) {
224
+ btnElement[btnCount].click();
225
+ }
226
+ };
227
+ }
228
+ this.parent.refreshLayout();
229
+ }
230
+
231
+ private updateSortByButton(): void {
232
+ if (this.buttonObj) {
233
+ const items: SplitButtonItemModel[] = this.buttonObj.items;
234
+ for (let itemCount: number = 0; itemCount < items.length; itemCount++) {
235
+ if (items[itemCount].id === this.getPupupId('name')) {
236
+ items[itemCount].iconCss = this.parent.sortBy === 'name' ? CLS.TB_OPTION_DOT : '';
237
+ } else if (items[itemCount].id === this.getPupupId('size')) {
238
+ items[itemCount].iconCss = this.parent.sortBy === 'size' ? CLS.TB_OPTION_DOT : '';
239
+ } else if (items[itemCount].id === this.getPupupId('date')) {
240
+ items[itemCount].iconCss = this.parent.sortBy === '_fm_modified' ? CLS.TB_OPTION_DOT : '';
241
+ } else if (items[itemCount].id === this.getPupupId('ascending')) {
242
+ items[itemCount].iconCss = this.parent.sortOrder === 'Ascending' ? CLS.TB_OPTION_TICK : '';
243
+ } else if (items[itemCount].id === this.getPupupId('descending')) {
244
+ items[itemCount].iconCss = this.parent.sortOrder === 'Descending' ? CLS.TB_OPTION_TICK : '';
245
+ } else if (items[itemCount].id === this.getPupupId('none')) {
246
+ items[itemCount].iconCss = this.parent.sortOrder === 'None' ? CLS.TB_OPTION_TICK : '';
247
+ }
248
+ }
249
+ }
250
+ }
251
+
252
+ private getPupupId(id: string): string {
253
+ return this.parent.element.id + '_ddl_' + id.toLowerCase();
254
+ }
255
+
256
+ private layoutChange(args: MenuEventArgs): void {
257
+ if (this.parent.view === 'Details') {
258
+ if (args.item.id === this.getPupupId('large')) {
259
+ updateLayout(this.parent, 'LargeIcons');
260
+ }
261
+ } else {
262
+ if (args.item.id === this.getPupupId('details')) {
263
+ updateLayout(this.parent, 'Details');
264
+ }
265
+ }
266
+ }
267
+
268
+ private toolbarItemData(data: string[]): ItemModel[] {
269
+ const items: ItemModel[] = [];
270
+ let mode: DisplayMode = 'Both';
271
+ if (this.parent.isMobile) {
272
+ mode = 'Overflow';
273
+ }
274
+ for (let i: number = 0; i < data.length; i++) {
275
+ let item: ItemModel;
276
+ const itemId: string = this.getId(data[i]);
277
+ const itemText: string = getLocaleText(this.parent, data[i]);
278
+ const itemTooltip: string = getLocaleText(this.parent, 'Tooltip-' + data[i]);
279
+ const spanElement: string = '<span class="e-tbar-btn-text e-tbar-ddb-text">' + itemText + '</span>';
280
+ switch (data[i]) {
281
+ case '|':
282
+ item = { type: 'Separator' };
283
+ break;
284
+ case 'Upload':
285
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_UPLOAD, showTextOn: mode };
286
+ break;
287
+ case 'SortBy':
288
+ item = {
289
+ id: itemId, tooltipText: itemTooltip,
290
+ template: '<button id="' + itemId + '" class="e-tbar-btn e-tbtn-txt" tabindex="-1">' + spanElement + '</button>'
291
+ };
292
+ break;
293
+ case 'Refresh':
294
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_REFRESH, showTextOn: mode };
295
+ break;
296
+ case 'Selection':
297
+ item = {
298
+ id: itemId, text: itemText, tooltipText: itemTooltip, suffixIcon: CLS.ICON_CLEAR, overflow: 'Show',
299
+ align: 'Right'
300
+ };
301
+ break;
302
+ case 'View':
303
+ item = {
304
+ id: itemId, tooltipText: itemTooltip, prefixIcon: this.parent.view === 'Details' ? CLS.ICON_GRID : CLS.ICON_LARGE,
305
+ overflow: 'Show', align: 'Right', text: itemText, showTextOn: 'Overflow',
306
+ template: '<button id="' + itemId + '" class="e-tbar-btn e-tbtn-txt" tabindex="-1" aria-label=' +
307
+ getLocaleText(this.parent, 'View') + '></button>'
308
+ };
309
+ break;
310
+ case 'Details':
311
+ item = {
312
+ id: itemId, tooltipText: itemTooltip, prefixIcon: CLS.ICON_DETAILS, overflow: 'Show', align: 'Right',
313
+ text: itemText, showTextOn: 'Overflow'
314
+ };
315
+ break;
316
+ case 'NewFolder':
317
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_NEWFOLDER, showTextOn: mode };
318
+ break;
319
+ case 'Cut':
320
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_CUT, showTextOn: mode };
321
+ break;
322
+ case 'Copy':
323
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_COPY, showTextOn: mode };
324
+ break;
325
+ case 'Paste':
326
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_PASTE, showTextOn: mode };
327
+ break;
328
+ case 'Delete':
329
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_DELETE, showTextOn: mode };
330
+ break;
331
+ case 'Rename':
332
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_RENAME, showTextOn: mode };
333
+ break;
334
+ case 'Download':
335
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_DOWNLOAD, showTextOn: mode };
336
+ break;
337
+ case 'SelectAll':
338
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip, prefixIcon: CLS.ICON_SELECTALL, showTextOn: mode };
339
+ break;
340
+ default:
341
+ item = { id: itemId, text: itemText, tooltipText: itemTooltip };
342
+ break;
343
+ }
344
+ items.push(item);
345
+ }
346
+ return items;
347
+ }
348
+
349
+ private getId(id: string): string {
350
+ return this.parent.element.id + '_tb_' + id.toLowerCase();
351
+ }
352
+
353
+ private addEventListener(): void {
354
+ this.parent.on(events.modelChanged, this.onPropertyChanged, this);
355
+ this.parent.on(events.selectionChanged, this.onSelectionChanged, this);
356
+ this.parent.on(events.layoutChange, this.onLayoutChange, this);
357
+ this.parent.on(events.showPaste, this.showPaste, this);
358
+ this.parent.on(events.hidePaste, this.hidePaste, this);
359
+ this.parent.on(events.destroy, this.destroy, this);
360
+ this.parent.on(events.sortByChange, this.updateSortByButton, this);
361
+ }
362
+
363
+ private reRenderToolbar(e: NotifyArgs): void {
364
+ if (e.newProp.toolbarSettings.items !== undefined) {
365
+ this.items = this.toolbarItemData(this.getItems(e.newProp.toolbarSettings.items.map((item: string) => item.trim())));
366
+ const eventArgs: ToolbarCreateEventArgs = { items: this.items };
367
+ this.parent.trigger('toolbarCreate', eventArgs, (toolbarCreateArgs: ToolbarCreateEventArgs) => {
368
+ if (this.buttonObj) { this.buttonObj.destroy(); }
369
+ if (this.layoutBtnObj) { this.layoutBtnObj.destroy(); }
370
+ this.items = toolbarCreateArgs.items; this.toolbarObj.items = this.items;
371
+ this.toolbarObj.dataBind();
372
+ this.toolbarCreateHandler();
373
+ });
374
+ }
375
+ }
376
+
377
+ private onSelectionChanged(): void {
378
+ this.hideStatus();
379
+ this.hideItems(this.single, true);
380
+ this.hideItems(this.selection, false);
381
+ if (this.parent.selectedItems.length === 1) {
382
+ this.hideItems(this.single, false);
383
+ this.hideItems(this.selection, true);
384
+ } else if (this.parent.selectedItems.length > 1) {
385
+ this.hideItems(this.multiple, false);
386
+ this.hideItems(this.selection, true);
387
+ }
388
+ const ele: Element = select('#' + this.getId('Selection'), this.toolbarObj.element);
389
+ if (this.parent.selectedItems.length > 0 && ele) {
390
+ let txt: string;
391
+ if (this.parent.selectedItems.length === 1) {
392
+ txt = this.parent.selectedItems.length + ' ' + getLocaleText(this.parent, 'Item-Selection');
393
+ } else {
394
+ txt = this.parent.selectedItems.length + ' ' + getLocaleText(this.parent, 'Items-Selection');
395
+ }
396
+ select('.e-tbar-btn-text', ele).textContent = txt;
397
+ this.toolbarObj.hideItem(ele.parentElement, false);
398
+ }
399
+ }
400
+
401
+ private hideItems(tools: string[], toHide: boolean): void {
402
+ for (let i: number = 0; i < tools.length; i++) {
403
+ const ele: Element = select('#' + this.getId(tools[i]), this.parent.element);
404
+ if (ele) { this.toolbarObj.hideItem(ele.parentElement, toHide); }
405
+ }
406
+ }
407
+
408
+ private hideStatus(): void {
409
+ const ele: Element = select('#' + this.getId('Selection'), this.toolbarObj.element);
410
+ if (ele) { this.toolbarObj.hideItem(ele.parentElement, true); }
411
+ }
412
+
413
+ private showPaste(): void {
414
+ this.hideItems(['Paste'], false);
415
+ }
416
+
417
+ private hidePaste(): void {
418
+ this.hideItems(['Paste'], true);
419
+ }
420
+
421
+ private onLayoutChange(): void {
422
+ if (this.layoutBtnObj) {
423
+ this.layoutBtnObj.iconCss = this.parent.view === 'Details' ? CLS.ICON_GRID : CLS.ICON_LARGE;
424
+ const items: SplitButtonItemModel[] = this.layoutBtnObj.items;
425
+ for (let itemCount: number = 0; itemCount < items.length; itemCount++) {
426
+ if (items[itemCount].id === this.getPupupId('large')) {
427
+ items[itemCount].iconCss = this.parent.view === 'LargeIcons' ? CLS.TB_OPTION_TICK : '';
428
+ } else if (items[itemCount].id === this.getPupupId('details')) {
429
+ items[itemCount].iconCss = this.parent.view === 'Details' ? CLS.TB_OPTION_TICK : '';
430
+ }
431
+ }
432
+ }
433
+ }
434
+
435
+ private removeEventListener(): void {
436
+ this.parent.off(events.modelChanged, this.onPropertyChanged);
437
+ this.parent.off(events.selectionChanged, this.onSelectionChanged);
438
+ this.parent.off(events.layoutChange, this.onLayoutChange);
439
+ this.parent.off(events.showPaste, this.showPaste);
440
+ this.parent.off(events.hidePaste, this.hidePaste);
441
+ this.parent.off(events.destroy, this.destroy);
442
+ this.parent.off(events.sortByChange, this.updateSortByButton);
443
+ }
444
+
445
+ /**
446
+ * For internal use only - Get the module name.
447
+ *
448
+ * @returns {string} - returns module name.
449
+ * @private
450
+ */
451
+ private getModuleName(): string {
452
+ return 'toolbar';
453
+ }
454
+
455
+ private onPropertyChanged(e: NotifyArgs): void {
456
+ if (e.module !== this.getModuleName() && e.module !== 'common') {
457
+ /* istanbul ignore next */
458
+ return;
459
+ }
460
+ for (const prop of Object.keys(e.newProp)) {
461
+ switch (prop) {
462
+ case 'cssClass':
463
+ if (this.buttonObj) {
464
+ this.buttonObj.cssClass = getCssClass(this.parent, CLS.ROOT_POPUP);
465
+ }
466
+ if (this.layoutBtnObj) {
467
+ this.layoutBtnObj.cssClass = getCssClass(this.parent, 'e-caret-hide ' + CLS.ROOT_POPUP);
468
+ }
469
+ break;
470
+ case 'height':
471
+ case 'width':
472
+ this.toolbarObj.refreshOverflow();
473
+ break;
474
+ case 'toolbarSettings':
475
+ this.reRenderToolbar(e);
476
+ break;
477
+ }
478
+ }
479
+ }
480
+
481
+ public destroy(): void {
482
+ if (this.parent.isDestroyed) { return; }
483
+ this.removeEventListener();
484
+ if (this.buttonObj) { this.buttonObj.destroy(); }
485
+ if (this.layoutBtnObj) { this.layoutBtnObj.destroy(); }
486
+ this.toolbarObj.destroy();
487
+ this.parent.refreshLayout();
488
+ }
489
+
490
+ public enableItems(items: string[], isEnable?: boolean): void {
491
+ for (let i: number = 0; i < items.length; i++) {
492
+ const ele: Element = select('#' + this.getId(items[i]), this.parent.element);
493
+ if (ele) {
494
+ this.toolbarObj.enableItems(ele.parentElement, isEnable);
495
+ }
496
+ }
497
+ }
498
+ }