@quadrel-enterprise-ui/framework 20.26.1 → 20.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, Directive, InjectionToken, HostBinding, Input, ViewEncapsulation, Component, Injectable, Injector, HostListener, ChangeDetectionStrategy, ChangeDetectorRef, ViewChild, NgModule, EventEmitter, Output, Renderer2, Pipe, ViewContainerRef, NO_ERRORS_SCHEMA, DestroyRef, SecurityContext, NgZone, ViewChildren, forwardRef, ContentChildren, ContentChild, isDevMode, QueryList, CUSTOM_ELEMENTS_SCHEMA, provideAppInitializer, TemplateRef } from '@angular/core';
2
+ import { inject, ElementRef, Directive, InjectionToken, HostBinding, Input, ViewEncapsulation, Component, Injectable, Injector, HostListener, ChangeDetectionStrategy, ChangeDetectorRef, ViewChild, NgModule, EventEmitter, Output, Renderer2, Pipe, ViewContainerRef, NO_ERRORS_SCHEMA, DestroyRef, SecurityContext, NgZone, ViewChildren, forwardRef, ContentChildren, ContentChild, isDevMode, QueryList, TemplateRef, CUSTOM_ELEMENTS_SCHEMA, provideAppInitializer } from '@angular/core';
3
3
  import { Dialog, DialogRef, DialogModule } from '@angular/cdk/dialog';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule, NgFor, NgIf, NgClass, NgTemplateOutlet, AsyncPipe } from '@angular/common';
6
- import { BehaviorSubject, pairwise, from, switchMap, map as map$1, Subject, throwError, of, ReplaySubject, merge, fromEvent, isObservable, NEVER, Observable, EMPTY, shareReplay, Subscription, distinctUntilChanged as distinctUntilChanged$1, debounce, timer, startWith as startWith$1, debounceTime as debounceTime$1, takeUntil as takeUntil$1, firstValueFrom, combineLatest, concat, take as take$1, delay, tap as tap$1, first, scan, queueScheduler, filter as filter$1, concatMap as concatMap$1, exhaustMap, finalize, forkJoin, delayWhen, combineLatestWith, withLatestFrom as withLatestFrom$1, async } from 'rxjs';
6
+ import { BehaviorSubject, pairwise, from, switchMap, map as map$1, Subject, throwError, of, ReplaySubject, merge, fromEvent, isObservable, NEVER, Observable, EMPTY, shareReplay, Subscription, distinctUntilChanged as distinctUntilChanged$1, debounce, timer, startWith as startWith$1, debounceTime as debounceTime$1, takeUntil as takeUntil$1, firstValueFrom, combineLatest, concat, take as take$1, tap as tap$1, delay, first, scan, queueScheduler, filter as filter$1, concatMap as concatMap$1, exhaustMap, finalize, forkJoin, delayWhen, combineLatestWith, withLatestFrom as withLatestFrom$1, async } from 'rxjs';
7
7
  import { map, takeUntil, take, filter, catchError, debounceTime, startWith, distinctUntilChanged, concatMap, skip, tap, auditTime, withLatestFrom, observeOn, switchMap as switchMap$1, pairwise as pairwise$1, mergeMap, delay as delay$1 } from 'rxjs/operators';
8
8
  import { v4 } from 'uuid';
9
9
  import * as i3 from '@ngx-translate/core';
@@ -2739,6 +2739,7 @@ class QdMockFilterItemDateRangeComponent {
2739
2739
  get dataTestId() {
2740
2740
  return this.testId;
2741
2741
  }
2742
+ open() { }
2742
2743
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdMockFilterItemDateRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2743
2744
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdMockFilterItemDateRangeComponent, isStandalone: false, selector: "qd-filter-item-date-range", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", itemIndex: "itemIndex", timePickerConfig: "timePickerConfig", testId: ["data-test-id", "testId"] }, host: { properties: { "attr.data-test-id": "this.dataTestId" } }, ngImport: i0, template: 'filterId: {{filterId}}, categoryIndex: {{categoryIndex}}, itemIndex: {{itemIndex}}, timePickerConfig: {{timePickerConfig | json}}', isInline: true, dependencies: [{ kind: "pipe", type: i1.JsonPipe, name: "json" }] });
2744
2745
  }
@@ -2891,6 +2892,7 @@ class QdMockFilterService {
2891
2892
  postBodyWithEmptyDefaultSubjects = [];
2892
2893
  categoryByIdSubject = [];
2893
2894
  itemByIdSubject = [];
2895
+ loadingSubject = [];
2894
2896
  initializeFilterState() {
2895
2897
  return;
2896
2898
  }
@@ -2903,6 +2905,8 @@ class QdMockFilterService {
2903
2905
  setFilterSelection = jest.fn();
2904
2906
  updateItem = jest.fn();
2905
2907
  setItemIsActive = jest.fn();
2908
+ clearCategorySelection = jest.fn();
2909
+ setItemsLoading = jest.fn();
2906
2910
  selectFilterDataById$ = jest.fn();
2907
2911
  getQueryString$(filterId) {
2908
2912
  return this.getQueryStringSubject(filterId).asObservable();
@@ -2925,6 +2929,11 @@ class QdMockFilterService {
2925
2929
  getItemById$(filterId) {
2926
2930
  return this.itemByIdSubject[filterId].asObservable();
2927
2931
  }
2932
+ getItemsLoading$(filterId) {
2933
+ if (!this.loadingSubject[filterId])
2934
+ this.loadingSubject[filterId] = new BehaviorSubject(false);
2935
+ return this.loadingSubject[filterId].asObservable();
2936
+ }
2928
2937
  getQueryStringSubject(filterId) {
2929
2938
  if (!this.queryStringSubjects[filterId])
2930
2939
  this.queryStringSubjects[filterId] = new Subject();
@@ -2960,6 +2969,11 @@ class QdMockFilterService {
2960
2969
  this.itemByIdSubject[filterId] = new BehaviorSubject(null);
2961
2970
  this.itemByIdSubject[filterId].next(value);
2962
2971
  }
2972
+ emitLoading(value, filterId) {
2973
+ if (!this.loadingSubject[filterId])
2974
+ this.loadingSubject[filterId] = new BehaviorSubject(false);
2975
+ this.loadingSubject[filterId].next(value);
2976
+ }
2963
2977
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdMockFilterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2964
2978
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdMockFilterService });
2965
2979
  }
@@ -8128,6 +8142,20 @@ class QdPopoverOnClickDirective {
8128
8142
  this.runSizingAndOpen(popover);
8129
8143
  }));
8130
8144
  }
8145
+ /**
8146
+ * Re-aligns an open overlay with its origin element.
8147
+ *
8148
+ * The connected position is only recomputed on scroll/resize, not when a
8149
+ * layout reflow moves the origin (e.g. a chip or action buttons appearing in
8150
+ * the host). Call this after such a reflow to keep the overlay attached to the
8151
+ * host. Deferred by one frame so the new layout is measured, and a no-op while
8152
+ * the overlay is detached, so it stays cheap to call on discrete events.
8153
+ */
8154
+ updatePosition() {
8155
+ if (!this.overlayRef?.hasAttached())
8156
+ return;
8157
+ requestAnimationFrame(() => this.overlayRef.updatePosition());
8158
+ }
8131
8159
  close() {
8132
8160
  if (!this.overlayRef?.hasAttached())
8133
8161
  return;
@@ -8445,7 +8473,9 @@ class QdAutofocusDirective {
8445
8473
  return;
8446
8474
  }
8447
8475
  element.focus();
8448
- this._blurHandler = () => void (this.autofocusService.isAutofocusActivated = false);
8476
+ this._blurHandler = () => {
8477
+ this.autofocusService.isAutofocusActivated = false;
8478
+ };
8449
8479
  element.addEventListener('blur', this._blurHandler, { once: true });
8450
8480
  }, 0);
8451
8481
  }
@@ -9453,11 +9483,11 @@ class QdFilterFormItemsComponent {
9453
9483
  this.filterValueChange.emit($event);
9454
9484
  }
9455
9485
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterFormItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9456
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterFormItemsComponent, isStandalone: false, selector: "qd-filter-form-items", inputs: { inputFilterValue: "inputFilterValue", testId: ["data-test-id", "testId"] }, outputs: { filterValueChange: "filterValueChange" }, host: { classAttribute: "qd-filter-form-items" }, ngImport: i0, template: "<qd-icon [icon]=\"'magnifier'\" class=\"qd-filter-form-items__filter-magnifier\"></qd-icon>\n\n<input\n type=\"text\"\n class=\"qd-filter-form-items__filter\"\n [(ngModel)]=\"filterValue\"\n (ngModelChange)=\"changeValue($event)\"\n [attr.data-test-id]=\"testId + '-filter-items'\"\n [qdAutofocus]=\"true\"\n autocomplete=\"off\"\n/>\n", styles: [".qd-filter-form-items__filter{width:100%;height:2.25rem;padding:0 .75rem 0 2.375rem;border:none;border-bottom:.0625rem solid rgb(213,213,213);margin-bottom:.5rem;background:#fff;color:#171717}.qd-filter-form-items__filter:focus,.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border:none;background:#f5f5f5;outline:none}.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border-bottom:.125rem solid rgb(23,23,23)}.qd-filter-form-items__filter:focus{border-bottom:.125rem solid rgb(0,102,153)}.qd-filter-form-items__filter-magnifier{position:absolute;padding:.625rem 0 .625rem .9375rem}.qd-filter-form-items__filter-magnifier .qd-icon{color:#757575}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: QdAutofocusDirective, selector: "[qdAutofocus]", inputs: ["qdAutofocus"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon", "status"] }] });
9486
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterFormItemsComponent, isStandalone: false, selector: "qd-filter-form-items", inputs: { inputFilterValue: "inputFilterValue", testId: ["data-test-id", "testId"] }, outputs: { filterValueChange: "filterValueChange" }, host: { classAttribute: "qd-filter-form-items" }, ngImport: i0, template: "<qd-icon [icon]=\"'filter'\" class=\"qd-filter-form-items__filter-magnifier\"></qd-icon>\n\n<input\n type=\"text\"\n class=\"qd-filter-form-items__filter\"\n [(ngModel)]=\"filterValue\"\n (ngModelChange)=\"changeValue($event)\"\n [attr.data-test-id]=\"testId + '-filter-items'\"\n [qdAutofocus]=\"true\"\n autocomplete=\"off\"\n/>\n", styles: [".qd-filter-form-items__filter{width:100%;height:2.25rem;padding:0 .75rem 0 2.375rem;border:none;border-bottom:.0625rem solid rgb(213,213,213);margin-bottom:.5rem;background:#fff;color:#171717}.qd-filter-form-items__filter:focus,.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border:none;background:#f5f5f5;outline:none}.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border-bottom:.125rem solid rgb(23,23,23)}.qd-filter-form-items__filter:focus{border-bottom:.125rem solid rgb(0,102,153)}.qd-filter-form-items__filter-magnifier{position:absolute;padding:.625rem 0 .625rem .9375rem}.qd-filter-form-items__filter-magnifier .qd-icon{color:#757575}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: QdAutofocusDirective, selector: "[qdAutofocus]", inputs: ["qdAutofocus"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon", "status"] }] });
9457
9487
  }
9458
9488
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterFormItemsComponent, decorators: [{
9459
9489
  type: Component,
9460
- args: [{ selector: 'qd-filter-form-items', host: { class: 'qd-filter-form-items' }, standalone: false, template: "<qd-icon [icon]=\"'magnifier'\" class=\"qd-filter-form-items__filter-magnifier\"></qd-icon>\n\n<input\n type=\"text\"\n class=\"qd-filter-form-items__filter\"\n [(ngModel)]=\"filterValue\"\n (ngModelChange)=\"changeValue($event)\"\n [attr.data-test-id]=\"testId + '-filter-items'\"\n [qdAutofocus]=\"true\"\n autocomplete=\"off\"\n/>\n", styles: [".qd-filter-form-items__filter{width:100%;height:2.25rem;padding:0 .75rem 0 2.375rem;border:none;border-bottom:.0625rem solid rgb(213,213,213);margin-bottom:.5rem;background:#fff;color:#171717}.qd-filter-form-items__filter:focus,.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border:none;background:#f5f5f5;outline:none}.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border-bottom:.125rem solid rgb(23,23,23)}.qd-filter-form-items__filter:focus{border-bottom:.125rem solid rgb(0,102,153)}.qd-filter-form-items__filter-magnifier{position:absolute;padding:.625rem 0 .625rem .9375rem}.qd-filter-form-items__filter-magnifier .qd-icon{color:#757575}\n"] }]
9490
+ args: [{ selector: 'qd-filter-form-items', host: { class: 'qd-filter-form-items' }, standalone: false, template: "<qd-icon [icon]=\"'filter'\" class=\"qd-filter-form-items__filter-magnifier\"></qd-icon>\n\n<input\n type=\"text\"\n class=\"qd-filter-form-items__filter\"\n [(ngModel)]=\"filterValue\"\n (ngModelChange)=\"changeValue($event)\"\n [attr.data-test-id]=\"testId + '-filter-items'\"\n [qdAutofocus]=\"true\"\n autocomplete=\"off\"\n/>\n", styles: [".qd-filter-form-items__filter{width:100%;height:2.25rem;padding:0 .75rem 0 2.375rem;border:none;border-bottom:.0625rem solid rgb(213,213,213);margin-bottom:.5rem;background:#fff;color:#171717}.qd-filter-form-items__filter:focus,.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border:none;background:#f5f5f5;outline:none}.qd-filter-form-items__filter:hover,.qd-filter-form-items__filter:active{border-bottom:.125rem solid rgb(23,23,23)}.qd-filter-form-items__filter:focus{border-bottom:.125rem solid rgb(0,102,153)}.qd-filter-form-items__filter-magnifier{position:absolute;padding:.625rem 0 .625rem .9375rem}.qd-filter-form-items__filter-magnifier .qd-icon{color:#757575}\n"] }]
9461
9491
  }], propDecorators: { inputFilterValue: [{
9462
9492
  type: Input
9463
9493
  }], testId: [{
@@ -12289,6 +12319,11 @@ class QdDatepickerComponent {
12289
12319
  setDisabledState(disabled) {
12290
12320
  this.disabled = disabled;
12291
12321
  }
12322
+ open() {
12323
+ if (this.disabled)
12324
+ return;
12325
+ this.popover?.open();
12326
+ }
12292
12327
  handleUpdatedDate($rawValue) {
12293
12328
  const $event = this.extractInputStringValue($rawValue);
12294
12329
  if ($event === '') {
@@ -12524,7 +12559,7 @@ class QdDatepickerComponent {
12524
12559
  useValue: true
12525
12560
  },
12526
12561
  QdFormsActionEmitterService
12527
- ], viewQueries: [{ propertyName: "popover", first: true, predicate: ["qdPopoverOnClick"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<qd-form-label\n [label]=\"label\"\n [readonly]=\"readonly\"\n [viewonly]=\"viewonly\"\n [control]=\"control\"\n [tooltip]=\"config?.tooltip\"\n [data-test-id]=\"testId\"\n></qd-form-label>\n\n<qd-input\n *ngIf=\"!readonly && !viewonly\"\n [value]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n (valueChange)=\"config?.timePicker ? handleUpdatedDateTime($event) : handleUpdatedDate($event)\"\n [config]=\"{ disabled, readonly, viewonly, placeholder: config?.placeholder }\"\n [isError]=\"hasError\"\n>\n <button\n type=\"button\"\n class=\"datepicker-toggle\"\n qdIconButton\n [qdPopoverOnClick]=\"disabled ? null : calendar\"\n [qdPopoverMaxWidth]=\"332\"\n qdPopoverCloseStrategy=\"onOutsideClick\"\n #qdPopoverOnClick=\"qdPopoverOnClick\"\n >\n <qd-icon [icon]=\"'calendar'\"></qd-icon>\n </button>\n</qd-input>\n\n<ng-template #calendar>\n <qd-calendar\n [selectedDate]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n [language]=\"language\"\n [disabledDates]=\"config?.disabledDates\"\n (selectedChange)=\"handleUpdatedDate($event)\"\n ></qd-calendar>\n <qd-dropdown\n class=\"timepicker-dropdown\"\n *ngIf=\"timePicker\"\n [value]=\"displayedTime\"\n (valueChange)=\"handleUpdatedTime($event)\"\n [config]=\"timePicker\"\n [qdPopoverMaxHeight]=\"300\"\n ></qd-dropdown>\n</ng-template>\n\n<qd-form-hint\n *ngIf=\"!readonly && !viewonly && (hint || hasError)\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n></qd-form-hint>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"[displayedDate]\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"[displayedDate]\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n", styles: ["qd-datepicker{position:relative;display:block;width:100%;margin-bottom:.75rem}qd-datepicker .calendar{padding:1rem}qd-datepicker .calendar mat-calendar{display:block}qd-datepicker .datepicker-toggle{background-color:unset}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input{height:2.25rem;margin-bottom:.375rem!important}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-label,qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-hint{display:none}qd-datepicker .qd-form-disabled .datepicker-toggle{color:#979797;cursor:default}qd-datepicker.qd-datepicker-calendar-only{margin-bottom:0}qd-datepicker.qd-datepicker-calendar-only qd-input{margin:0}qd-datepicker.qd-datepicker-calendar-only .qd-form-label,qd-datepicker.qd-datepicker-calendar-only .qd-form-hint,qd-datepicker.qd-datepicker-calendar-only .qd-input-input input{display:none}qd-datepicker.qd-datepicker-calendar-only .qd-input-input{height:initial!important;padding:0!important;border:none!important;margin:0!important}qd-datepicker.qd-datepicker-calendar-only .qd-input-suffix{margin-left:0!important}.timepicker-dropdown{margin:.75rem}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon", "status"] }, { kind: "directive", type: QdPopoverOnClickDirective, selector: "[qdPopoverOnClick]", inputs: ["qdPopoverOnClick", "positionStrategy", "qdPopoverCloseStrategy", "qdPopoverDisabled", "qdPopoverStopPropagation", "qdPopoverBackgroundColor", "qdPopoverMaxHeight", "qdPopoverMinWidth", "qdPopoverMaxWidth", "qdPopoverAutoSize", "qdPopoverEnableKeyControl"], outputs: ["opened", "closed"], exportAs: ["qdPopoverOnClick"] }, { kind: "component", type: QdCalendarComponent, selector: "qd-calendar", inputs: ["selectedDate", "language", "disabledDates"], outputs: ["selectedChange"] }, { kind: "component", type: QdDropdownComponent, selector: "qd-dropdown", inputs: ["value", "id", "formControlName", "config", "data-test-id", "qdPopoverMaxHeight", "dense"], outputs: ["valueChange", "enterClick", "clickHint", "clickReadonly", "clickViewonly", "optionsResolved"] }, { kind: "component", type: QdFormHintComponent, selector: "qd-form-hint", inputs: ["hint", "control", "hasError", "hintAction", "data-test-id"] }, { kind: "component", type: QdFormLabelComponent, selector: "qd-form-label", inputs: ["label", "isDisabled", "readonly", "viewonly", "control", "tooltip", "data-test-id"] }, { kind: "component", type: QdFormReadonlyComponent, selector: "qd-form-readonly", inputs: ["values", "readonlyAction", "data-test-id"] }, { kind: "component", type: QdFormViewonlyComponent, selector: "qd-form-viewonly", inputs: ["values", "viewonlyAction", "data-test-id"] }, { kind: "component", type: QdInputComponent, selector: "qd-input", inputs: ["formControlName", "value", "config", "isError", "data-test-id"], outputs: ["valueChange", "enterClick", "clickClear", "clickHint", "clickReadonly", "clickViewonly", "optionsResolved"] }], encapsulation: i0.ViewEncapsulation.None });
12562
+ ], viewQueries: [{ propertyName: "popover", first: true, predicate: ["qdPopoverOnClick"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<qd-form-label\n [label]=\"label\"\n [readonly]=\"readonly\"\n [viewonly]=\"viewonly\"\n [control]=\"control\"\n [tooltip]=\"config?.tooltip\"\n [data-test-id]=\"testId\"\n></qd-form-label>\n\n<qd-input\n *ngIf=\"!readonly && !viewonly\"\n [value]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n (valueChange)=\"config?.timePicker ? handleUpdatedDateTime($event) : handleUpdatedDate($event)\"\n [config]=\"{ disabled, readonly, viewonly, placeholder: config?.placeholder }\"\n [isError]=\"hasError\"\n>\n <button\n type=\"button\"\n class=\"datepicker-toggle\"\n qdIconButton\n [qdPopoverOnClick]=\"disabled ? null : calendar\"\n [qdPopoverMaxWidth]=\"332\"\n qdPopoverCloseStrategy=\"onOutsideClick\"\n #qdPopoverOnClick=\"qdPopoverOnClick\"\n >\n <qd-icon [icon]=\"'calendar'\"></qd-icon>\n </button>\n</qd-input>\n\n<ng-template #calendar>\n <qd-calendar\n [selectedDate]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n [language]=\"language\"\n [disabledDates]=\"config?.disabledDates\"\n (selectedChange)=\"handleUpdatedDate($event)\"\n ></qd-calendar>\n <qd-dropdown\n class=\"timepicker-dropdown\"\n *ngIf=\"timePicker\"\n [value]=\"displayedTime\"\n (valueChange)=\"handleUpdatedTime($event)\"\n [config]=\"timePicker\"\n [qdPopoverMaxHeight]=\"300\"\n ></qd-dropdown>\n</ng-template>\n\n<qd-form-hint\n *ngIf=\"!readonly && !viewonly && (hint || hasError)\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n></qd-form-hint>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"[displayedDate]\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"[displayedDate]\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n", styles: ["qd-datepicker{position:relative;display:block;width:100%;margin-bottom:.75rem}qd-datepicker .calendar{padding:1rem}qd-datepicker .calendar mat-calendar{display:block}qd-datepicker .datepicker-toggle{background-color:unset;color:inherit}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input{height:2.25rem;margin-bottom:.375rem!important}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-label,qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-hint{display:none}qd-datepicker .qd-form-disabled .datepicker-toggle{color:#979797;cursor:default}qd-datepicker.qd-datepicker-calendar-only{margin-bottom:0}qd-datepicker.qd-datepicker-calendar-only qd-input{margin:0}qd-datepicker.qd-datepicker-calendar-only .qd-form-label,qd-datepicker.qd-datepicker-calendar-only .qd-form-hint,qd-datepicker.qd-datepicker-calendar-only .qd-input-input input{display:none}qd-datepicker.qd-datepicker-calendar-only .qd-input-input{height:initial!important;padding:0!important;border:none!important;margin:0!important}qd-datepicker.qd-datepicker-calendar-only .qd-input-suffix{margin-left:0!important}.timepicker-dropdown{margin:.75rem}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon", "status"] }, { kind: "directive", type: QdPopoverOnClickDirective, selector: "[qdPopoverOnClick]", inputs: ["qdPopoverOnClick", "positionStrategy", "qdPopoverCloseStrategy", "qdPopoverDisabled", "qdPopoverStopPropagation", "qdPopoverBackgroundColor", "qdPopoverMaxHeight", "qdPopoverMinWidth", "qdPopoverMaxWidth", "qdPopoverAutoSize", "qdPopoverEnableKeyControl"], outputs: ["opened", "closed"], exportAs: ["qdPopoverOnClick"] }, { kind: "component", type: QdCalendarComponent, selector: "qd-calendar", inputs: ["selectedDate", "language", "disabledDates"], outputs: ["selectedChange"] }, { kind: "component", type: QdDropdownComponent, selector: "qd-dropdown", inputs: ["value", "id", "formControlName", "config", "data-test-id", "qdPopoverMaxHeight", "dense"], outputs: ["valueChange", "enterClick", "clickHint", "clickReadonly", "clickViewonly", "optionsResolved"] }, { kind: "component", type: QdFormHintComponent, selector: "qd-form-hint", inputs: ["hint", "control", "hasError", "hintAction", "data-test-id"] }, { kind: "component", type: QdFormLabelComponent, selector: "qd-form-label", inputs: ["label", "isDisabled", "readonly", "viewonly", "control", "tooltip", "data-test-id"] }, { kind: "component", type: QdFormReadonlyComponent, selector: "qd-form-readonly", inputs: ["values", "readonlyAction", "data-test-id"] }, { kind: "component", type: QdFormViewonlyComponent, selector: "qd-form-viewonly", inputs: ["values", "viewonlyAction", "data-test-id"] }, { kind: "component", type: QdInputComponent, selector: "qd-input", inputs: ["formControlName", "value", "config", "isError", "data-test-id"], outputs: ["valueChange", "enterClick", "clickClear", "clickHint", "clickReadonly", "clickViewonly", "optionsResolved"] }], encapsulation: i0.ViewEncapsulation.None });
12528
12563
  }
12529
12564
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdDatepickerComponent, decorators: [{
12530
12565
  type: Component,
@@ -12539,7 +12574,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
12539
12574
  useValue: true
12540
12575
  },
12541
12576
  QdFormsActionEmitterService
12542
- ], standalone: false, template: "<qd-form-label\n [label]=\"label\"\n [readonly]=\"readonly\"\n [viewonly]=\"viewonly\"\n [control]=\"control\"\n [tooltip]=\"config?.tooltip\"\n [data-test-id]=\"testId\"\n></qd-form-label>\n\n<qd-input\n *ngIf=\"!readonly && !viewonly\"\n [value]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n (valueChange)=\"config?.timePicker ? handleUpdatedDateTime($event) : handleUpdatedDate($event)\"\n [config]=\"{ disabled, readonly, viewonly, placeholder: config?.placeholder }\"\n [isError]=\"hasError\"\n>\n <button\n type=\"button\"\n class=\"datepicker-toggle\"\n qdIconButton\n [qdPopoverOnClick]=\"disabled ? null : calendar\"\n [qdPopoverMaxWidth]=\"332\"\n qdPopoverCloseStrategy=\"onOutsideClick\"\n #qdPopoverOnClick=\"qdPopoverOnClick\"\n >\n <qd-icon [icon]=\"'calendar'\"></qd-icon>\n </button>\n</qd-input>\n\n<ng-template #calendar>\n <qd-calendar\n [selectedDate]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n [language]=\"language\"\n [disabledDates]=\"config?.disabledDates\"\n (selectedChange)=\"handleUpdatedDate($event)\"\n ></qd-calendar>\n <qd-dropdown\n class=\"timepicker-dropdown\"\n *ngIf=\"timePicker\"\n [value]=\"displayedTime\"\n (valueChange)=\"handleUpdatedTime($event)\"\n [config]=\"timePicker\"\n [qdPopoverMaxHeight]=\"300\"\n ></qd-dropdown>\n</ng-template>\n\n<qd-form-hint\n *ngIf=\"!readonly && !viewonly && (hint || hasError)\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n></qd-form-hint>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"[displayedDate]\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"[displayedDate]\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n", styles: ["qd-datepicker{position:relative;display:block;width:100%;margin-bottom:.75rem}qd-datepicker .calendar{padding:1rem}qd-datepicker .calendar mat-calendar{display:block}qd-datepicker .datepicker-toggle{background-color:unset}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input{height:2.25rem;margin-bottom:.375rem!important}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-label,qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-hint{display:none}qd-datepicker .qd-form-disabled .datepicker-toggle{color:#979797;cursor:default}qd-datepicker.qd-datepicker-calendar-only{margin-bottom:0}qd-datepicker.qd-datepicker-calendar-only qd-input{margin:0}qd-datepicker.qd-datepicker-calendar-only .qd-form-label,qd-datepicker.qd-datepicker-calendar-only .qd-form-hint,qd-datepicker.qd-datepicker-calendar-only .qd-input-input input{display:none}qd-datepicker.qd-datepicker-calendar-only .qd-input-input{height:initial!important;padding:0!important;border:none!important;margin:0!important}qd-datepicker.qd-datepicker-calendar-only .qd-input-suffix{margin-left:0!important}.timepicker-dropdown{margin:.75rem}\n"] }]
12577
+ ], standalone: false, template: "<qd-form-label\n [label]=\"label\"\n [readonly]=\"readonly\"\n [viewonly]=\"viewonly\"\n [control]=\"control\"\n [tooltip]=\"config?.tooltip\"\n [data-test-id]=\"testId\"\n></qd-form-label>\n\n<qd-input\n *ngIf=\"!readonly && !viewonly\"\n [value]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n (valueChange)=\"config?.timePicker ? handleUpdatedDateTime($event) : handleUpdatedDate($event)\"\n [config]=\"{ disabled, readonly, viewonly, placeholder: config?.placeholder }\"\n [isError]=\"hasError\"\n>\n <button\n type=\"button\"\n class=\"datepicker-toggle\"\n qdIconButton\n [qdPopoverOnClick]=\"disabled ? null : calendar\"\n [qdPopoverMaxWidth]=\"332\"\n qdPopoverCloseStrategy=\"onOutsideClick\"\n #qdPopoverOnClick=\"qdPopoverOnClick\"\n >\n <qd-icon [icon]=\"'calendar'\"></qd-icon>\n </button>\n</qd-input>\n\n<ng-template #calendar>\n <qd-calendar\n [selectedDate]=\"config?.timePicker && displayedDateTime ? displayedDateTime : displayedDate\"\n [language]=\"language\"\n [disabledDates]=\"config?.disabledDates\"\n (selectedChange)=\"handleUpdatedDate($event)\"\n ></qd-calendar>\n <qd-dropdown\n class=\"timepicker-dropdown\"\n *ngIf=\"timePicker\"\n [value]=\"displayedTime\"\n (valueChange)=\"handleUpdatedTime($event)\"\n [config]=\"timePicker\"\n [qdPopoverMaxHeight]=\"300\"\n ></qd-dropdown>\n</ng-template>\n\n<qd-form-hint\n *ngIf=\"!readonly && !viewonly && (hint || hasError)\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n></qd-form-hint>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"[displayedDate]\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"[displayedDate]\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n", styles: ["qd-datepicker{position:relative;display:block;width:100%;margin-bottom:.75rem}qd-datepicker .calendar{padding:1rem}qd-datepicker .calendar mat-calendar{display:block}qd-datepicker .datepicker-toggle{background-color:unset;color:inherit}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input{height:2.25rem;margin-bottom:.375rem!important}qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-label,qd-datepicker:not(.qd-datepicker-calendar-only) qd-input .qd-form-hint{display:none}qd-datepicker .qd-form-disabled .datepicker-toggle{color:#979797;cursor:default}qd-datepicker.qd-datepicker-calendar-only{margin-bottom:0}qd-datepicker.qd-datepicker-calendar-only qd-input{margin:0}qd-datepicker.qd-datepicker-calendar-only .qd-form-label,qd-datepicker.qd-datepicker-calendar-only .qd-form-hint,qd-datepicker.qd-datepicker-calendar-only .qd-input-input input{display:none}qd-datepicker.qd-datepicker-calendar-only .qd-input-input{height:initial!important;padding:0!important;border:none!important;margin:0!important}qd-datepicker.qd-datepicker-calendar-only .qd-input-suffix{margin-left:0!important}.timepicker-dropdown{margin:.75rem}\n"] }]
12543
12578
  }], propDecorators: { config: [{
12544
12579
  type: Input
12545
12580
  }], formControlName: [{
@@ -20727,6 +20762,7 @@ const updateCategoryTranslation = createAction('[QdUi Filter] updateCategoryTran
20727
20762
  const setFilterSelection = createAction('[QdUi Filter] setFilterSelection', props());
20728
20763
  const setCategoryFilter = createAction('[QdUi Filter] setCategoryFilter', props());
20729
20764
  const resetCategoryFilter = createAction('[QdUi Filter] resetCategoryFilter', props());
20765
+ const clearCategorySelection = createAction('[QdUi Filter] clearCategorySelection', props());
20730
20766
  const QdFilterActions = {
20731
20767
  initFilterState,
20732
20768
  updateItem,
@@ -20737,7 +20773,8 @@ const QdFilterActions = {
20737
20773
  updateCategoryTranslation,
20738
20774
  setFilterSelection,
20739
20775
  setCategoryFilter,
20740
- resetCategoryFilter
20776
+ resetCategoryFilter,
20777
+ clearCategorySelection
20741
20778
  };
20742
20779
 
20743
20780
  function validateFilterSelection(filterSelection, filterCategories, selectionSource) {
@@ -20859,6 +20896,12 @@ const _filterReducer = createReducer(initialState$2, on(QdFilterActions.initFilt
20859
20896
  ...state,
20860
20897
  [filterId]: resetCategoryFilter$1(state[filterId], categoryIndex)
20861
20898
  };
20899
+ }), on(QdFilterActions.clearCategorySelection, (state, { filterId, categoryIndex }) => {
20900
+ const newCategory = getNewCategory(state, filterId, categoryIndex);
20901
+ newCategory.items.forEach((item) => {
20902
+ item.active = false;
20903
+ });
20904
+ return updateStateWithNewCategory(state, filterId, categoryIndex, newCategory);
20862
20905
  }));
20863
20906
  function filterReducer(state, action) {
20864
20907
  return _filterReducer(state, action);
@@ -20988,6 +21031,7 @@ class QdFilterService {
20988
21031
  queryStringSubjects = [];
20989
21032
  filterUrlParameterSubjects = [];
20990
21033
  postBodySubjects = [];
21034
+ itemsLoadingSubjects = {};
20991
21035
  getItems$(filterId, categoryIndex) {
20992
21036
  return this.store.select(QdFilterSelector.selectItems, {
20993
21037
  filterId,
@@ -21069,6 +21113,9 @@ class QdFilterService {
21069
21113
  categoryIndex
21070
21114
  });
21071
21115
  }
21116
+ getItemsLoading$(filterId, categoryIndex) {
21117
+ return this.getItemsLoadingSubject(filterId, categoryIndex).asObservable();
21118
+ }
21072
21119
  getFilterCategoryValue$(filterId, categoryIndex) {
21073
21120
  return this.store.select(QdFilterSelector.selectFilterCategoryValue, {
21074
21121
  filterId,
@@ -21149,6 +21196,21 @@ class QdFilterService {
21149
21196
  categoryIndex
21150
21197
  }));
21151
21198
  }
21199
+ clearCategorySelection(filterId, categoryIndex) {
21200
+ this.store.dispatch(QdFilterActions.clearCategorySelection({
21201
+ filterId,
21202
+ categoryIndex
21203
+ }));
21204
+ }
21205
+ setItemsLoading(filterId, categoryIndex, loading) {
21206
+ this.getItemsLoadingSubject(filterId, categoryIndex).next(loading);
21207
+ }
21208
+ getItemsLoadingSubject(filterId, categoryIndex) {
21209
+ const key = `${filterId}-${categoryIndex}`;
21210
+ if (!this.itemsLoadingSubjects[key])
21211
+ this.itemsLoadingSubjects[key] = new BehaviorSubject(false);
21212
+ return this.itemsLoadingSubjects[key];
21213
+ }
21152
21214
  getQueryStringSubject(filterId) {
21153
21215
  if (!this.queryStringSubjects[filterId])
21154
21216
  this.queryStringSubjects[filterId] = new ReplaySubject(1);
@@ -21205,11 +21267,11 @@ class QdFilterItemBooleanComponent {
21205
21267
  this.filterService.setItemIsActive(this.filterId, this.categoryIndex, this.itemIndex, value === this.itemData);
21206
21268
  }
21207
21269
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemBooleanComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21208
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemBooleanComponent, isStandalone: false, selector: "qd-filter-item-boolean", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", itemIndex: "itemIndex", i18n: "i18n", testId: ["data-test-id", "testId"] }, host: { properties: { "attr.data-test-id": "this.dataTestId" } }, ngImport: i0, template: "<qd-checkbox\n [inputData]=\"{ value: itemData, i18n: i18n || '', disabled: false }\"\n [value]=\"active ? itemData : null\"\n (valueChange)=\"clickToggle($event)\"\n qdRwdDisabled\n [data-test-id]=\"testId\"\n [attr.data-test-id]=\"testId + '-checkbox'\"\n></qd-checkbox>\n", styles: [":host{position:relative;display:flex;flex-wrap:wrap-reverse;margin:0 .75rem;line-height:2.125rem}:host ::ng-deep .qd-checkbox,:host ::ng-deep .qd-checkbox__label,:host ::ng-deep .qd-checkbox__caption{padding:0!important;border:0;margin:0!important}:host ::ng-deep .qd-form-label{color:#757575!important}:host ::ng-deep .qd-form-label:hover,:host ::ng-deep .qd-form-label:focus,:host ::ng-deep .qd-form-label:active{color:#171717!important}:host ::ng-deep .qd-checkbox__indicator{margin-right:.5rem!important}\n"], dependencies: [{ kind: "directive", type: QdRwdDisabledDirective, selector: "[qdRwdDisabled]" }, { kind: "component", type: QdCheckboxComponent, selector: "qd-checkbox", inputs: ["inputData", "value", "data-test-id", "disabled", "hasAutofocus"], outputs: ["valueChange"] }] });
21270
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemBooleanComponent, isStandalone: false, selector: "qd-filter-item-boolean", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", itemIndex: "itemIndex", i18n: "i18n", testId: ["data-test-id", "testId"] }, host: { properties: { "attr.data-test-id": "this.dataTestId" } }, ngImport: i0, template: "<qd-checkbox\n [inputData]=\"{ value: itemData, i18n: i18n || '', disabled: false }\"\n [value]=\"active ? itemData : null\"\n (valueChange)=\"clickToggle($event)\"\n qdRwdDisabled\n [data-test-id]=\"testId\"\n [attr.data-test-id]=\"testId + '-checkbox'\"\n></qd-checkbox>\n", styles: [":host{position:relative;display:flex;flex-wrap:wrap-reverse;margin:0 .75rem;line-height:2.125rem}:host ::ng-deep .qd-checkbox,:host ::ng-deep .qd-checkbox__label,:host ::ng-deep .qd-checkbox__caption{padding:0!important;border:0;margin:0!important}:host ::ng-deep .qd-checkbox__label{color:#757575!important}:host ::ng-deep .qd-checkbox__label:hover,:host ::ng-deep .qd-checkbox__label:focus,:host ::ng-deep .qd-checkbox__label:active{color:#171717!important}:host ::ng-deep .qd-checkbox__indicator{margin-right:.5rem!important}\n"], dependencies: [{ kind: "directive", type: QdRwdDisabledDirective, selector: "[qdRwdDisabled]" }, { kind: "component", type: QdCheckboxComponent, selector: "qd-checkbox", inputs: ["inputData", "value", "data-test-id", "disabled", "hasAutofocus"], outputs: ["valueChange"] }] });
21209
21271
  }
21210
21272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemBooleanComponent, decorators: [{
21211
21273
  type: Component,
21212
- args: [{ selector: 'qd-filter-item-boolean', standalone: false, template: "<qd-checkbox\n [inputData]=\"{ value: itemData, i18n: i18n || '', disabled: false }\"\n [value]=\"active ? itemData : null\"\n (valueChange)=\"clickToggle($event)\"\n qdRwdDisabled\n [data-test-id]=\"testId\"\n [attr.data-test-id]=\"testId + '-checkbox'\"\n></qd-checkbox>\n", styles: [":host{position:relative;display:flex;flex-wrap:wrap-reverse;margin:0 .75rem;line-height:2.125rem}:host ::ng-deep .qd-checkbox,:host ::ng-deep .qd-checkbox__label,:host ::ng-deep .qd-checkbox__caption{padding:0!important;border:0;margin:0!important}:host ::ng-deep .qd-form-label{color:#757575!important}:host ::ng-deep .qd-form-label:hover,:host ::ng-deep .qd-form-label:focus,:host ::ng-deep .qd-form-label:active{color:#171717!important}:host ::ng-deep .qd-checkbox__indicator{margin-right:.5rem!important}\n"] }]
21274
+ args: [{ selector: 'qd-filter-item-boolean', standalone: false, template: "<qd-checkbox\n [inputData]=\"{ value: itemData, i18n: i18n || '', disabled: false }\"\n [value]=\"active ? itemData : null\"\n (valueChange)=\"clickToggle($event)\"\n qdRwdDisabled\n [data-test-id]=\"testId\"\n [attr.data-test-id]=\"testId + '-checkbox'\"\n></qd-checkbox>\n", styles: [":host{position:relative;display:flex;flex-wrap:wrap-reverse;margin:0 .75rem;line-height:2.125rem}:host ::ng-deep .qd-checkbox,:host ::ng-deep .qd-checkbox__label,:host ::ng-deep .qd-checkbox__caption{padding:0!important;border:0;margin:0!important}:host ::ng-deep .qd-checkbox__label{color:#757575!important}:host ::ng-deep .qd-checkbox__label:hover,:host ::ng-deep .qd-checkbox__label:focus,:host ::ng-deep .qd-checkbox__label:active{color:#171717!important}:host ::ng-deep .qd-checkbox__indicator{margin-right:.5rem!important}\n"] }]
21213
21275
  }], propDecorators: { filterId: [{
21214
21276
  type: Input
21215
21277
  }], categoryIndex: [{
@@ -21271,6 +21333,7 @@ class QdFilterItemFreeTextComponent {
21271
21333
  get value() {
21272
21334
  return (this.item && this.item.item) || '';
21273
21335
  }
21336
+ inputValue = '';
21274
21337
  _destroyed$ = new Subject();
21275
21338
  ngOnInit() {
21276
21339
  this.filterService
@@ -21291,24 +21354,27 @@ class QdFilterItemFreeTextComponent {
21291
21354
  this._destroyed$.complete();
21292
21355
  }
21293
21356
  handleValueChange(value) {
21294
- if (value !== '') {
21357
+ this.inputValue = value;
21358
+ if (!this.isInstantFiltering && value !== '') {
21295
21359
  this.filterService.updateItem(this.filterId, this.categoryIndex, this.itemIndex, value);
21296
21360
  }
21297
21361
  }
21298
21362
  handleEnter($event) {
21299
- if (this.isInstantFiltering)
21300
- this.handleValueChange($event);
21363
+ if (this.isInstantFiltering && $event !== '') {
21364
+ this.filterService.updateItem(this.filterId, this.categoryIndex, this.itemIndex, $event);
21365
+ }
21301
21366
  this.enterClick.emit();
21367
+ this.inputValue = '';
21302
21368
  }
21303
21369
  handleReset() {
21304
21370
  this.filterService.updateItem(this.filterId, this.categoryIndex, this.itemIndex, '');
21305
21371
  }
21306
21372
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemFreeTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21307
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemFreeTextComponent, isStandalone: false, selector: "qd-filter-item-free-text", inputs: { filterId: "filterId", isInstantFiltering: "isInstantFiltering", categoryIndex: "categoryIndex", itemIndex: "itemIndex", testId: ["data-test-id", "testId"] }, outputs: { enterClick: "enterClick" }, host: { properties: { "attr.data-test-id": "this.dataTestId" }, classAttribute: "qd-filter__item-free-text" }, ngImport: i0, template: "<qd-input\n [value]=\"item.item\"\n (valueChange)=\"!isInstantFiltering ? handleValueChange($event) : null\"\n (enterClick)=\"handleEnter($event)\"\n [config]=\"{ placeholder: { i18n: i18n }, viewonly: false }\"\n [data-test-id]=\"testId\"\n></qd-input>\n", styles: [":host ::ng-deep qd-input{width:10.25rem;max-width:12.5rem;height:2.125rem;margin-bottom:0!important}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-form-hint{display:none}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-input-input,:host ::ng-deep qd-input .qd-form-hint{margin-bottom:0!important}:host ::ng-deep qd-input .qd-input-input{height:2.125rem!important;border-color:transparent!important}:host ::ng-deep qd-input .qd-input-input input::placeholder{color:#757575!important}\n"], dependencies: [{ kind: "component", type: QdInputComponent, selector: "qd-input", inputs: ["formControlName", "value", "config", "isError", "data-test-id"], outputs: ["valueChange", "enterClick", "clickClear", "clickHint", "clickReadonly", "clickViewonly", "optionsResolved"] }] });
21373
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemFreeTextComponent, isStandalone: false, selector: "qd-filter-item-free-text", inputs: { filterId: "filterId", isInstantFiltering: "isInstantFiltering", categoryIndex: "categoryIndex", itemIndex: "itemIndex", testId: ["data-test-id", "testId"] }, outputs: { enterClick: "enterClick" }, host: { properties: { "attr.data-test-id": "this.dataTestId" }, classAttribute: "qd-filter__item-free-text" }, ngImport: i0, template: "<qd-input\n [value]=\"inputValue\"\n (valueChange)=\"handleValueChange($event)\"\n (enterClick)=\"handleEnter($event)\"\n [config]=\"{ placeholder: { i18n: i18n }, viewonly: false }\"\n [data-test-id]=\"testId\"\n></qd-input>\n", styles: [":host ::ng-deep qd-input{width:10.25rem;max-width:12.5rem;height:2.125rem;margin-bottom:0!important}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-form-hint{display:none}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-input-input,:host ::ng-deep qd-input .qd-form-hint{margin-bottom:0!important}:host ::ng-deep qd-input .qd-input-input{height:2.125rem!important;border-color:transparent!important}:host ::ng-deep qd-input .qd-input-input input::placeholder{color:#757575!important}:host:hover ::ng-deep qd-input .qd-input-input input::placeholder{color:#171717!important}\n"], dependencies: [{ kind: "component", type: QdInputComponent, selector: "qd-input", inputs: ["formControlName", "value", "config", "isError", "data-test-id"], outputs: ["valueChange", "enterClick", "clickClear", "clickHint", "clickReadonly", "clickViewonly", "optionsResolved"] }] });
21308
21374
  }
21309
21375
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemFreeTextComponent, decorators: [{
21310
21376
  type: Component,
21311
- args: [{ selector: 'qd-filter-item-free-text', host: { class: 'qd-filter__item-free-text' }, standalone: false, template: "<qd-input\n [value]=\"item.item\"\n (valueChange)=\"!isInstantFiltering ? handleValueChange($event) : null\"\n (enterClick)=\"handleEnter($event)\"\n [config]=\"{ placeholder: { i18n: i18n }, viewonly: false }\"\n [data-test-id]=\"testId\"\n></qd-input>\n", styles: [":host ::ng-deep qd-input{width:10.25rem;max-width:12.5rem;height:2.125rem;margin-bottom:0!important}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-form-hint{display:none}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-input-input,:host ::ng-deep qd-input .qd-form-hint{margin-bottom:0!important}:host ::ng-deep qd-input .qd-input-input{height:2.125rem!important;border-color:transparent!important}:host ::ng-deep qd-input .qd-input-input input::placeholder{color:#757575!important}\n"] }]
21377
+ args: [{ selector: 'qd-filter-item-free-text', host: { class: 'qd-filter__item-free-text' }, standalone: false, template: "<qd-input\n [value]=\"inputValue\"\n (valueChange)=\"handleValueChange($event)\"\n (enterClick)=\"handleEnter($event)\"\n [config]=\"{ placeholder: { i18n: i18n }, viewonly: false }\"\n [data-test-id]=\"testId\"\n></qd-input>\n", styles: [":host ::ng-deep qd-input{width:10.25rem;max-width:12.5rem;height:2.125rem;margin-bottom:0!important}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-form-hint{display:none}:host ::ng-deep qd-input .qd-form-label,:host ::ng-deep qd-input .qd-input-input,:host ::ng-deep qd-input .qd-form-hint{margin-bottom:0!important}:host ::ng-deep qd-input .qd-input-input{height:2.125rem!important;border-color:transparent!important}:host ::ng-deep qd-input .qd-input-input input::placeholder{color:#757575!important}:host:hover ::ng-deep qd-input .qd-input-input input::placeholder{color:#171717!important}\n"] }]
21312
21378
  }], propDecorators: { filterId: [{
21313
21379
  type: Input
21314
21380
  }], isInstantFiltering: [{
@@ -21389,6 +21455,7 @@ class QdFilterItemDateComponent {
21389
21455
  get dataTestId() {
21390
21456
  return this.testId;
21391
21457
  }
21458
+ datepicker;
21392
21459
  datepickerConfig = { viewonly: false };
21393
21460
  item;
21394
21461
  _destroyed$ = new Subject();
@@ -21407,6 +21474,9 @@ class QdFilterItemDateComponent {
21407
21474
  handleClickTimePlaceholder($event) {
21408
21475
  this.clickTimePlaceholder.emit($event);
21409
21476
  }
21477
+ open() {
21478
+ this.datepicker?.open();
21479
+ }
21410
21480
  subscribeGetItem() {
21411
21481
  this.filterService
21412
21482
  .getItemById$(this.filterId, this.categoryIndex, this.itemIndex)
@@ -21414,7 +21484,7 @@ class QdFilterItemDateComponent {
21414
21484
  .subscribe();
21415
21485
  }
21416
21486
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21417
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateComponent, isStandalone: false, selector: "qd-filter-item-date", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", itemIndex: "itemIndex", timePickerConfig: "timePickerConfig", testId: ["data-test-id", "testId"] }, outputs: { clickTimePlaceholder: "clickTimePlaceholder" }, host: { properties: { "attr.data-test-id": "this.dataTestId" }, classAttribute: "qd-filter__item-date" }, ngImport: i0, template: "<qd-datepicker\n [(value)]=\"item\"\n (valueChange)=\"handleDateChange($event)\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n [hasCalendarOnly]=\"true\"\n [config]=\"datepickerConfig\"\n></qd-datepicker>\n", styles: [":host qd-datepicker{padding-top:.125rem;margin-left:.25rem}:host ::ng-deep+.qd-chip.filter{margin-left:.1875rem!important}\n"], dependencies: [{ kind: "component", type: QdDatepickerComponent, selector: "qd-datepicker", inputs: ["config", "formControlName", "value", "hasCalendarOnly", "data-test-id"], outputs: ["valueChange", "clickTimePlaceholder", "clickHint", "clickReadonly", "clickViewonly"] }] });
21487
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateComponent, isStandalone: false, selector: "qd-filter-item-date", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", itemIndex: "itemIndex", timePickerConfig: "timePickerConfig", testId: ["data-test-id", "testId"] }, outputs: { clickTimePlaceholder: "clickTimePlaceholder" }, host: { properties: { "attr.data-test-id": "this.dataTestId" }, classAttribute: "qd-filter__item-date" }, viewQueries: [{ propertyName: "datepicker", first: true, predicate: QdDatepickerComponent, descendants: true }], ngImport: i0, template: "<qd-datepicker\n [(value)]=\"item\"\n (valueChange)=\"handleDateChange($event)\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n [hasCalendarOnly]=\"true\"\n [config]=\"datepickerConfig\"\n></qd-datepicker>\n", styles: [":host qd-datepicker{padding-top:.125rem;margin-left:.25rem}:host ::ng-deep+.qd-chip.filter{margin-left:.1875rem!important}\n"], dependencies: [{ kind: "component", type: QdDatepickerComponent, selector: "qd-datepicker", inputs: ["config", "formControlName", "value", "hasCalendarOnly", "data-test-id"], outputs: ["valueChange", "clickTimePlaceholder", "clickHint", "clickReadonly", "clickViewonly"] }] });
21418
21488
  }
21419
21489
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateComponent, decorators: [{
21420
21490
  type: Component,
@@ -21435,6 +21505,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
21435
21505
  }], dataTestId: [{
21436
21506
  type: HostBinding,
21437
21507
  args: ['attr.data-test-id']
21508
+ }], datepicker: [{
21509
+ type: ViewChild,
21510
+ args: [QdDatepickerComponent]
21438
21511
  }] } });
21439
21512
 
21440
21513
  // @ts-strict-ignore
@@ -21469,11 +21542,11 @@ class QdFilterItemDateCategoryComponent {
21469
21542
  this.item$ = this.filterService.getItemById$(this.filterId, this.categoryIndex, this.itemIndex);
21470
21543
  }
21471
21544
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateCategoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21472
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateCategoryComponent, isStandalone: false, selector: "qd-filter-category-date", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", timePickerConfig: "timePickerConfig", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-filter__category-date" }, ngImport: i0, template: "{{ this.i18n$ | async | translate }}\n{{ \"i18n.qd.filter.date.on\" | translate }}\n\n<qd-filter-item-date\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [data-test-id]=\"testId + '-item'\"\n [timePickerConfig]=\"timePickerConfig\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n></qd-filter-item-date>\n\n<qd-chip\n *ngIf=\"(item$ | async)?.active && (item$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (item$ | async).item\"\n>\n {{ (item$ | async).item | localeDate : !!timePickerConfig : timePlaceholderSelected | async }}\n</qd-chip>\n", styles: [":host{display:flex;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;line-height:2.125rem}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdFilterItemDateComponent, selector: "qd-filter-item-date", inputs: ["filterId", "categoryIndex", "itemIndex", "timePickerConfig", "data-test-id"], outputs: ["clickTimePlaceholder"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }] });
21545
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateCategoryComponent, isStandalone: false, selector: "qd-filter-category-date", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", timePickerConfig: "timePickerConfig", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-filter__category-date" }, ngImport: i0, template: "<span\n class=\"qd-filter__date-label\"\n (click)=\"dateItem.open(); $event.stopPropagation()\"\n [attr.data-test-id]=\"testId + '-label'\"\n>\n {{ this.i18n$ | async | translate }} {{ \"i18n.qd.filter.date.on\" | translate }}\n</span>\n\n<qd-filter-item-date\n #dateItem\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [data-test-id]=\"testId + '-item'\"\n [timePickerConfig]=\"timePickerConfig\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n></qd-filter-item-date>\n\n<qd-chip\n *ngIf=\"(item$ | async)?.active && (item$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (item$ | async).item\"\n>\n {{ (item$ | async).item | localeDate : !!timePickerConfig : timePlaceholderSelected | async }}\n</qd-chip>\n", styles: [":host{display:flex;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;cursor:default;line-height:2.125rem}:host:hover{color:#171717}:host .qd-filter__date-label{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdFilterItemDateComponent, selector: "qd-filter-item-date", inputs: ["filterId", "categoryIndex", "itemIndex", "timePickerConfig", "data-test-id"], outputs: ["clickTimePlaceholder"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }] });
21473
21546
  }
21474
21547
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateCategoryComponent, decorators: [{
21475
21548
  type: Component,
21476
- args: [{ selector: 'qd-filter-category-date', host: { class: 'qd-filter__category-date' }, standalone: false, template: "{{ this.i18n$ | async | translate }}\n{{ \"i18n.qd.filter.date.on\" | translate }}\n\n<qd-filter-item-date\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [data-test-id]=\"testId + '-item'\"\n [timePickerConfig]=\"timePickerConfig\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n></qd-filter-item-date>\n\n<qd-chip\n *ngIf=\"(item$ | async)?.active && (item$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (item$ | async).item\"\n>\n {{ (item$ | async).item | localeDate : !!timePickerConfig : timePlaceholderSelected | async }}\n</qd-chip>\n", styles: [":host{display:flex;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;line-height:2.125rem}\n"] }]
21549
+ args: [{ selector: 'qd-filter-category-date', host: { class: 'qd-filter__category-date' }, standalone: false, template: "<span\n class=\"qd-filter__date-label\"\n (click)=\"dateItem.open(); $event.stopPropagation()\"\n [attr.data-test-id]=\"testId + '-label'\"\n>\n {{ this.i18n$ | async | translate }} {{ \"i18n.qd.filter.date.on\" | translate }}\n</span>\n\n<qd-filter-item-date\n #dateItem\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [data-test-id]=\"testId + '-item'\"\n [timePickerConfig]=\"timePickerConfig\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n></qd-filter-item-date>\n\n<qd-chip\n *ngIf=\"(item$ | async)?.active && (item$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (item$ | async).item\"\n>\n {{ (item$ | async).item | localeDate : !!timePickerConfig : timePlaceholderSelected | async }}\n</qd-chip>\n", styles: [":host{display:flex;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;cursor:default;line-height:2.125rem}:host:hover{color:#171717}:host .qd-filter__date-label{cursor:pointer}\n"] }]
21477
21550
  }], propDecorators: { filterId: [{
21478
21551
  type: Input
21479
21552
  }], categoryIndex: [{
@@ -21503,6 +21576,10 @@ class QdFilterItemDateRangeComponent {
21503
21576
  get dataTestId() {
21504
21577
  return this.testId;
21505
21578
  }
21579
+ datepicker;
21580
+ open() {
21581
+ this.datepicker?.open();
21582
+ }
21506
21583
  get minDate$() {
21507
21584
  return this.filterService.getMinDate$(this.filterId, this.categoryIndex, this.itemIndex);
21508
21585
  }
@@ -21556,7 +21633,7 @@ class QdFilterItemDateRangeComponent {
21556
21633
  };
21557
21634
  }
21558
21635
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21559
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateRangeComponent, isStandalone: false, selector: "qd-filter-item-date-range", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", itemIndex: "itemIndex", timePickerConfig: "timePickerConfig", testId: ["data-test-id", "testId"] }, outputs: { clickTimePlaceholder: "clickTimePlaceholder" }, host: { properties: { "attr.class": "this.itemClassName", "attr.data-test-id": "this.dataTestId" } }, ngImport: i0, template: "<qd-datepicker\n [config]=\"config\"\n [(value)]=\"item\"\n (valueChange)=\"handleDateChange($event)\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n [hasCalendarOnly]=\"true\"\n></qd-datepicker>\n", styles: [":host input{width:0!important;height:0!important;border:none!important}:host.qd-filter__item-date-range--0 ::ng-deep+.qd-chip.filter{margin-right:.25rem;margin-left:.1875rem!important}:host.qd-filter__item-date-range--1 ::ng-deep+.qd-chip.filter{margin-left:.1875rem!important}\n"], dependencies: [{ kind: "component", type: QdDatepickerComponent, selector: "qd-datepicker", inputs: ["config", "formControlName", "value", "hasCalendarOnly", "data-test-id"], outputs: ["valueChange", "clickTimePlaceholder", "clickHint", "clickReadonly", "clickViewonly"] }] });
21636
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateRangeComponent, isStandalone: false, selector: "qd-filter-item-date-range", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", itemIndex: "itemIndex", timePickerConfig: "timePickerConfig", testId: ["data-test-id", "testId"] }, outputs: { clickTimePlaceholder: "clickTimePlaceholder" }, host: { properties: { "attr.class": "this.itemClassName", "attr.data-test-id": "this.dataTestId" } }, viewQueries: [{ propertyName: "datepicker", first: true, predicate: QdDatepickerComponent, descendants: true }], ngImport: i0, template: "<qd-datepicker\n [config]=\"config\"\n [(value)]=\"item\"\n (valueChange)=\"handleDateChange($event)\"\n (clickTimePlaceholder)=\"handleClickTimePlaceholder($event)\"\n [hasCalendarOnly]=\"true\"\n></qd-datepicker>\n", styles: [":host input{width:0!important;height:0!important;border:none!important}:host.qd-filter__item-date-range--0 ::ng-deep+.qd-chip.filter{margin-right:.25rem;margin-left:.1875rem!important}:host.qd-filter__item-date-range--1 ::ng-deep+.qd-chip.filter{margin-left:.1875rem!important}\n"], dependencies: [{ kind: "component", type: QdDatepickerComponent, selector: "qd-datepicker", inputs: ["config", "formControlName", "value", "hasCalendarOnly", "data-test-id"], outputs: ["valueChange", "clickTimePlaceholder", "clickHint", "clickReadonly", "clickViewonly"] }] });
21560
21637
  }
21561
21638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateRangeComponent, decorators: [{
21562
21639
  type: Component,
@@ -21580,6 +21657,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
21580
21657
  }], dataTestId: [{
21581
21658
  type: HostBinding,
21582
21659
  args: ['attr.data-test-id']
21660
+ }], datepicker: [{
21661
+ type: ViewChild,
21662
+ args: [QdDatepickerComponent]
21583
21663
  }] } });
21584
21664
 
21585
21665
  // @ts-strict-ignore
@@ -21609,6 +21689,10 @@ class QdFilterItemDateRangeCategoryComponent {
21609
21689
  ? { ...this.timePickerConfig, label: { i18n: 'i18n.qd.filter.dateRange.end' } }
21610
21690
  : undefined;
21611
21691
  }
21692
+ openItem(itemRef, event) {
21693
+ itemRef.open();
21694
+ event.stopPropagation();
21695
+ }
21612
21696
  removeItem(itemIndex) {
21613
21697
  this.filterService.updateItem(this.filterId, this.categoryIndex, itemIndex, '');
21614
21698
  this.filterService.setItemIsActive(this.filterId, this.categoryIndex, itemIndex, false);
@@ -21628,11 +21712,11 @@ class QdFilterItemDateRangeCategoryComponent {
21628
21712
  this[targetMember] = this.filterService.getItemById$(this.filterId, this.categoryIndex, index);
21629
21713
  }
21630
21714
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateRangeCategoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21631
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateRangeCategoryComponent, isStandalone: false, selector: "qd-filter-category-date-range", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", testId: ["data-test-id", "testId"], timePickerConfig: "timePickerConfig" }, host: { classAttribute: "qd-filter__category-date-range" }, ngImport: i0, template: "{{ this.i18n$ | async | translate }}\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\">{{ \"i18n.qd.filter.dateRange.from\" | translate }}</span>\n\n <qd-filter-item-date-range\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-item-date-from'\"\n [timePickerConfig]=\"fromItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleFromTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(fromItem$ | async)?.active && (fromItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (fromItem$ | async).item\"\n >\n {{ (fromItem$ | async).item | localeDate : !!timePickerConfig : fromItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\">{{ \"i18n.qd.filter.dateRange.until\" | translate }}</span>\n\n <qd-filter-item-date-range\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-item-date-until'\"\n [timePickerConfig]=\"untilItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleUntilTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(untilItem$ | async)?.active && (untilItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (untilItem$ | async).item\"\n >\n {{ (untilItem$ | async).item | localeDate : !!timePickerConfig : untilItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n", styles: [":host{display:flex;flex-wrap:wrap;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;line-height:2.125rem}:host .qd-filter__item-date-range__label{margin-left:.25rem}:host .qd-filter__date-range__group{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdFilterItemDateRangeComponent, selector: "qd-filter-item-date-range", inputs: ["filterId", "categoryIndex", "itemIndex", "timePickerConfig", "data-test-id"], outputs: ["clickTimePlaceholder"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }] });
21715
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemDateRangeCategoryComponent, isStandalone: false, selector: "qd-filter-category-date-range", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", testId: ["data-test-id", "testId"], timePickerConfig: "timePickerConfig" }, host: { classAttribute: "qd-filter__category-date-range" }, ngImport: i0, template: "{{ this.i18n$ | async | translate }}\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\" (click)=\"openItem(fromItemRef, $event)\">{{\n \"i18n.qd.filter.dateRange.from\" | translate\n }}</span>\n\n <qd-filter-item-date-range\n #fromItemRef\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-item-date-from'\"\n [timePickerConfig]=\"fromItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleFromTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(fromItem$ | async)?.active && (fromItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (fromItem$ | async).item\"\n >\n {{ (fromItem$ | async).item | localeDate : !!timePickerConfig : fromItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\" (click)=\"openItem(untilItemRef, $event)\">{{\n \"i18n.qd.filter.dateRange.until\" | translate\n }}</span>\n\n <qd-filter-item-date-range\n #untilItemRef\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-item-date-until'\"\n [timePickerConfig]=\"untilItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleUntilTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(untilItem$ | async)?.active && (untilItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (untilItem$ | async).item\"\n >\n {{ (untilItem$ | async).item | localeDate : !!timePickerConfig : untilItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n", styles: [":host{display:flex;flex-wrap:wrap;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;cursor:default;line-height:2.125rem}:host:hover{color:#171717}:host .qd-filter__item-date-range__label{margin-left:.25rem;cursor:pointer}:host .qd-filter__date-range__group{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdFilterItemDateRangeComponent, selector: "qd-filter-item-date-range", inputs: ["filterId", "categoryIndex", "itemIndex", "timePickerConfig", "data-test-id"], outputs: ["clickTimePlaceholder"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }] });
21632
21716
  }
21633
21717
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemDateRangeCategoryComponent, decorators: [{
21634
21718
  type: Component,
21635
- args: [{ selector: 'qd-filter-category-date-range', host: { class: 'qd-filter__category-date-range' }, standalone: false, template: "{{ this.i18n$ | async | translate }}\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\">{{ \"i18n.qd.filter.dateRange.from\" | translate }}</span>\n\n <qd-filter-item-date-range\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-item-date-from'\"\n [timePickerConfig]=\"fromItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleFromTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(fromItem$ | async)?.active && (fromItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (fromItem$ | async).item\"\n >\n {{ (fromItem$ | async).item | localeDate : !!timePickerConfig : fromItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\">{{ \"i18n.qd.filter.dateRange.until\" | translate }}</span>\n\n <qd-filter-item-date-range\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-item-date-until'\"\n [timePickerConfig]=\"untilItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleUntilTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(untilItem$ | async)?.active && (untilItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (untilItem$ | async).item\"\n >\n {{ (untilItem$ | async).item | localeDate : !!timePickerConfig : untilItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n", styles: [":host{display:flex;flex-wrap:wrap;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;line-height:2.125rem}:host .qd-filter__item-date-range__label{margin-left:.25rem}:host .qd-filter__date-range__group{display:flex;align-items:center}\n"] }]
21719
+ args: [{ selector: 'qd-filter-category-date-range', host: { class: 'qd-filter__category-date-range' }, standalone: false, template: "{{ this.i18n$ | async | translate }}\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\" (click)=\"openItem(fromItemRef, $event)\">{{\n \"i18n.qd.filter.dateRange.from\" | translate\n }}</span>\n\n <qd-filter-item-date-range\n #fromItemRef\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-item-date-from'\"\n [timePickerConfig]=\"fromItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleFromTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(fromItem$ | async)?.active && (fromItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"fromItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (fromItem$ | async).item\"\n >\n {{ (fromItem$ | async).item | localeDate : !!timePickerConfig : fromItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n\n<span class=\"qd-filter__date-range__group\">\n <span class=\"qd-filter__item-date-range__label\" (click)=\"openItem(untilItemRef, $event)\">{{\n \"i18n.qd.filter.dateRange.until\" | translate\n }}</span>\n\n <qd-filter-item-date-range\n #untilItemRef\n [filterId]=\"filterId\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-item-date-until'\"\n [timePickerConfig]=\"untilItemTimePickerConfig\"\n (clickTimePlaceholder)=\"handleUntilTimePlaceholderClicked($event)\"\n ></qd-filter-item-date-range>\n\n <qd-chip\n *ngIf=\"(untilItem$ | async)?.active && (untilItem$ | async)?.item\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"removeItem($event)\"\n [data]=\"untilItemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + (untilItem$ | async).item\"\n >\n {{ (untilItem$ | async).item | localeDate : !!timePickerConfig : untilItemTimePlaceholderClicked | async }}\n </qd-chip>\n</span>\n", styles: [":host{display:flex;flex-wrap:wrap;align-items:center;padding-right:.75rem;padding-left:.75rem;color:#757575;cursor:default;line-height:2.125rem}:host:hover{color:#171717}:host .qd-filter__item-date-range__label{margin-left:.25rem;cursor:pointer}:host .qd-filter__date-range__group{display:flex;align-items:center}\n"] }]
21636
21720
  }], propDecorators: { filterId: [{
21637
21721
  type: Input
21638
21722
  }], categoryIndex: [{
@@ -21758,6 +21842,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
21758
21842
 
21759
21843
  class QdFilterItemSelectCategoryComponent {
21760
21844
  filterService = inject(QdFilterService);
21845
+ breakpointService = inject(QdBreakpointService);
21846
+ isMobile$ = this.breakpointService.isViewportBelow('md');
21761
21847
  filterId;
21762
21848
  categoryIndex;
21763
21849
  testId;
@@ -21769,15 +21855,34 @@ class QdFilterItemSelectCategoryComponent {
21769
21855
  items;
21770
21856
  dependsOn = [];
21771
21857
  showSelectButton$;
21858
+ itemsLoading$;
21772
21859
  positionStrategy = [
21773
21860
  { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: -1 },
21774
21861
  { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', weight: 0.8, offsetY: 1 }
21775
21862
  ];
21776
21863
  maxFlyoutHeight = 378;
21777
21864
  _destroyRef = inject(DestroyRef);
21865
+ frozenSelectedKeys = [];
21866
+ frozenUnselectedKeys = [];
21778
21867
  get closeButton() {
21779
21868
  return this.type === 'multiSelect';
21780
21869
  }
21870
+ get activeItemCount() {
21871
+ return this.items?.filter(item => item.active).length ?? 0;
21872
+ }
21873
+ get selectedDropdownEntries() {
21874
+ return this.toEntries(this.frozenSelectedKeys);
21875
+ }
21876
+ get unselectedDropdownEntries() {
21877
+ return this.toEntries(this.frozenUnselectedKeys);
21878
+ }
21879
+ get showSelectedSeparator() {
21880
+ return (this.selectedDropdownEntries.some(entry => !entry.item.hidden) &&
21881
+ this.unselectedDropdownEntries.some(entry => !entry.item.hidden));
21882
+ }
21883
+ get hasNoVisibleItems() {
21884
+ return (this.items ?? []).every(item => item.hidden);
21885
+ }
21781
21886
  get buttonClassName() {
21782
21887
  return `
21783
21888
  qd-filter__category-button
@@ -21796,9 +21901,11 @@ class QdFilterItemSelectCategoryComponent {
21796
21901
  this.initCategorySubscription();
21797
21902
  this.initItemsSubscription();
21798
21903
  this.initShowSelectButton();
21904
+ this.itemsLoading$ = this.filterService.getItemsLoading$(this.filterId, this.categoryIndex);
21799
21905
  }
21800
21906
  onLayerOpened() {
21801
21907
  this.open = true;
21908
+ this.freezeDropdownOrder();
21802
21909
  }
21803
21910
  onLayerClosed() {
21804
21911
  this.open = false;
@@ -21810,6 +21917,27 @@ class QdFilterItemSelectCategoryComponent {
21810
21917
  this.filterService.setItemIsActive(this.filterId, this.categoryIndex, itemIndex, false);
21811
21918
  this.filterService.resetCategoryFilter(this.filterId, this.categoryIndex);
21812
21919
  }
21920
+ clearAll() {
21921
+ this.filterService.clearCategorySelection(this.filterId, this.categoryIndex);
21922
+ this.filterService.resetCategoryFilter(this.filterId, this.categoryIndex);
21923
+ }
21924
+ trackByItem(_index, entry) {
21925
+ return entry.item.item;
21926
+ }
21927
+ freezeDropdownOrder() {
21928
+ const items = this.items ?? [];
21929
+ this.frozenSelectedKeys = items.filter(item => item.active).map(item => item.item);
21930
+ this.frozenUnselectedKeys = items.filter(item => !item.active).map(item => item.item);
21931
+ }
21932
+ toEntries(keys) {
21933
+ const items = this.items ?? [];
21934
+ return keys
21935
+ .map(key => {
21936
+ const itemIndex = items.findIndex(item => item.item === key);
21937
+ return { item: items[itemIndex], itemIndex };
21938
+ })
21939
+ .filter(entry => !!entry.item);
21940
+ }
21813
21941
  changeValue($event) {
21814
21942
  this.filterService.hideShowItems(this.filterId, this.categoryIndex, $event);
21815
21943
  this.filterService.setCategoryFilter(this.filterId, this.categoryIndex, $event);
@@ -21829,7 +21957,19 @@ class QdFilterItemSelectCategoryComponent {
21829
21957
  this.filterService
21830
21958
  .getItems$(this.filterId, this.categoryIndex)
21831
21959
  .pipe(takeUntilDestroyed(this._destroyRef))
21832
- .subscribe(items => (this.items = items));
21960
+ .subscribe(items => {
21961
+ const itemSetChanged = !this.haveSameItemKeys(this.items, items);
21962
+ this.items = items;
21963
+ if (this.open && itemSetChanged)
21964
+ this.freezeDropdownOrder();
21965
+ this.popoverDirective?.updatePosition();
21966
+ });
21967
+ }
21968
+ haveSameItemKeys(previous, next) {
21969
+ const previousItems = previous ?? [];
21970
+ const nextItems = next ?? [];
21971
+ return (previousItems.length === nextItems.length &&
21972
+ previousItems.every((item, index) => item.item === nextItems[index].item));
21833
21973
  }
21834
21974
  initShowSelectButton() {
21835
21975
  const category$ = this.filterService
@@ -21851,11 +21991,11 @@ class QdFilterItemSelectCategoryComponent {
21851
21991
  }));
21852
21992
  }
21853
21993
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemSelectCategoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21854
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemSelectCategoryComponent, isStandalone: false, selector: "qd-filter-category-select", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-filter__category-select" }, viewQueries: [{ propertyName: "popoverDirective", first: true, predicate: QdPopoverOnClickDirective, descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"showSelectButton$ | async\"\n [class]=\"buttonClassName\"\n [qdPopoverOnClick]=\"filterLayer\"\n [qdPopoverCloseStrategy]=\"'onOutsideClick'\"\n [qdPopoverStopPropagation]=\"true\"\n [qdPopoverMaxHeight]=\"maxFlyoutHeight\"\n [positionStrategy]=\"positionStrategy\"\n (opened)=\"onLayerOpened()\"\n (closed)=\"onLayerClosed()\"\n [attr.data-test-id]=\"testId + '-select-button'\"\n>\n <qd-icon\n *ngIf=\"!open\"\n [icon]=\"'ctrlDown'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--closed'\"\n [attr.data-test-id]=\"testId + '-closed'\"\n ></qd-icon>\n <qd-icon\n *ngIf=\"open\"\n [icon]=\"'ctrlTop'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--open'\"\n [attr.data-test-id]=\"testId + '-opened'\"\n ></qd-icon>\n\n <div class=\"qd-filter__category-button-caption\">\n <span>\n {{ i18n | translate }}\n </span>\n </div>\n\n <ng-container *ngTemplateOutlet=\"SelectedChip\"></ng-container>\n</div>\n\n<ng-template #filterLayer>\n <div [class]=\"layerContentClassName\">\n <qd-icon\n *ngIf=\"closeButton\"\n [class]=\"'qd-filter__category-layer-close'\"\n (click)=\"closeLayer()\"\n [icon]=\"'timesLargeLight'\"\n [attr.data-test-id]=\"testId + '-layer-close'\"\n ></qd-icon>\n\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"'multiSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <qd-filter-item-multi-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n >\n </qd-filter-item-multi-select>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'singleSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <qd-filter-item-single-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n (closeEventEmitter)=\"closeLayer()\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n >\n </qd-filter-item-single-select>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #SelectedChip>\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <!-- TODO: Add tooltip-->\n <qd-chip\n *ngIf=\"item.active\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"close($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + item.item\"\n >{{ item.i18n | translate }}</qd-chip\n >\n </ng-container>\n</ng-template>\n", styles: ["::ng-deep .qd-filter__category-layer{display:flex;overflow:hidden;min-width:16.25rem;max-width:56.25rem;height:100%;flex-direction:column;padding:1rem 0 0;border:.0625rem solid rgb(151,151,151);background:#fff;box-shadow:#d5d5d5 .125rem .25rem .4375rem}::ng-deep .qd-filter__category-layer .qd-filter-form-items__filter{flex-shrink:0;margin-bottom:0}::ng-deep .qd-filter__category-layer .qd-checkbox__label{display:flex;height:2.5rem}::ng-deep .qd-filter__category-layer .qd-checkbox__indicator,::ng-deep .qd-filter__category-layer .qd-radio-buttons__indicator{transform:translateY(-.0625rem)}::ng-deep .qd-filter__category-layer-items{flex:1;overflow-y:auto}::ng-deep .qd-filter__category-layer-container{position:relative}::ng-deep .qd-filter__category-layer-close{position:absolute;z-index:1;top:1rem;right:1rem;color:#757575;cursor:pointer}::ng-deep .qd-filter__category-layer-close:before{position:absolute;content:\"\";inset:-.5rem}::ng-deep .qd-filter__category-layer-close:hover,::ng-deep .qd-filter__category-layer-close:focus{color:#171717}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdFilterFormItemsComponent, selector: "qd-filter-form-items", inputs: ["inputFilterValue", "data-test-id"], outputs: ["filterValueChange"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon", "status"] }, { kind: "directive", type: QdPopoverOnClickDirective, selector: "[qdPopoverOnClick]", inputs: ["qdPopoverOnClick", "positionStrategy", "qdPopoverCloseStrategy", "qdPopoverDisabled", "qdPopoverStopPropagation", "qdPopoverBackgroundColor", "qdPopoverMaxHeight", "qdPopoverMinWidth", "qdPopoverMaxWidth", "qdPopoverAutoSize", "qdPopoverEnableKeyControl"], outputs: ["opened", "closed"], exportAs: ["qdPopoverOnClick"] }, { kind: "component", type: QdFilterItemMultiSelectComponent, selector: "qd-filter-item-multi-select", inputs: ["filterId", "categoryIndex", "itemIndex", "data-test-id"] }, { kind: "component", type: QdFilterItemSingleSelectComponent, selector: "qd-filter-item-single-select", inputs: ["filterId", "categoryIndex", "itemIndex", "data-test-id"], outputs: ["closeEventEmitter"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21994
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFilterItemSelectCategoryComponent, isStandalone: false, selector: "qd-filter-category-select", inputs: { filterId: "filterId", categoryIndex: "categoryIndex", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-filter__category-select" }, viewQueries: [{ propertyName: "popoverDirective", first: true, predicate: QdPopoverOnClickDirective, descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"showSelectButton$ | async\"\n [class]=\"buttonClassName\"\n [qdPopoverOnClick]=\"filterLayer\"\n [qdPopoverCloseStrategy]=\"'onOutsideClick'\"\n [qdPopoverStopPropagation]=\"true\"\n [qdPopoverMaxHeight]=\"maxFlyoutHeight\"\n [positionStrategy]=\"positionStrategy\"\n (opened)=\"onLayerOpened()\"\n (closed)=\"onLayerClosed()\"\n [attr.data-test-id]=\"testId + '-select-button'\"\n>\n <qd-icon\n *ngIf=\"!open\"\n [icon]=\"'ctrlDown'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--closed'\"\n [attr.data-test-id]=\"testId + '-closed'\"\n ></qd-icon>\n <qd-icon\n *ngIf=\"open\"\n [icon]=\"'ctrlTop'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--open'\"\n [attr.data-test-id]=\"testId + '-opened'\"\n ></qd-icon>\n\n <div class=\"qd-filter__category-button-caption\">\n <span>\n {{ i18n | translate }}\n </span>\n </div>\n\n <ng-container *ngIf=\"(isMobile$ | async) && type === 'multiSelect'; else desktopChips\">\n <qd-chip\n *ngIf=\"activeItemCount > 0\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"clearAll()\"\n [data-test-id]=\"testId + '-selected-chip-count'\"\n >{{ activeItemCount }}</qd-chip\n >\n </ng-container>\n <ng-template #desktopChips>\n <ng-container *ngTemplateOutlet=\"SelectedChip\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #filterLayer>\n <div [class]=\"layerContentClassName\">\n <qd-icon\n *ngIf=\"closeButton\"\n [class]=\"'qd-filter__category-layer-close'\"\n (click)=\"closeLayer()\"\n [icon]=\"'ctrlTop'\"\n [attr.data-test-id]=\"testId + '-layer-close'\"\n ></qd-icon>\n\n <ng-container *ngIf=\"itemsLoading$ | async; else categoryContent\" [ngTemplateOutlet]=\"loadingState\"></ng-container>\n\n <ng-template #categoryContent>\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"'multiSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container\n *ngFor=\"let entry of selectedDropdownEntries; trackBy: trackByItem\"\n [ngTemplateOutlet]=\"multiSelectItem\"\n [ngTemplateOutletContext]=\"{ item: entry.item, itemIndex: entry.itemIndex }\"\n ></ng-container>\n\n <div\n *ngIf=\"showSelectedSeparator\"\n class=\"qd-filter__category-layer-separator\"\n [attr.data-test-id]=\"testId + '-selected-separator'\"\n ></div>\n\n <ng-container\n *ngFor=\"let entry of unselectedDropdownEntries; trackBy: trackByItem\"\n [ngTemplateOutlet]=\"multiSelectItem\"\n [ngTemplateOutletContext]=\"{ item: entry.item, itemIndex: entry.itemIndex }\"\n ></ng-container>\n\n <ng-container *ngIf=\"hasNoVisibleItems\" [ngTemplateOutlet]=\"emptyState\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'singleSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <qd-filter-item-single-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n (closeEventEmitter)=\"closeLayer()\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n >\n </qd-filter-item-single-select>\n </ng-container>\n\n <ng-container *ngIf=\"hasNoVisibleItems\" [ngTemplateOutlet]=\"emptyState\"></ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #emptyState>\n <p class=\"qd-filter__category-layer-empty\" [attr.data-test-id]=\"testId + '-no-results'\">\n {{ \"i18n.qd.filter.noResults\" | translate }}\n </p>\n</ng-template>\n\n<ng-template #loadingState>\n <p class=\"qd-filter__category-layer-loading\" [attr.data-test-id]=\"testId + '-items-loading'\">\n {{ \"i18n.qd.filter.loading\" | translate }}\n </p>\n</ng-template>\n\n<ng-template #multiSelectItem let-item=\"item\" let-itemIndex=\"itemIndex\">\n <qd-filter-item-multi-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n ></qd-filter-item-multi-select>\n</ng-template>\n\n<ng-template #SelectedChip>\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <!-- TODO: Add tooltip-->\n <qd-chip\n *ngIf=\"item.active\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"close($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + item.item\"\n >{{ item.i18n | translate }}</qd-chip\n >\n </ng-container>\n</ng-template>\n", styles: ["::ng-deep .qd-filter__category-layer{position:relative;display:flex;overflow:hidden;min-width:16.25rem;max-width:56.25rem;height:100%;flex-direction:column;padding:0;border:.0625rem solid rgb(151,151,151);background:#fff;box-shadow:#d5d5d5 .125rem .25rem .4375rem}::ng-deep .qd-filter__category-layer .qd-filter-form-items__filter{flex-shrink:0;margin-bottom:0}::ng-deep .qd-filter__category-layer .qd-checkbox__label{display:flex;height:2.5rem}::ng-deep .qd-filter__category-layer .qd-checkbox__indicator,::ng-deep .qd-filter__category-layer .qd-radio-buttons__indicator{transform:translateY(-.0625rem)}::ng-deep .qd-filter__category-layer-items{flex:1;overflow-y:auto}::ng-deep .qd-filter__category-layer-separator{height:.0625rem;flex-shrink:0;background:#d5d5d5}::ng-deep .qd-filter__category-layer-empty,::ng-deep .qd-filter__category-layer-loading{padding:0 .9375rem;margin:0;color:#757575;font-size:.875rem;line-height:2.5rem}::ng-deep .qd-filter__category-layer-container{position:relative}::ng-deep .qd-filter__category-layer-close{position:absolute;z-index:1;top:.5rem;right:1rem;color:#757575;cursor:pointer}::ng-deep .qd-filter__category-layer-close:before{position:absolute;content:\"\";inset:-.5rem}::ng-deep .qd-filter__category-layer-close:hover,::ng-deep .qd-filter__category-layer-close:focus{color:#171717}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdFilterFormItemsComponent, selector: "qd-filter-form-items", inputs: ["inputFilterValue", "data-test-id"], outputs: ["filterValueChange"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon", "status"] }, { kind: "directive", type: QdPopoverOnClickDirective, selector: "[qdPopoverOnClick]", inputs: ["qdPopoverOnClick", "positionStrategy", "qdPopoverCloseStrategy", "qdPopoverDisabled", "qdPopoverStopPropagation", "qdPopoverBackgroundColor", "qdPopoverMaxHeight", "qdPopoverMinWidth", "qdPopoverMaxWidth", "qdPopoverAutoSize", "qdPopoverEnableKeyControl"], outputs: ["opened", "closed"], exportAs: ["qdPopoverOnClick"] }, { kind: "component", type: QdFilterItemMultiSelectComponent, selector: "qd-filter-item-multi-select", inputs: ["filterId", "categoryIndex", "itemIndex", "data-test-id"] }, { kind: "component", type: QdFilterItemSingleSelectComponent, selector: "qd-filter-item-single-select", inputs: ["filterId", "categoryIndex", "itemIndex", "data-test-id"], outputs: ["closeEventEmitter"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21855
21995
  }
21856
21996
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFilterItemSelectCategoryComponent, decorators: [{
21857
21997
  type: Component,
21858
- args: [{ selector: 'qd-filter-category-select', host: { class: 'qd-filter__category-select' }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div\n *ngIf=\"showSelectButton$ | async\"\n [class]=\"buttonClassName\"\n [qdPopoverOnClick]=\"filterLayer\"\n [qdPopoverCloseStrategy]=\"'onOutsideClick'\"\n [qdPopoverStopPropagation]=\"true\"\n [qdPopoverMaxHeight]=\"maxFlyoutHeight\"\n [positionStrategy]=\"positionStrategy\"\n (opened)=\"onLayerOpened()\"\n (closed)=\"onLayerClosed()\"\n [attr.data-test-id]=\"testId + '-select-button'\"\n>\n <qd-icon\n *ngIf=\"!open\"\n [icon]=\"'ctrlDown'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--closed'\"\n [attr.data-test-id]=\"testId + '-closed'\"\n ></qd-icon>\n <qd-icon\n *ngIf=\"open\"\n [icon]=\"'ctrlTop'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--open'\"\n [attr.data-test-id]=\"testId + '-opened'\"\n ></qd-icon>\n\n <div class=\"qd-filter__category-button-caption\">\n <span>\n {{ i18n | translate }}\n </span>\n </div>\n\n <ng-container *ngTemplateOutlet=\"SelectedChip\"></ng-container>\n</div>\n\n<ng-template #filterLayer>\n <div [class]=\"layerContentClassName\">\n <qd-icon\n *ngIf=\"closeButton\"\n [class]=\"'qd-filter__category-layer-close'\"\n (click)=\"closeLayer()\"\n [icon]=\"'timesLargeLight'\"\n [attr.data-test-id]=\"testId + '-layer-close'\"\n ></qd-icon>\n\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"'multiSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <qd-filter-item-multi-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n >\n </qd-filter-item-multi-select>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'singleSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <qd-filter-item-single-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n (closeEventEmitter)=\"closeLayer()\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n >\n </qd-filter-item-single-select>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #SelectedChip>\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <!-- TODO: Add tooltip-->\n <qd-chip\n *ngIf=\"item.active\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"close($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + item.item\"\n >{{ item.i18n | translate }}</qd-chip\n >\n </ng-container>\n</ng-template>\n", styles: ["::ng-deep .qd-filter__category-layer{display:flex;overflow:hidden;min-width:16.25rem;max-width:56.25rem;height:100%;flex-direction:column;padding:1rem 0 0;border:.0625rem solid rgb(151,151,151);background:#fff;box-shadow:#d5d5d5 .125rem .25rem .4375rem}::ng-deep .qd-filter__category-layer .qd-filter-form-items__filter{flex-shrink:0;margin-bottom:0}::ng-deep .qd-filter__category-layer .qd-checkbox__label{display:flex;height:2.5rem}::ng-deep .qd-filter__category-layer .qd-checkbox__indicator,::ng-deep .qd-filter__category-layer .qd-radio-buttons__indicator{transform:translateY(-.0625rem)}::ng-deep .qd-filter__category-layer-items{flex:1;overflow-y:auto}::ng-deep .qd-filter__category-layer-container{position:relative}::ng-deep .qd-filter__category-layer-close{position:absolute;z-index:1;top:1rem;right:1rem;color:#757575;cursor:pointer}::ng-deep .qd-filter__category-layer-close:before{position:absolute;content:\"\";inset:-.5rem}::ng-deep .qd-filter__category-layer-close:hover,::ng-deep .qd-filter__category-layer-close:focus{color:#171717}\n"] }]
21998
+ args: [{ selector: 'qd-filter-category-select', host: { class: 'qd-filter__category-select' }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div\n *ngIf=\"showSelectButton$ | async\"\n [class]=\"buttonClassName\"\n [qdPopoverOnClick]=\"filterLayer\"\n [qdPopoverCloseStrategy]=\"'onOutsideClick'\"\n [qdPopoverStopPropagation]=\"true\"\n [qdPopoverMaxHeight]=\"maxFlyoutHeight\"\n [positionStrategy]=\"positionStrategy\"\n (opened)=\"onLayerOpened()\"\n (closed)=\"onLayerClosed()\"\n [attr.data-test-id]=\"testId + '-select-button'\"\n>\n <qd-icon\n *ngIf=\"!open\"\n [icon]=\"'ctrlDown'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--closed'\"\n [attr.data-test-id]=\"testId + '-closed'\"\n ></qd-icon>\n <qd-icon\n *ngIf=\"open\"\n [icon]=\"'ctrlTop'\"\n [class]=\"'qd-filter__category-icon qd-filter__category-icon--open'\"\n [attr.data-test-id]=\"testId + '-opened'\"\n ></qd-icon>\n\n <div class=\"qd-filter__category-button-caption\">\n <span>\n {{ i18n | translate }}\n </span>\n </div>\n\n <ng-container *ngIf=\"(isMobile$ | async) && type === 'multiSelect'; else desktopChips\">\n <qd-chip\n *ngIf=\"activeItemCount > 0\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"clearAll()\"\n [data-test-id]=\"testId + '-selected-chip-count'\"\n >{{ activeItemCount }}</qd-chip\n >\n </ng-container>\n <ng-template #desktopChips>\n <ng-container *ngTemplateOutlet=\"SelectedChip\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #filterLayer>\n <div [class]=\"layerContentClassName\">\n <qd-icon\n *ngIf=\"closeButton\"\n [class]=\"'qd-filter__category-layer-close'\"\n (click)=\"closeLayer()\"\n [icon]=\"'ctrlTop'\"\n [attr.data-test-id]=\"testId + '-layer-close'\"\n ></qd-icon>\n\n <ng-container *ngIf=\"itemsLoading$ | async; else categoryContent\" [ngTemplateOutlet]=\"loadingState\"></ng-container>\n\n <ng-template #categoryContent>\n <ng-container [ngSwitch]=\"type\">\n <ng-container *ngSwitchCase=\"'multiSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container\n *ngFor=\"let entry of selectedDropdownEntries; trackBy: trackByItem\"\n [ngTemplateOutlet]=\"multiSelectItem\"\n [ngTemplateOutletContext]=\"{ item: entry.item, itemIndex: entry.itemIndex }\"\n ></ng-container>\n\n <div\n *ngIf=\"showSelectedSeparator\"\n class=\"qd-filter__category-layer-separator\"\n [attr.data-test-id]=\"testId + '-selected-separator'\"\n ></div>\n\n <ng-container\n *ngFor=\"let entry of unselectedDropdownEntries; trackBy: trackByItem\"\n [ngTemplateOutlet]=\"multiSelectItem\"\n [ngTemplateOutletContext]=\"{ item: entry.item, itemIndex: entry.itemIndex }\"\n ></ng-container>\n\n <ng-container *ngIf=\"hasNoVisibleItems\" [ngTemplateOutlet]=\"emptyState\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'singleSelect'\">\n <qd-filter-form-items\n *ngIf=\"filter\"\n [inputFilterValue]=\"filterCategoryValue$ | async\"\n (filterValueChange)=\"changeValue($event)\"\n [data-test-id]=\"testId\"\n ></qd-filter-form-items>\n\n <div class=\"qd-filter__category-layer-items\">\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <qd-filter-item-single-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n (closeEventEmitter)=\"closeLayer()\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n >\n </qd-filter-item-single-select>\n </ng-container>\n\n <ng-container *ngIf=\"hasNoVisibleItems\" [ngTemplateOutlet]=\"emptyState\"></ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #emptyState>\n <p class=\"qd-filter__category-layer-empty\" [attr.data-test-id]=\"testId + '-no-results'\">\n {{ \"i18n.qd.filter.noResults\" | translate }}\n </p>\n</ng-template>\n\n<ng-template #loadingState>\n <p class=\"qd-filter__category-layer-loading\" [attr.data-test-id]=\"testId + '-items-loading'\">\n {{ \"i18n.qd.filter.loading\" | translate }}\n </p>\n</ng-template>\n\n<ng-template #multiSelectItem let-item=\"item\" let-itemIndex=\"itemIndex\">\n <qd-filter-item-multi-select\n *ngIf=\"!item.hidden\"\n [categoryIndex]=\"categoryIndex\"\n [itemIndex]=\"itemIndex\"\n [filterId]=\"filterId\"\n [data-test-id]=\"testId + '-item-' + itemIndex + '-' + item.item\"\n ></qd-filter-item-multi-select>\n</ng-template>\n\n<ng-template #SelectedChip>\n <ng-container *ngFor=\"let item of items; let itemIndex = index\">\n <!-- TODO: Add tooltip-->\n <qd-chip\n *ngIf=\"item.active\"\n [state]=\"'filter'\"\n [close]=\"true\"\n (closeClickEmitter)=\"close($event)\"\n [data]=\"itemIndex\"\n [data-test-id]=\"testId + '-selected-chip-' + item.item\"\n >{{ item.i18n | translate }}</qd-chip\n >\n </ng-container>\n</ng-template>\n", styles: ["::ng-deep .qd-filter__category-layer{position:relative;display:flex;overflow:hidden;min-width:16.25rem;max-width:56.25rem;height:100%;flex-direction:column;padding:0;border:.0625rem solid rgb(151,151,151);background:#fff;box-shadow:#d5d5d5 .125rem .25rem .4375rem}::ng-deep .qd-filter__category-layer .qd-filter-form-items__filter{flex-shrink:0;margin-bottom:0}::ng-deep .qd-filter__category-layer .qd-checkbox__label{display:flex;height:2.5rem}::ng-deep .qd-filter__category-layer .qd-checkbox__indicator,::ng-deep .qd-filter__category-layer .qd-radio-buttons__indicator{transform:translateY(-.0625rem)}::ng-deep .qd-filter__category-layer-items{flex:1;overflow-y:auto}::ng-deep .qd-filter__category-layer-separator{height:.0625rem;flex-shrink:0;background:#d5d5d5}::ng-deep .qd-filter__category-layer-empty,::ng-deep .qd-filter__category-layer-loading{padding:0 .9375rem;margin:0;color:#757575;font-size:.875rem;line-height:2.5rem}::ng-deep .qd-filter__category-layer-container{position:relative}::ng-deep .qd-filter__category-layer-close{position:absolute;z-index:1;top:.5rem;right:1rem;color:#757575;cursor:pointer}::ng-deep .qd-filter__category-layer-close:before{position:absolute;content:\"\";inset:-.5rem}::ng-deep .qd-filter__category-layer-close:hover,::ng-deep .qd-filter__category-layer-close:focus{color:#171717}\n"] }]
21859
21999
  }], propDecorators: { filterId: [{
21860
22000
  type: Input
21861
22001
  }], categoryIndex: [{
@@ -22106,11 +22246,17 @@ class QdDependentFiltersService {
22106
22246
  return this.categories.filter(category => category.hasOwnProperty('dependsOn'));
22107
22247
  }
22108
22248
  resolveItemsWhenDependsOnCategoriesChange(dependentCategory) {
22249
+ const dependentCategoryIndex = this.categories.indexOf(dependentCategory);
22109
22250
  return combineLatest(dependentCategory.dependsOn.map(dependsOnCategory => this.filterService.getCategoryById$(this.filterId, this.categories.findIndex(({ category }) => category === dependsOnCategory)))).pipe(distinctUntilChanged(isEqual), switchMap(parentCategories => {
22110
22251
  const allParentsActive = parentCategories.every((parent) => Array.isArray(parent.items) && parent.items.some(item => item.active));
22111
- if (!allParentsActive)
22252
+ if (!allParentsActive) {
22253
+ this.filterService.setItemsLoading(this.filterId, dependentCategoryIndex, false);
22112
22254
  return of([]);
22113
- return dependentCategory.itemsResolver(parentCategories);
22255
+ }
22256
+ this.filterService.setItemsLoading(this.filterId, dependentCategoryIndex, true);
22257
+ return dependentCategory
22258
+ .itemsResolver(parentCategories)
22259
+ .pipe(tap$1(() => this.filterService.setItemsLoading(this.filterId, dependentCategoryIndex, false)));
22114
22260
  }));
22115
22261
  }
22116
22262
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdDependentFiltersService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -22122,43 +22268,123 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
22122
22268
 
22123
22269
  // @ts-strict-ignore
22124
22270
  /**
22125
- * The **QdFilter** is responsible for the filtering of data.
22271
+ * **QdFilterComponent** lets users build and apply a filter with several categories over a data set.
22272
+ *
22273
+ * #### **Features**
22274
+ *
22275
+ * - **Category types**: single and multi select dropdowns, a boolean toggle, date and date-time pickers, date and date-time ranges, and free text. A select dropdown can also show a filter field that narrows the item list.
22276
+ * - **Outputs**: react to the applied selection through the query-string and post-body outputs, or read the current selection at any time.
22277
+ * - **Multi-staging**: chain categories so one stage loads its items from the selection of another.
22278
+ * - **URL sync**: the selection is kept in the URL, so a view can be shared, bookmarked, and reopened.
22279
+ *
22280
+ * #### **Quick start**
22281
+ *
22282
+ * **1. Add the filter to the template**
22283
+ *
22284
+ * ```html
22285
+ * <qd-filter
22286
+ * [filterData]="myFilterConfig"
22287
+ * (queryStringOutput)="callBackendWithQueryString($event)"
22288
+ * (postBodyOutput)="callBackendWithResultObject($event)"
22289
+ * ></qd-filter>
22290
+ * ```
22291
+ *
22292
+ * **2. Define the config in your component**
22293
+ *
22294
+ * ```typescript
22295
+ * myFilterConfig: QdFilterConfigData = {
22296
+ * categories: [
22297
+ * {
22298
+ * type: 'singleSelect',
22299
+ * category: 'controlObject',
22300
+ * i18n: 'i18n.my.category.controlObject',
22301
+ * items: [
22302
+ * { item: 'vehicle', i18n: 'i18n.my.item.vehicle', active: true },
22303
+ * { item: 'article', i18n: 'i18n.my.item.article' }
22304
+ * ],
22305
+ * filter: true
22306
+ * },
22307
+ * {
22308
+ * type: 'multiSelect',
22309
+ * category: 'enrollmentCountry',
22310
+ * i18n: 'i18n.my.category.enrollmentCountry',
22311
+ * items: [
22312
+ * { item: 'de', i18n: 'i18n.my.item.de' },
22313
+ * { item: 'ch', i18n: 'i18n.my.item.ch' }
22314
+ * ]
22315
+ * }
22316
+ * ],
22317
+ * uid: 'overview-filter'
22318
+ * };
22319
+ * ```
22320
+ *
22321
+ * The `filterData` input is the only configuration. It holds the categories and the behavior flags.
22126
22322
  *
22127
- * Hirarchical structure::
22128
- * - **Filter**: Name of the component.
22129
- * - **Categories**: A list of one or more different categories.
22130
- * - **Items**: A list with one or more items belongs to a parent category.
22323
+ * #### **Category types**
22131
22324
  *
22132
- * ### Filter selection ###
22325
+ * A category sets its type to one of: singleSelect, multiSelect, boolean, date, dateTime,
22326
+ * dateRange, dateTimeRange or freeText. Single and multi select show a dropdown, boolean is a
22327
+ * toggle, the date types open a picker (the date-time variants add a time picker), and free text
22328
+ * is a text field applied on enter.
22133
22329
  *
22134
- * To get the applied filters you can listen to the outputs `(queryStringOutput)` and `(postBodyOutput)`.
22135
- * These outputs will be emitted when the filter is triggered. The `(queryStringOutput)` returns
22136
- * the applied filters as an url string with an encoded *filter* parameter. The `(postBodyOutput)`
22137
- * yields an object containing the categories and active items.
22330
+ * On a single or multi select you can add a filter field above the items with `filter: true` to
22331
+ * narrow the item list. It has no effect on the other types.
22138
22332
  *
22139
- * In addition to the outputs, you also can query the current filter selection with the
22140
- * filter component methods `getCurrentQueryString`, `getCurrentFilterUrlParameterString` and `getCurrentPostBody`.
22333
+ * #### **Filter selection**
22141
22334
  *
22142
- * ### Preserve filter state ###
22335
+ * Listen to the outputs to react when the user applies the filter. The query-string output gives
22336
+ * the selection as a URL string (for example filter=...); the post-body output gives it as an
22337
+ * object with the active categories and their values.
22143
22338
  *
22144
- * To preserve the filter state when navigating, for example between detail and overview page, you just have to define
22145
- * a uid in the filter data config.
22339
+ * The outputs fire when the user applies the filter, on reset (only when a preselection exists),
22340
+ * when the last active item is removed, and on load if a category starts active.
22146
22341
  *
22147
- * ### Multi Staging Filters
22342
+ * To read the selection without waiting for an apply, call `getCurrentQueryString` or
22343
+ * `getCurrentPostBody`, or subscribe to `getFilterChanges$` for a continuous stream.
22148
22344
  *
22149
- * To build a dependency chain of filters you can use the `dependsOn` property of a filter that depends on
22150
- * other filters. In the `dependsOn` property you set the names of the filter categories the category depends on.
22151
- * Always when one of these categories change the `itemsResolver` will be called with the list
22152
- * of categories given in `dependsOn`. The `itemsResolver` can also be defined in the config where `dependsOn`
22153
- * is also defined.
22345
+ * #### **Multi-staging filters**
22154
22346
  *
22155
- * If the items resolver has not been called yet or when it returns an empty array of items,
22156
- * the corresponding filter stage won't be rendered.
22347
+ * To chain categories, give one a `dependsOn` list and an `itemsResolver`. In `dependsOn` you
22348
+ * name the parent categories. The resolver receives the active parents and returns the items for
22349
+ * this stage.
22157
22350
  *
22158
- * #### Support
22351
+ * ```typescript
22352
+ * const cityCategory: QdDependentFilterCategory = {
22353
+ * type: 'multiSelect',
22354
+ * category: 'city',
22355
+ * i18n: 'i18n.my.category.city',
22356
+ * dependsOn: ['country'],
22357
+ * itemsResolver: ([country]) =>
22358
+ * loadCitiesFor(country.items.filter(item => item.active)),
22359
+ * filter: true
22360
+ * };
22361
+ * ```
22362
+ *
22363
+ * The stage appears once every parent has an active item. While its items load, the open
22364
+ * dropdown shows a loading text instead of the list. If the resolver returns nothing, the list
22365
+ * stays empty. Multi-staging works only for single and multi select categories.
22366
+ *
22367
+ * #### **URL synchronization**
22159
22368
  *
22160
- * Multi Staging Filters only work for `singleSelect` and `multiSelect` filters.
22369
+ * The filter keeps its selection in the URL filter parameter: it is saved when the selection
22370
+ * changes and read back when the page opens, so a user can share or bookmark the URL and return
22371
+ * to the same filter.
22161
22372
  *
22373
+ * This is on by default. With more than one filter in a view, only one may own the URL, so set
22374
+ * `connectWithRouter` to false on every other filter.
22375
+ *
22376
+ * #### **Preserve filter state**
22377
+ *
22378
+ * Give the config a stable `uid` to keep the selection while the user moves around the app, for
22379
+ * example from an overview to a detail page and back. The selection is restored the next time a
22380
+ * filter with the same `uid` is shown.
22381
+ *
22382
+ * #### **Reset behavior**
22383
+ *
22384
+ * An item set to active is a preselection. The reset button reads "Reset" when there is no
22385
+ * preselection, and "Back to preselection" when the config starts with active items. It restores
22386
+ * the initial state. With instant filtering (`isInstantFiltering`) the apply and reset buttons
22387
+ * are hidden and the filter applies on every change.
22162
22388
  */
22163
22389
  class QdFilterComponent {
22164
22390
  filterService = inject(QdFilterService);
@@ -30190,8 +30416,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
30190
30416
  /**
30191
30417
  * **QdPageTabHeader* renders the header of a single tab. It is used quadrel-internally.
30192
30418
  */
30193
- class QdPageTabHeaderComponent extends CdkStepHeader {
30194
- STEP_STATE = STEP_STATE;
30419
+ class QdPageTabHeaderComponent {
30195
30420
  /** State of the given tab. */
30196
30421
  state;
30197
30422
  /** Label of the given tab. */
@@ -30208,24 +30433,21 @@ class QdPageTabHeaderComponent extends CdkStepHeader {
30208
30433
  * A static test ID for integration tests can be set.
30209
30434
  */
30210
30435
  testId;
30211
- constructor() {
30212
- const elementRef = inject(ElementRef);
30213
- super(elementRef);
30214
- }
30215
30436
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30216
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageTabHeaderComponent, isStandalone: true, selector: "qd-page-tab-header", inputs: { state: "state", label: "label", counters: "counters", index: "index", isSelected: "isSelected", isDisabled: "isDisabled", testId: ["data-test-id", "testId"] }, host: { properties: { "attr.data-test-id": "testId", "class.qd-tab-current": "isSelected && !isDisabled", "class.qd-tab-disabled": "isDisabled", "class.qd-tab-done": "state === STEP_STATE.DONE", "class.qd-tab-edit": "state === STEP_STATE.EDIT", "class.qd-tab-error": "state === STEP_STATE.ERROR" } }, usesInheritance: true, ngImport: i0, template: "<span class=\"qd-tab-caption\">\n {{ label }}\n <qd-page-tab-header-counters [counters]=\"counters\" [data-test-id]=\"testId + '-counters'\" />\n</span>\n", styles: [":host{position:relative;display:inline-flex;height:2.5rem;padding:.625rem 0;cursor:pointer;color:#757575;font-size:14px;font-weight:400;line-height:18px}:host .qd-tab-caption{font-weight:500;white-space:nowrap}:host:hover,:host.qd-tab-current{color:#069}:host.qd-tab-current .qd-tab-caption{position:relative}:host.qd-tab-current .qd-tab-caption:after{position:absolute;bottom:-.6875rem;left:0;display:inline-block;width:100%;height:.25rem;background-color:#069;content:\"\"}:host.qd-tab-done,:host.qd-tab-edit{color:#171717}:host.qd-tab-error{color:#c70023}:host.qd-tab-disabled{color:#b4b4b4;cursor:default}:host.qd-tab-disabled:hover{color:#b4b4b4}\n"], dependencies: [{ kind: "component", type: QdPageTabHeaderCountersComponent, selector: "qd-page-tab-header-counters", inputs: ["counters", "data-test-id"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
30437
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageTabHeaderComponent, isStandalone: true, selector: "qd-page-tab-header", inputs: { state: "state", label: "label", counters: "counters", index: "index", isSelected: "isSelected", isDisabled: "isDisabled", testId: ["data-test-id", "testId"] }, host: { attributes: { "role": "tab" }, properties: { "attr.data-test-id": "testId", "class.qd-tab-current": "isSelected && !isDisabled", "class.qd-tab-disabled": "isDisabled", "class.qd-tab-done": "state === 'done'", "class.qd-tab-edit": "state === 'edit'", "class.qd-tab-error": "state === 'error'" } }, ngImport: i0, template: "<span class=\"qd-tab-caption\">\n {{ label }}\n <qd-page-tab-header-counters [counters]=\"counters\" [data-test-id]=\"testId + '-counters'\" />\n</span>\n", styles: [":host{position:relative;display:inline-flex;height:2.5rem;padding:.625rem 0;cursor:pointer;color:#757575;font-size:14px;font-weight:400;line-height:18px}:host .qd-tab-caption{font-weight:500;white-space:nowrap}:host:hover,:host.qd-tab-current{color:#069}:host.qd-tab-current .qd-tab-caption{position:relative}:host.qd-tab-current .qd-tab-caption:after{position:absolute;bottom:-.6875rem;left:0;display:inline-block;width:100%;height:.25rem;background-color:#069;content:\"\"}:host.qd-tab-done,:host.qd-tab-edit{color:#171717}:host.qd-tab-error{color:#c70023}:host.qd-tab-disabled{color:#b4b4b4;cursor:default}:host.qd-tab-disabled:hover{color:#b4b4b4}\n"], dependencies: [{ kind: "component", type: QdPageTabHeaderCountersComponent, selector: "qd-page-tab-header-counters", inputs: ["counters", "data-test-id"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
30217
30438
  }
30218
30439
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabHeaderComponent, decorators: [{
30219
30440
  type: Component,
30220
30441
  args: [{ selector: 'qd-page-tab-header', changeDetection: ChangeDetectionStrategy.OnPush, host: {
30221
30442
  '[attr.data-test-id]': 'testId',
30443
+ role: 'tab',
30222
30444
  '[class.qd-tab-current]': 'isSelected && !isDisabled',
30223
30445
  '[class.qd-tab-disabled]': 'isDisabled',
30224
- '[class.qd-tab-done]': 'state === STEP_STATE.DONE',
30225
- '[class.qd-tab-edit]': 'state === STEP_STATE.EDIT',
30226
- '[class.qd-tab-error]': 'state === STEP_STATE.ERROR'
30446
+ '[class.qd-tab-done]': "state === 'done'",
30447
+ '[class.qd-tab-edit]': "state === 'edit'",
30448
+ '[class.qd-tab-error]': "state === 'error'"
30227
30449
  }, standalone: true, imports: [QdPageTabHeaderCountersComponent], template: "<span class=\"qd-tab-caption\">\n {{ label }}\n <qd-page-tab-header-counters [counters]=\"counters\" [data-test-id]=\"testId + '-counters'\" />\n</span>\n", styles: [":host{position:relative;display:inline-flex;height:2.5rem;padding:.625rem 0;cursor:pointer;color:#757575;font-size:14px;font-weight:400;line-height:18px}:host .qd-tab-caption{font-weight:500;white-space:nowrap}:host:hover,:host.qd-tab-current{color:#069}:host.qd-tab-current .qd-tab-caption{position:relative}:host.qd-tab-current .qd-tab-caption:after{position:absolute;bottom:-.6875rem;left:0;display:inline-block;width:100%;height:.25rem;background-color:#069;content:\"\"}:host.qd-tab-done,:host.qd-tab-edit{color:#171717}:host.qd-tab-error{color:#c70023}:host.qd-tab-disabled{color:#b4b4b4;cursor:default}:host.qd-tab-disabled:hover{color:#b4b4b4}\n"] }]
30228
- }], ctorParameters: () => [], propDecorators: { state: [{
30450
+ }], propDecorators: { state: [{
30229
30451
  type: Input
30230
30452
  }], label: [{
30231
30453
  type: Input
@@ -30242,13 +30464,112 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
30242
30464
  args: ['data-test-id']
30243
30465
  }] } });
30244
30466
 
30467
+ // @ts-strict-ignore
30468
+ /**
30469
+ * The **QdPageTab** is a single tab inside the **QdPageTabs** within a **QdPage**.
30470
+ */
30471
+ class QdPageTabComponent {
30472
+ _pageTabs = inject(forwardRef(() => QdPageTabsComponent));
30473
+ translate = inject(TranslateService);
30474
+ /**
30475
+ * Configuration of QdPageTabComponent.
30476
+ *
30477
+ * * @note The use of CDK attributes is not permitted. Please configure this component here.
30478
+ */
30479
+ config;
30480
+ /** Form control for this tab. */
30481
+ set tabControl(tabControl) {
30482
+ this.stepControl = tabControl;
30483
+ }
30484
+ get tabControl() {
30485
+ return this.stepControl;
30486
+ }
30487
+ infoBanners;
30488
+ content;
30489
+ stepControl;
30490
+ interacted = false;
30491
+ editable = true;
30492
+ get completed() {
30493
+ if (!this.interacted)
30494
+ return false;
30495
+ const control = this.tabControl;
30496
+ if (!control)
30497
+ return true;
30498
+ return !control.invalid && !control.pending;
30499
+ }
30500
+ get hasError() {
30501
+ return this.interacted && !!this.tabControl?.invalid;
30502
+ }
30503
+ _destroyed$ = new Subject();
30504
+ select() {
30505
+ const index = this._pageTabs.tabs.toArray().indexOf(this);
30506
+ if (index >= 0)
30507
+ this._pageTabs.selectedIndex = index;
30508
+ }
30509
+ ngOnInit() {
30510
+ this.validateLabel();
30511
+ if (this.tabControl)
30512
+ this.initErrorCheck();
30513
+ }
30514
+ ngOnChanges(changes) {
30515
+ ['label', 'errorMessage', 'state']
30516
+ .filter(inputName => !!changes[inputName])
30517
+ .forEach(inputName => this.blockCdkInput(inputName));
30518
+ }
30519
+ ngOnDestroy() {
30520
+ this._destroyed$.complete();
30521
+ }
30522
+ blockCdkInput(inputName) {
30523
+ throw new Error(`Quadrel Framework | QdPageTab - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabConfig instead.`);
30524
+ }
30525
+ validateLabel() {
30526
+ if (!this.config?.label?.i18n)
30527
+ console.error('Quadrel Framework | QdPageTab - Please provide a label for the tab.');
30528
+ }
30529
+ initErrorCheck() {
30530
+ this.tabControl.statusChanges.pipe(takeUntil$1(this._destroyed$)).subscribe(() => {
30531
+ if (this.hasAnyError(this.tabControl)) {
30532
+ this.interacted = true;
30533
+ }
30534
+ this._pageTabs._stateChanged();
30535
+ });
30536
+ }
30537
+ hasAnyError(control) {
30538
+ if (control.errors && control.touched)
30539
+ return true;
30540
+ if (control instanceof FormGroup) {
30541
+ return Object.values(control.controls).some(control => this.hasAnyError(control));
30542
+ }
30543
+ if (control instanceof FormArray) {
30544
+ return control.controls.some(control => this.hasAnyError(control));
30545
+ }
30546
+ return false;
30547
+ }
30548
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30549
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageTabComponent, isStandalone: true, selector: "qd-page-tab", inputs: { config: "config", tabControl: "tabControl" }, queries: [{ propertyName: "infoBanners", predicate: QdPageInfoBannerComponent }], viewQueries: [{ propertyName: "content", first: true, predicate: TemplateRef, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template>\n <div class=\"page-info-banners\">\n <ng-content select=\"qd-page-info-banner\"></ng-content>\n </div>\n\n <ng-content></ng-content>\n</ng-template>\n", styles: [".page-info-banners:has(>qd-page-info-banner:not(.qd-page-info-banner-empty)){padding:1rem 1.25rem .5rem;border-bottom:rgb(213,213,213) solid .0625rem;background-color:#fff}.page-info-banners>qd-page-info-banner:last-child{margin-bottom:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
30550
+ }
30551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, decorators: [{
30552
+ type: Component,
30553
+ args: [{ selector: 'qd-page-tab', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<ng-template>\n <div class=\"page-info-banners\">\n <ng-content select=\"qd-page-info-banner\"></ng-content>\n </div>\n\n <ng-content></ng-content>\n</ng-template>\n", styles: [".page-info-banners:has(>qd-page-info-banner:not(.qd-page-info-banner-empty)){padding:1rem 1.25rem .5rem;border-bottom:rgb(213,213,213) solid .0625rem;background-color:#fff}.page-info-banners>qd-page-info-banner:last-child{margin-bottom:0}\n"] }]
30554
+ }], propDecorators: { config: [{
30555
+ type: Input
30556
+ }], tabControl: [{
30557
+ type: Input
30558
+ }], infoBanners: [{
30559
+ type: ContentChildren,
30560
+ args: [QdPageInfoBannerComponent]
30561
+ }], content: [{
30562
+ type: ViewChild,
30563
+ args: [TemplateRef, { static: true }]
30564
+ }] } });
30565
+
30245
30566
  const TAB_PARAM_NAME = 'tab';
30246
30567
  const OWNED_PARAMS = [TAB_PARAM_NAME];
30247
30568
  const FEATURE_LABEL = { name: 'Page Tabs', plural: 'page tabs' };
30248
30569
  /**
30249
30570
  * Per-view adapter that syncs `QdPageTabsComponent` selection with the URL `?tab=` query
30250
30571
  * param via `QdRouterQueryParamHubService`. Reads on activation and selects the matching
30251
- * tab (with fallback for unknown/disabled names), writes on `selectionChange`. Coordination,
30572
+ * tab (with fallback for unknown/disabled names), writes on `tabSelection`. Coordination,
30252
30573
  * ownership, and write batching are delegated to the hub — see its JSDoc for details.
30253
30574
  * Behavior contracts live in `page-tabs-router-connector.service.spec.ts` and
30254
30575
  * `router-query-param-hub.integration.cy.ts`.
@@ -30259,9 +30580,9 @@ const FEATURE_LABEL = { name: 'Page Tabs', plural: 'page tabs' };
30259
30580
  * write pipeline (see commit 57f0a271a).
30260
30581
  *
30261
30582
  * Internal invariant: when the requested tab is unknown or disabled, `selectFallbackTab()`
30262
- * writes the URL explicitly. CdkStepper does not emit `selectionChange` if the fallback is
30263
- * already the selected step, so without the explicit write deep-links like `?tab=phantom`
30264
- * would leave a stale param in the URL.
30583
+ * writes the URL explicitly. `tabSelection` is not emitted if the fallback is already
30584
+ * the selected tab, so without the explicit write deep-links like `?tab=phantom` would
30585
+ * leave a stale param in the URL.
30265
30586
  */
30266
30587
  class QdPageTabsRouterConnectorService {
30267
30588
  _hub = inject(QdRouterQueryParamHubService);
@@ -30310,8 +30631,8 @@ class QdPageTabsRouterConnectorService {
30310
30631
  }
30311
30632
  subscribeToTabChanges() {
30312
30633
  const component = this._connectedComponent;
30313
- this._writeSubscription = component.selectionChange
30314
- .pipe(map(event => event.selectedStep?.config?.name), takeUntilDestroyed(this._destroyRef))
30634
+ this._writeSubscription = component.tabSelection
30635
+ .pipe(map(event => event.selectedTab?.config?.name), takeUntilDestroyed(this._destroyRef))
30315
30636
  .subscribe(name => this.writeUrl(name));
30316
30637
  }
30317
30638
  writeUrl(name) {
@@ -30547,10 +30868,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
30547
30868
  * - If an invalid tab name is provided in URL, the first available tab is selected
30548
30869
  * - If no tab parameter is present, the `selectedIndex` or first non-disabled tab is selected
30549
30870
  */
30550
- class QdPageTabsComponent extends CdkStepper {
30871
+ class QdPageTabsComponent {
30551
30872
  footerService = inject(QdPageFooterService, { optional: true });
30552
30873
  pageStoreService = inject(QdPageStoreService);
30553
30874
  routerConnector = inject(QdPageTabsRouterConnectorService);
30875
+ _changeDetectorRef = inject(ChangeDetectorRef);
30876
+ destroyRef = inject(DestroyRef);
30877
+ static _idCounter = 0;
30878
+ _id = QdPageTabsComponent._idCounter++;
30554
30879
  get hasPageFooter() {
30555
30880
  return !!this.footerService;
30556
30881
  }
@@ -30563,23 +30888,45 @@ class QdPageTabsComponent extends CdkStepper {
30563
30888
  */
30564
30889
  testId = 'page-tabs';
30565
30890
  tabSelection = new EventEmitter();
30891
+ _tabs;
30892
+ linear = false;
30893
+ _selectedIndex = 0;
30566
30894
  _viewonly;
30567
- destroyRef = inject(DestroyRef);
30568
30895
  get tabs() {
30569
- return this.steps;
30896
+ return this._tabs;
30570
30897
  }
30571
30898
  get selected() {
30572
- return super.selected;
30899
+ return this._tabs?.get(this._selectedIndex);
30573
30900
  }
30574
- set selected(step) {
30575
- super.selected = step;
30901
+ set selected(tab) {
30902
+ if (!tab)
30903
+ return;
30904
+ const index = this._tabs?.toArray().indexOf(tab);
30905
+ if (index !== undefined && index >= 0) {
30906
+ this.selectedIndex = index;
30907
+ }
30576
30908
  }
30577
- constructor() {
30578
- const _dir = inject(Directionality, { optional: true });
30579
- const _changeDetectorRef = inject(ChangeDetectorRef);
30580
- const _elementRef = inject(ElementRef);
30581
- super(_dir, _changeDetectorRef, _elementRef);
30582
- this.mapSelectionChangeToTabSelectionOutput();
30909
+ get selectedIndex() {
30910
+ return this._selectedIndex;
30911
+ }
30912
+ set selectedIndex(newIndex) {
30913
+ if (newIndex === this._selectedIndex)
30914
+ return;
30915
+ const prevIndex = this._selectedIndex;
30916
+ const prevTab = this._tabs?.get(prevIndex);
30917
+ if (prevTab?.tabControl) {
30918
+ prevTab.interacted = true;
30919
+ }
30920
+ this._selectedIndex = newIndex;
30921
+ if (this._tabs) {
30922
+ this.tabSelection.emit({
30923
+ selectedIndex: newIndex,
30924
+ previouslySelectedIndex: prevIndex,
30925
+ selectedTab: this._tabs.get(newIndex),
30926
+ previouslySelectedTab: this._tabs.get(prevIndex)
30927
+ });
30928
+ }
30929
+ this._changeDetectorRef.markForCheck();
30583
30930
  }
30584
30931
  ngOnInit() {
30585
30932
  this.linear = false;
@@ -30593,24 +30940,10 @@ class QdPageTabsComponent extends CdkStepper {
30593
30940
  .filter(inputName => !!changes[inputName])
30594
30941
  .forEach(inputName => this.blockCdkInput(inputName));
30595
30942
  }
30596
- _getIndicatorType(index, state) {
30597
- if (state)
30598
- return state;
30599
- const step = this.steps.get(index);
30600
- if (!step)
30601
- return 'number';
30602
- if (step.hasError)
30603
- return 'error';
30604
- if (step.completed)
30605
- return step.editable ? 'edit' : 'done';
30606
- return 'number';
30607
- }
30608
30943
  ngAfterContentInit() {
30609
- super.ngAfterContentInit();
30610
- this.tabs.changes.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this._stateChanged());
30944
+ this._tabs.changes.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this._stateChanged());
30611
30945
  }
30612
30946
  ngAfterViewInit() {
30613
- super.ngAfterViewInit();
30614
30947
  setTimeout(() => {
30615
30948
  if (this.config?.connectWithRouter) {
30616
30949
  this.configureBookmarkableTabs();
@@ -30619,9 +30952,42 @@ class QdPageTabsComponent extends CdkStepper {
30619
30952
  this.initializeTabSelection();
30620
30953
  });
30621
30954
  }
30955
+ _stateChanged() {
30956
+ this._changeDetectorRef.markForCheck();
30957
+ }
30958
+ _getIndicatorType(index) {
30959
+ const tab = this._tabs.get(index);
30960
+ if (!tab)
30961
+ return 'number';
30962
+ if (tab.hasError && !this._viewonly)
30963
+ return 'error';
30964
+ if (tab.completed)
30965
+ return tab.editable ? 'edit' : 'done';
30966
+ return 'number';
30967
+ }
30968
+ _getTabLabelId(i) {
30969
+ return `qd-tabs-${this._id}-label-${i}`;
30970
+ }
30971
+ save() {
30972
+ this.selected?.tabControl?.markAllAsTouched();
30973
+ const tabControlValues = this._tabs.map(tab => tab.tabControl?.value);
30974
+ this.config?.submitButton?.handler?.(tabControlValues);
30975
+ }
30976
+ selectTab(tab) {
30977
+ if (tab.config?.isDisabled)
30978
+ return;
30979
+ tab.select();
30980
+ }
30981
+ isSubmitButtonShown() {
30982
+ return this.config?.submitButton?.isHidden !== true && !this.footerService;
30983
+ }
30984
+ isSubmitButtonDisabled() {
30985
+ return this.config?.submitButton?.isDisabled;
30986
+ }
30622
30987
  initializeTabSelection() {
30623
30988
  if (this.config?.selectedIndex && this.isTabSelectable(this.config.selectedIndex)) {
30624
- this.selectedIndex = this.config.selectedIndex;
30989
+ this._selectedIndex = this.config.selectedIndex;
30990
+ this._changeDetectorRef.markForCheck();
30625
30991
  return;
30626
30992
  }
30627
30993
  this.selectFirstNotDisabledTab();
@@ -30630,19 +30996,20 @@ class QdPageTabsComponent extends CdkStepper {
30630
30996
  this.routerConnector.connectTabsWithRouter(this).pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
30631
30997
  }
30632
30998
  isTabSelectable(index) {
30633
- const tab = this.tabs.get(index);
30999
+ const tab = this._tabs.get(index);
30634
31000
  return !!tab && !tab.config.isDisabled;
30635
31001
  }
30636
31002
  /**
30637
31003
  * Selects the first tab that is not disabled.
30638
31004
  */
30639
31005
  selectFirstNotDisabledTab() {
30640
- this.tabs.some((tab, tabIndex) => {
31006
+ this._tabs.some((tab, tabIndex) => {
30641
31007
  if (!tab.config.isDisabled) {
30642
31008
  if (this.config) {
30643
31009
  this.config.selectedIndex = tabIndex;
30644
31010
  }
30645
- this.selectedIndex = tabIndex;
31011
+ this._selectedIndex = tabIndex;
31012
+ this._changeDetectorRef.markForCheck();
30646
31013
  return true;
30647
31014
  }
30648
31015
  else {
@@ -30650,51 +31017,25 @@ class QdPageTabsComponent extends CdkStepper {
30650
31017
  }
30651
31018
  });
30652
31019
  }
30653
- save() {
30654
- this.selected?.tabControl?.markAllAsTouched();
30655
- const tabControlValues = this.tabs.map(tab => tab.tabControl?.value);
30656
- this.config?.submitButton?.handler?.(tabControlValues);
30657
- }
30658
- selectTab(tab) {
30659
- if (tab.config?.isDisabled)
30660
- return;
30661
- tab.select();
30662
- }
30663
- isSubmitButtonShown() {
30664
- return this.config?.submitButton?.isHidden !== true && !this.footerService;
30665
- }
30666
- isSubmitButtonDisabled() {
30667
- return this.config?.submitButton?.isDisabled;
30668
- }
30669
- _getTabLabelId(i) {
30670
- return this._getStepLabelId(i);
30671
- }
30672
31020
  blockCdkInput(inputName) {
30673
31021
  throw new Error(`Quadrel Framework | QdPageTabs - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabsConfig instead.`);
30674
31022
  }
30675
- mapSelectionChangeToTabSelectionOutput() {
30676
- this.selectionChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(selectionEvent => {
30677
- this.tabSelection.emit({
30678
- selectedIndex: selectionEvent.selectedIndex,
30679
- previouslySelectedIndex: selectionEvent.previouslySelectedIndex,
30680
- selectedTab: selectionEvent.selectedStep,
30681
- previouslySelectedTab: selectionEvent.previouslySelectedStep
30682
- });
30683
- });
30684
- }
30685
31023
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30686
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageTabsComponent, isStandalone: true, selector: "qd-page-tabs", inputs: { config: "config", testId: ["data-test-id", "testId"] }, outputs: { tabSelection: "tabSelection" }, host: { properties: { "class.standalone": "!hasPageFooter" }, classAttribute: "qd-tabs" }, providers: [{ provide: CdkStepper, useExisting: QdPageTabsComponent }, QdPageTabsRouterConnectorService], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"qd-tabs-items-container\" [ngClass]=\"{ scrollable: config?.scrollabe }\">\n <qd-page-tab-header\n *ngFor=\"let tab of tabs; let i = index\"\n (click)=\"selectTab(tab)\"\n [id]=\"_getTabLabelId(i)\"\n [index]=\"i\"\n [state]=\"_getIndicatorType(i, tab.state)\"\n [label]=\"tab.config.label.i18n | translate\"\n [counters]=\"tab.config.counters\"\n [isSelected]=\"selectedIndex === i\"\n [isDisabled]=\"tab.config?.isDisabled\"\n [data-test-id]=\"testId + '-header' + '-' + i\"\n >\n </qd-page-tab-header>\n</div>\n\n<div class=\"tabs-content\">\n <ng-container *ngIf=\"!selected?.config?.isDisabled\" [ngTemplateOutlet]=\"selected?.content\"></ng-container>\n</div>\n\n<div class=\"qd-tabs-action-area\" *ngIf=\"isSubmitButtonShown()\">\n <button qdButton (click)=\"save()\" [disabled]=\"isSubmitButtonDisabled()\" [data-test-id]=\"testId + '-submit'\">\n {{ config?.submitButton?.i18n || \"i18n.qd.tabs.button.submit\" | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host.standalone{height:calc(100% - 50px)}:host .qd-tabs-items-container{display:flex;width:100%;flex-direction:row;flex-wrap:wrap;padding:0 1.25rem;border-bottom:.125rem solid rgb(213,213,213);background-color:#fff;gap:0 .9375rem}@media (max-width: 599.98px){:host .qd-tabs-items-container{padding:0 .9375rem}}@media (max-width: 1279.98px){:host .qd-tabs-items-container.scrollable{flex-wrap:nowrap;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}}:host .tabs-content{flex:1 1 auto}:host .qd-tabs-action-area{display:flex;width:100%;height:50px;justify-content:flex-end}:host .qd-tabs-action-area button{margin-right:1.25rem}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: QdPageTabHeaderComponent, selector: "qd-page-tab-header", inputs: ["state", "label", "counters", "index", "isSelected", "isDisabled", "data-test-id"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: QdButtonModule }, { kind: "component", type: QdButtonComponent, selector: "button[qdButton], a[qdButton], button[qd-button]", inputs: ["disabled", "color", "icon", "data-test-id", "additionalInfo"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31024
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageTabsComponent, isStandalone: true, selector: "qd-page-tabs", inputs: { config: "config", testId: ["data-test-id", "testId"] }, outputs: { tabSelection: "tabSelection" }, host: { properties: { "class.standalone": "!footerService" }, classAttribute: "qd-tabs" }, providers: [QdPageTabsRouterConnectorService], queries: [{ propertyName: "_tabs", predicate: i0.forwardRef(() => QdPageTabComponent) }], usesOnChanges: true, ngImport: i0, template: "<div class=\"qd-tabs-items-container\" [ngClass]=\"{ scrollable: config?.scrollabe }\">\n <qd-page-tab-header\n *ngFor=\"let tab of tabs; let i = index\"\n (click)=\"selectTab(tab)\"\n [id]=\"_getTabLabelId(i)\"\n [index]=\"i\"\n [state]=\"_getIndicatorType(i)\"\n [label]=\"tab.config.label.i18n | translate\"\n [counters]=\"tab.config.counters\"\n [isSelected]=\"selectedIndex === i\"\n [isDisabled]=\"tab.config?.isDisabled\"\n [data-test-id]=\"testId + '-header' + '-' + i\"\n >\n </qd-page-tab-header>\n</div>\n\n<div class=\"tabs-content\">\n <ng-container *ngIf=\"!selected?.config?.isDisabled\" [ngTemplateOutlet]=\"selected?.content\"></ng-container>\n</div>\n\n<div class=\"qd-tabs-action-area\" *ngIf=\"isSubmitButtonShown()\">\n <button qdButton (click)=\"save()\" [disabled]=\"isSubmitButtonDisabled()\" [data-test-id]=\"testId + '-submit'\">\n {{ config?.submitButton?.i18n || \"i18n.qd.tabs.button.submit\" | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host.standalone{height:calc(100% - 50px)}:host .qd-tabs-items-container{display:flex;width:100%;flex-direction:row;flex-wrap:wrap;padding:0 1.25rem;border-bottom:.125rem solid rgb(213,213,213);background-color:#fff;gap:0 .9375rem}@media (max-width: 599.98px){:host .qd-tabs-items-container{padding:0 .9375rem}}@media (max-width: 1279.98px){:host .qd-tabs-items-container.scrollable{flex-wrap:nowrap;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}}:host .tabs-content{flex:1 1 auto}:host .qd-tabs-action-area{display:flex;width:100%;height:50px;justify-content:flex-end}:host .qd-tabs-action-area button{margin-right:1.25rem}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: QdPageTabHeaderComponent, selector: "qd-page-tab-header", inputs: ["state", "label", "counters", "index", "isSelected", "isDisabled", "data-test-id"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: QdButtonModule }, { kind: "component", type: QdButtonComponent, selector: "button[qdButton], a[qdButton], button[qd-button]", inputs: ["disabled", "color", "icon", "data-test-id", "additionalInfo"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
30687
31025
  }
30688
31026
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsComponent, decorators: [{
30689
31027
  type: Component,
30690
- args: [{ selector: 'qd-page-tabs', providers: [{ provide: CdkStepper, useExisting: QdPageTabsComponent }, QdPageTabsRouterConnectorService], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'qd-tabs', '[class.standalone]': '!hasPageFooter' }, standalone: true, imports: [NgFor, NgIf, NgTemplateOutlet, QdPageTabHeaderComponent, TranslateModule, QdButtonModule, CommonModule], template: "<div class=\"qd-tabs-items-container\" [ngClass]=\"{ scrollable: config?.scrollabe }\">\n <qd-page-tab-header\n *ngFor=\"let tab of tabs; let i = index\"\n (click)=\"selectTab(tab)\"\n [id]=\"_getTabLabelId(i)\"\n [index]=\"i\"\n [state]=\"_getIndicatorType(i, tab.state)\"\n [label]=\"tab.config.label.i18n | translate\"\n [counters]=\"tab.config.counters\"\n [isSelected]=\"selectedIndex === i\"\n [isDisabled]=\"tab.config?.isDisabled\"\n [data-test-id]=\"testId + '-header' + '-' + i\"\n >\n </qd-page-tab-header>\n</div>\n\n<div class=\"tabs-content\">\n <ng-container *ngIf=\"!selected?.config?.isDisabled\" [ngTemplateOutlet]=\"selected?.content\"></ng-container>\n</div>\n\n<div class=\"qd-tabs-action-area\" *ngIf=\"isSubmitButtonShown()\">\n <button qdButton (click)=\"save()\" [disabled]=\"isSubmitButtonDisabled()\" [data-test-id]=\"testId + '-submit'\">\n {{ config?.submitButton?.i18n || \"i18n.qd.tabs.button.submit\" | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host.standalone{height:calc(100% - 50px)}:host .qd-tabs-items-container{display:flex;width:100%;flex-direction:row;flex-wrap:wrap;padding:0 1.25rem;border-bottom:.125rem solid rgb(213,213,213);background-color:#fff;gap:0 .9375rem}@media (max-width: 599.98px){:host .qd-tabs-items-container{padding:0 .9375rem}}@media (max-width: 1279.98px){:host .qd-tabs-items-container.scrollable{flex-wrap:nowrap;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}}:host .tabs-content{flex:1 1 auto}:host .qd-tabs-action-area{display:flex;width:100%;height:50px;justify-content:flex-end}:host .qd-tabs-action-area button{margin-right:1.25rem}\n"] }]
30691
- }], ctorParameters: () => [], propDecorators: { config: [{
31028
+ args: [{ selector: 'qd-page-tabs', providers: [QdPageTabsRouterConnectorService], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'qd-tabs', '[class.standalone]': '!footerService' }, standalone: true, imports: [NgFor, NgIf, NgTemplateOutlet, QdPageTabHeaderComponent, TranslateModule, QdButtonModule, CommonModule], template: "<div class=\"qd-tabs-items-container\" [ngClass]=\"{ scrollable: config?.scrollabe }\">\n <qd-page-tab-header\n *ngFor=\"let tab of tabs; let i = index\"\n (click)=\"selectTab(tab)\"\n [id]=\"_getTabLabelId(i)\"\n [index]=\"i\"\n [state]=\"_getIndicatorType(i)\"\n [label]=\"tab.config.label.i18n | translate\"\n [counters]=\"tab.config.counters\"\n [isSelected]=\"selectedIndex === i\"\n [isDisabled]=\"tab.config?.isDisabled\"\n [data-test-id]=\"testId + '-header' + '-' + i\"\n >\n </qd-page-tab-header>\n</div>\n\n<div class=\"tabs-content\">\n <ng-container *ngIf=\"!selected?.config?.isDisabled\" [ngTemplateOutlet]=\"selected?.content\"></ng-container>\n</div>\n\n<div class=\"qd-tabs-action-area\" *ngIf=\"isSubmitButtonShown()\">\n <button qdButton (click)=\"save()\" [disabled]=\"isSubmitButtonDisabled()\" [data-test-id]=\"testId + '-submit'\">\n {{ config?.submitButton?.i18n || \"i18n.qd.tabs.button.submit\" | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host.standalone{height:calc(100% - 50px)}:host .qd-tabs-items-container{display:flex;width:100%;flex-direction:row;flex-wrap:wrap;padding:0 1.25rem;border-bottom:.125rem solid rgb(213,213,213);background-color:#fff;gap:0 .9375rem}@media (max-width: 599.98px){:host .qd-tabs-items-container{padding:0 .9375rem}}@media (max-width: 1279.98px){:host .qd-tabs-items-container.scrollable{flex-wrap:nowrap;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}}:host .tabs-content{flex:1 1 auto}:host .qd-tabs-action-area{display:flex;width:100%;height:50px;justify-content:flex-end}:host .qd-tabs-action-area button{margin-right:1.25rem}\n"] }]
31029
+ }], propDecorators: { config: [{
30692
31030
  type: Input
30693
31031
  }], testId: [{
30694
31032
  type: Input,
30695
31033
  args: ['data-test-id']
30696
31034
  }], tabSelection: [{
30697
31035
  type: Output
31036
+ }], _tabs: [{
31037
+ type: ContentChildren,
31038
+ args: [forwardRef(() => QdPageTabComponent)]
30698
31039
  }] } });
30699
31040
 
30700
31041
  class QdPageSubmitActionService {
@@ -34278,93 +34619,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
34278
34619
  }]
34279
34620
  }] });
34280
34621
 
34281
- // @ts-strict-ignore
34282
- /**
34283
- * The **QdPageTab** is a single tab inside the **QdPageTabs** within a **QdPage**.
34284
- */
34285
- class QdPageTabComponent extends CdkStep {
34286
- translate = inject(TranslateService);
34287
- /**
34288
- * Configuration of QdPageTabComponent.
34289
- *
34290
- * * @note The use of CDK attributes is not permitted. Please configure this component here.
34291
- */
34292
- config;
34293
- /** Form control for this tab. */
34294
- set tabControl(tabControl) {
34295
- this.stepControl = tabControl;
34296
- }
34297
- get tabControl() {
34298
- return this.stepControl;
34299
- }
34300
- infoBanners;
34301
- _destroyed$ = new Subject();
34302
- constructor() {
34303
- const tabs = inject(QdPageTabsComponent);
34304
- const stepperOptions = inject(STEPPER_GLOBAL_OPTIONS, { optional: true });
34305
- super(tabs, stepperOptions);
34306
- }
34307
- ngOnInit() {
34308
- this.validateLabel();
34309
- if (this.tabControl)
34310
- this.initErrorCheck();
34311
- }
34312
- ngOnChanges(changes) {
34313
- super.ngOnChanges();
34314
- ['label', 'errorMessage', 'state']
34315
- .filter(inputName => !!changes[inputName])
34316
- .forEach(inputName => this.blockCdkInput(inputName));
34317
- }
34318
- ngOnDestroy() {
34319
- this._destroyed$.complete();
34320
- }
34321
- blockCdkInput(inputName) {
34322
- throw new Error(`Quadrel Framework | QdPageTab - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabConfig instead.`);
34323
- }
34324
- validateLabel() {
34325
- if (!this.config?.label?.i18n)
34326
- console.error('Quadrel Framework | QdPageTab - Please provide a label for the tab.');
34327
- }
34328
- initErrorCheck() {
34329
- this.tabControl.statusChanges.pipe(takeUntil$1(this._destroyed$)).subscribe(() => {
34330
- if (this.hasAnyError(this.tabControl)) {
34331
- this.interacted = true;
34332
- }
34333
- });
34334
- }
34335
- hasAnyError(control) {
34336
- if (control.errors && control.touched)
34337
- return true;
34338
- if (control instanceof FormGroup) {
34339
- return Object.values(control.controls).some(control => this.hasAnyError(control));
34340
- }
34341
- if (control instanceof FormArray) {
34342
- return control.controls.some(control => this.hasAnyError(control));
34343
- }
34344
- return false;
34345
- }
34346
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
34347
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageTabComponent, isStandalone: true, selector: "qd-page-tab", inputs: { config: "config", tabControl: "tabControl" }, providers: [
34348
- { provide: CdkStep, useExisting: QdPageTabComponent },
34349
- { provide: STEPPER_GLOBAL_OPTIONS, useValue: { showError: true } }
34350
- ], queries: [{ propertyName: "infoBanners", predicate: QdPageInfoBannerComponent }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-template>\n <div class=\"page-info-banners\">\n <ng-content select=\"qd-page-info-banner\"></ng-content>\n </div>\n\n <ng-content></ng-content>\n</ng-template>\n", styles: [".page-info-banners:has(>qd-page-info-banner:not(.qd-page-info-banner-empty)){padding:1rem 1.25rem .5rem;border-bottom:rgb(213,213,213) solid .0625rem;background-color:#fff}.page-info-banners>qd-page-info-banner:last-child{margin-bottom:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
34351
- }
34352
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, decorators: [{
34353
- type: Component,
34354
- args: [{ selector: 'qd-page-tab', providers: [
34355
- { provide: CdkStep, useExisting: QdPageTabComponent },
34356
- { provide: STEPPER_GLOBAL_OPTIONS, useValue: { showError: true } }
34357
- ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true // inherited by CdkStep
34358
- , template: "<ng-template>\n <div class=\"page-info-banners\">\n <ng-content select=\"qd-page-info-banner\"></ng-content>\n </div>\n\n <ng-content></ng-content>\n</ng-template>\n", styles: [".page-info-banners:has(>qd-page-info-banner:not(.qd-page-info-banner-empty)){padding:1rem 1.25rem .5rem;border-bottom:rgb(213,213,213) solid .0625rem;background-color:#fff}.page-info-banners>qd-page-info-banner:last-child{margin-bottom:0}\n"] }]
34359
- }], ctorParameters: () => [], propDecorators: { config: [{
34360
- type: Input
34361
- }], tabControl: [{
34362
- type: Input
34363
- }], infoBanners: [{
34364
- type: ContentChildren,
34365
- args: [QdPageInfoBannerComponent]
34366
- }] } });
34367
-
34368
34622
  /**
34369
34623
  * **qdPageTabParameterize** turns the active page tab into the `tab` query parameter
34370
34624
  * (`?tab=<name>`).
@@ -34395,7 +34649,6 @@ class QdPageTabsModule {
34395
34649
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
34396
34650
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsModule, declarations: [QdPageTabsAdapterDirective], imports: [CommonModule,
34397
34651
  TranslateModule,
34398
- CdkStepperModule,
34399
34652
  QdButtonModule,
34400
34653
  QdIconModule,
34401
34654
  QdPageTabsComponent,
@@ -34404,7 +34657,6 @@ class QdPageTabsModule {
34404
34657
  QdPageTabHeaderCountersComponent], exports: [QdPageTabsComponent, QdPageTabComponent, QdPageTabsAdapterDirective] });
34405
34658
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsModule, imports: [CommonModule,
34406
34659
  TranslateModule,
34407
- CdkStepperModule,
34408
34660
  QdButtonModule,
34409
34661
  QdIconModule,
34410
34662
  QdPageTabsComponent] });
@@ -34415,7 +34667,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
34415
34667
  imports: [
34416
34668
  CommonModule,
34417
34669
  TranslateModule,
34418
- CdkStepperModule,
34419
34670
  QdButtonModule,
34420
34671
  QdIconModule,
34421
34672
  QdPageTabsComponent,
@@ -35072,5 +35323,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
35072
35323
  * Generated bundle index. Do not edit.
35073
35324
  */
35074
35325
 
35075
- export { APP_ENVIRONMENT, AVAILABLE_ICONS, BACKEND_ERROR_CODES, MockLocaleDatePipe, NavigationTileComponent, NavigationTilesComponent, QD_DIALOG_CONFIRMATION_RESOLVER_TOKEN, QD_FILE_MANAGER_TOKEN, QD_FILE_UPLOAD_MANAGER_TOKEN, QD_FORM_OPTIONS_RESOLVER, QD_PAGE_OBJECT_RESOLVER_TOKEN, QD_PAGE_STEP_RESOLVER_TOKEN, QD_POPOVER_TOP_FIRST, QD_SAFE_BOTTOM_OFFSET, QD_TABLE_DATA_RESOLVER_TOKEN, QD_UPLOAD_HTTP_OPTIONS, QdButtonComponent, QdButtonGhostDirective, QdButtonGridComponent, QdButtonLinkDirective, QdButtonModule, QdButtonStackButtonComponent, QdButtonStackComponent, QdCheckboxChipsComponent, QdCheckboxComponent, QdCheckboxesComponent, QdChipComponent, QdChipModule, QdColumnAutoFillDirective, QdColumnBreakBeforeDirective, QdColumnDirective, QdColumnDisableResponsiveColspansDirective, QdColumnFullGridWidthDirective, QdColumnNextInSameRowDirective, QdColumnsDirective, QdColumnsDisableAutoFillDirective, QdColumnsDisableResponsiveColspansDirective, QdColumnsMaxDirective, QdCommentsComponent, QdCommentsModule, QdConnectFormStateToPageDirective, QdConnectorTableContextDirective, QdConnectorTableFilterDirective, QdConnectorTableSearchDirective, QdContactCardComponent, QdContactCardModule, QdContainerPairsCaptionComponent, QdContainerPairsContainerComponent, QdContainerPairsHeaderComponent, QdContainerPairsItemComponent, QdContainerPairsValueComponent, QdContextService, QdCoreModule, QdDatepickerComponent, QdDialogActionComponent, QdDialogAuthSessionEndComponent, QdDialogAuthSessionEndService, QdDialogComponent, QdDialogConfirmationComponent, QdDialogConfirmationErrorDirective, QdDialogConfirmationInfoDirective, QdDialogConfirmationSuccessDirective, QdDialogModule, QdDialogRecordStepperComponent, QdDialogService, QdDialogSize, QdDisabledDirective, QdDropdownComponent, QdFileCollectorComponent, QdFileCollectorModule, QdFileSizePipe$1 as QdFileSizePipe, QdFileUploadComponent, QdFileUploadService, QdFilterComponent, QdFilterFormItemsComponent, QdFilterModule, QdFilterRestParamBuilder, QdFilterService, QdFooterActionType, QdFormArray, QdFormBuilder, QdFormControl, QdFormGroup, QdFormModule, QdGridComponent, QdGridModule, QdHorizontalPairsCaptionComponent, QdHorizontalPairsComponent, QdHorizontalPairsItemComponent, QdHorizontalPairsValueComponent, QdIconButtonComponent, QdIconComponent, QdIconModule, QdImageComponent, QdImageModule, QdIndeterminateProgressBarComponent, QdInputComponent, QdListModule, QdMenuButtonComponent, QdMockBreakpointService, QdMockButtonComponent, QdMockButtonGhostDirective, QdMockButtonGridComponent, QdMockButtonLinkDirective, QdMockButtonModule, QdMockButtonStackButtonComponent, QdMockButtonStackComponent, QdMockCalendarComponent, QdMockCheckboxChipsComponent, QdMockCheckboxComponent, QdMockCheckboxesComponent, QdMockChipComponent, QdMockChipModule, QdMockColumnDirective, QdMockColumnsDirective, QdMockContactCardComponent, QdMockContactCardModule, QdMockContainerPairsCaptionComponent, QdMockContainerPairsContainerComponent, QdMockContainerPairsHeaderComponent, QdMockContainerPairsItemComponent, QdMockContainerPairsValueComponent, QdMockCoreModule, QdMockCounterBadgeComponent, QdMockDatepickerComponent, QdMockDisabledDirective, QdMockDropdownComponent, QdMockFileCollectorComponent, QdMockFileCollectorModule, QdMockFilterCategoryBooleanComponent, QdMockFilterCategoryComponent, QdMockFilterCategoryDateComponent, QdMockFilterCategoryDateRangeComponent, QdMockFilterCategoryFreeTextComponent, QdMockFilterCategorySelectComponent, QdMockFilterComponent, QdMockFilterFormItemsComponent, QdMockFilterItemBooleanComponent, QdMockFilterItemDateComponent, QdMockFilterItemDateRangeComponent, QdMockFilterItemFreeTextComponent, QdMockFilterItemMultiSelectComponent, QdMockFilterItemSingleSelectComponent, QdMockFilterModule, QdMockFilterService, QdMockFormErrorComponent, QdMockFormGroupErrorComponent, QdMockFormHintComponent, QdMockFormLabelComponent, QdMockFormReadonlyComponent, QdMockFormViewonlyComponent, QdMockFormsModule, QdMockGridModule, QdMockIconButtonComponent, QdMockIconComponent, QdMockIconModule, QdMockImageComponent, QdMockImageModule, QdMockIndeterminateProgressBarComponent, QdMockInputComponent, QdMockListModule, QdMockNavigationTileComponent, QdMockNavigationTilesComponent, QdMockNavigationTilesModule, QdMockNotificationComponent, QdMockNotificationContentComponent, QdMockNotificationsComponent, QdMockNotificationsModule, QdMockNotificationsService, QdMockPageComponent, QdMockPageModule, QdMockPercentageProgressBarComponent, QdMockPinCodeComponent, QdMockPlaceHolderModule, QdMockPopoverOnClickDirective, QdMockProgressBarModule, QdMockQdPlaceHolderComponent, QdMockRadioButtonsComponent, QdMockRwdDisabledDirective, QdMockSearchComponent, QdMockSearchModule, QdMockSectionComponent, QdMockSectionModule, QdMockShellComponent, QdMockShellFooterComponent, QdMockShellHeaderBannerComponent, QdMockShellHeaderComponent, QdMockShellHeaderSearchComponent, QdMockShellHeaderWidgetComponent, QdMockShellModule, QdMockShellToolbarComponent, QdMockShellToolbarItemComponent, QdMockStatusIndicatorCaptionComponent, QdMockStatusIndicatorComponent, QdMockStatusIndicatorItemComponent, QdMockStatusIndicatorModule, QdMockStatusPairsCaptionComponent, QdMockStatusPairsComponent, QdMockStatusPairsErrorComponent, QdMockStatusPairsItemComponent, QdMockStatusPairsValueComponent, QdMockSwitchComponent, QdMockSwitchesComponent, QdMockTableComponent, QdMockTableModule, QdMockTextSectionComponent, QdMockTextSectionHeadlineComponent, QdMockTextSectionModule, QdMockTextSectionParagraphComponent, QdMockTextareaComponent, QdMockTileButtonListComponent, QdMockTileComponent, QdMockTileTextListComponent, QdMockTileTextListItemComponent, QdMockTileTitleComponent, QdMockTilesContainerComponent, QdMockTilesContainerTitleComponent, QdMockTilesModule, QdMockTranslatePipe, QdMockVisuallyHiddenDirective, QdMultiInputComponent, QdNavigationTilesModule, QdNotificationComponent, QdNotificationContentComponent, QdNotificationsComponent, QdNotificationsHttpInterceptorService, QdNotificationsModule, QdNotificationsService, QdNotificationsSnackbarListenerDirective, QdNumberInputService, QdPageComponent, QdPageControlPanelComponent, QdPageFooterComponent, QdPageFooterCustomContentDirective, QdPageInfoBannerComponent, QdPageModule, QdPageStepComponent, QdPageStepperAdapterDirective, QdPageStepperComponent, QdPageStepperModule, QdPageStoreService, QdPageTabComponent, QdPageTabsAdapterDirective, QdPageTabsComponent, QdPageTabsModule, QdPanelSectionActionsComponent, QdPanelSectionComponent, QdPanelSectionModule, QdPanelSectionStatusComponent, QdPanelSectionTextParagraphComponent, QdPendingChangesGuardDirective, QdPercentageProgressBarComponent, QdPinCodeComponent, QdPlaceHolderComponent, QdPlaceHolderModule, QdPlaceholderPipe, QdProgressBarModule, QdProjectionGuardComponent, QdPushEventsService, QdQuickEditComponent, QdQuickEditModule, QdRadioButtonsComponent, QdRichtextComponent, QdRouterQueryParamHubService, QdRwdDisabledDirective, QdSearchComponent, QdSearchModule, QdSearchService, QdSectionAdapterDirective, QdSectionComponent, QdSectionModule, QdSectionToolbarComponent, QdShellComponent, QdShellModule, QdSortDirection, QdSpinnerComponent, QdSpinnerModule, QdStatusIndicatorComponent, QdStatusIndicatorModule, QdStatusPairsCaptionComponent, QdStatusPairsComponent, QdStatusPairsErrorComponent, QdStatusPairsItemComponent, QdStatusPairsValueComponent, QdSubgridComponent, QdSwitchComponent, QdSwitchesComponent, QdTableComponent, QdTableModule, QdTableSpringTools, QdTextSectionComponent, QdTextSectionHeadlineComponent, QdTextSectionModule, QdTextSectionParagraphComponent, QdTextareaComponent, QdTileButtonListComponent, QdTileComponent, QdTileTextListComponent, QdTileTextListItemComponent, QdTileTitleComponent, QdTilesComponent, QdTilesModule, QdTilesTitleComponent, QdTooltipAtIntersectionDirective, QdTooltipIconComponent, QdTreeComponent, QdTreeModule, QdTreeRowExpanderService, QdUiMockModule, QdUiModule, QdUploadErrorType, QdValidators, QdViewportAdaptiveDirective, QdVisuallyHiddenDirective, chipColorDefault, createMetadataStream, qdFilterParameterize, qdMergeParams, qdPageTabParameterize, qdPaginationParameterize, qdSearchParameterize, qdSortParameterize, qdTableQueryParameterize, qdWrapParams, quadrelIconNames, updateHtmlLang };
35326
+ export { APP_ENVIRONMENT, AVAILABLE_ICONS, BACKEND_ERROR_CODES, MockLocaleDatePipe, NavigationTileComponent, NavigationTilesComponent, QD_DIALOG_CONFIRMATION_RESOLVER_TOKEN, QD_FILE_MANAGER_TOKEN, QD_FILE_UPLOAD_MANAGER_TOKEN, QD_FORM_OPTIONS_RESOLVER, QD_PAGE_OBJECT_RESOLVER_TOKEN, QD_PAGE_STEP_RESOLVER_TOKEN, QD_POPOVER_TOP_FIRST, QD_SAFE_BOTTOM_OFFSET, QD_TABLE_DATA_RESOLVER_TOKEN, QD_UPLOAD_HTTP_OPTIONS, QdButtonComponent, QdButtonGhostDirective, QdButtonGridComponent, QdButtonLinkDirective, QdButtonModule, QdButtonStackButtonComponent, QdButtonStackComponent, QdCheckboxChipsComponent, QdCheckboxComponent, QdCheckboxesComponent, QdChipComponent, QdChipModule, QdColumnAutoFillDirective, QdColumnBreakBeforeDirective, QdColumnDirective, QdColumnDisableResponsiveColspansDirective, QdColumnFullGridWidthDirective, QdColumnNextInSameRowDirective, QdColumnsDirective, QdColumnsDisableAutoFillDirective, QdColumnsDisableResponsiveColspansDirective, QdColumnsMaxDirective, QdCommentsComponent, QdCommentsModule, QdConnectFormStateToPageDirective, QdConnectorTableContextDirective, QdConnectorTableFilterDirective, QdConnectorTableSearchDirective, QdContactCardComponent, QdContactCardModule, QdContainerPairsCaptionComponent, QdContainerPairsContainerComponent, QdContainerPairsHeaderComponent, QdContainerPairsItemComponent, QdContainerPairsValueComponent, QdContextService, QdCoreModule, QdDatepickerComponent, QdDialogActionComponent, QdDialogAuthSessionEndComponent, QdDialogAuthSessionEndService, QdDialogComponent, QdDialogConfirmationComponent, QdDialogConfirmationErrorDirective, QdDialogConfirmationInfoDirective, QdDialogConfirmationSuccessDirective, QdDialogModule, QdDialogRecordStepperComponent, QdDialogService, QdDialogSize, QdDisabledDirective, QdDropdownComponent, QdFileCollectorComponent, QdFileCollectorModule, QdFileSizePipe$1 as QdFileSizePipe, QdFileUploadComponent, QdFileUploadService, QdFilterComponent, QdFilterFormItemsComponent, QdFilterModule, QdFilterRestParamBuilder, QdFilterService, QdFooterActionType, QdFormArray, QdFormBuilder, QdFormControl, QdFormGroup, QdFormModule, QdGridComponent, QdGridModule, QdHorizontalPairsCaptionComponent, QdHorizontalPairsComponent, QdHorizontalPairsItemComponent, QdHorizontalPairsValueComponent, QdIconButtonComponent, QdIconComponent, QdIconModule, QdImageComponent, QdImageModule, QdIndeterminateProgressBarComponent, QdInputComponent, QdListModule, QdMenuButtonComponent, QdMockBreakpointService, QdMockButtonComponent, QdMockButtonGhostDirective, QdMockButtonGridComponent, QdMockButtonLinkDirective, QdMockButtonModule, QdMockButtonStackButtonComponent, QdMockButtonStackComponent, QdMockCalendarComponent, QdMockCheckboxChipsComponent, QdMockCheckboxComponent, QdMockCheckboxesComponent, QdMockChipComponent, QdMockChipModule, QdMockColumnDirective, QdMockColumnsDirective, QdMockContactCardComponent, QdMockContactCardModule, QdMockContainerPairsCaptionComponent, QdMockContainerPairsContainerComponent, QdMockContainerPairsHeaderComponent, QdMockContainerPairsItemComponent, QdMockContainerPairsValueComponent, QdMockCoreModule, QdMockCounterBadgeComponent, QdMockDatepickerComponent, QdMockDisabledDirective, QdMockDropdownComponent, QdMockFileCollectorComponent, QdMockFileCollectorModule, QdMockFilterCategoryBooleanComponent, QdMockFilterCategoryComponent, QdMockFilterCategoryDateComponent, QdMockFilterCategoryDateRangeComponent, QdMockFilterCategoryFreeTextComponent, QdMockFilterCategorySelectComponent, QdMockFilterComponent, QdMockFilterFormItemsComponent, QdMockFilterItemBooleanComponent, QdMockFilterItemDateComponent, QdMockFilterItemDateRangeComponent, QdMockFilterItemFreeTextComponent, QdMockFilterItemMultiSelectComponent, QdMockFilterItemSingleSelectComponent, QdMockFilterModule, QdMockFilterService, QdMockFormErrorComponent, QdMockFormGroupErrorComponent, QdMockFormHintComponent, QdMockFormLabelComponent, QdMockFormReadonlyComponent, QdMockFormViewonlyComponent, QdMockFormsModule, QdMockGridModule, QdMockIconButtonComponent, QdMockIconComponent, QdMockIconModule, QdMockImageComponent, QdMockImageModule, QdMockIndeterminateProgressBarComponent, QdMockInputComponent, QdMockListModule, QdMockNavigationTileComponent, QdMockNavigationTilesComponent, QdMockNavigationTilesModule, QdMockNotificationComponent, QdMockNotificationContentComponent, QdMockNotificationsComponent, QdMockNotificationsModule, QdMockNotificationsService, QdMockPageComponent, QdMockPageModule, QdMockPercentageProgressBarComponent, QdMockPinCodeComponent, QdMockPlaceHolderModule, QdMockPopoverOnClickDirective, QdMockProgressBarModule, QdMockQdPlaceHolderComponent, QdMockRadioButtonsComponent, QdMockRwdDisabledDirective, QdMockSearchComponent, QdMockSearchModule, QdMockSectionComponent, QdMockSectionModule, QdMockShellComponent, QdMockShellFooterComponent, QdMockShellHeaderBannerComponent, QdMockShellHeaderComponent, QdMockShellHeaderSearchComponent, QdMockShellHeaderWidgetComponent, QdMockShellModule, QdMockShellToolbarComponent, QdMockShellToolbarItemComponent, QdMockStatusIndicatorCaptionComponent, QdMockStatusIndicatorComponent, QdMockStatusIndicatorItemComponent, QdMockStatusIndicatorModule, QdMockStatusPairsCaptionComponent, QdMockStatusPairsComponent, QdMockStatusPairsErrorComponent, QdMockStatusPairsItemComponent, QdMockStatusPairsValueComponent, QdMockSwitchComponent, QdMockSwitchesComponent, QdMockTableComponent, QdMockTableModule, QdMockTextSectionComponent, QdMockTextSectionHeadlineComponent, QdMockTextSectionModule, QdMockTextSectionParagraphComponent, QdMockTextareaComponent, QdMockTileButtonListComponent, QdMockTileComponent, QdMockTileTextListComponent, QdMockTileTextListItemComponent, QdMockTileTitleComponent, QdMockTilesContainerComponent, QdMockTilesContainerTitleComponent, QdMockTilesModule, QdMockTranslatePipe, QdMockVisuallyHiddenDirective, QdMultiInputComponent, QdNavigationTilesModule, QdNotificationComponent, QdNotificationContentComponent, QdNotificationsComponent, QdNotificationsHttpInterceptorService, QdNotificationsModule, QdNotificationsService, QdNotificationsSnackbarListenerDirective, QdNumberInputService, QdPageComponent, QdPageControlPanelComponent, QdPageFooterComponent, QdPageFooterCustomContentDirective, QdPageInfoBannerComponent, QdPageModule, QdPageStepComponent, QdPageStepperAdapterDirective, QdPageStepperComponent, QdPageStepperModule, QdPageStoreService, QdPageTabComponent, QdPageTabsAdapterDirective, QdPageTabsComponent, QdPageTabsModule, QdPanelSectionActionsComponent, QdPanelSectionComponent, QdPanelSectionModule, QdPanelSectionStatusComponent, QdPanelSectionTextParagraphComponent, QdPendingChangesGuardDirective, QdPercentageProgressBarComponent, QdPinCodeComponent, QdPlaceHolderComponent, QdPlaceHolderModule, QdPlaceholderPipe, QdProgressBarModule, QdProjectionGuardComponent, QdPushEventsService, QdQuickEditComponent, QdQuickEditModule, QdRadioButtonsComponent, QdRichtextComponent, QdRouterQueryParamHubService, QdRwdDisabledDirective, QdSearchComponent, QdSearchModule, QdSearchService, QdSectionAdapterDirective, QdSectionComponent, QdSectionModule, QdSectionToolbarComponent, QdShellComponent, QdShellModule, QdSortDirection, QdSpinnerComponent, QdSpinnerModule, QdStatusIndicatorComponent, QdStatusIndicatorModule, QdStatusPairsCaptionComponent, QdStatusPairsComponent, QdStatusPairsErrorComponent, QdStatusPairsItemComponent, QdStatusPairsValueComponent, QdSubgridComponent, QdSwitchComponent, QdSwitchesComponent, QdTableComponent, QdTableModule, QdTableSpringTools, QdTextSectionComponent, QdTextSectionHeadlineComponent, QdTextSectionModule, QdTextSectionParagraphComponent, QdTextareaComponent, QdTileButtonListComponent, QdTileComponent, QdTileTextListComponent, QdTileTextListItemComponent, QdTileTitleComponent, QdTilesComponent, QdTilesModule, QdTilesTitleComponent, QdTooltipAtIntersectionDirective, QdTooltipIconComponent, QdTreeComponent, QdTreeModule, QdTreeRowExpanderService, QdUiMockModule, QdUiModule, QdUploadErrorType, QdValidators, QdViewportAdaptiveDirective, QdVisuallyHiddenDirective, WHITELIST_ERROR_CODES, chipColorDefault, createMetadataStream, qdFilterParameterize, qdMergeParams, qdPageTabParameterize, qdPaginationParameterize, qdSearchParameterize, qdSortParameterize, qdTableQueryParameterize, qdWrapParams, quadrelIconNames, updateHtmlLang };
35076
35327
  //# sourceMappingURL=quadrel-enterprise-ui-framework.mjs.map