@acpaas-ui/ngx-forms 6.1.9 → 6.1.10
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.
- package/.eslintrc.json +42 -0
- package/LICENSE.md +21 -0
- package/dist/README.md +23 -0
- package/dist/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +232 -0
- package/{fesm2015 → dist/fesm2015}/acpaas-ui-ngx-forms.mjs +7 -4
- package/dist/fesm2015/acpaas-ui-ngx-forms.mjs.map +1 -0
- package/{fesm2020 → dist/fesm2020}/acpaas-ui-ngx-forms.mjs +7 -4
- package/dist/fesm2020/acpaas-ui-ngx-forms.mjs.map +1 -0
- package/dist/package.json +44 -0
- package/karma.conf.js +38 -0
- package/ng-package.json +8 -0
- package/package.json +6 -27
- package/src/lib/auto-complete/README.md +148 -0
- package/src/lib/auto-complete/auto-complete.module.ts +15 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.html +51 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.scss +4 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.spec.ts +378 -0
- package/src/lib/auto-complete/components/auto-complete/auto-complete.component.ts +281 -0
- package/src/lib/auto-complete/public-api.ts +2 -0
- package/src/lib/datepicker/README.md +110 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.html +47 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.scss +13 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.spec.ts +204 -0
- package/src/lib/datepicker/components/datepicker/datepicker.component.ts +251 -0
- package/src/lib/datepicker/datepicker.conf.ts +11 -0
- package/src/lib/datepicker/datepicker.module.ts +50 -0
- package/src/lib/datepicker/public-api.ts +8 -0
- package/src/lib/datepicker/types/datepicker.types.ts +8 -0
- package/src/lib/range-slider/README.md +56 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.html +46 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.scss +12 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.spec.ts +216 -0
- package/src/lib/range-slider/components/range-slider/range-slider.component.ts +301 -0
- package/src/lib/range-slider/public-api.ts +3 -0
- package/src/lib/range-slider/range-slider.module.ts +11 -0
- package/src/lib/range-slider/types/range-slider.types.ts +4 -0
- package/src/lib/search-filter/README.md +86 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.html +66 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.scss +23 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.spec.ts +264 -0
- package/src/lib/search-filter/components/search-filter/search-filter.component.ts +140 -0
- package/src/lib/search-filter/public-api.ts +3 -0
- package/src/lib/search-filter/search-filter.module.ts +13 -0
- package/src/lib/search-filter/types/search-filter.types.ts +4 -0
- package/src/lib/shared/services/search.service.spec.ts +78 -0
- package/src/lib/shared/services/search.service.ts +32 -0
- package/src/lib/shared/types/search.types.ts +6 -0
- package/src/lib/timepicker/README.md +84 -0
- package/src/lib/timepicker/classes/timepicker.validators.spec.ts +54 -0
- package/src/lib/timepicker/classes/timepicker.validators.ts +61 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.html +37 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.scss +3 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.spec.ts +161 -0
- package/src/lib/timepicker/components/timepicker/timepicker.component.ts +128 -0
- package/src/lib/timepicker/public-api.ts +4 -0
- package/src/lib/timepicker/timepicker.module.ts +13 -0
- package/src/lib/timepicker/types/timepicker.types.ts +5 -0
- package/src/lib/upload/README.md +283 -0
- package/src/lib/upload/classes/uploader.class.spec.ts +100 -0
- package/src/lib/upload/classes/uploader.class.ts +144 -0
- package/src/lib/upload/components/upload/upload.component.html +28 -0
- package/src/lib/upload/components/upload/upload.component.scss +3 -0
- package/src/lib/upload/components/upload/upload.component.spec.ts +117 -0
- package/src/lib/upload/components/upload/upload.component.ts +50 -0
- package/src/lib/upload/components/upload-input/upload-input.component.html +11 -0
- package/src/lib/upload/components/upload-input/upload-input.component.spec.ts +55 -0
- package/src/lib/upload/components/upload-input/upload-input.component.ts +35 -0
- package/src/lib/upload/components/upload-queue/upload-queue.component.html +16 -0
- package/src/lib/upload/components/upload-queue/upload-queue.component.spec.ts +99 -0
- package/src/lib/upload/components/upload-queue/upload-queue.component.ts +36 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.html +55 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.scss +3 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.spec.ts +144 -0
- package/src/lib/upload/components/upload-zone/upload-zone.component.ts +142 -0
- package/src/lib/upload/components/validation-list/validation-list.component.html +15 -0
- package/src/lib/upload/components/validation-list/validation-list.component.spec.ts +57 -0
- package/src/lib/upload/components/validation-list/validation-list.component.ts +29 -0
- package/src/lib/upload/public-api.ts +10 -0
- package/src/lib/upload/services/validation-messages.service.spec.ts +66 -0
- package/src/lib/upload/services/validation-messages.service.ts +27 -0
- package/src/lib/upload/types/upload.types.ts +20 -0
- package/src/lib/upload/upload.conf.ts +15 -0
- package/src/lib/upload/upload.module.ts +34 -0
- package/src/public-api.ts +6 -0
- package/src/test.ts +9 -0
- package/tsconfig.lib.json +26 -0
- package/tsconfig.spec.json +17 -0
- package/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +0 -229
- package/fesm2015/acpaas-ui-ngx-forms.mjs.map +0 -1
- package/fesm2020/acpaas-ui-ngx-forms.mjs.map +0 -1
- /package/{esm2020 → dist/esm2020}/acpaas-ui-ngx-forms.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/auto-complete/auto-complete.module.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/auto-complete/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/datepicker/datepicker.conf.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/datepicker/datepicker.module.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/datepicker/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/datepicker/types/datepicker.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/range-slider/components/range-slider/range-slider.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/range-slider/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/range-slider/range-slider.module.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/range-slider/types/range-slider.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/search-filter/components/search-filter/search-filter.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/search-filter/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/search-filter/search-filter.module.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/search-filter/types/search-filter.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/shared/services/search.service.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/shared/types/search.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/classes/timepicker.validators.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/components/timepicker/timepicker.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/timepicker.module.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/timepicker/types/timepicker.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/classes/uploader.class.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/components/upload/upload.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/components/upload-input/upload-input.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/components/upload-queue/upload-queue.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/components/upload-zone/upload-zone.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/components/validation-list/validation-list.component.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/public-api.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/services/validation-messages.service.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/types/upload.types.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/upload.conf.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/lib/upload/upload.module.mjs +0 -0
- /package/{esm2020 → dist/esm2020}/public-api.mjs +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/auto-complete/auto-complete.module.d.ts +0 -0
- /package/{lib → dist/lib}/auto-complete/components/auto-complete/auto-complete.component.d.ts +0 -0
- /package/{lib → dist/lib}/auto-complete/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/components/datepicker/datepicker.component.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/datepicker.conf.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/datepicker.module.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/datepicker/types/datepicker.types.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/components/range-slider/range-slider.component.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/range-slider.module.d.ts +0 -0
- /package/{lib → dist/lib}/range-slider/types/range-slider.types.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/components/search-filter/search-filter.component.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/search-filter.module.d.ts +0 -0
- /package/{lib → dist/lib}/search-filter/types/search-filter.types.d.ts +0 -0
- /package/{lib → dist/lib}/shared/services/search.service.d.ts +0 -0
- /package/{lib → dist/lib}/shared/types/search.types.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/classes/timepicker.validators.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/components/timepicker/timepicker.component.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/timepicker.module.d.ts +0 -0
- /package/{lib → dist/lib}/timepicker/types/timepicker.types.d.ts +0 -0
- /package/{lib → dist/lib}/upload/classes/uploader.class.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload/upload.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload-input/upload-input.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload-queue/upload-queue.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/upload-zone/upload-zone.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/components/validation-list/validation-list.component.d.ts +0 -0
- /package/{lib → dist/lib}/upload/public-api.d.ts +0 -0
- /package/{lib → dist/lib}/upload/services/validation-messages.service.d.ts +0 -0
- /package/{lib → dist/lib}/upload/types/upload.types.d.ts +0 -0
- /package/{lib → dist/lib}/upload/upload.conf.d.ts +0 -0
- /package/{lib → dist/lib}/upload/upload.module.d.ts +0 -0
- /package/{public-api.d.ts → dist/public-api.d.ts} +0 -0
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../.eslintrc.json",
|
|
3
|
+
"ignorePatterns": [
|
|
4
|
+
"!**/*"
|
|
5
|
+
],
|
|
6
|
+
"overrides": [
|
|
7
|
+
{
|
|
8
|
+
"files": [
|
|
9
|
+
"*.ts"
|
|
10
|
+
],
|
|
11
|
+
"parserOptions": {
|
|
12
|
+
"project": [
|
|
13
|
+
"packages/ngx-forms/tsconfig.(lib|spec).json"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"rules": {
|
|
17
|
+
"@angular-eslint/directive-selector": [
|
|
18
|
+
"error",
|
|
19
|
+
{
|
|
20
|
+
"type": "attribute",
|
|
21
|
+
"prefix": "aui",
|
|
22
|
+
"style": "camelCase"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"@angular-eslint/component-selector": [
|
|
26
|
+
"error",
|
|
27
|
+
{
|
|
28
|
+
"type": "element",
|
|
29
|
+
"prefix": "aui",
|
|
30
|
+
"style": "kebab-case"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"files": [
|
|
37
|
+
"*.html"
|
|
38
|
+
],
|
|
39
|
+
"rules": {}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2016-present Digipolis
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# @acpaas-ui/ngx-forms
|
|
2
|
+
|
|
3
|
+
The forms module is a collection of several forms-related modules, like an autocomplete, a datepicker, a range slider, a timepicker, etc.
|
|
4
|
+
You can find an overview in the [Modules](#modules) section below.
|
|
5
|
+
|
|
6
|
+
## Documentation
|
|
7
|
+
|
|
8
|
+
Visit our [documentation site](https://antwerp-ui.digipolis.be/) for full how-to docs and guidelines
|
|
9
|
+
|
|
10
|
+
## <a name="modules"></a>Modules
|
|
11
|
+
|
|
12
|
+
| Name | Description | Documentation |
|
|
13
|
+
| -------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
|
|
14
|
+
| `AutoCompleteModule` | This module creates an input field with autocomplete functionality. | [Documentation](src/lib/auto-complete/README.md) |
|
|
15
|
+
| `DatepickerModule` | This package allows the user to select a date either by input or by picking one in the calendar flyout. | [Documentation](src/lib/datepicker/README.md) |
|
|
16
|
+
| `RangeSliderModule` | This module provides a range slider. | [Documentation](src/lib/range-slider/README.md) |
|
|
17
|
+
| `SearchFilterModule` | This package allows the user to use a JIRA-like filter component with remote search capabilities. | [Documentation](src/lib/search-filter/README.md) |
|
|
18
|
+
| `TimepickerModule` | This package allows the user set the time either by choosing a slot in the dropdown or by typing in the autocomplete field. | [Documentation](src/lib/timepicker/README.md) |
|
|
19
|
+
| `UploadModule` | This module provides a couple of upload components and a specific `Uploader` class. | [Documentation](src/lib/upload/README.md) |
|
|
20
|
+
|
|
21
|
+
## Contributing
|
|
22
|
+
|
|
23
|
+
Visit our [Contribution Guidelines](../../CONTRIBUTING.md) for more information on how to contribute.
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
5
|
+
import { DateHelper } from '@acpaas-ui/ngx-utils';
|
|
6
|
+
import { TZDate } from '@date-fns/tz';
|
|
7
|
+
import { FlyoutDirective } from '@acpaas-ui/ngx-flyout';
|
|
8
|
+
import { CALENDAR_DEFAULT_MONTH_LABELS, CALENDAR_DEFAULT_WEEKDAY_LABELS, CALENDAR_MONTH_LABELS, CALENDAR_WEEKDAY_LABELS, } from '@acpaas-ui/ngx-calendar';
|
|
9
|
+
import { DATEPICKER_DEFAULT_ERROR_LABELS, DATEPICKER_ERROR_LABELS, } from '../../datepicker.conf';
|
|
10
|
+
import { IntervalBuilder } from '@acpaas-ui/ngx-utils';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@acpaas-ui/ngx-calendar";
|
|
13
|
+
import * as i2 from "@angular/forms";
|
|
14
|
+
import * as i3 from "@angular/common";
|
|
15
|
+
import * as i4 from "@acpaas-ui/ngx-icon";
|
|
16
|
+
import * as i5 from "@acpaas-ui/ngx-flyout";
|
|
17
|
+
export class DatepickerComponent {
|
|
18
|
+
constructor(moduleMonthLabels = CALENDAR_DEFAULT_MONTH_LABELS, moduleWeekdayLabels = CALENDAR_DEFAULT_WEEKDAY_LABELS, errorLabels = DATEPICKER_DEFAULT_ERROR_LABELS, calendarService, formBuilder, ref) {
|
|
19
|
+
this.moduleMonthLabels = moduleMonthLabels;
|
|
20
|
+
this.moduleWeekdayLabels = moduleWeekdayLabels;
|
|
21
|
+
this.errorLabels = errorLabels;
|
|
22
|
+
this.calendarService = calendarService;
|
|
23
|
+
this.formBuilder = formBuilder;
|
|
24
|
+
this.ref = ref;
|
|
25
|
+
this.placeholder = 'dd/mm/yyyy';
|
|
26
|
+
this.ariaOpenDatepickerLabel = 'Open kalender';
|
|
27
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
28
|
+
this.blur = new EventEmitter();
|
|
29
|
+
this.isDisabled = false;
|
|
30
|
+
this.componentDestroyed$ = new Subject();
|
|
31
|
+
this.onChange = () => undefined;
|
|
32
|
+
this.onTouched = () => undefined;
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
this.weekdayLabels = this.weekdayLabels || this.moduleWeekdayLabels;
|
|
36
|
+
this.monthLabels = this.monthLabels || this.moduleMonthLabels;
|
|
37
|
+
this.createInterval();
|
|
38
|
+
this.formControl = this.formBuilder.control({ value: '', disabled: this.isDisabled });
|
|
39
|
+
this.formControl.valueChanges.pipe(takeUntil(this.componentDestroyed$)).subscribe((value) => {
|
|
40
|
+
if (value) {
|
|
41
|
+
const date = DateHelper.parseDate(value, 'dd/MM/yyyy');
|
|
42
|
+
if (date instanceof Date) {
|
|
43
|
+
this.selectedDate = date;
|
|
44
|
+
const brusselsDate = new TZDate(date, 'Europe/Brussels');
|
|
45
|
+
const year = brusselsDate.getFullYear();
|
|
46
|
+
const month = brusselsDate.getMonth();
|
|
47
|
+
const day = brusselsDate.getDate();
|
|
48
|
+
this.onChange(DateHelper.toUtcMidnightInBrussels(year, month, day));
|
|
49
|
+
}
|
|
50
|
+
else if (typeof date === 'string') {
|
|
51
|
+
this.onChange(value);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this.onChange(value);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.selectedDate = null;
|
|
59
|
+
this.onChange('');
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
ngOnChanges(changes) {
|
|
64
|
+
if (changes.min || changes.max) {
|
|
65
|
+
this.createInterval();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
ngOnDestroy() {
|
|
69
|
+
this.componentDestroyed$.next(true);
|
|
70
|
+
this.componentDestroyed$.complete();
|
|
71
|
+
}
|
|
72
|
+
createInterval() {
|
|
73
|
+
if (!this.min && !this.max) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Create an interval if min/max is filled in
|
|
77
|
+
this.interval = IntervalBuilder.dateInterval(this.min ? new Date(this.min) : null, this.max ? new Date(this.max) : null)
|
|
78
|
+
.not()
|
|
79
|
+
.build();
|
|
80
|
+
}
|
|
81
|
+
writeValue(value) {
|
|
82
|
+
if (typeof value === 'string') {
|
|
83
|
+
if (this.isISODateFormat(value)) {
|
|
84
|
+
this.selectedDate = DateHelper.parseDate(value);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const parsed = DateHelper.parseDate(value, 'dd/MM/yyyy');
|
|
88
|
+
this.selectedDate = parsed instanceof Date ? parsed : null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (value instanceof Date) {
|
|
92
|
+
this.selectedDate = value;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.selectedDate = null;
|
|
96
|
+
}
|
|
97
|
+
const dateString = this.selectedDate ? this.formatDate(this.selectedDate) : '';
|
|
98
|
+
this.formControl.setValue(dateString);
|
|
99
|
+
}
|
|
100
|
+
registerOnChange(onChange) {
|
|
101
|
+
this.onChange = onChange;
|
|
102
|
+
}
|
|
103
|
+
registerOnTouched(onTouched) {
|
|
104
|
+
this.onTouched = onTouched;
|
|
105
|
+
}
|
|
106
|
+
setDisabledState(isDisabled) {
|
|
107
|
+
this.isDisabled = isDisabled;
|
|
108
|
+
if (this.formControl) {
|
|
109
|
+
if (isDisabled && this.formControl.enabled) {
|
|
110
|
+
this.formControl.disable();
|
|
111
|
+
}
|
|
112
|
+
else if (!isDisabled && this.formControl.disabled) {
|
|
113
|
+
this.formControl.enable();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
this.ref.markForCheck();
|
|
117
|
+
}
|
|
118
|
+
selectDateFromCalendar(result) {
|
|
119
|
+
if (result.complete) {
|
|
120
|
+
this.formControl.setValue(this.formatDate(result.date));
|
|
121
|
+
this.flyout.close();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
formatDate(date) {
|
|
125
|
+
return DateHelper.formatDate(date, 'DD/MM/YYYY', {
|
|
126
|
+
leadingZero: true,
|
|
127
|
+
monthLabels: this.monthLabels,
|
|
128
|
+
weekdayLabels: this.weekdayLabels,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
validate(ctrl) {
|
|
132
|
+
// no error on empty value (add required validator in app)
|
|
133
|
+
if (ctrl.value === '' || ctrl.value === null) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
// throw format error if no valid date was provided
|
|
137
|
+
const date = DateHelper.parseDate(ctrl.value);
|
|
138
|
+
if (!date) {
|
|
139
|
+
return {
|
|
140
|
+
format: this.errorLabels.ERRORS_INVALID_DATE,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// no error if valid date an no range provided
|
|
144
|
+
if (!this.range || !this.range.length) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
// throw error when out of range
|
|
148
|
+
const range = this.calendarService.getRangeForDate(date, this.range);
|
|
149
|
+
return range.indexOf(date.getDate()) >= 0
|
|
150
|
+
? {
|
|
151
|
+
range: this.errorLabels.ERRORS_INVALID_RANGE,
|
|
152
|
+
}
|
|
153
|
+
: null;
|
|
154
|
+
}
|
|
155
|
+
handleBlur(e) {
|
|
156
|
+
this.blur.emit(e);
|
|
157
|
+
this.onTouched(e);
|
|
158
|
+
}
|
|
159
|
+
isISODateFormat(value) {
|
|
160
|
+
if (typeof value !== 'string') {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
return value.match(/\d{4}-\d{2}-\d{2}T.*/);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** @nocollapse */ DatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: DatepickerComponent, deps: [{ token: CALENDAR_MONTH_LABELS }, { token: CALENDAR_WEEKDAY_LABELS }, { token: DATEPICKER_ERROR_LABELS }, { token: i1.CalendarService }, { token: i2.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
167
|
+
/** @nocollapse */ DatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: DatepickerComponent, selector: "aui-datepicker", inputs: { id: "id", name: "name", placeholder: "placeholder", label: "label", description: "description", range: "range", min: "min", max: "max", autocomplete: "autocomplete", weekdayLabels: "weekdayLabels", monthLabels: "monthLabels", ariaOpenDatepickerLabel: "ariaOpenDatepickerLabel" }, outputs: { blur: "blur" }, providers: [
|
|
168
|
+
{
|
|
169
|
+
provide: NG_VALUE_ACCESSOR,
|
|
170
|
+
useExisting: forwardRef((() => DatepickerComponent)),
|
|
171
|
+
multi: true,
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
provide: NG_VALIDATORS,
|
|
175
|
+
useExisting: forwardRef((() => DatepickerComponent)),
|
|
176
|
+
multi: true,
|
|
177
|
+
},
|
|
178
|
+
], viewQueries: [{ propertyName: "flyout", first: true, predicate: FlyoutDirective, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div aria-haspopup=\"grid\" auiFlyout class=\"aui-datepicker a-input has-icon-right\">\n <label class=\"a-input__label\" for=\"{{ id }}\" *ngIf=\"label\">{{ label }}</label>\n <small class=\"a-input__description\" *ngIf=\"description\"> {{ description }}</small>\n <div class=\"a-input__wrapper\">\n <input\n (blur)=\"handleBlur($event)\"\n [attr.disabled]=\"isDisabled ? true : null\"\n [autocomplete]=\"autocomplete\"\n [formControl]=\"formControl\"\n id=\"{{ id }}\"\n label=\"Pick date\"\n description=\"Description\"\n name=\"{{ name }}\"\n placeholder=\"{{ placeholder }}\"\n type=\"text\"\n />\n <ng-container *ngIf=\"isDisabled\">\n <aui-icon\n name=\"ai-calendar\"\n />\n </ng-container>\n <ng-container *ngIf=\"!isDisabled\">\n <aui-icon\n auiFlyoutAction\n [openOnFocus]=\"false\"\n name=\"ai-calendar\"\n className=\"is-clickable\"\n role=\"button\"\n [attr.aria-label]=\"ariaOpenDatepickerLabel\"\n tabindex=\"0\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"!isDisabled\">\n <div auiFlyoutZone class=\"m-datepicker m-datepicker--fixed\" role=\"dialog\">\n <aui-calendar\n (selectDate)=\"selectDateFromCalendar($event)\"\n [range]=\"range\"\n [selectedDate]=\"selectedDate\"\n [interval]=\"interval\"\n [weekdayLabels]=\"weekdayLabels\"\n [monthLabels]=\"monthLabels\"\n ></aui-calendar>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [":host,.aui-datepicker{display:block}.m-flyout.is-open .m-datepicker{opacity:1;transform:translateY(calc(var(--BORDER-WIDTH) * -1));transition-delay:0s;visibility:visible}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i1.CalendarComponent, selector: "aui-calendar", inputs: ["ariaPreviousLabels", "ariaNextLabels", "selectedDate", "range", "interval", "weekdayLabels", "monthLabels"], outputs: ["selectDate"] }, { kind: "component", type: i4.IconComponent, selector: "aui-icon", inputs: ["name", "ariaLabel", "className"] }, { kind: "directive", type: i5.FlyoutActionDirective, selector: "[auiFlyoutAction]", inputs: ["openOnFocus", "disabled"], exportAs: ["auiFlyoutAction"] }, { kind: "directive", type: i5.FlyoutZoneDirective, selector: "[auiFlyoutZone]", inputs: ["auiFlyoutZone"], exportAs: ["auiFlyoutZone"] }, { kind: "directive", type: i5.FlyoutDirective, selector: "[auiFlyout]", inputs: ["size", "align", "toggleClick", "activateOnFocus"], outputs: ["opened", "closed"], exportAs: ["auiFlyout"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: DatepickerComponent, decorators: [{
|
|
180
|
+
type: Component,
|
|
181
|
+
args: [{ selector: 'aui-datepicker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
182
|
+
{
|
|
183
|
+
provide: NG_VALUE_ACCESSOR,
|
|
184
|
+
useExisting: forwardRef((() => DatepickerComponent)),
|
|
185
|
+
multi: true,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
provide: NG_VALIDATORS,
|
|
189
|
+
useExisting: forwardRef((() => DatepickerComponent)),
|
|
190
|
+
multi: true,
|
|
191
|
+
},
|
|
192
|
+
], template: "<div aria-haspopup=\"grid\" auiFlyout class=\"aui-datepicker a-input has-icon-right\">\n <label class=\"a-input__label\" for=\"{{ id }}\" *ngIf=\"label\">{{ label }}</label>\n <small class=\"a-input__description\" *ngIf=\"description\"> {{ description }}</small>\n <div class=\"a-input__wrapper\">\n <input\n (blur)=\"handleBlur($event)\"\n [attr.disabled]=\"isDisabled ? true : null\"\n [autocomplete]=\"autocomplete\"\n [formControl]=\"formControl\"\n id=\"{{ id }}\"\n label=\"Pick date\"\n description=\"Description\"\n name=\"{{ name }}\"\n placeholder=\"{{ placeholder }}\"\n type=\"text\"\n />\n <ng-container *ngIf=\"isDisabled\">\n <aui-icon\n name=\"ai-calendar\"\n />\n </ng-container>\n <ng-container *ngIf=\"!isDisabled\">\n <aui-icon\n auiFlyoutAction\n [openOnFocus]=\"false\"\n name=\"ai-calendar\"\n className=\"is-clickable\"\n role=\"button\"\n [attr.aria-label]=\"ariaOpenDatepickerLabel\"\n tabindex=\"0\"\n />\n </ng-container>\n\n <ng-container *ngIf=\"!isDisabled\">\n <div auiFlyoutZone class=\"m-datepicker m-datepicker--fixed\" role=\"dialog\">\n <aui-calendar\n (selectDate)=\"selectDateFromCalendar($event)\"\n [range]=\"range\"\n [selectedDate]=\"selectedDate\"\n [interval]=\"interval\"\n [weekdayLabels]=\"weekdayLabels\"\n [monthLabels]=\"monthLabels\"\n ></aui-calendar>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [":host,.aui-datepicker{display:block}.m-flyout.is-open .m-datepicker{opacity:1;transform:translateY(calc(var(--BORDER-WIDTH) * -1));transition-delay:0s;visibility:visible}\n"] }]
|
|
193
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
194
|
+
type: Inject,
|
|
195
|
+
args: [CALENDAR_MONTH_LABELS]
|
|
196
|
+
}] }, { type: undefined, decorators: [{
|
|
197
|
+
type: Inject,
|
|
198
|
+
args: [CALENDAR_WEEKDAY_LABELS]
|
|
199
|
+
}] }, { type: undefined, decorators: [{
|
|
200
|
+
type: Inject,
|
|
201
|
+
args: [DATEPICKER_ERROR_LABELS]
|
|
202
|
+
}] }, { type: i1.CalendarService }, { type: i2.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { flyout: [{
|
|
203
|
+
type: ViewChild,
|
|
204
|
+
args: [FlyoutDirective, { static: true }]
|
|
205
|
+
}], id: [{
|
|
206
|
+
type: Input
|
|
207
|
+
}], name: [{
|
|
208
|
+
type: Input
|
|
209
|
+
}], placeholder: [{
|
|
210
|
+
type: Input
|
|
211
|
+
}], label: [{
|
|
212
|
+
type: Input
|
|
213
|
+
}], description: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], range: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}], min: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], max: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], autocomplete: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], weekdayLabels: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], monthLabels: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], ariaOpenDatepickerLabel: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}], blur: [{
|
|
230
|
+
type: Output
|
|
231
|
+
}] } });
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RhdGVwaWNrZXIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kYXRlcGlja2VyL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFJTCxhQUFhLEVBQ2IsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsK0JBQStCLEVBQy9CLHFCQUFxQixFQUNyQix1QkFBdUIsR0FLeEIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBRUwsK0JBQStCLEVBQy9CLHVCQUF1QixHQUN4QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFBWSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7OztBQW9CakUsTUFBTSxPQUFPLG1CQUFtQjtJQTJCOUIsWUFDeUMsb0JBQW9CLDZCQUE2QixFQUMvQyxzQkFBc0IsK0JBQStCLEVBQ3JELGNBQWMsK0JBQStCLEVBQy9FLGVBQWdDLEVBQy9CLFdBQStCLEVBQy9CLEdBQXNCO1FBTFMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFnQztRQUMvQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQWtDO1FBQ3JELGdCQUFXLEdBQVgsV0FBVyxDQUFrQztRQUMvRSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0J2QixnQkFBVyxHQUFHLFlBQVksQ0FBQztRQVczQiw0QkFBdUIsR0FBRyxlQUFlLENBQUM7UUFFbkQsNERBQTREO1FBQ2xELFNBQUksR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBSXBDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFHbEIsd0JBQW1CLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7UUF1Si9ELGFBQVEsR0FBdUIsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBRS9DLGNBQVMsR0FBcUIsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO0lBaEpuRCxDQUFDO0lBRUcsUUFBUTtRQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDcEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUM5RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxRixJQUFJLEtBQUssRUFBRTtnQkFDVCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFO29CQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7b0JBQ3pELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN0QyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDckU7cUJBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDbkI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzFCLE9BQU87U0FDUjtRQUNELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDckM7YUFDRSxHQUFHLEVBQUU7YUFDTCxLQUFLLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBb0I7UUFDcEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFTLENBQUM7YUFDekQ7aUJBQU07Z0JBQ0wsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDNUQ7U0FDRjthQUFNLElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxRQUE0QjtRQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU0saUJBQWlCLENBQUMsU0FBMkI7UUFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFVBQW1CO1FBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUM1QjtpQkFBTSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzNCO1NBQ0Y7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxNQUF3QjtRQUNwRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQy9DLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFFBQVEsQ0FBQyxJQUF3QjtRQUN0QywwREFBMEQ7UUFDMUQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsbURBQW1EO1FBQ25ELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQjthQUM3QyxDQUFDO1NBQ0g7UUFFRCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsZ0NBQWdDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDdkMsQ0FBQyxDQUFDO2dCQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQjthQUM3QztZQUNILENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBRU0sVUFBVSxDQUFDLENBQVE7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBTU8sZUFBZSxDQUFDLEtBQWE7UUFDbkMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzdDLENBQUM7O21JQXpMVSxtQkFBbUIsa0JBNEJwQixxQkFBcUIsYUFDckIsdUJBQXVCLGFBQ3ZCLHVCQUF1Qjt1SEE5QnRCLG1CQUFtQixzV0FibkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtTQUNaO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsYUFBYTtZQUN0QixXQUFXLEVBQUUsVUFBVSxFQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixFQUFDO1lBQ2xELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixrRUFHVSxlQUFlLG1GQ2pFNUIsZ2pEQStDQTsyRkRpQmEsbUJBQW1CO2tCQWxCL0IsU0FBUzsrQkFDRSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxFQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLEVBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFDOzRCQUNsRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs7MEJBOEJFLE1BQU07MkJBQUMscUJBQXFCOzswQkFDNUIsTUFBTTsyQkFBQyx1QkFBdUI7OzBCQUM5QixNQUFNOzJCQUFDLHVCQUF1QjsySUE3QmEsTUFBTTtzQkFBbkQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNuQyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVOLEdBQUc7c0JBREYsS0FBSztnQkFHTixHQUFHO3NCQURGLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUdJLElBQUk7c0JBQWIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVIZWxwZXIsIERhdGVSYW5nZSB9IGZyb20gJ0BhY3BhYXMtdWkvbmd4LXV0aWxzJztcbmltcG9ydCB7IFRaRGF0ZSB9IGZyb20gJ0BkYXRlLWZucy90eic7XG5pbXBvcnQgeyBGbHlvdXREaXJlY3RpdmUgfSBmcm9tICdAYWNwYWFzLXVpL25neC1mbHlvdXQnO1xuaW1wb3J0IHtcbiAgQ0FMRU5EQVJfREVGQVVMVF9NT05USF9MQUJFTFMsXG4gIENBTEVOREFSX0RFRkFVTFRfV0VFS0RBWV9MQUJFTFMsXG4gIENBTEVOREFSX01PTlRIX0xBQkVMUyxcbiAgQ0FMRU5EQVJfV0VFS0RBWV9MQUJFTFMsXG4gIENhbGVuZGFyU2VydmljZSxcbiAgRGF0ZXBpY2tlclJlc3VsdCxcbiAgV2Vla2RheUxhYmVsc0NvbmZpZyxcbiAgTW9udGhMYWJlbHNDb25maWcsXG59IGZyb20gJ0BhY3BhYXMtdWkvbmd4LWNhbGVuZGFyJztcblxuaW1wb3J0IHtcbiAgREFURVBJQ0tFUl9TRVBBUkFUT1JfQ0hBUixcbiAgREFURVBJQ0tFUl9ERUZBVUxUX0VSUk9SX0xBQkVMUyxcbiAgREFURVBJQ0tFUl9FUlJPUl9MQUJFTFMsXG59IGZyb20gJy4uLy4uL2RhdGVwaWNrZXIuY29uZic7XG5pbXBvcnQgeyBEYXRlcGlja2VyVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4uLy4uL3R5cGVzL2RhdGVwaWNrZXIudHlwZXMnO1xuaW1wb3J0IHsgSW50ZXJ2YWwsIEludGVydmFsQnVpbGRlciB9IGZyb20gJ0BhY3BhYXMtdWkvbmd4LXV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXVpLWRhdGVwaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZXBpY2tlckNvbXBvbmVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWZvcndhcmQtcmVmXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyQ29tcG9uZW50KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tZm9yd2FyZC1yZWZcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBWaWV3Q2hpbGQoRmx5b3V0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXQ6IEZseW91dERpcmVjdGl2ZTtcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdkZC9tbS95eXl5JztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgQElucHV0KCkgcmFuZ2U6IERhdGVSYW5nZTtcbiAgQElucHV0KClcbiAgbWluOiBEYXRlIHwgbnVsbDtcbiAgQElucHV0KClcbiAgbWF4OiBEYXRlIHwgbnVsbDtcbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlOiAnb2ZmJztcbiAgQElucHV0KCkgd2Vla2RheUxhYmVsczogV2Vla2RheUxhYmVsc0NvbmZpZztcbiAgQElucHV0KCkgbW9udGhMYWJlbHM6IE1vbnRoTGFiZWxzQ29uZmlnO1xuICBASW5wdXQoKSBhcmlhT3BlbkRhdGVwaWNrZXJMYWJlbCA9ICdPcGVuIGthbGVuZGVyJztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIHB1YmxpYyBmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgc2VsZWN0ZWREYXRlOiBEYXRlO1xuICBwdWJsaWMgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgaW50ZXJ2YWw6IEludGVydmFsLklJbnRlcnZhbDxEYXRlPjtcblxuICBwcml2YXRlIGNvbXBvbmVudERlc3Ryb3llZCQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQ0FMRU5EQVJfTU9OVEhfTEFCRUxTKSBwcml2YXRlIG1vZHVsZU1vbnRoTGFiZWxzID0gQ0FMRU5EQVJfREVGQVVMVF9NT05USF9MQUJFTFMsXG4gICAgQEluamVjdChDQUxFTkRBUl9XRUVLREFZX0xBQkVMUykgcHJpdmF0ZSBtb2R1bGVXZWVrZGF5TGFiZWxzID0gQ0FMRU5EQVJfREVGQVVMVF9XRUVLREFZX0xBQkVMUyxcbiAgICBASW5qZWN0KERBVEVQSUNLRVJfRVJST1JfTEFCRUxTKSBwcml2YXRlIGVycm9yTGFiZWxzID0gREFURVBJQ0tFUl9ERUZBVUxUX0VSUk9SX0xBQkVMUyxcbiAgICBwdWJsaWMgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMud2Vla2RheUxhYmVscyA9IHRoaXMud2Vla2RheUxhYmVscyB8fCB0aGlzLm1vZHVsZVdlZWtkYXlMYWJlbHM7XG4gICAgdGhpcy5tb250aExhYmVscyA9IHRoaXMubW9udGhMYWJlbHMgfHwgdGhpcy5tb2R1bGVNb250aExhYmVscztcbiAgICB0aGlzLmNyZWF0ZUludGVydmFsKCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlZCB9KTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IERhdGVIZWxwZXIucGFyc2VEYXRlKHZhbHVlLCAnZGQvTU0veXl5eScpO1xuICAgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgY29uc3QgYnJ1c3NlbHNEYXRlID0gbmV3IFRaRGF0ZShkYXRlLCAnRXVyb3BlL0JydXNzZWxzJyk7XG4gICAgICAgICAgY29uc3QgeWVhciA9IGJydXNzZWxzRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gYnJ1c3NlbHNEYXRlLmdldE1vbnRoKCk7XG4gICAgICAgICAgY29uc3QgZGF5ID0gYnJ1c3NlbHNEYXRlLmdldERhdGUoKTtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKERhdGVIZWxwZXIudG9VdGNNaWRuaWdodEluQnJ1c3NlbHMoeWVhciwgbW9udGgsIGRheSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoJycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5taW4gfHwgY2hhbmdlcy5tYXgpIHtcbiAgICAgIHRoaXMuY3JlYXRlSW50ZXJ2YWwoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnREZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5jb21wb25lbnREZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUludGVydmFsKCkge1xuICAgIGlmICghdGhpcy5taW4gJiYgIXRoaXMubWF4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENyZWF0ZSBhbiBpbnRlcnZhbCBpZiBtaW4vbWF4IGlzIGZpbGxlZCBpblxuICAgIHRoaXMuaW50ZXJ2YWwgPSBJbnRlcnZhbEJ1aWxkZXIuZGF0ZUludGVydmFsKFxuICAgICAgdGhpcy5taW4gPyBuZXcgRGF0ZSh0aGlzLm1pbikgOiBudWxsLFxuICAgICAgdGhpcy5tYXggPyBuZXcgRGF0ZSh0aGlzLm1heCkgOiBudWxsXG4gICAgKVxuICAgICAgLm5vdCgpXG4gICAgICAuYnVpbGQoKTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBEYXRlKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0aGlzLmlzSVNPRGF0ZUZvcm1hdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBEYXRlSGVscGVyLnBhcnNlRGF0ZSh2YWx1ZSkgYXMgRGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IERhdGVIZWxwZXIucGFyc2VEYXRlKHZhbHVlLCAnZGQvTU0veXl5eScpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHBhcnNlZCBpbnN0YW5jZW9mIERhdGUgPyBwYXJzZWQgOiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZVN0cmluZyA9IHRoaXMuc2VsZWN0ZWREYXRlID8gdGhpcy5mb3JtYXREYXRlKHRoaXMuc2VsZWN0ZWREYXRlKSA6ICcnO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoZGF0ZVN0cmluZyk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHJlczogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG5cbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgaWYgKGlzRGlzYWJsZWQgJiYgdGhpcy5mb3JtQ29udHJvbC5lbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIGlmICghaXNEaXNhYmxlZCAmJiB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0RGF0ZUZyb21DYWxlbmRhcihyZXN1bHQ6IERhdGVwaWNrZXJSZXN1bHQpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0LmNvbXBsZXRlKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0RGF0ZShyZXN1bHQuZGF0ZSkpO1xuICAgICAgdGhpcy5mbHlvdXQuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0RGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRGF0ZUhlbHBlci5mb3JtYXREYXRlKGRhdGUsICdERC9NTS9ZWVlZJywge1xuICAgICAgbGVhZGluZ1plcm86IHRydWUsXG4gICAgICBtb250aExhYmVsczogdGhpcy5tb250aExhYmVscyxcbiAgICAgIHdlZWtkYXlMYWJlbHM6IHRoaXMud2Vla2RheUxhYmVscyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjdHJsOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBEYXRlcGlja2VyVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgLy8gbm8gZXJyb3Igb24gZW1wdHkgdmFsdWUgKGFkZCByZXF1aXJlZCB2YWxpZGF0b3IgaW4gYXBwKVxuICAgIGlmIChjdHJsLnZhbHVlID09PSAnJyB8fCBjdHJsLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyB0aHJvdyBmb3JtYXQgZXJyb3IgaWYgbm8gdmFsaWQgZGF0ZSB3YXMgcHJvdmlkZWRcbiAgICBjb25zdCBkYXRlID0gRGF0ZUhlbHBlci5wYXJzZURhdGUoY3RybC52YWx1ZSk7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6IHRoaXMuZXJyb3JMYWJlbHMuRVJST1JTX0lOVkFMSURfREFURSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gbm8gZXJyb3IgaWYgdmFsaWQgZGF0ZSBhbiBubyByYW5nZSBwcm92aWRlZFxuICAgIGlmICghdGhpcy5yYW5nZSB8fCAhdGhpcy5yYW5nZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHRocm93IGVycm9yIHdoZW4gb3V0IG9mIHJhbmdlXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmNhbGVuZGFyU2VydmljZS5nZXRSYW5nZUZvckRhdGUoZGF0ZSwgdGhpcy5yYW5nZSk7XG5cbiAgICByZXR1cm4gcmFuZ2UuaW5kZXhPZihkYXRlLmdldERhdGUoKSkgPj0gMFxuICAgICAgPyB7XG4gICAgICAgICAgcmFuZ2U6IHRoaXMuZXJyb3JMYWJlbHMuRVJST1JTX0lOVkFMSURfUkFOR0UsXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ibHVyLmVtaXQoZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoZSk7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlOiAocmVzOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBvblRvdWNoZWQ6IChfOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBpc0lTT0RhdGVGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5tYXRjaCgvXFxkezR9LVxcZHsyfS1cXGR7Mn1ULiovKTtcbiAgfVxufVxuIiwiPGRpdiBhcmlhLWhhc3BvcHVwPVwiZ3JpZFwiIGF1aUZseW91dCBjbGFzcz1cImF1aS1kYXRlcGlja2VyIGEtaW5wdXQgaGFzLWljb24tcmlnaHRcIj5cbiAgPGxhYmVsIGNsYXNzPVwiYS1pbnB1dF9fbGFiZWxcIiBmb3I9XCJ7eyBpZCB9fVwiICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gIDxzbWFsbCBjbGFzcz1cImEtaW5wdXRfX2Rlc2NyaXB0aW9uXCIgKm5nSWY9XCJkZXNjcmlwdGlvblwiPiB7eyBkZXNjcmlwdGlvbiB9fTwvc21hbGw+XG4gIDxkaXYgY2xhc3M9XCJhLWlucHV0X193cmFwcGVyXCI+XG4gICAgPGlucHV0XG4gICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKCRldmVudClcIlxuICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgIFthdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICBpZD1cInt7IGlkIH19XCJcbiAgICAgIGxhYmVsPVwiUGljayBkYXRlXCJcbiAgICAgIGRlc2NyaXB0aW9uPVwiRGVzY3JpcHRpb25cIlxuICAgICAgbmFtZT1cInt7IG5hbWUgfX1cIlxuICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBwbGFjZWhvbGRlciB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgLz5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEaXNhYmxlZFwiPlxuICAgICAgPGF1aS1pY29uXG4gICAgICAgIG5hbWU9XCJhaS1jYWxlbmRhclwiXG4gICAgICAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNEaXNhYmxlZFwiPlxuICAgICAgPGF1aS1pY29uXG4gICAgICAgIGF1aUZseW91dEFjdGlvblxuICAgICAgICBbb3Blbk9uRm9jdXNdPVwiZmFsc2VcIlxuICAgICAgICBuYW1lPVwiYWktY2FsZW5kYXJcIlxuICAgICAgICBjbGFzc05hbWU9XCJpcy1jbGlja2FibGVcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhT3BlbkRhdGVwaWNrZXJMYWJlbFwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0Rpc2FibGVkXCI+XG4gICAgICA8ZGl2IGF1aUZseW91dFpvbmUgY2xhc3M9XCJtLWRhdGVwaWNrZXIgbS1kYXRlcGlja2VyLS1maXhlZFwiIHJvbGU9XCJkaWFsb2dcIj5cbiAgICAgICAgPGF1aS1jYWxlbmRhclxuICAgICAgICAgIChzZWxlY3REYXRlKT1cInNlbGVjdERhdGVGcm9tQ2FsZW5kYXIoJGV2ZW50KVwiXG4gICAgICAgICAgW3JhbmdlXT1cInJhbmdlXCJcbiAgICAgICAgICBbc2VsZWN0ZWREYXRlXT1cInNlbGVjdGVkRGF0ZVwiXG4gICAgICAgICAgW2ludGVydmFsXT1cImludGVydmFsXCJcbiAgICAgICAgICBbd2Vla2RheUxhYmVsc109XCJ3ZWVrZGF5TGFiZWxzXCJcbiAgICAgICAgICBbbW9udGhMYWJlbHNdPVwibW9udGhMYWJlbHNcIlxuICAgICAgICA+PC9hdWktY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -351,9 +351,8 @@ class DatepickerComponent {
|
|
|
351
351
|
this.formControl = this.formBuilder.control({ value: '', disabled: this.isDisabled });
|
|
352
352
|
this.formControl.valueChanges.pipe(takeUntil(this.componentDestroyed$)).subscribe((value) => {
|
|
353
353
|
if (value) {
|
|
354
|
-
const
|
|
355
|
-
|
|
356
|
-
if (date) {
|
|
354
|
+
const date = DateHelper.parseDate(value, 'dd/MM/yyyy');
|
|
355
|
+
if (date instanceof Date) {
|
|
357
356
|
this.selectedDate = date;
|
|
358
357
|
const brusselsDate = new TZDate(date, 'Europe/Brussels');
|
|
359
358
|
const year = brusselsDate.getFullYear();
|
|
@@ -361,6 +360,9 @@ class DatepickerComponent {
|
|
|
361
360
|
const day = brusselsDate.getDate();
|
|
362
361
|
this.onChange(DateHelper.toUtcMidnightInBrussels(year, month, day));
|
|
363
362
|
}
|
|
363
|
+
else if (typeof date === 'string') {
|
|
364
|
+
this.onChange(value);
|
|
365
|
+
}
|
|
364
366
|
else {
|
|
365
367
|
this.onChange(value);
|
|
366
368
|
}
|
|
@@ -395,7 +397,8 @@ class DatepickerComponent {
|
|
|
395
397
|
this.selectedDate = DateHelper.parseDate(value);
|
|
396
398
|
}
|
|
397
399
|
else {
|
|
398
|
-
|
|
400
|
+
const parsed = DateHelper.parseDate(value, 'dd/MM/yyyy');
|
|
401
|
+
this.selectedDate = parsed instanceof Date ? parsed : null;
|
|
399
402
|
}
|
|
400
403
|
}
|
|
401
404
|
else if (value instanceof Date) {
|