@yuuvis/material 2.1.14 → 2.1.15

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.
@@ -1,17 +1,24 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Inject, Injectable, inject, makeEnvironmentProviders, input, booleanAttribute, ElementRef, EnvironmentInjector, ApplicationRef, effect, createComponent, Directive } from '@angular/core';
3
- import { MatIconRegistry } from '@angular/material/icon';
4
- import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
2
+ import { Inject, Injectable, inject, makeEnvironmentProviders, input, booleanAttribute, ElementRef, EnvironmentInjector, ApplicationRef, effect, createComponent, Directive, signal, DestroyRef, viewChild, untracked, Input, HostBinding, HostListener, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { MatIconRegistry, MatIcon } from '@angular/material/icon';
4
+ import { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormField, MatFormFieldControl } from '@angular/material/form-field';
5
5
  import { MAT_TOOLTIP_DEFAULT_OPTIONS } from '@angular/material/tooltip';
6
6
  import * as i1 from '@angular/common/http';
7
7
  import * as i2 from '@angular/platform-browser';
8
- import { DOCUMENT } from '@angular/common';
8
+ import { DOCUMENT, CommonModule } from '@angular/common';
9
9
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
10
10
  import { MatPaginatorIntl } from '@angular/material/paginator';
11
11
  import { TranslateService } from '@ngx-translate/core';
12
12
  import { MAT_TABS_CONFIG } from '@angular/material/tabs';
13
- import { MAT_RIPPLE_GLOBAL_OPTIONS } from '@angular/material/core';
13
+ import { MAT_NATIVE_DATE_FORMATS, DateAdapter, MAT_DATE_FORMATS, NativeDateAdapter, MAT_DATE_LOCALE, MAT_RIPPLE_GLOBAL_OPTIONS, NativeDateModule } from '@angular/material/core';
14
+ import { MatDatepickerIntl, MatDatepicker, MatDatepickerInput, MatDateRangeInput, MatDateRangePicker, MatEndDate, MatStartDate } from '@angular/material/datepicker';
15
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
16
  import { MatIconButton, MatButton } from '@angular/material/button';
17
+ import { MatInput } from '@angular/material/input';
18
+ import * as i1$1 from '@angular/forms';
19
+ import { NgControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
20
+ import { Subject } from 'rxjs';
21
+ import { MatTimepicker, MatTimepickerInput } from '@angular/material/timepicker';
15
22
 
16
23
  class YmtMatIconRegistryService extends MatIconRegistry {
17
24
  #ymtFontSetClassNames = ['material-symbols-sharp'];
@@ -85,8 +92,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImpo
85
92
  type: Injectable
86
93
  }] });
87
94
 
95
+ class YmtDatepickerIntlService extends MatDatepickerIntl {
96
+ #translate = inject(TranslateService);
97
+ constructor() {
98
+ super();
99
+ this.translateLabels();
100
+ this.#translate.onLangChange.pipe(takeUntilDestroyed()).subscribe(() => {
101
+ this.translateLabels();
102
+ });
103
+ }
104
+ translateLabels() {
105
+ this.openCalendarLabel = this.#translate.instant('ymt.datepicker.openCalendarLabel');
106
+ this.closeCalendarLabel = this.#translate.instant('ymt.datepicker.closeCalendarLabel');
107
+ this.calendarLabel = this.#translate.instant('ymt.datepicker.calendarLabel');
108
+ this.comparisonDateLabel = this.#translate.instant('ymt.datepicker.comparisonDateLabel');
109
+ this.prevMonthLabel = this.#translate.instant('ymt.datepicker.prevMonthLabel');
110
+ this.nextMonthLabel = this.#translate.instant('ymt.datepicker.nextMonthLabel');
111
+ this.prevYearLabel = this.#translate.instant('ymt.datepicker.prevYearLabel');
112
+ this.nextYearLabel = this.#translate.instant('ymt.datepicker.nextYearLabel');
113
+ this.prevMultiYearLabel = this.#translate.instant('ymt.datepicker.prevMultiYearLabel');
114
+ this.nextMultiYearLabel = this.#translate.instant('ymt.datepicker.nextMultiYearLabel');
115
+ this.switchToMonthViewLabel = this.#translate.instant('ymt.datepicker.switchToMonthViewLabel');
116
+ this.switchToMultiYearViewLabel = this.#translate.instant('ymt.datepicker.switchToMultiYearViewLabel');
117
+ this.startDateLabel = this.#translate.instant('ymt.datepicker.startDateLabel');
118
+ this.endDateLabel = this.#translate.instant('ymt.datepicker.endDateLabel');
119
+ this.changes.next();
120
+ }
121
+ formatYearRange(start, end) {
122
+ return super.formatYearRange(start, end);
123
+ }
124
+ formatYearRangeLabel(start, end) {
125
+ return super.formatYearRangeLabel(start, end);
126
+ }
127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: YmtDatepickerIntlService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
128
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: YmtDatepickerIntlService, providedIn: 'root' });
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: YmtDatepickerIntlService, decorators: [{
131
+ type: Injectable,
132
+ args: [{ providedIn: 'root' }]
133
+ }], ctorParameters: () => [] });
134
+
135
+ const YMT_DATE_FROMATS = {
136
+ ...MAT_NATIVE_DATE_FORMATS,
137
+ parse: {
138
+ dateInput: null,
139
+ timeInput: null,
140
+ },
141
+ };
142
+ function provideYmtDateAdapter(formats = YMT_DATE_FROMATS) {
143
+ return [
144
+ { provide: DateAdapter, useClass: YmtDateAdapterService },
145
+ { provide: MAT_DATE_FORMATS, useValue: formats },
146
+ ];
147
+ }
148
+ class YmtDateAdapterService extends NativeDateAdapter {
149
+ // localeFormat: string;
150
+ #translateService = inject(TranslateService);
151
+ locale;
152
+ constructor() {
153
+ super();
154
+ this.locale = this.#translateService.currentLang;
155
+ // this.localeFormat = Intl.getCanonicalLocales(this.locale);
156
+ this.localeChanges.pipe(takeUntilDestroyed()).subscribe(() => {
157
+ console.log('DateAdapter.locale: ', this.locale);
158
+ console.log('DateAdapter.Int.DateTimeFormat.resolvedOptions: ', Intl.DateTimeFormat(this.locale).resolvedOptions());
159
+ });
160
+ }
161
+ parse(value, parseFormat = '') {
162
+ // categories: { separators: ['.','/','-'], order: ['mdy','dmy','ymd'] }
163
+ let date = null;
164
+ console.log('Ok parse...');
165
+ if (typeof value === 'string') {
166
+ switch (this.locale) {
167
+ case 'en':
168
+ date = this.parseDateString(value, { separator: '/', order: 'mdy' });
169
+ break;
170
+ case 'de':
171
+ date = this.parseDateString(value, { separator: '.', order: 'dmy' });
172
+ break;
173
+ case 'fi':
174
+ date = this.parseDateString(value, { separator: '.', order: 'dmy' });
175
+ break;
176
+ }
177
+ }
178
+ return super.parse(date, parseFormat);
179
+ }
180
+ parseDateString(value, config) {
181
+ const { separator, order } = config;
182
+ const dateStrArr = value.split(separator); // DD.MM.YYYY => { separator: '.', order: 'dmy' }
183
+ const day = Number(dateStrArr[order.indexOf('d')]);
184
+ const month = Number(dateStrArr[order.indexOf('m')]) - 1;
185
+ const year = Number(dateStrArr[order.indexOf('y')]);
186
+ const date = new Date(year, month, day);
187
+ const debugObject = {
188
+ config: { separator, order },
189
+ dateStrArr,
190
+ day,
191
+ month,
192
+ year,
193
+ date,
194
+ };
195
+ console.log('parseDateString(): ', debugObject);
196
+ return date;
197
+ }
198
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: YmtDateAdapterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
199
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: YmtDateAdapterService });
200
+ }
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: YmtDateAdapterService, decorators: [{
202
+ type: Injectable
203
+ }], ctorParameters: () => [] });
204
+
88
205
  const provideYmtMaterial = () => {
89
206
  const providers = [
207
+ /**
208
+ * Material Date Locale Default
209
+ */
210
+ { provide: MAT_DATE_LOCALE, useFactory: (translate) => translate.defaultLang, deps: [TranslateService] },
211
+ { provide: MAT_DATE_FORMATS, useValue: YMT_DATE_FROMATS },
212
+ /**
213
+ * Material Datepicker Internationalization Service Override
214
+ */
215
+ /*{
216
+ provide: MatDatepickerIntl,
217
+ useClass: YmtDatepickerIntlService,
218
+ deps: [TranslateService],
219
+ },*/
220
+ /*{
221
+ provide: MatDatepickerIntl,
222
+ deps: [[new Optional(), new SkipSelf(), MatDatepickerIntl]],
223
+ useFactory: (parentIntl: MatDatepickerIntl)=> {
224
+ return parentIntl || new YmtDatepickerIntlService();
225
+ },
226
+ },*/
227
+ /**
228
+ * Material Date Adapter
229
+ */
230
+ // provideYmtDateAdapter(),
90
231
  /**
91
232
  * Material Icon Registry Service Override
92
233
  */
@@ -305,11 +446,404 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImpo
305
446
  }]
306
447
  }], ctorParameters: () => [] });
307
448
 
308
- var index = {};
449
+ var EnumDatepickerMode;
450
+ (function (EnumDatepickerMode) {
451
+ EnumDatepickerMode["DATE"] = "DATE";
452
+ // MULTI_DATE = 'MULTI_DATE', // not implemented yet!
453
+ EnumDatepickerMode["DATE_RANGE"] = "DATE_RANGE";
454
+ EnumDatepickerMode["TIME"] = "TIME";
455
+ })(EnumDatepickerMode || (EnumDatepickerMode = {}));
456
+ class DatepickerComponent {
457
+ // Todo: Refactoring: Write BaseMatFormFieldControlComponent class for further custom controls in @yuuvis/material
458
+ // Done: Internationalization
459
+ // Done: Implement Datepicker features and options:
460
+ // // [X] max
461
+ // // [X] min
462
+ // Done: MatFormFieldControl implementation:
463
+ // // [x]handling errorState: https://material.angular.dev/components/input/overview#changing-when-error-messages-are-shown
464
+ // // [x]handling focus
465
+ // // [x]handling setDescribedByIds(ids: string[]): void
466
+ // // [x] set aria-labeledby
467
+ // // [x] set disabled
468
+ // Todo: Refactoring: Better solution for handling value changes from input-element to model (kill ngModelOptions on inputs)
469
+ // Todo: Better solution for DATE_RANGE-mode: content projection for input[matStartDate/matEndDate]
470
+ // Done: Check aria-describedby logic of MatFormField to implement the correct setting
471
+ // Done: Trigger"stateChanges" in effect function
472
+ // Done: set errorState when input value is invalid
473
+ // Done: Check how to destroy the component and complete stateChanges Observable
474
+ // Done: Check how to get the ngControl instance of this component (optionally set)
475
+ #translate = inject(TranslateService);
476
+ #dateAdapter = inject(DateAdapter);
477
+ #locale = signal(inject(MAT_DATE_LOCALE));
478
+ #injectNgControl = (ngC = inject(NgControl, { self: true, optional: true })) => ngC ? (ngC.valueAccessor = this) && ngC : null;
479
+ #destroyRef = inject(DestroyRef);
480
+ #formField = inject(MatFormField, { optional: true });
481
+ // implemented as part of MatFormFieldControl interface
482
+ ngControl = this.#injectNgControl();
483
+ stateChanges = new Subject();
484
+ onFocusIn() {
485
+ this.focused = true;
486
+ }
487
+ onFocusout() {
488
+ this.focused = false;
489
+ this.propagateTouched();
490
+ }
491
+ #value = signal(null);
492
+ set value(v) {
493
+ let _value = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(v));
494
+ const _previousValue = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(this.ngControl?.value));
495
+ if (_value && _previousValue) {
496
+ if (this.mode === EnumDatepickerMode.TIME) {
497
+ _value = new Date(_previousValue.setHours(_value.getHours(), _value.getMinutes()));
498
+ }
499
+ else if (this.mode === EnumDatepickerMode.DATE) {
500
+ _value = new Date(_value.setHours(_previousValue.getHours(), _previousValue.getMinutes()));
501
+ }
502
+ }
503
+ else {
504
+ _value = v;
505
+ }
506
+ this.#value.set(_value);
507
+ this.#empty.set(!_value);
508
+ this.propagateChange(this.value);
509
+ }
510
+ get value() { return this.#value(); }
511
+ #disabled = signal(false);
512
+ set disabled(v) {
513
+ this.#disabled.set(coerceBooleanProperty(v));
514
+ this.timepickerInput()?.setDisabledState(this.#disabled());
515
+ }
516
+ get disabled() { return this.#disabled(); }
517
+ #id = signal('');
518
+ set id(v) { this.#id.set(v); }
519
+ get id() { return this.#id(); }
520
+ #placeholder = signal('');
521
+ set placeholder(v) { this.#placeholder.set(v); }
522
+ get placeholder() { return this.#placeholder(); }
523
+ #required = signal(false);
524
+ set required(v) { this.#required.set(coerceBooleanProperty(v)); }
525
+ get required() { return this.#required(); }
526
+ #userAriaDescribedBy = signal('');
527
+ set userAriaDescribedBy(v) { this.#userAriaDescribedBy.set(v); }
528
+ get userAriaDescribedBy() { return this.#userAriaDescribedBy(); }
529
+ #empty = signal(false);
530
+ set empty(v) { this.#empty.set(v); }
531
+ get empty() { return this.#empty(); }
532
+ #errorState = signal(false);
533
+ set errorState(v) { this.#errorState.set(v); }
534
+ get errorState() { return this.#errorState(); }
535
+ #focused = signal(false);
536
+ set focused(v) { this.#focused.set(v); }
537
+ get focused() { return this.#focused(); }
538
+ // implemented as part of MatFormFieldControl interface
539
+ get shouldLabelFloat() { return this.focused || !this.empty; }
540
+ autofilled;
541
+ controlType = 'datepicker';
542
+ disableAutomaticLabeling = false;
543
+ datepickerMode = EnumDatepickerMode;
544
+ datepicker = viewChild('datepicker', { read: (MatDatepicker) });
545
+ rangepicker = viewChild('rangepicker');
546
+ timepicker = viewChild('timepicker', { read: (MatTimepicker) });
547
+ datepickerInput = viewChild('datepickerInput');
548
+ timepickerInput = viewChild('timepickerInput');
549
+ #mode = signal(EnumDatepickerMode.DATE);
550
+ set mode(v) { this.#mode.set(v); }
551
+ get mode() { return this.#mode(); }
552
+ #min = signal(null);
553
+ set min(v) {
554
+ const validValue = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(v));
555
+ if (!this.#dateAdapter.sameDate(validValue, this.#min())) {
556
+ this.#min.set(validValue);
557
+ }
558
+ }
559
+ get min() { return this.#min(); }
560
+ #max = signal(null);
561
+ set max(v) {
562
+ const validValue = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(v));
563
+ if (!this.#dateAdapter.sameDate(validValue, this.#max())) {
564
+ this.#max.set(validValue);
565
+ }
566
+ }
567
+ get max() { return this.#max(); }
568
+ #rangePlaceholder = signal({ startDate: 'Start Date', endDate: 'End Date' });
569
+ set rangePlaceholder(v) { this.#rangePlaceholder.set(v); }
570
+ get rangePlaceholder() { return this.#rangePlaceholder(); }
571
+ rangeValue = { start: '', end: '' };
572
+ startDateFormControlName = input('');
573
+ endDateFormControlName = input('');
574
+ formGroup = input();
575
+ constructor() {
576
+ // triggers state changes for the MatFormFieldControl
577
+ effect(() => {
578
+ this.#value();
579
+ this.#placeholder();
580
+ this.#rangePlaceholder(); // Todo: Check if it needs to trigger "stateChanges"!
581
+ this.#disabled();
582
+ this.#id();
583
+ this.#focused();
584
+ this.#empty();
585
+ this.#required();
586
+ this.#errorState();
587
+ this.#locale();
588
+ this.#mode();
589
+ this.#min();
590
+ this.#max();
591
+ untracked(() => this.stateChanges.next());
592
+ });
593
+ // handle language change
594
+ this.#translate.onLangChange.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((event) => {
595
+ this.#locale.set(event.lang);
596
+ this.#dateAdapter.setLocale(this.#locale());
597
+ });
598
+ effect(() => {
599
+ this.#value();
600
+ untracked(() => console.log('DatepickerComponent.value: ', this.value));
601
+ });
602
+ }
603
+ // implemented as part of ControlValueAccessor interface
604
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
605
+ propagateChange = () => { };
606
+ // implemented as part of ControlValueAccessor interface
607
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
608
+ propagateTouched = () => { };
609
+ // implemented as part of ControlValueAccessor interface
610
+ registerOnChange(fn) {
611
+ this.propagateChange = fn;
612
+ }
613
+ // implemented as part of ControlValueAccessor interface
614
+ registerOnTouched(fn) {
615
+ this.propagateTouched = fn;
616
+ }
617
+ // implemented as part of ControlValueAccessor interface
618
+ writeValue(date) {
619
+ this.value = date;
620
+ }
621
+ // implemented as part of ControlValueAccessor interface
622
+ setDisabledState(isDisabled) {
623
+ this.disabled = isDisabled;
624
+ }
625
+ // implemented as part of MatFormFieldControl interface
626
+ onContainerClick(event) {
627
+ const focusableInput = this.datepickerInput();
628
+ if (focusableInput && !this.focused && !this.disabled) {
629
+ // sets focus to MatFormFieldControls
630
+ focusableInput.onContainerClick(event);
631
+ this.focused = true;
632
+ }
633
+ }
634
+ // implemented as part of MatFormFieldControl interface
635
+ setDescribedByIds(ids) {
636
+ this.datepickerInput()?.setDescribedByIds(ids);
637
+ }
638
+ ngAfterViewInit() {
639
+ const _datepickerInput = this.datepickerInput();
640
+ const _formField = this.#formField;
641
+ if (_datepickerInput) {
642
+ // set MatFormFieldControl.id for auto labeling within a MatFormField
643
+ this.id = _datepickerInput.id || this.id;
644
+ // track datepicker input state changes as they are MatFormFieldControl inputs
645
+ _datepickerInput.stateChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {
646
+ // set errorState
647
+ this.errorState = _datepickerInput.errorState;
648
+ // set disabled state
649
+ this.disabled = _datepickerInput.disabled;
650
+ });
651
+ }
652
+ // set the input's aria-describedby attribute to the parent MatFormField._hintLabelIds (="label-1 label-2 ...")
653
+ if (_formField) {
654
+ this.setDescribedByIds([..._formField._hintLabelId.split(' ')]);
655
+ }
656
+ // set errorState for Range-Mode
657
+ this.formGroup()?.statusChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((v) => { this.errorState = (v === 'INVALID'); });
658
+ this.ngControl?.valueChanges?.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((value) => {
659
+ // get the previous value of the associated formFieldControl
660
+ if (!this.value && value)
661
+ this.value = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(value));
662
+ });
663
+ }
664
+ ngOnDestroy() {
665
+ this.stateChanges.complete();
666
+ }
667
+ /* Custom Datepicker Functions */
668
+ open() {
669
+ this.datepicker()?.open();
670
+ this.rangepicker()?.open();
671
+ this.timepicker()?.open();
672
+ }
673
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: DatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
674
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: DatepickerComponent, isStandalone: true, selector: "ymt-datepicker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, userAriaDescribedBy: { classPropertyName: "userAriaDescribedBy", publicName: "userAriaDescribedBy", isSignal: false, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: false, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: false, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: false, isRequired: false, transformFunction: null }, rangePlaceholder: { classPropertyName: "rangePlaceholder", publicName: "rangePlaceholder", isSignal: false, isRequired: false, transformFunction: null }, startDateFormControlName: { classPropertyName: "startDateFormControlName", publicName: "startDateFormControlName", isSignal: true, isRequired: false, transformFunction: null }, endDateFormControlName: { classPropertyName: "endDateFormControlName", publicName: "endDateFormControlName", isSignal: true, isRequired: false, transformFunction: null }, formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "onFocusIn()", "focusout": "onFocusout()" }, properties: { "class.floating": "this.shouldLabelFloat" } }, providers: [
675
+ { provide: MatFormFieldControl, useExisting: DatepickerComponent },
676
+ /*{
677
+ provide: MAT_DATE_FORMATS,
678
+ useValue: {
679
+ ...MAT_NATIVE_DATE_FORMATS,
680
+ display: {
681
+ ...MAT_NATIVE_DATE_FORMATS.display,
682
+ dateInput: {
683
+ ...MAT_NATIVE_DATE_FORMATS.display.dateInput,
684
+ day: 'numeric' as Intl.DateTimeFormatOptions['day'] // has effect
685
+ }
686
+ }
687
+ } as MatDateFormats,
688
+ },*/
689
+ { provide: MatDatepickerIntl, useClass: YmtDatepickerIntlService },
690
+ provideYmtDateAdapter()
691
+ ], viewQueries: [{ propertyName: "datepicker", first: true, predicate: ["datepicker"], descendants: true, read: MatDatepicker, isSignal: true }, { propertyName: "rangepicker", first: true, predicate: ["rangepicker"], descendants: true, isSignal: true }, { propertyName: "timepicker", first: true, predicate: ["timepicker"], descendants: true, read: MatTimepicker, isSignal: true }, { propertyName: "datepickerInput", first: true, predicate: ["datepickerInput"], descendants: true, isSignal: true }, { propertyName: "timepickerInput", first: true, predicate: ["timepickerInput"], descendants: true, isSignal: true }], ngImport: i0, template: "@switch (mode) {\n @case (datepickerMode.DATE) {\n <input\n [placeholder]=\"placeholder\"\n [attr.disabled]=\"disabled\"\n matInput\n [matDatepicker]=\"datepicker\"\n [min]=\"min\"\n [max]=\"max\"\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{updateOn: 'blur'}\"\n #datepickerInput=\"matInput\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n }\n @case (datepickerMode.DATE_RANGE) {\n @let formGroup = this.formGroup();\n @let startDate = this.startDateFormControlName();\n @let endDate = this.endDateFormControlName();\n @if (formGroup && startDate && endDate) {\n <mat-date-range-input\n [rangePicker]=\"rangepicker\"\n [min]=\"min\"\n [max]=\"max\"\n [formGroup]=\"formGroup\"\n #datepickerInput=\"matDateRangeInput\"\n >\n <input matStartDate [placeholder]=\"rangePlaceholder.startDate\" [formControlName]=\"startDate\"/>\n <input matEndDate [placeholder]=\"rangePlaceholder.endDate\" [formControlName]=\"endDate\"/>\n </mat-date-range-input>\n <mat-date-range-picker #rangepicker></mat-date-range-picker>\n } @else {\n <mat-date-range-input\n [rangePicker]=\"rangepicker\"\n [min]=\"min\"\n [max]=\"max\"\n #datepickerInput=\"matDateRangeInput\"\n >\n <input matStartDate [placeholder]=\"rangePlaceholder.startDate\" (dateChange)=\"rangeValue.start = $event.value\"/>\n <input matEndDate [placeholder]=\"rangePlaceholder.endDate\" (dateChange)=\"rangeValue.end = $event.value\"/>\n </mat-date-range-input>\n <mat-date-range-picker #rangepicker></mat-date-range-picker>\n }\n }\n @case (datepickerMode.TIME) {\n <input\n [placeholder]=\"placeholder\"\n [attr.disabled]=\"disabled\"\n matInput\n [matTimepicker]=\"timepicker\"\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{updateOn: 'blur'}\"\n #datepickerInput=\"matInput\"\n #timepickerInput=\"matTimepickerInput\"\n >\n <mat-timepicker #timepicker/>\n }\n @default {\n <input\n type=\"datetime-locale\"\n [placeholder]=\"placeholder\"\n matInput\n [(ngModel)]=\"value\"\n #datepickerInput=\"matInput\"\n />\n }\n}\n\n", styles: [":host{display:flex}:host input{width:100%;border:0;outline:0;background:transparent}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatTimepicker, selector: "mat-timepicker", inputs: ["interval", "options", "disableRipple", "aria-label", "aria-labelledby"], outputs: ["selected", "opened", "closed"], exportAs: ["matTimepicker"] }, { kind: "directive", type: MatTimepickerInput, selector: "input[matTimepicker]", inputs: ["value", "matTimepicker", "matTimepickerMin", "matTimepickerMax", "disabled"], outputs: ["valueChange"], exportAs: ["matTimepickerInput"] }, { kind: "component", type: MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "component", type: MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "ngmodule", type: NativeDateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
692
+ }
693
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: DatepickerComponent, decorators: [{
694
+ type: Component,
695
+ args: [{ selector: 'ymt-datepicker', standalone: true, imports: [CommonModule, MatInput, FormsModule, ReactiveFormsModule, MatDatepicker, MatDatepickerInput, MatTimepicker, MatTimepickerInput, MatDateRangeInput, MatDateRangePicker, MatEndDate, MatStartDate, NativeDateModule], providers: [
696
+ { provide: MatFormFieldControl, useExisting: DatepickerComponent },
697
+ /*{
698
+ provide: MAT_DATE_FORMATS,
699
+ useValue: {
700
+ ...MAT_NATIVE_DATE_FORMATS,
701
+ display: {
702
+ ...MAT_NATIVE_DATE_FORMATS.display,
703
+ dateInput: {
704
+ ...MAT_NATIVE_DATE_FORMATS.display.dateInput,
705
+ day: 'numeric' as Intl.DateTimeFormatOptions['day'] // has effect
706
+ }
707
+ }
708
+ } as MatDateFormats,
709
+ },*/
710
+ { provide: MatDatepickerIntl, useClass: YmtDatepickerIntlService },
711
+ provideYmtDateAdapter()
712
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@switch (mode) {\n @case (datepickerMode.DATE) {\n <input\n [placeholder]=\"placeholder\"\n [attr.disabled]=\"disabled\"\n matInput\n [matDatepicker]=\"datepicker\"\n [min]=\"min\"\n [max]=\"max\"\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{updateOn: 'blur'}\"\n #datepickerInput=\"matInput\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n }\n @case (datepickerMode.DATE_RANGE) {\n @let formGroup = this.formGroup();\n @let startDate = this.startDateFormControlName();\n @let endDate = this.endDateFormControlName();\n @if (formGroup && startDate && endDate) {\n <mat-date-range-input\n [rangePicker]=\"rangepicker\"\n [min]=\"min\"\n [max]=\"max\"\n [formGroup]=\"formGroup\"\n #datepickerInput=\"matDateRangeInput\"\n >\n <input matStartDate [placeholder]=\"rangePlaceholder.startDate\" [formControlName]=\"startDate\"/>\n <input matEndDate [placeholder]=\"rangePlaceholder.endDate\" [formControlName]=\"endDate\"/>\n </mat-date-range-input>\n <mat-date-range-picker #rangepicker></mat-date-range-picker>\n } @else {\n <mat-date-range-input\n [rangePicker]=\"rangepicker\"\n [min]=\"min\"\n [max]=\"max\"\n #datepickerInput=\"matDateRangeInput\"\n >\n <input matStartDate [placeholder]=\"rangePlaceholder.startDate\" (dateChange)=\"rangeValue.start = $event.value\"/>\n <input matEndDate [placeholder]=\"rangePlaceholder.endDate\" (dateChange)=\"rangeValue.end = $event.value\"/>\n </mat-date-range-input>\n <mat-date-range-picker #rangepicker></mat-date-range-picker>\n }\n }\n @case (datepickerMode.TIME) {\n <input\n [placeholder]=\"placeholder\"\n [attr.disabled]=\"disabled\"\n matInput\n [matTimepicker]=\"timepicker\"\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{updateOn: 'blur'}\"\n #datepickerInput=\"matInput\"\n #timepickerInput=\"matTimepickerInput\"\n >\n <mat-timepicker #timepicker/>\n }\n @default {\n <input\n type=\"datetime-locale\"\n [placeholder]=\"placeholder\"\n matInput\n [(ngModel)]=\"value\"\n #datepickerInput=\"matInput\"\n />\n }\n}\n\n", styles: [":host{display:flex}:host input{width:100%;border:0;outline:0;background:transparent}\n"] }]
713
+ }], ctorParameters: () => [], propDecorators: { onFocusIn: [{
714
+ type: HostListener,
715
+ args: ['focusin']
716
+ }], onFocusout: [{
717
+ type: HostListener,
718
+ args: ['focusout']
719
+ }], value: [{
720
+ type: Input
721
+ }], disabled: [{
722
+ type: Input
723
+ }], id: [{
724
+ type: Input
725
+ }], placeholder: [{
726
+ type: Input
727
+ }], required: [{
728
+ type: Input
729
+ }], userAriaDescribedBy: [{
730
+ type: Input
731
+ }], shouldLabelFloat: [{
732
+ type: HostBinding,
733
+ args: ['class.floating']
734
+ }], mode: [{
735
+ type: Input
736
+ }], min: [{
737
+ type: Input
738
+ }], max: [{
739
+ type: Input
740
+ }], rangePlaceholder: [{
741
+ type: Input
742
+ }] } });
743
+
744
+ class DatepickerToggleComponent {
745
+ #intl = inject(MatDatepickerIntl);
746
+ #destroyRef = inject(DestroyRef);
747
+ #datepicker = signal(null);
748
+ set datepicker(v) { this.#datepicker.set(v); }
749
+ get datepicker() { return this.#datepicker(); }
750
+ #disabled = signal(false);
751
+ set disabled(v) { this.#disabled.set(coerceBooleanProperty(v)); }
752
+ get disabled() { return this.#disabled(); }
753
+ #ariaLabel = signal(this.#intl.openCalendarLabel);
754
+ set ariaLabel(v) { this.#ariaLabel.set(v); }
755
+ get ariaLabel() { return this.#ariaLabel(); }
756
+ stateChanges = new Subject();
757
+ constructor() {
758
+ effect(() => {
759
+ this.#datepicker();
760
+ this.#disabled();
761
+ this.#ariaLabel();
762
+ this.stateChanges.next();
763
+ });
764
+ }
765
+ _open(event) {
766
+ if (this.datepicker && !this.disabled) {
767
+ this.datepicker.open();
768
+ event.stopPropagation();
769
+ }
770
+ }
771
+ ngOnInit() {
772
+ const datepicker = this.datepicker;
773
+ if (datepicker) {
774
+ datepicker.stateChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {
775
+ this.ariaLabel = this.#intl.openCalendarLabel;
776
+ if (this.disabled !== datepicker.disabled) {
777
+ this.disabled = datepicker.disabled;
778
+ }
779
+ });
780
+ }
781
+ else {
782
+ throw new Error(`DatepickerComponent is missing on DatepickerToggleComponent's "for"-attribute!`);
783
+ }
784
+ }
785
+ ngOnDestroy() {
786
+ this.stateChanges.complete();
787
+ }
788
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: DatepickerToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
789
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.12", type: DatepickerToggleComponent, isStandalone: true, selector: "ymt-datepicker-toggle", inputs: { datepicker: ["for", "datepicker"], disabled: "disabled", ariaLabel: "ariaLabel" }, host: { listeners: { "click": "_open($event)" } }, providers: [
790
+ { provide: MatDatepickerIntl, useClass: YmtDatepickerIntlService }
791
+ ], exportAs: ["matDatepickerToggle"], ngImport: i0, template: `
792
+ <button
793
+ type="button"
794
+ ymtIconButton
795
+ [attr.aria-label]="ariaLabel"
796
+ [aria-disabled]="disabled"
797
+ [disabled]="disabled"
798
+ >
799
+ <ng-content select="mat-icon"></ng-content>
800
+ </button>
801
+ `, isInline: true, dependencies: [{ kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
802
+ }
803
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: DatepickerToggleComponent, decorators: [{
804
+ type: Component,
805
+ args: [{
806
+ selector: 'ymt-datepicker-toggle',
807
+ template: `
808
+ <button
809
+ type="button"
810
+ ymtIconButton
811
+ [attr.aria-label]="ariaLabel"
812
+ [aria-disabled]="disabled"
813
+ [disabled]="disabled"
814
+ >
815
+ <ng-content select="mat-icon"></ng-content>
816
+ </button>
817
+ `,
818
+ standalone: true,
819
+ imports: [
820
+ YmtIconButtonDirective,
821
+ MatIcon
822
+ ],
823
+ providers: [
824
+ { provide: MatDatepickerIntl, useClass: YmtDatepickerIntlService }
825
+ ],
826
+ host: {
827
+ // Bind the `click` on the host, rather than the inner `button`, so that we can call
828
+ // `stopPropagation` on it without affecting the user's `click` handlers. We need to stop
829
+ // it so that the input doesn't get focused automatically by the form field (See #21836).
830
+ '(click)': '_open($event)'
831
+ },
832
+ exportAs: 'matDatepickerToggle',
833
+ changeDetection: ChangeDetectionStrategy.OnPush
834
+ }]
835
+ }], ctorParameters: () => [], propDecorators: { datepicker: [{
836
+ type: Input,
837
+ args: [{ alias: 'for', required: true }]
838
+ }], disabled: [{
839
+ type: Input
840
+ }], ariaLabel: [{
841
+ type: Input
842
+ }] } });
309
843
 
310
844
  /**
311
845
  * Generated bundle index. Do not edit.
312
846
  */
313
847
 
314
- export { YMT_BUTTON_SIZE, YMT_ICON_BUTTON_SIZE, YmtButtonDirective, YmtIconButtonDirective, YmtMatIconRegistryService, provideYmtMaterial };
848
+ export { DatepickerComponent, DatepickerToggleComponent, YMT_BUTTON_SIZE, YMT_DATE_FROMATS, YMT_ICON_BUTTON_SIZE, YmtButtonDirective, YmtDateAdapterService, YmtDatepickerIntlService, YmtIconButtonDirective, YmtMatIconRegistryService, provideYmtDateAdapter, provideYmtMaterial };
315
849
  //# sourceMappingURL=yuuvis-material.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-material.mjs","sources":["../../../../../libs/yuuvis/material/src/lib/services/ymt-mat-icon-registry.service.ts","../../../../../libs/yuuvis/material/src/lib/services/ymt-mat-paginator-intl.service.ts","../../../../../libs/yuuvis/material/src/lib/providers/material.providers.ts","../../../../../libs/yuuvis/material/src/lib/directives/icon-button/ymt-icon-button.model.ts","../../../../../libs/yuuvis/material/src/lib/directives/icon-button/ymt-icon-button.directive.ts","../../../../../libs/yuuvis/material/src/lib/directives/button/ymt-button.model.ts","../../../../../libs/yuuvis/material/src/lib/directives/button/ymt-button.directive.ts","../../../../../libs/yuuvis/material/src/lib/components/index.ts","../../../../../libs/yuuvis/material/src/yuuvis-material.ts"],"sourcesContent":["import { ErrorHandler, Inject, Injectable } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { HttpClient } from '@angular/common/http';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { DOCUMENT } from '@angular/common';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class YmtMatIconRegistryService extends MatIconRegistry {\n #ymtFontSetClassNames = ['material-symbols-sharp'];\n\n constructor(_httpClient: HttpClient, _sanitizer: DomSanitizer, @Inject(DOCUMENT) document: any, _errorHandler: ErrorHandler) {\n super(_httpClient, _sanitizer, document, _errorHandler);\n this.setDefaultFontSetClass();\n }\n\n override setDefaultFontSetClass(...classnames: string[]) {\n const merged = [...new Set([...classnames, ...this.#ymtFontSetClassNames])];\n super.setDefaultFontSetClass(...merged);\n return this;\n }\n\n static isFontIcon(input: string | null) {\n if (typeof input === 'string') {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, 'image/svg+xml');\n return coerceBooleanProperty(doc.querySelector('parsererror'));\n }\n return false;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\nimport { TranslateService } from '@ngx-translate/core';\n\n/* Draft */\n@Injectable()\nexport class YmtMatPaginatorIntlService extends MatPaginatorIntl {\n #translate = inject(TranslateService);\n rangeLabelSeparator: string = this.#translate.instant('ymt.paginator.rangeLabelSeparator');\n \n override getRangeLabel = (\n page: number,\n pageSize: number,\n length: number\n ) => {\n if (length === 0 || pageSize === 0) {\n return `0 ${this.rangeLabelSeparator} ${length}`;\n }\n \n length = Math.max(length, 0);\n const startIndex = page * pageSize;\n // If the start index exceeds the list length, do not try and fix the end index to the end.\n const endIndex = startIndex < length ?\n Math.min(startIndex + pageSize, length) :\n startIndex + pageSize;\n return `${startIndex + 1} - ${endIndex} ${this.rangeLabelSeparator} ${length}`;\n };\n \n //=== Proposal =========================================================\n \n injectTranslateService(translate: TranslateService) {\n this.#translate = translate;\n \n this.#translate.onLangChange.subscribe(() => {\n this.translateLabels();\n });\n \n this.translateLabels();\n }\n \n translateLabels() {\n this.itemsPerPageLabel = this.#translate.instant('ymt.paginator.itemsPerPageLabel');\n this.nextPageLabel = this.#translate.instant('ymt.paginator.nextPageLabel');\n this.previousPageLabel = this.#translate.instant('ymt.paginator.previousPageLabel');\n this.firstPageLabel = this.#translate.instant('ymt.paginator.firstPageLabel');\n this.lastPageLabel = this.#translate.instant('ymt.paginator.lastPageLabel');\n this.rangeLabelSeparator = this.#translate.instant('ymt.paginator.rangeLabelSeparator');\n this.changes.next();\n }\n \n //=== Proposal END =====================================================\n}\n","import { EnvironmentProviders, makeEnvironmentProviders, Provider } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldDefaultOptions } from '@angular/material/form-field';\nimport { MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltipDefaultOptions } from '@angular/material/tooltip';\nimport { YmtMatIconRegistryService } from '../services/ymt-mat-icon-registry.service';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\nimport { YmtMatPaginatorIntlService } from '../services/ymt-mat-paginator-intl.service';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MAT_TAB_GROUP, MAT_TABS_CONFIG, MatTabsConfig } from '@angular/material/tabs';\nimport { MAT_RIPPLE_GLOBAL_OPTIONS, RippleGlobalOptions } from '@angular/material/core';\n\nexport const provideYmtMaterial = (): EnvironmentProviders => {\n const providers: Provider[] = [\n /**\n * Material Icon Registry Service Override\n */\n { provide: MatIconRegistry, useClass: YmtMatIconRegistryService },\n\n /**\n * Material Ripple Config\n */\n { provide: MAT_RIPPLE_GLOBAL_OPTIONS, useValue: { disabled: true } as RippleGlobalOptions },\n\n /**\n * Material Paginator Internationalization Service Override\n */\n {\n provide: MatPaginatorIntl,\n useFactory: (translate: TranslateService) => {\n const service = new YmtMatPaginatorIntlService();\n service.injectTranslateService(translate);\n return service;\n },\n deps: [TranslateService]\n },\n /**\n * Material Tooltip Config\n */\n {\n provide: MAT_TOOLTIP_DEFAULT_OPTIONS,\n useValue: {\n showDelay: 500,\n positionAtOrigin: true,\n disableTooltipInteractivity: true,\n } as MatTooltipDefaultOptions\n },\n /**\n * Material Form Field Config\n */\n {\n provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,\n useValue: {\n appearance: 'outline',\n floatLabel: 'always',\n subscriptSizing: 'dynamic',\n } as MatFormFieldDefaultOptions\n },\n /**\n * Material Tab Config\n */\n {\n provide: MAT_TABS_CONFIG,\n useValue: {\n animationDuration: '0',\n stretchTabs: false,\n alignTabs: 'start',\n } as MatTabsConfig\n }\n ];\n return makeEnvironmentProviders(providers);\n};\n","export enum YMT_ICON_BUTTON_SIZE {\n small = 'small',\n medium = 'medium'\n}\n","import {\n ApplicationRef,\n booleanAttribute,\n ComponentRef,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n OnInit\n} from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { YMT_ICON_BUTTON_SIZE } from './ymt-icon-button.model';\n\n@Directive({\n selector: 'button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]',\n standalone: true,\n host: {\n 'mat-icon-button': ''\n }\n})\nexport class YmtIconButtonDirective implements OnInit {\n disabled = input(false, { transform: booleanAttribute });\n disableRipple = input(false, { transform: booleanAttribute });\n ariaDisabled = input(false, { transform: booleanAttribute, alias: 'aria-disabled' });\n disabledInteractive = input(false, { transform: booleanAttribute });\n size = input<'small' | 'medium' | YMT_ICON_BUTTON_SIZE>(YMT_ICON_BUTTON_SIZE.medium, { alias: 'icon-button-size' });\n\n #elRef = inject(ElementRef);\n #host = this.#elRef.nativeElement;\n #injector = inject(EnvironmentInjector);\n #appRef = inject(ApplicationRef);\n #MatIconButtonComponentRef: ComponentRef<MatIconButton> | null = null;\n #materialIconButtonInputs = [\n { name: 'disabled', signal: this.disabled },\n { name: 'disableRipple', signal: this.disableRipple },\n { name: 'aria-disabled', signal: this.ariaDisabled },\n { name: 'disabledInteractive', signal: this.disabledInteractive }\n ];\n\n constructor() {\n effect(() => this.#applySizeClass());\n effect(() => this.#setMaterialInputs());\n }\n\n ngOnInit(): void {\n this.#MatIconButtonComponentRef = this.#createComponent();\n }\n\n #applySizeClass() {\n this.size() === YMT_ICON_BUTTON_SIZE.small ? this.#host.classList.add(`ymt-icon-button--size-s`) : this.#host.classList.remove(`ymt-icon-button--size-s`);\n this.size() === YMT_ICON_BUTTON_SIZE.medium ? this.#host.classList.add(`ymt-icon-button--size-m`) : this.#host.classList.remove(`ymt-icon-button--size-m`);\n }\n\n #setMaterialInputs() {\n this.#materialIconButtonInputs.forEach(({ name, signal }) => this.#MatIconButtonComponentRef?.setInput(name, signal()));\n }\n\n #createComponent() {\n const matIcon = this.#host.querySelector('mat-icon'); //todo support also upcoming yuv-icon\n const environmentInjector = this.#injector;\n const hostElement = this.#host;\n const componentRef = createComponent(MatIconButton, { hostElement, projectableNodes: [[matIcon]], environmentInjector });\n this.#appRef.attachView(componentRef.hostView);\n componentRef.changeDetectorRef.detectChanges();\n return componentRef;\n }\n}\n","export enum YMT_BUTTON_SIZE {\n small = 'small',\n medium = 'medium'\n}\n","import {\n ApplicationRef,\n createComponent,\n Directive,\n ElementRef,\n EnvironmentInjector,\n input,\n OnInit,\n AfterViewInit,\n inject,\n effect,\n ComponentRef,\n booleanAttribute\n} from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport { YMT_BUTTON_SIZE } from './ymt-button.model';\n\ntype ButtonType = keyof typeof MatButtonAttributeEnum;\nenum MatButtonAttributeEnum {\n primary = 'mat-flat-button',\n secondary = 'mat-stroked-button',\n tertiary = 'mat-button'\n}\n\n@Directive({\n selector: 'button[ymtButton], a[ymtButton]',\n standalone: true\n})\nexport class YmtButtonDirective implements OnInit, AfterViewInit {\n ymtButton = input<ButtonType>('primary');\n disabled = input(false, { transform: booleanAttribute });\n ariaDisabled = input(false, { alias: 'aria-disabled', transform: booleanAttribute });\n disableRipple = input(false, { transform: booleanAttribute });\n disabledInteractive = input(false, { transform: booleanAttribute });\n size = input<'small' | 'medium' | YMT_BUTTON_SIZE>(YMT_BUTTON_SIZE.medium, { alias: 'button-size' });\n // Todo: Add input \"isBusy\" as \"busy inactive state\": not clickable and with mat-spinner in button\n\n #environmentInjector = inject(EnvironmentInjector);\n #applicationRef = inject(ApplicationRef);\n #hostElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n #matButtonComponentRef: ComponentRef<MatButton> | null = null;\n\n #iconPrefix: Element[] = [];\n #noneIconNodes: Node[] = [];\n #iconSuffix: Element[] = [];\n\n #matButtonAttribute = MatButtonAttributeEnum;\n\n constructor() {\n effect(() => {\n const disabled = this.disabled();\n const ariaDisabled = this.ariaDisabled();\n const disableRipple = this.disableRipple();\n const disabledInteractive = this.disabledInteractive();\n this.#updateInputs(disabled, ariaDisabled, disableRipple, disabledInteractive);\n });\n\n effect(() => {\n this.#applySizeClass();\n });\n }\n\n ngOnInit() {\n this.#iconPrefix = this.#getIconPrefixElements();\n this.#noneIconNodes = this.#getNoneIconNodes();\n this.#iconSuffix = this.#getIconSuffixElements();\n this.#matButtonComponentRef = this.#createMatButtonComponent();\n }\n\n ngAfterViewInit() {\n this.#updateInputs();\n }\n\n #updateInputs(\n disabled: boolean = this.disabled(),\n ariaDisabled: boolean = this.ariaDisabled(),\n disableRipple: boolean = this.disableRipple(),\n disabledInteractive: boolean = this.disabledInteractive()\n ) {\n this.#matButtonComponentRef?.setInput('disabled', disabled);\n this.#matButtonComponentRef?.setInput('aria-disabled', ariaDisabled);\n this.#matButtonComponentRef?.setInput('disableRipple', disableRipple);\n this.#matButtonComponentRef?.setInput('disabledInteractive', disabledInteractive);\n }\n\n #createMatButtonComponent(\n hostElement: HTMLElement = this.#hostElement,\n environmentInjector: EnvironmentInjector = this.#environmentInjector,\n iconPrefix: Element[] = this.#iconPrefix,\n noneIconNodes: Node[] = this.#noneIconNodes,\n iconSuffix: Element[] = this.#iconSuffix\n ) {\n this.#setInitialAttributesToHost();\n const componentRef = createComponent(MatButton, {\n environmentInjector,\n hostElement,\n projectableNodes: [[...iconPrefix], [...noneIconNodes], [...iconSuffix]]\n });\n this.#applicationRef.attachView(componentRef.hostView);\n componentRef.changeDetectorRef.detectChanges();\n return componentRef;\n }\n\n #setInitialAttributesToHost() {\n this.#hostElement.setAttribute(this.#matButtonAttribute[this.ymtButton()], '');\n }\n\n #getIconPrefixElements() {\n return Array.from(this.#hostElement.querySelectorAll('mat-icon:not([iconPositionEnd])'));\n }\n\n #getIconSuffixElements() {\n return Array.from(this.#hostElement.querySelectorAll('mat-icon[iconPositionEnd]'));\n }\n\n #getNoneIconNodes() {\n const iter = document.createNodeIterator(this.#hostElement, NodeFilter.SHOW_ALL, (node) => {\n return node.nodeName.toLowerCase() !== 'mat-icon' && node.parentElement === this.#hostElement ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n });\n let currentNode: Node | null;\n const filteredNodes: Node[] = [];\n while ((currentNode = iter.nextNode())) {\n filteredNodes.push(currentNode);\n }\n return filteredNodes;\n }\n\n #applySizeClass() {\n this.size() === YMT_BUTTON_SIZE.small ? this.#hostElement.classList.add(`ymt-button--size-s`) : this.#hostElement.classList.remove(`ymt-button--size-s`);\n this.size() === YMT_BUTTON_SIZE.medium ? this.#hostElement.classList.add(`ymt-button--size-m`) : this.#hostElement.classList.remove(`ymt-button--size-m`);\n }\n}\n","export default {};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-material.mjs","sources":["../../../../../libs/yuuvis/material/src/lib/services/ymt-mat-icon-registry.service.ts","../../../../../libs/yuuvis/material/src/lib/services/ymt-mat-paginator-intl.service.ts","../../../../../libs/yuuvis/material/src/lib/services/ymt-datepicker-intl.service.ts","../../../../../libs/yuuvis/material/src/lib/services/ymt-date-adapter.service.ts","../../../../../libs/yuuvis/material/src/lib/providers/material.providers.ts","../../../../../libs/yuuvis/material/src/lib/directives/icon-button/ymt-icon-button.model.ts","../../../../../libs/yuuvis/material/src/lib/directives/icon-button/ymt-icon-button.directive.ts","../../../../../libs/yuuvis/material/src/lib/directives/button/ymt-button.model.ts","../../../../../libs/yuuvis/material/src/lib/directives/button/ymt-button.directive.ts","../../../../../libs/yuuvis/material/src/lib/components/datepicker/datepicker.component.ts","../../../../../libs/yuuvis/material/src/lib/components/datepicker/datepicker.component.html","../../../../../libs/yuuvis/material/src/lib/components/datepicker/datepicker-toggle.component.ts","../../../../../libs/yuuvis/material/src/yuuvis-material.ts"],"sourcesContent":["import { ErrorHandler, Inject, Injectable } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { HttpClient } from '@angular/common/http';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { DOCUMENT } from '@angular/common';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class YmtMatIconRegistryService extends MatIconRegistry {\n #ymtFontSetClassNames = ['material-symbols-sharp'];\n\n constructor(_httpClient: HttpClient, _sanitizer: DomSanitizer, @Inject(DOCUMENT) document: any, _errorHandler: ErrorHandler) {\n super(_httpClient, _sanitizer, document, _errorHandler);\n this.setDefaultFontSetClass();\n }\n\n override setDefaultFontSetClass(...classnames: string[]) {\n const merged = [...new Set([...classnames, ...this.#ymtFontSetClassNames])];\n super.setDefaultFontSetClass(...merged);\n return this;\n }\n\n static isFontIcon(input: string | null) {\n if (typeof input === 'string') {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, 'image/svg+xml');\n return coerceBooleanProperty(doc.querySelector('parsererror'));\n }\n return false;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\nimport { TranslateService } from '@ngx-translate/core';\n\n/* Draft */\n@Injectable()\nexport class YmtMatPaginatorIntlService extends MatPaginatorIntl {\n #translate = inject(TranslateService);\n rangeLabelSeparator: string = this.#translate.instant('ymt.paginator.rangeLabelSeparator');\n \n override getRangeLabel = (\n page: number,\n pageSize: number,\n length: number\n ) => {\n if (length === 0 || pageSize === 0) {\n return `0 ${this.rangeLabelSeparator} ${length}`;\n }\n \n length = Math.max(length, 0);\n const startIndex = page * pageSize;\n // If the start index exceeds the list length, do not try and fix the end index to the end.\n const endIndex = startIndex < length ?\n Math.min(startIndex + pageSize, length) :\n startIndex + pageSize;\n return `${startIndex + 1} - ${endIndex} ${this.rangeLabelSeparator} ${length}`;\n };\n \n //=== Proposal =========================================================\n \n injectTranslateService(translate: TranslateService) {\n this.#translate = translate;\n \n this.#translate.onLangChange.subscribe(() => {\n this.translateLabels();\n });\n \n this.translateLabels();\n }\n \n translateLabels() {\n this.itemsPerPageLabel = this.#translate.instant('ymt.paginator.itemsPerPageLabel');\n this.nextPageLabel = this.#translate.instant('ymt.paginator.nextPageLabel');\n this.previousPageLabel = this.#translate.instant('ymt.paginator.previousPageLabel');\n this.firstPageLabel = this.#translate.instant('ymt.paginator.firstPageLabel');\n this.lastPageLabel = this.#translate.instant('ymt.paginator.lastPageLabel');\n this.rangeLabelSeparator = this.#translate.instant('ymt.paginator.rangeLabelSeparator');\n this.changes.next();\n }\n \n //=== Proposal END =====================================================\n}\n","import { MatDatepickerIntl } from '@angular/material/datepicker';\nimport { TranslateService } from '@ngx-translate/core';\nimport { inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Injectable({ providedIn: 'root' })\nexport class YmtDatepickerIntlService extends MatDatepickerIntl {\n #translate = inject(TranslateService);\n \n constructor() {\n super();\n \n this.translateLabels();\n this.#translate.onLangChange.pipe(takeUntilDestroyed()).subscribe(() => {\n this.translateLabels();\n });\n }\n \n translateLabels() {\n this.openCalendarLabel = this.#translate.instant('ymt.datepicker.openCalendarLabel');\n this.closeCalendarLabel = this.#translate.instant('ymt.datepicker.closeCalendarLabel');\n this.calendarLabel = this.#translate.instant('ymt.datepicker.calendarLabel');\n this.comparisonDateLabel = this.#translate.instant('ymt.datepicker.comparisonDateLabel');\n this.prevMonthLabel = this.#translate.instant('ymt.datepicker.prevMonthLabel');\n this.nextMonthLabel = this.#translate.instant('ymt.datepicker.nextMonthLabel');\n this.prevYearLabel = this.#translate.instant('ymt.datepicker.prevYearLabel');\n this.nextYearLabel = this.#translate.instant('ymt.datepicker.nextYearLabel');\n this.prevMultiYearLabel = this.#translate.instant('ymt.datepicker.prevMultiYearLabel');\n this.nextMultiYearLabel = this.#translate.instant('ymt.datepicker.nextMultiYearLabel');\n this.switchToMonthViewLabel = this.#translate.instant('ymt.datepicker.switchToMonthViewLabel');\n this.switchToMultiYearViewLabel = this.#translate.instant('ymt.datepicker.switchToMultiYearViewLabel');\n this.startDateLabel = this.#translate.instant('ymt.datepicker.startDateLabel');\n this.endDateLabel = this.#translate.instant('ymt.datepicker.endDateLabel');\n this.changes.next();\n }\n \n override formatYearRange(start: string, end: string): string {\n return super.formatYearRange(start, end);\n }\n \n override formatYearRangeLabel(start: string, end: string): string {\n return super.formatYearRangeLabel(start, end);\n }\n}\n","import { inject, Injectable, Provider } from '@angular/core';\nimport {\n DateAdapter,\n MAT_DATE_FORMATS,\n MAT_NATIVE_DATE_FORMATS,\n MatDateFormats,\n NativeDateAdapter\n} from '@angular/material/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport const YMT_DATE_FROMATS: MatDateFormats = {\n ...MAT_NATIVE_DATE_FORMATS,\n parse: {\n dateInput: null,\n timeInput: null,\n },\n};\n\nexport function provideYmtDateAdapter(\n formats: MatDateFormats = YMT_DATE_FROMATS,\n): Provider[] {\n return [\n { provide: DateAdapter, useClass: YmtDateAdapterService },\n { provide: MAT_DATE_FORMATS, useValue: formats },\n ];\n}\n\ninterface IParseFormats {\n separator: '.' | '/' | '-' | string;\n order: 'mdy' | 'dmy' | 'ymd';\n}\n\n@Injectable()\nexport class YmtDateAdapterService extends NativeDateAdapter {\n \n // localeFormat: string;\n #translateService = inject(TranslateService);\n override locale: string;\n \n constructor() {\n super();\n \n this.locale = this.#translateService.currentLang;\n // this.localeFormat = Intl.getCanonicalLocales(this.locale);\n this.localeChanges.pipe(takeUntilDestroyed()).subscribe(() => {\n console.log('DateAdapter.locale: ', this.locale);\n console.log('DateAdapter.Int.DateTimeFormat.resolvedOptions: ', Intl.DateTimeFormat(this.locale).resolvedOptions());\n });\n }\n \n override parse(value: any, parseFormat: any = ''): Date | null {\n // categories: { separators: ['.','/','-'], order: ['mdy','dmy','ymd'] }\n let date: Date | null = null;\n console.log('Ok parse...');\n if (typeof value === 'string') {\n switch (this.locale) {\n case 'en':\n date = this.parseDateString(value, { separator: '/', order: 'mdy' });\n break;\n case 'de':\n date = this.parseDateString(value, { separator: '.', order: 'dmy' });\n break;\n case 'fi':\n date = this.parseDateString(value, { separator: '.', order: 'dmy' });\n break;\n }\n }\n return super.parse(date, parseFormat);\n }\n \n parseDateString(value: string, config: IParseFormats): Date {\n const { separator, order } = config;\n const dateStrArr = value.split(separator); // DD.MM.YYYY => { separator: '.', order: 'dmy' }\n const day = Number(dateStrArr[order.indexOf('d')]);\n const month = Number(dateStrArr[order.indexOf('m')]) - 1;\n const year = Number(dateStrArr[order.indexOf('y')]);\n const date = new Date(year, month, day);\n const debugObject = {\n config: { separator, order },\n dateStrArr,\n day,\n month,\n year,\n date,\n };\n console.log('parseDateString(): ', debugObject);\n return date;\n }\n}\n","import {\n EnvironmentProviders,\n makeEnvironmentProviders,\n Optional,\n Provider,\n SkipSelf\n} from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldDefaultOptions } from '@angular/material/form-field';\nimport { MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltipDefaultOptions } from '@angular/material/tooltip';\nimport { YmtMatIconRegistryService } from '../services/ymt-mat-icon-registry.service';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\nimport { YmtMatPaginatorIntlService } from '../services/ymt-mat-paginator-intl.service';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MAT_TABS_CONFIG, MatTabsConfig } from '@angular/material/tabs';\nimport {\n MAT_DATE_FORMATS,\n MAT_DATE_LOCALE, MAT_NATIVE_DATE_FORMATS,\n MAT_RIPPLE_GLOBAL_OPTIONS,\n provideNativeDateAdapter,\n RippleGlobalOptions\n} from '@angular/material/core';\nimport { MatDatepickerIntl } from '@angular/material/datepicker';\nimport { YmtDatepickerIntlService } from '../services/ymt-datepicker-intl.service';\nimport { provideYmtDateAdapter, YMT_DATE_FROMATS } from '../services';\n\nexport const provideYmtMaterial = (): EnvironmentProviders => {\n const providers: Provider[] = [\n /**\n * Material Date Locale Default\n */\n { provide: MAT_DATE_LOCALE, useFactory: (translate: TranslateService) => translate.defaultLang , deps: [TranslateService] },\n { provide: MAT_DATE_FORMATS, useValue: YMT_DATE_FROMATS },\n \n /**\n * Material Datepicker Internationalization Service Override\n */\n /*{\n provide: MatDatepickerIntl,\n useClass: YmtDatepickerIntlService,\n deps: [TranslateService],\n },*/\n /*{\n provide: MatDatepickerIntl,\n deps: [[new Optional(), new SkipSelf(), MatDatepickerIntl]],\n useFactory: (parentIntl: MatDatepickerIntl)=> {\n return parentIntl || new YmtDatepickerIntlService();\n },\n },*/\n \n /**\n * Material Date Adapter\n */\n // provideYmtDateAdapter(),\n\n /**\n * Material Icon Registry Service Override\n */\n { provide: MatIconRegistry, useClass: YmtMatIconRegistryService },\n\n /**\n * Material Ripple Config\n */\n { provide: MAT_RIPPLE_GLOBAL_OPTIONS, useValue: { disabled: true } as RippleGlobalOptions },\n\n /**\n * Material Paginator Internationalization Service Override\n */\n {\n provide: MatPaginatorIntl,\n useFactory: (translate: TranslateService) => {\n const service = new YmtMatPaginatorIntlService();\n service.injectTranslateService(translate);\n return service;\n },\n deps: [TranslateService]\n },\n \n /**\n * Material Tooltip Config\n */\n {\n provide: MAT_TOOLTIP_DEFAULT_OPTIONS,\n useValue: {\n showDelay: 500,\n positionAtOrigin: true,\n disableTooltipInteractivity: true,\n } as MatTooltipDefaultOptions\n },\n \n /**\n * Material Form Field Config\n */\n {\n provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,\n useValue: {\n appearance: 'outline',\n floatLabel: 'always',\n subscriptSizing: 'dynamic',\n } as MatFormFieldDefaultOptions\n },\n \n /**\n * Material Tab Config\n */\n {\n provide: MAT_TABS_CONFIG,\n useValue: {\n animationDuration: '0',\n stretchTabs: false,\n alignTabs: 'start',\n } as MatTabsConfig\n }\n ];\n return makeEnvironmentProviders(providers);\n};\n","export enum YMT_ICON_BUTTON_SIZE {\n small = 'small',\n medium = 'medium'\n}\n","import {\n ApplicationRef,\n booleanAttribute,\n ComponentRef,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n OnInit\n} from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { YMT_ICON_BUTTON_SIZE } from './ymt-icon-button.model';\n\n@Directive({\n selector: 'button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]',\n standalone: true,\n host: {\n 'mat-icon-button': ''\n }\n})\nexport class YmtIconButtonDirective implements OnInit {\n disabled = input(false, { transform: booleanAttribute });\n disableRipple = input(false, { transform: booleanAttribute });\n ariaDisabled = input(false, { transform: booleanAttribute, alias: 'aria-disabled' });\n disabledInteractive = input(false, { transform: booleanAttribute });\n size = input<'small' | 'medium' | YMT_ICON_BUTTON_SIZE>(YMT_ICON_BUTTON_SIZE.medium, { alias: 'icon-button-size' });\n\n #elRef = inject(ElementRef);\n #host = this.#elRef.nativeElement;\n #injector = inject(EnvironmentInjector);\n #appRef = inject(ApplicationRef);\n #MatIconButtonComponentRef: ComponentRef<MatIconButton> | null = null;\n #materialIconButtonInputs = [\n { name: 'disabled', signal: this.disabled },\n { name: 'disableRipple', signal: this.disableRipple },\n { name: 'aria-disabled', signal: this.ariaDisabled },\n { name: 'disabledInteractive', signal: this.disabledInteractive }\n ];\n\n constructor() {\n effect(() => this.#applySizeClass());\n effect(() => this.#setMaterialInputs());\n }\n\n ngOnInit(): void {\n this.#MatIconButtonComponentRef = this.#createComponent();\n }\n\n #applySizeClass() {\n this.size() === YMT_ICON_BUTTON_SIZE.small ? this.#host.classList.add(`ymt-icon-button--size-s`) : this.#host.classList.remove(`ymt-icon-button--size-s`);\n this.size() === YMT_ICON_BUTTON_SIZE.medium ? this.#host.classList.add(`ymt-icon-button--size-m`) : this.#host.classList.remove(`ymt-icon-button--size-m`);\n }\n\n #setMaterialInputs() {\n this.#materialIconButtonInputs.forEach(({ name, signal }) => this.#MatIconButtonComponentRef?.setInput(name, signal()));\n }\n\n #createComponent() {\n const matIcon = this.#host.querySelector('mat-icon'); //todo support also upcoming yuv-icon\n const environmentInjector = this.#injector;\n const hostElement = this.#host;\n const componentRef = createComponent(MatIconButton, { hostElement, projectableNodes: [[matIcon]], environmentInjector });\n this.#appRef.attachView(componentRef.hostView);\n componentRef.changeDetectorRef.detectChanges();\n return componentRef;\n }\n}\n","export enum YMT_BUTTON_SIZE {\n small = 'small',\n medium = 'medium'\n}\n","import {\n ApplicationRef,\n createComponent,\n Directive,\n ElementRef,\n EnvironmentInjector,\n input,\n OnInit,\n AfterViewInit,\n inject,\n effect,\n ComponentRef,\n booleanAttribute\n} from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport { YMT_BUTTON_SIZE } from './ymt-button.model';\n\ntype ButtonType = keyof typeof MatButtonAttributeEnum;\nenum MatButtonAttributeEnum {\n primary = 'mat-flat-button',\n secondary = 'mat-stroked-button',\n tertiary = 'mat-button'\n}\n\n@Directive({\n selector: 'button[ymtButton], a[ymtButton]',\n standalone: true\n})\nexport class YmtButtonDirective implements OnInit, AfterViewInit {\n ymtButton = input<ButtonType>('primary');\n disabled = input(false, { transform: booleanAttribute });\n ariaDisabled = input(false, { alias: 'aria-disabled', transform: booleanAttribute });\n disableRipple = input(false, { transform: booleanAttribute });\n disabledInteractive = input(false, { transform: booleanAttribute });\n size = input<'small' | 'medium' | YMT_BUTTON_SIZE>(YMT_BUTTON_SIZE.medium, { alias: 'button-size' });\n // Todo: Add input \"isBusy\" as \"busy inactive state\": not clickable and with mat-spinner in button\n\n #environmentInjector = inject(EnvironmentInjector);\n #applicationRef = inject(ApplicationRef);\n #hostElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n #matButtonComponentRef: ComponentRef<MatButton> | null = null;\n\n #iconPrefix: Element[] = [];\n #noneIconNodes: Node[] = [];\n #iconSuffix: Element[] = [];\n\n #matButtonAttribute = MatButtonAttributeEnum;\n\n constructor() {\n effect(() => {\n const disabled = this.disabled();\n const ariaDisabled = this.ariaDisabled();\n const disableRipple = this.disableRipple();\n const disabledInteractive = this.disabledInteractive();\n this.#updateInputs(disabled, ariaDisabled, disableRipple, disabledInteractive);\n });\n\n effect(() => {\n this.#applySizeClass();\n });\n }\n\n ngOnInit() {\n this.#iconPrefix = this.#getIconPrefixElements();\n this.#noneIconNodes = this.#getNoneIconNodes();\n this.#iconSuffix = this.#getIconSuffixElements();\n this.#matButtonComponentRef = this.#createMatButtonComponent();\n }\n\n ngAfterViewInit() {\n this.#updateInputs();\n }\n\n #updateInputs(\n disabled: boolean = this.disabled(),\n ariaDisabled: boolean = this.ariaDisabled(),\n disableRipple: boolean = this.disableRipple(),\n disabledInteractive: boolean = this.disabledInteractive()\n ) {\n this.#matButtonComponentRef?.setInput('disabled', disabled);\n this.#matButtonComponentRef?.setInput('aria-disabled', ariaDisabled);\n this.#matButtonComponentRef?.setInput('disableRipple', disableRipple);\n this.#matButtonComponentRef?.setInput('disabledInteractive', disabledInteractive);\n }\n\n #createMatButtonComponent(\n hostElement: HTMLElement = this.#hostElement,\n environmentInjector: EnvironmentInjector = this.#environmentInjector,\n iconPrefix: Element[] = this.#iconPrefix,\n noneIconNodes: Node[] = this.#noneIconNodes,\n iconSuffix: Element[] = this.#iconSuffix\n ) {\n this.#setInitialAttributesToHost();\n const componentRef = createComponent(MatButton, {\n environmentInjector,\n hostElement,\n projectableNodes: [[...iconPrefix], [...noneIconNodes], [...iconSuffix]]\n });\n this.#applicationRef.attachView(componentRef.hostView);\n componentRef.changeDetectorRef.detectChanges();\n return componentRef;\n }\n\n #setInitialAttributesToHost() {\n this.#hostElement.setAttribute(this.#matButtonAttribute[this.ymtButton()], '');\n }\n\n #getIconPrefixElements() {\n return Array.from(this.#hostElement.querySelectorAll('mat-icon:not([iconPositionEnd])'));\n }\n\n #getIconSuffixElements() {\n return Array.from(this.#hostElement.querySelectorAll('mat-icon[iconPositionEnd]'));\n }\n\n #getNoneIconNodes() {\n const iter = document.createNodeIterator(this.#hostElement, NodeFilter.SHOW_ALL, (node) => {\n return node.nodeName.toLowerCase() !== 'mat-icon' && node.parentElement === this.#hostElement ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n });\n let currentNode: Node | null;\n const filteredNodes: Node[] = [];\n while ((currentNode = iter.nextNode())) {\n filteredNodes.push(currentNode);\n }\n return filteredNodes;\n }\n\n #applySizeClass() {\n this.size() === YMT_BUTTON_SIZE.small ? this.#hostElement.classList.add(`ymt-button--size-s`) : this.#hostElement.classList.remove(`ymt-button--size-s`);\n this.size() === YMT_BUTTON_SIZE.medium ? this.#hostElement.classList.add(`ymt-button--size-m`) : this.#hostElement.classList.remove(`ymt-button--size-m`);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n HostBinding,\n HostListener,\n inject,\n Input,\n input,\n OnDestroy, Renderer2,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatInput } from '@angular/material/input';\nimport {\n AbstractControlDirective,\n ControlValueAccessor, FormControlStatus, FormGroup, FormsModule,\n NgControl,\n ReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormField, MatFormFieldControl } from '@angular/material/form-field';\nimport { TranslateService } from '@ngx-translate/core';\nimport { debounceTime, Subject } from 'rxjs';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n MatDatepicker,\n MatDatepickerInput,\n MatDatepickerIntl,\n MatDateRangeInput,\n MatDateRangePicker,\n MatEndDate,\n MatStartDate\n} from '@angular/material/datepicker';\nimport { MatTimepicker, MatTimepickerInput } from '@angular/material/timepicker';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n DateAdapter,\n MAT_DATE_FORMATS,\n MAT_DATE_LOCALE,\n MAT_NATIVE_DATE_FORMATS,\n MatDateFormats,\n NativeDateModule\n} from '@angular/material/core';\nimport { YmtDatepickerIntlService } from '../../services/ymt-datepicker-intl.service';\nimport { provideYmtDateAdapter, YMT_DATE_FROMATS } from '../../services';\n\ntype DatepickerValue = DatetimeValue;\ntype DatetimeValue = Date | string | null;\ntype MultiDateValue = Set<Date> | null; // not implemented yet!\ntype DateRangeValue = IRangeValue<DatetimeValue> | null; // not implemented yet!\nexport type DatepickerMode = keyof typeof EnumDatepickerMode;\nenum EnumDatepickerMode {\n DATE = 'DATE',\n // MULTI_DATE = 'MULTI_DATE', // not implemented yet!\n DATE_RANGE = 'DATE_RANGE',\n TIME = 'TIME',\n}\ninterface IRangeValue<T = unknown> {\n start: T;\n end: T;\n}\nexport interface DateRangePlaceholder { startDate: string; endDate: string; }\n\n@Component({\n selector: 'ymt-datepicker',\n templateUrl: './datepicker.component.html',\n styleUrl: './datepicker.component.scss',\n standalone: true,\n imports: [CommonModule, MatInput, FormsModule, ReactiveFormsModule, MatDatepicker, MatDatepickerInput, MatTimepicker, MatTimepickerInput, MatDateRangeInput, MatDateRangePicker, MatEndDate, MatStartDate, NativeDateModule],\n providers: [\n { provide: MatFormFieldControl, useExisting: DatepickerComponent },\n /*{\n provide: MAT_DATE_FORMATS,\n useValue: {\n ...MAT_NATIVE_DATE_FORMATS,\n display: {\n ...MAT_NATIVE_DATE_FORMATS.display,\n dateInput: {\n ...MAT_NATIVE_DATE_FORMATS.display.dateInput,\n day: 'numeric' as Intl.DateTimeFormatOptions['day'] // has effect\n }\n }\n } as MatDateFormats,\n },*/\n { provide: MatDatepickerIntl, useClass: YmtDatepickerIntlService },\n provideYmtDateAdapter()\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DatepickerComponent implements MatFormFieldControl<DatepickerValue>, ControlValueAccessor, AfterViewInit, OnDestroy {\n // Todo: Refactoring: Write BaseMatFormFieldControlComponent class for further custom controls in @yuuvis/material\n // Done: Internationalization\n // Done: Implement Datepicker features and options:\n // // [X] max\n // // [X] min\n // Done: MatFormFieldControl implementation:\n // // [x]handling errorState: https://material.angular.dev/components/input/overview#changing-when-error-messages-are-shown\n // // [x]handling focus\n // // [x]handling setDescribedByIds(ids: string[]): void\n // // [x] set aria-labeledby\n // // [x] set disabled\n // Todo: Refactoring: Better solution for handling value changes from input-element to model (kill ngModelOptions on inputs)\n // Todo: Better solution for DATE_RANGE-mode: content projection for input[matStartDate/matEndDate]\n // Done: Check aria-describedby logic of MatFormField to implement the correct setting\n // Done: Trigger\"stateChanges\" in effect function\n // Done: set errorState when input value is invalid\n // Done: Check how to destroy the component and complete stateChanges Observable\n // Done: Check how to get the ngControl instance of this component (optionally set)\n \n #translate = inject(TranslateService);\n #dateAdapter = inject(DateAdapter);\n #locale = signal(inject<unknown>(MAT_DATE_LOCALE));\n #injectNgControl = (ngC = inject(NgControl, { self: true, optional: true })) => ngC ? (ngC.valueAccessor = this) && ngC : null;\n #destroyRef = inject(DestroyRef);\n #formField = inject(MatFormField, {optional: true});\n \n // implemented as part of MatFormFieldControl interface\n ngControl: NgControl | AbstractControlDirective | null = this.#injectNgControl();\n stateChanges = new Subject<void>();\n \n @HostListener('focusin') onFocusIn() {\n this.focused = true;\n }\n @HostListener('focusout') onFocusout() {\n this.focused = false;\n this.propagateTouched();\n }\n \n #value = signal<DatepickerValue>(null);\n @Input()\n set value(v: DatepickerValue) {\n let _value = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(v));\n const _previousValue = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(this.ngControl?.value));\n if (_value && _previousValue) {\n if (this.mode === EnumDatepickerMode.TIME) {\n _value = new Date(_previousValue.setHours(_value.getHours(), _value.getMinutes()));\n } else if (this.mode === EnumDatepickerMode.DATE) {\n _value = new Date(_value.setHours(_previousValue.getHours(), _previousValue.getMinutes()));\n }\n } else {\n _value = v;\n }\n this.#value.set(_value);\n this.#empty.set(!_value);\n this.propagateChange(this.value);\n }\n get value(): DatepickerValue { return this.#value(); }\n \n #disabled = signal<boolean>(false);\n @Input()\n set disabled(v: BooleanInput) {\n this.#disabled.set(coerceBooleanProperty(v));\n this.timepickerInput()?.setDisabledState(this.#disabled());\n }\n get disabled(): boolean { return this.#disabled(); }\n \n #id = signal<string>('');\n @Input()\n set id(v: string) { this.#id.set(v); }\n get id(): string { return this.#id(); }\n \n #placeholder = signal<string>('');\n @Input()\n set placeholder(v: string) { this.#placeholder.set(v); }\n get placeholder(): string { return this.#placeholder(); }\n \n #required = signal<boolean>(false);\n @Input()\n set required(v: BooleanInput) { this.#required.set(coerceBooleanProperty(v)); }\n get required(): boolean { return this.#required(); }\n \n #userAriaDescribedBy = signal<string>('');\n @Input()\n set userAriaDescribedBy(v: string) { this.#userAriaDescribedBy.set(v); }\n get userAriaDescribedBy(): string { return this.#userAriaDescribedBy(); }\n \n #empty = signal<boolean>(false);\n set empty(v: boolean) { this.#empty.set(v); }\n get empty() { return this.#empty(); }\n \n #errorState = signal<boolean>(false);\n set errorState(v: boolean) { this.#errorState.set(v); }\n get errorState() { return this.#errorState(); }\n \n #focused = signal<boolean>(false);\n set focused(v: boolean) { this.#focused.set(v); }\n get focused() { return this.#focused(); }\n \n // implemented as part of MatFormFieldControl interface\n @HostBinding('class.floating')\n get shouldLabelFloat(): boolean { return this.focused || !this.empty; }\n readonly autofilled?: boolean;\n readonly controlType: string = 'datepicker';\n readonly disableAutomaticLabeling: boolean = false;\n \n protected readonly datepickerMode = EnumDatepickerMode;\n protected readonly datepicker = viewChild('datepicker', { read: MatDatepicker<never> });\n protected readonly rangepicker = viewChild<MatDateRangePicker<never>>('rangepicker');\n protected readonly timepicker = viewChild('timepicker', { read: MatTimepicker<never> });\n protected readonly datepickerInput = viewChild<MatFormFieldControl<never>>('datepickerInput');\n protected readonly timepickerInput = viewChild<MatTimepickerInput<never>>('timepickerInput');\n \n #mode = signal<DatepickerMode>(EnumDatepickerMode.DATE);\n @Input()\n set mode(v: DatepickerMode) { this.#mode.set(v); }\n get mode(): DatepickerMode { return this.#mode(); }\n \n #min = signal<DatepickerValue>(null);\n @Input()\n set min(v: DatepickerValue) {\n const validValue = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(v));\n \n if (!this.#dateAdapter.sameDate(validValue, this.#min())) {\n this.#min.set(validValue);\n }\n }\n get min() { return this.#min(); }\n \n #max = signal<DatepickerValue>(null);\n @Input()\n set max(v: DatepickerValue) {\n const validValue = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(v));\n \n if (!this.#dateAdapter.sameDate(validValue, this.#max())) {\n this.#max.set(validValue);\n }\n }\n get max() { return this.#max(); }\n \n #rangePlaceholder = signal<DateRangePlaceholder>({startDate: 'Start Date', endDate: 'End Date'});\n @Input()\n set rangePlaceholder(v: DateRangePlaceholder) { this.#rangePlaceholder.set(v); }\n get rangePlaceholder(): DateRangePlaceholder { return this.#rangePlaceholder(); }\n \n rangeValue = { start: '', end: '' };\n \n startDateFormControlName = input<string>('');\n endDateFormControlName = input<string>('');\n formGroup = input<FormGroup>();\n \n constructor() {\n // triggers state changes for the MatFormFieldControl\n effect(() => {\n this.#value();\n this.#placeholder();\n this.#rangePlaceholder(); // Todo: Check if it needs to trigger \"stateChanges\"!\n this.#disabled();\n this.#id();\n this.#focused();\n this.#empty();\n this.#required();\n this.#errorState();\n this.#locale();\n this.#mode();\n this.#min();\n this.#max();\n untracked(() => this.stateChanges.next());\n });\n \n // handle language change\n this.#translate.onLangChange.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((event) => {\n this.#locale.set(event.lang);\n this.#dateAdapter.setLocale(this.#locale());\n });\n effect(() => {\n this.#value();\n untracked(() => console.log('DatepickerComponent.value: ', this.value));\n });\n }\n \n // implemented as part of ControlValueAccessor interface\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n propagateChange: ((_: any) => void) = () => {};\n // implemented as part of ControlValueAccessor interface\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n propagateTouched: (() => void) = () => {};\n \n // implemented as part of ControlValueAccessor interface\n registerOnChange(fn: any): void {\n this.propagateChange = fn;\n }\n \n // implemented as part of ControlValueAccessor interface\n registerOnTouched(fn: any): void {\n this.propagateTouched = fn;\n }\n \n // implemented as part of ControlValueAccessor interface\n writeValue(date: DatepickerValue): void {\n this.value = date;\n }\n \n // implemented as part of ControlValueAccessor interface\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n \n // implemented as part of MatFormFieldControl interface\n onContainerClick(event: MouseEvent): void {\n const focusableInput = this.datepickerInput();\n if (focusableInput && !this.focused && !this.disabled) {\n // sets focus to MatFormFieldControls\n focusableInput.onContainerClick(event);\n this.focused = true;\n }\n }\n \n // implemented as part of MatFormFieldControl interface\n setDescribedByIds(ids: string[]): void {\n this.datepickerInput()?.setDescribedByIds(ids);\n }\n \n ngAfterViewInit(): void {\n const _datepickerInput = this.datepickerInput();\n const _formField = this.#formField;\n \n if (_datepickerInput) {\n // set MatFormFieldControl.id for auto labeling within a MatFormField\n this.id = _datepickerInput.id || this.id;\n // track datepicker input state changes as they are MatFormFieldControl inputs\n _datepickerInput.stateChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\n // set errorState\n this.errorState = _datepickerInput.errorState;\n // set disabled state\n this.disabled = _datepickerInput.disabled;\n });\n }\n \n // set the input's aria-describedby attribute to the parent MatFormField._hintLabelIds (=\"label-1 label-2 ...\")\n if (_formField) {\n this.setDescribedByIds([..._formField._hintLabelId.split(' ')]);\n }\n \n // set errorState for Range-Mode\n this.formGroup()?.statusChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((v: FormControlStatus) => {this.errorState = (v === 'INVALID');});\n \n this.ngControl?.valueChanges?.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((value) => {\n // get the previous value of the associated formFieldControl\n if (!this.value && value) this.value = this.#dateAdapter.getValidDateOrNull(this.#dateAdapter.deserialize(value));\n });\n }\n \n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n \n /* Custom Datepicker Functions */\n \n open(): void {\n this.datepicker()?.open();\n this.rangepicker()?.open();\n this.timepicker()?.open();\n }\n}\n","@switch (mode) {\n @case (datepickerMode.DATE) {\n <input\n [placeholder]=\"placeholder\"\n [attr.disabled]=\"disabled\"\n matInput\n [matDatepicker]=\"datepicker\"\n [min]=\"min\"\n [max]=\"max\"\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{updateOn: 'blur'}\"\n #datepickerInput=\"matInput\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n }\n @case (datepickerMode.DATE_RANGE) {\n @let formGroup = this.formGroup();\n @let startDate = this.startDateFormControlName();\n @let endDate = this.endDateFormControlName();\n @if (formGroup && startDate && endDate) {\n <mat-date-range-input\n [rangePicker]=\"rangepicker\"\n [min]=\"min\"\n [max]=\"max\"\n [formGroup]=\"formGroup\"\n #datepickerInput=\"matDateRangeInput\"\n >\n <input matStartDate [placeholder]=\"rangePlaceholder.startDate\" [formControlName]=\"startDate\"/>\n <input matEndDate [placeholder]=\"rangePlaceholder.endDate\" [formControlName]=\"endDate\"/>\n </mat-date-range-input>\n <mat-date-range-picker #rangepicker></mat-date-range-picker>\n } @else {\n <mat-date-range-input\n [rangePicker]=\"rangepicker\"\n [min]=\"min\"\n [max]=\"max\"\n #datepickerInput=\"matDateRangeInput\"\n >\n <input matStartDate [placeholder]=\"rangePlaceholder.startDate\" (dateChange)=\"rangeValue.start = $event.value\"/>\n <input matEndDate [placeholder]=\"rangePlaceholder.endDate\" (dateChange)=\"rangeValue.end = $event.value\"/>\n </mat-date-range-input>\n <mat-date-range-picker #rangepicker></mat-date-range-picker>\n }\n }\n @case (datepickerMode.TIME) {\n <input\n [placeholder]=\"placeholder\"\n [attr.disabled]=\"disabled\"\n matInput\n [matTimepicker]=\"timepicker\"\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{updateOn: 'blur'}\"\n #datepickerInput=\"matInput\"\n #timepickerInput=\"matTimepickerInput\"\n >\n <mat-timepicker #timepicker/>\n }\n @default {\n <input\n type=\"datetime-locale\"\n [placeholder]=\"placeholder\"\n matInput\n [(ngModel)]=\"value\"\n #datepickerInput=\"matInput\"\n />\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n inject,\n Input,\n OnDestroy,\n OnInit,\n signal\n} from '@angular/core';\nimport { MatDatepickerIntl } from '@angular/material/datepicker';\nimport { DatepickerComponent } from '../datepicker';\nimport { YmtDatepickerIntlService } from '../../services';\nimport { YmtIconButtonDirective } from '../../directives';\nimport { MatIcon } from '@angular/material/icon';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Subject } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ymt-datepicker-toggle',\n template: `\n <button\n type=\"button\"\n ymtIconButton\n [attr.aria-label]=\"ariaLabel\"\n [aria-disabled]=\"disabled\"\n [disabled]=\"disabled\"\n >\n <ng-content select=\"mat-icon\"></ng-content>\n </button>\n `,\n standalone: true,\n imports: [\n YmtIconButtonDirective,\n MatIcon\n ],\n providers: [\n { provide: MatDatepickerIntl, useClass: YmtDatepickerIntlService}\n ],\n host: {\n // Bind the `click` on the host, rather than the inner `button`, so that we can call\n // `stopPropagation` on it without affecting the user's `click` handlers. We need to stop\n // it so that the input doesn't get focused automatically by the form field (See #21836).\n '(click)': '_open($event)'\n },\n exportAs: 'matDatepickerToggle',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DatepickerToggleComponent implements OnInit, OnDestroy {\n #intl = inject(MatDatepickerIntl);\n #destroyRef = inject(DestroyRef);\n \n #datepicker = signal<DatepickerComponent | null>(null);\n @Input({ alias: 'for', required: true })\n set datepicker(v: DatepickerComponent | null) { this.#datepicker.set(v); }\n get datepicker() { return this.#datepicker(); }\n \n #disabled = signal<boolean>(false);\n @Input()\n set disabled(v: BooleanInput) { this.#disabled.set(coerceBooleanProperty(v)); }\n get disabled(): boolean { return this.#disabled(); }\n \n #ariaLabel = signal(this.#intl.openCalendarLabel);\n @Input()\n set ariaLabel(v: string) { this.#ariaLabel.set(v); }\n get ariaLabel() { return this.#ariaLabel(); }\n \n stateChanges = new Subject<void>();\n \n constructor() {\n effect(() => {\n this.#datepicker();\n this.#disabled();\n this.#ariaLabel();\n this.stateChanges.next();\n });\n }\n \n _open(event: Event): void {\n if (this.datepicker && !this.disabled) {\n this.datepicker.open();\n event.stopPropagation();\n }\n }\n \n ngOnInit(): void {\n const datepicker = this.datepicker;\n if (datepicker) {\n datepicker.stateChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\n this.ariaLabel = this.#intl.openCalendarLabel;\n if (this.disabled !== datepicker.disabled) {\n this.disabled = datepicker.disabled;\n }\n });\n } else {\n throw new Error(`DatepickerComponent is missing on DatepickerToggleComponent's \"for\"-attribute!`);\n }\n }\n \n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
@@ -4,5 +4,20 @@
4
4
  "ymt.paginator.lastPageLabel": "Letzte Seite",
5
5
  "ymt.paginator.nextPageLabel": "Nächste Seite",
6
6
  "ymt.paginator.previousPageLabel": "Vorherige Seite",
7
- "ymt.paginator.rangeLabelSeparator": "von"
8
- }
7
+ "ymt.paginator.rangeLabelSeparator": "von",
8
+
9
+ "ymt.datepicker.openCalendarLabel": "Kalender öffnen",
10
+ "ymt.datepicker.closeCalendarLabel": "Kalender schließen",
11
+ "ymt.datepicker.calendarLabel": "Kalender",
12
+ "ymt.datepicker.comparisonDateLabel": "Vergleichszeitraum",
13
+ "ymt.datepicker.prevMonthLabel": "Vorheriger Monat",
14
+ "ymt.datepicker.nextMonthLabel": "Nächster Monat",
15
+ "ymt.datepicker.prevYearLabel": "Vorheriges Jahr",
16
+ "ymt.datepicker.nextYearLabel": "Nächstes Jahr",
17
+ "ymt.datepicker.prevMultiYearLabel": "Vorherige 24 Jahre",
18
+ "ymt.datepicker.nextMultiYearLabel": "Nächste 24 Jahre",
19
+ "ymt.datepicker.switchToMonthViewLabel": "Datum wählen",
20
+ "ymt.datepicker.switchToMultiYearViewLabel": "Monat und Jahr wählen",
21
+ "ymt.datepicker.startDateLabel": "Start Datum",
22
+ "ymt.datepicker.endDateLabel": "End Datum"
23
+ }
@@ -4,5 +4,20 @@
4
4
  "ymt.paginator.lastPageLabel": "Last page",
5
5
  "ymt.paginator.nextPageLabel": "Next page",
6
6
  "ymt.paginator.previousPageLabel": "Previous page",
7
- "ymt.paginator.rangeLabelSeparator": "of"
8
- }
7
+ "ymt.paginator.rangeLabelSeparator": "of",
8
+
9
+ "ymt.datepicker.openCalendarLabel": "Open calendar",
10
+ "ymt.datepicker.closeCalendarLabel": "Close calendar",
11
+ "ymt.datepicker.calendarLabel": "Calendar",
12
+ "ymt.datepicker.comparisonDateLabel": "Comparison range",
13
+ "ymt.datepicker.prevMonthLabel": "Previous month",
14
+ "ymt.datepicker.nextMonthLabel": "Next month",
15
+ "ymt.datepicker.prevYearLabel": "Previous year",
16
+ "ymt.datepicker.nextYearLabel": "Next year",
17
+ "ymt.datepicker.prevMultiYearLabel": "Previous 24 years",
18
+ "ymt.datepicker.nextMultiYearLabel": "Next 24 years",
19
+ "ymt.datepicker.switchToMonthViewLabel": "Choose date",
20
+ "ymt.datepicker.switchToMultiYearViewLabel": "Choose month and year",
21
+ "ymt.datepicker.startDateLabel": "Start date",
22
+ "ymt.datepicker.endDateLabel": "End date"
23
+ }
@@ -0,0 +1,21 @@
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
+ import { DatepickerComponent } from '../datepicker';
3
+ import { BooleanInput } from '@angular/cdk/coercion';
4
+ import { Subject } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ export declare class DatepickerToggleComponent implements OnInit, OnDestroy {
7
+ #private;
8
+ set datepicker(v: DatepickerComponent | null);
9
+ get datepicker(): DatepickerComponent | null;
10
+ set disabled(v: BooleanInput);
11
+ get disabled(): boolean;
12
+ set ariaLabel(v: string);
13
+ get ariaLabel(): string;
14
+ stateChanges: Subject<void>;
15
+ constructor();
16
+ _open(event: Event): void;
17
+ ngOnInit(): void;
18
+ ngOnDestroy(): void;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerToggleComponent, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatepickerToggleComponent, "ymt-datepicker-toggle", ["matDatepickerToggle"], { "datepicker": { "alias": "for"; "required": true; }; "disabled": { "alias": "disabled"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, {}, never, ["mat-icon"], true, never>;
21
+ }
@@ -0,0 +1,85 @@
1
+ import { AfterViewInit, OnDestroy } from '@angular/core';
2
+ import { AbstractControlDirective, ControlValueAccessor, FormGroup, NgControl } from '@angular/forms';
3
+ import { MatFormFieldControl } from '@angular/material/form-field';
4
+ import { Subject } from 'rxjs';
5
+ import { BooleanInput } from '@angular/cdk/coercion';
6
+ import { MatDatepicker, MatDateRangePicker } from '@angular/material/datepicker';
7
+ import { MatTimepicker, MatTimepickerInput } from '@angular/material/timepicker';
8
+ import * as i0 from "@angular/core";
9
+ type DatepickerValue = DatetimeValue;
10
+ type DatetimeValue = Date | string | null;
11
+ export type DatepickerMode = keyof typeof EnumDatepickerMode;
12
+ declare enum EnumDatepickerMode {
13
+ DATE = "DATE",
14
+ DATE_RANGE = "DATE_RANGE",
15
+ TIME = "TIME"
16
+ }
17
+ export interface DateRangePlaceholder {
18
+ startDate: string;
19
+ endDate: string;
20
+ }
21
+ export declare class DatepickerComponent implements MatFormFieldControl<DatepickerValue>, ControlValueAccessor, AfterViewInit, OnDestroy {
22
+ #private;
23
+ ngControl: NgControl | AbstractControlDirective | null;
24
+ stateChanges: Subject<void>;
25
+ onFocusIn(): void;
26
+ onFocusout(): void;
27
+ set value(v: DatepickerValue);
28
+ get value(): DatepickerValue;
29
+ set disabled(v: BooleanInput);
30
+ get disabled(): boolean;
31
+ set id(v: string);
32
+ get id(): string;
33
+ set placeholder(v: string);
34
+ get placeholder(): string;
35
+ set required(v: BooleanInput);
36
+ get required(): boolean;
37
+ set userAriaDescribedBy(v: string);
38
+ get userAriaDescribedBy(): string;
39
+ set empty(v: boolean);
40
+ get empty(): boolean;
41
+ set errorState(v: boolean);
42
+ get errorState(): boolean;
43
+ set focused(v: boolean);
44
+ get focused(): boolean;
45
+ get shouldLabelFloat(): boolean;
46
+ readonly autofilled?: boolean;
47
+ readonly controlType: string;
48
+ readonly disableAutomaticLabeling: boolean;
49
+ protected readonly datepickerMode: typeof EnumDatepickerMode;
50
+ protected readonly datepicker: import("@angular/core").Signal<MatDatepicker<never> | undefined>;
51
+ protected readonly rangepicker: import("@angular/core").Signal<MatDateRangePicker<never> | undefined>;
52
+ protected readonly timepicker: import("@angular/core").Signal<MatTimepicker<never> | undefined>;
53
+ protected readonly datepickerInput: import("@angular/core").Signal<MatFormFieldControl<never> | undefined>;
54
+ protected readonly timepickerInput: import("@angular/core").Signal<MatTimepickerInput<never> | undefined>;
55
+ set mode(v: DatepickerMode);
56
+ get mode(): DatepickerMode;
57
+ set min(v: DatepickerValue);
58
+ get min(): DatepickerValue;
59
+ set max(v: DatepickerValue);
60
+ get max(): DatepickerValue;
61
+ set rangePlaceholder(v: DateRangePlaceholder);
62
+ get rangePlaceholder(): DateRangePlaceholder;
63
+ rangeValue: {
64
+ start: string;
65
+ end: string;
66
+ };
67
+ startDateFormControlName: import("@angular/core").InputSignal<string>;
68
+ endDateFormControlName: import("@angular/core").InputSignal<string>;
69
+ formGroup: import("@angular/core").InputSignal<FormGroup<any> | undefined>;
70
+ constructor();
71
+ propagateChange: ((_: any) => void);
72
+ propagateTouched: (() => void);
73
+ registerOnChange(fn: any): void;
74
+ registerOnTouched(fn: any): void;
75
+ writeValue(date: DatepickerValue): void;
76
+ setDisabledState(isDisabled: boolean): void;
77
+ onContainerClick(event: MouseEvent): void;
78
+ setDescribedByIds(ids: string[]): void;
79
+ ngAfterViewInit(): void;
80
+ ngOnDestroy(): void;
81
+ open(): void;
82
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerComponent, never>;
83
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatepickerComponent, "ymt-datepicker", never, { "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "id": { "alias": "id"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "userAriaDescribedBy": { "alias": "userAriaDescribedBy"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "rangePlaceholder": { "alias": "rangePlaceholder"; "required": false; }; "startDateFormControlName": { "alias": "startDateFormControlName"; "required": false; "isSignal": true; }; "endDateFormControlName": { "alias": "endDateFormControlName"; "required": false; "isSignal": true; }; "formGroup": { "alias": "formGroup"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
84
+ }
85
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './datepicker.component';
2
+ export * from './datepicker-toggle.component';
@@ -1,2 +1 @@
1
- declare const _default: {};
2
- export default _default;
1
+ export * from './datepicker';
@@ -1 +1,3 @@
1
1
  export * from './ymt-mat-icon-registry.service';
2
+ export * from './ymt-datepicker-intl.service';
3
+ export * from './ymt-date-adapter.service';
@@ -0,0 +1,19 @@
1
+ import { Provider } from '@angular/core';
2
+ import { MatDateFormats, NativeDateAdapter } from '@angular/material/core';
3
+ import * as i0 from "@angular/core";
4
+ export declare const YMT_DATE_FROMATS: MatDateFormats;
5
+ export declare function provideYmtDateAdapter(formats?: MatDateFormats): Provider[];
6
+ interface IParseFormats {
7
+ separator: '.' | '/' | '-' | string;
8
+ order: 'mdy' | 'dmy' | 'ymd';
9
+ }
10
+ export declare class YmtDateAdapterService extends NativeDateAdapter {
11
+ #private;
12
+ locale: string;
13
+ constructor();
14
+ parse(value: any, parseFormat?: any): Date | null;
15
+ parseDateString(value: string, config: IParseFormats): Date;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<YmtDateAdapterService, never>;
17
+ static ɵprov: i0.ɵɵInjectableDeclaration<YmtDateAdapterService>;
18
+ }
19
+ export {};
@@ -0,0 +1,11 @@
1
+ import { MatDatepickerIntl } from '@angular/material/datepicker';
2
+ import * as i0 from "@angular/core";
3
+ export declare class YmtDatepickerIntlService extends MatDatepickerIntl {
4
+ #private;
5
+ constructor();
6
+ translateLabels(): void;
7
+ formatYearRange(start: string, end: string): string;
8
+ formatYearRangeLabel(start: string, end: string): string;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<YmtDatepickerIntlService, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<YmtDatepickerIntlService>;
11
+ }
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@yuuvis/material",
3
- "version": "2.1.14",
3
+ "version": "2.1.15",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.1",
6
6
  "@angular/core": "^19.2.1",
7
7
  "@angular/material": "^19.2.15",
8
- "modern-normalize": "^3.0.1"
8
+ "modern-normalize": "^3.0.1",
9
+ "@ngx-translate/core": "^15.0.0"
9
10
  },
10
11
  "sideEffects": false,
11
12
  "exports": {
@@ -172,6 +172,14 @@
172
172
  )
173
173
  );
174
174
 
175
+ /* Datepicker */
176
+ @include mat.datepicker-overrides (
177
+ (
178
+ calendar-container-background-color: token.$surface,
179
+ )
180
+ );
181
+
182
+
175
183
  /*Select*/
176
184
  @include mat.select-overrides(
177
185
  (