@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.
Files changed (161) hide show
  1. package/.eslintrc.json +42 -0
  2. package/LICENSE.md +21 -0
  3. package/dist/README.md +23 -0
  4. package/dist/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +232 -0
  5. package/{fesm2015 → dist/fesm2015}/acpaas-ui-ngx-forms.mjs +7 -4
  6. package/dist/fesm2015/acpaas-ui-ngx-forms.mjs.map +1 -0
  7. package/{fesm2020 → dist/fesm2020}/acpaas-ui-ngx-forms.mjs +7 -4
  8. package/dist/fesm2020/acpaas-ui-ngx-forms.mjs.map +1 -0
  9. package/dist/package.json +44 -0
  10. package/karma.conf.js +38 -0
  11. package/ng-package.json +8 -0
  12. package/package.json +6 -27
  13. package/src/lib/auto-complete/README.md +148 -0
  14. package/src/lib/auto-complete/auto-complete.module.ts +15 -0
  15. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.html +51 -0
  16. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.scss +4 -0
  17. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.spec.ts +378 -0
  18. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.ts +281 -0
  19. package/src/lib/auto-complete/public-api.ts +2 -0
  20. package/src/lib/datepicker/README.md +110 -0
  21. package/src/lib/datepicker/components/datepicker/datepicker.component.html +47 -0
  22. package/src/lib/datepicker/components/datepicker/datepicker.component.scss +13 -0
  23. package/src/lib/datepicker/components/datepicker/datepicker.component.spec.ts +204 -0
  24. package/src/lib/datepicker/components/datepicker/datepicker.component.ts +251 -0
  25. package/src/lib/datepicker/datepicker.conf.ts +11 -0
  26. package/src/lib/datepicker/datepicker.module.ts +50 -0
  27. package/src/lib/datepicker/public-api.ts +8 -0
  28. package/src/lib/datepicker/types/datepicker.types.ts +8 -0
  29. package/src/lib/range-slider/README.md +56 -0
  30. package/src/lib/range-slider/components/range-slider/range-slider.component.html +46 -0
  31. package/src/lib/range-slider/components/range-slider/range-slider.component.scss +12 -0
  32. package/src/lib/range-slider/components/range-slider/range-slider.component.spec.ts +216 -0
  33. package/src/lib/range-slider/components/range-slider/range-slider.component.ts +301 -0
  34. package/src/lib/range-slider/public-api.ts +3 -0
  35. package/src/lib/range-slider/range-slider.module.ts +11 -0
  36. package/src/lib/range-slider/types/range-slider.types.ts +4 -0
  37. package/src/lib/search-filter/README.md +86 -0
  38. package/src/lib/search-filter/components/search-filter/search-filter.component.html +66 -0
  39. package/src/lib/search-filter/components/search-filter/search-filter.component.scss +23 -0
  40. package/src/lib/search-filter/components/search-filter/search-filter.component.spec.ts +264 -0
  41. package/src/lib/search-filter/components/search-filter/search-filter.component.ts +140 -0
  42. package/src/lib/search-filter/public-api.ts +3 -0
  43. package/src/lib/search-filter/search-filter.module.ts +13 -0
  44. package/src/lib/search-filter/types/search-filter.types.ts +4 -0
  45. package/src/lib/shared/services/search.service.spec.ts +78 -0
  46. package/src/lib/shared/services/search.service.ts +32 -0
  47. package/src/lib/shared/types/search.types.ts +6 -0
  48. package/src/lib/timepicker/README.md +84 -0
  49. package/src/lib/timepicker/classes/timepicker.validators.spec.ts +54 -0
  50. package/src/lib/timepicker/classes/timepicker.validators.ts +61 -0
  51. package/src/lib/timepicker/components/timepicker/timepicker.component.html +37 -0
  52. package/src/lib/timepicker/components/timepicker/timepicker.component.scss +3 -0
  53. package/src/lib/timepicker/components/timepicker/timepicker.component.spec.ts +161 -0
  54. package/src/lib/timepicker/components/timepicker/timepicker.component.ts +128 -0
  55. package/src/lib/timepicker/public-api.ts +4 -0
  56. package/src/lib/timepicker/timepicker.module.ts +13 -0
  57. package/src/lib/timepicker/types/timepicker.types.ts +5 -0
  58. package/src/lib/upload/README.md +283 -0
  59. package/src/lib/upload/classes/uploader.class.spec.ts +100 -0
  60. package/src/lib/upload/classes/uploader.class.ts +144 -0
  61. package/src/lib/upload/components/upload/upload.component.html +28 -0
  62. package/src/lib/upload/components/upload/upload.component.scss +3 -0
  63. package/src/lib/upload/components/upload/upload.component.spec.ts +117 -0
  64. package/src/lib/upload/components/upload/upload.component.ts +50 -0
  65. package/src/lib/upload/components/upload-input/upload-input.component.html +11 -0
  66. package/src/lib/upload/components/upload-input/upload-input.component.spec.ts +55 -0
  67. package/src/lib/upload/components/upload-input/upload-input.component.ts +35 -0
  68. package/src/lib/upload/components/upload-queue/upload-queue.component.html +16 -0
  69. package/src/lib/upload/components/upload-queue/upload-queue.component.spec.ts +99 -0
  70. package/src/lib/upload/components/upload-queue/upload-queue.component.ts +36 -0
  71. package/src/lib/upload/components/upload-zone/upload-zone.component.html +55 -0
  72. package/src/lib/upload/components/upload-zone/upload-zone.component.scss +3 -0
  73. package/src/lib/upload/components/upload-zone/upload-zone.component.spec.ts +144 -0
  74. package/src/lib/upload/components/upload-zone/upload-zone.component.ts +142 -0
  75. package/src/lib/upload/components/validation-list/validation-list.component.html +15 -0
  76. package/src/lib/upload/components/validation-list/validation-list.component.spec.ts +57 -0
  77. package/src/lib/upload/components/validation-list/validation-list.component.ts +29 -0
  78. package/src/lib/upload/public-api.ts +10 -0
  79. package/src/lib/upload/services/validation-messages.service.spec.ts +66 -0
  80. package/src/lib/upload/services/validation-messages.service.ts +27 -0
  81. package/src/lib/upload/types/upload.types.ts +20 -0
  82. package/src/lib/upload/upload.conf.ts +15 -0
  83. package/src/lib/upload/upload.module.ts +34 -0
  84. package/src/public-api.ts +6 -0
  85. package/src/test.ts +9 -0
  86. package/tsconfig.lib.json +26 -0
  87. package/tsconfig.spec.json +17 -0
  88. package/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +0 -229
  89. package/fesm2015/acpaas-ui-ngx-forms.mjs.map +0 -1
  90. package/fesm2020/acpaas-ui-ngx-forms.mjs.map +0 -1
  91. /package/{esm2020 → dist/esm2020}/acpaas-ui-ngx-forms.mjs +0 -0
  92. /package/{esm2020 → dist/esm2020}/lib/auto-complete/auto-complete.module.mjs +0 -0
  93. /package/{esm2020 → dist/esm2020}/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +0 -0
  94. /package/{esm2020 → dist/esm2020}/lib/auto-complete/public-api.mjs +0 -0
  95. /package/{esm2020 → dist/esm2020}/lib/datepicker/datepicker.conf.mjs +0 -0
  96. /package/{esm2020 → dist/esm2020}/lib/datepicker/datepicker.module.mjs +0 -0
  97. /package/{esm2020 → dist/esm2020}/lib/datepicker/public-api.mjs +0 -0
  98. /package/{esm2020 → dist/esm2020}/lib/datepicker/types/datepicker.types.mjs +0 -0
  99. /package/{esm2020 → dist/esm2020}/lib/range-slider/components/range-slider/range-slider.component.mjs +0 -0
  100. /package/{esm2020 → dist/esm2020}/lib/range-slider/public-api.mjs +0 -0
  101. /package/{esm2020 → dist/esm2020}/lib/range-slider/range-slider.module.mjs +0 -0
  102. /package/{esm2020 → dist/esm2020}/lib/range-slider/types/range-slider.types.mjs +0 -0
  103. /package/{esm2020 → dist/esm2020}/lib/search-filter/components/search-filter/search-filter.component.mjs +0 -0
  104. /package/{esm2020 → dist/esm2020}/lib/search-filter/public-api.mjs +0 -0
  105. /package/{esm2020 → dist/esm2020}/lib/search-filter/search-filter.module.mjs +0 -0
  106. /package/{esm2020 → dist/esm2020}/lib/search-filter/types/search-filter.types.mjs +0 -0
  107. /package/{esm2020 → dist/esm2020}/lib/shared/services/search.service.mjs +0 -0
  108. /package/{esm2020 → dist/esm2020}/lib/shared/types/search.types.mjs +0 -0
  109. /package/{esm2020 → dist/esm2020}/lib/timepicker/classes/timepicker.validators.mjs +0 -0
  110. /package/{esm2020 → dist/esm2020}/lib/timepicker/components/timepicker/timepicker.component.mjs +0 -0
  111. /package/{esm2020 → dist/esm2020}/lib/timepicker/public-api.mjs +0 -0
  112. /package/{esm2020 → dist/esm2020}/lib/timepicker/timepicker.module.mjs +0 -0
  113. /package/{esm2020 → dist/esm2020}/lib/timepicker/types/timepicker.types.mjs +0 -0
  114. /package/{esm2020 → dist/esm2020}/lib/upload/classes/uploader.class.mjs +0 -0
  115. /package/{esm2020 → dist/esm2020}/lib/upload/components/upload/upload.component.mjs +0 -0
  116. /package/{esm2020 → dist/esm2020}/lib/upload/components/upload-input/upload-input.component.mjs +0 -0
  117. /package/{esm2020 → dist/esm2020}/lib/upload/components/upload-queue/upload-queue.component.mjs +0 -0
  118. /package/{esm2020 → dist/esm2020}/lib/upload/components/upload-zone/upload-zone.component.mjs +0 -0
  119. /package/{esm2020 → dist/esm2020}/lib/upload/components/validation-list/validation-list.component.mjs +0 -0
  120. /package/{esm2020 → dist/esm2020}/lib/upload/public-api.mjs +0 -0
  121. /package/{esm2020 → dist/esm2020}/lib/upload/services/validation-messages.service.mjs +0 -0
  122. /package/{esm2020 → dist/esm2020}/lib/upload/types/upload.types.mjs +0 -0
  123. /package/{esm2020 → dist/esm2020}/lib/upload/upload.conf.mjs +0 -0
  124. /package/{esm2020 → dist/esm2020}/lib/upload/upload.module.mjs +0 -0
  125. /package/{esm2020 → dist/esm2020}/public-api.mjs +0 -0
  126. /package/{index.d.ts → dist/index.d.ts} +0 -0
  127. /package/{lib → dist/lib}/auto-complete/auto-complete.module.d.ts +0 -0
  128. /package/{lib → dist/lib}/auto-complete/components/auto-complete/auto-complete.component.d.ts +0 -0
  129. /package/{lib → dist/lib}/auto-complete/public-api.d.ts +0 -0
  130. /package/{lib → dist/lib}/datepicker/components/datepicker/datepicker.component.d.ts +0 -0
  131. /package/{lib → dist/lib}/datepicker/datepicker.conf.d.ts +0 -0
  132. /package/{lib → dist/lib}/datepicker/datepicker.module.d.ts +0 -0
  133. /package/{lib → dist/lib}/datepicker/public-api.d.ts +0 -0
  134. /package/{lib → dist/lib}/datepicker/types/datepicker.types.d.ts +0 -0
  135. /package/{lib → dist/lib}/range-slider/components/range-slider/range-slider.component.d.ts +0 -0
  136. /package/{lib → dist/lib}/range-slider/public-api.d.ts +0 -0
  137. /package/{lib → dist/lib}/range-slider/range-slider.module.d.ts +0 -0
  138. /package/{lib → dist/lib}/range-slider/types/range-slider.types.d.ts +0 -0
  139. /package/{lib → dist/lib}/search-filter/components/search-filter/search-filter.component.d.ts +0 -0
  140. /package/{lib → dist/lib}/search-filter/public-api.d.ts +0 -0
  141. /package/{lib → dist/lib}/search-filter/search-filter.module.d.ts +0 -0
  142. /package/{lib → dist/lib}/search-filter/types/search-filter.types.d.ts +0 -0
  143. /package/{lib → dist/lib}/shared/services/search.service.d.ts +0 -0
  144. /package/{lib → dist/lib}/shared/types/search.types.d.ts +0 -0
  145. /package/{lib → dist/lib}/timepicker/classes/timepicker.validators.d.ts +0 -0
  146. /package/{lib → dist/lib}/timepicker/components/timepicker/timepicker.component.d.ts +0 -0
  147. /package/{lib → dist/lib}/timepicker/public-api.d.ts +0 -0
  148. /package/{lib → dist/lib}/timepicker/timepicker.module.d.ts +0 -0
  149. /package/{lib → dist/lib}/timepicker/types/timepicker.types.d.ts +0 -0
  150. /package/{lib → dist/lib}/upload/classes/uploader.class.d.ts +0 -0
  151. /package/{lib → dist/lib}/upload/components/upload/upload.component.d.ts +0 -0
  152. /package/{lib → dist/lib}/upload/components/upload-input/upload-input.component.d.ts +0 -0
  153. /package/{lib → dist/lib}/upload/components/upload-queue/upload-queue.component.d.ts +0 -0
  154. /package/{lib → dist/lib}/upload/components/upload-zone/upload-zone.component.d.ts +0 -0
  155. /package/{lib → dist/lib}/upload/components/validation-list/validation-list.component.d.ts +0 -0
  156. /package/{lib → dist/lib}/upload/public-api.d.ts +0 -0
  157. /package/{lib → dist/lib}/upload/services/validation-messages.service.d.ts +0 -0
  158. /package/{lib → dist/lib}/upload/types/upload.types.d.ts +0 -0
  159. /package/{lib → dist/lib}/upload/upload.conf.d.ts +0 -0
  160. /package/{lib → dist/lib}/upload/upload.module.d.ts +0 -0
  161. /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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RhdGVwaWNrZXIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kYXRlcGlja2VyL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFJTCxhQUFhLEVBQ2IsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsK0JBQStCLEVBQy9CLHFCQUFxQixFQUNyQix1QkFBdUIsR0FLeEIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBRUwsK0JBQStCLEVBQy9CLHVCQUF1QixHQUN4QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFBWSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7OztBQW9CakUsTUFBTSxPQUFPLG1CQUFtQjtJQTJCOUIsWUFDeUMsb0JBQW9CLDZCQUE2QixFQUMvQyxz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Uzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNuQyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVOLEdBQUc7c0JBREYsS0FBSztnQkFHTixHQUFHO3NCQURGLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUdJLElBQUk7c0JBQWIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVIZWxwZXIsIERhdGVSYW5nZSB9IGZyb20gJ0BhY3BhYXMtdWkvbmd4LXV0aWxzJztcbmltcG9ydCB7IFRaRGF0ZSB9IGZyb20gJ0BkYXRlLWZucy90eic7XG5pbXBvcnQgeyBGbHlvdXREaXJlY3RpdmUgfSBmcm9tICdAYWNwYWFzLXVpL25neC1mbHlvdXQnO1xuaW1wb3J0IHtcbiAgQ0FMRU5EQVJfREVGQVVMVF9NT05USF9MQUJFTFMsXG4gIENBTEVOREFSX0RFRkFVTFRfV0VFS0RBWV9MQUJFTFMsXG4gIENBTEVOREFSX01PTlRIX0xBQkVMUyxcbiAgQ0FMRU5EQVJfV0VFS0RBWV9MQUJFTFMsXG4gIENhbGVuZGFyU2VydmljZSxcbiAgRGF0ZXBpY2tlclJlc3VsdCxcbiAgV2Vla2RheUxhYmVsc0NvbmZpZyxcbiAgTW9udGhMYWJlbHNDb25maWcsXG59IGZyb20gJ0BhY3BhYXMtdWkvbmd4LWNhbGVuZGFyJztcblxuaW1wb3J0IHtcbiAgREFURVBJQ0tFUl9TRVBBUkFUT1JfQ0hBUixcbiAgREFURVBJQ0tFUl9ERUZBVUxUX0VSUk9SX0xBQkVMUyxcbiAgREFURVBJQ0tFUl9FUlJPUl9MQUJFTFMsXG59IGZyb20gJy4uLy4uL2RhdGVwaWNrZXIuY29uZic7XG5pbXBvcnQgeyBEYXRlcGlja2VyVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4uLy4uL3R5cGVzL2RhdGVwaWNrZXIudHlwZXMnO1xuaW1wb3J0IHsgSW50ZXJ2YWwsIEludGVydmFsQnVpbGRlciB9IGZyb20gJ0BhY3BhYXMtdWkvbmd4LXV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXVpLWRhdGVwaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZXBpY2tlckNvbXBvbmVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWZvcndhcmQtcmVmXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyQ29tcG9uZW50KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tZm9yd2FyZC1yZWZcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBWaWV3Q2hpbGQoRmx5b3V0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXQ6IEZseW91dERpcmVjdGl2ZTtcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdkZC9tbS95eXl5JztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgQElucHV0KCkgcmFuZ2U6IERhdGVSYW5nZTtcbiAgQElucHV0KClcbiAgbWluOiBEYXRlIHwgbnVsbDtcbiAgQElucHV0KClcbiAgbWF4OiBEYXRlIHwgbnVsbDtcbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlOiAnb2ZmJztcbiAgQElucHV0KCkgd2Vla2RheUxhYmVsczogV2Vla2RheUxhYmVsc0NvbmZpZztcbiAgQElucHV0KCkgbW9udGhMYWJlbHM6IE1vbnRoTGFiZWxzQ29uZmlnO1xuICBASW5wdXQoKSBhcmlhT3BlbkRhdGVwaWNrZXJMYWJlbCA9ICdPcGVuIGthbGVuZGVyJztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIHB1YmxpYyBmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgc2VsZWN0ZWREYXRlOiBEYXRlO1xuICBwdWJsaWMgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgaW50ZXJ2YWw6IEludGVydmFsLklJbnRlcnZhbDxEYXRlPjtcblxuICBwcml2YXRlIGNvbXBvbmVudERlc3Ryb3llZCQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQ0FMRU5EQVJfTU9OVEhfTEFCRUxTKSBwcml2YXRlIG1vZHVsZU1vbnRoTGFiZWxzID0gQ0FMRU5EQVJfREVGQVVMVF9NT05USF9MQUJFTFMsXG4gICAgQEluamVjdChDQUxFTkRBUl9XRUVLREFZX0xBQkVMUykgcHJpdmF0ZSBtb2R1bGVXZWVrZGF5TGFiZWxzID0gQ0FMRU5EQVJfREVGQVVMVF9XRUVLREFZX0xBQkVMUyxcbiAgICBASW5qZWN0KERBVEVQSUNLRVJfRVJST1JfTEFCRUxTKSBwcml2YXRlIGVycm9yTGFiZWxzID0gREFURVBJQ0tFUl9ERUZBVUxUX0VSUk9SX0xBQkVMUyxcbiAgICBwdWJsaWMgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMud2Vla2RheUxhYmVscyA9IHRoaXMud2Vla2RheUxhYmVscyB8fCB0aGlzLm1vZHVsZVdlZWtkYXlMYWJlbHM7XG4gICAgdGhpcy5tb250aExhYmVscyA9IHRoaXMubW9udGhMYWJlbHMgfHwgdGhpcy5tb2R1bGVNb250aExhYmVscztcbiAgICB0aGlzLmNyZWF0ZUludGVydmFsKCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlZCB9KTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IERhdGVIZWxwZXIucGFyc2VEYXRlKHZhbHVlLCAnZGQvTU0veXl5eScpO1xuICAgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgY29uc3QgYnJ1c3NlbHNEYXRlID0gbmV3IFRaRGF0ZShkYXRlLCAnRXVyb3BlL0JydXNzZWxzJyk7XG4gICAgICAgICAgY29uc3QgeWVhciA9IGJydXNzZWxzRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gYnJ1c3NlbHNEYXRlLmdldE1vbnRoKCk7XG4gICAgICAgICAgY29uc3QgZGF5ID0gYnJ1c3NlbHNEYXRlLmdldERhdGUoKTtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKERhdGVIZWxwZXIudG9VdGNNaWRuaWdodEluQnJ1c3NlbHMoeWVhciwgbW9udGgsIGRheSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoJycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5taW4gfHwgY2hhbmdlcy5tYXgpIHtcbiAgICAgIHRoaXMuY3JlYXRlSW50ZXJ2YWwoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnREZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5jb21wb25lbnREZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUludGVydmFsKCkge1xuICAgIGlmICghdGhpcy5taW4gJiYgIXRoaXMubWF4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENyZWF0ZSBhbiBpbnRlcnZhbCBpZiBtaW4vbWF4IGlzIGZpbGxlZCBpblxuICAgIHRoaXMuaW50ZXJ2YWwgPSBJbnRlcnZhbEJ1aWxkZXIuZGF0ZUludGVydmFsKFxuICAgICAgdGhpcy5taW4gPyBuZXcgRGF0ZSh0aGlzLm1pbikgOiBudWxsLFxuICAgICAgdGhpcy5tYXggPyBuZXcgRGF0ZSh0aGlzLm1heCkgOiBudWxsXG4gICAgKVxuICAgICAgLm5vdCgpXG4gICAgICAuYnVpbGQoKTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBEYXRlKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0aGlzLmlzSVNPRGF0ZUZvcm1hdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBEYXRlSGVscGVyLnBhcnNlRGF0ZSh2YWx1ZSkgYXMgRGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IERhdGVIZWxwZXIucGFyc2VEYXRlKHZhbHVlLCAnZGQvTU0veXl5eScpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHBhcnNlZCBpbnN0YW5jZW9mIERhdGUgPyBwYXJzZWQgOiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZVN0cmluZyA9IHRoaXMuc2VsZWN0ZWREYXRlID8gdGhpcy5mb3JtYXREYXRlKHRoaXMuc2VsZWN0ZWREYXRlKSA6ICcnO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoZGF0ZVN0cmluZyk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHJlczogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG5cbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgaWYgKGlzRGlzYWJsZWQgJiYgdGhpcy5mb3JtQ29udHJvbC5lbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIGlmICghaXNEaXNhYmxlZCAmJiB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0RGF0ZUZyb21DYWxlbmRhcihyZXN1bHQ6IERhdGVwaWNrZXJSZXN1bHQpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0LmNvbXBsZXRlKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0RGF0ZShyZXN1bHQuZGF0ZSkpO1xuICAgICAgdGhpcy5mbHlvdXQuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0RGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRGF0ZUhlbHBlci5mb3JtYXREYXRlKGRhdGUsICdERC9NTS9ZWVlZJywge1xuICAgICAgbGVhZGluZ1plcm86IHRydWUsXG4gICAgICBtb250aExhYmVsczogdGhpcy5tb250aExhYmVscyxcbiAgICAgIHdlZWtkYXlMYWJlbHM6IHRoaXMud2Vla2RheUxhYmVscyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjdHJsOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBEYXRlcGlja2VyVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgLy8gbm8gZXJyb3Igb24gZW1wdHkgdmFsdWUgKGFkZCByZXF1aXJlZCB2YWxpZGF0b3IgaW4gYXBwKVxuICAgIGlmIChjdHJsLnZhbHVlID09PSAnJyB8fCBjdHJsLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyB0aHJvdyBmb3JtYXQgZXJyb3IgaWYgbm8gdmFsaWQgZGF0ZSB3YXMgcHJvdmlkZWRcbiAgICBjb25zdCBkYXRlID0gRGF0ZUhlbHBlci5wYXJzZURhdGUoY3RybC52YWx1ZSk7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6IHRoaXMuZXJyb3JMYWJlbHMuRVJST1JTX0lOVkFMSURfREFURSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gbm8gZXJyb3IgaWYgdmFsaWQgZGF0ZSBhbiBubyByYW5nZSBwcm92aWRlZFxuICAgIGlmICghdGhpcy5yYW5nZSB8fCAhdGhpcy5yYW5nZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHRocm93IGVycm9yIHdoZW4gb3V0IG9mIHJhbmdlXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmNhbGVuZGFyU2VydmljZS5nZXRSYW5nZUZvckRhdGUoZGF0ZSwgdGhpcy5yYW5nZSk7XG5cbiAgICByZXR1cm4gcmFuZ2UuaW5kZXhPZihkYXRlLmdldERhdGUoKSkgPj0gMFxuICAgICAgPyB7XG4gICAgICAgICAgcmFuZ2U6IHRoaXMuZXJyb3JMYWJlbHMuRVJST1JTX0lOVkFMSURfUkFOR0UsXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ibHVyLmVtaXQoZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoZSk7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlOiAocmVzOiBhbnkpID0+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 format = value.split(DATEPICKER_SEPARATOR_CHAR).reverse().join('-');
355
- const date = DateHelper.parseDate(format, 'yyyy-MM-dd');
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
- this.selectedDate = DateHelper.parseDate(value, 'dd/MM/yyyy');
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) {