@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
@@ -1,12 +1,3 @@
1
- /*!
2
- * filename: index.d.ts
3
- * version : 20.1.52
4
- * Copyright Syncfusion Inc. 2001 - 2020. All rights reserved.
5
- * Use of this code is subject to the terms of our license.
6
- * A copy of the current license can be obtained at any time by e-mailing
7
- * licensing@syncfusion.com. Any infringement will be prosecuted under
8
- * applicable laws.
9
- */
10
1
  import * as _filemanager from '@syncfusion/ej2-filemanager';
11
2
 
12
3
  export declare namespace ej {
@@ -0,0 +1,427 @@
1
+ import { EventHandler, closest, isNullOrUndefined, KeyboardEvents, KeyboardEventArgs } from '@syncfusion/ej2-base';
2
+ import { getValue, addClass, removeClass, remove, createElement, DragEventArgs } from '@syncfusion/ej2-base';
3
+ import { TextBox, ChangedEventArgs } from '@syncfusion/ej2-inputs';
4
+ import { IFileManager, NotifyArgs, ReadArgs, FileOpenEventArgs } from '../base/interface';
5
+ import { DropDownButton, MenuEventArgs } from '@syncfusion/ej2-splitbuttons';
6
+ import { read } from '../common/operations';
7
+ import { getLocaleText, searchWordHandler } from '../common/utility';
8
+ import * as events from '../base/constant';
9
+ import * as CLS from '../base/classes';
10
+ import { SearchSettingsModel } from '../models';
11
+
12
+ /**
13
+ * BreadCrumbBar module
14
+ */
15
+ export class BreadCrumbBar {
16
+
17
+ /* Internal variables */
18
+ private parent: IFileManager;
19
+ public addressPath: string = '';
20
+ public addressBarLink: string = '';
21
+ public searchObj: TextBox;
22
+ private subMenuObj: DropDownButton;
23
+ private keyboardModule: KeyboardEvents;
24
+ private searchTimer: number = null;
25
+ private keyConfigs: { [key: string]: string };
26
+ private searchWrapWidth: number = null;
27
+ /**
28
+ * constructor for addressbar module
29
+ *
30
+ * @hidden
31
+ * @param {IFileManager} parent - specifies parent element.
32
+ * @private
33
+ *
34
+ */
35
+ constructor(parent?: IFileManager) {
36
+ this.parent = parent;
37
+ this.keyConfigs = {
38
+ enter: 'enter'
39
+ };
40
+ this.render();
41
+ }
42
+ private onPropertyChanged(e: NotifyArgs): void {
43
+ if (e.module !== this.getModuleName() && e.module !== 'common') {
44
+ return;
45
+ }
46
+ for (const prop of Object.keys(e.newProp)) {
47
+ const value: SearchSettingsModel = e.newProp.searchSettings;
48
+ switch (prop) {
49
+ case 'searchSettings':
50
+ if (!isNullOrUndefined(value.allowSearchOnTyping)) {
51
+ this.searchEventBind(value.allowSearchOnTyping);
52
+ }
53
+ if (this.parent.breadcrumbbarModule.searchObj.value && this.parent.breadcrumbbarModule.searchObj.value !== '' &&
54
+ !(!isNullOrUndefined(value.allowSearchOnTyping) && isNullOrUndefined(value.filterType) &&
55
+ isNullOrUndefined(value.ignoreCase))) {
56
+ searchWordHandler(this.parent, this.parent.breadcrumbbarModule.searchObj.value, false);
57
+ }
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ private render(): void {
63
+ this.addEventListener();
64
+ }
65
+ public onPathChange(): void {
66
+ const pathNames: string[] = this.parent.pathNames;
67
+ const paths: string[] = this.parent.path.split('/');
68
+ const addressbarUL: HTMLElement = this.parent.createElement('ul', { className: 'e-addressbar-ul' });
69
+ let addressbarLI: HTMLElement = null;
70
+ const pathNamesLen: number = pathNames.length;
71
+ if (pathNames.length > 0) {
72
+ let id: string = '';
73
+ for (let i: number = 0; i < pathNamesLen; i++) {
74
+ let addressATag: HTMLElement = null;
75
+ addressbarLI = this.parent.createElement('li', { className: 'e-address-list-item' });
76
+ for (let j: number = 0; j <= i; j++) {
77
+ id = id + paths[j] + '/';
78
+ }
79
+ addressbarLI.setAttribute('data-utext', id);
80
+ if (i !== 0) {
81
+ const icon: HTMLElement = createElement('span', { className: CLS.ICONS });
82
+ addressbarLI.appendChild(icon);
83
+ }
84
+ if (pathNamesLen - i !== 1) {
85
+ addressATag = createElement('a', { className: CLS.LIST_TEXT });
86
+ addressbarLI.setAttribute('tabindex', '0');
87
+ } else {
88
+ addressATag = createElement('span', { className: CLS.LIST_TEXT });
89
+ }
90
+ id = '';
91
+ addressATag.innerText = pathNames[i];
92
+ addressbarLI.appendChild(addressATag);
93
+ addressbarUL.appendChild(addressbarLI);
94
+ }
95
+ const ulElement: Element = this.parent.breadCrumbBarNavigation.querySelector('.e-addressbar-ul');
96
+ if (!isNullOrUndefined(ulElement)) {
97
+ if (!isNullOrUndefined(this.subMenuObj)) {
98
+ this.subMenuObj.destroy();
99
+ }
100
+ remove(ulElement);
101
+ }
102
+ const searchWrap: Element = this.parent.breadCrumbBarNavigation.querySelector('.e-search-wrap');
103
+ if (!searchWrap) {
104
+ this.parent.breadCrumbBarNavigation.insertBefore(addressbarUL, searchWrap);
105
+ } else {
106
+ this.parent.breadCrumbBarNavigation.appendChild(addressbarUL);
107
+ }
108
+ this.updateBreadCrumbBar(addressbarUL);
109
+ }
110
+ }
111
+ /* istanbul ignore next */
112
+ private updateBreadCrumbBar(addresBarUL: HTMLElement): void {
113
+ const liElements: NodeListOf<Element> = addresBarUL.querySelectorAll('li');
114
+ const ulElement: Element = this.parent.breadCrumbBarNavigation.querySelector('.e-addressbar-ul');
115
+ const style: CSSStyleDeclaration = window.getComputedStyle(ulElement, null);
116
+ const pRight: number = parseFloat(style.getPropertyValue('padding-right'));
117
+ const pLeft: number = parseFloat(style.getPropertyValue('padding-left'));
118
+ let breadCrumbBarWidth: number = (<HTMLElement>ulElement).offsetWidth - pRight - pLeft;
119
+ const addressbarUL: HTMLElement = this.parent.createElement('ul', { className: 'e-addressbar-ul' });
120
+ let liElementsWidth: number = 0;
121
+ const liElementsWidths: number[] = [];
122
+ for (let i: number = 0; i < liElements.length; i++) {
123
+ const width: number = liElements[i].clientWidth;
124
+ liElementsWidths.push(width);
125
+ liElementsWidth = liElementsWidth + width;
126
+ }
127
+ if (!isNullOrUndefined(ulElement)) {
128
+ remove(ulElement);
129
+ }
130
+ const searchContainer: HTMLElement = this.parent.createElement('div');
131
+ searchContainer.setAttribute('class', 'e-search-wrap');
132
+ const id: string = this.parent.element.id + CLS.SEARCH_ID;
133
+ const searchInput: HTMLElement = createElement('input', { id: id,
134
+ attrs: { autocomplete: 'off', 'aria-label': getLocaleText(this.parent, 'Search') } });
135
+ searchContainer.appendChild(searchInput);
136
+ const searchEle: Element = this.parent.breadCrumbBarNavigation.querySelector('.e-search-wrap .e-input');
137
+ if (isNullOrUndefined(searchEle)) {
138
+ this.parent.breadCrumbBarNavigation.appendChild(searchContainer);
139
+ const span: Element = createElement('span', { className: 'e-icons e-fe-search' });
140
+ EventHandler.add(span, 'click', this.onShowInput, this);
141
+ searchInput.parentElement.insertBefore(span, searchInput);
142
+ this.searchObj = new TextBox({
143
+ value: '',
144
+ showClearButton: true,
145
+ placeholder: getLocaleText(this.parent, 'Search'),
146
+ focus: this.onFocus.bind(this),
147
+ blur: this.onBlur.bind(this)
148
+ });
149
+ this.searchObj.appendTo('#' + this.parent.element.id + CLS.SEARCH_ID);
150
+ this.searchEventBind(this.parent.searchSettings.allowSearchOnTyping);
151
+ const search: Element = this.searchObj.element.nextElementSibling;
152
+ EventHandler.add(search, 'mousedown', this.searchChangeHandler.bind(this), this);
153
+ EventHandler.add(this.searchObj.element, 'keyup', this.onKeyUp.bind(this), this);
154
+ }
155
+ const searchWrap: HTMLElement = this.parent.breadCrumbBarNavigation.querySelector('.e-search-wrap');
156
+ breadCrumbBarWidth = breadCrumbBarWidth - (this.searchWrapWidth ? this.searchWrapWidth : searchWrap.offsetWidth);
157
+ if (liElementsWidth > breadCrumbBarWidth) {
158
+ let i: number = liElements.length;
159
+ while (i--) {
160
+ const diff: number = breadCrumbBarWidth - liElementsWidths[i];
161
+ if (diff > 40) {
162
+ addressbarUL.insertBefore(liElements[i], addressbarUL.querySelector('li'));
163
+ breadCrumbBarWidth = diff;
164
+ } else {
165
+ // eslint-disable-next-line
166
+ const items: Object[] = [];
167
+ for (let j: number = 0; j <= i; j++) {
168
+ const liElement: Element = liElements[j];
169
+ items.push({
170
+ text: (<HTMLElement>liElement).innerText,
171
+ utext: liElement.getAttribute('data-utext')
172
+ });
173
+ }
174
+ const subMenuLi: HTMLElement = this.parent.createElement('li', { className: 'e-breadcrumb-menu' });
175
+ // eslint-disable-next-line
176
+ const attributes: Object = { className: 'e-breadcrumb-submenu' };
177
+ const subMenuSpan: HTMLElement = this.parent.createElement('button', attributes);
178
+ subMenuLi.appendChild(subMenuSpan);
179
+ addressbarUL.insertBefore(subMenuLi, addressbarUL.querySelector('li'));
180
+ this.subMenuObj = new DropDownButton({
181
+ items: items,
182
+ cssClass: 'e-caret-hide e-submenu',
183
+ iconCss: CLS.ICON_BREADCRUMB,
184
+ iconPosition: 'Top',
185
+ enableHtmlSanitizer: this.parent.enableHtmlSanitizer,
186
+ beforeItemRender: this.addSubMenuAttributes.bind(this),
187
+ select: this.subMenuSelectOperations.bind(this)
188
+ });
189
+ this.subMenuObj.isStringTemplate = true;
190
+ this.subMenuObj.appendTo(subMenuSpan);
191
+ break;
192
+ }
193
+ }
194
+ this.parent.breadCrumbBarNavigation.insertBefore(addressbarUL, searchWrap);
195
+ } else {
196
+ this.parent.breadCrumbBarNavigation.insertBefore(addresBarUL, searchWrap);
197
+ }
198
+ }
199
+ /* istanbul ignore next */
200
+ private onFocus(): void {
201
+ const wrap: Element = closest(this.searchObj.element, '.e-search-wrap');
202
+ wrap.classList.add('e-focus');
203
+ }
204
+ /* istanbul ignore next */
205
+ private onKeyUp(): void {
206
+ this.parent.notify(events.pathColumn, { args: this.parent });
207
+ }
208
+ /* istanbul ignore next */
209
+ private onBlur(): void {
210
+ const wrap: Element = closest(this.searchObj.element, '.e-search-wrap');
211
+ wrap.classList.remove('e-focus');
212
+ }
213
+ /* istanbul ignore next */
214
+ private subMenuSelectOperations(event: MenuEventArgs): void {
215
+ // eslint-disable-next-line
216
+ const args: Object = { target: event.element };
217
+ this.addressPathClickHandler(<Event>args);
218
+ }
219
+ /* istanbul ignore next */
220
+ private addSubMenuAttributes(args: MenuEventArgs): void {
221
+ args.element.setAttribute('data-utext', getValue('utext', args.item));
222
+ const anchor: HTMLElement = this.parent.createElement('a', { className: 'e-list-text' });
223
+ args.element.appendChild(anchor);
224
+ }
225
+ private searchEventBind(allow: boolean): void {
226
+ if (allow) {
227
+ this.searchObj.input = this.searchChangeHandler.bind(this);
228
+ this.searchObj.change = null;
229
+ } else {
230
+ this.searchObj.change = this.searchChangeHandler.bind(this);
231
+ this.searchObj.input = null;
232
+ }
233
+ }
234
+ private searchChangeHandler(args?: ChangedEventArgs): void {
235
+ if (!isNullOrUndefined(args.value)) {
236
+ this.parent.isFiltered = false;
237
+ if (this.parent.searchSettings.allowSearchOnTyping) {
238
+ window.clearTimeout(this.searchTimer);
239
+ this.searchTimer = window.setTimeout(() => { searchWordHandler(this.parent, args.value, false); }, 300);
240
+ } else {
241
+ searchWordHandler(this.parent, args.value, false);
242
+ }
243
+ }
244
+ }
245
+ private addressPathClickHandler(e: Event): void {
246
+ const li: HTMLElement = (<HTMLElement>e.target);
247
+ if (li.nodeName === 'LI' || li.nodeName === 'A') {
248
+ const node: Element = li.nodeName === 'LI' ? li.children[0] : li;
249
+ if (!isNullOrUndefined(node)) {
250
+ this.parent.isFiltered = false;
251
+ const currentPath: string = this.updatePath((<HTMLElement>node));
252
+ this.parent.itemData = [getValue(this.parent.pathId[this.parent.pathId.length - 1], this.parent.feParent)];
253
+ this.triggerFileOpen(this.parent.itemData[0]);
254
+ read(this.parent, events.pathChanged, currentPath);
255
+ const treeNodeId: string = this.parent.pathId[this.parent.pathId.length - 1];
256
+ this.parent.notify(events.updateTreeSelection, { module: 'treeview', selectedNode: treeNodeId });
257
+ }
258
+ }
259
+ }
260
+
261
+ // eslint-disable-next-line
262
+ private triggerFileOpen(data: Object): void {
263
+ const eventArgs: FileOpenEventArgs = { cancel: false, fileDetails: data, module: 'BreadCrumbBar' };
264
+ delete eventArgs.cancel;
265
+ this.parent.trigger('fileOpen', eventArgs);
266
+ }
267
+
268
+ /* istanbul ignore next */
269
+ private onShowInput(): void {
270
+ if (this.parent.isMobile) {
271
+ if (this.parent.element.classList.contains(CLS.FILTER)) {
272
+ removeClass([this.parent.element], CLS.FILTER);
273
+ this.searchWrapWidth = null;
274
+ } else {
275
+ const searchWrap: HTMLElement = this.parent.breadCrumbBarNavigation.querySelector('.e-search-wrap');
276
+ this.searchWrapWidth = searchWrap.offsetWidth;
277
+ addClass([this.parent.element], CLS.FILTER);
278
+ this.searchObj.element.focus();
279
+ }
280
+ }
281
+ }
282
+
283
+ private updatePath(list: HTMLElement): string {
284
+ const li: Element = closest(list, 'li');
285
+ const liElementId: string = li.getAttribute('data-utext');
286
+ this.addressBarLink = liElementId;
287
+ const link: string[] = this.addressBarLink.split('/');
288
+ const ids: string[] = this.parent.pathId;
289
+ const names: string[] = this.parent.pathNames;
290
+ this.parent.pathId = [];
291
+ this.parent.pathNames = [];
292
+ let newpath: string = '';
293
+ for (let i: number = 0, len: number = link.length - 1; i < len; i++) {
294
+ this.parent.pathId.push(ids[i]);
295
+ this.parent.pathNames.push(names[i]);
296
+ newpath += link[i] + '/';
297
+ }
298
+ this.parent.setProperties({ path: newpath }, true);
299
+ return newpath;
300
+ }
301
+
302
+ private onUpdatePath(): void {
303
+ this.onPathChange();
304
+ this.removeSearchValue();
305
+ }
306
+
307
+ private onCreateEnd(): void {
308
+ this.onPathChange();
309
+ }
310
+
311
+ private onRenameEnd(): void {
312
+ this.onPathChange();
313
+ }
314
+
315
+ /* istanbul ignore next */
316
+ private onDeleteEnd(): void {
317
+ this.onUpdatePath();
318
+ }
319
+
320
+ /* istanbul ignore next */
321
+ private removeSearchValue(): void {
322
+ this.parent.isFiltered = false;
323
+ if (this.searchObj && (this.searchObj.value !== '' || this.searchObj.element.value !== '')) {
324
+ this.searchObj.value = '';
325
+ this.searchObj.element.value = '';
326
+ this.searchObj.dataBind();
327
+ }
328
+ }
329
+
330
+ private onResize(): void {
331
+ this.onPathChange();
332
+ }
333
+ private onPasteEnd(): void {
334
+ this.onPathChange();
335
+ }
336
+
337
+ private addEventListener(): void {
338
+ this.keyboardModule = new KeyboardEvents(
339
+ this.parent.breadCrumbBarNavigation,
340
+ {
341
+ keyAction: this.keyActionHandler.bind(this),
342
+ keyConfigs: this.keyConfigs,
343
+ eventName: 'keydown'
344
+ }
345
+ );
346
+ this.parent.on(events.modelChanged, this.onPropertyChanged, this);
347
+ EventHandler.add(this.parent.breadCrumbBarNavigation, 'click', this.addressPathClickHandler, this);
348
+ this.parent.on(events.destroy, this.destroy, this);
349
+ this.parent.on(events.pathChanged, this.onUpdatePath, this);
350
+ this.parent.on(events.finalizeEnd, this.onUpdatePath, this);
351
+ this.parent.on(events.refreshEnd, this.onUpdatePath, this);
352
+ this.parent.on(events.openEnd, this.onUpdatePath, this);
353
+ this.parent.on(events.createEnd, this.onCreateEnd, this);
354
+ this.parent.on(events.renameEnd, this.onRenameEnd, this);
355
+ this.parent.on(events.deleteEnd, this.onDeleteEnd, this);
356
+ this.parent.on(events.splitterResize, this.onResize, this);
357
+ this.parent.on(events.pasteEnd, this.onPasteEnd, this);
358
+ this.parent.on(events.resizeEnd, this.onResize, this);
359
+ this.parent.on(events.searchTextChange, this.onSearchTextChange, this);
360
+ this.parent.on(events.dropInit, this.onDropInit, this);
361
+ this.parent.on(events.layoutRefresh, this.onResize, this);
362
+ this.parent.on(events.dropPath, this.onPathChange, this);
363
+ }
364
+
365
+ private keyActionHandler(e: KeyboardEventArgs): void {
366
+ switch (e.action) {
367
+ case 'enter':
368
+ this.addressPathClickHandler(e);
369
+ break;
370
+ }
371
+ }
372
+ private removeEventListener(): void {
373
+ this.keyboardModule.destroy();
374
+ this.parent.off(events.pathChanged, this.onUpdatePath);
375
+ this.parent.off(events.finalizeEnd, this.onUpdatePath);
376
+ this.parent.off(events.refreshEnd, this.onUpdatePath);
377
+ this.parent.off(events.openEnd, this.onUpdatePath);
378
+ this.parent.off(events.pasteEnd, this.onPasteEnd);
379
+ this.parent.off(events.createEnd, this.onCreateEnd);
380
+ this.parent.off(events.renameEnd, this.onRenameEnd);
381
+ this.parent.off(events.deleteEnd, this.onDeleteEnd);
382
+ this.parent.off(events.splitterResize, this.onResize);
383
+ this.parent.off(events.resizeEnd, this.onResize);
384
+ this.parent.off(events.searchTextChange, this.onSearchTextChange);
385
+ this.parent.off(events.dropInit, this.onDropInit);
386
+ this.parent.off(events.layoutRefresh, this.onResize);
387
+ this.parent.off(events.dropPath, this.onPathChange);
388
+ }
389
+
390
+ /* istanbul ignore next */
391
+ private onDropInit(args: DragEventArgs): void {
392
+ if (this.parent.targetModule === this.getModuleName()) {
393
+ const liEle: Element = args.target.closest('li');
394
+ this.parent.dropPath = this.updatePath(<HTMLElement>(liEle.children[0]));
395
+ this.parent.dropData = getValue(this.parent.pathId[this.parent.pathId.length - 1], this.parent.feParent);
396
+ this.triggerFileOpen(this.parent.dropData);
397
+ const treeNodeId: string = this.parent.pathId[this.parent.pathId.length - 1];
398
+ this.parent.notify(events.updateTreeSelection, { module: 'treeview', selectedNode: treeNodeId });
399
+ }
400
+ }
401
+
402
+ /**
403
+ * For internal use only - Get the module name.
404
+ *
405
+ * @returns {string} - returns the module name
406
+ * @private
407
+ */
408
+ private getModuleName(): string {
409
+ return 'breadcrumbbar';
410
+ }
411
+
412
+ public destroy(): void {
413
+ if (this.parent.isDestroyed) { return; }
414
+ this.removeEventListener();
415
+ /* istanbul ignore next */
416
+ if (!isNullOrUndefined(this.subMenuObj)) {
417
+ this.subMenuObj.destroy();
418
+ }
419
+ if (!isNullOrUndefined(this.searchObj)) {
420
+ this.searchObj.destroy();
421
+ }
422
+ }
423
+
424
+ private onSearchTextChange(args: ReadArgs): void {
425
+ this.searchObj.element.placeholder = (this.parent.searchSettings.placeholder != null) ? this.parent.searchSettings.placeholder : getLocaleText(this.parent, 'Search') + ' ' + args.cwd.name;
426
+ }
427
+ }