ngx-dropdown-list 1.1.0 → 1.2.0

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 (65) hide show
  1. package/README.md +2 -2
  2. package/esm2020/ngx-dropdown-list.mjs +5 -0
  3. package/esm2020/public_api.mjs +2 -0
  4. package/esm2020/src/ngx-dropdown-list/anchor/anchor.component.mjs +149 -0
  5. package/esm2020/src/ngx-dropdown-list/dropdown/dropdown.component.mjs +252 -0
  6. package/esm2020/src/ngx-dropdown-list/dropdown-list.component.mjs +233 -0
  7. package/esm2020/src/ngx-dropdown-list/dropdown-list.module.mjs +38 -0
  8. package/esm2020/src/ngx-dropdown-list/filter/input-filter.component.mjs +44 -0
  9. package/esm2020/src/ngx-dropdown-list/group-item/group-item.component.mjs +25 -0
  10. package/esm2020/src/ngx-dropdown-list/index.mjs +3 -0
  11. package/esm2020/src/ngx-dropdown-list/item/item.component.mjs +77 -0
  12. package/esm2020/src/ngx-dropdown-list/types/index.mjs +3 -0
  13. package/esm2020/src/ngx-dropdown-list/types/selection-group-items.types.mjs +2 -0
  14. package/esm2020/src/ngx-dropdown-list/types/selection-item.types.mjs +2 -0
  15. package/esm2020/src/ngx-dropdown-list/utils/util.mjs +59 -0
  16. package/fesm2015/ngx-dropdown-list.mjs +854 -0
  17. package/fesm2015/ngx-dropdown-list.mjs.map +1 -0
  18. package/fesm2020/ngx-dropdown-list.mjs +854 -0
  19. package/fesm2020/ngx-dropdown-list.mjs.map +1 -0
  20. package/ngx-dropdown-list.d.ts +1 -5
  21. package/package.json +26 -48
  22. package/src/ngx-dropdown-list/anchor/anchor.component.d.ts +6 -3
  23. package/src/ngx-dropdown-list/dropdown/dropdown.component.d.ts +5 -2
  24. package/src/ngx-dropdown-list/dropdown-list.component.d.ts +7 -4
  25. package/src/ngx-dropdown-list/dropdown-list.module.d.ts +12 -0
  26. package/src/ngx-dropdown-list/filter/input-filter.component.d.ts +3 -0
  27. package/src/ngx-dropdown-list/group-item/group-item.component.d.ts +3 -0
  28. package/src/ngx-dropdown-list/item/item.component.d.ts +3 -0
  29. package/bundles/ngx-dropdown-list.umd.js +0 -1180
  30. package/bundles/ngx-dropdown-list.umd.js.map +0 -1
  31. package/bundles/ngx-dropdown-list.umd.min.js +0 -2
  32. package/bundles/ngx-dropdown-list.umd.min.js.map +0 -1
  33. package/esm2015/ngx-dropdown-list.js +0 -14
  34. package/esm2015/public_api.js +0 -6
  35. package/esm2015/src/ngx-dropdown-list/anchor/anchor.component.js +0 -226
  36. package/esm2015/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -339
  37. package/esm2015/src/ngx-dropdown-list/dropdown-list.component.js +0 -290
  38. package/esm2015/src/ngx-dropdown-list/dropdown-list.module.js +0 -32
  39. package/esm2015/src/ngx-dropdown-list/filter/input-filter.component.js +0 -64
  40. package/esm2015/src/ngx-dropdown-list/group-item/group-item.component.js +0 -37
  41. package/esm2015/src/ngx-dropdown-list/index.js +0 -7
  42. package/esm2015/src/ngx-dropdown-list/item/item.component.js +0 -104
  43. package/esm2015/src/ngx-dropdown-list/types/index.js +0 -7
  44. package/esm2015/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
  45. package/esm2015/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
  46. package/esm2015/src/ngx-dropdown-list/utils/util.js +0 -73
  47. package/esm5/ngx-dropdown-list.js +0 -14
  48. package/esm5/public_api.js +0 -6
  49. package/esm5/src/ngx-dropdown-list/anchor/anchor.component.js +0 -272
  50. package/esm5/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -408
  51. package/esm5/src/ngx-dropdown-list/dropdown-list.component.js +0 -361
  52. package/esm5/src/ngx-dropdown-list/dropdown-list.module.js +0 -36
  53. package/esm5/src/ngx-dropdown-list/filter/input-filter.component.js +0 -79
  54. package/esm5/src/ngx-dropdown-list/group-item/group-item.component.js +0 -47
  55. package/esm5/src/ngx-dropdown-list/index.js +0 -7
  56. package/esm5/src/ngx-dropdown-list/item/item.component.js +0 -120
  57. package/esm5/src/ngx-dropdown-list/types/index.js +0 -7
  58. package/esm5/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
  59. package/esm5/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
  60. package/esm5/src/ngx-dropdown-list/utils/util.js +0 -96
  61. package/fesm2015/ngx-dropdown-list.js +0 -890
  62. package/fesm2015/ngx-dropdown-list.js.map +0 -1
  63. package/fesm5/ngx-dropdown-list.js +0 -1137
  64. package/fesm5/ngx-dropdown-list.js.map +0 -1
  65. package/ngx-dropdown-list.metadata.json +0 -1
@@ -0,0 +1,854 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, ElementRef, Component, ViewChild, Input, Output, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { DecimalPipe, CommonModule } from '@angular/common';
5
+ import * as i1$1 from '@angular/forms';
6
+ import { FormsModule } from '@angular/forms';
7
+
8
+ /**
9
+ * check whether the provided items contains group
10
+ */
11
+ function hasGroup(items) {
12
+ return items ? (items.find(item => item.group) != null) : false;
13
+ }
14
+ /**
15
+ * clear all selections from the provide items.
16
+ * @param items the dropdown items, can be group or item
17
+ */
18
+ function clearAllSelection(items) {
19
+ if (hasGroup(items)) {
20
+ for (const groupItem of items) {
21
+ if (groupItem.items) {
22
+ groupItem.items.filter(item => item.selected).forEach(item => item.selected = false);
23
+ }
24
+ }
25
+ }
26
+ else {
27
+ // clear the selection of previous selected item
28
+ items.filter(item => item.selected).forEach(item => item.selected = false);
29
+ }
30
+ }
31
+ /**
32
+ * stop all propagation and default actions
33
+ */
34
+ function stopPropagationAndDefault(event) {
35
+ event.stopImmediatePropagation();
36
+ event.stopPropagation();
37
+ event.preventDefault();
38
+ }
39
+ /**
40
+ * check whether the provided value is number of not
41
+ */
42
+ function isNumber(value) {
43
+ return !(value == null || isNaN(value) || value.length === 0);
44
+ }
45
+ /**
46
+ * get the selected item from the items list (including item and group)
47
+ */
48
+ function getFirstSelectedItem(items) {
49
+ if (!items) {
50
+ return undefined;
51
+ }
52
+ let selectedItem;
53
+ if (hasGroup(items)) {
54
+ for (const item of items) {
55
+ selectedItem = item.items ? item.items.find(subItem => subItem.selected) : undefined;
56
+ if (selectedItem) {
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ else {
62
+ selectedItem = items ? items.find(item => item.selected) : undefined;
63
+ }
64
+ return selectedItem;
65
+ }
66
+
67
+ class AnchorComponent {
68
+ constructor(_decimalPipe) {
69
+ this._decimalPipe = _decimalPipe;
70
+ /**
71
+ * bind to [checkbox] for checking whether the clearance flag should be shown or not.
72
+ */
73
+ this.checkbox = false;
74
+ /**
75
+ * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
76
+ */
77
+ this.allowClear = true;
78
+ /**
79
+ * bind to [openStatus], it's the visibility status of dropdown, for showing the arrow on anchor
80
+ */
81
+ this.openStatus = false;
82
+ /**
83
+ * bind to [disabled] for disabling the anchor
84
+ */
85
+ this.disabled = false;
86
+ /**
87
+ * will be triggered when clicking the anchor
88
+ */
89
+ this.anchorClick = new EventEmitter();
90
+ /**
91
+ * will be triggered when clicking the clearance
92
+ */
93
+ this.clearanceClick = new EventEmitter();
94
+ }
95
+ /**
96
+ * flag for showing the clearance flag
97
+ */
98
+ get showClearanceFlag() {
99
+ return !this.checkbox && this.selectedText && this.allowClear;
100
+ }
101
+ /**
102
+ * the text displays on anchor
103
+ */
104
+ get anchorDisplayText() {
105
+ let anchorDisplayText = this.selectedText ? (this.formatNumber ? (isNumber(this.selectedText) ?
106
+ this._decimalPipe.transform(this.selectedText, '1.0-2') : this.selectedText) :
107
+ this.selectedText) + (this.suffixText ? this.suffixText : '') : this.placeHolder;
108
+ let charLength = 1;
109
+ if (this.showClearanceFlag && this.anchorLength > 0) {
110
+ charLength = Math.floor((this.anchorLength - 50) / 7);
111
+ }
112
+ else {
113
+ charLength = Math.floor((this.anchorLength - 50) / 7);
114
+ }
115
+ if (anchorDisplayText.length > charLength) {
116
+ anchorDisplayText = anchorDisplayText.slice(0, charLength - 2) + '...';
117
+ }
118
+ return anchorDisplayText;
119
+ }
120
+ /**
121
+ * anchor CSS class
122
+ */
123
+ get anchorClass() {
124
+ let anchorClassStatusPart;
125
+ let anchorClassFontColor;
126
+ if (this.disabled) {
127
+ anchorClassStatusPart = 'selection-anchor-disabled';
128
+ anchorClassFontColor = 'place-holder';
129
+ }
130
+ else {
131
+ if (this.openStatus) {
132
+ anchorClassStatusPart = 'selection-anchor-open';
133
+ }
134
+ else {
135
+ anchorClassStatusPart = 'selection-anchor-close';
136
+ }
137
+ if (this.selectedText != null) {
138
+ anchorClassFontColor = 'selected-item';
139
+ }
140
+ else {
141
+ anchorClassFontColor = 'place-holder';
142
+ }
143
+ }
144
+ return `${anchorClassStatusPart} ${anchorClassFontColor}`;
145
+ }
146
+ /**
147
+ * triggered when clicking the anchor
148
+ */
149
+ onAnchorClick(event) {
150
+ this.anchorClick.emit(event);
151
+ }
152
+ /**
153
+ * triggered with (blur) of anchor
154
+ */
155
+ onAnchorBlur(event) {
156
+ stopPropagationAndDefault(event);
157
+ }
158
+ /**
159
+ * triggered when clicking the clearance
160
+ */
161
+ onClearanceClick(event) {
162
+ this.clearanceClick.emit(event);
163
+ }
164
+ /**
165
+ * triggered when resizing, get the clientWidth of anchor
166
+ */
167
+ onResize() {
168
+ this.anchorLength = this.anchorRef ? this.anchorRef.nativeElement ? this.anchorRef.nativeElement.clientWidth : 0 : 0;
169
+ }
170
+ }
171
+ AnchorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AnchorComponent, deps: [{ token: i1.DecimalPipe }], target: i0.ɵɵFactoryTarget.Component });
172
+ AnchorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AnchorComponent, selector: "anchor", inputs: { placeHolder: "placeHolder", checkbox: "checkbox", suffixText: "suffixText", allowClear: "allowClear", formatNumber: "formatNumber", selectedText: "selectedText", openStatus: "openStatus", disabled: "disabled" }, outputs: { anchorClick: "anchorClick", clearanceClick: "clearanceClick" }, providers: [DecimalPipe], viewQueries: [{ propertyName: "anchorRef", first: true, predicate: ["anchor"], descendants: true, read: ElementRef }], ngImport: i0, template: `
173
+ <span #anchor tabindex="2" [ngClass]="anchorClass" (window:resize)="onResize()"
174
+ (mousedown)="onAnchorClick($event)" (blur)="onAnchorBlur($event)"> {{anchorDisplayText}}
175
+ <span #selectionClearance class="selection-clearance" (mousedown)="onClearanceClick($event)" *ngIf="showClearanceFlag">&times;</span>
176
+ </span>
177
+ `, isInline: true, styles: ["@charset \"UTF-8\";*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.vertical-center,.selection-anchor-close:after,.selection-anchor-open:after,.selection-anchor-disabled:after{position:absolute;top:50%;transform:translateY(-50%)}.hover-box,.selection-anchor-close:hover{outline:0;box-shadow:0 0 6px #23adff;border-radius:4px}.anchor-box,.selection-anchor-disabled,.selection-anchor,.selection-anchor-close,.selection-anchor-open{height:100%;border-radius:4px;width:100%;position:relative;display:inline-block;padding:8px 12px 5px;border:1px solid;outline:0;box-shadow:inset 0 1px 1px #00000013;box-sizing:border-box;white-space:nowrap}.selection-anchor,.selection-anchor-close,.selection-anchor-open{cursor:pointer}.selection-anchor .selection-clearance,.selection-anchor-close .selection-clearance,.selection-anchor-open .selection-clearance{position:absolute;right:35px;font-weight:700}.selection-anchor .selection-clearance:hover,.selection-anchor-close .selection-clearance:hover,.selection-anchor-open .selection-clearance:hover{color:#000}.selection-anchor:focus,.selection-anchor-close:focus,.selection-anchor-open:focus{box-shadow:inset 0 1px 1px #00000013,0 0 8px #66afe999;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;border-color:#66afe9}.selection-anchor-disabled{border-color:#ccc;cursor:default;pointer-events:none;background:#f8f8f8;filter:opacity(50%)}.selection-anchor-disabled:after{font-size:9px;content:\"\\25bc\";right:10px;padding-bottom:3px}.selection-anchor-open{border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0;border-color:#66afe9}.selection-anchor-open:after{font-size:9px;content:\"\\25b2\";right:10px;padding-bottom:3px}.selection-anchor-close{border-color:#ccc}.selection-anchor-close:after{font-size:9px;content:\"\\25bc\";right:10px;padding-bottom:3px}.place-holder{color:#999}.selected-item{color:#495057}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AnchorComponent, decorators: [{
179
+ type: Component,
180
+ args: [{ selector: 'anchor', template: `
181
+ <span #anchor tabindex="2" [ngClass]="anchorClass" (window:resize)="onResize()"
182
+ (mousedown)="onAnchorClick($event)" (blur)="onAnchorBlur($event)"> {{anchorDisplayText}}
183
+ <span #selectionClearance class="selection-clearance" (mousedown)="onClearanceClick($event)" *ngIf="showClearanceFlag">&times;</span>
184
+ </span>
185
+ `, providers: [DecimalPipe], styles: ["@charset \"UTF-8\";*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.vertical-center,.selection-anchor-close:after,.selection-anchor-open:after,.selection-anchor-disabled:after{position:absolute;top:50%;transform:translateY(-50%)}.hover-box,.selection-anchor-close:hover{outline:0;box-shadow:0 0 6px #23adff;border-radius:4px}.anchor-box,.selection-anchor-disabled,.selection-anchor,.selection-anchor-close,.selection-anchor-open{height:100%;border-radius:4px;width:100%;position:relative;display:inline-block;padding:8px 12px 5px;border:1px solid;outline:0;box-shadow:inset 0 1px 1px #00000013;box-sizing:border-box;white-space:nowrap}.selection-anchor,.selection-anchor-close,.selection-anchor-open{cursor:pointer}.selection-anchor .selection-clearance,.selection-anchor-close .selection-clearance,.selection-anchor-open .selection-clearance{position:absolute;right:35px;font-weight:700}.selection-anchor .selection-clearance:hover,.selection-anchor-close .selection-clearance:hover,.selection-anchor-open .selection-clearance:hover{color:#000}.selection-anchor:focus,.selection-anchor-close:focus,.selection-anchor-open:focus{box-shadow:inset 0 1px 1px #00000013,0 0 8px #66afe999;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;border-color:#66afe9}.selection-anchor-disabled{border-color:#ccc;cursor:default;pointer-events:none;background:#f8f8f8;filter:opacity(50%)}.selection-anchor-disabled:after{font-size:9px;content:\"\\25bc\";right:10px;padding-bottom:3px}.selection-anchor-open{border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0;border-color:#66afe9}.selection-anchor-open:after{font-size:9px;content:\"\\25b2\";right:10px;padding-bottom:3px}.selection-anchor-close{border-color:#ccc}.selection-anchor-close:after{font-size:9px;content:\"\\25bc\";right:10px;padding-bottom:3px}.place-holder{color:#999}.selected-item{color:#495057}\n"] }]
186
+ }], ctorParameters: function () { return [{ type: i1.DecimalPipe }]; }, propDecorators: { anchorRef: [{
187
+ type: ViewChild,
188
+ args: ['anchor', { read: ElementRef }]
189
+ }], placeHolder: [{
190
+ type: Input
191
+ }], checkbox: [{
192
+ type: Input
193
+ }], suffixText: [{
194
+ type: Input
195
+ }], allowClear: [{
196
+ type: Input
197
+ }], formatNumber: [{
198
+ type: Input
199
+ }], selectedText: [{
200
+ type: Input
201
+ }], openStatus: [{
202
+ type: Input
203
+ }], disabled: [{
204
+ type: Input
205
+ }], anchorClick: [{
206
+ type: Output
207
+ }], clearanceClick: [{
208
+ type: Output
209
+ }] } });
210
+
211
+ class InputFilterComponent {
212
+ constructor() {
213
+ /**
214
+ * bind to [inputFilterBlur], emits with (blur) of filter input box
215
+ */
216
+ this.inputFilterBlur = new EventEmitter();
217
+ /**
218
+ * bind to [filterValueChange], for 2-way binding of filterValue
219
+ */
220
+ this.filterValueChange = new EventEmitter();
221
+ }
222
+ /**
223
+ * triggers with (blur) event, emits the (inputFilterBlur) event
224
+ */
225
+ onFilterTextBlur(event) {
226
+ this.inputFilterBlur.emit(event);
227
+ }
228
+ /**
229
+ * triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
230
+ */
231
+ onChange() {
232
+ this.filterValueChange.emit(this.filterValue);
233
+ }
234
+ }
235
+ InputFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: InputFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
236
+ InputFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: InputFilterComponent, selector: "input-filter", inputs: { filterValue: "filterValue" }, outputs: { inputFilterBlur: "inputFilterBlur", filterValueChange: "filterValueChange" }, ngImport: i0, template: `
237
+ <input type="text" class="filter-box" [(ngModel)]="filterValue" (input)="onChange()" (blur)="onFilterTextBlur($event)">
238
+ `, isInline: true, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.filter-box{width:calc(100% - 10px);height:28px;border-radius:4px;border:1px solid #ccc;margin:1px 5px 5px;padding-left:5px;font-size:12px;box-sizing:border-box;color:#495057}.filter-box:focus{outline:0;border-color:#ccc}\n"], directives: [{ type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: InputFilterComponent, decorators: [{
240
+ type: Component,
241
+ args: [{ selector: 'input-filter', template: `
242
+ <input type="text" class="filter-box" [(ngModel)]="filterValue" (input)="onChange()" (blur)="onFilterTextBlur($event)">
243
+ `, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.filter-box{width:calc(100% - 10px);height:28px;border-radius:4px;border:1px solid #ccc;margin:1px 5px 5px;padding-left:5px;font-size:12px;box-sizing:border-box;color:#495057}.filter-box:focus{outline:0;border-color:#ccc}\n"] }]
244
+ }], propDecorators: { filterValue: [{
245
+ type: Input
246
+ }], inputFilterBlur: [{
247
+ type: Output
248
+ }], filterValueChange: [{
249
+ type: Output
250
+ }] } });
251
+
252
+ class GroupItemComponent {
253
+ /**
254
+ * prevent all clicking event from happening
255
+ */
256
+ onItemGroupClick(event) {
257
+ event.stopImmediatePropagation();
258
+ event.stopPropagation();
259
+ event.preventDefault();
260
+ }
261
+ }
262
+ GroupItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: GroupItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
263
+ GroupItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: GroupItemComponent, selector: "group-item", inputs: { item: "item" }, ngImport: i0, template: `
264
+ <label class="dropdown-item dropdown-item-group" (mousedown)="onItemGroupClick($event)">{{item.group}}</label>
265
+ `, isInline: true, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown-item,.container-selection,.container-selection-selected,.container-checkbox{background:transparent;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196F3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection:hover,.container-selection-selected:hover{color:#495057;background:lightcyan}.container-selection-selected{color:#fff;background:cornflowerblue}.dropdown-item-group{font-weight:700}.dropdown-item-group:hover{cursor:default}\n"] });
266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: GroupItemComponent, decorators: [{
267
+ type: Component,
268
+ args: [{ selector: 'group-item', template: `
269
+ <label class="dropdown-item dropdown-item-group" (mousedown)="onItemGroupClick($event)">{{item.group}}</label>
270
+ `, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown-item,.container-selection,.container-selection-selected,.container-checkbox{background:transparent;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196F3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection:hover,.container-selection-selected:hover{color:#495057;background:lightcyan}.container-selection-selected{color:#fff;background:cornflowerblue}.dropdown-item-group{font-weight:700}.dropdown-item-group:hover{cursor:default}\n"] }]
271
+ }], propDecorators: { item: [{
272
+ type: Input
273
+ }] } });
274
+
275
+ class ItemComponent {
276
+ constructor() {
277
+ /**
278
+ * bind to [formatNumber], the flag for formatting the number
279
+ */
280
+ this.formatNumber = false;
281
+ /**
282
+ * bind to [itemClick] event, triggers when clicking the item of dropdown
283
+ */
284
+ this.itemClick = new EventEmitter();
285
+ /**
286
+ * bind to [checkStatusChange] event, triggers when check status is changed in checkbox mode.
287
+ */
288
+ this.checkStatusChange = new EventEmitter();
289
+ }
290
+ /**
291
+ * check whether needs to format number for the provided text
292
+ */
293
+ needFormatNumber(value) {
294
+ return isNumber(value) && this.formatNumber;
295
+ }
296
+ /**
297
+ * triggered when clicking the item, emits the [itemClick] event
298
+ */
299
+ onItemClick(item) {
300
+ this.itemClick.emit(item);
301
+ }
302
+ /**
303
+ * triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
304
+ */
305
+ onCheckStatusChange(item) {
306
+ this.checkStatusChange.emit(item);
307
+ }
308
+ }
309
+ ItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
310
+ ItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ItemComponent, selector: "item", inputs: { checkbox: "checkbox", item: "item", formatNumber: "formatNumber", suffixText: "suffixText" }, outputs: { itemClick: "itemClick", checkStatusChange: "checkStatusChange" }, ngImport: i0, template: `
311
+ <label [class.container-checkbox]="checkbox"
312
+ [class.container-selection]="!checkbox && !item.selected"
313
+ [class.container-selection-selected]="!checkbox && item.selected"
314
+ [id]="item.id" (mousedown)="onItemClick(item)">
315
+ {{needFormatNumber(item.text)? (item.text | number:'1.0-2') : item.text}}{{suffixText? suffixText : ''}}
316
+ <ng-container *ngIf="checkbox">
317
+ <input type='checkbox' [id]="'checkbox-'+item.text" (change)="onCheckStatusChange(item)" [checked]="item.selected">
318
+ <span class="checkmark" [id]="'checkmark-'+item.text"></span>
319
+ </ng-container>
320
+ </label>`, isInline: true, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown-item,.container-selection,.container-selection-selected,.container-checkbox{background:transparent;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196F3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection:hover,.container-selection-selected:hover{color:#495057;background:lightcyan}.container-selection-selected{color:#fff;background:cornflowerblue}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "number": i1.DecimalPipe } });
321
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ItemComponent, decorators: [{
322
+ type: Component,
323
+ args: [{ selector: 'item', template: `
324
+ <label [class.container-checkbox]="checkbox"
325
+ [class.container-selection]="!checkbox && !item.selected"
326
+ [class.container-selection-selected]="!checkbox && item.selected"
327
+ [id]="item.id" (mousedown)="onItemClick(item)">
328
+ {{needFormatNumber(item.text)? (item.text | number:'1.0-2') : item.text}}{{suffixText? suffixText : ''}}
329
+ <ng-container *ngIf="checkbox">
330
+ <input type='checkbox' [id]="'checkbox-'+item.text" (change)="onCheckStatusChange(item)" [checked]="item.selected">
331
+ <span class="checkmark" [id]="'checkmark-'+item.text"></span>
332
+ </ng-container>
333
+ </label>`, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown-item,.container-selection,.container-selection-selected,.container-checkbox{background:transparent;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196F3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection:hover,.container-selection-selected:hover{color:#495057;background:lightcyan}.container-selection-selected{color:#fff;background:cornflowerblue}\n"] }]
334
+ }], propDecorators: { checkbox: [{
335
+ type: Input
336
+ }], item: [{
337
+ type: Input
338
+ }], formatNumber: [{
339
+ type: Input
340
+ }], suffixText: [{
341
+ type: Input
342
+ }], itemClick: [{
343
+ type: Output
344
+ }], checkStatusChange: [{
345
+ type: Output
346
+ }] } });
347
+
348
+ class DropdownComponent {
349
+ constructor() {
350
+ /**
351
+ * bind to [checkbox], the flag for multi-select (checkbox) mode.
352
+ */
353
+ this.checkbox = false;
354
+ /**
355
+ * bind to [filterBox] for displaying the filter input text box
356
+ */
357
+ this.filterBox = false;
358
+ /**
359
+ * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
360
+ */
361
+ this.allowClear = true;
362
+ /**
363
+ * bind to [formatNumber] for show formatted number text
364
+ */
365
+ this.formatNumber = false;
366
+ /**
367
+ * for 2-way binding of [selectedValue]
368
+ */
369
+ this.selectedValueChange = new EventEmitter(true);
370
+ /**
371
+ * [selectionChange] event that will be triggered when changing of the selection
372
+ */
373
+ this.selectionChange = new EventEmitter(true);
374
+ /**
375
+ * [dropdownBlur] event that will be triggered with (blur) of dropdown
376
+ */
377
+ this.dropdownBlur = new EventEmitter();
378
+ /**
379
+ * [itemClick] event that will be triggered when clicking the option of dropdown
380
+ */
381
+ this.itemClick = new EventEmitter();
382
+ /**
383
+ * flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
384
+ */
385
+ this._clickedItems = false;
386
+ }
387
+ ngOnChanges(changes) {
388
+ if (changes.items) {
389
+ this._checkSelectionChange(changes.items.previousValue, changes.items.currentValue);
390
+ }
391
+ }
392
+ /**
393
+ * triggered when clicking the dropdown
394
+ */
395
+ onItemsClick(event) {
396
+ if (event.offsetX > (event.target.clientWidth + event.target.clientLeft)) {
397
+ stopPropagationAndDefault(event);
398
+ return;
399
+ }
400
+ // should ignore clicking on filter
401
+ if (this.checkbox && event.target.type !== 'text') {
402
+ this._clickedItems = true;
403
+ }
404
+ }
405
+ /**
406
+ * triggered when clicking the item
407
+ */
408
+ onItemClick(currentItem) {
409
+ if (!this.checkbox) {
410
+ this.selectedValue = this._getItemValue(currentItem); // currentItem.value != null ? currentItem.value : currentItem.text;
411
+ clearAllSelection(this.items);
412
+ // set the selection of current one
413
+ currentItem.selected = true;
414
+ this.itemClick.emit(currentItem);
415
+ this._onSelectionChange(this.selectedValue);
416
+ }
417
+ }
418
+ /**
419
+ * triggers with (blur) event of filter input box
420
+ */
421
+ onFilterTextBlur(event) {
422
+ this.dropdownBlur.emit(event);
423
+ }
424
+ /**
425
+ * triggers with (blur) event of dropdown
426
+ */
427
+ onItemsBlur(event) {
428
+ if (this.checkbox) {
429
+ if (this._clickedItems) {
430
+ // in checkbox mode, this blur event will be ignored when clicking the dropdown (check the checkbox)
431
+ event.target.focus();
432
+ this._clickedItems = false;
433
+ return;
434
+ }
435
+ }
436
+ this.dropdownBlur.emit(event);
437
+ }
438
+ /**
439
+ * toggle the selection when checking status changed (in checkbox mode)
440
+ */
441
+ toggleSelection(item) {
442
+ item.selected = !item.selected;
443
+ this.selectionChange.emit(this._getItemValue(item)); // item.value != null ? item.value : item.text);
444
+ }
445
+ /**
446
+ * items values list after applying the filter
447
+ */
448
+ get itemsValues() {
449
+ let filter;
450
+ if (this.filterValue) {
451
+ filter = this.filterValue.toUpperCase();
452
+ }
453
+ if (filter == null) {
454
+ return this.items;
455
+ }
456
+ if (!this.items || this.items.length === 0) {
457
+ return [];
458
+ }
459
+ if (hasGroup(this.items)) {
460
+ const items = [];
461
+ this.items.forEach(groupItem => {
462
+ if (groupItem.group != null && groupItem.group.toString().toUpperCase().includes(filter)) {
463
+ // if groupItem contains the filters, the groupItem needs to be displayed as well
464
+ items.push(groupItem);
465
+ }
466
+ else {
467
+ const filteredItems = groupItem.items.filter(item => item.text != null && item.text.toString().toUpperCase().includes(filter));
468
+ if (filteredItems && filteredItems.length > 0) {
469
+ items.push({ group: groupItem.group, items: filteredItems });
470
+ }
471
+ }
472
+ });
473
+ return items;
474
+ }
475
+ else {
476
+ return this.items.filter(item => (item.text != null && item.text.toString().toUpperCase().includes(filter)));
477
+ }
478
+ }
479
+ /**
480
+ * options CSS class
481
+ */
482
+ get optionsClass() {
483
+ if (this.filterBox && !this.checkbox) {
484
+ return 'options with-filter';
485
+ }
486
+ else {
487
+ return 'options no-filter';
488
+ }
489
+ }
490
+ /**
491
+ * get item value. Return text if value is not available
492
+ */
493
+ _getItemValue(item) {
494
+ return item ? item.value != null ? item.value : item.text : undefined;
495
+ }
496
+ /**
497
+ * selection changed, emits events: (selectedValueChange) and (selectionChange);
498
+ */
499
+ _onSelectionChange(value) {
500
+ this.selectedValueChange.emit(value);
501
+ this.selectionChange.emit(value);
502
+ }
503
+ /**
504
+ * check whether the selection is changed. Emits relative events when if changed.
505
+ */
506
+ _checkSelectionChange(previousValue, currentValue) {
507
+ const curSelectedItem = getFirstSelectedItem(currentValue);
508
+ const lastSelectedItem = getFirstSelectedItem(previousValue);
509
+ const curSelectedItemId = curSelectedItem ? curSelectedItem.id : undefined;
510
+ const lastSelectedItemId = lastSelectedItem ? lastSelectedItem.id : undefined;
511
+ if (curSelectedItemId !== lastSelectedItemId && !this.checkbox) {
512
+ this._onSelectionChange(this._getItemValue(curSelectedItem));
513
+ }
514
+ }
515
+ }
516
+ DropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
517
+ DropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: DropdownComponent, selector: "dropdown", inputs: { placeHolder: "placeHolder", items: "items", checkbox: "checkbox", selectedValue: "selectedValue", filterBox: "filterBox", suffixText: "suffixText", disabled: "disabled", allowClear: "allowClear", formatNumber: "formatNumber" }, outputs: { selectedValueChange: "selectedValueChange", selectionChange: "selectionChange", dropdownBlur: "dropdownBlur", itemClick: "itemClick" }, viewQueries: [{ propertyName: "dropdownRef", first: true, predicate: ["dropdown"], descendants: true, read: ElementRef }, { propertyName: "filterInputRef", first: true, predicate: ["filterInput"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
518
+ <span #dropdown class="dropdown" tabindex="3" (mousedown)="onItemsClick($event)" (blur)="onItemsBlur($event)" *ngIf="!disabled" >
519
+ <input-filter #filterInput tabindex="4" *ngIf="filterBox && !checkbox" [(filterValue)]="filterValue" (inputFilterBlur)="onFilterTextBlur($event)"></input-filter>
520
+ <span #selectionOptions [ngClass]="optionsClass">
521
+ <ng-container *ngFor="let item of itemsValues" >
522
+ <ng-container *ngIf="item && item.group">
523
+ <group-item [item]="item"></group-item>
524
+ <item *ngFor="let subItem of item.items" (itemClick)="onItemClick(subItem)" (checkStatusChange)="toggleSelection(subItem)"
525
+ [item]="subItem" [checkbox]="checkbox" [formatNumber]="formatNumber" [suffixText]="suffixText">
526
+ </item>
527
+ </ng-container>
528
+ <ng-container *ngIf="item && !item.group">
529
+ <item (itemClick)="onItemClick(item)" (checkStatusChange)="toggleSelection(item)"
530
+ [item]="item" [checkbox]="checkbox" [formatNumber]="formatNumber" [suffixText]="suffixText">
531
+ </item>
532
+ </ng-container>
533
+ </ng-container>
534
+ </span>
535
+ </span>
536
+ `, isInline: true, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown{width:100%;padding:0;display:none;margin:0;border:1px solid #66afe9;border-top:none;border-bottom:none;border-top-right-radius:0;border-top-left-radius:0;box-sizing:border-box;position:relative;z-index:999}.dropdown:focus{outline:0}.dropdown .options{width:calc(100% + 2px);left:0;box-sizing:border-box;background:white;position:absolute;max-height:228px;overflow-y:auto;overflow-x:hidden;border:1px solid #66afe9;border-top:none;border-bottom-right-radius:4px;border-bottom-left-radius:4px;margin-left:-1px;margin-right:-1px}.dropdown .with-filter{top:32px}.dropdown .no-filter{top:0}\n"], components: [{ type: InputFilterComponent, selector: "input-filter", inputs: ["filterValue"], outputs: ["inputFilterBlur", "filterValueChange"] }, { type: GroupItemComponent, selector: "group-item", inputs: ["item"] }, { type: ItemComponent, selector: "item", inputs: ["checkbox", "item", "formatNumber", "suffixText"], outputs: ["itemClick", "checkStatusChange"] }], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
537
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownComponent, decorators: [{
538
+ type: Component,
539
+ args: [{ selector: 'dropdown', template: `
540
+ <span #dropdown class="dropdown" tabindex="3" (mousedown)="onItemsClick($event)" (blur)="onItemsBlur($event)" *ngIf="!disabled" >
541
+ <input-filter #filterInput tabindex="4" *ngIf="filterBox && !checkbox" [(filterValue)]="filterValue" (inputFilterBlur)="onFilterTextBlur($event)"></input-filter>
542
+ <span #selectionOptions [ngClass]="optionsClass">
543
+ <ng-container *ngFor="let item of itemsValues" >
544
+ <ng-container *ngIf="item && item.group">
545
+ <group-item [item]="item"></group-item>
546
+ <item *ngFor="let subItem of item.items" (itemClick)="onItemClick(subItem)" (checkStatusChange)="toggleSelection(subItem)"
547
+ [item]="subItem" [checkbox]="checkbox" [formatNumber]="formatNumber" [suffixText]="suffixText">
548
+ </item>
549
+ </ng-container>
550
+ <ng-container *ngIf="item && !item.group">
551
+ <item (itemClick)="onItemClick(item)" (checkStatusChange)="toggleSelection(item)"
552
+ [item]="item" [checkbox]="checkbox" [formatNumber]="formatNumber" [suffixText]="suffixText">
553
+ </item>
554
+ </ng-container>
555
+ </ng-container>
556
+ </span>
557
+ </span>
558
+ `, styles: ["*,*:before,*:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown{width:100%;padding:0;display:none;margin:0;border:1px solid #66afe9;border-top:none;border-bottom:none;border-top-right-radius:0;border-top-left-radius:0;box-sizing:border-box;position:relative;z-index:999}.dropdown:focus{outline:0}.dropdown .options{width:calc(100% + 2px);left:0;box-sizing:border-box;background:white;position:absolute;max-height:228px;overflow-y:auto;overflow-x:hidden;border:1px solid #66afe9;border-top:none;border-bottom-right-radius:4px;border-bottom-left-radius:4px;margin-left:-1px;margin-right:-1px}.dropdown .with-filter{top:32px}.dropdown .no-filter{top:0}\n"] }]
559
+ }], propDecorators: { dropdownRef: [{
560
+ type: ViewChild,
561
+ args: ['dropdown', { read: ElementRef }]
562
+ }], filterInputRef: [{
563
+ type: ViewChild,
564
+ args: ['filterInput', { read: ElementRef }]
565
+ }], placeHolder: [{
566
+ type: Input
567
+ }], items: [{
568
+ type: Input
569
+ }], checkbox: [{
570
+ type: Input
571
+ }], selectedValue: [{
572
+ type: Input
573
+ }], filterBox: [{
574
+ type: Input
575
+ }], suffixText: [{
576
+ type: Input
577
+ }], disabled: [{
578
+ type: Input
579
+ }], allowClear: [{
580
+ type: Input
581
+ }], formatNumber: [{
582
+ type: Input
583
+ }], selectedValueChange: [{
584
+ type: Output
585
+ }], selectionChange: [{
586
+ type: Output
587
+ }], dropdownBlur: [{
588
+ type: Output
589
+ }], itemClick: [{
590
+ type: Output
591
+ }] } });
592
+
593
+ class DropdownListComponent {
594
+ constructor() {
595
+ /**
596
+ * bind to [multiSelection], the flag for multi-select (checkbox) mode.
597
+ */
598
+ this.multiSelection = false;
599
+ /**
600
+ * bind to [filterBox] for displaying the filter input text box
601
+ */
602
+ this.filterBox = false;
603
+ /**
604
+ * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
605
+ */
606
+ this.allowClear = true;
607
+ /**
608
+ * bind to [formatNumber] for show formatted number text
609
+ */
610
+ this.formatNumber = false;
611
+ /**
612
+ * for 2-way binding of [selectedValue], using async event to
613
+ * prevent "ExpressionChangedAfterItHasBeenCheckedError".
614
+ */
615
+ this.selectedValueChange = new EventEmitter(true);
616
+ /**
617
+ * [selectionChange] event that will be triggered when changing of the selection.
618
+ * Using async event to prevent "ExpressionChangedAfterItHasBeenCheckedError".
619
+ */
620
+ this.selectionChange = new EventEmitter(true);
621
+ /**
622
+ * visibility flag of drop down
623
+ */
624
+ this.dropdownVisibility = false;
625
+ }
626
+ /**
627
+ * current selected text
628
+ */
629
+ get selectedText() {
630
+ if (!this.multiSelection) {
631
+ const selectedItem = getFirstSelectedItem(this.items);
632
+ return selectedItem ? selectedItem.text : undefined;
633
+ }
634
+ }
635
+ /**
636
+ * triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
637
+ */
638
+ onSelectionChange(event) {
639
+ this.selectedValueChange.emit(event);
640
+ this.selectionChange.emit(event);
641
+ }
642
+ /**
643
+ * triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
644
+ */
645
+ onAnchorClick(event) {
646
+ if (this.disabled) {
647
+ stopPropagationAndDefault(event);
648
+ return;
649
+ }
650
+ if (this._isSelectionOpen()) {
651
+ this._hideItemList();
652
+ }
653
+ else {
654
+ this._showItemsList();
655
+ }
656
+ stopPropagationAndDefault(event);
657
+ }
658
+ /**
659
+ * triggered with (itemClick) event, closes the dropdown in non-checkbox mode
660
+ */
661
+ onItemClick() {
662
+ if (!this.multiSelection) {
663
+ this._hideItemList();
664
+ }
665
+ }
666
+ /**
667
+ * triggered with (clearanceClick) event, clearing all selections
668
+ * and emits (selectedValueChange) and (selectionChange) event for empty value
669
+ */
670
+ onClearanceClick(event) {
671
+ if (!this.multiSelection) {
672
+ this.selectedValue = void 0;
673
+ this.selectedValueChange.emit(undefined);
674
+ this.selectionChange.emit(undefined);
675
+ clearAllSelection(this.items);
676
+ }
677
+ stopPropagationAndDefault(event);
678
+ }
679
+ /**
680
+ * triggered with (dropdownBlur) event, closes the dropdown
681
+ */
682
+ onItemsBlur() {
683
+ if (this._isSelectionOpen()) {
684
+ this._hideItemList();
685
+ }
686
+ }
687
+ /**
688
+ * close the dropdown
689
+ */
690
+ _hideItemList() {
691
+ // hide the dropdown element (has some problem for using CSS directly, using this as a workaround)
692
+ this._dropdownElement.classList.remove('visible');
693
+ this._dropdownElement.style.display = 'none';
694
+ this.dropdownVisibility = false;
695
+ }
696
+ /**
697
+ * open the dropdown
698
+ */
699
+ _showItemsList() {
700
+ // display the dropdown element (has some problem for using CSS directly, using this as a workaround)
701
+ this._dropdownElement.classList.add('visible');
702
+ this._dropdownElement.style.display = 'block';
703
+ this.dropdownVisibility = true;
704
+ // scrolling to the selected item
705
+ if (this._selectedElement) {
706
+ this._selectedElement.scrollIntoView({ behavior: 'auto', block: 'center' });
707
+ }
708
+ // setting the focus
709
+ if (this.filterBox && !this.multiSelection) {
710
+ this._filterInputElement.focus();
711
+ }
712
+ else {
713
+ this._dropdownElement.focus();
714
+ }
715
+ }
716
+ /**
717
+ * visibility status of dropdown
718
+ */
719
+ _isSelectionOpen() {
720
+ return this.dropdownVisibility;
721
+ }
722
+ /**
723
+ * get the real dropdown element (for focusing and visibility controlling), the <span> not the <dropdown>
724
+ */
725
+ get _dropdownElement() {
726
+ return this.dropdownRef ? this.dropdownRef.nativeElement ? this.dropdownRef.nativeElement.firstElementChild : null : null;
727
+ }
728
+ /**
729
+ * get the real filter element (for focusing), the <input> not the <input-filter>
730
+ */
731
+ get _filterInputElement() {
732
+ return this._dropdownElement ?
733
+ this._dropdownElement.firstElementChild ? this._dropdownElement.firstElementChild.firstElementChild : null : null;
734
+ }
735
+ /**
736
+ * get the HTMLElement of selected item, for doing (scrollIntoView) scrolling to the selected item
737
+ */
738
+ get _selectedElement() {
739
+ const selectedItem = getFirstSelectedItem(this.items);
740
+ return selectedItem ? document.getElementById(selectedItem.id) : undefined;
741
+ }
742
+ }
743
+ DropdownListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
744
+ DropdownListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: DropdownListComponent, selector: "ngx-dropdown-list", inputs: { placeHolder: "placeHolder", items: "items", multiSelection: "multiSelection", selectedValue: "selectedValue", filterBox: "filterBox", suffixText: "suffixText", disabled: "disabled", allowClear: "allowClear", formatNumber: "formatNumber" }, outputs: { selectedValueChange: "selectedValueChange", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "dropdownRef", first: true, predicate: ["dropdown"], descendants: true, read: ElementRef }], ngImport: i0, template: `
745
+ <span class="ngx-select">
746
+ <anchor (anchorClick)="onAnchorClick($event)" (clearanceClick)="onClearanceClick($event)"
747
+ [checkbox]="multiSelection"
748
+ [formatNumber]="formatNumber"
749
+ [suffixText]="suffixText"
750
+ [placeHolder]="placeHolder"
751
+ [allowClear]="allowClear"
752
+ [openStatus]="dropdownVisibility"
753
+ [selectedText]="selectedText"
754
+ [disabled]="disabled">
755
+ </anchor>
756
+ <dropdown #dropdown (dropdownBlur) = "onItemsBlur()" (selectionChange)="onSelectionChange($event)"
757
+ [items]="items"
758
+ [checkbox]="multiSelection"
759
+ [filterBox]="filterBox"
760
+ [formatNumber]="formatNumber"
761
+ [suffixText]="suffixText"
762
+ [(selectedValue)]="selectedValue"
763
+ (itemClick) = "onItemClick()"
764
+ [disabled]="disabled">
765
+ </dropdown>
766
+ </span>
767
+ `, isInline: true, styles: [":host *,:host *:before,:host *:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}:host .ngx-select{border-radius:4px;font-size:14px;position:relative;display:inline-block;width:100%;height:34px;background:white;-webkit-user-select:none;user-select:none}\n"], components: [{ type: AnchorComponent, selector: "anchor", inputs: ["placeHolder", "checkbox", "suffixText", "allowClear", "formatNumber", "selectedText", "openStatus", "disabled"], outputs: ["anchorClick", "clearanceClick"] }, { type: DropdownComponent, selector: "dropdown", inputs: ["placeHolder", "items", "checkbox", "selectedValue", "filterBox", "suffixText", "disabled", "allowClear", "formatNumber"], outputs: ["selectedValueChange", "selectionChange", "dropdownBlur", "itemClick"] }] });
768
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownListComponent, decorators: [{
769
+ type: Component,
770
+ args: [{ selector: 'ngx-dropdown-list', template: `
771
+ <span class="ngx-select">
772
+ <anchor (anchorClick)="onAnchorClick($event)" (clearanceClick)="onClearanceClick($event)"
773
+ [checkbox]="multiSelection"
774
+ [formatNumber]="formatNumber"
775
+ [suffixText]="suffixText"
776
+ [placeHolder]="placeHolder"
777
+ [allowClear]="allowClear"
778
+ [openStatus]="dropdownVisibility"
779
+ [selectedText]="selectedText"
780
+ [disabled]="disabled">
781
+ </anchor>
782
+ <dropdown #dropdown (dropdownBlur) = "onItemsBlur()" (selectionChange)="onSelectionChange($event)"
783
+ [items]="items"
784
+ [checkbox]="multiSelection"
785
+ [filterBox]="filterBox"
786
+ [formatNumber]="formatNumber"
787
+ [suffixText]="suffixText"
788
+ [(selectedValue)]="selectedValue"
789
+ (itemClick) = "onItemClick()"
790
+ [disabled]="disabled">
791
+ </dropdown>
792
+ </span>
793
+ `, styles: [":host *,:host *:before,:host *:after{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}:host .ngx-select{border-radius:4px;font-size:14px;position:relative;display:inline-block;width:100%;height:34px;background:white;-webkit-user-select:none;user-select:none}\n"] }]
794
+ }], propDecorators: { dropdownRef: [{
795
+ type: ViewChild,
796
+ args: ['dropdown', { read: ElementRef }]
797
+ }], placeHolder: [{
798
+ type: Input
799
+ }], items: [{
800
+ type: Input
801
+ }], multiSelection: [{
802
+ type: Input
803
+ }], selectedValue: [{
804
+ type: Input
805
+ }], filterBox: [{
806
+ type: Input
807
+ }], suffixText: [{
808
+ type: Input
809
+ }], disabled: [{
810
+ type: Input
811
+ }], allowClear: [{
812
+ type: Input
813
+ }], formatNumber: [{
814
+ type: Input
815
+ }], selectedValueChange: [{
816
+ type: Output
817
+ }], selectionChange: [{
818
+ type: Output
819
+ }] } });
820
+
821
+ class DropdownListModule {
822
+ }
823
+ DropdownListModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
824
+ DropdownListModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownListModule, declarations: [DropdownListComponent,
825
+ ItemComponent,
826
+ GroupItemComponent,
827
+ InputFilterComponent,
828
+ AnchorComponent,
829
+ DropdownComponent], imports: [CommonModule, FormsModule], exports: [DropdownListComponent] });
830
+ DropdownListModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownListModule, providers: [], imports: [[CommonModule, FormsModule]] });
831
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DropdownListModule, decorators: [{
832
+ type: NgModule,
833
+ args: [{
834
+ declarations: [
835
+ DropdownListComponent,
836
+ ItemComponent,
837
+ GroupItemComponent,
838
+ InputFilterComponent,
839
+ AnchorComponent,
840
+ DropdownComponent
841
+ ],
842
+ exports: [DropdownListComponent],
843
+ imports: [CommonModule, FormsModule],
844
+ providers: [],
845
+ bootstrap: [],
846
+ }]
847
+ }] });
848
+
849
+ /**
850
+ * Generated bundle index. Do not edit.
851
+ */
852
+
853
+ export { DropdownListComponent, DropdownListModule };
854
+ //# sourceMappingURL=ngx-dropdown-list.mjs.map