@syncfusion/ej2-dropdowns 18.1.57 → 18.2.44-4569

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 (183) hide show
  1. package/.eslintrc.json +244 -0
  2. package/CHANGELOG.md +1524 -1514
  3. package/README.md +118 -118
  4. package/dist/ej2-dropdowns.umd.min.js +1 -10
  5. package/dist/ej2-dropdowns.umd.min.js.map +1 -1
  6. package/dist/es6/ej2-dropdowns.es2015.js +198 -126
  7. package/dist/es6/ej2-dropdowns.es2015.js.map +1 -1
  8. package/dist/es6/ej2-dropdowns.es5.js +290 -217
  9. package/dist/es6/ej2-dropdowns.es5.js.map +1 -1
  10. package/dist/global/ej2-dropdowns.min.js +1 -10
  11. package/dist/global/ej2-dropdowns.min.js.map +1 -1
  12. package/dist/global/index.d.ts +0 -9
  13. package/dist/ts/auto-complete/auto-complete.ts +527 -0
  14. package/dist/ts/combo-box/combo-box.ts +957 -0
  15. package/dist/ts/common/highlight-search.ts +47 -0
  16. package/dist/ts/common/incremental-search.ts +81 -0
  17. package/dist/ts/drop-down-base/drop-down-base.ts +1572 -0
  18. package/dist/ts/drop-down-list/drop-down-list.ts +2993 -0
  19. package/dist/ts/drop-down-tree/drop-down-tree.ts +3066 -0
  20. package/dist/ts/list-box/list-box.ts +2317 -0
  21. package/dist/ts/multi-select/checkbox-selection.ts +528 -0
  22. package/dist/ts/multi-select/float-label.ts +155 -0
  23. package/dist/ts/multi-select/interface.ts +66 -0
  24. package/dist/ts/multi-select/multi-select.ts +4216 -0
  25. package/helpers/e2e/index.js +3 -3
  26. package/license +2 -2
  27. package/package.json +77 -77
  28. package/src/auto-complete/auto-complete-model.d.ts +179 -179
  29. package/src/auto-complete/auto-complete.d.ts +12 -12
  30. package/src/auto-complete/auto-complete.js +21 -21
  31. package/src/combo-box/combo-box-model.d.ts +212 -212
  32. package/src/combo-box/combo-box.d.ts +27 -27
  33. package/src/combo-box/combo-box.js +29 -29
  34. package/src/common/incremental-search.d.ts +1 -1
  35. package/src/common/incremental-search.js +4 -2
  36. package/src/drop-down-base/drop-down-base-model.d.ts +191 -191
  37. package/src/drop-down-base/drop-down-base.d.ts +17 -17
  38. package/src/drop-down-base/drop-down-base.js +20 -20
  39. package/src/drop-down-list/drop-down-list-model.d.ts +222 -222
  40. package/src/drop-down-list/drop-down-list.d.ts +3 -2
  41. package/src/drop-down-list/drop-down-list.js +43 -30
  42. package/src/drop-down-tree/drop-down-tree-model.d.ts +344 -344
  43. package/src/drop-down-tree/drop-down-tree.js +32 -26
  44. package/src/list-box/index.d.ts +1 -0
  45. package/src/list-box/index.js +1 -0
  46. package/src/list-box/list-box-model.d.ts +156 -156
  47. package/src/list-box/list-box.d.ts +2 -2
  48. package/src/list-box/list-box.js +57 -59
  49. package/src/multi-select/index.d.ts +1 -0
  50. package/src/multi-select/index.js +1 -0
  51. package/src/multi-select/multi-select-model.d.ts +452 -452
  52. package/src/multi-select/multi-select.d.ts +2 -0
  53. package/src/multi-select/multi-select.js +98 -43
  54. package/styles/_all.scss +3 -3
  55. package/styles/auto-complete/_bootstrap-dark-definition.scss +3 -3
  56. package/styles/auto-complete/_bootstrap4-definition.scss +11 -11
  57. package/styles/auto-complete/_fabric-dark-definition.scss +2 -2
  58. package/styles/auto-complete/_highcontrast-light-definition.scss +2 -2
  59. package/styles/auto-complete/_material-dark-definition.scss +2 -2
  60. package/styles/bootstrap-dark.css +67 -61
  61. package/styles/bootstrap.css +69 -63
  62. package/styles/bootstrap4.css +81 -61
  63. package/styles/combo-box/_bootstrap-dark-definition.scss +2 -2
  64. package/styles/combo-box/_bootstrap4-definition.scss +11 -11
  65. package/styles/combo-box/_fabric-dark-definition.scss +2 -2
  66. package/styles/combo-box/_highcontrast-light-definition.scss +3 -3
  67. package/styles/combo-box/_material-dark-definition.scss +2 -2
  68. package/styles/drop-down-base/_all.scss +2 -2
  69. package/styles/drop-down-base/_bootstrap-dark-definition.scss +64 -64
  70. package/styles/drop-down-base/_bootstrap-definition.scss +64 -64
  71. package/styles/drop-down-base/_bootstrap4-definition.scss +78 -78
  72. package/styles/drop-down-base/_definition.scss +23 -23
  73. package/styles/drop-down-base/_fabric-dark-definition.scss +68 -68
  74. package/styles/drop-down-base/_fabric-definition.scss +66 -66
  75. package/styles/drop-down-base/_highcontrast-definition.scss +82 -82
  76. package/styles/drop-down-base/_highcontrast-light-definition.scss +81 -81
  77. package/styles/drop-down-base/_layout.scss +108 -108
  78. package/styles/drop-down-base/_material-dark-definition.scss +67 -67
  79. package/styles/drop-down-base/_material-definition.scss +65 -65
  80. package/styles/drop-down-base/_theme.scss +242 -242
  81. package/styles/drop-down-list/_all.scss +2 -2
  82. package/styles/drop-down-list/_bootstrap-dark-definition.scss +157 -157
  83. package/styles/drop-down-list/_bootstrap-definition.scss +156 -156
  84. package/styles/drop-down-list/_bootstrap4-definition.scss +184 -184
  85. package/styles/drop-down-list/_fabric-dark-definition.scss +127 -127
  86. package/styles/drop-down-list/_fabric-definition.scss +122 -122
  87. package/styles/drop-down-list/_highcontrast-definition.scss +131 -131
  88. package/styles/drop-down-list/_highcontrast-light-definition.scss +133 -133
  89. package/styles/drop-down-list/_layout.scss +218 -218
  90. package/styles/drop-down-list/_material-dark-definition.scss +143 -143
  91. package/styles/drop-down-list/_material-definition.scss +166 -166
  92. package/styles/drop-down-list/_theme.scss +10 -10
  93. package/styles/drop-down-list/icons/_bootstrap-dark.scss +14 -14
  94. package/styles/drop-down-list/icons/_bootstrap.scss +14 -14
  95. package/styles/drop-down-list/icons/_bootstrap4.scss +14 -14
  96. package/styles/drop-down-list/icons/_fabric-dark.scss +14 -14
  97. package/styles/drop-down-list/icons/_fabric.scss +14 -14
  98. package/styles/drop-down-list/icons/_highcontrast-light.scss +14 -14
  99. package/styles/drop-down-list/icons/_highcontrast.scss +14 -14
  100. package/styles/drop-down-list/icons/_material-dark.scss +14 -14
  101. package/styles/drop-down-list/icons/_material.scss +14 -14
  102. package/styles/drop-down-list/material.css +9 -0
  103. package/styles/drop-down-tree/_all.scss +2 -2
  104. package/styles/drop-down-tree/_bootstrap-dark-definition.scss +62 -49
  105. package/styles/drop-down-tree/_bootstrap-definition.scss +62 -49
  106. package/styles/drop-down-tree/_bootstrap4-definition.scss +63 -50
  107. package/styles/drop-down-tree/_fabric-dark-definition.scss +63 -49
  108. package/styles/drop-down-tree/_fabric-definition.scss +63 -49
  109. package/styles/drop-down-tree/_highcontrast-definition.scss +63 -49
  110. package/styles/drop-down-tree/_highcontrast-light-definition.scss +63 -49
  111. package/styles/drop-down-tree/_layout.scss +437 -398
  112. package/styles/drop-down-tree/_material-dark-definition.scss +61 -54
  113. package/styles/drop-down-tree/_material-definition.scss +61 -54
  114. package/styles/drop-down-tree/_theme.scss +68 -63
  115. package/styles/drop-down-tree/bootstrap-dark.css +67 -61
  116. package/styles/drop-down-tree/bootstrap.css +69 -63
  117. package/styles/drop-down-tree/bootstrap4.css +81 -61
  118. package/styles/drop-down-tree/fabric-dark.css +71 -63
  119. package/styles/drop-down-tree/fabric.css +71 -63
  120. package/styles/drop-down-tree/highcontrast-light.css +71 -63
  121. package/styles/drop-down-tree/highcontrast.css +75 -63
  122. package/styles/drop-down-tree/icons/_bootstrap-dark.scss +11 -11
  123. package/styles/drop-down-tree/icons/_bootstrap.scss +11 -11
  124. package/styles/drop-down-tree/icons/_bootstrap4.scss +11 -11
  125. package/styles/drop-down-tree/icons/_fabric-dark.scss +11 -11
  126. package/styles/drop-down-tree/icons/_fabric.scss +11 -11
  127. package/styles/drop-down-tree/icons/_highcontrast-light.scss +11 -11
  128. package/styles/drop-down-tree/icons/_highcontrast.scss +11 -11
  129. package/styles/drop-down-tree/icons/_material-dark.scss +11 -11
  130. package/styles/drop-down-tree/icons/_material.scss +11 -11
  131. package/styles/drop-down-tree/material-dark.css +76 -85
  132. package/styles/drop-down-tree/material.css +93 -85
  133. package/styles/fabric-dark.css +71 -63
  134. package/styles/fabric.css +71 -63
  135. package/styles/highcontrast-light.css +71 -63
  136. package/styles/highcontrast.css +75 -63
  137. package/styles/list-box/_all.scss +2 -2
  138. package/styles/list-box/_bootstrap-dark-definition.scss +118 -118
  139. package/styles/list-box/_bootstrap-definition.scss +112 -112
  140. package/styles/list-box/_bootstrap4-definition.scss +118 -118
  141. package/styles/list-box/_fabric-dark-definition.scss +118 -118
  142. package/styles/list-box/_fabric-definition.scss +112 -112
  143. package/styles/list-box/_highcontrast-definition.scss +112 -112
  144. package/styles/list-box/_highcontrast-light-definition.scss +118 -118
  145. package/styles/list-box/_layout.scss +458 -458
  146. package/styles/list-box/_material-dark-definition.scss +118 -118
  147. package/styles/list-box/_material-definition.scss +112 -112
  148. package/styles/list-box/_theme.scss +273 -273
  149. package/styles/list-box/icons/_bootstrap-dark.scss +25 -25
  150. package/styles/list-box/icons/_bootstrap.scss +25 -25
  151. package/styles/list-box/icons/_bootstrap4.scss +25 -25
  152. package/styles/list-box/icons/_fabric-dark.scss +25 -25
  153. package/styles/list-box/icons/_fabric.scss +25 -25
  154. package/styles/list-box/icons/_highcontrast-light.scss +25 -25
  155. package/styles/list-box/icons/_highcontrast.scss +25 -25
  156. package/styles/list-box/icons/_material-dark.scss +25 -25
  157. package/styles/list-box/icons/_material.scss +25 -25
  158. package/styles/list-box/material-dark.css +4 -4
  159. package/styles/list-box/material.css +4 -4
  160. package/styles/material-dark.css +80 -89
  161. package/styles/material.css +115 -89
  162. package/styles/multi-select/_all.scss +2 -2
  163. package/styles/multi-select/_bootstrap-dark-definition.scss +171 -171
  164. package/styles/multi-select/_bootstrap-definition.scss +166 -166
  165. package/styles/multi-select/_bootstrap4-definition.scss +233 -233
  166. package/styles/multi-select/_fabric-dark-definition.scss +170 -170
  167. package/styles/multi-select/_fabric-definition.scss +167 -167
  168. package/styles/multi-select/_highcontrast-definition.scss +257 -257
  169. package/styles/multi-select/_highcontrast-light-definition.scss +258 -258
  170. package/styles/multi-select/_layout.scss +1153 -1153
  171. package/styles/multi-select/_material-dark-definition.scss +186 -186
  172. package/styles/multi-select/_material-definition.scss +191 -191
  173. package/styles/multi-select/_theme.scss +384 -384
  174. package/styles/multi-select/icons/_bootstrap-dark.scss +26 -26
  175. package/styles/multi-select/icons/_bootstrap.scss +26 -26
  176. package/styles/multi-select/icons/_bootstrap4.scss +37 -37
  177. package/styles/multi-select/icons/_fabric-dark.scss +26 -26
  178. package/styles/multi-select/icons/_fabric.scss +26 -26
  179. package/styles/multi-select/icons/_highcontrast-light.scss +26 -26
  180. package/styles/multi-select/icons/_highcontrast.scss +26 -26
  181. package/styles/multi-select/icons/_material-dark.scss +26 -26
  182. package/styles/multi-select/icons/_material.scss +324 -324
  183. package/styles/multi-select/material.css +9 -0
@@ -0,0 +1,528 @@
1
+ import { createCheckBox } from '@syncfusion/ej2-buttons';
2
+ import { IMulitSelect } from './interface';
3
+ import { Input, InputObject } from '@syncfusion/ej2-inputs';
4
+ import { EventHandler, select, removeClass, addClass, detach, compile, L10n, isBlazor } from '@syncfusion/ej2-base';
5
+ import { Browser, attributes, isNullOrUndefined, KeyboardEventArgs, append, closest, prepend } from '@syncfusion/ej2-base';
6
+ import { dropDownBaseClasses } from '../drop-down-base/drop-down-base';
7
+ import { MultiSelectModel } from '../multi-select';
8
+
9
+
10
+ const ICON: string = 'e-icons';
11
+ const CHECKBOXFRAME: string = 'e-frame';
12
+ const CHECK: string = 'e-check';
13
+ const CHECKBOXWRAP: string = 'e-checkbox-wrapper';
14
+ const CHECKBOXRIPPLE: string = 'e-ripple-container';
15
+ const INDETERMINATE: string = 'e-stop';
16
+ const checkAllParent: string = 'e-selectall-parent';
17
+ const searchBackIcon: string = 'e-input-group-icon e-back-icon e-icons';
18
+ const filterBarClearIcon: string = 'e-input-group-icon e-clear-icon e-icons';
19
+ const filterInput: string = 'e-input-filter';
20
+ const filterParent: string = 'e-filter-parent';
21
+ const mobileFilter: string = 'e-ddl-device-filter';
22
+ const clearIcon: string = 'e-clear-icon';
23
+ const popupFullScreen: string = 'e-popup-full-page';
24
+ const device: string = 'e-ddl-device';
25
+ const FOCUS: string = 'e-input-focus';
26
+
27
+ /**
28
+ * The Multiselect enable CheckBoxSelection call this inject module.
29
+ */
30
+
31
+ export class CheckBoxSelection {
32
+ private parent: IMulitSelect;
33
+ private checkAllParent: HTMLElement;
34
+ private selectAllSpan: HTMLElement;
35
+ public filterInput: HTMLInputElement;
36
+ private filterInputObj: InputObject;
37
+ private backIconElement: Element;
38
+ private clearIconElement: Element;
39
+ private checkWrapper: HTMLElement;
40
+ public list: HTMLElement;
41
+ private activeLi: HTMLElement[] = [];
42
+ private activeEle: HTMLElement[] = [];
43
+ constructor(parent?: IMulitSelect) {
44
+ this.parent = parent;
45
+ this.addEventListener();
46
+ }
47
+ public getModuleName(): string {
48
+ return 'CheckBoxSelection';
49
+ }
50
+
51
+ public addEventListener(): void {
52
+ if (this.parent.isDestroyed) { return; }
53
+ this.parent.on('updatelist', this.listSelection, this);
54
+ this.parent.on('listoption', this.listOption, this);
55
+ this.parent.on('selectAll', this.setSelectAll, this);
56
+ this.parent.on('checkSelectAll', this.checkSelectAll, this);
57
+ this.parent.on('searchBox', this.setSearchBox, this);
58
+ this.parent.on('blur', this.onBlur, this);
59
+ this.parent.on('targetElement', this.targetElement, this);
60
+ this.parent.on('deviceSearchBox', this.setDeviceSearchBox, this);
61
+ this.parent.on('inputFocus', this.getFocus, this);
62
+ this.parent.on('reOrder', this.setReorder, this);
63
+ this.parent.on('activeList', this.getActiveList, this);
64
+ this.parent.on('selectAllText', this.setLocale, this);
65
+ this.parent.on('filterBarPlaceholder', this.setPlaceholder, this);
66
+ EventHandler.add(document, 'mousedown', this.onDocumentClick, this);
67
+ this.parent.on('addItem', this.checboxCreate, this);
68
+ this.parent.on('popupFullScreen', this.setPopupFullScreen, this);
69
+ }
70
+ public removeEventListener(): void {
71
+ if (this.parent.isDestroyed) { return; }
72
+ this.parent.off('updatelist', this.listSelection);
73
+ this.parent.off('listoption', this.listOption);
74
+ this.parent.off('selectAll', this.setSelectAll);
75
+ this.parent.off('checkSelectAll', this.checkSelectAll);
76
+ this.parent.off('searchBox', this.setSearchBox);
77
+ this.parent.off('blur', this.onBlur);
78
+ this.parent.off('targetElement', this.targetElement);
79
+ this.parent.off('deviceSearchBox', this.setDeviceSearchBox);
80
+ this.parent.off('inputFocus', this.getFocus);
81
+ this.parent.off('reOrder', this.setReorder);
82
+ this.parent.off('activeList', this.getActiveList);
83
+ this.parent.off('selectAllText', this.setLocale);
84
+ this.parent.off('filterBarPlaceholder', this.setPlaceholder);
85
+ this.parent.off('addItem', this.checboxCreate);
86
+ EventHandler.remove(document, 'mousedown', this.onDocumentClick);
87
+ this.parent.off('popupFullScreen', this.setPopupFullScreen);
88
+ }
89
+
90
+ public listOption(args: { [key: string]: Object }): void {
91
+ if (isNullOrUndefined(this.parent.listCurrentOptions.itemCreated)) {
92
+ this.parent.listCurrentOptions.itemCreated = (e: { [key: string]: HTMLElement }) => {
93
+ this.checboxCreate(e);
94
+ };
95
+ } else {
96
+ let itemCreated: Function = <Function>this.parent.listCurrentOptions.itemCreated;
97
+ this.parent.listCurrentOptions.itemCreated = (e: { [key: string]: HTMLElement }) => {
98
+ this.checboxCreate(e);
99
+ itemCreated.apply(this, [e]);
100
+ };
101
+ }
102
+ };
103
+ private setPlaceholder(props: MultiSelectModel): void {
104
+ Input.setPlaceholder(props.filterBarPlaceholder, this.filterInput as HTMLInputElement);
105
+ }
106
+ private checboxCreate(e: { [key: string]: HTMLElement } | HTMLElement): { [key: string]: HTMLElement } | HTMLElement {
107
+ let item: { [key: string]: HTMLElement } | HTMLElement;
108
+ if (!isNullOrUndefined((e as { [key: string]: HTMLElement }).item)) {
109
+ item = (e as { [key: string]: HTMLElement }).item;
110
+ } else {
111
+ item = e;
112
+ }
113
+ if (this.parent.enableGroupCheckBox || ((item as HTMLElement).className !== 'e-list-group-item '
114
+ && (item as HTMLElement).className !== 'e-list-group-item')) {
115
+ let checkboxEle: HTMLElement | Element | string = createCheckBox(this.parent.createElement, true);
116
+ let icon: Element = select('div.' + ICON, (item as HTMLElement));
117
+ let id: string = (item as HTMLElement).getAttribute('data-uid');
118
+ (item as HTMLElement).insertBefore(checkboxEle, (item as HTMLElement).childNodes[isNullOrUndefined(icon) ? 0 : 1]);
119
+ select('.' + CHECKBOXFRAME, checkboxEle);
120
+ let frame: Element = select('.' + CHECKBOXFRAME, checkboxEle);
121
+ if (this.parent.enableGroupCheckBox ) {
122
+ this.parent.popupWrapper.classList.add('e-multiselect-group');
123
+ }
124
+ return item;
125
+ } else {
126
+ return item;
127
+ }
128
+ }
129
+
130
+ private setSelectAll(): void {
131
+ if (this.parent.showSelectAll) {
132
+ if (isNullOrUndefined(this.checkAllParent)) {
133
+ this.checkAllParent = this.parent.createElement('div', {
134
+ className: checkAllParent
135
+ });
136
+ this.selectAllSpan = this.parent.createElement('span', {
137
+ className: 'e-all-text'
138
+ });
139
+ this.selectAllSpan.textContent = '';
140
+ this.checkAllParent.appendChild(this.selectAllSpan);
141
+ this.setLocale();
142
+ this.checboxCreate(this.checkAllParent as { [key: string]: HTMLElement } | HTMLElement);
143
+ if (this.parent.headerTemplate) {
144
+ if (!isNullOrUndefined(this.parent.filterParent)) {
145
+ append([this.checkAllParent], this.parent.filterParent);
146
+ } else {
147
+ append([this.checkAllParent], this.parent.popupWrapper);
148
+ }
149
+ }
150
+ if (!this.parent.headerTemplate) {
151
+ if (!isNullOrUndefined(this.parent.filterParent)) {
152
+ this.parent.filterParent.parentNode.insertBefore(this.checkAllParent, this.parent.filterParent.nextSibling);
153
+ } else {
154
+ prepend([this.checkAllParent], this.parent.popupWrapper);
155
+ }
156
+ }
157
+ EventHandler.add(this.checkAllParent, 'mousedown', this.clickHandler, this);
158
+ }
159
+ if (this.parent.list.classList.contains('e-nodata') || (this.parent.listData && this.parent.listData.length <= 1)) {
160
+ this.checkAllParent.style.display = 'none';
161
+ } else {
162
+ this.checkAllParent.style.display = 'block';
163
+ }
164
+ this.parent.selectAllHeight = this.checkAllParent.getBoundingClientRect().height;
165
+ } else if (!isNullOrUndefined(this.checkAllParent)) {
166
+ this.checkAllParent.parentElement.removeChild(this.checkAllParent);
167
+ this.checkAllParent = null;
168
+ }
169
+ }
170
+
171
+ public destroy(): void {
172
+ this.removeEventListener();
173
+ }
174
+ public listSelection(args: IUpdateListArgs): void {
175
+ let target: EventTarget;
176
+ let isBlazorListbox: boolean = isBlazor() && (args.module && args.module === 'listbox');
177
+ if (!isNullOrUndefined(args.e)) {
178
+ let frameElm: Element = args.li.querySelector('.e-checkbox-wrapper .e-frame');
179
+ target = !isNullOrUndefined(args.e.target) ?
180
+ ((args.e.target as HTMLElement).classList.contains('e-frame')
181
+ && (!this.parent.showSelectAll
182
+ || ( this.checkAllParent && !this.checkAllParent.contains(args.e.target as Element)))) ?
183
+ args.e.target : (isBlazorListbox ? frameElm : args.li.querySelector('.e-checkbox-wrapper').childNodes[1])
184
+ : (isBlazorListbox ? frameElm : args.li.querySelector('.e-checkbox-wrapper').childNodes[1]);
185
+ } else {
186
+ let checkboxWrapper: Element = args.li.querySelector('.e-checkbox-wrapper');
187
+ target = checkboxWrapper ? (isBlazorListbox ?
188
+ checkboxWrapper.querySelector('.e-frame') : checkboxWrapper.childNodes[1]) : args.li.lastElementChild.childNodes[1];
189
+ }
190
+ if (this.parent.itemTemplate || this.parent.enableGroupCheckBox ) {
191
+ target = args.li.firstElementChild.childNodes[1];
192
+ }
193
+ if (!isNullOrUndefined(target)) {
194
+ this.checkWrapper = closest((target as HTMLElement), '.' + CHECKBOXWRAP) as HTMLElement;
195
+ }
196
+ if (!isNullOrUndefined(this.checkWrapper)) {
197
+ let checkElement: Element = select('.' + CHECKBOXFRAME, this.checkWrapper);
198
+ let selectAll: boolean = false;
199
+ this.validateCheckNode(this.checkWrapper, checkElement.classList.contains(CHECK), args.li, args.e, selectAll);
200
+ }
201
+ }
202
+ private validateCheckNode(
203
+ checkWrap: HTMLElement | Element,
204
+ isCheck: boolean, li?: HTMLElement | Element,
205
+ e?: KeyboardEventArgs | MouseEvent, selectAll?: boolean): void {
206
+ this.changeState(checkWrap, isCheck ? 'uncheck' : 'check', e, true, selectAll);
207
+ }
208
+ private clickHandler(e: MouseEvent): void {
209
+ let target: EventTarget;
210
+ if ((e.currentTarget as HTMLElement).classList.contains(this.checkAllParent.className)) {
211
+ target = (e.currentTarget as HTMLElement).firstElementChild.lastElementChild;
212
+ } else {
213
+ target = <Element>e.currentTarget;
214
+ }
215
+ this.checkWrapper = closest((target as HTMLElement), '.' + CHECKBOXWRAP) as HTMLElement;
216
+ let selectAll: boolean = true;
217
+ if (!isNullOrUndefined(this.checkWrapper)) {
218
+ let checkElement: Element = select('.' + CHECKBOXFRAME, this.checkWrapper);
219
+ this.validateCheckNode(this.checkWrapper, checkElement.classList.contains(CHECK), null, e, selectAll);
220
+ }
221
+ e.preventDefault();
222
+ }
223
+ private changeState(
224
+ wrapper: HTMLElement | Element, state: string, e?: MouseEvent | KeyboardEventArgs, isPrevent?: boolean, selectAll?: boolean): void {
225
+ let ariaState: string;
226
+ let frameSpan: Element = wrapper.getElementsByClassName(CHECKBOXFRAME)[0];
227
+ if (state === 'check' && !frameSpan.classList.contains(CHECK)) {
228
+ frameSpan.classList.remove(INDETERMINATE);
229
+ frameSpan.classList.add(CHECK);
230
+ ariaState = 'true';
231
+ if (selectAll) {
232
+ this.parent.selectAllItems(true, e as MouseEvent);
233
+ this.setLocale(true);
234
+ }
235
+ } else if (state === 'uncheck' && (frameSpan.classList.contains(CHECK) || frameSpan.classList.contains(INDETERMINATE))) {
236
+ removeClass([frameSpan], [CHECK, INDETERMINATE]);
237
+ ariaState = 'false';
238
+ if (selectAll) {
239
+ this.parent.selectAllItems(false, e as MouseEvent);
240
+ this.setLocale();
241
+ }
242
+ } else if (state === 'indeterminate' && !(frameSpan.classList.contains(INDETERMINATE))) {
243
+ removeClass([frameSpan], [CHECK]);
244
+ frameSpan.classList.add(INDETERMINATE);
245
+ ariaState = 'false';
246
+ if (selectAll) {
247
+ this.parent.selectAllItems(false, e as MouseEvent);
248
+ this.setLocale();
249
+ }
250
+ }
251
+ ariaState = state === 'check' ? 'true' : state === 'uncheck' ? 'false' : ariaState;
252
+ if (!isNullOrUndefined(ariaState)) {
253
+ wrapper.setAttribute('aria-checked', ariaState);
254
+ }
255
+ }
256
+ protected setSearchBox(args: IUpdateListArgs): InputObject | void {
257
+ if (isNullOrUndefined(this.parent.filterParent)) {
258
+ this.parent.filterParent = this.parent.createElement('span', {
259
+ className: filterParent
260
+ });
261
+ this.filterInput = <HTMLInputElement>this.parent.createElement('input', {
262
+ attrs: { type: 'text' },
263
+ className: filterInput
264
+ });
265
+ this.parent.element.parentNode.insertBefore(this.filterInput, this.parent.element);
266
+ let backIcon: boolean = false;
267
+ if (Browser.isDevice) {
268
+ backIcon = true;
269
+ this.parent.mobFilter = false;
270
+ }
271
+ this.filterInputObj = Input.createInput(
272
+ {
273
+ element: this.filterInput,
274
+ buttons: backIcon ? [searchBackIcon, filterBarClearIcon] : [filterBarClearIcon],
275
+ properties: { placeholder: this.parent.filterBarPlaceholder }
276
+ },
277
+ this.parent.createElement
278
+ );
279
+ if (!isNullOrUndefined(this.parent.cssClass)) {
280
+ if (this.parent.cssClass.split(' ').indexOf('e-outline') !== -1) {
281
+ addClass([this.filterInputObj.container], 'e-outline');
282
+ } else if (this.parent.cssClass.split(' ').indexOf('e-filled') !== -1) {
283
+ addClass([this.filterInputObj.container], 'e-filled');
284
+ }
285
+ }
286
+ append([this.filterInputObj.container], this.parent.filterParent);
287
+ prepend([this.parent.filterParent], args.popupElement);
288
+ attributes(this.filterInput, {
289
+ 'aria-disabled': 'false',
290
+ 'aria-owns': this.parent.element.id + '_options',
291
+ 'role': 'listbox',
292
+ 'aria-activedescendant': null,
293
+ 'autocomplete': 'off',
294
+ 'autocorrect': 'off',
295
+ 'autocapitalize': 'off',
296
+ 'spellcheck': 'false'
297
+ });
298
+ this.clearIconElement = this.filterInput.parentElement.querySelector('.' + clearIcon);
299
+ if (!Browser.isDevice && this.clearIconElement) {
300
+ EventHandler.add(this.clearIconElement, 'mousedown', this.clearText, this);
301
+ (this.clearIconElement as HTMLElement).style.visibility = 'hidden';
302
+ }
303
+ EventHandler.add(this.filterInput, 'input', this.parent.onInput, this.parent);
304
+ EventHandler.add(this.filterInput, 'keyup', this.parent.KeyUp, this.parent);
305
+ EventHandler.add(this.filterInput, 'keydown', this.parent.onKeyDown, this.parent);
306
+ EventHandler.add(this.filterInput, 'blur', this.onBlur, this);
307
+ EventHandler.add(this.filterInput, 'paste', this.parent.pasteHandler, this.parent);
308
+ this.parent.searchBoxHeight = (this.filterInputObj.container.parentElement).getBoundingClientRect().height;
309
+ return this.filterInputObj;
310
+ }
311
+ };
312
+
313
+ private clickOnBackIcon(e: EventHandler): void {
314
+ this.parent.hidePopup();
315
+ removeClass([document.body, this.parent.popupObj.element], popupFullScreen);
316
+ this.parent.inputElement.focus();
317
+ }
318
+ private clearText(e: MouseEvent): void {
319
+ (this.parent.targetInputElement as HTMLInputElement).value = '';
320
+ this.parent.refreshPopup();
321
+ this.parent.refreshListItems(null);
322
+ (this.clearIconElement as HTMLElement).style.visibility = 'hidden';
323
+ this.filterInput.focus();
324
+ this.setReorder(e);
325
+ e.preventDefault();
326
+ }
327
+
328
+ private setDeviceSearchBox(): void {
329
+ this.parent.popupObj.element.classList.add(device);
330
+ this.parent.popupObj.element.classList.add(mobileFilter);
331
+ this.parent.popupObj.position = { X: 0, Y: 0 };
332
+ this.parent.popupObj.dataBind();
333
+ this.setSearchBoxPosition();
334
+ this.backIconElement = this.filterInputObj.container.querySelector('.e-back-icon');
335
+ this.clearIconElement = this.filterInputObj.container.querySelector('.' + clearIcon);
336
+ (this.clearIconElement as HTMLElement).style.visibility = 'hidden';
337
+ EventHandler.add(this.backIconElement, 'click', this.clickOnBackIcon, this);
338
+ EventHandler.add(this.clearIconElement, 'click', this.clearText, this);
339
+ }
340
+
341
+ private setSearchBoxPosition(): void {
342
+ let searchBoxHeight: number = this.filterInput.parentElement.getBoundingClientRect().height;
343
+ let selectAllHeight: number = 0;
344
+ if (this.checkAllParent) {
345
+ selectAllHeight = this.checkAllParent.getBoundingClientRect().height;
346
+ }
347
+ this.parent.popupObj.element.style.maxHeight = '100%';
348
+ this.parent.popupObj.element.style.width = '100%';
349
+ this.parent.list.style.maxHeight = (window.innerHeight - searchBoxHeight - selectAllHeight) + 'px';
350
+ this.parent.list.style.height = (window.innerHeight - searchBoxHeight - selectAllHeight) + 'px';
351
+ let clearElement: Element = this.filterInput.parentElement.querySelector('.' + clearIcon);
352
+ detach(this.filterInput);
353
+ clearElement.parentElement.insertBefore(this.filterInput, clearElement);
354
+ }
355
+
356
+ protected setPopupFullScreen(): void {
357
+ attributes(this.parent.popupObj.element, { style: 'left:0px;right:0px;top:0px;bottom:0px;' });
358
+ addClass([document.body, this.parent.popupObj.element], popupFullScreen);
359
+ this.parent.popupObj.element.style.maxHeight = '100%';
360
+ this.parent.popupObj.element.style.width = '100%';
361
+ }
362
+
363
+ protected targetElement(): string {
364
+ if (!isNullOrUndefined(this.clearIconElement)) {
365
+ this.parent.targetInputElement = this.filterInput;
366
+ (this.clearIconElement as HTMLElement).style.visibility = this.parent.targetInputElement.value === '' ? 'hidden' : 'visible';
367
+ }
368
+ return (this.parent.targetInputElement as HTMLInputElement).value;
369
+ }
370
+
371
+ private onBlur(e: MouseEvent): void {
372
+ if (!this.parent.element.classList.contains('e-listbox')) {
373
+ let target: HTMLElement;
374
+ if (this.parent.keyAction) { return; }
375
+ if (Browser.isIE) {
376
+ target = !isNullOrUndefined(e) && <HTMLElement>e.target;
377
+ }
378
+ if (!Browser.isIE) {
379
+ target = !isNullOrUndefined(e) && <HTMLElement>e.relatedTarget;
380
+ }
381
+ if (this.parent.popupObj && document.body.contains(this.parent.popupObj.element) && this.parent.popupObj.element.contains(target)
382
+ && !Browser.isIE && this.filterInput) {
383
+ this.filterInput.focus();
384
+ return;
385
+ }
386
+ if (this.parent.scrollFocusStatus && this.filterInput) {
387
+ e.preventDefault();
388
+ this.filterInput.focus();
389
+ this.parent.scrollFocusStatus = false;
390
+ return;
391
+ }
392
+ if (this.parent.popupObj && document.body.contains(this.parent.popupObj.element)
393
+ && !this.parent.popupObj.element.classList.contains('e-popup-close')) {
394
+ this.parent.inputFocus = false;
395
+ this.parent.updateValueState(e, this.parent.value, this.parent.tempValues);
396
+ this.parent.dispatchEvent(this.parent.hiddenElement as HTMLElement, 'change');
397
+ }
398
+ if (this.parent.popupObj && document.body.contains(this.parent.popupObj.element) &&
399
+ !this.parent.popupObj.element.classList.contains('e-popup-close')) {
400
+ this.parent.inputFocus = false;
401
+ this.parent.overAllWrapper.classList.remove(FOCUS);
402
+ this.parent.trigger('blur');
403
+ this.parent.focused = true;
404
+ }
405
+ if (this.parent.popupObj && document.body.contains(this.parent.popupObj.element) &&
406
+ !this.parent.popupObj.element.classList.contains('e-popup-close') && !Browser.isDevice) {
407
+ this.parent.hidePopup();
408
+ }
409
+ }
410
+ }
411
+ protected onDocumentClick(e: MouseEvent): void {
412
+ if (this.parent.getLocaleName() !== 'listbox') {
413
+ let target: HTMLElement = <HTMLElement>e.target;
414
+ if (!isNullOrUndefined(this.parent.popupObj) && closest(target, '#' + this.parent.popupObj.element.id)) {
415
+ e.preventDefault();
416
+ }
417
+ if (!(!isNullOrUndefined(this.parent.popupObj) && closest(target, '#' + this.parent.popupObj.element.id)) &&
418
+ !this.parent.overAllWrapper.contains(e.target as Node)) {
419
+ if (this.parent.overAllWrapper.classList.contains(dropDownBaseClasses.focus) || this.parent.isPopupOpen()) {
420
+ this.parent.inputFocus = false;
421
+ this.parent.scrollFocusStatus = false;
422
+ this.parent.hidePopup();
423
+ this.parent.onBlur(e, true);
424
+ this.parent.focused = true;
425
+ }
426
+ } else {
427
+ this.parent.scrollFocusStatus = (Browser.isIE || Browser.info.name === 'edge') && (document.activeElement === this.filterInput);
428
+ }
429
+ if (!this.parent.overAllWrapper.contains(e.target as Node) && this.parent.overAllWrapper.classList.contains('e-input-focus') &&
430
+ !this.parent.isPopupOpen()) {
431
+ if (Browser.isIE) {
432
+ this.parent.onBlur();
433
+ } else {
434
+ this.parent.onBlur(e);
435
+ }
436
+ }
437
+ if (this.filterInput === target) { this.filterInput.focus(); }
438
+ }
439
+ }
440
+ private getFocus(e: IUpdateListArgs): void {
441
+ this.parent.overAllWrapper.classList.remove(FOCUS);
442
+ if (this.parent.keyAction && e.value !== 'clear') {
443
+ this.parent.keyAction = false;
444
+ return;
445
+ }
446
+ if (e.value === 'focus') {
447
+ this.filterInput.focus();
448
+ this.parent.removeFocus();
449
+ EventHandler.remove(this.parent.list, 'keydown', this.parent.onKeyDown);
450
+ }
451
+ if (e.value === 'clear') {
452
+ this.filterInput.value = '';
453
+ (this.clearIconElement as HTMLElement).style.visibility = 'hidden';
454
+ }
455
+ }
456
+ private checkSelectAll(e: IUpdateListArgs): void {
457
+ if (e.value === 'check' && this.checkAllParent.getAttribute('aria-checked') !== 'true') {
458
+ this.changeState(this.checkAllParent, e.value, null, null, false);
459
+ this.setLocale(true);
460
+ }
461
+ if (e.value === 'uncheck') {
462
+ this.changeState(this.checkAllParent, e.value, null, null, false);
463
+ this.setLocale();
464
+ }
465
+ if (e.value === 'indeterminate') {
466
+ this.changeState(this.checkAllParent, e.value, null, null, false);
467
+ this.setLocale();
468
+ }
469
+ }
470
+ private setLocale(unSelect?: boolean): void {
471
+ if (this.parent.selectAllText !== 'Select All' || this.parent.unSelectAllText !== 'Unselect All') {
472
+ let template: string = unSelect ? this.parent.unSelectAllText : this.parent.selectAllText;
473
+ let compiledString: Function;
474
+ this.selectAllSpan.textContent = '';
475
+ compiledString = compile(template);
476
+ for (let item of compiledString({}, null, null, null, !this.parent.isStringTemplate)) {
477
+ this.selectAllSpan.textContent = item.textContent;
478
+ }
479
+ } else {
480
+ let l10nLocale: Object = { selectAllText: 'Select All', unSelectAllText: 'Unselect All' };
481
+ let l10n: L10n = new L10n(this.parent.getLocaleName(), {}, this.parent.locale);
482
+ if (l10n.getConstant('selectAllText') === '') {
483
+ l10n = new L10n('dropdowns', l10nLocale, this.parent.locale);
484
+ }
485
+ this.selectAllSpan.textContent = unSelect ? l10n.getConstant('unSelectAllText') : l10n.getConstant('selectAllText');
486
+ }
487
+ }
488
+ private getActiveList(args: IUpdateListArgs): void {
489
+ if (args.li.classList.contains('e-active')) {
490
+ this.activeLi.push(args.li.cloneNode(true) as HTMLElement);
491
+ } else {
492
+ this.activeLi.splice(args.index, 1);
493
+ }
494
+ }
495
+ private setReorder(args: IUpdateListArgs | MouseEvent): void {
496
+ if (this.parent.enableSelectionOrder && !isNullOrUndefined(this.parent.value)) {
497
+ let activeLiCount: number = this.parent.ulElement.querySelectorAll('li.e-active').length;
498
+ let remLi: NodeListOf<Element>;
499
+ let ulEle: HTMLElement = this.parent.createElement('ul', {
500
+ className: 'e-list-parent e-ul e-reorder'
501
+ });
502
+ let removeEle: HTMLElement = this.parent.createElement('div');
503
+ if (activeLiCount > 0) {
504
+ append(this.parent.ulElement.querySelectorAll('li.e-active'), ulEle);
505
+ remLi = this.parent.ulElement.querySelectorAll('li.e-active');
506
+ addClass(remLi, 'e-reorder-hide');
507
+ prepend([ulEle], this.parent.list);
508
+ }
509
+ this.parent.focusAtFirstListItem();
510
+ }
511
+ }
512
+ }
513
+
514
+ export interface ItemCreatedArgs {
515
+ curData: { [key: string]: Object };
516
+ item: HTMLElement;
517
+ text: string;
518
+ }
519
+
520
+ export interface IUpdateListArgs {
521
+ module: string;
522
+ enable: boolean;
523
+ li: HTMLElement;
524
+ e: MouseEvent | KeyboardEventArgs;
525
+ popupElement: HTMLElement;
526
+ value: string;
527
+ index: number;
528
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * FloatLable Moduel
3
+ * Specifies whether to display the floating label above the input element.
4
+ */
5
+ import { removeClass, addClass, detach } from '@syncfusion/ej2-base';
6
+ import { attributes, isNullOrUndefined, createElement } from '@syncfusion/ej2-base';
7
+ import { FloatLabelType } from '@syncfusion/ej2-inputs';
8
+
9
+ const FLOATLINE: string = 'e-float-line';
10
+ const FLOATTEXT: string = 'e-float-text';
11
+ const LABELTOP: string = 'e-label-top';
12
+ const LABELBOTTOM: string = 'e-label-bottom';
13
+
14
+
15
+ /**
16
+ * Function to create Float Label element.
17
+ * @param overAllWrapper - overall wrapper of multiselect.
18
+ * @param element - the given html element.
19
+ * @param inputElement - specify the input wrapper.
20
+ * @param value - Value of the MultiSelect.
21
+ * @param floatLabelType - Specify the FloatLabel Type.
22
+ * @param placeholder - Specify the PlaceHolder text.
23
+ */
24
+ export function createFloatLabel(
25
+ overAllWrapper: HTMLDivElement,
26
+ searchWrapper: HTMLElement, element: HTMLElement,
27
+ inputElement: HTMLInputElement, value: number[] | string[] | boolean[], floatLabelType: FloatLabelType,
28
+ placeholder: string): void {
29
+ let floatLinelement: HTMLElement;
30
+ let floatLabelElement: HTMLElement;
31
+ floatLinelement = createElement('span', { className: FLOATLINE });
32
+ floatLabelElement = createElement('label', { className: FLOATTEXT });
33
+ if (!isNullOrUndefined(element.id) && element.id !== '') {
34
+ floatLabelElement.id = 'label_' + element.id.replace(/ /g, '_');
35
+ attributes(element, { 'aria-labelledby': floatLabelElement.id });
36
+ }
37
+ if (!isNullOrUndefined(inputElement.placeholder) && inputElement.placeholder !== '') {
38
+ floatLabelElement.innerHTML = inputElement.placeholder;
39
+ inputElement.removeAttribute('placeholder');
40
+ }
41
+ floatLabelElement.innerHTML = placeholder;
42
+ searchWrapper.appendChild(floatLinelement);
43
+ searchWrapper.appendChild(floatLabelElement);
44
+ overAllWrapper.classList.add('e-float-input');
45
+ updateFloatLabelState(value, floatLabelElement);
46
+ if (floatLabelType === 'Always') {
47
+ if (floatLabelElement.classList.contains(LABELBOTTOM)) {
48
+ removeClass([floatLabelElement], LABELBOTTOM);
49
+ }
50
+ addClass([floatLabelElement], LABELTOP);
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Function to update status of the Float Label element.
56
+ * @param value - Value of the MultiSelect.
57
+ * @param label - float label element.
58
+ */
59
+ export function updateFloatLabelState(value: string[] | number[] | boolean[], label: HTMLElement): void {
60
+ if (value && value.length > 0) {
61
+ addClass([label], LABELTOP);
62
+ removeClass([label], LABELBOTTOM);
63
+ } else {
64
+ removeClass([label], LABELTOP);
65
+ addClass([label], LABELBOTTOM);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Function to remove Float Label element.
71
+ * @param overAllWrapper - overall wrapper of multiselect.
72
+ * @param componentWrapper - wrapper element of multiselect.
73
+ * @param searchWrapper - search wrapper of multiselect.
74
+ * @param inputElement - specify the input wrapper.
75
+ * @param value - Value of the MultiSelect.
76
+ * @param floatLabelType - Specify the FloatLabel Type.
77
+ * @param placeholder - Specify the PlaceHolder text.
78
+ */
79
+ export function removeFloating(
80
+ overAllWrapper: HTMLDivElement,
81
+ componentWrapper: HTMLDivElement,
82
+ searchWrapper: HTMLElement,
83
+ inputElement: HTMLInputElement,
84
+ value: number[] | string[] | boolean[],
85
+ floatLabelType: FloatLabelType,
86
+ placeholder: string): void {
87
+ let placeholderElement: HTMLElement = componentWrapper.querySelector('.' + FLOATTEXT) as HTMLElement;
88
+ let floatLine: HTMLElement = componentWrapper.querySelector('.' + FLOATLINE) as HTMLElement;
89
+ let placeholderText: string;
90
+ if (!isNullOrUndefined(placeholderElement)) {
91
+ placeholderText = placeholderElement.innerText;
92
+ detach(searchWrapper.querySelector('.' + FLOATTEXT));
93
+ setPlaceHolder(value, inputElement, placeholderText);
94
+ if (!isNullOrUndefined(floatLine)) {
95
+ detach(searchWrapper.querySelector('.' + FLOATLINE));
96
+ }
97
+ } else {
98
+ placeholderText = (placeholder !== null) ? placeholder : '';
99
+ setPlaceHolder(value, inputElement, placeholderText);
100
+ }
101
+ overAllWrapper.classList.remove('e-float-input');
102
+ }
103
+
104
+ /**
105
+ * Function to set the placeholder to the element.
106
+ * @param value - Value of the MultiSelect.
107
+ * @param inputElement - specify the input wrapper.
108
+ * @param placeholder - Specify the PlaceHolder text.
109
+ */
110
+ export function setPlaceHolder(value: number[] | string[] | boolean[], inputElement: HTMLInputElement, placeholder: string): void {
111
+ if (value && value.length) {
112
+ inputElement.placeholder = '';
113
+ } else {
114
+ inputElement.placeholder = placeholder;
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Function for focusing the Float Element.
120
+ * @param overAllWrapper - overall wrapper of multiselect.
121
+ * @param componentWrapper - wrapper element of multiselect.
122
+ */
123
+ export function floatLabelFocus(overAllWrapper: HTMLDivElement, componentWrapper: HTMLDivElement): void {
124
+ overAllWrapper.classList.add('e-input-focus');
125
+ let label: Element = componentWrapper.querySelector('.' + FLOATTEXT);
126
+ if (!isNullOrUndefined(label)) {
127
+ addClass([label], LABELTOP);
128
+ if (label.classList.contains(LABELBOTTOM)) {
129
+ removeClass([label], LABELBOTTOM);
130
+ }
131
+ }
132
+ }
133
+ /**
134
+ * Function to focus the Float Label element.
135
+ * @param overAllWrapper - overall wrapper of multiselect.
136
+ * @param componentWrapper - wrapper element of multiselect.
137
+ * @param value - Value of the MultiSelect.
138
+ * @param floatLabelType - Specify the FloatLabel Type.
139
+ * @param placeholder - Specify the PlaceHolder text.
140
+ */
141
+ export function floatLabelBlur(
142
+ overAllWrapper: HTMLDivElement,
143
+ componentWrapper: HTMLDivElement,
144
+ value: number[] | string[] | boolean[],
145
+ floatLabelType: FloatLabelType,
146
+ placeholder: string): void {
147
+ overAllWrapper.classList.remove('e-input-focus');
148
+ let label: Element = componentWrapper.querySelector('.' + FLOATTEXT);
149
+ if (value && value.length <= 0 && floatLabelType === 'Auto' && !isNullOrUndefined(label)) {
150
+ if (label.classList.contains(LABELTOP)) {
151
+ removeClass([label], LABELTOP);
152
+ }
153
+ addClass([label], LABELBOTTOM);
154
+ }
155
+ }