@quadrel-enterprise-ui/framework 20.26.0 → 20.26.2

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,5 +1,5 @@
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';
@@ -8411,10 +8411,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
8411
8411
  }]
8412
8412
  }] });
8413
8413
 
8414
+ /**
8415
+ * Focuses its host element once, after the initial view init, when `qdAutofocus` is `true`.
8416
+ *
8417
+ * Init-only by design: the input is read in `ngAfterViewInit` only. A later `false -> true`
8418
+ * change on an already-rendered element is intentionally ignored to avoid stealing focus
8419
+ * mid-interaction (this mirrors the native `autofocus` attribute). An element that appears
8420
+ * later (e.g. via `*ngIf`) still autofocuses, because `ngAfterViewInit` runs when it is created.
8421
+ *
8422
+ * Coordinated app-wide through {@link QdAutofocusService}: only one element may autofocus per
8423
+ * view; the guard is released once the focused element blurs, so a newly opened view can
8424
+ * autofocus again. Using it on more than one active element at a time logs a warning and is
8425
+ * ignored for the surplus elements.
8426
+ */
8414
8427
  class QdAutofocusDirective {
8415
8428
  autofocusService = inject(QdAutofocusService);
8416
8429
  elementRef = inject(ElementRef);
8417
8430
  qdAutofocus = false;
8431
+ _timeoutId;
8432
+ _blurHandler;
8418
8433
  ngAfterViewInit() {
8419
8434
  if (!this.qdAutofocus)
8420
8435
  return;
@@ -8423,14 +8438,24 @@ class QdAutofocusDirective {
8423
8438
  return;
8424
8439
  }
8425
8440
  this.autofocusService.isAutofocusActivated = true;
8426
- setTimeout(() => {
8427
- this.elementRef.nativeElement.focus();
8428
- this.elementRef.nativeElement.addEventListener('blur', () => {
8441
+ this._timeoutId = setTimeout(() => {
8442
+ const element = this.elementRef.nativeElement;
8443
+ if (!element.isConnected) {
8429
8444
  this.autofocusService.isAutofocusActivated = false;
8430
- });
8445
+ return;
8446
+ }
8447
+ element.focus();
8448
+ this._blurHandler = () => {
8449
+ this.autofocusService.isAutofocusActivated = false;
8450
+ };
8451
+ element.addEventListener('blur', this._blurHandler, { once: true });
8431
8452
  }, 0);
8432
8453
  }
8433
8454
  ngOnDestroy() {
8455
+ if (this._timeoutId)
8456
+ clearTimeout(this._timeoutId);
8457
+ if (this._blurHandler)
8458
+ this.elementRef.nativeElement.removeEventListener('blur', this._blurHandler);
8434
8459
  this.autofocusService.isAutofocusActivated = false;
8435
8460
  }
8436
8461
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdAutofocusDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -30167,8 +30192,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
30167
30192
  /**
30168
30193
  * **QdPageTabHeader* renders the header of a single tab. It is used quadrel-internally.
30169
30194
  */
30170
- class QdPageTabHeaderComponent extends CdkStepHeader {
30171
- STEP_STATE = STEP_STATE;
30195
+ class QdPageTabHeaderComponent {
30172
30196
  /** State of the given tab. */
30173
30197
  state;
30174
30198
  /** Label of the given tab. */
@@ -30185,24 +30209,21 @@ class QdPageTabHeaderComponent extends CdkStepHeader {
30185
30209
  * A static test ID for integration tests can be set.
30186
30210
  */
30187
30211
  testId;
30188
- constructor() {
30189
- const elementRef = inject(ElementRef);
30190
- super(elementRef);
30191
- }
30192
30212
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30193
- 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 });
30213
+ 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 });
30194
30214
  }
30195
30215
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabHeaderComponent, decorators: [{
30196
30216
  type: Component,
30197
30217
  args: [{ selector: 'qd-page-tab-header', changeDetection: ChangeDetectionStrategy.OnPush, host: {
30198
30218
  '[attr.data-test-id]': 'testId',
30219
+ role: 'tab',
30199
30220
  '[class.qd-tab-current]': 'isSelected && !isDisabled',
30200
30221
  '[class.qd-tab-disabled]': 'isDisabled',
30201
- '[class.qd-tab-done]': 'state === STEP_STATE.DONE',
30202
- '[class.qd-tab-edit]': 'state === STEP_STATE.EDIT',
30203
- '[class.qd-tab-error]': 'state === STEP_STATE.ERROR'
30222
+ '[class.qd-tab-done]': "state === 'done'",
30223
+ '[class.qd-tab-edit]': "state === 'edit'",
30224
+ '[class.qd-tab-error]': "state === 'error'"
30204
30225
  }, 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"] }]
30205
- }], ctorParameters: () => [], propDecorators: { state: [{
30226
+ }], propDecorators: { state: [{
30206
30227
  type: Input
30207
30228
  }], label: [{
30208
30229
  type: Input
@@ -30219,13 +30240,112 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
30219
30240
  args: ['data-test-id']
30220
30241
  }] } });
30221
30242
 
30243
+ // @ts-strict-ignore
30244
+ /**
30245
+ * The **QdPageTab** is a single tab inside the **QdPageTabs** within a **QdPage**.
30246
+ */
30247
+ class QdPageTabComponent {
30248
+ _pageTabs = inject(forwardRef(() => QdPageTabsComponent));
30249
+ translate = inject(TranslateService);
30250
+ /**
30251
+ * Configuration of QdPageTabComponent.
30252
+ *
30253
+ * * @note The use of CDK attributes is not permitted. Please configure this component here.
30254
+ */
30255
+ config;
30256
+ /** Form control for this tab. */
30257
+ set tabControl(tabControl) {
30258
+ this.stepControl = tabControl;
30259
+ }
30260
+ get tabControl() {
30261
+ return this.stepControl;
30262
+ }
30263
+ infoBanners;
30264
+ content;
30265
+ stepControl;
30266
+ interacted = false;
30267
+ editable = true;
30268
+ get completed() {
30269
+ if (!this.interacted)
30270
+ return false;
30271
+ const control = this.tabControl;
30272
+ if (!control)
30273
+ return true;
30274
+ return !control.invalid && !control.pending;
30275
+ }
30276
+ get hasError() {
30277
+ return this.interacted && !!this.tabControl?.invalid;
30278
+ }
30279
+ _destroyed$ = new Subject();
30280
+ select() {
30281
+ const index = this._pageTabs.tabs.toArray().indexOf(this);
30282
+ if (index >= 0)
30283
+ this._pageTabs.selectedIndex = index;
30284
+ }
30285
+ ngOnInit() {
30286
+ this.validateLabel();
30287
+ if (this.tabControl)
30288
+ this.initErrorCheck();
30289
+ }
30290
+ ngOnChanges(changes) {
30291
+ ['label', 'errorMessage', 'state']
30292
+ .filter(inputName => !!changes[inputName])
30293
+ .forEach(inputName => this.blockCdkInput(inputName));
30294
+ }
30295
+ ngOnDestroy() {
30296
+ this._destroyed$.complete();
30297
+ }
30298
+ blockCdkInput(inputName) {
30299
+ throw new Error(`Quadrel Framework | QdPageTab - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabConfig instead.`);
30300
+ }
30301
+ validateLabel() {
30302
+ if (!this.config?.label?.i18n)
30303
+ console.error('Quadrel Framework | QdPageTab - Please provide a label for the tab.');
30304
+ }
30305
+ initErrorCheck() {
30306
+ this.tabControl.statusChanges.pipe(takeUntil$1(this._destroyed$)).subscribe(() => {
30307
+ if (this.hasAnyError(this.tabControl)) {
30308
+ this.interacted = true;
30309
+ }
30310
+ this._pageTabs._stateChanged();
30311
+ });
30312
+ }
30313
+ hasAnyError(control) {
30314
+ if (control.errors && control.touched)
30315
+ return true;
30316
+ if (control instanceof FormGroup) {
30317
+ return Object.values(control.controls).some(control => this.hasAnyError(control));
30318
+ }
30319
+ if (control instanceof FormArray) {
30320
+ return control.controls.some(control => this.hasAnyError(control));
30321
+ }
30322
+ return false;
30323
+ }
30324
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30325
+ 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 });
30326
+ }
30327
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, decorators: [{
30328
+ type: Component,
30329
+ 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"] }]
30330
+ }], propDecorators: { config: [{
30331
+ type: Input
30332
+ }], tabControl: [{
30333
+ type: Input
30334
+ }], infoBanners: [{
30335
+ type: ContentChildren,
30336
+ args: [QdPageInfoBannerComponent]
30337
+ }], content: [{
30338
+ type: ViewChild,
30339
+ args: [TemplateRef, { static: true }]
30340
+ }] } });
30341
+
30222
30342
  const TAB_PARAM_NAME = 'tab';
30223
30343
  const OWNED_PARAMS = [TAB_PARAM_NAME];
30224
30344
  const FEATURE_LABEL = { name: 'Page Tabs', plural: 'page tabs' };
30225
30345
  /**
30226
30346
  * Per-view adapter that syncs `QdPageTabsComponent` selection with the URL `?tab=` query
30227
30347
  * param via `QdRouterQueryParamHubService`. Reads on activation and selects the matching
30228
- * tab (with fallback for unknown/disabled names), writes on `selectionChange`. Coordination,
30348
+ * tab (with fallback for unknown/disabled names), writes on `tabSelection`. Coordination,
30229
30349
  * ownership, and write batching are delegated to the hub — see its JSDoc for details.
30230
30350
  * Behavior contracts live in `page-tabs-router-connector.service.spec.ts` and
30231
30351
  * `router-query-param-hub.integration.cy.ts`.
@@ -30236,9 +30356,9 @@ const FEATURE_LABEL = { name: 'Page Tabs', plural: 'page tabs' };
30236
30356
  * write pipeline (see commit 57f0a271a).
30237
30357
  *
30238
30358
  * Internal invariant: when the requested tab is unknown or disabled, `selectFallbackTab()`
30239
- * writes the URL explicitly. CdkStepper does not emit `selectionChange` if the fallback is
30240
- * already the selected step, so without the explicit write deep-links like `?tab=phantom`
30241
- * would leave a stale param in the URL.
30359
+ * writes the URL explicitly. `tabSelection` is not emitted if the fallback is already
30360
+ * the selected tab, so without the explicit write deep-links like `?tab=phantom` would
30361
+ * leave a stale param in the URL.
30242
30362
  */
30243
30363
  class QdPageTabsRouterConnectorService {
30244
30364
  _hub = inject(QdRouterQueryParamHubService);
@@ -30287,8 +30407,8 @@ class QdPageTabsRouterConnectorService {
30287
30407
  }
30288
30408
  subscribeToTabChanges() {
30289
30409
  const component = this._connectedComponent;
30290
- this._writeSubscription = component.selectionChange
30291
- .pipe(map(event => event.selectedStep?.config?.name), takeUntilDestroyed(this._destroyRef))
30410
+ this._writeSubscription = component.tabSelection
30411
+ .pipe(map(event => event.selectedTab?.config?.name), takeUntilDestroyed(this._destroyRef))
30292
30412
  .subscribe(name => this.writeUrl(name));
30293
30413
  }
30294
30414
  writeUrl(name) {
@@ -30524,10 +30644,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
30524
30644
  * - If an invalid tab name is provided in URL, the first available tab is selected
30525
30645
  * - If no tab parameter is present, the `selectedIndex` or first non-disabled tab is selected
30526
30646
  */
30527
- class QdPageTabsComponent extends CdkStepper {
30647
+ class QdPageTabsComponent {
30528
30648
  footerService = inject(QdPageFooterService, { optional: true });
30529
30649
  pageStoreService = inject(QdPageStoreService);
30530
30650
  routerConnector = inject(QdPageTabsRouterConnectorService);
30651
+ _changeDetectorRef = inject(ChangeDetectorRef);
30652
+ destroyRef = inject(DestroyRef);
30653
+ static _idCounter = 0;
30654
+ _id = QdPageTabsComponent._idCounter++;
30531
30655
  get hasPageFooter() {
30532
30656
  return !!this.footerService;
30533
30657
  }
@@ -30540,23 +30664,45 @@ class QdPageTabsComponent extends CdkStepper {
30540
30664
  */
30541
30665
  testId = 'page-tabs';
30542
30666
  tabSelection = new EventEmitter();
30667
+ _tabs;
30668
+ linear = false;
30669
+ _selectedIndex = 0;
30543
30670
  _viewonly;
30544
- destroyRef = inject(DestroyRef);
30545
30671
  get tabs() {
30546
- return this.steps;
30672
+ return this._tabs;
30547
30673
  }
30548
30674
  get selected() {
30549
- return super.selected;
30675
+ return this._tabs?.get(this._selectedIndex);
30550
30676
  }
30551
- set selected(step) {
30552
- super.selected = step;
30677
+ set selected(tab) {
30678
+ if (!tab)
30679
+ return;
30680
+ const index = this._tabs?.toArray().indexOf(tab);
30681
+ if (index !== undefined && index >= 0) {
30682
+ this.selectedIndex = index;
30683
+ }
30553
30684
  }
30554
- constructor() {
30555
- const _dir = inject(Directionality, { optional: true });
30556
- const _changeDetectorRef = inject(ChangeDetectorRef);
30557
- const _elementRef = inject(ElementRef);
30558
- super(_dir, _changeDetectorRef, _elementRef);
30559
- this.mapSelectionChangeToTabSelectionOutput();
30685
+ get selectedIndex() {
30686
+ return this._selectedIndex;
30687
+ }
30688
+ set selectedIndex(newIndex) {
30689
+ if (newIndex === this._selectedIndex)
30690
+ return;
30691
+ const prevIndex = this._selectedIndex;
30692
+ const prevTab = this._tabs?.get(prevIndex);
30693
+ if (prevTab?.tabControl) {
30694
+ prevTab.interacted = true;
30695
+ }
30696
+ this._selectedIndex = newIndex;
30697
+ if (this._tabs) {
30698
+ this.tabSelection.emit({
30699
+ selectedIndex: newIndex,
30700
+ previouslySelectedIndex: prevIndex,
30701
+ selectedTab: this._tabs.get(newIndex),
30702
+ previouslySelectedTab: this._tabs.get(prevIndex)
30703
+ });
30704
+ }
30705
+ this._changeDetectorRef.markForCheck();
30560
30706
  }
30561
30707
  ngOnInit() {
30562
30708
  this.linear = false;
@@ -30570,24 +30716,10 @@ class QdPageTabsComponent extends CdkStepper {
30570
30716
  .filter(inputName => !!changes[inputName])
30571
30717
  .forEach(inputName => this.blockCdkInput(inputName));
30572
30718
  }
30573
- _getIndicatorType(index, state) {
30574
- if (state)
30575
- return state;
30576
- const step = this.steps.get(index);
30577
- if (!step)
30578
- return 'number';
30579
- if (step.hasError)
30580
- return 'error';
30581
- if (step.completed)
30582
- return step.editable ? 'edit' : 'done';
30583
- return 'number';
30584
- }
30585
30719
  ngAfterContentInit() {
30586
- super.ngAfterContentInit();
30587
- this.tabs.changes.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this._stateChanged());
30720
+ this._tabs.changes.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this._stateChanged());
30588
30721
  }
30589
30722
  ngAfterViewInit() {
30590
- super.ngAfterViewInit();
30591
30723
  setTimeout(() => {
30592
30724
  if (this.config?.connectWithRouter) {
30593
30725
  this.configureBookmarkableTabs();
@@ -30596,9 +30728,42 @@ class QdPageTabsComponent extends CdkStepper {
30596
30728
  this.initializeTabSelection();
30597
30729
  });
30598
30730
  }
30731
+ _stateChanged() {
30732
+ this._changeDetectorRef.markForCheck();
30733
+ }
30734
+ _getIndicatorType(index) {
30735
+ const tab = this._tabs.get(index);
30736
+ if (!tab)
30737
+ return 'number';
30738
+ if (tab.hasError && !this._viewonly)
30739
+ return 'error';
30740
+ if (tab.completed)
30741
+ return tab.editable ? 'edit' : 'done';
30742
+ return 'number';
30743
+ }
30744
+ _getTabLabelId(i) {
30745
+ return `qd-tabs-${this._id}-label-${i}`;
30746
+ }
30747
+ save() {
30748
+ this.selected?.tabControl?.markAllAsTouched();
30749
+ const tabControlValues = this._tabs.map(tab => tab.tabControl?.value);
30750
+ this.config?.submitButton?.handler?.(tabControlValues);
30751
+ }
30752
+ selectTab(tab) {
30753
+ if (tab.config?.isDisabled)
30754
+ return;
30755
+ tab.select();
30756
+ }
30757
+ isSubmitButtonShown() {
30758
+ return this.config?.submitButton?.isHidden !== true && !this.footerService;
30759
+ }
30760
+ isSubmitButtonDisabled() {
30761
+ return this.config?.submitButton?.isDisabled;
30762
+ }
30599
30763
  initializeTabSelection() {
30600
30764
  if (this.config?.selectedIndex && this.isTabSelectable(this.config.selectedIndex)) {
30601
- this.selectedIndex = this.config.selectedIndex;
30765
+ this._selectedIndex = this.config.selectedIndex;
30766
+ this._changeDetectorRef.markForCheck();
30602
30767
  return;
30603
30768
  }
30604
30769
  this.selectFirstNotDisabledTab();
@@ -30607,19 +30772,20 @@ class QdPageTabsComponent extends CdkStepper {
30607
30772
  this.routerConnector.connectTabsWithRouter(this).pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
30608
30773
  }
30609
30774
  isTabSelectable(index) {
30610
- const tab = this.tabs.get(index);
30775
+ const tab = this._tabs.get(index);
30611
30776
  return !!tab && !tab.config.isDisabled;
30612
30777
  }
30613
30778
  /**
30614
30779
  * Selects the first tab that is not disabled.
30615
30780
  */
30616
30781
  selectFirstNotDisabledTab() {
30617
- this.tabs.some((tab, tabIndex) => {
30782
+ this._tabs.some((tab, tabIndex) => {
30618
30783
  if (!tab.config.isDisabled) {
30619
30784
  if (this.config) {
30620
30785
  this.config.selectedIndex = tabIndex;
30621
30786
  }
30622
- this.selectedIndex = tabIndex;
30787
+ this._selectedIndex = tabIndex;
30788
+ this._changeDetectorRef.markForCheck();
30623
30789
  return true;
30624
30790
  }
30625
30791
  else {
@@ -30627,51 +30793,25 @@ class QdPageTabsComponent extends CdkStepper {
30627
30793
  }
30628
30794
  });
30629
30795
  }
30630
- save() {
30631
- this.selected?.tabControl?.markAllAsTouched();
30632
- const tabControlValues = this.tabs.map(tab => tab.tabControl?.value);
30633
- this.config?.submitButton?.handler?.(tabControlValues);
30634
- }
30635
- selectTab(tab) {
30636
- if (tab.config?.isDisabled)
30637
- return;
30638
- tab.select();
30639
- }
30640
- isSubmitButtonShown() {
30641
- return this.config?.submitButton?.isHidden !== true && !this.footerService;
30642
- }
30643
- isSubmitButtonDisabled() {
30644
- return this.config?.submitButton?.isDisabled;
30645
- }
30646
- _getTabLabelId(i) {
30647
- return this._getStepLabelId(i);
30648
- }
30649
30796
  blockCdkInput(inputName) {
30650
30797
  throw new Error(`Quadrel Framework | QdPageTabs - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabsConfig instead.`);
30651
30798
  }
30652
- mapSelectionChangeToTabSelectionOutput() {
30653
- this.selectionChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(selectionEvent => {
30654
- this.tabSelection.emit({
30655
- selectedIndex: selectionEvent.selectedIndex,
30656
- previouslySelectedIndex: selectionEvent.previouslySelectedIndex,
30657
- selectedTab: selectionEvent.selectedStep,
30658
- previouslySelectedTab: selectionEvent.previouslySelectedStep
30659
- });
30660
- });
30661
- }
30662
30799
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30663
- 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 });
30800
+ 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 });
30664
30801
  }
30665
30802
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsComponent, decorators: [{
30666
30803
  type: Component,
30667
- 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"] }]
30668
- }], ctorParameters: () => [], propDecorators: { config: [{
30804
+ 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"] }]
30805
+ }], propDecorators: { config: [{
30669
30806
  type: Input
30670
30807
  }], testId: [{
30671
30808
  type: Input,
30672
30809
  args: ['data-test-id']
30673
30810
  }], tabSelection: [{
30674
30811
  type: Output
30812
+ }], _tabs: [{
30813
+ type: ContentChildren,
30814
+ args: [forwardRef(() => QdPageTabComponent)]
30675
30815
  }] } });
30676
30816
 
30677
30817
  class QdPageSubmitActionService {
@@ -34255,93 +34395,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
34255
34395
  }]
34256
34396
  }] });
34257
34397
 
34258
- // @ts-strict-ignore
34259
- /**
34260
- * The **QdPageTab** is a single tab inside the **QdPageTabs** within a **QdPage**.
34261
- */
34262
- class QdPageTabComponent extends CdkStep {
34263
- translate = inject(TranslateService);
34264
- /**
34265
- * Configuration of QdPageTabComponent.
34266
- *
34267
- * * @note The use of CDK attributes is not permitted. Please configure this component here.
34268
- */
34269
- config;
34270
- /** Form control for this tab. */
34271
- set tabControl(tabControl) {
34272
- this.stepControl = tabControl;
34273
- }
34274
- get tabControl() {
34275
- return this.stepControl;
34276
- }
34277
- infoBanners;
34278
- _destroyed$ = new Subject();
34279
- constructor() {
34280
- const tabs = inject(QdPageTabsComponent);
34281
- const stepperOptions = inject(STEPPER_GLOBAL_OPTIONS, { optional: true });
34282
- super(tabs, stepperOptions);
34283
- }
34284
- ngOnInit() {
34285
- this.validateLabel();
34286
- if (this.tabControl)
34287
- this.initErrorCheck();
34288
- }
34289
- ngOnChanges(changes) {
34290
- super.ngOnChanges();
34291
- ['label', 'errorMessage', 'state']
34292
- .filter(inputName => !!changes[inputName])
34293
- .forEach(inputName => this.blockCdkInput(inputName));
34294
- }
34295
- ngOnDestroy() {
34296
- this._destroyed$.complete();
34297
- }
34298
- blockCdkInput(inputName) {
34299
- throw new Error(`Quadrel Framework | QdPageTab - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabConfig instead.`);
34300
- }
34301
- validateLabel() {
34302
- if (!this.config?.label?.i18n)
34303
- console.error('Quadrel Framework | QdPageTab - Please provide a label for the tab.');
34304
- }
34305
- initErrorCheck() {
34306
- this.tabControl.statusChanges.pipe(takeUntil$1(this._destroyed$)).subscribe(() => {
34307
- if (this.hasAnyError(this.tabControl)) {
34308
- this.interacted = true;
34309
- }
34310
- });
34311
- }
34312
- hasAnyError(control) {
34313
- if (control.errors && control.touched)
34314
- return true;
34315
- if (control instanceof FormGroup) {
34316
- return Object.values(control.controls).some(control => this.hasAnyError(control));
34317
- }
34318
- if (control instanceof FormArray) {
34319
- return control.controls.some(control => this.hasAnyError(control));
34320
- }
34321
- return false;
34322
- }
34323
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
34324
- 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: [
34325
- { provide: CdkStep, useExisting: QdPageTabComponent },
34326
- { provide: STEPPER_GLOBAL_OPTIONS, useValue: { showError: true } }
34327
- ], 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 });
34328
- }
34329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, decorators: [{
34330
- type: Component,
34331
- args: [{ selector: 'qd-page-tab', providers: [
34332
- { provide: CdkStep, useExisting: QdPageTabComponent },
34333
- { provide: STEPPER_GLOBAL_OPTIONS, useValue: { showError: true } }
34334
- ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true // inherited by CdkStep
34335
- , 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"] }]
34336
- }], ctorParameters: () => [], propDecorators: { config: [{
34337
- type: Input
34338
- }], tabControl: [{
34339
- type: Input
34340
- }], infoBanners: [{
34341
- type: ContentChildren,
34342
- args: [QdPageInfoBannerComponent]
34343
- }] } });
34344
-
34345
34398
  /**
34346
34399
  * **qdPageTabParameterize** turns the active page tab into the `tab` query parameter
34347
34400
  * (`?tab=<name>`).
@@ -34372,7 +34425,6 @@ class QdPageTabsModule {
34372
34425
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
34373
34426
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsModule, declarations: [QdPageTabsAdapterDirective], imports: [CommonModule,
34374
34427
  TranslateModule,
34375
- CdkStepperModule,
34376
34428
  QdButtonModule,
34377
34429
  QdIconModule,
34378
34430
  QdPageTabsComponent,
@@ -34381,7 +34433,6 @@ class QdPageTabsModule {
34381
34433
  QdPageTabHeaderCountersComponent], exports: [QdPageTabsComponent, QdPageTabComponent, QdPageTabsAdapterDirective] });
34382
34434
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsModule, imports: [CommonModule,
34383
34435
  TranslateModule,
34384
- CdkStepperModule,
34385
34436
  QdButtonModule,
34386
34437
  QdIconModule,
34387
34438
  QdPageTabsComponent] });
@@ -34392,7 +34443,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
34392
34443
  imports: [
34393
34444
  CommonModule,
34394
34445
  TranslateModule,
34395
- CdkStepperModule,
34396
34446
  QdButtonModule,
34397
34447
  QdIconModule,
34398
34448
  QdPageTabsComponent,
@@ -35049,5 +35099,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
35049
35099
  * Generated bundle index. Do not edit.
35050
35100
  */
35051
35101
 
35052
- 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 };
35102
+ 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 };
35053
35103
  //# sourceMappingURL=quadrel-enterprise-ui-framework.mjs.map