@metadev/lux 0.26.0 → 0.27.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 (90) hide show
  1. package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -0
  2. package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +259 -0
  3. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +78 -0
  4. package/esm2022/lib/checkbox/checkbox.component.mjs +156 -0
  5. package/esm2022/lib/datetime/datetime.component.mjs +312 -0
  6. package/esm2022/lib/filter/filter.component.mjs +158 -0
  7. package/esm2022/lib/geolocation/geolocation.component.mjs +423 -0
  8. package/esm2022/lib/geolocation/geolocation.service.mjs +123 -0
  9. package/{esm2020 → esm2022}/lib/geolocation/openlayer-loader.service.mjs +4 -4
  10. package/esm2022/lib/helperFns.mjs +118 -0
  11. package/esm2022/lib/input/input.component.mjs +469 -0
  12. package/{esm2020 → esm2022}/lib/input/regexp.service.mjs +4 -4
  13. package/esm2022/lib/lux.module.mjs +119 -0
  14. package/esm2022/lib/map/map.component.mjs +275 -0
  15. package/esm2022/lib/modal/modal-backdrop.mjs +25 -0
  16. package/esm2022/lib/modal/modal-config.mjs +12 -0
  17. package/esm2022/lib/modal/modal-ref.mjs +101 -0
  18. package/esm2022/lib/modal/modal-stack.mjs +182 -0
  19. package/esm2022/lib/modal/modal-window.mjs +125 -0
  20. package/esm2022/lib/modal/modal.service.mjs +28 -0
  21. package/esm2022/lib/modal/util.mjs +82 -0
  22. package/esm2022/lib/pagination/pagination.component.mjs +144 -0
  23. package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -0
  24. package/esm2022/lib/select/select.component.mjs +148 -0
  25. package/esm2022/lib/tooltip/tooltip.component.mjs +24 -0
  26. package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -0
  27. package/esm2022/lib/tooltip/tooltip.service.mjs +137 -0
  28. package/esm2022/lib/tooltip/tooltop-content.mjs +9 -0
  29. package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -0
  30. package/{fesm2020 → fesm2022}/metadev-lux.mjs +671 -554
  31. package/fesm2022/metadev-lux.mjs.map +1 -0
  32. package/lib/autocomplete/autocomplete.component.d.ts +1 -1
  33. package/lib/autocomplete-list/autocomplete-list.component.d.ts +1 -1
  34. package/lib/checkbox/checkbox.component.d.ts +1 -1
  35. package/lib/datetime/datetime.component.d.ts +1 -1
  36. package/lib/filter/filter.component.d.ts +1 -1
  37. package/lib/geolocation/geolocation.component.d.ts +1 -1
  38. package/lib/input/input.component.d.ts +1 -1
  39. package/lib/map/map.component.d.ts +2 -2
  40. package/lib/modal/modal-backdrop.d.ts +1 -1
  41. package/lib/modal/modal-stack.d.ts +1 -1
  42. package/lib/modal/modal-window.d.ts +1 -1
  43. package/lib/modal/util.d.ts +1 -1
  44. package/lib/pagination/pagination.component.d.ts +1 -1
  45. package/lib/radiogroup/radiogroup.component.d.ts +1 -1
  46. package/lib/select/select.component.d.ts +1 -1
  47. package/lib/tooltip/tooltip.component.d.ts +1 -1
  48. package/lib/tooltip/tooltip.directive.d.ts +1 -1
  49. package/lib/voice-recognition/voice-recognition.directive.d.ts +1 -1
  50. package/package.json +7 -13
  51. package/esm2020/lib/autocomplete/autocomplete.component.mjs +0 -479
  52. package/esm2020/lib/autocomplete-list/autocomplete-list.component.mjs +0 -254
  53. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -75
  54. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -154
  55. package/esm2020/lib/datetime/datetime.component.mjs +0 -306
  56. package/esm2020/lib/filter/filter.component.mjs +0 -152
  57. package/esm2020/lib/geolocation/geolocation.component.mjs +0 -407
  58. package/esm2020/lib/geolocation/geolocation.service.mjs +0 -120
  59. package/esm2020/lib/helperFns.mjs +0 -117
  60. package/esm2020/lib/input/input.component.mjs +0 -452
  61. package/esm2020/lib/lux.module.mjs +0 -124
  62. package/esm2020/lib/map/map.component.mjs +0 -264
  63. package/esm2020/lib/modal/modal-backdrop.mjs +0 -26
  64. package/esm2020/lib/modal/modal-config.mjs +0 -14
  65. package/esm2020/lib/modal/modal-ref.mjs +0 -91
  66. package/esm2020/lib/modal/modal-stack.mjs +0 -179
  67. package/esm2020/lib/modal/modal-window.mjs +0 -119
  68. package/esm2020/lib/modal/modal.service.mjs +0 -26
  69. package/esm2020/lib/modal/util.mjs +0 -83
  70. package/esm2020/lib/pagination/pagination.component.mjs +0 -137
  71. package/esm2020/lib/radiogroup/radiogroup.component.mjs +0 -130
  72. package/esm2020/lib/select/select.component.mjs +0 -149
  73. package/esm2020/lib/tooltip/tooltip.component.mjs +0 -23
  74. package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -60
  75. package/esm2020/lib/tooltip/tooltip.service.mjs +0 -134
  76. package/esm2020/lib/tooltip/tooltop-content.mjs +0 -7
  77. package/esm2020/lib/voice-recognition/voice-recognition.directive.mjs +0 -73
  78. package/fesm2015/metadev-lux.mjs +0 -4347
  79. package/fesm2015/metadev-lux.mjs.map +0 -1
  80. package/fesm2020/metadev-lux.mjs.map +0 -1
  81. /package/{esm2020 → esm2022}/lib/datasource.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/lang.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/map/geopoint.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/modal/modal-dismiss-reasons.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/pagination/pagination.mjs +0 -0
  86. /package/{esm2020 → esm2022}/lib/tooltip/placement.mjs +0 -0
  87. /package/{esm2020 → esm2022}/lib/tooltip/tooltip-context.mjs +0 -0
  88. /package/{esm2020 → esm2022}/lib/window/window.service.mjs +0 -0
  89. /package/{esm2020 → esm2022}/metadev-lux.mjs +0 -0
  90. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,312 @@
1
+ import { Component, Input, Output, EventEmitter, ElementRef, ViewChild, forwardRef } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
3
+ import { addTimezoneOffset, hasValue, isInitialAndEmpty, isValidDate } from '../helperFns';
4
+ import { languageDetector } from '../lang';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@angular/common";
8
+ export class DatetimeComponent {
9
+ static idCounter = 0;
10
+ dateInput;
11
+ timeInput;
12
+ touched = false;
13
+ dirty = false;
14
+ lastErrors = null;
15
+ _disabled;
16
+ _required;
17
+ _value;
18
+ dateValue = undefined;
19
+ timeValue = undefined;
20
+ userErrors = {
21
+ en: {
22
+ required: 'Required field.',
23
+ min: 'Minimum value is $min.',
24
+ max: 'Maximum value is $max.'
25
+ },
26
+ es: {
27
+ required: 'El campo es obligatorio.',
28
+ min: 'El valor mínimo es $min.',
29
+ max: 'El valor máximo es $max.'
30
+ }
31
+ };
32
+ min = '1900-01-01T00:00:00Z';
33
+ max = '2100-01-01T00:00:00Z';
34
+ includeSeconds = true;
35
+ localTime = true;
36
+ get className() {
37
+ return this.checkClassName();
38
+ }
39
+ lang = languageDetector();
40
+ inlineErrors = false;
41
+ inputId;
42
+ ariaLabel;
43
+ readonly = null;
44
+ set disabled(v) {
45
+ v = typeof v === 'string' && v !== 'false' ? true : v;
46
+ this._disabled = v;
47
+ }
48
+ get disabled() {
49
+ return this._disabled;
50
+ }
51
+ set required(v) {
52
+ this._required = v;
53
+ }
54
+ get required() {
55
+ return this._required;
56
+ }
57
+ set value(v) {
58
+ if (v === this._value) {
59
+ return; // prevent events when there is no changes
60
+ }
61
+ const initialAndEmpty = isInitialAndEmpty(this._value, v);
62
+ const datetime = new Date(v);
63
+ if (!v) {
64
+ this._value = null;
65
+ this.setDateInControl(null);
66
+ this.setTimeInControl(null);
67
+ }
68
+ else if (!isValidDate(datetime)) {
69
+ this._value = v;
70
+ // we don't set value in control if the value is not valid
71
+ // if we do, the content of the control changes and can erase what the user is typing
72
+ }
73
+ else {
74
+ this._value = datetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
75
+ this.setValueInControl(datetime);
76
+ }
77
+ this.onChange(v);
78
+ if (!initialAndEmpty) {
79
+ this.valueChange.emit(v);
80
+ }
81
+ }
82
+ get value() {
83
+ return this._value;
84
+ }
85
+ valueChange = new EventEmitter();
86
+ keyPress = new EventEmitter();
87
+ onChange = (_value) => { };
88
+ onTouched = () => { };
89
+ constructor() { }
90
+ // ControlValueAccessor Interface implementation
91
+ writeValue(value) {
92
+ this.value = value;
93
+ }
94
+ registerOnChange(onChange) {
95
+ this.onChange = onChange;
96
+ }
97
+ registerOnTouched(onTouched) {
98
+ this.onTouched = onTouched;
99
+ }
100
+ markAsTouched() {
101
+ if (!this.touched) {
102
+ this.onTouched();
103
+ this.touched = true;
104
+ }
105
+ }
106
+ setDisabledState(disabled) {
107
+ this.disabled = disabled;
108
+ }
109
+ // End of ControlValueAccessor Interface implementation
110
+ setDateInControl(date) {
111
+ // this.dateInput.nativeElement.value = date;
112
+ this.dateValue = date;
113
+ }
114
+ setTimeInControl(time) {
115
+ // this.timeInput.nativeElement.value = time;
116
+ this.timeValue = time;
117
+ }
118
+ setValueInControl(datetime) {
119
+ const offsetDatetime = this.localTime
120
+ ? addTimezoneOffset(datetime)
121
+ : datetime;
122
+ const offsetDatetimeString = offsetDatetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
123
+ this.setDateInControl(offsetDatetimeString.slice(0, 10)); // YYYY-MM-DD
124
+ if (this.includeSeconds) {
125
+ this.setTimeInControl(offsetDatetimeString.slice(11, 19)); // hh:mm:ss
126
+ }
127
+ else {
128
+ this.setTimeInControl(offsetDatetimeString.slice(11, 16)); // hh:mm
129
+ }
130
+ }
131
+ clear() {
132
+ this.setDateInControl(null);
133
+ this.setTimeInControl(null);
134
+ this.value = null;
135
+ }
136
+ isClearable() {
137
+ return hasValue(this.value);
138
+ }
139
+ // Validator interface
140
+ registerOnValidatorChange() { }
141
+ validate(control) {
142
+ const value = control.value;
143
+ let result = null;
144
+ if (this.required &&
145
+ !hasValue(value) &&
146
+ !hasValue(this.dateValue) &&
147
+ !hasValue(this.timeValue)) {
148
+ result = result || {};
149
+ result.required = { value, reason: 'Required field.' };
150
+ }
151
+ if (!hasValue(this.dateValue) && hasValue(this.timeValue)) {
152
+ result = result || {};
153
+ result.existsDate = {
154
+ value,
155
+ reason: 'Date not specified.'
156
+ };
157
+ }
158
+ if (hasValue(this.dateValue) && !hasValue(this.timeValue)) {
159
+ result = result || {};
160
+ result.existsTime = {
161
+ value,
162
+ reason: 'Time not specified.'
163
+ };
164
+ }
165
+ if (hasValue(this.min) &&
166
+ hasValue(value) &&
167
+ hasValue(this.dateValue) &&
168
+ hasValue(this.timeValue) &&
169
+ String(value).localeCompare(this.min) === -1) {
170
+ result = result || {};
171
+ result.min = {
172
+ value,
173
+ min: this.min,
174
+ reason: `Value is lower than minimum value: ${this.min}.`
175
+ };
176
+ }
177
+ if (hasValue(this.max) &&
178
+ hasValue(value) &&
179
+ hasValue(this.dateValue) &&
180
+ hasValue(this.timeValue) &&
181
+ String(value).localeCompare(this.max) !== -1) {
182
+ result = result || {};
183
+ result.max = {
184
+ value,
185
+ max: this.max,
186
+ reason: `Value is greater than than maximum value: ${this.max}.`
187
+ };
188
+ }
189
+ this.lastErrors = result;
190
+ return result;
191
+ }
192
+ // End of Validator interface
193
+ ngOnInit() {
194
+ this.inputId = this.inputId
195
+ ? this.inputId
196
+ : `datetime$${DatetimeComponent.idCounter++}`;
197
+ this.setPatterns();
198
+ }
199
+ onLostFocus() {
200
+ this.markAsTouched();
201
+ }
202
+ onKeyPress(event) {
203
+ this.keyPress.emit(event);
204
+ }
205
+ onEventDatetime(newDate, newTime) {
206
+ if (this.disabled || this.readonly) {
207
+ return;
208
+ }
209
+ if (!newDate || !newTime) {
210
+ this.value = null;
211
+ }
212
+ else {
213
+ const newValue = `${newDate}T${newTime}`;
214
+ const datetime = new Date(newValue);
215
+ if (isValidDate(datetime)) {
216
+ let datetimeString;
217
+ if (this.localTime) {
218
+ datetimeString = datetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
219
+ }
220
+ else {
221
+ datetimeString = addTimezoneOffset(datetime).toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
222
+ }
223
+ if (this.includeSeconds) {
224
+ this.value = datetimeString.slice(0, 19) + 'Z'; // YYYY-MM-DDThh:mm:ssZ
225
+ }
226
+ else {
227
+ this.value = datetimeString.slice(0, 16) + 'Z'; // YYYY-MM-DDThh:mmZ
228
+ }
229
+ }
230
+ else {
231
+ this.value = newValue;
232
+ }
233
+ }
234
+ }
235
+ checkClassName() {
236
+ return this.disabled
237
+ ? this.readonly
238
+ ? 'disabled readonly'
239
+ : 'disabled'
240
+ : this.readonly
241
+ ? 'readonly'
242
+ : '';
243
+ }
244
+ setPatterns() {
245
+ this.min = this.min || '1900-01-01';
246
+ this.max = this.max || '2100-01-01';
247
+ }
248
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: DatetimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
249
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: DatetimeComponent, selector: "lux-datetime", inputs: { min: "min", max: "max", includeSeconds: "includeSeconds", localTime: "localTime", lang: "lang", inlineErrors: "inlineErrors", inputId: "inputId", ariaLabel: ["aria-label", "ariaLabel"], readonly: "readonly", disabled: "disabled", required: "required", value: "value" }, outputs: { valueChange: "valueChange", keyPress: "keyPress" }, providers: [
250
+ {
251
+ provide: NG_VALUE_ACCESSOR,
252
+ multi: true,
253
+ useExisting: forwardRef(() => DatetimeComponent)
254
+ },
255
+ {
256
+ provide: NG_VALIDATORS,
257
+ multi: true,
258
+ useExisting: forwardRef(() => DatetimeComponent)
259
+ }
260
+ ], viewQueries: [{ propertyName: "dateInput", first: true, predicate: ["dateInput"], descendants: true, static: true }, { propertyName: "timeInput", first: true, predicate: ["timeInput"], descendants: true, static: true }], ngImport: i0, template: "<input\n #dateInput\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"date\"\n [id]=\"inputId + '$date'\"\n [(ngModel)]=\"dateValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<input\n #timeInput\n [class]=\"(disabled || readonly || !isClearable()) && localTime ? 'rounded-right' : ''\"\n [ngClass]=\"className\"\n type=\"time\"\n [id]=\"inputId + '$time'\"\n [(ngModel)]=\"timeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n [step]=\"includeSeconds ? 1 : 60\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<ng-container\n *ngIf=\"!localTime\"\n>\n <div\n [class]=\"disabled || readonly || !isClearable() ? 'rounded-right postfix symbol' : 'postfix symbol'\"\n [ngClass]=\"className\"\n >\n <span>{{ localTime ? '' : 'UTC' }}</span>\n </div>\n</ng-container>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n type=\"button\"\n class=\"rounded-right postfix bordered icon-clear\"\n [id]=\"inputId + '$clear'\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[lang].required }}\n </div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon-clear{grid-row:1;grid-column:2;width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
261
+ }
262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: DatetimeComponent, decorators: [{
263
+ type: Component,
264
+ args: [{ selector: 'lux-datetime', providers: [
265
+ {
266
+ provide: NG_VALUE_ACCESSOR,
267
+ multi: true,
268
+ useExisting: forwardRef(() => DatetimeComponent)
269
+ },
270
+ {
271
+ provide: NG_VALIDATORS,
272
+ multi: true,
273
+ useExisting: forwardRef(() => DatetimeComponent)
274
+ }
275
+ ], template: "<input\n #dateInput\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"date\"\n [id]=\"inputId + '$date'\"\n [(ngModel)]=\"dateValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<input\n #timeInput\n [class]=\"(disabled || readonly || !isClearable()) && localTime ? 'rounded-right' : ''\"\n [ngClass]=\"className\"\n type=\"time\"\n [id]=\"inputId + '$time'\"\n [(ngModel)]=\"timeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n [step]=\"includeSeconds ? 1 : 60\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<ng-container\n *ngIf=\"!localTime\"\n>\n <div\n [class]=\"disabled || readonly || !isClearable() ? 'rounded-right postfix symbol' : 'postfix symbol'\"\n [ngClass]=\"className\"\n >\n <span>{{ localTime ? '' : 'UTC' }}</span>\n </div>\n</ng-container>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n type=\"button\"\n class=\"rounded-right postfix bordered icon-clear\"\n [id]=\"inputId + '$clear'\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[lang].required }}\n </div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon-clear{grid-row:1;grid-column:2;width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}\n"] }]
276
+ }], ctorParameters: function () { return []; }, propDecorators: { dateInput: [{
277
+ type: ViewChild,
278
+ args: ['dateInput', { static: true }]
279
+ }], timeInput: [{
280
+ type: ViewChild,
281
+ args: ['timeInput', { static: true }]
282
+ }], min: [{
283
+ type: Input
284
+ }], max: [{
285
+ type: Input
286
+ }], includeSeconds: [{
287
+ type: Input
288
+ }], localTime: [{
289
+ type: Input
290
+ }], lang: [{
291
+ type: Input
292
+ }], inlineErrors: [{
293
+ type: Input
294
+ }], inputId: [{
295
+ type: Input
296
+ }], ariaLabel: [{
297
+ type: Input,
298
+ args: ['aria-label']
299
+ }], readonly: [{
300
+ type: Input
301
+ }], disabled: [{
302
+ type: Input
303
+ }], required: [{
304
+ type: Input
305
+ }], value: [{
306
+ type: Input
307
+ }], valueChange: [{
308
+ type: Output
309
+ }], keyPress: [{
310
+ type: Output
311
+ }] } });
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZGF0ZXRpbWUvZGF0ZXRpbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZGF0ZXRpbWUvZGF0ZXRpbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBS2pCLGFBQWEsRUFDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLGlCQUFpQixFQUNqQixXQUFXLEVBQ1osTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDOzs7O0FBa0IzQyxNQUFNLE9BQU8saUJBQWlCO0lBRzVCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRXFCLFNBQVMsQ0FBYTtJQUN0QixTQUFTLENBQWE7SUFFaEUsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2QsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFFbkMsU0FBUyxDQUFtQjtJQUM1QixTQUFTLENBQVU7SUFDbkIsTUFBTSxDQUFTO0lBRWhCLFNBQVMsR0FBWSxTQUFTLENBQUM7SUFDL0IsU0FBUyxHQUFZLFNBQVMsQ0FBQztJQUUvQixVQUFVLEdBQUc7UUFDbEIsRUFBRSxFQUFFO1lBQ0YsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixHQUFHLEVBQUUsd0JBQXdCO1lBQzdCLEdBQUcsRUFBRSx3QkFBd0I7U0FDOUI7UUFDRCxFQUFF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VSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO2FBQ2pEO1NBQ0YsdVBDeENILHVpRUFnRUE7OzJGRHRCYSxpQkFBaUI7a0JBakI3QixTQUFTOytCQUNFLGNBQWMsYUFHYjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixLQUFLLEVBQUUsSUFBSTs0QkFDWCxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzt5QkFDakQ7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDO3lCQUNqRDtxQkFDRjswRUFPeUMsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNFLFNBQVM7c0JBQWxELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkEyQmpDLEdBQUc7c0JBRFQsS0FBSztnQkFHQyxHQUFHO3NCQURULEtBQUs7Z0JBR0MsY0FBYztzQkFEcEIsS0FBSztnQkFHQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0csSUFBSTtzQkFBWixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDc0IsU0FBUztzQkFBcEMsS0FBSzt1QkFBQyxZQUFZO2dCQUNILFFBQVE7c0JBQXZCLEtBQUs7Z0JBR0YsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLFFBQVE7c0JBRFgsS0FBSztnQkFTRixLQUFLO3NCQURSLEtBQUs7Z0JBNEJJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG4gIE5HX1ZBTElEQVRPUlNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgYWRkVGltZXpvbmVPZmZzZXQsXG4gIGhhc1ZhbHVlLFxuICBpc0luaXRpYWxBbmRFbXB0eSxcbiAgaXNWYWxpZERhdGVcbn0gZnJvbSAnLi4vaGVscGVyRm5zJztcbmltcG9ydCB7IGxhbmd1YWdlRGV0ZWN0b3IgfSBmcm9tICcuLi9sYW5nJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x1eC1kYXRldGltZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRldGltZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGV0aW1lLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRldGltZUNvbXBvbmVudClcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGV0aW1lQ29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRldGltZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvclxue1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcblxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBkYXRlSW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RpbWVJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIHRpbWVJbnB1dDogRWxlbWVudFJlZjtcblxuICB0b3VjaGVkID0gZmFsc2U7XG4gIGRpcnR5ID0gZmFsc2U7XG4gIGxhc3RFcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9kaXNhYmxlZDogc3RyaW5nIHwgYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmc7XG5cbiAgcHVibGljIGRhdGVWYWx1ZT86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHVibGljIHRpbWVWYWx1ZT86IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgdXNlckVycm9ycyA9IHtcbiAgICBlbjoge1xuICAgICAgcmVxdWlyZWQ6ICdSZXF1aXJlZCBmaWVsZC4nLFxuICAgICAgbWluOiAnTWluaW11bSB2YWx1ZSBpcyAkbWluLicsXG4gICAgICBtYXg6ICdNYXhpbXVtIHZhbHVlIGlzICRtYXguJ1xuICAgIH0sXG4gICAgZXM6IHtcbiAgICAgIHJlcXVpcmVkOiAnRWwgY2FtcG8gZXMgb2JsaWdhdG9yaW8uJyxcbiAgICAgIG1pbjogJ0VsIHZhbG9yIG3DrW5pbW8gZXMgJG1pbi4nLFxuICAgICAgbWF4OiAnRWwgdmFsb3IgbcOheGltbyBlcyAkbWF4LidcbiAgICB9XG4gIH07XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1pbj86IHN0cmluZyA9ICcxOTAwLTAxLTAxVDAwOjAwOjAwWic7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXg/OiBzdHJpbmcgPSAnMjEwMC0wMS0wMVQwMDowMDowMFonO1xuICBASW5wdXQoKVxuICBwdWJsaWMgaW5jbHVkZVNlY29uZHM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgbG9jYWxUaW1lOiBib29sZWFuID0gdHJ1ZTtcblxuICBnZXQgY2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tDbGFzc05hbWUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGxhbmcgPSBsYW5ndWFnZURldGVjdG9yKCk7XG4gIEBJbnB1dCgpIHB1YmxpYyBpbmxpbmVFcnJvcnMgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGlucHV0SWQ6IHN0cmluZztcbiAgQElucHV0KCdhcmlhLWxhYmVsJykgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodjogc3RyaW5nIHwgYm9vbGVhbikge1xuICAgIHYgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdiAhPT0gJ2ZhbHNlJyA/IHRydWUgOiB2O1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdjtcbiAgfVxuICBnZXQgZGlzYWJsZWQoKTogc3RyaW5nIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHJlcXVpcmVkKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IHY7XG4gIH1cbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2OiBzdHJpbmcpIHtcbiAgICBpZiAodiA9PT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHJldHVybjsgLy8gcHJldmVudCBldmVudHMgd2hlbiB0aGVyZSBpcyBubyBjaGFuZ2VzXG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxBbmRFbXB0eSA9IGlzSW5pdGlhbEFuZEVtcHR5KHRoaXMuX3ZhbHVlLCB2KTtcbiAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKHYpO1xuICAgIGlmICghdikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5zZXREYXRlSW5Db250cm9sKG51bGwpO1xuICAgICAgdGhpcy5zZXRUaW1lSW5Db250cm9sKG51bGwpO1xuICAgIH0gZWxzZSBpZiAoIWlzVmFsaWREYXRlKGRhdGV0aW1lKSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xuICAgICAgLy8gd2UgZG9uJ3Qgc2V0IHZhbHVlIGluIGNvbnRyb2wgaWYgdGhlIHZhbHVlIGlzIG5vdCB2YWxpZFxuICAgICAgLy8gaWYgd2UgZG8sIHRoZSBjb250ZW50IG9mIHRoZSBjb250cm9sIGNoYW5nZXMgYW5kIGNhbiBlcmFzZSB3aGF0IHRoZSB1c2VyIGlzIHR5cGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IGRhdGV0aW1lLnRvSVNPU3RyaW5nKCk7IC8vIFlZWVktTU0tRERUaGg6bW06c3MuU1NTWlxuICAgICAgdGhpcy5zZXRWYWx1ZUluQ29udHJvbChkYXRldGltZSk7XG4gICAgfVxuICAgIHRoaXMub25DaGFuZ2Uodik7XG4gICAgaWYgKCFpbml0aWFsQW5kRW1wdHkpIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2KTtcbiAgICB9XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBrZXlQcmVzcyA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcblxuICBvbkNoYW5nZSA9IChfdmFsdWUpOiB2b2lkID0+IHt9O1xuICBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cblxuICBtYXJrQXNUb3VjaGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG4gIC8vIEVuZCBvZiBDb250cm9sVmFsdWVBY2Nlc3NvciBJbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cblxuICBwcml2YXRlIHNldERhdGVJbkNvbnRyb2woZGF0ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gdGhpcy5kYXRlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IGRhdGU7XG4gICAgdGhpcy5kYXRlVmFsdWUgPSBkYXRlO1xuICB9XG4gIHByaXZhdGUgc2V0VGltZUluQ29udHJvbCh0aW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyB0aGlzLnRpbWVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGltZTtcbiAgICB0aGlzLnRpbWVWYWx1ZSA9IHRpbWU7XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZUluQ29udHJvbChkYXRldGltZTogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IG9mZnNldERhdGV0aW1lID0gdGhpcy5sb2NhbFRpbWVcbiAgICAgID8gYWRkVGltZXpvbmVPZmZzZXQoZGF0ZXRpbWUpXG4gICAgICA6IGRhdGV0aW1lO1xuICAgIGNvbnN0IG9mZnNldERhdGV0aW1lU3RyaW5nID0gb2Zmc2V0RGF0ZXRpbWUudG9JU09TdHJpbmcoKTsgLy8gWVlZWS1NTS1ERFRoaDptbTpzcy5TU1NaXG4gICAgdGhpcy5zZXREYXRlSW5Db250cm9sKG9mZnNldERhdGV0aW1lU3RyaW5nLnNsaWNlKDAsIDEwKSk7IC8vIFlZWVktTU0tRERcbiAgICBpZiAodGhpcy5pbmNsdWRlU2Vjb25kcykge1xuICAgICAgdGhpcy5zZXRUaW1lSW5Db250cm9sKG9mZnNldERhdGV0aW1lU3RyaW5nLnNsaWNlKDExLCAxOSkpOyAvLyBoaDptbTpzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFRpbWVJbkNvbnRyb2wob2Zmc2V0RGF0ZXRpbWVTdHJpbmcuc2xpY2UoMTEsIDE2KSk7IC8vIGhoOm1tXG4gICAgfVxuICB9XG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZUluQ29udHJvbChudWxsKTtcbiAgICB0aGlzLnNldFRpbWVJbkNvbnRyb2wobnVsbCk7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cbiAgaXNDbGVhcmFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhhc1ZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLy8gVmFsaWRhdG9yIGludGVyZmFjZVxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKCk6IHZvaWQge31cblxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGxldCByZXN1bHQ6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChcbiAgICAgIHRoaXMucmVxdWlyZWQgJiZcbiAgICAgICFoYXNWYWx1ZSh2YWx1ZSkgJiZcbiAgICAgICFoYXNWYWx1ZSh0aGlzLmRhdGVWYWx1ZSkgJiZcbiAgICAgICFoYXNWYWx1ZSh0aGlzLnRpbWVWYWx1ZSlcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5yZXF1aXJlZCA9IHsgdmFsdWUsIHJlYXNvbjogJ1JlcXVpcmVkIGZpZWxkLicgfTtcbiAgICB9XG4gICAgaWYgKCFoYXNWYWx1ZSh0aGlzLmRhdGVWYWx1ZSkgJiYgaGFzVmFsdWUodGhpcy50aW1lVmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQuZXhpc3RzRGF0ZSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHJlYXNvbjogJ0RhdGUgbm90IHNwZWNpZmllZC4nXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoaGFzVmFsdWUodGhpcy5kYXRlVmFsdWUpICYmICFoYXNWYWx1ZSh0aGlzLnRpbWVWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5leGlzdHNUaW1lID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcmVhc29uOiAnVGltZSBub3Qgc3BlY2lmaWVkLidcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGhhc1ZhbHVlKHRoaXMubWluKSAmJlxuICAgICAgaGFzVmFsdWUodmFsdWUpICYmXG4gICAgICBoYXNWYWx1ZSh0aGlzLmRhdGVWYWx1ZSkgJiZcbiAgICAgIGhhc1ZhbHVlKHRoaXMudGltZVZhbHVlKSAmJlxuICAgICAgU3RyaW5nKHZhbHVlKS5sb2NhbGVDb21wYXJlKHRoaXMubWluKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5taW4gPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICByZWFzb246IGBWYWx1ZSBpcyBsb3dlciB0aGFuIG1pbmltdW0gdmFsdWU6ICR7dGhpcy5taW59LmBcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGhhc1ZhbHVlKHRoaXMubWF4KSAmJlxuICAgICAgaGFzVmFsdWUodmFsdWUpICYmXG4gICAgICBoYXNWYWx1ZSh0aGlzLmRhdGVWYWx1ZSkgJiZcbiAgICAgIGhhc1ZhbHVlKHRoaXMudGltZVZhbHVlKSAmJlxuICAgICAgU3RyaW5nKHZhbHVlKS5sb2NhbGVDb21wYXJlKHRoaXMubWF4KSAhPT0gLTFcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5tYXggPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtYXg6IHRoaXMubWF4LFxuICAgICAgICByZWFzb246IGBWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhbiBtYXhpbXVtIHZhbHVlOiAke3RoaXMubWF4fS5gXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmxhc3RFcnJvcnMgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBFbmQgb2YgVmFsaWRhdG9yIGludGVyZmFjZVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJZCA9IHRoaXMuaW5wdXRJZFxuICAgICAgPyB0aGlzLmlucHV0SWRcbiAgICAgIDogYGRhdGV0aW1lJCR7RGF0ZXRpbWVDb21wb25lbnQuaWRDb3VudGVyKyt9YDtcbiAgICB0aGlzLnNldFBhdHRlcm5zKCk7XG4gIH1cblxuICBvbkxvc3RGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5rZXlQcmVzcy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uRXZlbnREYXRldGltZShuZXdEYXRlOiBzdHJpbmcsIG5ld1RpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFuZXdEYXRlIHx8ICFuZXdUaW1lKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBgJHtuZXdEYXRlfVQke25ld1RpbWV9YDtcbiAgICAgIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUobmV3VmFsdWUpO1xuICAgICAgaWYgKGlzVmFsaWREYXRlKGRhdGV0aW1lKSkge1xuICAgICAgICBsZXQgZGF0ZXRpbWVTdHJpbmc7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsVGltZSkge1xuICAgICAgICAgIGRhdGV0aW1lU3RyaW5nID0gZGF0ZXRpbWUudG9JU09TdHJpbmcoKTsgLy8gWVlZWS1NTS1ERFRoaDptbTpzcy5TU1NaXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0ZXRpbWVTdHJpbmcgPSBhZGRUaW1lem9uZU9mZnNldChkYXRldGltZSkudG9JU09TdHJpbmcoKTsgLy8gWVlZWS1NTS1ERFRoaDptbTpzcy5TU1NaXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZVNlY29uZHMpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gZGF0ZXRpbWVTdHJpbmcuc2xpY2UoMCwgMTkpICsgJ1onOyAvLyBZWVlZLU1NLUREVGhoOm1tOnNzWlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBkYXRldGltZVN0cmluZy5zbGljZSgwLCAxNikgKyAnWic7IC8vIFlZWVktTU0tRERUaGg6bW1aXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGVja0NsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkXG4gICAgICA/IHRoaXMucmVhZG9ubHlcbiAgICAgICAgPyAnZGlzYWJsZWQgcmVhZG9ubHknXG4gICAgICAgIDogJ2Rpc2FibGVkJ1xuICAgICAgOiB0aGlzLnJlYWRvbmx5XG4gICAgICA/ICdyZWFkb25seSdcbiAgICAgIDogJyc7XG4gIH1cblxuICBzZXRQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8ICcxOTAwLTAxLTAxJztcbiAgICB0aGlzLm1heCA9IHRoaXMubWF4IHx8ICcyMTAwLTAxLTAxJztcbiAgfVxufVxuIiwiPGlucHV0XG4gICNkYXRlSW5wdXRcbiAgY2xhc3M9XCJyb3VuZGVkLWxlZnQgcHJlZml4XCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgdHlwZT1cImRhdGVcIlxuICBbaWRdPVwiaW5wdXRJZCArICckZGF0ZSdcIlxuICBbKG5nTW9kZWwpXT1cImRhdGVWYWx1ZVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5yZWFkb25seV09XCJyZWFkb25seSA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFtwbGFjZWhvbGRlcl09XCJcIlxuICAoa2V5dXApPVwib25FdmVudERhdGV0aW1lKGRhdGVJbnB1dC52YWx1ZSwgdGltZUlucHV0LnZhbHVlKVwiXG4gIChjaGFuZ2UpPVwib25FdmVudERhdGV0aW1lKGRhdGVJbnB1dC52YWx1ZSwgdGltZUlucHV0LnZhbHVlKVwiXG4gIChrZXlwcmVzcyk9XCJvbktleVByZXNzKCRldmVudClcIlxuICAoYmx1cik9XCJvbkxvc3RGb2N1cygpXCJcbi8+XG48aW5wdXRcbiAgI3RpbWVJbnB1dFxuICBbY2xhc3NdPVwiKGRpc2FibGVkIHx8IHJlYWRvbmx5IHx8ICFpc0NsZWFyYWJsZSgpKSAmJiBsb2NhbFRpbWUgPyAncm91bmRlZC1yaWdodCcgOiAnJ1wiXG4gIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiXG4gIHR5cGU9XCJ0aW1lXCJcbiAgW2lkXT1cImlucHV0SWQgKyAnJHRpbWUnXCJcbiAgWyhuZ01vZGVsKV09XCJ0aW1lVmFsdWVcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIucmVhZG9ubHldPVwicmVhZG9ubHkgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbcGxhY2Vob2xkZXJdPVwiXCJcbiAgW3N0ZXBdPVwiaW5jbHVkZVNlY29uZHMgPyAxIDogNjBcIlxuICAoa2V5dXApPVwib25FdmVudERhdGV0aW1lKGRhdGVJbnB1dC52YWx1ZSwgdGltZUlucHV0LnZhbHVlKVwiXG4gIChjaGFuZ2UpPVwib25FdmVudERhdGV0aW1lKGRhdGVJbnB1dC52YWx1ZSwgdGltZUlucHV0LnZhbHVlKVwiXG4gIChrZXlwcmVzcyk9XCJvbktleVByZXNzKCRldmVudClcIlxuICAoYmx1cik9XCJvbkxvc3RGb2N1cygpXCJcbi8+XG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwiIWxvY2FsVGltZVwiXG4+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHkgfHwgIWlzQ2xlYXJhYmxlKCkgPyAncm91bmRlZC1yaWdodCBwb3N0Zml4IHN5bWJvbCcgOiAncG9zdGZpeCBzeW1ib2wnXCJcbiAgICBbbmdDbGFzc109XCJjbGFzc05hbWVcIlxuICA+XG4gICAgPHNwYW4+e3sgbG9jYWxUaW1lID8gJycgOiAnVVRDJyB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbjxidXR0b25cbiAgI2NsZWFyQnV0dG9uXG4gICpuZ0lmPVwiIWRpc2FibGVkICYmICFyZWFkb25seSAmJiBpc0NsZWFyYWJsZSgpXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIGNsYXNzPVwicm91bmRlZC1yaWdodCBwb3N0Zml4IGJvcmRlcmVkIGljb24tY2xlYXJcIlxuICBbaWRdPVwiaW5wdXRJZCArICckY2xlYXInXCJcbiAgKGNsaWNrKT1cImNsZWFyKClcIlxuICBhcmlhLWxhYmVsPVwiY2xlYXJcIlxuPjwvYnV0dG9uPlxuXG48ZGl2ICpuZ0lmPVwiaW5saW5lRXJyb3JzICYmIGxhc3RFcnJvcnMgJiYgKGRpcnR5IHx8IHRvdWNoZWQpXCIgY2xhc3M9XCJhbGVydFwiPlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5yZXF1aXJlZFwiPlxuICAgIHt7IHVzZXJFcnJvcnNbbGFuZ10ucmVxdWlyZWQgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLm1pblwiPlxuICAgIHt7IHVzZXJFcnJvcnNbbGFuZ10ubWluLnJlcGxhY2UoJyRtaW4nLCBsYXN0RXJyb3JzLm1pbi5taW4pIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5tYXhcIj5cbiAgICB7eyB1c2VyRXJyb3JzW2xhbmddLm1heC5yZXBsYWNlKCckbWF4JywgbGFzdEVycm9ycy5tYXgubWF4KSB9fVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,158 @@
1
+ import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { Subject } from 'rxjs';
4
+ import { debounceTime } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ /** Filter component to query for objects. */
8
+ export class FilterComponent {
9
+ static idCounter = 0;
10
+ touched = false;
11
+ _searchValue = '';
12
+ disabled = false;
13
+ /** id for the input. If left blank, it is autogenerated */
14
+ inputId;
15
+ /** Placeholder default text. */
16
+ placeholder = '';
17
+ /** Search value introduced by the user. */
18
+ get searchValue() {
19
+ return this._searchValue;
20
+ }
21
+ set searchValue(v) {
22
+ v = (v || '').toString();
23
+ if (v === this._searchValue) {
24
+ return;
25
+ }
26
+ this.onChange(v);
27
+ this._searchValue = v;
28
+ }
29
+ /** Search on type: (default true) Auto-search when user types in. */
30
+ searchOnType = true;
31
+ /** Custom aria label in case of not using a label */
32
+ ariaLabel;
33
+ debounceValue = 300; // 300 ms
34
+ /** Debounce time in milliseconds. (defaults to 300 ms) */
35
+ set debounce(val) {
36
+ this.debounceValue = val;
37
+ this.recreateObservable();
38
+ }
39
+ get debounce() {
40
+ return this.debounceValue;
41
+ }
42
+ /** Search value changed by user. */
43
+ searchValueChange = new EventEmitter();
44
+ searchValue$;
45
+ subject = new Subject();
46
+ sub;
47
+ constructor() {
48
+ this.recreateObservable();
49
+ }
50
+ // ControlValueAccessor Interface
51
+ onChange = (value) => { };
52
+ onTouched = () => { };
53
+ writeValue(value) {
54
+ this.searchValue = (value || '').toString();
55
+ }
56
+ registerOnChange(onChange) {
57
+ this.onChange = onChange;
58
+ }
59
+ registerOnTouched(onTouched) {
60
+ this.onTouched = onTouched;
61
+ }
62
+ markAsTouched() {
63
+ if (!this.touched) {
64
+ this.onTouched();
65
+ this.touched = true;
66
+ }
67
+ }
68
+ setDisabledState(disabled) {
69
+ this.disabled = disabled;
70
+ }
71
+ // End ControlValueAccessor Interface
72
+ ngOnInit() {
73
+ this.inputId = this.inputId
74
+ ? this.inputId
75
+ : `filter$${FilterComponent.idCounter++}`;
76
+ }
77
+ ngOnDestroy() {
78
+ this.freeSubscriptions();
79
+ }
80
+ clear() {
81
+ this.searchValue = '';
82
+ this.search();
83
+ }
84
+ search() {
85
+ this.searchValueChange.emit(this.searchValue);
86
+ }
87
+ keyup(event, newValue) {
88
+ this.markAsTouched();
89
+ this.searchValue = newValue;
90
+ if (event.key === 'Enter') {
91
+ this.searchNow(this.searchValue);
92
+ }
93
+ if (this.searchOnType) {
94
+ this.addEvent();
95
+ }
96
+ }
97
+ onInputValueChange(newValue) {
98
+ this.markAsTouched();
99
+ this.searchValue = newValue;
100
+ }
101
+ recreateObservable() {
102
+ this.searchValue$ = this.subject
103
+ .asObservable()
104
+ .pipe(debounceTime(this.debounce));
105
+ this.freeSubscriptions();
106
+ this.sub = this.searchValue$.subscribe((value) => {
107
+ this.searchValueChange.emit(value);
108
+ });
109
+ }
110
+ freeSubscriptions() {
111
+ if (this.sub) {
112
+ this.sub.unsubscribe();
113
+ this.sub = null;
114
+ }
115
+ }
116
+ searchNow(value) {
117
+ this.searchValueChange.emit(value);
118
+ }
119
+ addEvent() {
120
+ this.subject.next(this.searchValue);
121
+ }
122
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: FilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
123
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: FilterComponent, selector: "lux-filter", inputs: { disabled: "disabled", inputId: "inputId", placeholder: "placeholder", searchValue: "searchValue", searchOnType: "searchOnType", ariaLabel: ["aria-label", "ariaLabel"], debounce: "debounce" }, outputs: { searchValueChange: "searchValueChange" }, providers: [
124
+ {
125
+ provide: NG_VALUE_ACCESSOR,
126
+ multi: true,
127
+ useExisting: forwardRef(() => FilterComponent)
128
+ }
129
+ ], ngImport: i0, template: "<div class=\"filter\">\n <input\n #i0\n type=\"text\"\n [attr.aria-label]=\"ariaLabel\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [disabled]=\"disabled\"\n [value]=\"searchValue\"\n (valueChange)=\"onInputValueChange(i0.value)\"\n (keyup)=\"keyup($event, i0.value)\"\n />\n\n <button\n [class.hide]=\"!searchValue\"\n aria-label=\"Clear\"\n class=\"clear-indicator icon icon-clear\"\n type=\"button\"\n (click)=\"clear()\"\n ></button>\n <i *ngIf=\"1 || searchOnType\" class=\"search-indicator icon icon-search\"></i>\n <button\n class=\"btn-search\"\n *ngIf=\"!searchOnType\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"search()\"\n >\n Search\n </button>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}.filter{display:grid;grid-template-columns:auto 1.5rem 1.5rem .5rem auto}.filter input{grid-row:1;grid-column-start:1;grid-column-end:4}.filter .hide{visibility:collapse}.filter .clear-indicator{grid-row:1;grid-column:2;border:none}.filter .search-indicator{grid-row:1;grid-column:3}.filter .btn-search{grid-row:1;grid-column:5}.filter .icon-search{background:var(--lux-filter-icon-search, url(/assets/img/filter-search.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center;width:var(--lux-filter-icon-width, 1rem)}.filter .icon-clear{background:var(--lux-filter-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
130
+ }
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: FilterComponent, decorators: [{
132
+ type: Component,
133
+ args: [{ selector: 'lux-filter', providers: [
134
+ {
135
+ provide: NG_VALUE_ACCESSOR,
136
+ multi: true,
137
+ useExisting: forwardRef(() => FilterComponent)
138
+ }
139
+ ], template: "<div class=\"filter\">\n <input\n #i0\n type=\"text\"\n [attr.aria-label]=\"ariaLabel\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [disabled]=\"disabled\"\n [value]=\"searchValue\"\n (valueChange)=\"onInputValueChange(i0.value)\"\n (keyup)=\"keyup($event, i0.value)\"\n />\n\n <button\n [class.hide]=\"!searchValue\"\n aria-label=\"Clear\"\n class=\"clear-indicator icon icon-clear\"\n type=\"button\"\n (click)=\"clear()\"\n ></button>\n <i *ngIf=\"1 || searchOnType\" class=\"search-indicator icon icon-search\"></i>\n <button\n class=\"btn-search\"\n *ngIf=\"!searchOnType\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"search()\"\n >\n Search\n </button>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}.filter{display:grid;grid-template-columns:auto 1.5rem 1.5rem .5rem auto}.filter input{grid-row:1;grid-column-start:1;grid-column-end:4}.filter .hide{visibility:collapse}.filter .clear-indicator{grid-row:1;grid-column:2;border:none}.filter .search-indicator{grid-row:1;grid-column:3}.filter .btn-search{grid-row:1;grid-column:5}.filter .icon-search{background:var(--lux-filter-icon-search, url(/assets/img/filter-search.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center;width:var(--lux-filter-icon-width, 1rem)}.filter .icon-clear{background:var(--lux-filter-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center}\n"] }]
140
+ }], ctorParameters: function () { return []; }, propDecorators: { disabled: [{
141
+ type: Input
142
+ }], inputId: [{
143
+ type: Input
144
+ }], placeholder: [{
145
+ type: Input
146
+ }], searchValue: [{
147
+ type: Input
148
+ }], searchOnType: [{
149
+ type: Input
150
+ }], ariaLabel: [{
151
+ type: Input,
152
+ args: ['aria-label']
153
+ }], debounce: [{
154
+ type: Input
155
+ }], searchValueChange: [{
156
+ type: Output
157
+ }] } });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFOUMsNkNBQTZDO0FBYTdDLE1BQU0sT0FBTyxlQUFlO0lBRzFCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRWpCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDMUIsMkRBQTJEO0lBQ2xELE9BQU8sQ0FBUztJQUN6QixnQ0FBZ0M7SUFDdkIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUMxQiwyQ0FBMkM7SUFDM0MsSUFDSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxDQUFTO1FBQ3ZCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzNCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFD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QixDQUFDO3lCQUMvQztxQkFDRjswRUFVUSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdGLFdBQVc7c0JBRGQsS0FBSztnQkFhRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVlLFNBQVM7c0JBQTdCLEtBQUs7dUJBQUMsWUFBWTtnQkFLZixRQUFRO3NCQURYLEtBQUs7Z0JBVUksaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKiBGaWx0ZXIgY29tcG9uZW50IHRvIHF1ZXJ5IGZvciBvYmplY3RzLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHV4LWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZpbHRlckNvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRmlsdGVyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuXG4gIHByaXZhdGUgdG91Y2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9zZWFyY2hWYWx1ZSA9ICcnO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKiBpZCBmb3IgdGhlIGlucHV0LiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhdXRvZ2VuZXJhdGVkICovXG4gIEBJbnB1dCgpIGlucHV0SWQ6IHN0cmluZztcbiAgLyoqIFBsYWNlaG9sZGVyIGRlZmF1bHQgdGV4dC4gKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcbiAgLyoqIFNlYXJjaCB2YWx1ZSBpbnRyb2R1Y2VkIGJ5IHRoZSB1c2VyLiAqL1xuICBASW5wdXQoKVxuICBnZXQgc2VhcmNoVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoVmFsdWU7XG4gIH1cbiAgc2V0IHNlYXJjaFZhbHVlKHY6IHN0cmluZykge1xuICAgIHYgPSAodiB8fCAnJykudG9TdHJpbmcoKTtcbiAgICBpZiAodiA9PT0gdGhpcy5fc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZSh2KTtcbiAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHY7XG4gIH1cbiAgLyoqIFNlYXJjaCBvbiB0eXBlOiAoZGVmYXVsdCB0cnVlKSBBdXRvLXNlYXJjaCB3aGVuIHVzZXIgdHlwZXMgaW4uICovXG4gIEBJbnB1dCgpIHNlYXJjaE9uVHlwZSA9IHRydWU7XG4gIC8qKiBDdXN0b20gYXJpYSBsYWJlbCBpbiBjYXNlIG9mIG5vdCB1c2luZyBhIGxhYmVsICovXG4gIEBJbnB1dCgnYXJpYS1sYWJlbCcpIGFyaWFMYWJlbDogc3RyaW5nO1xuXG4gIHByaXZhdGUgZGVib3VuY2VWYWx1ZSA9IDMwMDsgLy8gMzAwIG1zXG4gIC8qKiBEZWJvdW5jZSB0aW1lIGluIG1pbGxpc2Vjb25kcy4gKGRlZmF1bHRzIHRvIDMwMCBtcykgKi9cbiAgQElucHV0KClcbiAgc2V0IGRlYm91bmNlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5kZWJvdW5jZVZhbHVlID0gdmFsO1xuICAgIHRoaXMucmVjcmVhdGVPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0IGRlYm91bmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGVib3VuY2VWYWx1ZTtcbiAgfVxuXG4gIC8qKiBTZWFyY2ggdmFsdWUgY2hhbmdlZCBieSB1c2VyLiAqL1xuICBAT3V0cHV0KCkgc2VhcmNoVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBzZWFyY2hWYWx1ZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBwcml2YXRlIHN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgc3ViOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWNyZWF0ZU9ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEludGVyZmFjZVxuICBvbkNoYW5nZSA9ICh2YWx1ZSk6IHZvaWQgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gKHZhbHVlIHx8ICcnKS50b1N0cmluZygpO1xuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG4gIG1hcmtBc1RvdWNoZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG4gIC8vIEVuZCBDb250cm9sVmFsdWVBY2Nlc3NvciBJbnRlcmZhY2VcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0SWQgPSB0aGlzLmlucHV0SWRcbiAgICAgID8gdGhpcy5pbnB1dElkXG4gICAgICA6IGBmaWx0ZXIkJHtGaWx0ZXJDb21wb25lbnQuaWRDb3VudGVyKyt9YDtcbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZyZWVTdWJzY3JpcHRpb25zKCk7XG4gIH1cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuc2VhcmNoKCk7XG4gIH1cbiAgc2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFZhbHVlKTtcbiAgfVxuICBrZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCwgbmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICB0aGlzLnNlYXJjaE5vdyh0aGlzLnNlYXJjaFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VhcmNoT25UeXBlKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50KCk7XG4gICAgfVxuICB9XG4gIG9uSW5wdXRWYWx1ZUNoYW5nZShuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNyZWF0ZU9ic2VydmFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSQgPSB0aGlzLnN1YmplY3RcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpKTtcblxuICAgIHRoaXMuZnJlZVN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLnN1YiA9IHRoaXMuc2VhcmNoVmFsdWUkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBmcmVlU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWIpIHtcbiAgICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN1YiA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2VhcmNoTm93KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgYWRkRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJqZWN0Lm5leHQodGhpcy5zZWFyY2hWYWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmaWx0ZXJcIj5cbiAgPGlucHV0XG4gICAgI2kwXG4gICAgdHlwZT1cInRleHRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgKHZhbHVlQ2hhbmdlKT1cIm9uSW5wdXRWYWx1ZUNoYW5nZShpMC52YWx1ZSlcIlxuICAgIChrZXl1cCk9XCJrZXl1cCgkZXZlbnQsIGkwLnZhbHVlKVwiXG4gIC8+XG5cbiAgPGJ1dHRvblxuICAgIFtjbGFzcy5oaWRlXT1cIiFzZWFyY2hWYWx1ZVwiXG4gICAgYXJpYS1sYWJlbD1cIkNsZWFyXCJcbiAgICBjbGFzcz1cImNsZWFyLWluZGljYXRvciBpY29uIGljb24tY2xlYXJcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJjbGVhcigpXCJcbiAgPjwvYnV0dG9uPlxuICA8aSAqbmdJZj1cIjEgfHwgc2VhcmNoT25UeXBlXCIgY2xhc3M9XCJzZWFyY2gtaW5kaWNhdG9yIGljb24gaWNvbi1zZWFyY2hcIj48L2k+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0bi1zZWFyY2hcIlxuICAgICpuZ0lmPVwiIXNlYXJjaE9uVHlwZVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAoY2xpY2spPVwic2VhcmNoKClcIlxuICA+XG4gICAgU2VhcmNoXG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=