@siemens/element-ng 47.3.0 → 47.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/badge/si-badge.component.d.ts +1 -1
  2. package/breadcrumb/breadcrumb-item.model.d.ts +36 -0
  3. package/breadcrumb/index.d.ts +7 -0
  4. package/breadcrumb/package.json +3 -0
  5. package/breadcrumb/si-breadcrumb-item-template.directive.d.ts +10 -0
  6. package/breadcrumb/si-breadcrumb.component.d.ts +46 -0
  7. package/breadcrumb/si-breadcrumb.module.d.ts +7 -0
  8. package/card/index.d.ts +6 -0
  9. package/card/package.json +3 -0
  10. package/card/si-card.component.d.ts +79 -0
  11. package/card/si-card.module.d.ts +7 -0
  12. package/circle-status/index.d.ts +6 -0
  13. package/circle-status/package.json +3 -0
  14. package/circle-status/si-circle-status.component.d.ts +66 -0
  15. package/circle-status/si-circle-status.module.d.ts +7 -0
  16. package/column-selection-dialog/column-selection-editor/si-column-selection-editor.component.d.ts +23 -0
  17. package/column-selection-dialog/index.d.ts +6 -0
  18. package/column-selection-dialog/package.json +3 -0
  19. package/column-selection-dialog/si-column-selection-dialog.component.d.ts +114 -0
  20. package/column-selection-dialog/si-column-selection-dialog.service.d.ts +20 -0
  21. package/column-selection-dialog/si-column-selection-dialog.types.d.ts +68 -0
  22. package/common/models/status-type.model.d.ts +2 -2
  23. package/date-range-filter/index.d.ts +8 -0
  24. package/date-range-filter/package.json +3 -0
  25. package/date-range-filter/si-date-range-calculation.service.d.ts +33 -0
  26. package/date-range-filter/si-date-range-filter.component.d.ts +248 -0
  27. package/date-range-filter/si-date-range-filter.module.d.ts +7 -0
  28. package/date-range-filter/si-date-range-filter.types.d.ts +40 -0
  29. package/date-range-filter/si-relative-date.component.d.ts +31 -0
  30. package/datepicker/components/si-calendar-body.component.d.ts +137 -0
  31. package/datepicker/components/si-calendar-date-cell.directive.d.ts +16 -0
  32. package/datepicker/components/si-calendar-direction-button.component.d.ts +18 -0
  33. package/datepicker/components/si-compare-adapter.d.ts +37 -0
  34. package/datepicker/components/si-day-selection.component.d.ts +76 -0
  35. package/datepicker/components/si-initial-focus.component.d.ts +74 -0
  36. package/datepicker/components/si-month-selection.component.d.ts +62 -0
  37. package/datepicker/components/si-year-selection.component.d.ts +65 -0
  38. package/datepicker/date-time-helper.d.ts +302 -0
  39. package/datepicker/index.d.ts +15 -0
  40. package/datepicker/package.json +3 -0
  41. package/datepicker/si-calendar-button.component.d.ts +49 -0
  42. package/datepicker/si-date-input.directive.d.ts +114 -0
  43. package/datepicker/si-date-range.component.d.ts +150 -0
  44. package/datepicker/si-datepicker-overlay.component.d.ts +82 -0
  45. package/datepicker/si-datepicker-overlay.directive.d.ts +104 -0
  46. package/datepicker/si-datepicker.component.d.ts +228 -0
  47. package/datepicker/si-datepicker.directive.d.ts +62 -0
  48. package/datepicker/si-datepicker.model.d.ts +129 -0
  49. package/datepicker/si-datepicker.module.d.ts +12 -0
  50. package/datepicker/si-timepicker.component.d.ts +214 -0
  51. package/electron-titlebar/electron.helpers.d.ts +5 -0
  52. package/electron-titlebar/index.d.ts +7 -0
  53. package/electron-titlebar/package.json +3 -0
  54. package/electron-titlebar/si-electron-titlebar.component.d.ts +72 -0
  55. package/electron-titlebar/si-electron-titlebar.module.d.ts +7 -0
  56. package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
  57. package/fesm2022/siemens-element-ng-breadcrumb.mjs +302 -0
  58. package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -0
  59. package/fesm2022/siemens-element-ng-card.mjs +122 -0
  60. package/fesm2022/siemens-element-ng-card.mjs.map +1 -0
  61. package/fesm2022/siemens-element-ng-circle-status.mjs +146 -0
  62. package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -0
  63. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +369 -0
  64. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -0
  65. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  66. package/fesm2022/siemens-element-ng-date-range-filter.mjs +649 -0
  67. package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -0
  68. package/fesm2022/siemens-element-ng-datepicker.mjs +4231 -0
  69. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -0
  70. package/fesm2022/siemens-element-ng-electron-titlebar.mjs +142 -0
  71. package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -0
  72. package/fesm2022/siemens-element-ng-file-uploader.mjs +751 -0
  73. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -0
  74. package/fesm2022/siemens-element-ng-filter-bar.mjs +153 -0
  75. package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -0
  76. package/fesm2022/siemens-element-ng-icon.mjs +11 -1
  77. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  78. package/fesm2022/siemens-element-ng-info-page.mjs +63 -0
  79. package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -0
  80. package/fesm2022/siemens-element-ng-inline-notification.mjs +4 -6
  81. package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
  82. package/fesm2022/siemens-element-ng-ip-input.mjs +451 -0
  83. package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -0
  84. package/fesm2022/siemens-element-ng-localization.mjs +306 -0
  85. package/fesm2022/siemens-element-ng-localization.mjs.map +1 -0
  86. package/fesm2022/siemens-element-ng-photo-upload.mjs +480 -0
  87. package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -0
  88. package/fesm2022/siemens-element-ng-search-bar.mjs +193 -0
  89. package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -0
  90. package/fesm2022/siemens-element-ng-slider.mjs +313 -0
  91. package/fesm2022/siemens-element-ng-slider.mjs.map +1 -0
  92. package/fesm2022/siemens-element-ng-sort-bar.mjs +89 -0
  93. package/fesm2022/siemens-element-ng-sort-bar.mjs.map +1 -0
  94. package/fesm2022/siemens-element-ng-split.mjs +575 -0
  95. package/fesm2022/siemens-element-ng-split.mjs.map +1 -0
  96. package/fesm2022/siemens-element-ng-status-toggle.mjs +196 -0
  97. package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -0
  98. package/fesm2022/siemens-element-ng-system-banner.mjs +47 -0
  99. package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -0
  100. package/fesm2022/siemens-element-ng-tabs.mjs +395 -0
  101. package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -0
  102. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  103. package/fesm2022/siemens-element-ng-unauthorized-page.mjs +76 -0
  104. package/fesm2022/siemens-element-ng-unauthorized-page.mjs.map +1 -0
  105. package/file-uploader/index.d.ts +8 -0
  106. package/file-uploader/package.json +3 -0
  107. package/file-uploader/si-file-dropzone.component.d.ts +106 -0
  108. package/file-uploader/si-file-uploader.component.d.ts +296 -0
  109. package/file-uploader/si-file-uploader.model.d.ts +12 -0
  110. package/file-uploader/si-file-uploader.module.d.ts +8 -0
  111. package/filter-bar/filter.d.ts +26 -0
  112. package/filter-bar/index.d.ts +8 -0
  113. package/filter-bar/package.json +3 -0
  114. package/filter-bar/si-filter-bar.component.d.ts +65 -0
  115. package/filter-bar/si-filter-bar.module.d.ts +7 -0
  116. package/filter-bar/si-filter-pill.component.d.ts +20 -0
  117. package/icon/element-icons.d.ts +10 -0
  118. package/info-page/index.d.ts +5 -0
  119. package/info-page/package.json +3 -0
  120. package/info-page/si-info-page.component.d.ts +38 -0
  121. package/inline-notification/si-inline-notification.component.d.ts +0 -2
  122. package/ip-input/address-utils.d.ts +28 -0
  123. package/ip-input/address-validators.d.ts +21 -0
  124. package/ip-input/index.d.ts +7 -0
  125. package/ip-input/package.json +3 -0
  126. package/ip-input/si-ip-input.directive.d.ts +53 -0
  127. package/ip-input/si-ip4-input.directive.d.ts +9 -0
  128. package/ip-input/si-ip6-input.directive.d.ts +10 -0
  129. package/localization/index.d.ts +8 -0
  130. package/localization/package.json +3 -0
  131. package/localization/si-directionality.d.ts +41 -0
  132. package/localization/si-locale-id.d.ts +22 -0
  133. package/localization/si-locale-store.d.ts +16 -0
  134. package/localization/si-locale.service.d.ts +73 -0
  135. package/package.json +91 -3
  136. package/photo-upload/index.d.ts +6 -0
  137. package/photo-upload/package.json +3 -0
  138. package/photo-upload/si-image-cropper-style.component.d.ts +5 -0
  139. package/photo-upload/si-photo-upload.component.d.ts +298 -0
  140. package/search-bar/index.d.ts +6 -0
  141. package/search-bar/package.json +3 -0
  142. package/search-bar/si-search-bar.component.d.ts +87 -0
  143. package/search-bar/si-search-bar.module.d.ts +7 -0
  144. package/slider/index.d.ts +6 -0
  145. package/slider/package.json +3 -0
  146. package/slider/si-slider.component.d.ts +129 -0
  147. package/slider/si-slider.module.d.ts +7 -0
  148. package/sort-bar/index.d.ts +6 -0
  149. package/sort-bar/package.json +3 -0
  150. package/sort-bar/si-sort-bar.component.d.ts +42 -0
  151. package/sort-bar/si-sort-bar.module.d.ts +7 -0
  152. package/split/index.d.ts +8 -0
  153. package/split/package.json +3 -0
  154. package/split/si-split-part.component.d.ts +154 -0
  155. package/split/si-split.component.d.ts +48 -0
  156. package/split/si-split.interfaces.d.ts +17 -0
  157. package/split/si-split.module.d.ts +8 -0
  158. package/status-toggle/index.d.ts +6 -0
  159. package/status-toggle/package.json +3 -0
  160. package/status-toggle/si-status-toggle.component.d.ts +54 -0
  161. package/status-toggle/status-toggle.model.d.ts +26 -0
  162. package/system-banner/index.d.ts +5 -0
  163. package/system-banner/package.json +3 -0
  164. package/system-banner/system-banner.component.d.ts +23 -0
  165. package/tabs/index.d.ts +7 -0
  166. package/tabs/package.json +3 -0
  167. package/tabs/si-tab/index.d.ts +5 -0
  168. package/tabs/si-tab/si-tab.component.d.ts +58 -0
  169. package/tabs/si-tabs.module.d.ts +8 -0
  170. package/tabs/si-tabset/index.d.ts +5 -0
  171. package/tabs/si-tabset/si-tabset.component.d.ts +100 -0
  172. package/template-i18n.json +82 -0
  173. package/translate/si-translatable-keys.interface.d.ts +82 -0
  174. package/unauthorized-page/index.d.ts +6 -0
  175. package/unauthorized-page/package.json +3 -0
  176. package/unauthorized-page/si-unauthorized-page.component.d.ts +35 -0
  177. package/unauthorized-page/si-unauthorized-page.module.d.ts +7 -0
@@ -0,0 +1,649 @@
1
+ import { CdkOption, CdkListbox } from '@angular/cdk/listbox';
2
+ import { DatePipe, NgTemplateOutlet } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { Injectable, input, booleanAttribute, output, signal, computed, ChangeDetectionStrategy, Component, Pipe, inject, model, NgModule } from '@angular/core';
5
+ import * as i1 from '@angular/forms';
6
+ import { FormsModule } from '@angular/forms';
7
+ import { SiCalendarButtonComponent, SiDatepickerComponent, SiDatepickerDirective } from '@siemens/element-ng/datepicker';
8
+ import { SiSearchBarComponent } from '@siemens/element-ng/search-bar';
9
+ import * as i2 from '@siemens/element-translate-ng/translate';
10
+ import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
11
+ import { SiNumberInputComponent } from '@siemens/element-ng/number-input';
12
+ import { SiSelectComponent, SiSelectSingleValueDirective, SiSelectSimpleOptionsDirective } from '@siemens/element-ng/select';
13
+
14
+ /**
15
+ * Copyright Siemens 2016 - 2025.
16
+ * SPDX-License-Identifier: MIT
17
+ */
18
+ /**
19
+ * Service to transform and calculate with DateRangeFilter objects.
20
+ */
21
+ class SiDateRangeCalculationService {
22
+ /**
23
+ * Calculates the start and end dates of a DateRangeFilter.
24
+ * @param filter - The date range filter object to be resolved.
25
+ * @param options - Options for time handling
26
+ * @returns The resolved result in form of a ResolvedDateRange object.
27
+ */
28
+ resolveDateRangeFilter(filter, options) {
29
+ const ref = filter.point1 === 'now' ? new Date() : new Date(filter.point1);
30
+ const withTime = options?.withTime ?? true;
31
+ if (!withTime) {
32
+ this.removeTime(ref);
33
+ }
34
+ if (filter.point2 instanceof Date) {
35
+ const point2 = withTime ? filter.point2 : this.removeTime(new Date(filter.point2));
36
+ return this.normalize(ref, point2, options?.skipNormalization);
37
+ }
38
+ const offset = filter.point2;
39
+ switch (filter.range) {
40
+ case undefined:
41
+ case 'before':
42
+ return this.normalize(ref, this.datePlusOffset(ref, -offset), options?.skipNormalization);
43
+ case 'after':
44
+ return this.normalize(ref, this.datePlusOffset(ref, offset), options?.skipNormalization);
45
+ case 'within':
46
+ return this.normalize(this.datePlusOffset(ref, -offset), this.datePlusOffset(ref, offset), options?.skipNormalization);
47
+ }
48
+ }
49
+ datePlusOffset(date, offset) {
50
+ return new Date(date.getTime() + offset);
51
+ }
52
+ normalize(date1, date2, skip) {
53
+ const valid = !isNaN(date1.getTime()) && !isNaN(date2.getTime());
54
+ return skip
55
+ ? { start: date1, end: date2, valid }
56
+ : date1 < date2
57
+ ? { start: date1, end: date2, valid }
58
+ : { start: date2, end: date1, valid };
59
+ }
60
+ /**
61
+ * Utility to reset the time attributes to 0 (hours/minutes/seconds/milliseconds).
62
+ */
63
+ removeTime(date) {
64
+ date.setHours(0);
65
+ date.setMinutes(0);
66
+ date.setSeconds(0);
67
+ date.setMilliseconds(0);
68
+ return date;
69
+ }
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeCalculationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeCalculationService, providedIn: 'root' });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeCalculationService, decorators: [{
74
+ type: Injectable,
75
+ args: [{ providedIn: 'root' }]
76
+ }] });
77
+
78
+ const ONE_MINUTE = 60 * 1000;
79
+ const ONE_DAY = ONE_MINUTE * 60 * 24;
80
+
81
+ /**
82
+ * Copyright Siemens 2016 - 2025.
83
+ * SPDX-License-Identifier: MIT
84
+ */
85
+ class SiRelativeDateComponent {
86
+ /** @defaultValue 0 */
87
+ value = input(0);
88
+ /** @defaultValue false */
89
+ enableTimeSelection = input(false, { transform: booleanAttribute });
90
+ valueLabel = input.required();
91
+ unitLabel = input.required();
92
+ valueChange = output();
93
+ internalValue = signal(0);
94
+ offset = signal(0);
95
+ unit = signal('days');
96
+ fullOffsetList = [
97
+ {
98
+ type: 'option',
99
+ value: 'minutes',
100
+ label: $localize `:@@SI_DATE_RANGE_FILTER.MINUTES:Minutes`,
101
+ offset: ONE_MINUTE
102
+ },
103
+ {
104
+ type: 'option',
105
+ value: 'hours',
106
+ label: $localize `:@@SI_DATE_RANGE_FILTER.HOURS:Hours`,
107
+ offset: 60 * ONE_MINUTE
108
+ },
109
+ {
110
+ type: 'option',
111
+ value: 'days',
112
+ label: $localize `:@@SI_DATE_RANGE_FILTER.DAYS:Days`,
113
+ offset: ONE_DAY
114
+ },
115
+ {
116
+ type: 'option',
117
+ value: 'weeks',
118
+ label: $localize `:@@SI_DATE_RANGE_FILTER.WEEKS:Weeks`,
119
+ offset: 7 * ONE_DAY
120
+ },
121
+ {
122
+ type: 'option',
123
+ value: 'months',
124
+ label: $localize `:@@SI_DATE_RANGE_FILTER.MONTHS:Months`,
125
+ offset: 30 * ONE_DAY
126
+ },
127
+ {
128
+ type: 'option',
129
+ value: 'years',
130
+ label: $localize `:@@SI_DATE_RANGE_FILTER.YEARS:Years`,
131
+ offset: 365 * ONE_DAY
132
+ }
133
+ ];
134
+ offsetList = computed(() => this.enableTimeSelection()
135
+ ? this.fullOffsetList
136
+ : this.fullOffsetList.filter(item => item.offset >= ONE_DAY));
137
+ ngOnChanges(changes) {
138
+ const value = this.value();
139
+ if (changes.value && value !== this.internalValue()) {
140
+ this.internalValue.set(value);
141
+ this.calculateOffset();
142
+ }
143
+ }
144
+ calculateOffset() {
145
+ const offsetList = this.offsetList();
146
+ let unit = '';
147
+ if (offsetList.length) {
148
+ this.offset.set(0);
149
+ unit = offsetList[0].value;
150
+ }
151
+ for (let i = offsetList.length - 1; i >= 0; i--) {
152
+ const item = offsetList[i];
153
+ const raw = this.internalValue() / item.offset;
154
+ const rounded = Math.round(raw);
155
+ if (rounded > 0 && Math.abs(raw - rounded) < 0.001) {
156
+ this.offset.set(rounded);
157
+ unit = item.value;
158
+ break;
159
+ }
160
+ }
161
+ this.changeUnit(unit);
162
+ }
163
+ updateValue(offset) {
164
+ this.offset.set(offset);
165
+ const item = this.offsetList().find(x => x.value === this.unit());
166
+ this.internalValue.set(offset * item.offset);
167
+ this.valueChange.emit(this.internalValue());
168
+ }
169
+ changeUnit(newUnit) {
170
+ this.unit.set(newUnit);
171
+ const item = this.offsetList().find(x => x.value === this.unit());
172
+ this.offset.set(Math.max(1, Math.round(this.internalValue() / item.offset)));
173
+ this.internalValue.set(this.offset() * item.offset);
174
+ this.valueChange.emit(this.internalValue());
175
+ }
176
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiRelativeDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
177
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.6", type: SiRelativeDateComponent, isStandalone: true, selector: "si-relative-date", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, enableTimeSelection: { classPropertyName: "enableTimeSelection", publicName: "enableTimeSelection", isSignal: true, isRequired: false, transformFunction: null }, valueLabel: { classPropertyName: "valueLabel", publicName: "valueLabel", isSignal: true, isRequired: true, transformFunction: null }, unitLabel: { classPropertyName: "unitLabel", publicName: "unitLabel", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<si-number-input\n class=\"form-control mb-4\"\n [aria-label]=\"valueLabel()\"\n [ngModel]=\"offset()\"\n (ngModelChange)=\"updateValue($event)\"\n/>\n<si-select\n class=\"form-control\"\n min=\"0\"\n [ariaLabel]=\"unitLabel()\"\n [options]=\"offsetList()\"\n [ngModel]=\"unit()\"\n (ngModelChange)=\"changeUnit($event)\"\n/>\n", styles: [".form-control{min-inline-size:0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SiNumberInputComponent, selector: "si-number-input", inputs: ["min", "max", "step", "value", "unit", "showButtons", "aria-label", "inputId", "disabled", "readonly", "placeholder"], outputs: ["valueChange"] }, { kind: "component", type: SiSelectComponent, selector: "si-select", inputs: ["id", "ariaLabel", "labelledby", "filterPlaceholder", "noResultsFoundLabel", "placeholder", "readonly", "hasFilter"], outputs: ["dropdownClose", "openChange"] }, { kind: "directive", type: SiSelectSingleValueDirective, selector: "si-select:not([multi])" }, { kind: "directive", type: SiSelectSimpleOptionsDirective, selector: "si-select[options]", inputs: ["options", "optionEqualCheckFn"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
178
+ }
179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiRelativeDateComponent, decorators: [{
180
+ type: Component,
181
+ args: [{ selector: 'si-relative-date', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
182
+ FormsModule,
183
+ SiNumberInputComponent,
184
+ SiSelectComponent,
185
+ SiSelectSingleValueDirective,
186
+ SiSelectSimpleOptionsDirective
187
+ ], template: "<si-number-input\n class=\"form-control mb-4\"\n [aria-label]=\"valueLabel()\"\n [ngModel]=\"offset()\"\n (ngModelChange)=\"updateValue($event)\"\n/>\n<si-select\n class=\"form-control\"\n min=\"0\"\n [ariaLabel]=\"unitLabel()\"\n [options]=\"offsetList()\"\n [ngModel]=\"unit()\"\n (ngModelChange)=\"changeUnit($event)\"\n/>\n", styles: [".form-control{min-inline-size:0}\n"] }]
188
+ }] });
189
+
190
+ /**
191
+ * Copyright Siemens 2016 - 2025.
192
+ * SPDX-License-Identifier: MIT
193
+ */
194
+ class PresetMatchFilterPipe {
195
+ transform(value, term) {
196
+ return !term ? true : value.toLowerCase().includes(term.toLowerCase());
197
+ }
198
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: PresetMatchFilterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
199
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: PresetMatchFilterPipe, isStandalone: true, name: "presetMatchFilter" });
200
+ }
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: PresetMatchFilterPipe, decorators: [{
202
+ type: Pipe,
203
+ args: [{ name: 'presetMatchFilter', pure: true }]
204
+ }] });
205
+ class SiDateRangeFilterComponent {
206
+ service = inject(SiDateRangeCalculationService);
207
+ /** The filter range object */
208
+ range = model.required();
209
+ /** List of preset time ranges. When not present or empty, the preset section won't show */
210
+ presetList = input();
211
+ /**
212
+ * Determines if there's a search field for the preset list
213
+ *
214
+ * @defaultValue true
215
+ */
216
+ presetSearch = input(true, { transform: booleanAttribute });
217
+ /**
218
+ * Determines if time is selectable or only dates
219
+ *
220
+ * @defaultValue false
221
+ */
222
+ enableTimeSelection = input(false, { transform: booleanAttribute });
223
+ /**
224
+ * Determines whether to show input fields or a date-range calendar in basic mode.
225
+ * When time selection is enabled, this has no effect and input fields are always shown.
226
+ *
227
+ * @defaultValue 'calendar'
228
+ */
229
+ basicMode = input('calendar');
230
+ /**
231
+ * Reverses the order of the from/to fields
232
+ *
233
+ * @defaultValue false
234
+ */
235
+ reverseInputFields = input(false, { transform: booleanAttribute });
236
+ /**
237
+ * Determines whether to show the 'Apply' button
238
+ *
239
+ * @defaultValue false
240
+ */
241
+ showApplyButton = input(false, { transform: booleanAttribute });
242
+ /**
243
+ * Hides the advanced mode if input allows
244
+ *
245
+ * @defaultValue false
246
+ */
247
+ hideAdvancedMode = input(false, { transform: booleanAttribute });
248
+ /**
249
+ * label for the "Reference point" title
250
+ *
251
+ * @defaultValue
252
+ * ```
253
+ * $localize`:@@SI_DATE_RANGE_FILTER.REF_POINT:Reference point`
254
+ * ```
255
+ */
256
+ refLabel = input($localize `:@@SI_DATE_RANGE_FILTER.REF_POINT:Reference point`);
257
+ /**
258
+ * label for the "Reference point" title
259
+ *
260
+ * @defaultValue
261
+ * ```
262
+ * $localize`:@@SI_DATE_RANGE_FILTER.FROM:From`
263
+ * ```
264
+ */
265
+ fromLabel = input($localize `:@@SI_DATE_RANGE_FILTER.FROM:From`);
266
+ /**
267
+ * label for the "Reference point" title
268
+ *
269
+ * @defaultValue
270
+ * ```
271
+ * $localize`:@@SI_DATE_RANGE_FILTER.TO:To`
272
+ * ```
273
+ */
274
+ toLabel = input($localize `:@@SI_DATE_RANGE_FILTER.TO:To`);
275
+ /**
276
+ * label for the "Range" title
277
+ *
278
+ * @defaultValue
279
+ * ```
280
+ * $localize`:@@SI_DATE_RANGE_FILTER.RANGE:Range`
281
+ * ```
282
+ */
283
+ rangeLabel = input($localize `:@@SI_DATE_RANGE_FILTER.RANGE:Range`);
284
+ /**
285
+ * label for the "Today" checkbox
286
+ *
287
+ * @defaultValue
288
+ * ```
289
+ * $localize`:@@SI_DATE_RANGE_FILTER.TODAY:Today`
290
+ * ```
291
+ */
292
+ todayLabel = input($localize `:@@SI_DATE_RANGE_FILTER.TODAY:Today`);
293
+ /**
294
+ * label for the "Now" checkbox
295
+ *
296
+ * @defaultValue
297
+ * ```
298
+ * $localize`:@@SI_DATE_RANGE_FILTER.NOW:Now`
299
+ * ```
300
+ */
301
+ nowLabel = input($localize `:@@SI_DATE_RANGE_FILTER.NOW:Now`);
302
+ /**
303
+ * label for "Date" field / radio button
304
+ *
305
+ * @defaultValue
306
+ * ```
307
+ * $localize`:@@SI_DATE_RANGE_FILTER.DATE:Date`
308
+ * ```
309
+ */
310
+ dateLabel = input($localize `:@@SI_DATE_RANGE_FILTER.DATE:Date`);
311
+ /**
312
+ * label for the "Preview" title
313
+ *
314
+ * @defaultValue
315
+ * ```
316
+ * $localize`:@@SI_DATE_RANGE_FILTER.PREVIEW:Preview`
317
+ * ```
318
+ */
319
+ previewLabel = input($localize `:@@SI_DATE_RANGE_FILTER.PREVIEW:Preview`);
320
+ /**
321
+ * Placeholder for date fields
322
+ *
323
+ * @defaultValue
324
+ * ```
325
+ * $localize`:@@SI_DATE_RANGE_FILTER.DATE_PLACEHOLDER:Select date`
326
+ * ```
327
+ */
328
+ datePlaceholder = input($localize `:@@SI_DATE_RANGE_FILTER.DATE_PLACEHOLDER:Select date`);
329
+ /**
330
+ * label for the "Before" toggle
331
+ *
332
+ * @defaultValue
333
+ * ```
334
+ * $localize`:@@SI_DATE_RANGE_FILTER.BEFORE:Before`
335
+ * ```
336
+ */
337
+ beforeLabel = input($localize `:@@SI_DATE_RANGE_FILTER.BEFORE:Before`);
338
+ /**
339
+ * label for the "After" toggle
340
+ *
341
+ * @defaultValue
342
+ * ```
343
+ * $localize`:@@SI_DATE_RANGE_FILTER.AFTER:After`
344
+ * ```
345
+ */
346
+ afterLabel = input($localize `:@@SI_DATE_RANGE_FILTER.AFTER:After`);
347
+ /**
348
+ * label for the "Within" toggle
349
+ *
350
+ * @defaultValue
351
+ * ```
352
+ * $localize`:@@SI_DATE_RANGE_FILTER.WITHIN:Within`
353
+ * ```
354
+ */
355
+ withinLabel = input($localize `:@@SI_DATE_RANGE_FILTER.WITHIN:Within`);
356
+ /**
357
+ * label for the "value" number input
358
+ *
359
+ * @defaultValue
360
+ * ```
361
+ * $localize`:@@SI_DATE_RANGE_FILTER.VALUE:Value`
362
+ * ```
363
+ */
364
+ valueLabel = input($localize `:@@SI_DATE_RANGE_FILTER.VALUE:Value`);
365
+ /**
366
+ * label for the "Unit" select
367
+ *
368
+ * @defaultValue
369
+ * ```
370
+ * $localize`:@@SI_DATE_RANGE_FILTER.UNIT:Unit`
371
+ * ```
372
+ */
373
+ unitLabel = input($localize `:@@SI_DATE_RANGE_FILTER.UNIT:Unit`);
374
+ /**
375
+ * label for the "search" input
376
+ *
377
+ * @defaultValue
378
+ * ```
379
+ * $localize`:@@SI_DATE_RANGE_FILTER.SEARCH:Search`
380
+ * ```
381
+ */
382
+ searchLabel = input($localize `:@@SI_DATE_RANGE_FILTER.SEARCH:Search`);
383
+ /**
384
+ * label for the "search" input
385
+ *
386
+ * @defaultValue
387
+ * ```
388
+ * $localize`:@@SI_DATE_RANGE_FILTER.PRESETS:Presets`
389
+ * ```
390
+ */
391
+ presetLabel = input($localize `:@@SI_DATE_RANGE_FILTER.PRESETS:Presets`);
392
+ /**
393
+ * label for the "advanced" switch
394
+ *
395
+ * @defaultValue
396
+ * ```
397
+ * $localize`:@@SI_DATE_RANGE_FILTER.ADVANCED:Advanced`
398
+ * ```
399
+ */
400
+ advancedLabel = input($localize `:@@SI_DATE_RANGE_FILTER.ADVANCED:Advanced`);
401
+ /**
402
+ * label for the "apply" switch
403
+ *
404
+ * @defaultValue
405
+ * ```
406
+ * $localize`:@@SI_DATE_RANGE_FILTER.APPLY:Apply`
407
+ * ```
408
+ */
409
+ applyLabel = input($localize `:@@SI_DATE_RANGE_FILTER.APPLY:Apply`);
410
+ /** Event fired when the apply button has been clicked */
411
+ applyClicked = output();
412
+ /** Base configuration on how the dates should be displayed, parts of it may be overwritten internally. */
413
+ datepickerConfig = input();
414
+ advancedMode = false;
415
+ dateRange = { start: undefined, end: undefined };
416
+ point1Now = true;
417
+ point2Mode = 'duration';
418
+ point1date = this.getDateNow();
419
+ point2date = this.getDateNow();
420
+ point2offset = 0;
421
+ point2range = 'before';
422
+ calculatedRange = computed(() => this.resolve(this.range()));
423
+ pipeFormat = computed(() => this.enableTimeSelection()
424
+ ? (this.datepickerConfig()?.dateTimeFormat ?? 'short')
425
+ : (this.datepickerConfig()?.dateFormat ?? 'shortDate'));
426
+ datepickerConfigInternal = computed(() => ({
427
+ ...(this.datepickerConfig() ?? {}),
428
+ enableDateRange: false,
429
+ showTime: this.enableTimeSelection(),
430
+ mandatoryTime: this.enableTimeSelection()
431
+ }));
432
+ dateRangeConfig = computed(() => ({
433
+ ...(this.datepickerConfig() ?? {}),
434
+ enableDateRange: true
435
+ }));
436
+ filteredPresetList = computed(() => {
437
+ const timeFilter = (item) => {
438
+ const timeOnly = item.type === 'custom' ? item.timeOnly : item.offset < ONE_DAY;
439
+ return this.enableTimeSelection() || !timeOnly;
440
+ };
441
+ return (this.presetList() ?? []).filter(timeFilter);
442
+ });
443
+ presetFilter = signal('');
444
+ inputMode = computed(() => this.basicMode() === 'input' || this.enableTimeSelection());
445
+ ngOnChanges(changes) {
446
+ if (changes.enableTimeSelection ||
447
+ changes.datepickerConfig ||
448
+ (changes.range && this.rangeChanged(changes.range.previousValue, changes.range.currentValue))) {
449
+ this.updateFromRange();
450
+ }
451
+ if ((changes.basicMode || changes.enableTimeSelection) &&
452
+ this.inputMode() &&
453
+ !this.advancedMode) {
454
+ this.point2Mode = 'date';
455
+ this.point2Changed();
456
+ }
457
+ }
458
+ getDateNow() {
459
+ const now = new Date();
460
+ if (!this.enableTimeSelection()) {
461
+ this.service.removeTime(now);
462
+ }
463
+ return now;
464
+ }
465
+ rangeChanged(oldRange, newRange) {
466
+ return (!oldRange ||
467
+ oldRange.point1 !== newRange.point1 ||
468
+ oldRange.point2 !== newRange.point2 ||
469
+ oldRange.range !== newRange.range);
470
+ }
471
+ updateFromRange() {
472
+ const rangeVal = this.range();
473
+ this.point1Now = rangeVal.point1 === 'now';
474
+ this.point1date = rangeVal.point1 === 'now' ? this.getDateNow() : rangeVal.point1;
475
+ this.point2Mode = rangeVal.point2 instanceof Date ? 'date' : 'duration';
476
+ this.point2date = rangeVal.point2 instanceof Date ? rangeVal.point2 : this.getDateNow();
477
+ this.point2range = rangeVal.range ?? 'before';
478
+ this.point2offset =
479
+ rangeVal.point2 instanceof Date
480
+ ? Math.round(this.point1date.getTime() - rangeVal.point2.getTime())
481
+ : rangeVal.point2;
482
+ if ((this.point1Now && this.basicMode() !== 'input') || this.point2Mode !== 'date') {
483
+ this.advancedMode = true;
484
+ }
485
+ else {
486
+ this.advancedMode = false;
487
+ this.updateDateRange();
488
+ }
489
+ }
490
+ resolve(range, skipNormalization) {
491
+ return this.service.resolveDateRangeFilter(range, {
492
+ withTime: this.enableTimeSelection(),
493
+ skipNormalization
494
+ });
495
+ }
496
+ updateDateRange(range = this.range()) {
497
+ const calculatedRange = this.resolve(range);
498
+ this.dateRange.start = calculatedRange.start;
499
+ this.dateRange.end = calculatedRange.end;
500
+ }
501
+ updateOnModeChange() {
502
+ if (this.advancedMode) {
503
+ const calculatedRange = this.resolve(this.range());
504
+ this.point2Mode = 'duration';
505
+ this.point2range = 'after';
506
+ this.point2offset = Math.abs(calculatedRange.end.getTime() - calculatedRange.start.getTime());
507
+ }
508
+ else {
509
+ this.updateSimpleMode(this.range());
510
+ }
511
+ }
512
+ updateSimpleMode(newRange) {
513
+ if (this.inputMode()) {
514
+ this.range.update(oldRange => ({
515
+ ...oldRange,
516
+ point1: newRange.point1
517
+ }));
518
+ // input mode supports `now`, so point1 needs to remain unchanged
519
+ if (newRange.point1 === 'now') {
520
+ this.point1Now = true;
521
+ this.point1date = this.getDateNow();
522
+ }
523
+ else {
524
+ this.point1Now = false;
525
+ this.point1date = newRange.point1;
526
+ }
527
+ const calculatedRange = this.resolve(newRange, true);
528
+ this.point2Mode = 'date';
529
+ this.point2date = calculatedRange.end;
530
+ this.range.update(oldRange => ({
531
+ ...oldRange,
532
+ range: undefined,
533
+ point2: calculatedRange.end
534
+ }));
535
+ }
536
+ else {
537
+ this.point1Now = false;
538
+ this.updateDateRange(newRange);
539
+ this.updateFromDateRange();
540
+ }
541
+ }
542
+ updateFromDateRange() {
543
+ this.point1date = this.range().point1 = this.dateRange.start ?? this.getDateNow();
544
+ this.point2date = this.range().point2 = this.dateRange.end ?? this.getDateNow();
545
+ this.range.update(oldRange => ({ ...oldRange, range: undefined }));
546
+ this.point2Mode = 'date';
547
+ this.point2offset = 0;
548
+ }
549
+ point1Changed() {
550
+ if (this.point1Now) {
551
+ this.range.update(oldRange => ({ ...oldRange, point1: 'now' }));
552
+ this.point1date = this.getDateNow();
553
+ if (this.point2Mode !== 'date') {
554
+ this.point2range ??= 'before';
555
+ }
556
+ }
557
+ else {
558
+ this.range.update(oldRange => ({ ...oldRange, point1: this.point1date ?? new Date(NaN) }));
559
+ }
560
+ }
561
+ point2Changed() {
562
+ if (this.point2Mode === 'date') {
563
+ if (!(this.range().point2 instanceof Date)) {
564
+ const calculatedRange = this.resolve(this.range());
565
+ this.point2date =
566
+ this.point1date < calculatedRange.end ? calculatedRange.start : calculatedRange.end;
567
+ }
568
+ this.range.update(oldRange => ({
569
+ ...oldRange,
570
+ range: undefined,
571
+ point2: this.point2date
572
+ }));
573
+ }
574
+ else {
575
+ this.range.update(oldRange => ({
576
+ ...oldRange,
577
+ range: this.point2range
578
+ }));
579
+ if (this.range().point2 instanceof Date) {
580
+ const calculatedRange = this.resolve(this.range());
581
+ this.point2offset = Math.round(calculatedRange.end.getTime() - calculatedRange.start.getTime());
582
+ }
583
+ this.range.update(oldRange => ({
584
+ ...oldRange,
585
+ point2: this.point2offset
586
+ }));
587
+ }
588
+ }
589
+ selectPresetItem(item) {
590
+ const newRange = item.type === 'custom'
591
+ ? item.calculate(item, this.range())
592
+ : { point1: 'now', range: 'before', point2: item.offset };
593
+ if (this.advancedMode) {
594
+ Object.assign(this.range(), newRange);
595
+ this.updateFromRange();
596
+ }
597
+ else {
598
+ this.updateSimpleMode(newRange);
599
+ }
600
+ }
601
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
602
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiDateRangeFilterComponent, isStandalone: true, selector: "si-date-range-filter", inputs: { range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: true, transformFunction: null }, presetList: { classPropertyName: "presetList", publicName: "presetList", isSignal: true, isRequired: false, transformFunction: null }, presetSearch: { classPropertyName: "presetSearch", publicName: "presetSearch", isSignal: true, isRequired: false, transformFunction: null }, enableTimeSelection: { classPropertyName: "enableTimeSelection", publicName: "enableTimeSelection", isSignal: true, isRequired: false, transformFunction: null }, basicMode: { classPropertyName: "basicMode", publicName: "basicMode", isSignal: true, isRequired: false, transformFunction: null }, reverseInputFields: { classPropertyName: "reverseInputFields", publicName: "reverseInputFields", isSignal: true, isRequired: false, transformFunction: null }, showApplyButton: { classPropertyName: "showApplyButton", publicName: "showApplyButton", isSignal: true, isRequired: false, transformFunction: null }, hideAdvancedMode: { classPropertyName: "hideAdvancedMode", publicName: "hideAdvancedMode", isSignal: true, isRequired: false, transformFunction: null }, refLabel: { classPropertyName: "refLabel", publicName: "refLabel", isSignal: true, isRequired: false, transformFunction: null }, fromLabel: { classPropertyName: "fromLabel", publicName: "fromLabel", isSignal: true, isRequired: false, transformFunction: null }, toLabel: { classPropertyName: "toLabel", publicName: "toLabel", isSignal: true, isRequired: false, transformFunction: null }, rangeLabel: { classPropertyName: "rangeLabel", publicName: "rangeLabel", isSignal: true, isRequired: false, transformFunction: null }, todayLabel: { classPropertyName: "todayLabel", publicName: "todayLabel", isSignal: true, isRequired: false, transformFunction: null }, nowLabel: { classPropertyName: "nowLabel", publicName: "nowLabel", isSignal: true, isRequired: false, transformFunction: null }, dateLabel: { classPropertyName: "dateLabel", publicName: "dateLabel", isSignal: true, isRequired: false, transformFunction: null }, previewLabel: { classPropertyName: "previewLabel", publicName: "previewLabel", isSignal: true, isRequired: false, transformFunction: null }, datePlaceholder: { classPropertyName: "datePlaceholder", publicName: "datePlaceholder", isSignal: true, isRequired: false, transformFunction: null }, beforeLabel: { classPropertyName: "beforeLabel", publicName: "beforeLabel", isSignal: true, isRequired: false, transformFunction: null }, afterLabel: { classPropertyName: "afterLabel", publicName: "afterLabel", isSignal: true, isRequired: false, transformFunction: null }, withinLabel: { classPropertyName: "withinLabel", publicName: "withinLabel", isSignal: true, isRequired: false, transformFunction: null }, valueLabel: { classPropertyName: "valueLabel", publicName: "valueLabel", isSignal: true, isRequired: false, transformFunction: null }, unitLabel: { classPropertyName: "unitLabel", publicName: "unitLabel", isSignal: true, isRequired: false, transformFunction: null }, searchLabel: { classPropertyName: "searchLabel", publicName: "searchLabel", isSignal: true, isRequired: false, transformFunction: null }, presetLabel: { classPropertyName: "presetLabel", publicName: "presetLabel", isSignal: true, isRequired: false, transformFunction: null }, advancedLabel: { classPropertyName: "advancedLabel", publicName: "advancedLabel", isSignal: true, isRequired: false, transformFunction: null }, applyLabel: { classPropertyName: "applyLabel", publicName: "applyLabel", isSignal: true, isRequired: false, transformFunction: null }, datepickerConfig: { classPropertyName: "datepickerConfig", publicName: "datepickerConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { range: "rangeChange", applyClicked: "applyClicked" }, usesOnChanges: true, ngImport: i0, template: "@if (presetList()?.length) {\n <div class=\"preset-select border-end\">\n @if (presetSearch()) {\n <si-search-bar\n colorVariant=\"base-0\"\n class=\"mx-6 mt-5 mb-6\"\n [placeholder]=\"searchLabel() | translate\"\n [showIcon]=\"true\"\n [(ngModel)]=\"presetFilter\"\n />\n }\n <ul class=\"overflow-auto\" cdkListbox [attr.aria-label]=\"presetLabel() | translate\">\n @for (item of filteredPresetList(); track $index) {\n @if (item.label | translate | presetMatchFilter: presetFilter()) {\n <li\n class=\"preset-item focus-inside px-8 py-5\"\n [cdkOption]=\"item.label\"\n (click)=\"selectPresetItem(item)\"\n (keydown.enter)=\"selectPresetItem(item)\"\n >\n {{ item.label | translate }}\n </li>\n }\n }\n </ul>\n </div>\n}\n<form class=\"main-form d-flex flex-column flex-fill\">\n @if (advancedMode || inputMode()) {\n <div class=\"advanced-form px-6 py-4\">\n @if (!reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n\n <div class=\"mb-8\">\n @if (point2Mode === 'date') {\n <ng-container *ngTemplateOutlet=\"formPoint2Date\" />\n }\n @if (point2Mode === 'duration') {\n <ng-container *ngTemplateOutlet=\"formPoint2Duration\" />\n }\n </div>\n\n @if (reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n </div>\n } @else {\n <si-datepicker\n [config]=\"dateRangeConfig()\"\n [focusedDate]=\"dateRange.end ?? dateRange.start\"\n [(dateRange)]=\"dateRange\"\n (dateRangeChange)=\"updateFromDateRange()\"\n />\n }\n\n @if (advancedMode || !hideAdvancedMode()) {\n <label class=\"form-switch form-check ms-6\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"advancedMode\"\n role=\"switch\"\n [(ngModel)]=\"advancedMode\"\n (ngModelChange)=\"updateOnModeChange()\"\n />\n <span class=\"form-check-label\">{{ advancedLabel() | translate }}</span>\n </label>\n }\n\n <div class=\"mt-4 mb-6 ms-6\">\n {{ previewLabel() | translate }}:\n <span class=\"preview\">\n @if (calculatedRange().valid) {\n {{ calculatedRange().start | date: pipeFormat() }} -\n {{ calculatedRange().end | date: pipeFormat() }}\n } @else {\n ?\n }\n </span>\n </div>\n</form>\n\n@if (showApplyButton()) {\n <div class=\"footer border-top px-6 py-5 d-flex\">\n <button type=\"button\" class=\"btn btn-primary ms-auto\" (click)=\"applyClicked.emit()\">\n {{ applyLabel() | translate }}\n </button>\n </div>\n}\n\n<ng-template #formReferencePoint>\n <div class=\"mb-8\">\n <label class=\"d-block\">\n <span class=\"form-label\">{{\n (advancedMode ? refLabel() : reverseInputFields() ? toLabel() : fromLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point1\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [disabled]=\"point1Now\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point1date\"\n (ngModelChange)=\"point1Changed()\"\n />\n </si-calendar-button>\n </label>\n <label class=\"ms-4 mt-4 text-nowrap form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"point1now\"\n [(ngModel)]=\"point1Now\"\n (ngModelChange)=\"point1Changed()\"\n />\n <span class=\"form-check-label\">{{\n (enableTimeSelection() ? nowLabel() : todayLabel()) | translate\n }}</span>\n </label>\n </div>\n</ng-template>\n\n<ng-template #formPoint2Date>\n <label class=\"d-block mb-4 bp-9\">\n <span class=\"form-label\">{{\n (reverseInputFields() ? fromLabel() : toLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point2\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [attr.aria-label]=\"dateLabel() | translate\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point2date\"\n (ngModelChange)=\"point2Changed()\"\n />\n </si-calendar-button>\n </label>\n</ng-template>\n\n<ng-template #formPoint2Duration>\n <div>\n <span class=\"form-label\">{{ rangeLabel() | translate }}</span>\n <si-relative-date\n class=\"d-block mb-4\"\n [unitLabel]=\"unitLabel() | translate\"\n [valueLabel]=\"valueLabel() | translate\"\n [enableTimeSelection]=\"enableTimeSelection()\"\n [(value)]=\"point2offset\"\n (valueChange)=\"point2Changed()\"\n />\n <div class=\"range-type ms-4\">\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"before\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ beforeLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"after\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ afterLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"within\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ withinLabel() | translate }}\n </span>\n </label>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:inline-grid;background:var(--element-base-1);grid-template-areas:\"preset main\" \"footer footer\"}.main-form{inline-size:348px;grid-area:main}.advanced-form{block-size:392px}.preset-select{display:flex;inline-size:200px;flex-direction:column;grid-area:preset}ul{flex:1 1 0;padding-inline-start:0;list-style:none}.preset-item{cursor:pointer;line-height:1.143}.preset-item:hover{background:var(--element-base-1-hover)}label{display:inline-flex;align-items:center}.form-check-input{inset-block-start:0}.element-zoom{rotate:45deg}.footer{grid-area:footer}\n"], dependencies: [{ kind: "directive", type: CdkOption, selector: "[cdkOption]", inputs: ["id", "cdkOption", "cdkOptionTypeaheadLabel", "cdkOptionDisabled", "tabindex"], exportAs: ["cdkOption"] }, { kind: "directive", type: CdkListbox, selector: "[cdkListbox]", inputs: ["id", "tabindex", "cdkListboxValue", "cdkListboxMultiple", "cdkListboxDisabled", "cdkListboxUseActiveDescendant", "cdkListboxOrientation", "cdkListboxCompareWith", "cdkListboxNavigationWrapDisabled", "cdkListboxNavigatesDisabledOptions"], outputs: ["cdkListboxValueChange"], exportAs: ["cdkListbox"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: PresetMatchFilterPipe, name: "presetMatchFilter" }, { kind: "component", type: SiCalendarButtonComponent, selector: "si-calendar-button", inputs: ["ariaLabel"] }, { kind: "component", type: SiDatepickerComponent, selector: "si-datepicker", inputs: ["focusedDate", "date", "dateRange", "dateRangeRole", "initialFocus", "disabledTime", "config", "previousLabel", "nextLabel", "calenderWeekLabel", "time12h", "rangeType", "minMonth", "maxMonth", "hideTimeToggle", "hideCalendar", "timepickerLabel", "activeHover"], outputs: ["focusedDateChange", "dateChange", "dateRangeChange", "disabledTimeChange", "configChange", "rangeTypeChange", "activeHoverChange"] }, { kind: "directive", type: SiDatepickerDirective, selector: "[siDatepicker]", inputs: ["autoClose", "triggeringInput"], exportAs: ["siDatepicker"] }, { kind: "component", type: SiRelativeDateComponent, selector: "si-relative-date", inputs: ["value", "enableTimeSelection", "valueLabel", "unitLabel"], outputs: ["valueChange"] }, { kind: "component", type: SiSearchBarComponent, selector: "si-search-bar", inputs: ["debounceTime", "prohibitedCharacters", "placeholder", "showIcon", "tabbable", "value", "readonly", "colorVariant", "disabled"], outputs: ["searchChange"] }, { kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i2.SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
603
+ }
604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterComponent, decorators: [{
605
+ type: Component,
606
+ args: [{ selector: 'si-date-range-filter', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
607
+ CdkOption,
608
+ CdkListbox,
609
+ DatePipe,
610
+ FormsModule,
611
+ NgTemplateOutlet,
612
+ PresetMatchFilterPipe,
613
+ SiCalendarButtonComponent,
614
+ SiDatepickerComponent,
615
+ SiDatepickerDirective,
616
+ SiRelativeDateComponent,
617
+ SiSearchBarComponent,
618
+ SiTranslateModule
619
+ ], template: "@if (presetList()?.length) {\n <div class=\"preset-select border-end\">\n @if (presetSearch()) {\n <si-search-bar\n colorVariant=\"base-0\"\n class=\"mx-6 mt-5 mb-6\"\n [placeholder]=\"searchLabel() | translate\"\n [showIcon]=\"true\"\n [(ngModel)]=\"presetFilter\"\n />\n }\n <ul class=\"overflow-auto\" cdkListbox [attr.aria-label]=\"presetLabel() | translate\">\n @for (item of filteredPresetList(); track $index) {\n @if (item.label | translate | presetMatchFilter: presetFilter()) {\n <li\n class=\"preset-item focus-inside px-8 py-5\"\n [cdkOption]=\"item.label\"\n (click)=\"selectPresetItem(item)\"\n (keydown.enter)=\"selectPresetItem(item)\"\n >\n {{ item.label | translate }}\n </li>\n }\n }\n </ul>\n </div>\n}\n<form class=\"main-form d-flex flex-column flex-fill\">\n @if (advancedMode || inputMode()) {\n <div class=\"advanced-form px-6 py-4\">\n @if (!reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n\n <div class=\"mb-8\">\n @if (point2Mode === 'date') {\n <ng-container *ngTemplateOutlet=\"formPoint2Date\" />\n }\n @if (point2Mode === 'duration') {\n <ng-container *ngTemplateOutlet=\"formPoint2Duration\" />\n }\n </div>\n\n @if (reverseInputFields()) {\n <ng-container *ngTemplateOutlet=\"formReferencePoint\" />\n }\n </div>\n } @else {\n <si-datepicker\n [config]=\"dateRangeConfig()\"\n [focusedDate]=\"dateRange.end ?? dateRange.start\"\n [(dateRange)]=\"dateRange\"\n (dateRangeChange)=\"updateFromDateRange()\"\n />\n }\n\n @if (advancedMode || !hideAdvancedMode()) {\n <label class=\"form-switch form-check ms-6\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"advancedMode\"\n role=\"switch\"\n [(ngModel)]=\"advancedMode\"\n (ngModelChange)=\"updateOnModeChange()\"\n />\n <span class=\"form-check-label\">{{ advancedLabel() | translate }}</span>\n </label>\n }\n\n <div class=\"mt-4 mb-6 ms-6\">\n {{ previewLabel() | translate }}:\n <span class=\"preview\">\n @if (calculatedRange().valid) {\n {{ calculatedRange().start | date: pipeFormat() }} -\n {{ calculatedRange().end | date: pipeFormat() }}\n } @else {\n ?\n }\n </span>\n </div>\n</form>\n\n@if (showApplyButton()) {\n <div class=\"footer border-top px-6 py-5 d-flex\">\n <button type=\"button\" class=\"btn btn-primary ms-auto\" (click)=\"applyClicked.emit()\">\n {{ applyLabel() | translate }}\n </button>\n </div>\n}\n\n<ng-template #formReferencePoint>\n <div class=\"mb-8\">\n <label class=\"d-block\">\n <span class=\"form-label\">{{\n (advancedMode ? refLabel() : reverseInputFields() ? toLabel() : fromLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point1\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [disabled]=\"point1Now\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point1date\"\n (ngModelChange)=\"point1Changed()\"\n />\n </si-calendar-button>\n </label>\n <label class=\"ms-4 mt-4 text-nowrap form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n name=\"point1now\"\n [(ngModel)]=\"point1Now\"\n (ngModelChange)=\"point1Changed()\"\n />\n <span class=\"form-check-label\">{{\n (enableTimeSelection() ? nowLabel() : todayLabel()) | translate\n }}</span>\n </label>\n </div>\n</ng-template>\n\n<ng-template #formPoint2Date>\n <label class=\"d-block mb-4 bp-9\">\n <span class=\"form-label\">{{\n (reverseInputFields() ? fromLabel() : toLabel()) | translate\n }}</span>\n <si-calendar-button class=\"w-100\">\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"point2\"\n required\n siDatepicker\n [siDatepickerConfig]=\"datepickerConfigInternal()\"\n [attr.aria-label]=\"dateLabel() | translate\"\n [placeholder]=\"datePlaceholder() | translate\"\n [(ngModel)]=\"point2date\"\n (ngModelChange)=\"point2Changed()\"\n />\n </si-calendar-button>\n </label>\n</ng-template>\n\n<ng-template #formPoint2Duration>\n <div>\n <span class=\"form-label\">{{ rangeLabel() | translate }}</span>\n <si-relative-date\n class=\"d-block mb-4\"\n [unitLabel]=\"unitLabel() | translate\"\n [valueLabel]=\"valueLabel() | translate\"\n [enableTimeSelection]=\"enableTimeSelection()\"\n [(value)]=\"point2offset\"\n (valueChange)=\"point2Changed()\"\n />\n <div class=\"range-type ms-4\">\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"before\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ beforeLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"after\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ afterLabel() | translate }}\n </span>\n </label>\n <label class=\"form-check form-check-inline\">\n <input\n type=\"radio\"\n class=\"form-check-input\"\n value=\"within\"\n name=\"point2range\"\n [(ngModel)]=\"point2range\"\n (ngModelChange)=\"point2Changed()\"\n />\n <span class=\"form-check-label\">\n {{ withinLabel() | translate }}\n </span>\n </label>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:inline-grid;background:var(--element-base-1);grid-template-areas:\"preset main\" \"footer footer\"}.main-form{inline-size:348px;grid-area:main}.advanced-form{block-size:392px}.preset-select{display:flex;inline-size:200px;flex-direction:column;grid-area:preset}ul{flex:1 1 0;padding-inline-start:0;list-style:none}.preset-item{cursor:pointer;line-height:1.143}.preset-item:hover{background:var(--element-base-1-hover)}label{display:inline-flex;align-items:center}.form-check-input{inset-block-start:0}.element-zoom{rotate:45deg}.footer{grid-area:footer}\n"] }]
620
+ }] });
621
+
622
+ /**
623
+ * Copyright Siemens 2016 - 2025.
624
+ * SPDX-License-Identifier: MIT
625
+ */
626
+ class SiDateRangeFilterModule {
627
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
628
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, imports: [SiDateRangeFilterComponent], exports: [SiDateRangeFilterComponent] });
629
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, imports: [SiDateRangeFilterComponent] });
630
+ }
631
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDateRangeFilterModule, decorators: [{
632
+ type: NgModule,
633
+ args: [{
634
+ imports: [SiDateRangeFilterComponent],
635
+ exports: [SiDateRangeFilterComponent]
636
+ }]
637
+ }] });
638
+
639
+ /**
640
+ * Copyright Siemens 2016 - 2025.
641
+ * SPDX-License-Identifier: MIT
642
+ */
643
+
644
+ /**
645
+ * Generated bundle index. Do not edit.
646
+ */
647
+
648
+ export { ONE_DAY, ONE_MINUTE, PresetMatchFilterPipe, SiDateRangeCalculationService, SiDateRangeFilterComponent, SiDateRangeFilterModule };
649
+ //# sourceMappingURL=siemens-element-ng-date-range-filter.mjs.map