@quadrel-enterprise-ui/framework 20.11.1 → 20.11.2-beta.150.1

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, SecurityContext, NgZone, ViewChildren, forwardRef, DestroyRef, 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, CUSTOM_ELEMENTS_SCHEMA, provideAppInitializer, TemplateRef } 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';
@@ -18,6 +18,7 @@ import { NG_VALUE_ACCESSOR, FormsModule, UntypedFormControl, UntypedFormArray, U
18
18
  import { ComponentPortal } from '@angular/cdk/portal';
19
19
  import { OverlayPositionBuilder, Overlay } from '@angular/cdk/overlay';
20
20
  import isNumber from 'lodash/isNumber';
21
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
21
22
  import { EventSourcePolyfill } from 'event-source-polyfill';
22
23
  import { DomSanitizer } from '@angular/platform-browser';
23
24
  import * as i3$1 from 'ngx-editor';
@@ -31,7 +32,6 @@ import 'moment/locale/fr';
31
32
  import 'moment/locale/it';
32
33
  import moment$1 from 'moment/moment';
33
34
  import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';
34
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
35
35
  import * as i1$1 from '@ngrx/store';
36
36
  import { createAction, props, createReducer, on, createSelector, createFeatureSelector, Store, StoreModule } from '@ngrx/store';
37
37
  import { diff } from 'deep-object-diff';
@@ -52,7 +52,7 @@ class QdButtonLinkDirective {
52
52
  ngOnInit() {
53
53
  // TODO: Delete directive "qd-button-link" in Version 21
54
54
  if (this._elementRef.nativeElement.attributes.hasOwnProperty('qd-button-link')) {
55
- console.warn('QD-UI | QdButtonLinkDirective - The directive "qd-button-link" is deprecated. Please use "qdButtonLink" instead.');
55
+ console.warn('Quadrel Framework | QdButtonLink - The directive "qd-button-link" is deprecated. Please use "qdButtonLink" instead.');
56
56
  }
57
57
  }
58
58
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdButtonLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -649,7 +649,7 @@ class QdIconComponent {
649
649
  this.iconCode = icon.htmlEntity;
650
650
  }
651
651
  if (!icon) {
652
- console.error(`QD-UI | QdIconComponent - ${this.icon} seems not be a valid Quadrel Icon. Please check documentation for available icons.`);
652
+ console.error(`Quadrel Framework | QdIcon - "${this.icon}" does not appear to be a valid Quadrel Icon. Please check documentation for available icons.`);
653
653
  }
654
654
  }
655
655
  insertIconSvgOnce() {
@@ -698,7 +698,7 @@ class QdSnackbarService {
698
698
  if (this.isPausing)
699
699
  return;
700
700
  if (!this._overlayRef) {
701
- console.error('QdUi | QdNotifications: You are trying to open a notification as snackbar but there is no Snackbar Listener initialized.');
701
+ console.error('Quadrel Framework | QdNotifications - You are trying to open a notification as snackbar but there is no Snackbar Listener initialized.');
702
702
  return;
703
703
  }
704
704
  this._notificationsSubject.next([...this._notificationsSubject.value, notification]);
@@ -916,7 +916,7 @@ class QdNotificationsService {
916
916
  return;
917
917
  if (this.zeroToInfinity(snackbarNotificationLifeTime) >
918
918
  this.zeroToInfinity(this.getNotificationLifeTime(notification))) {
919
- console.warn('The life time of the snackbar notification must be shorter than the life time of the main notification.');
919
+ console.warn('Quadrel Framework | QdNotifications - The life time of the snackbar notification must be shorter than the life time of the main notification.');
920
920
  return;
921
921
  }
922
922
  setTimeout(() => this.snackbarService.close(notification.uuid), snackbarNotificationLifeTime * 1000);
@@ -926,7 +926,7 @@ class QdNotificationsService {
926
926
  if (osNotificationLifeTime === undefined)
927
927
  return;
928
928
  if (this.zeroToInfinity(osNotificationLifeTime) > this.zeroToInfinity(this.getNotificationLifeTime(notification))) {
929
- console.warn('The life time of the OS notification must be shorter than the life time of the main notification.');
929
+ console.warn('Quadrel Framework | QdNotifications - The life time of the OS notification must be shorter than the life time of the main notification.');
930
930
  return;
931
931
  }
932
932
  setTimeout(() => this.osNotificationsService.close(notification.uuid), osNotificationLifeTime * 1000);
@@ -1046,7 +1046,7 @@ class QdButtonComponent {
1046
1046
  ngOnInit() {
1047
1047
  // TODO: Delete directive "qd-button" in Version 20
1048
1048
  if (this._elementRef.nativeElement.attributes.hasOwnProperty('qd-button')) {
1049
- console.warn('QD-UI | QdButtonComponent - The directive "qd-button" is deprecated. Please use "qdButton" instead.');
1049
+ console.warn('Quadrel Framework | QdButton - The directive "qd-button" is deprecated. Please use "qdButton" instead.');
1050
1050
  }
1051
1051
  }
1052
1052
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -1265,7 +1265,7 @@ class QdDialogService {
1265
1265
  this.clearPageDialogCanCloseForce();
1266
1266
  this.updateDialogData(data);
1267
1267
  if (!this.pageDialogHost)
1268
- throw new Error('QdDialogService | Page dialog host component is not provided.');
1268
+ throw new Error('Quadrel Framework | QdDialog - Page dialog host component is not provided.');
1269
1269
  this.open(this.pageDialogHost, { dialogSize: QdDialogSize.FullWidth });
1270
1270
  this.navigateInsideDialog(routePath || this.getFirstDialogOutletRoutePathOrThrow());
1271
1271
  }
@@ -1326,7 +1326,7 @@ class QdDialogService {
1326
1326
  getFirstDialogOutletRoutePathOrThrow() {
1327
1327
  const firstDialogOutletRoutePath = this.router.config.find(route => route.outlet === 'dialog')?.path;
1328
1328
  if (!firstDialogOutletRoutePath || this.hasRoutePathParameters(firstDialogOutletRoutePath)) {
1329
- throw new Error('QdDialogService | Please provide a route for the openPageDialogWithBreadcrumbs method. ' +
1329
+ throw new Error('Quadrel Framework | QdDialog - Please provide a route for the openPageDialogWithBreadcrumbs method. ' +
1330
1330
  'The main dialog route could not be determined automatically.');
1331
1331
  }
1332
1332
  return firstDialogOutletRoutePath;
@@ -1368,7 +1368,7 @@ class QdIconButtonComponent {
1368
1368
  ngOnInit() {
1369
1369
  // TODO: Delete directive "qd-icon-button" in Version 15
1370
1370
  if (this._elementRef.nativeElement.attributes.hasOwnProperty('qd-icon-button')) {
1371
- console.warn('QD-UI | QdIconButtonComponent - The directive "qd-icon-button" is deprecated. Please use "qdIconButton" instead.');
1371
+ console.warn('Quadrel Framework | QdIconButton - The directive "qd-icon-button" is deprecated. Please use "qdIconButton" instead.');
1372
1372
  }
1373
1373
  }
1374
1374
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdIconButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -1604,6 +1604,24 @@ const updateHtmlLang = (lang) => {
1604
1604
  const htmlNode = document.documentElement;
1605
1605
  htmlNode.setAttribute('lang', lang);
1606
1606
  };
1607
+ const SERVICE_NAV_LOCALE_DEFAULTS = {
1608
+ DE: 'de-CH',
1609
+ IT: 'it-CH',
1610
+ FR: 'fr-CH',
1611
+ EN: 'en-GB'
1612
+ };
1613
+ const determineLocale = (serviceNavLanguage, browserLocales) => {
1614
+ const browserLocale = browserLocales?.[0] ?? navigator.language;
1615
+ if (!serviceNavLanguage) {
1616
+ const browserLocaleUpper = browserLocale.toUpperCase();
1617
+ return SERVICE_NAV_LOCALE_DEFAULTS[browserLocaleUpper] ?? browserLocale;
1618
+ }
1619
+ const serviceNavLangUpper = serviceNavLanguage.toUpperCase();
1620
+ const browserLanguage = browserLocale.split('-')[0].toUpperCase();
1621
+ if (browserLanguage === serviceNavLangUpper)
1622
+ return browserLocale;
1623
+ return SERVICE_NAV_LOCALE_DEFAULTS[serviceNavLangUpper] ?? browserLocale;
1624
+ };
1607
1625
 
1608
1626
  const constantCase = (str) => upperCase(str).replace(/ /g, '_');
1609
1627
 
@@ -6636,6 +6654,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
6636
6654
  }]
6637
6655
  }] });
6638
6656
 
6657
+ const QD_SAFE_BOTTOM_OFFSET = new InjectionToken('QD_SAFE_BOTTOM_OFFSET');
6658
+
6639
6659
  let QdFileSizePipe$1 = class QdFileSizePipe {
6640
6660
  translate = inject(TranslateService, { optional: true });
6641
6661
  transform(bytes) {
@@ -6687,10 +6707,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
6687
6707
  }]
6688
6708
  }] });
6689
6709
 
6710
+ const QD_POPOVER_TOP_FIRST = new InjectionToken('QD_POPOVER_TOP_FIRST');
6711
+
6690
6712
  class QdProjectionGuardComponent {
6691
6713
  elementRef = inject(ElementRef);
6692
6714
  isDisabled = false;
6693
- warningMessage = 'QD-UI | QdProjectionGuard - This content is not supported and cannot be displayed:';
6715
+ warningMessage = 'Quadrel Framework | QdProjectionGuard - This content is not supported and cannot be displayed:';
6694
6716
  wildcardSlot;
6695
6717
  ngAfterContentInit() {
6696
6718
  if (this.isDisabled)
@@ -6728,156 +6750,123 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
6728
6750
  }]
6729
6751
  }] });
6730
6752
 
6731
- var breakpoints$1 = {
6732
- xs: 320,
6733
- sm: 600,
6734
- md: 960,
6735
- lg: 1280,
6736
- xl: 1600,
6737
- xxl: 1800
6738
- };
6739
- var panel = {
6740
- sm: 432,
6741
- md: 588,
6742
- lg: 720
6743
- };
6744
- var base = {
6745
- fontsize: 16
6746
- };
6747
- var globalVars = {
6748
- breakpoints: breakpoints$1,
6749
- panel: panel,
6750
- base: base
6751
- };
6752
-
6753
- const convertPxToRem = (pixel) => `${parseFloat((pixel / globalVars.base.fontsize).toFixed(3))}rem`;
6754
-
6755
- class QdTooltipComponent {
6756
- content;
6757
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6758
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdTooltipComponent, isStandalone: false, selector: "qd-tooltip", inputs: { content: "content" }, ngImport: i0, template: "<ng-container *ngIf=\"content?.headline\">\n <strong>{{ content.headline }}</strong>\n</ng-container>\n\n<ng-container *ngFor=\"let paragraph of content.paragraphs\">\n <p>{{ paragraph }}</p>\n</ng-container>\n", styles: [":host{box-shadow:0 0 .625rem #979797;display:block;width:100%;max-width:16rem;padding:.5rem;border-radius:.5rem;background-color:#000;color:#fff;font-size:.75rem;line-height:1rem}:host strong,:host p{display:block}:host p{margin:0 0 .5rem}:host p:last-child{margin-bottom:0}\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"] }] });
6753
+ class QdLocaleService {
6754
+ _serviceNavLanguage$ = new BehaviorSubject(null);
6755
+ locale$ = this._serviceNavLanguage$.pipe(map(serviceNavLanguage => determineLocale(serviceNavLanguage, navigator.languages)));
6756
+ setServiceNavigationLanguage(language) {
6757
+ this._serviceNavLanguage$.next(language);
6758
+ }
6759
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6760
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdLocaleService, providedIn: 'root' });
6759
6761
  }
6760
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipComponent, decorators: [{
6761
- type: Component,
6762
- args: [{ selector: 'qd-tooltip', standalone: false, template: "<ng-container *ngIf=\"content?.headline\">\n <strong>{{ content.headline }}</strong>\n</ng-container>\n\n<ng-container *ngFor=\"let paragraph of content.paragraphs\">\n <p>{{ paragraph }}</p>\n</ng-container>\n", styles: [":host{box-shadow:0 0 .625rem #979797;display:block;width:100%;max-width:16rem;padding:.5rem;border-radius:.5rem;background-color:#000;color:#fff;font-size:.75rem;line-height:1rem}:host strong,:host p{display:block}:host p{margin:0 0 .5rem}:host p:last-child{margin-bottom:0}\n"] }]
6763
- }], propDecorators: { content: [{
6764
- type: Input
6765
- }] } });
6762
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdLocaleService, decorators: [{
6763
+ type: Injectable,
6764
+ args: [{ providedIn: 'root' }]
6765
+ }] });
6766
6766
 
6767
- const TARGET_SELECTOR = '.qd-intersection-target';
6768
- const SHOW_EVENTS = ['mouseenter', 'mousemove'];
6769
- const HIDE_EVENTS = ['mouseleave', 'click'];
6770
- const HIDE_DELAY = 300;
6771
- const OVERLAY_WIDTH = 280;
6772
- const UNSUBSCRIBE_IMMEDIATELY = true;
6773
- const THRESHOLD = 1;
6774
- /**
6775
- * QdTooltipAtIntersectionDirective provides a tooltip. This will be triggered if the content is intersected.
6776
- *
6777
- * * Selector: [qdTooltipAtIntersection]
6778
- * * Target Selector: .qd-intersection-target
6779
- *
6780
- * The IntersectionObserver API is used for the implementation.
6781
- * * @see https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver
6782
- *
6783
- * * Note: The intersection of the target is calculated by the IntersectionObserver only once, initially (can be extended later if required). After that it will be unsubscribed immediately.
6784
- * */
6785
- class QdTooltipAtIntersectionDirective {
6786
- _host = inject(ElementRef);
6787
- _positionBuilder = inject(OverlayPositionBuilder);
6788
- _overlay = inject(Overlay);
6789
- _overlayRef;
6790
- _target;
6791
- _observer$;
6792
- _isIntersected = false;
6793
- _destroyed$ = new Subject();
6794
- ngAfterViewInit() {
6795
- this.setTarget();
6796
- this.observeTarget();
6797
- this.createOverlay();
6798
- this.subscribeShow();
6799
- this.subscribeHide();
6767
+ class QdNumberInputService {
6768
+ _locale;
6769
+ _decimalSeparator;
6770
+ _groupSeparator;
6771
+ localeService = inject(QdLocaleService, { optional: true });
6772
+ destroyRef = inject(DestroyRef);
6773
+ ambiguityHintKeyDot = 'i18n.qd.input.number.ambiguousHint.dot';
6774
+ ambiguityHintKeyComma = 'i18n.qd.input.number.ambiguousHint.comma';
6775
+ invalidCharactersErrorKeyComma = 'i18n.qd.input.number.invalidCharacters.comma';
6776
+ invalidCharactersErrorKeyDot = 'i18n.qd.input.number.invalidCharacters.dot';
6777
+ get invalidCharactersErrorKey() {
6778
+ return this._decimalSeparator === ',' ? this.invalidCharactersErrorKeyComma : this.invalidCharactersErrorKeyDot;
6800
6779
  }
6801
- ngOnDestroy() {
6802
- this._observer$.unobserve(this._target);
6803
- this._destroyed$.next();
6804
- this._destroyed$.complete();
6780
+ get decimalSeparator() {
6781
+ return this._decimalSeparator;
6805
6782
  }
6806
- setTarget() {
6807
- this._target = this._host.nativeElement.querySelector(TARGET_SELECTOR);
6783
+ get groupSeparator() {
6784
+ return this._groupSeparator;
6808
6785
  }
6809
- observeTarget() {
6810
- const options = {
6811
- root: this._host.nativeElement,
6812
- threshold: THRESHOLD
6813
- };
6814
- this._observer$ = new IntersectionObserver(entries => {
6815
- this._isIntersected = entries[0].intersectionRatio < 1;
6816
- if (this._isIntersected) {
6817
- this._setStyles();
6818
- if (UNSUBSCRIBE_IMMEDIATELY)
6819
- this._observer$.unobserve(this._target);
6820
- }
6821
- }, options);
6822
- this._observer$.observe(this._target);
6786
+ constructor() {
6787
+ if (this.localeService) {
6788
+ this.localeService.locale$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(locale => {
6789
+ this.detectSeparatorsForLocale(locale);
6790
+ });
6791
+ }
6792
+ else {
6793
+ this.detectSeparators();
6794
+ }
6823
6795
  }
6824
- _setStyles() {
6825
- this._target.style.overflow = 'hidden';
6826
- this._target.style.textOverflow = 'ellipsis';
6827
- this._target.style.cursor = 'help';
6796
+ detectSeparators() {
6797
+ const locale = navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language;
6798
+ this.detectSeparatorsForLocale(locale);
6828
6799
  }
6829
- createOverlay() {
6830
- this._overlayRef = this._overlay.create({
6831
- positionStrategy: this._positionBuilder
6832
- .flexibleConnectedTo(this._host)
6833
- .withPositions([{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' }]),
6834
- width: convertPxToRem(OVERLAY_WIDTH)
6835
- });
6800
+ isValidNumber(value) {
6801
+ if (!value)
6802
+ return false;
6803
+ const escaped = this._decimalSeparator.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
6804
+ return new RegExp(`^-?\\d+(${escaped}\\d+)?$`).test(value);
6805
+ }
6806
+ detectSeparatorsForLocale(locale) {
6807
+ this._locale = locale;
6808
+ const parts = new Intl.NumberFormat(locale).formatToParts(1234567.89);
6809
+ this._decimalSeparator = parts.find(p => p.type === 'decimal')?.value ?? '.';
6810
+ this._groupSeparator = parts.find(p => p.type === 'group')?.value ?? ',';
6811
+ }
6812
+ filterValue(value) {
6813
+ let result = '';
6814
+ let hasDecimal = false;
6815
+ for (let i = 0; i < value.length; i++) {
6816
+ const char = value[i];
6817
+ if (char >= '0' && char <= '9') {
6818
+ result += char;
6819
+ }
6820
+ else if (char === this._decimalSeparator && !hasDecimal) {
6821
+ result += char;
6822
+ hasDecimal = true;
6823
+ }
6824
+ else if (char === '-' && i === 0) {
6825
+ result += char;
6826
+ }
6827
+ }
6828
+ return result;
6836
6829
  }
6837
- subscribeShow() {
6838
- merge(...SHOW_EVENTS.map(event => fromEvent(this._host.nativeElement, event)))
6839
- .pipe(takeUntil(this._destroyed$), filter(() => !this._overlayRef.hasAttached() && this._isIntersected))
6840
- .subscribe(() => {
6841
- const content = this.getContent();
6842
- const tooltipPortal = new ComponentPortal(QdTooltipComponent);
6843
- const tooltipRef = this._overlayRef.attach(tooltipPortal);
6844
- tooltipRef.instance.content = content;
6845
- });
6830
+ parseValue(value) {
6831
+ if (!value)
6832
+ return value;
6833
+ const normalized = value.split(this._groupSeparator).join('').replace(this._decimalSeparator, '.');
6834
+ const parsed = parseFloat(normalized);
6835
+ return isNaN(parsed) ? value : parsed;
6846
6836
  }
6847
- subscribeHide() {
6848
- merge(...HIDE_EVENTS.map(event => fromEvent(this._host.nativeElement, event)))
6849
- .pipe(takeUntil(this._destroyed$), filter(() => this._overlayRef.hasAttached()), debounceTime(HIDE_DELAY))
6850
- .subscribe(() => this._overlayRef.detach());
6837
+ isAmbiguous(value) {
6838
+ if (typeof value !== 'string' || !value)
6839
+ return false;
6840
+ return /^-?[1-9]\d*[.,]\d{3}$/.test(value);
6851
6841
  }
6852
- getContent() {
6853
- return {
6854
- headline: this._target.getAttribute('data-tooltip-headline') || undefined,
6855
- paragraphs: [this._target.textContent?.trim() || '']
6856
- };
6842
+ getAmbiguityHintKey(value) {
6843
+ if (typeof value === 'string' && value.includes('.'))
6844
+ return this.ambiguityHintKeyDot;
6845
+ return this.ambiguityHintKeyComma;
6857
6846
  }
6858
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipAtIntersectionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6859
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdTooltipAtIntersectionDirective, isStandalone: false, selector: "[qdTooltipAtIntersection]", ngImport: i0 });
6860
- }
6861
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipAtIntersectionDirective, decorators: [{
6862
- type: Directive,
6863
- args: [{
6864
- selector: '[qdTooltipAtIntersection]',
6865
- standalone: false
6866
- }]
6867
- }] });
6868
-
6869
- class QdVisuallyHiddenDirective {
6870
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdVisuallyHiddenDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6871
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdVisuallyHiddenDirective, isStandalone: false, selector: "[qdVisuallyHidden]", host: { classAttribute: "qd-visually-hidden" }, ngImport: i0 });
6847
+ formatNumberForViewonly(value) {
6848
+ if (value == null || value === '')
6849
+ return '';
6850
+ const str = String(value);
6851
+ const parsed = typeof value === 'number' ? value : this.parseValue(str);
6852
+ if (typeof parsed !== 'number')
6853
+ return str;
6854
+ return new Intl.NumberFormat(this._locale).format(parsed);
6855
+ }
6856
+ formatValueForDisplay(value) {
6857
+ if (value == null || value === '')
6858
+ return '';
6859
+ const str = String(value);
6860
+ if (this._decimalSeparator === '.')
6861
+ return str;
6862
+ return str.replace('.', this._decimalSeparator);
6863
+ }
6864
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdNumberInputService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6865
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdNumberInputService });
6872
6866
  }
6873
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdVisuallyHiddenDirective, decorators: [{
6874
- type: Directive,
6875
- args: [{
6876
- selector: '[qdVisuallyHidden]',
6877
- host: { class: 'qd-visually-hidden' },
6878
- standalone: false
6879
- }]
6880
- }] });
6867
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdNumberInputService, decorators: [{
6868
+ type: Injectable
6869
+ }], ctorParameters: () => [] });
6881
6870
 
6882
6871
  /**
6883
6872
  * Manages a server-sent event (SSE) connection with automatic reconnection and heartbeat monitoring.
@@ -7100,10 +7089,10 @@ class QdPushEventsService {
7100
7089
  this._listeners = [];
7101
7090
  }
7102
7091
  logWarn(message) {
7103
- console.warn(`QD-UI | QdPushEvents - ${message}`);
7092
+ console.warn(`Quadrel Framework | QdPushEvents - ${message}`);
7104
7093
  }
7105
7094
  logError(message, err) {
7106
- console.error(`QD-UI | QdPushEvents - ${message}`, err);
7095
+ console.error(`Quadrel Framework | QdPushEvents - ${message}`, err);
7107
7096
  }
7108
7097
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPushEventsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7109
7098
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPushEventsService, providedIn: 'root' });
@@ -7115,6 +7104,144 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
7115
7104
  }]
7116
7105
  }] });
7117
7106
 
7107
+ var breakpoints$1 = {
7108
+ xs: 320,
7109
+ sm: 600,
7110
+ md: 960,
7111
+ lg: 1280,
7112
+ xl: 1600,
7113
+ xxl: 1800
7114
+ };
7115
+ var panel = {
7116
+ sm: 432,
7117
+ md: 588,
7118
+ lg: 720
7119
+ };
7120
+ var base = {
7121
+ fontsize: 16
7122
+ };
7123
+ var globalVars = {
7124
+ breakpoints: breakpoints$1,
7125
+ panel: panel,
7126
+ base: base
7127
+ };
7128
+
7129
+ const convertPxToRem = (pixel) => `${parseFloat((pixel / globalVars.base.fontsize).toFixed(3))}rem`;
7130
+
7131
+ class QdTooltipComponent {
7132
+ content;
7133
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7134
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdTooltipComponent, isStandalone: false, selector: "qd-tooltip", inputs: { content: "content" }, ngImport: i0, template: "<ng-container *ngIf=\"content?.headline\">\n <strong>{{ content.headline }}</strong>\n</ng-container>\n\n<ng-container *ngFor=\"let paragraph of content.paragraphs\">\n <p>{{ paragraph }}</p>\n</ng-container>\n", styles: [":host{box-shadow:0 0 .625rem #979797;display:block;width:100%;max-width:16rem;padding:.5rem;border-radius:.5rem;background-color:#000;color:#fff;font-size:.75rem;line-height:1rem}:host strong,:host p{display:block}:host p{margin:0 0 .5rem}:host p:last-child{margin-bottom:0}\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"] }] });
7135
+ }
7136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipComponent, decorators: [{
7137
+ type: Component,
7138
+ args: [{ selector: 'qd-tooltip', standalone: false, template: "<ng-container *ngIf=\"content?.headline\">\n <strong>{{ content.headline }}</strong>\n</ng-container>\n\n<ng-container *ngFor=\"let paragraph of content.paragraphs\">\n <p>{{ paragraph }}</p>\n</ng-container>\n", styles: [":host{box-shadow:0 0 .625rem #979797;display:block;width:100%;max-width:16rem;padding:.5rem;border-radius:.5rem;background-color:#000;color:#fff;font-size:.75rem;line-height:1rem}:host strong,:host p{display:block}:host p{margin:0 0 .5rem}:host p:last-child{margin-bottom:0}\n"] }]
7139
+ }], propDecorators: { content: [{
7140
+ type: Input
7141
+ }] } });
7142
+
7143
+ const TARGET_SELECTOR = '.qd-intersection-target';
7144
+ const SHOW_EVENTS = ['mouseenter', 'mousemove'];
7145
+ const HIDE_EVENTS = ['mouseleave', 'click'];
7146
+ const HIDE_DELAY = 300;
7147
+ const OVERLAY_WIDTH = 280;
7148
+ const UNSUBSCRIBE_IMMEDIATELY = true;
7149
+ const THRESHOLD = 1;
7150
+ /**
7151
+ * QdTooltipAtIntersectionDirective provides a tooltip. This will be triggered if the content is intersected.
7152
+ *
7153
+ * * Selector: [qdTooltipAtIntersection]
7154
+ * * Target Selector: .qd-intersection-target
7155
+ *
7156
+ * The IntersectionObserver API is used for the implementation.
7157
+ * * @see https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver
7158
+ *
7159
+ * * Note: The intersection of the target is calculated by the IntersectionObserver only once, initially (can be extended later if required). After that it will be unsubscribed immediately.
7160
+ * */
7161
+ class QdTooltipAtIntersectionDirective {
7162
+ _host = inject(ElementRef);
7163
+ _positionBuilder = inject(OverlayPositionBuilder);
7164
+ _overlay = inject(Overlay);
7165
+ _overlayRef;
7166
+ _target;
7167
+ _observer$;
7168
+ _isIntersected = false;
7169
+ _destroyed$ = new Subject();
7170
+ ngAfterViewInit() {
7171
+ this.setTarget();
7172
+ this.observeTarget();
7173
+ this.createOverlay();
7174
+ this.subscribeShow();
7175
+ this.subscribeHide();
7176
+ }
7177
+ ngOnDestroy() {
7178
+ this._observer$.unobserve(this._target);
7179
+ this._destroyed$.next();
7180
+ this._destroyed$.complete();
7181
+ }
7182
+ setTarget() {
7183
+ this._target = this._host.nativeElement.querySelector(TARGET_SELECTOR);
7184
+ }
7185
+ observeTarget() {
7186
+ const options = {
7187
+ root: this._host.nativeElement,
7188
+ threshold: THRESHOLD
7189
+ };
7190
+ this._observer$ = new IntersectionObserver(entries => {
7191
+ this._isIntersected = entries[0].intersectionRatio < 1;
7192
+ if (this._isIntersected) {
7193
+ this._setStyles();
7194
+ if (UNSUBSCRIBE_IMMEDIATELY)
7195
+ this._observer$.unobserve(this._target);
7196
+ }
7197
+ }, options);
7198
+ this._observer$.observe(this._target);
7199
+ }
7200
+ _setStyles() {
7201
+ this._target.style.overflow = 'hidden';
7202
+ this._target.style.textOverflow = 'ellipsis';
7203
+ this._target.style.cursor = 'help';
7204
+ }
7205
+ createOverlay() {
7206
+ this._overlayRef = this._overlay.create({
7207
+ positionStrategy: this._positionBuilder
7208
+ .flexibleConnectedTo(this._host)
7209
+ .withPositions([{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' }]),
7210
+ width: convertPxToRem(OVERLAY_WIDTH)
7211
+ });
7212
+ }
7213
+ subscribeShow() {
7214
+ merge(...SHOW_EVENTS.map(event => fromEvent(this._host.nativeElement, event)))
7215
+ .pipe(takeUntil(this._destroyed$), filter(() => !this._overlayRef.hasAttached() && this._isIntersected))
7216
+ .subscribe(() => {
7217
+ const content = this.getContent();
7218
+ const tooltipPortal = new ComponentPortal(QdTooltipComponent);
7219
+ const tooltipRef = this._overlayRef.attach(tooltipPortal);
7220
+ tooltipRef.instance.content = content;
7221
+ });
7222
+ }
7223
+ subscribeHide() {
7224
+ merge(...HIDE_EVENTS.map(event => fromEvent(this._host.nativeElement, event)))
7225
+ .pipe(takeUntil(this._destroyed$), filter(() => this._overlayRef.hasAttached()), debounceTime(HIDE_DELAY))
7226
+ .subscribe(() => this._overlayRef.detach());
7227
+ }
7228
+ getContent() {
7229
+ return {
7230
+ headline: this._target.getAttribute('data-tooltip-headline') || undefined,
7231
+ paragraphs: [this._target.textContent?.trim() || '']
7232
+ };
7233
+ }
7234
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipAtIntersectionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7235
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdTooltipAtIntersectionDirective, isStandalone: false, selector: "[qdTooltipAtIntersection]", ngImport: i0 });
7236
+ }
7237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTooltipAtIntersectionDirective, decorators: [{
7238
+ type: Directive,
7239
+ args: [{
7240
+ selector: '[qdTooltipAtIntersection]',
7241
+ standalone: false
7242
+ }]
7243
+ }] });
7244
+
7118
7245
  const MAX_TOOLTIP_CHARACTER = 512;
7119
7246
  const TOOLTIP_POSITIONS = [
7120
7247
  { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' },
@@ -7180,7 +7307,7 @@ class QdTooltipOnClickDirective {
7180
7307
  truncateText(text) {
7181
7308
  if (text.length <= MAX_TOOLTIP_CHARACTER)
7182
7309
  return text.trim();
7183
- console.warn(`QdUi | QdTooltip - Tooltip content exceeds ${MAX_TOOLTIP_CHARACTER} characters. It will be truncated.`);
7310
+ console.warn(`Quadrel Framework | QdTooltip - Tooltip content exceeds ${MAX_TOOLTIP_CHARACTER} characters. It will be truncated.`);
7184
7311
  return `${text.substring(0, MAX_TOOLTIP_CHARACTER).trim()}...`;
7185
7312
  }
7186
7313
  translate(key) {
@@ -7220,9 +7347,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
7220
7347
  type: Input
7221
7348
  }] } });
7222
7349
 
7223
- const QD_SAFE_BOTTOM_OFFSET = new InjectionToken('QD_SAFE_BOTTOM_OFFSET');
7224
-
7225
- const QD_POPOVER_TOP_FIRST = new InjectionToken('QD_POPOVER_TOP_FIRST');
7350
+ class QdVisuallyHiddenDirective {
7351
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdVisuallyHiddenDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7352
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdVisuallyHiddenDirective, isStandalone: false, selector: "[qdVisuallyHidden]", host: { classAttribute: "qd-visually-hidden" }, ngImport: i0 });
7353
+ }
7354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdVisuallyHiddenDirective, decorators: [{
7355
+ type: Directive,
7356
+ args: [{
7357
+ selector: '[qdVisuallyHidden]',
7358
+ host: { class: 'qd-visually-hidden' },
7359
+ standalone: false
7360
+ }]
7361
+ }] });
7226
7362
 
7227
7363
  class QdCoreModule {
7228
7364
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -7871,7 +8007,7 @@ class QdAutofocusDirective {
7871
8007
  if (!this.qdAutofocus)
7872
8008
  return;
7873
8009
  if (this.autofocusService.isAutofocusActivated) {
7874
- console.warn('QD-UI | QdAutofocus - "hasAutofocus" can be used only once!');
8010
+ console.warn('Quadrel Framework | QdAutofocus - "hasAutofocus" can be used only once.');
7875
8011
  return;
7876
8012
  }
7877
8013
  this.autofocusService.isAutofocusActivated = true;
@@ -8194,7 +8330,7 @@ class QdEventBrokerService {
8194
8330
  }
8195
8331
  consume(topic) {
8196
8332
  if (!this._topics.has(topic)) {
8197
- console.warn(`QD-UI | QdEventBrokerService - Topic "${topic}" does not exist.`);
8333
+ console.warn(`Quadrel Framework | QdEventBroker - Topic "${topic}" does not exist.`);
8198
8334
  return EMPTY;
8199
8335
  }
8200
8336
  return this._topics.get(topic).pipe(filter(event => event.payload != null), distinctUntilChanged((prev, curr) => isEqual(prev, curr)), shareReplay(1));
@@ -8300,11 +8436,11 @@ class QdFormHintComponent {
8300
8436
  this.actionEmitterService.hintEventEmitterSubject.next(null);
8301
8437
  }
8302
8438
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFormHintComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8303
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFormHintComponent, isStandalone: false, selector: "qd-form-hint", inputs: { hint: "hint", control: "control", hasError: "hasError", hintAction: "hintAction", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-form-hint" }, ngImport: i0, template: "<div class=\"qd-form-hint\" [attr.data-test-id]=\"testId + '-hint'\">\n <ng-container *ngIf=\"!hasError && !hintAction\">\n {{ hint | translate }}\n </ng-container>\n <ng-container *ngIf=\"!hasError && hintAction\">\n <div class=\"qd-form-hint--hint-action\" (click)=\"handleClick()\">\n {{ hint | translate }}\n </div>\n </ng-container>\n</div>\n\n<div class=\"qd-form-hint--error\" [attr.data-test-id]=\"testId + '-error'\">\n <ng-container *ngIf=\"hasError\">\n <qd-form-error [control]=\"control\"></qd-form-error>\n </ng-container>\n</div>\n", styles: [":host{display:block;min-height:.75rem;color:#757575;font-size:.75rem;font-weight:300;line-height:.75rem}:host .qd-form-hint--error{color:#c70023}.qd-form-disabled :host{color:#979797}:host .qd-form-hint--hint-action{color:#069;cursor:pointer}:host .qd-form-hint--hint-action:hover,:host .qd-form-hint--hint-action:active,:host .qd-form-hint--hint-action:focus{text-decoration:underline}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdFormErrorComponent, selector: "qd-form-error", inputs: ["control"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
8439
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFormHintComponent, isStandalone: false, selector: "qd-form-hint", inputs: { hint: "hint", control: "control", hasError: "hasError", hintAction: "hintAction", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-form-hint" }, ngImport: i0, template: "<div class=\"qd-form-hint\" [attr.data-test-id]=\"testId + '-hint'\">\n <ng-container *ngIf=\"!hasError && !hintAction\">\n {{ hint | translate }}\n </ng-container>\n <ng-container *ngIf=\"!hasError && hintAction\">\n <div class=\"qd-form-hint--hint-action\" (click)=\"handleClick()\">\n {{ hint | translate }}\n </div>\n </ng-container>\n</div>\n\n<div class=\"qd-form-hint--error\" [attr.data-test-id]=\"testId + '-error'\">\n <ng-container *ngIf=\"hasError\">\n <qd-form-error [control]=\"control\"></qd-form-error>\n </ng-container>\n</div>\n", styles: [":host{display:block;min-height:.75rem;color:#757575;font-size:.75rem;font-weight:300;line-height:.75rem}:host .qd-form-hint--error{color:#c70023}.qd-form-disabled :host{color:#979797}.qd-input-ambiguous :host{color:#069}:host .qd-form-hint--hint-action{color:#069;cursor:pointer}:host .qd-form-hint--hint-action:hover,:host .qd-form-hint--hint-action:active,:host .qd-form-hint--hint-action:focus{text-decoration:underline}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdFormErrorComponent, selector: "qd-form-error", inputs: ["control"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
8304
8440
  }
8305
8441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFormHintComponent, decorators: [{
8306
8442
  type: Component,
8307
- args: [{ selector: 'qd-form-hint', host: { class: 'qd-form-hint' }, standalone: false, template: "<div class=\"qd-form-hint\" [attr.data-test-id]=\"testId + '-hint'\">\n <ng-container *ngIf=\"!hasError && !hintAction\">\n {{ hint | translate }}\n </ng-container>\n <ng-container *ngIf=\"!hasError && hintAction\">\n <div class=\"qd-form-hint--hint-action\" (click)=\"handleClick()\">\n {{ hint | translate }}\n </div>\n </ng-container>\n</div>\n\n<div class=\"qd-form-hint--error\" [attr.data-test-id]=\"testId + '-error'\">\n <ng-container *ngIf=\"hasError\">\n <qd-form-error [control]=\"control\"></qd-form-error>\n </ng-container>\n</div>\n", styles: [":host{display:block;min-height:.75rem;color:#757575;font-size:.75rem;font-weight:300;line-height:.75rem}:host .qd-form-hint--error{color:#c70023}.qd-form-disabled :host{color:#979797}:host .qd-form-hint--hint-action{color:#069;cursor:pointer}:host .qd-form-hint--hint-action:hover,:host .qd-form-hint--hint-action:active,:host .qd-form-hint--hint-action:focus{text-decoration:underline}\n"] }]
8443
+ args: [{ selector: 'qd-form-hint', host: { class: 'qd-form-hint' }, standalone: false, template: "<div class=\"qd-form-hint\" [attr.data-test-id]=\"testId + '-hint'\">\n <ng-container *ngIf=\"!hasError && !hintAction\">\n {{ hint | translate }}\n </ng-container>\n <ng-container *ngIf=\"!hasError && hintAction\">\n <div class=\"qd-form-hint--hint-action\" (click)=\"handleClick()\">\n {{ hint | translate }}\n </div>\n </ng-container>\n</div>\n\n<div class=\"qd-form-hint--error\" [attr.data-test-id]=\"testId + '-error'\">\n <ng-container *ngIf=\"hasError\">\n <qd-form-error [control]=\"control\"></qd-form-error>\n </ng-container>\n</div>\n", styles: [":host{display:block;min-height:.75rem;color:#757575;font-size:.75rem;font-weight:300;line-height:.75rem}:host .qd-form-hint--error{color:#c70023}.qd-form-disabled :host{color:#979797}.qd-input-ambiguous :host{color:#069}:host .qd-form-hint--hint-action{color:#069;cursor:pointer}:host .qd-form-hint--hint-action:hover,:host .qd-form-hint--hint-action:active,:host .qd-form-hint--hint-action:focus{text-decoration:underline}\n"] }]
8308
8444
  }], propDecorators: { hint: [{
8309
8445
  type: Input
8310
8446
  }], control: [{
@@ -8558,11 +8694,11 @@ class QdCheckboxChipsComponent {
8558
8694
  if (this.formControlName) {
8559
8695
  this.control = this.controlContainer.control.get(this.formControlName);
8560
8696
  if (!(this.control instanceof QdFormControl)) {
8561
- console.warn('QD-UI | QdCheckboxChipsComponent - Please use the QdFormControl instead of the Angular FormControl');
8697
+ console.warn('Quadrel Framework | QdCheckboxChips - Please use the QdFormControl instead of the Angular FormControl.');
8562
8698
  }
8563
8699
  }
8564
8700
  else {
8565
- console.warn('QD-UI | QdCheckboxChipsComponent - Missing FormControlName directive from host element of the component');
8701
+ console.warn('Quadrel Framework | QdCheckboxChips - Missing FormControlName directive from host element of the component.');
8566
8702
  }
8567
8703
  }
8568
8704
  this._subs.add(this.actionEmitterService.hintEventEmitter$.subscribe(() => this.clickHint.emit()));
@@ -9010,7 +9146,7 @@ class QdCheckboxesComponent {
9010
9146
  this.control = this.controlContainer.control.get(this.formControlName);
9011
9147
  }
9012
9148
  else {
9013
- console.warn('QD-UI | QdCheckboxGroupComponent - Missing FormControlName directive from host element of the component');
9149
+ console.warn('Quadrel Framework | QdCheckboxGroup - Missing FormControlName directive from host element of the component.');
9014
9150
  }
9015
9151
  }
9016
9152
  this.setInitialValues();
@@ -9604,7 +9740,7 @@ class QdFormOptionsResolverRegistry {
9604
9740
  return null;
9605
9741
  const matches = this.resolvers.filter(r => r?.name === this.resolverName);
9606
9742
  if (matches.length > 1)
9607
- throw new Error(`QD-UI | QdForms - Multiple QdFormOptionsResolvers with the name "${this.resolverName}" found. Resolver names must be unique.`);
9743
+ throw new Error(`Quadrel Framework | QdForms - Multiple QdFormOptionsResolvers with the name "${this.resolverName}" found. Resolver names must be unique.`);
9608
9744
  return matches[0] ?? null;
9609
9745
  }
9610
9746
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFormOptionsResolverRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -9704,9 +9840,9 @@ class QdFormOptionsService {
9704
9840
  }
9705
9841
  validateOptionsSetup(componentName) {
9706
9842
  if (!this.hasOptions())
9707
- console.warn(`QD-UI | ${componentName} - No options defined. Either provide 'options' or configure a resolver via 'optionsResolverName'.`);
9843
+ console.warn(`Quadrel Framework | ${componentName} - No options defined. Either provide "options" or configure a resolver via "optionsResolverName".`);
9708
9844
  if (this._config?.options?.length && this._resolver)
9709
- console.warn(`QD-UI | ${componentName} - Config key 'options' ignored because QD_FORM_OPTIONS_RESOLVER is configured.`);
9845
+ console.warn(`Quadrel Framework | ${componentName} - Config key "options" ignored because QD_FORM_OPTIONS_RESOLVER is configured.`);
9710
9846
  }
9711
9847
  load(value) {
9712
9848
  if (value === this._lastLoadedValue)
@@ -10203,7 +10339,7 @@ class QdDropdownComponent {
10203
10339
  this.control = directive.control;
10204
10340
  return;
10205
10341
  }
10206
- console.warn('QD-UI | QdDropdownComponent - Missing FormControlName directive from host element of the component');
10342
+ console.warn('Quadrel Framework | QdDropdown - Missing FormControlName directive from host element of the component.');
10207
10343
  }
10208
10344
  updateConfiguration() {
10209
10345
  this.label = getLabel(this.config);
@@ -10612,8 +10748,8 @@ class QdInputOptionsDirective extends QdPopoverOnClickDirective {
10612
10748
  }
10613
10749
  logWarningIfBothOptionsAndResolverAreUsed() {
10614
10750
  if (this.config?.options && this.config.options.length > 0 && !!this._optionsResolver) {
10615
- console.warn('QD-UI | QdInputComponent - If both options and QD_FORM_OPTIONS_RESOLVER are used, ' +
10616
- 'the options will be ignored!');
10751
+ console.warn('Quadrel Framework | QdInput - If both options and QD_FORM_OPTIONS_RESOLVER are used, ' +
10752
+ 'the options will be ignored.');
10617
10753
  }
10618
10754
  }
10619
10755
  closePopover() {
@@ -10929,6 +11065,7 @@ class QdInputComponent {
10929
11065
  resolverRegistry = inject(QdFormOptionsResolverRegistry);
10930
11066
  controlContainer = inject(ControlContainer, { optional: true, host: true, skipSelf: true });
10931
11067
  eventBrokerService = inject(QdEventBrokerService, { optional: true });
11068
+ numberInputService = inject(QdNumberInputService);
10932
11069
  /**
10933
11070
  * The form control name can be assigned here if you want to use Reactive Forms.
10934
11071
  */
@@ -11003,9 +11140,13 @@ class QdInputComponent {
11003
11140
  get isErrorFromOutside() {
11004
11141
  return this.isError;
11005
11142
  }
11143
+ get isAmbiguousState() {
11144
+ return this.isAmbiguousInput;
11145
+ }
11006
11146
  inputElement;
11007
11147
  inputType;
11008
11148
  inputMode;
11149
+ htmlInputType;
11009
11150
  placeholder;
11010
11151
  label;
11011
11152
  hint;
@@ -11017,6 +11158,7 @@ class QdInputComponent {
11017
11158
  control;
11018
11159
  _optionsResolver;
11019
11160
  _subs = new Subscription();
11161
+ _isUserTyped = false;
11020
11162
  _onChange = () => { };
11021
11163
  _onTouch = () => { };
11022
11164
  get hasOnlyUnitsError() {
@@ -11025,6 +11167,15 @@ class QdInputComponent {
11025
11167
  get hasUnits() {
11026
11168
  return this.config?.units?.length > 0;
11027
11169
  }
11170
+ get ambiguityHintKey() {
11171
+ return this.numberInputService.getAmbiguityHintKey(this._value.value);
11172
+ }
11173
+ get isAmbiguousInput() {
11174
+ return (this.inputType === 'number' &&
11175
+ !this.hasError &&
11176
+ this._isUserTyped &&
11177
+ this.numberInputService.isAmbiguous(this._value.value));
11178
+ }
11028
11179
  get numberOfCharacters() {
11029
11180
  if (!this._value.value)
11030
11181
  return 0;
@@ -11041,7 +11192,10 @@ class QdInputComponent {
11041
11192
  return this.control.getMaxLengthOrUndefined();
11042
11193
  }
11043
11194
  get valueAsList() {
11044
- return [`${this._value.value}${this._value.unit ? ' ' + this._value.unit : ''}`];
11195
+ const displayValue = this.inputType === 'number'
11196
+ ? this.numberInputService.formatNumberForViewonly(this._value.value)
11197
+ : this._value.value;
11198
+ return [`${displayValue}${this._value.unit ? ' ' + this._value.unit : ''}`];
11045
11199
  }
11046
11200
  ngOnInit() {
11047
11201
  this.initializeOptionsResolver();
@@ -11051,9 +11205,14 @@ class QdInputComponent {
11051
11205
  this.control = this.controlContainer.control.get(this.formControlName);
11052
11206
  // TODO remove logic for support of angular FormControl with angular 20 update
11053
11207
  if (!(this.control instanceof QdFormControl))
11054
- console.warn('QD-UI | QdInputComponent - Please use the QdFormControl instead of the Angular FormControl');
11208
+ console.warn('Quadrel Framework | QdInput - Please use the QdFormControl instead of the Angular FormControl.');
11055
11209
  }
11056
11210
  }
11211
+ if (this.config.inputType === 'number' &&
11212
+ this.config.inputMode !== 'numeric' &&
11213
+ this.config.inputMode !== 'decimal' &&
11214
+ this.config.inputMode != null)
11215
+ console.error('QD-UI | QdInputComponent - Please use either decimal or numeric when using QdInputType number');
11057
11216
  this.writeValue(this.value ?? getValue(this.config));
11058
11217
  this.normalizeInitialControlValueIfNeeded();
11059
11218
  this._subs.add(this.actionEmitterService.hintEventEmitter$.subscribe(() => this.clickHint.emit()));
@@ -11084,6 +11243,10 @@ class QdInputComponent {
11084
11243
  writeValue(value) {
11085
11244
  this._value = getValueWithUnit(value, this.config);
11086
11245
  this._displayValue = String(this._value.value ?? '');
11246
+ this._isUserTyped = false;
11247
+ if (this.inputType === 'number') {
11248
+ this._value = { ...this._value, value: this.numberInputService.formatValueForDisplay(this._value.value) };
11249
+ }
11087
11250
  }
11088
11251
  setDisabledState(disabled) {
11089
11252
  this.disabled = disabled;
@@ -11095,6 +11258,36 @@ class QdInputComponent {
11095
11258
  if (input?.validity?.badInput)
11096
11259
  return;
11097
11260
  const value = event.target.value;
11261
+ if (this.inputType === 'number' && value && !this.numberInputService.isValidNumber(value)) {
11262
+ this.control?.setErrors({
11263
+ ...this.control.errors,
11264
+ invalidCharacters: this.numberInputService.invalidCharactersErrorKey
11265
+ });
11266
+ return;
11267
+ }
11268
+ if (this.inputType === 'number' && value) {
11269
+ const valueWithoutGroups = value.split(this.numberInputService.groupSeparator).join('');
11270
+ const filtered = this.numberInputService.filterValue(valueWithoutGroups);
11271
+ const hasInvalidChars = filtered !== valueWithoutGroups;
11272
+ if (hasInvalidChars) {
11273
+ this._value = { ...this._value, value: filtered };
11274
+ if (this.control) {
11275
+ this.control.setErrors({
11276
+ ...this.control.errors,
11277
+ invalidCharacters: this.numberInputService.invalidCharactersErrorKey
11278
+ });
11279
+ }
11280
+ this._isUserTyped = true;
11281
+ this._onTouch();
11282
+ this.emitValue();
11283
+ return;
11284
+ }
11285
+ if (this.control?.errors?.['invalidCharacters']) {
11286
+ const remainingErrors = Object.fromEntries(Object.entries(this.control.errors).filter(([key]) => key !== 'invalidCharacters'));
11287
+ this.control.setErrors(Object.keys(remainingErrors).length ? remainingErrors : null);
11288
+ }
11289
+ }
11290
+ this._isUserTyped = true;
11098
11291
  this._value = { ...this._value, value };
11099
11292
  this.emitValue();
11100
11293
  this._onTouch();
@@ -11151,6 +11344,15 @@ class QdInputComponent {
11151
11344
  updateConfig() {
11152
11345
  this.inputType = getInputType(this.config);
11153
11346
  this.inputMode = getInputMode(this.config);
11347
+ if (this.inputType === 'number') {
11348
+ this.htmlInputType = 'text';
11349
+ if (!this.inputMode) {
11350
+ this.inputMode = this.inputMode ?? 'decimal';
11351
+ }
11352
+ }
11353
+ else {
11354
+ this.htmlInputType = this.inputType;
11355
+ }
11154
11356
  this.placeholder = getPlaceholder(this.config);
11155
11357
  this.label = getLabel(this.config);
11156
11358
  this.hint = getHint(this.config);
@@ -11169,13 +11371,15 @@ class QdInputComponent {
11169
11371
  this._optionsResolver = this.resolverRegistry.findResolver();
11170
11372
  }
11171
11373
  emitValue() {
11374
+ const emittable = this.inputType === 'number' ? this.numberInputService.parseValue(this._value.value) : this._value.value;
11172
11375
  if (this.hasUnits) {
11173
- this.valueChange.emit(this._value);
11174
- this._onChange(this._value);
11376
+ const emittableWithUnit = { ...this._value, value: emittable };
11377
+ this.valueChange.emit(emittableWithUnit);
11378
+ this._onChange(emittableWithUnit);
11175
11379
  }
11176
11380
  else {
11177
- this.valueChange.emit(this._value.value);
11178
- this._onChange(this._value.value);
11381
+ this.valueChange.emit(emittable);
11382
+ this._onChange(emittable);
11179
11383
  }
11180
11384
  }
11181
11385
  initOpModeSubscription() {
@@ -11198,9 +11402,12 @@ class QdInputComponent {
11198
11402
  if (!isEqual(modelValue, target))
11199
11403
  this.control.setValue(target, { emitEvent: false });
11200
11404
  this._value = normalized;
11405
+ if (this.inputType === 'number') {
11406
+ this._value = { ...this._value, value: this.numberInputService.formatValueForDisplay(this._value.value) };
11407
+ }
11201
11408
  }
11202
11409
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11203
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdInputComponent, isStandalone: false, selector: "qd-input", inputs: { formControlName: "formControlName", value: "value", config: "config", isError: "isError", testId: ["data-test-id", "testId"] }, outputs: { valueChange: "valueChange", enterClick: "enterClick", clickClear: "clickClear", clickHint: "clickHint", clickReadonly: "clickReadonly", clickViewonly: "clickViewonly" }, host: { properties: { "class.qd-input-readonly": "this.readonly", "class.qd-input--readonly-action": "this.readonlyAction", "class.qd-input-viewonly": "this.viewonly", "class.qd-input--viewonly-action": "this.viewonlyAction", "class.qd-form-hint-action": "this.hintAction", "class.qd-input-hint-action": "this.hintAction", "class.qd-form-disabled": "this.disabled", "class.qd-input-disabled": "this.disabled", "class.qd-input-focus": "this.isInputFocused", "class.qd-form-error": "this.hasError", "class.qd-input-error": "this.hasError", "class.qd-input-error-from-outside": "this.isErrorFromOutside" } }, providers: [
11410
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdInputComponent, isStandalone: false, selector: "qd-input", inputs: { formControlName: "formControlName", value: "value", config: "config", isError: "isError", testId: ["data-test-id", "testId"] }, outputs: { valueChange: "valueChange", enterClick: "enterClick", clickClear: "clickClear", clickHint: "clickHint", clickReadonly: "clickReadonly", clickViewonly: "clickViewonly" }, host: { properties: { "class.qd-input-readonly": "this.readonly", "class.qd-input--readonly-action": "this.readonlyAction", "class.qd-input-viewonly": "this.viewonly", "class.qd-input--viewonly-action": "this.viewonlyAction", "class.qd-form-hint-action": "this.hintAction", "class.qd-input-hint-action": "this.hintAction", "class.qd-form-disabled": "this.disabled", "class.qd-input-disabled": "this.disabled", "class.qd-input-focus": "this.isInputFocused", "class.qd-form-error": "this.hasError", "class.qd-input-error": "this.hasError", "class.qd-input-error-from-outside": "this.isErrorFromOutside", "class.qd-input-ambiguous": "this.isAmbiguousState" } }, providers: [
11204
11411
  {
11205
11412
  provide: NG_VALUE_ACCESSOR,
11206
11413
  useExisting: QdInputComponent,
@@ -11208,13 +11415,14 @@ class QdInputComponent {
11208
11415
  },
11209
11416
  QdFormsActionEmitterService,
11210
11417
  QdFormOptionsResolverRegistry,
11418
+ QdNumberInputService,
11211
11419
  // TODO: Remove when removing derived directive
11212
11420
  QdPopoverSizingService,
11213
11421
  {
11214
11422
  provide: QD_FOCUSABLE_TOKEN,
11215
11423
  useExisting: QdInputComponent
11216
11424
  }
11217
- ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], 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<ng-container *ngIf=\"!readonly && !viewonly && !hasOptions\">\n <div class=\"qd-input-input\" (keydown.enter)=\"emitEnterClick()\">\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n</ng-container>\n\n<div *ngIf=\"!readonly && !viewonly && hasOptions\">\n <div\n class=\"qd-input-input\"\n qdInputOptions\n [qdPopoverMinWidth]=\"200\"\n [config]=\"config\"\n [value]=\"_value.value\"\n (optionSelected)=\"handleOptionSelected($event)\"\n (enterClick)=\"emitEnterClick()\"\n >\n <!-- handle (enterClick) by options directive here because event has to be fired after selection -->\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n</div>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"valueAsList\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"valueAsList\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n\n<ng-template #inputBox>\n <input\n #input\n [placeholder]=\"placeholder | translate\"\n [value]=\"hasOptions ? (_value.value.toString() | translate) : _displayValue\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleInputFocus()\"\n (blur)=\"handleInputBlur()\"\n [disabled]=\"disabled || readonly\"\n [type]=\"inputType\"\n [attr.inputmode]=\"inputMode\"\n [qdAutofocus]=\"hasAutofocus\"\n [attr.data-test-id]=\"testId + '-input'\"\n [step]=\"config?.step\"\n required\n />\n <div class=\"qd-input-suffix\">\n <qd-icon *ngIf=\"hasError && !hasOnlyUnitsError\" class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n <qd-icon *ngIf=\"clearable\" class=\"qd-input-clearable-icon\" icon=\"timesLarge\" (click)=\"clearInput()\"></qd-icon>\n <ng-content select=\"[qdIconButton]\"></ng-content>\n </div>\n <qd-input-units\n *ngIf=\"hasUnits\"\n [unit]=\"_value.unit\"\n [config]=\"config\"\n (unitChange)=\"handleUnitChange($event)\"\n (opened)=\"handleUnitsOpened()\"\n (closed)=\"handleUnitsClosed()\"\n ></qd-input-units>\n <div class=\"qd-input-suffix\" *ngIf=\"hasError && hasOnlyUnitsError\">\n <qd-icon class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:block;width:100%;flex-direction:column;margin-bottom:.75rem}:host .qd-input-input{display:flex;overflow:hidden;height:2.25rem;align-items:center;padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(180,180,180);border-radius:0;margin-bottom:.375rem;background-color:#fff}:host .qd-input-input:hover,:host .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(23,23,23);border-radius:0}:host .qd-input-input input{overflow:hidden;width:100%;flex-grow:1;border:none;background-color:#fff;color:#171717;font-size:.875rem;line-height:1.875rem}:host .qd-input-input input:hover,:host .qd-input-input input:focus,:host .qd-input-input input:active{border:none;outline:none}:host .qd-input-input input::placeholder{color:#b4b4b4}:host .qd-input-input input:focus::placeholder{display:block;color:#b4b4b4}:host .qd-input-input .qd-input-suffix{display:flex;align-items:center;margin-left:.75rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon{padding-right:.5rem;color:#c70023}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon+.qd-input-clearable-icon{margin-left:-.25rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon{margin-right:.5625rem;color:#979797;cursor:pointer;font-size:1.25rem;line-height:2rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:hover,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:focus,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:active{color:#171717}:host .qd-input-input qd-input-units+.qd-input-suffix{margin:0 0 0 -.1875rem}:host .qd-input-character-counter{padding-left:.125rem;color:#757575;float:right;font-size:.75rem;font-weight:300;line-height:.75rem}:host:after{display:block;height:0;clear:both;content:\".\";visibility:hidden}:host.qd-input-focus .qd-input-input{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(0,102,153);border-radius:0;outline:none}:host.qd-input-readonly .qd-input-readonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-viewonly .qd-input-viewonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-disabled .qd-input-input{border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled .qd-input-input input{background-color:#f5f5f5;color:#979797}:host.qd-input-disabled .qd-input-input input::placeholder{opacity:0}:host.qd-input-disabled .qd-input-input:hover,:host.qd-input-disabled .qd-input-input:active{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled.qd-input-focus{border-color:#ff9b00}:host.qd-input--readonly-action .qd-input-readonly{color:#069;cursor:pointer}:host.qd-input--readonly-action .qd-input-readonly:hover,:host.qd-input--readonly-action .qd-input-readonly:active,:host.qd-input--readonly-action .qd-input-readonly:focus{text-decoration:underline}:host.qd-input--viewonly-action .qd-input-viewonly{color:#069;cursor:pointer}:host.qd-input--viewonly-action .qd-input-viewonly:hover,:host.qd-input--viewonly-action .qd-input-viewonly:active,:host.qd-input--viewonly-action .qd-input-viewonly:focus{text-decoration:underline}:host.qd-input-error .qd-input-input,:host.qd-input-error-from-outside .qd-input-input{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(199,0,35)}:host.qd-input-error .qd-input-input:hover,:host.qd-input-error .qd-input-input:active,:host.qd-input-error-from-outside .qd-input-input:hover,:host.qd-input-error-from-outside .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(199,0,35)}:host.qd-input-error.qd-input-focus,:host.qd-input-error-from-outside.qd-input-focus{border-color:#c70023}\n"], dependencies: [{ 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: QdAutofocusDirective, selector: "[qdAutofocus]", inputs: ["qdAutofocus"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon"] }, { 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: QdInputUnitsComponent, selector: "qd-input-units", inputs: ["config", "unit"], outputs: ["unitChange", "opened", "closed"] }, { kind: "directive", type: QdInputOptionsDirective, selector: "[qdInputOptions]", inputs: ["value", "config"], outputs: ["enterClick", "optionSelected"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
11425
+ ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], 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<ng-container *ngIf=\"!readonly && !viewonly && !hasOptions\">\n <div class=\"qd-input-input\" (keydown.enter)=\"emitEnterClick()\">\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n <qd-form-hint *ngIf=\"isAmbiguousInput\" [hint]=\"ambiguityHintKey\" [data-test-id]=\"testId\"></qd-form-hint>\n</ng-container>\n\n<div *ngIf=\"!readonly && !viewonly && hasOptions\">\n <div\n class=\"qd-input-input\"\n qdInputOptions\n [qdPopoverMinWidth]=\"200\"\n [config]=\"config\"\n [value]=\"_value.value\"\n (optionSelected)=\"handleOptionSelected($event)\"\n (enterClick)=\"emitEnterClick()\"\n >\n <!-- handle (enterClick) by options directive here because event has to be fired after selection -->\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n <qd-form-hint *ngIf=\"isAmbiguousInput\" [hint]=\"ambiguityHintKey\" [data-test-id]=\"testId\"></qd-form-hint>\n</div>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"valueAsList\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"valueAsList\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n\n<ng-template #inputBox>\n <input\n #input\n [placeholder]=\"placeholder | translate\"\n [value]=\"hasOptions ? (_value.value.toString() | translate) : _displayValue\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleInputFocus()\"\n (blur)=\"handleInputBlur()\"\n [disabled]=\"disabled || readonly\"\n [type]=\"htmlInputType\"\n [attr.inputmode]=\"inputMode\"\n [qdAutofocus]=\"hasAutofocus\"\n [attr.data-test-id]=\"testId + '-input'\"\n [step]=\"config?.step\"\n required\n />\n <div class=\"qd-input-suffix\">\n <qd-icon *ngIf=\"hasError && !hasOnlyUnitsError\" class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n <qd-icon *ngIf=\"isAmbiguousInput\" class=\"qd-input-ambiguous-icon\" icon=\"circleInfoSolid\"></qd-icon>\n <qd-icon *ngIf=\"clearable\" class=\"qd-input-clearable-icon\" icon=\"timesLarge\" (click)=\"clearInput()\"></qd-icon>\n <ng-content select=\"[qdIconButton]\"></ng-content>\n </div>\n <qd-input-units\n *ngIf=\"hasUnits\"\n [unit]=\"_value.unit\"\n [config]=\"config\"\n (unitChange)=\"handleUnitChange($event)\"\n (opened)=\"handleUnitsOpened()\"\n (closed)=\"handleUnitsClosed()\"\n ></qd-input-units>\n <div class=\"qd-input-suffix\" *ngIf=\"hasError && hasOnlyUnitsError\">\n <qd-icon class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:block;width:100%;flex-direction:column;margin-bottom:.75rem}:host .qd-input-input{display:flex;overflow:hidden;height:2.25rem;align-items:center;padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(180,180,180);border-radius:0;margin-bottom:.375rem;background-color:#fff}:host .qd-input-input:hover,:host .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(23,23,23);border-radius:0}:host .qd-input-input input{overflow:hidden;width:100%;flex-grow:1;border:none;background-color:#fff;color:#171717;font-size:.875rem;line-height:1.875rem}:host .qd-input-input input:hover,:host .qd-input-input input:focus,:host .qd-input-input input:active{border:none;outline:none}:host .qd-input-input input::placeholder{color:#b4b4b4}:host .qd-input-input input:focus::placeholder{display:block;color:#b4b4b4}:host .qd-input-input .qd-input-suffix{display:flex;align-items:center;margin-left:.75rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon{padding-right:.5rem;color:#c70023}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon+.qd-input-clearable-icon{margin-left:-.25rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon{margin-right:.5625rem;color:#979797;cursor:pointer;font-size:1.25rem;line-height:2rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:hover,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:focus,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:active{color:#171717}:host .qd-input-input qd-input-units+.qd-input-suffix{margin:0 0 0 -.1875rem}:host .qd-input-character-counter{padding-left:.125rem;color:#757575;float:right;font-size:.75rem;font-weight:300;line-height:.75rem}:host:after{display:block;height:0;clear:both;content:\".\";visibility:hidden}:host.qd-input-focus .qd-input-input{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(0,102,153);border-radius:0;outline:none}:host.qd-input-readonly .qd-input-readonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-viewonly .qd-input-viewonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-disabled .qd-input-input{border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled .qd-input-input input{background-color:#f5f5f5;color:#979797}:host.qd-input-disabled .qd-input-input input::placeholder{opacity:0}:host.qd-input-disabled .qd-input-input:hover,:host.qd-input-disabled .qd-input-input:active{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled.qd-input-focus{border-color:#ff9b00}:host.qd-input--readonly-action .qd-input-readonly{color:#069;cursor:pointer}:host.qd-input--readonly-action .qd-input-readonly:hover,:host.qd-input--readonly-action .qd-input-readonly:active,:host.qd-input--readonly-action .qd-input-readonly:focus{text-decoration:underline}:host.qd-input--viewonly-action .qd-input-viewonly{color:#069;cursor:pointer}:host.qd-input--viewonly-action .qd-input-viewonly:hover,:host.qd-input--viewonly-action .qd-input-viewonly:active,:host.qd-input--viewonly-action .qd-input-viewonly:focus{text-decoration:underline}:host.qd-input-ambiguous .qd-input-input{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(0,102,153)}:host.qd-input-ambiguous .qd-input-input:hover,:host.qd-input-ambiguous .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(0,102,153)}:host.qd-input-ambiguous.qd-input-focus .qd-input-input{border-color:#069}:host.qd-input-ambiguous .qd-input-suffix ::ng-deep .qd-input-ambiguous-icon{padding-right:.5rem;color:#069}:host.qd-input-error .qd-input-input,:host.qd-input-error-from-outside .qd-input-input{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(199,0,35)}:host.qd-input-error .qd-input-input:hover,:host.qd-input-error .qd-input-input:active,:host.qd-input-error-from-outside .qd-input-input:hover,:host.qd-input-error-from-outside .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(199,0,35)}:host.qd-input-error.qd-input-focus,:host.qd-input-error-from-outside.qd-input-focus{border-color:#c70023}\n"], dependencies: [{ 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: QdAutofocusDirective, selector: "[qdAutofocus]", inputs: ["qdAutofocus"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon"] }, { 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: QdInputUnitsComponent, selector: "qd-input-units", inputs: ["config", "unit"], outputs: ["unitChange", "opened", "closed"] }, { kind: "directive", type: QdInputOptionsDirective, selector: "[qdInputOptions]", inputs: ["value", "config"], outputs: ["enterClick", "optionSelected"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
11218
11426
  }
11219
11427
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdInputComponent, decorators: [{
11220
11428
  type: Component,
@@ -11226,13 +11434,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
11226
11434
  },
11227
11435
  QdFormsActionEmitterService,
11228
11436
  QdFormOptionsResolverRegistry,
11437
+ QdNumberInputService,
11229
11438
  // TODO: Remove when removing derived directive
11230
11439
  QdPopoverSizingService,
11231
11440
  {
11232
11441
  provide: QD_FOCUSABLE_TOKEN,
11233
11442
  useExisting: QdInputComponent
11234
11443
  }
11235
- ], 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<ng-container *ngIf=\"!readonly && !viewonly && !hasOptions\">\n <div class=\"qd-input-input\" (keydown.enter)=\"emitEnterClick()\">\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n</ng-container>\n\n<div *ngIf=\"!readonly && !viewonly && hasOptions\">\n <div\n class=\"qd-input-input\"\n qdInputOptions\n [qdPopoverMinWidth]=\"200\"\n [config]=\"config\"\n [value]=\"_value.value\"\n (optionSelected)=\"handleOptionSelected($event)\"\n (enterClick)=\"emitEnterClick()\"\n >\n <!-- handle (enterClick) by options directive here because event has to be fired after selection -->\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n</div>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"valueAsList\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"valueAsList\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n\n<ng-template #inputBox>\n <input\n #input\n [placeholder]=\"placeholder | translate\"\n [value]=\"hasOptions ? (_value.value.toString() | translate) : _displayValue\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleInputFocus()\"\n (blur)=\"handleInputBlur()\"\n [disabled]=\"disabled || readonly\"\n [type]=\"inputType\"\n [attr.inputmode]=\"inputMode\"\n [qdAutofocus]=\"hasAutofocus\"\n [attr.data-test-id]=\"testId + '-input'\"\n [step]=\"config?.step\"\n required\n />\n <div class=\"qd-input-suffix\">\n <qd-icon *ngIf=\"hasError && !hasOnlyUnitsError\" class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n <qd-icon *ngIf=\"clearable\" class=\"qd-input-clearable-icon\" icon=\"timesLarge\" (click)=\"clearInput()\"></qd-icon>\n <ng-content select=\"[qdIconButton]\"></ng-content>\n </div>\n <qd-input-units\n *ngIf=\"hasUnits\"\n [unit]=\"_value.unit\"\n [config]=\"config\"\n (unitChange)=\"handleUnitChange($event)\"\n (opened)=\"handleUnitsOpened()\"\n (closed)=\"handleUnitsClosed()\"\n ></qd-input-units>\n <div class=\"qd-input-suffix\" *ngIf=\"hasError && hasOnlyUnitsError\">\n <qd-icon class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:block;width:100%;flex-direction:column;margin-bottom:.75rem}:host .qd-input-input{display:flex;overflow:hidden;height:2.25rem;align-items:center;padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(180,180,180);border-radius:0;margin-bottom:.375rem;background-color:#fff}:host .qd-input-input:hover,:host .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(23,23,23);border-radius:0}:host .qd-input-input input{overflow:hidden;width:100%;flex-grow:1;border:none;background-color:#fff;color:#171717;font-size:.875rem;line-height:1.875rem}:host .qd-input-input input:hover,:host .qd-input-input input:focus,:host .qd-input-input input:active{border:none;outline:none}:host .qd-input-input input::placeholder{color:#b4b4b4}:host .qd-input-input input:focus::placeholder{display:block;color:#b4b4b4}:host .qd-input-input .qd-input-suffix{display:flex;align-items:center;margin-left:.75rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon{padding-right:.5rem;color:#c70023}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon+.qd-input-clearable-icon{margin-left:-.25rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon{margin-right:.5625rem;color:#979797;cursor:pointer;font-size:1.25rem;line-height:2rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:hover,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:focus,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:active{color:#171717}:host .qd-input-input qd-input-units+.qd-input-suffix{margin:0 0 0 -.1875rem}:host .qd-input-character-counter{padding-left:.125rem;color:#757575;float:right;font-size:.75rem;font-weight:300;line-height:.75rem}:host:after{display:block;height:0;clear:both;content:\".\";visibility:hidden}:host.qd-input-focus .qd-input-input{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(0,102,153);border-radius:0;outline:none}:host.qd-input-readonly .qd-input-readonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-viewonly .qd-input-viewonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-disabled .qd-input-input{border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled .qd-input-input input{background-color:#f5f5f5;color:#979797}:host.qd-input-disabled .qd-input-input input::placeholder{opacity:0}:host.qd-input-disabled .qd-input-input:hover,:host.qd-input-disabled .qd-input-input:active{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled.qd-input-focus{border-color:#ff9b00}:host.qd-input--readonly-action .qd-input-readonly{color:#069;cursor:pointer}:host.qd-input--readonly-action .qd-input-readonly:hover,:host.qd-input--readonly-action .qd-input-readonly:active,:host.qd-input--readonly-action .qd-input-readonly:focus{text-decoration:underline}:host.qd-input--viewonly-action .qd-input-viewonly{color:#069;cursor:pointer}:host.qd-input--viewonly-action .qd-input-viewonly:hover,:host.qd-input--viewonly-action .qd-input-viewonly:active,:host.qd-input--viewonly-action .qd-input-viewonly:focus{text-decoration:underline}:host.qd-input-error .qd-input-input,:host.qd-input-error-from-outside .qd-input-input{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(199,0,35)}:host.qd-input-error .qd-input-input:hover,:host.qd-input-error .qd-input-input:active,:host.qd-input-error-from-outside .qd-input-input:hover,:host.qd-input-error-from-outside .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(199,0,35)}:host.qd-input-error.qd-input-focus,:host.qd-input-error-from-outside.qd-input-focus{border-color:#c70023}\n"] }]
11444
+ ], 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<ng-container *ngIf=\"!readonly && !viewonly && !hasOptions\">\n <div class=\"qd-input-input\" (keydown.enter)=\"emitEnterClick()\">\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n <qd-form-hint *ngIf=\"isAmbiguousInput\" [hint]=\"ambiguityHintKey\" [data-test-id]=\"testId\"></qd-form-hint>\n</ng-container>\n\n<div *ngIf=\"!readonly && !viewonly && hasOptions\">\n <div\n class=\"qd-input-input\"\n qdInputOptions\n [qdPopoverMinWidth]=\"200\"\n [config]=\"config\"\n [value]=\"_value.value\"\n (optionSelected)=\"handleOptionSelected($event)\"\n (enterClick)=\"emitEnterClick()\"\n >\n <!-- handle (enterClick) by options directive here because event has to be fired after selection -->\n <ng-container *ngTemplateOutlet=\"inputBox\"></ng-container>\n </div>\n\n <span class=\"qd-input-character-counter\" *ngIf=\"hasMaxLength\">{{ numberOfCharacters }} / {{ maxLength }}</span>\n\n <qd-form-hint\n *ngIf=\"hint || hasError\"\n [hint]=\"hint\"\n [control]=\"control\"\n [hasError]=\"hasError\"\n [hintAction]=\"hintAction\"\n [data-test-id]=\"testId\"\n ></qd-form-hint>\n <qd-form-hint *ngIf=\"isAmbiguousInput\" [hint]=\"ambiguityHintKey\" [data-test-id]=\"testId\"></qd-form-hint>\n</div>\n\n<qd-form-readonly\n *ngIf=\"readonly\"\n [values]=\"valueAsList\"\n [readonlyAction]=\"readonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-readonly>\n\n<qd-form-viewonly\n *ngIf=\"viewonly\"\n [values]=\"valueAsList\"\n [viewonlyAction]=\"viewonlyAction\"\n [data-test-id]=\"testId\"\n></qd-form-viewonly>\n\n<ng-template #inputBox>\n <input\n #input\n [placeholder]=\"placeholder | translate\"\n [value]=\"hasOptions ? (_value.value.toString() | translate) : _displayValue\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleInputFocus()\"\n (blur)=\"handleInputBlur()\"\n [disabled]=\"disabled || readonly\"\n [type]=\"htmlInputType\"\n [attr.inputmode]=\"inputMode\"\n [qdAutofocus]=\"hasAutofocus\"\n [attr.data-test-id]=\"testId + '-input'\"\n [step]=\"config?.step\"\n required\n />\n <div class=\"qd-input-suffix\">\n <qd-icon *ngIf=\"hasError && !hasOnlyUnitsError\" class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n <qd-icon *ngIf=\"isAmbiguousInput\" class=\"qd-input-ambiguous-icon\" icon=\"circleInfoSolid\"></qd-icon>\n <qd-icon *ngIf=\"clearable\" class=\"qd-input-clearable-icon\" icon=\"timesLarge\" (click)=\"clearInput()\"></qd-icon>\n <ng-content select=\"[qdIconButton]\"></ng-content>\n </div>\n <qd-input-units\n *ngIf=\"hasUnits\"\n [unit]=\"_value.unit\"\n [config]=\"config\"\n (unitChange)=\"handleUnitChange($event)\"\n (opened)=\"handleUnitsOpened()\"\n (closed)=\"handleUnitsClosed()\"\n ></qd-input-units>\n <div class=\"qd-input-suffix\" *ngIf=\"hasError && hasOnlyUnitsError\">\n <qd-icon class=\"qd-input-error-icon\" icon=\"exclamationCircleSolid\"></qd-icon>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:block;width:100%;flex-direction:column;margin-bottom:.75rem}:host .qd-input-input{display:flex;overflow:hidden;height:2.25rem;align-items:center;padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(180,180,180);border-radius:0;margin-bottom:.375rem;background-color:#fff}:host .qd-input-input:hover,:host .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(23,23,23);border-radius:0}:host .qd-input-input input{overflow:hidden;width:100%;flex-grow:1;border:none;background-color:#fff;color:#171717;font-size:.875rem;line-height:1.875rem}:host .qd-input-input input:hover,:host .qd-input-input input:focus,:host .qd-input-input input:active{border:none;outline:none}:host .qd-input-input input::placeholder{color:#b4b4b4}:host .qd-input-input input:focus::placeholder{display:block;color:#b4b4b4}:host .qd-input-input .qd-input-suffix{display:flex;align-items:center;margin-left:.75rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon{padding-right:.5rem;color:#c70023}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-error-icon+.qd-input-clearable-icon{margin-left:-.25rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon{margin-right:.5625rem;color:#979797;cursor:pointer;font-size:1.25rem;line-height:2rem}:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:hover,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:focus,:host .qd-input-input .qd-input-suffix ::ng-deep .qd-input-clearable-icon:active{color:#171717}:host .qd-input-input qd-input-units+.qd-input-suffix{margin:0 0 0 -.1875rem}:host .qd-input-character-counter{padding-left:.125rem;color:#757575;float:right;font-size:.75rem;font-weight:300;line-height:.75rem}:host:after{display:block;height:0;clear:both;content:\".\";visibility:hidden}:host.qd-input-focus .qd-input-input{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(0,102,153);border-radius:0;outline:none}:host.qd-input-readonly .qd-input-readonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-viewonly .qd-input-viewonly{color:#171717;font-size:.875rem;line-height:2.25rem}:host.qd-input-disabled .qd-input-input{border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled .qd-input-input input{background-color:#f5f5f5;color:#979797}:host.qd-input-disabled .qd-input-input input::placeholder{opacity:0}:host.qd-input-disabled .qd-input-input:hover,:host.qd-input-disabled .qd-input-input:active{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(151,151,151);background-color:#f5f5f5}:host.qd-input-disabled.qd-input-focus{border-color:#ff9b00}:host.qd-input--readonly-action .qd-input-readonly{color:#069;cursor:pointer}:host.qd-input--readonly-action .qd-input-readonly:hover,:host.qd-input--readonly-action .qd-input-readonly:active,:host.qd-input--readonly-action .qd-input-readonly:focus{text-decoration:underline}:host.qd-input--viewonly-action .qd-input-viewonly{color:#069;cursor:pointer}:host.qd-input--viewonly-action .qd-input-viewonly:hover,:host.qd-input--viewonly-action .qd-input-viewonly:active,:host.qd-input--viewonly-action .qd-input-viewonly:focus{text-decoration:underline}:host.qd-input-ambiguous .qd-input-input{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(0,102,153)}:host.qd-input-ambiguous .qd-input-input:hover,:host.qd-input-ambiguous .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(0,102,153)}:host.qd-input-ambiguous.qd-input-focus .qd-input-input{border-color:#069}:host.qd-input-ambiguous .qd-input-suffix ::ng-deep .qd-input-ambiguous-icon{padding-right:.5rem;color:#069}:host.qd-input-error .qd-input-input,:host.qd-input-error-from-outside .qd-input-input{padding:0 .0625rem 0 .5rem;border:.0625rem solid rgb(199,0,35)}:host.qd-input-error .qd-input-input:hover,:host.qd-input-error .qd-input-input:active,:host.qd-input-error-from-outside .qd-input-input:hover,:host.qd-input-error-from-outside .qd-input-input:active{padding:.0625rem 0 .0625rem .4375rem;border:.125rem solid rgb(199,0,35)}:host.qd-input-error.qd-input-focus,:host.qd-input-error-from-outside.qd-input-focus{border-color:#c70023}\n"] }]
11236
11445
  }], propDecorators: { formControlName: [{
11237
11446
  type: Input
11238
11447
  }], value: [{
@@ -11292,6 +11501,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
11292
11501
  }], isErrorFromOutside: [{
11293
11502
  type: HostBinding,
11294
11503
  args: ['class.qd-input-error-from-outside']
11504
+ }], isAmbiguousState: [{
11505
+ type: HostBinding,
11506
+ args: ['class.qd-input-ambiguous']
11295
11507
  }], inputElement: [{
11296
11508
  type: ViewChild,
11297
11509
  args: ['input']
@@ -11418,6 +11630,8 @@ class QdDatepickerComponent {
11418
11630
  timePicker;
11419
11631
  _disabledDatesValidator;
11420
11632
  _disabledTimesValidator;
11633
+ _boundDisabledDates;
11634
+ _boundDisabledTimes;
11421
11635
  _subs = new Subscription();
11422
11636
  _onChange = () => { };
11423
11637
  _onTouched = () => { };
@@ -11429,17 +11643,17 @@ class QdDatepickerComponent {
11429
11643
  this.updateConfiguration();
11430
11644
  this.updateDisplayedDate();
11431
11645
  this.updateDisplayedDateTime();
11432
- this.validateDisabledDates();
11433
- this.validateDisabledTimes();
11434
11646
  this._subs.add(this.initOpModeSubscription());
11435
11647
  }
11436
11648
  ngOnChanges(changes) {
11437
11649
  if (changes.config) {
11438
11650
  this.updateConfiguration();
11439
- this.validateDisabledDates();
11440
- this.validateDisabledTimes();
11441
11651
  }
11442
11652
  }
11653
+ ngDoCheck() {
11654
+ this.rebindDisabledDatesValidatorIfChanged();
11655
+ this.rebindDisabledTimesValidatorIfChanged();
11656
+ }
11443
11657
  ngOnDestroy() {
11444
11658
  this._subs.unsubscribe();
11445
11659
  }
@@ -11576,7 +11790,7 @@ class QdDatepickerComponent {
11576
11790
  this.control = this.controlContainer.control.get(this.formControlName);
11577
11791
  }
11578
11792
  else {
11579
- console.warn('QD-UI | QdDatepickerComponent - Missing FormControlName directive from host element of the component');
11793
+ console.warn('Quadrel Framework | QdDatepicker - Missing FormControlName directive from host element of the component.');
11580
11794
  }
11581
11795
  }
11582
11796
  initInnerControl() {
@@ -11610,6 +11824,20 @@ class QdDatepickerComponent {
11610
11824
  this.displayedDateTime = QdDateAdapter.formatToDateTimeLocaleString(currentValue, this.config?.enableSeconds);
11611
11825
  this.displayedTime = QdDateAdapter.formatToTimeLocaleString(currentValue, this.config?.enableSeconds);
11612
11826
  }
11827
+ rebindDisabledDatesValidatorIfChanged() {
11828
+ const current = this.config?.disabledDates;
11829
+ if (current === this._boundDisabledDates)
11830
+ return;
11831
+ this._boundDisabledDates = current;
11832
+ this.validateDisabledDates();
11833
+ }
11834
+ rebindDisabledTimesValidatorIfChanged() {
11835
+ const current = this.config?.timePicker?.disabledTimes;
11836
+ if (current === this._boundDisabledTimes)
11837
+ return;
11838
+ this._boundDisabledTimes = current;
11839
+ this.validateDisabledTimes();
11840
+ }
11613
11841
  validateDisabledDates() {
11614
11842
  if (!this.control)
11615
11843
  return;
@@ -12147,7 +12375,7 @@ class QdTranslateService {
12147
12375
  else if (translatable.translation) {
12148
12376
  translation = translatable.translation[this.translateService.currentLang || 'de'];
12149
12377
  if (translation === undefined) {
12150
- console.error(`Language "${this.translateService.currentLang}" is not implemented!`);
12378
+ console.error(`Quadrel Framework | QdTranslate - Language "${this.translateService.currentLang}" is not implemented.`);
12151
12379
  }
12152
12380
  }
12153
12381
  return translation || '';
@@ -12732,21 +12960,7 @@ function removeListItem(list, el) {
12732
12960
  if (index > -1)
12733
12961
  list.splice(index, 1);
12734
12962
  }
12735
- const validatorsDroppedWithOptsWarning = `
12736
- It looks like you're constructing using a QdFormControl with both an options argument and an
12737
- validators argument. Mixing these arguments will cause your validators in the argument to be dropped.
12738
- You should either put all your validators in the options object, or in separate validators
12739
- arguments. For example:
12740
-
12741
- // Using validators arguments
12742
- fc = new QdFormControl(42, Validators.required, myAsyncValidator);
12743
-
12744
- // Using AbstractControlOptions
12745
- fc = new QdFormControl(42, {validators: Validators.required, asyncValidators: myAV});
12746
-
12747
- // Do NOT mix them: validators in additional argument will be dropped!
12748
- fc = new QdFormControl(42, {validators: Validators.required}, /* Oops! */ myAsyncValidator);
12749
- `;
12963
+ const validatorsDroppedWithOptsWarning = 'Quadrel Framework | QdForms - QdFormControl received both an options object and a separate validators argument. The standalone validators argument is dropped. Pass all validators inside the options object or via the separate arguments, not both.';
12750
12964
 
12751
12965
  function hasUnit(control) {
12752
12966
  return control.value?.value != null && control.value?.unit != null;
@@ -13113,7 +13327,7 @@ class QdMultiInputComponent {
13113
13327
  * TODO remove logic for support of [formControlName] directive and FormControl with angular 14 update
13114
13328
  */
13115
13329
  set formControlName(formControlName) {
13116
- console.warn('QD-UI | QdMultiInputComponent - Please use the MultiInput with the QdFormArray form control and the [formArrayName] directive!');
13330
+ console.warn('Quadrel Framework | QdMultiInput - Please use <qd-multi-input> with the QdFormArray form control and the [formArrayName] directive.');
13117
13331
  this._formControlName = formControlName;
13118
13332
  }
13119
13333
  get formControlName() {
@@ -13223,7 +13437,7 @@ class QdMultiInputComponent {
13223
13437
  if (this.formArrayName) {
13224
13438
  const formArray = this.controlContainer.control.get(this.formArrayName);
13225
13439
  if (!formArray) {
13226
- console.warn('QD-UI | QdMultiInputComponent - No form control found for the provided [formArrayName]', this.formArrayName);
13440
+ console.warn('Quadrel Framework | QdMultiInput - No form control found for the provided [formArrayName]', this.formArrayName);
13227
13441
  return;
13228
13442
  }
13229
13443
  // Updating form array programmatically from outside
@@ -13242,7 +13456,7 @@ class QdMultiInputComponent {
13242
13456
  else {
13243
13457
  // TODO remove logic for support of Angular FormControl with angular 19 update
13244
13458
  this.formArray = this.qdFormArrayFactoryService.createQdFormArrayFromFormControl(formArray);
13245
- console.warn('QD-UI | QdMultiInputComponent - Please use the MultiInput with the QdFormArray form control!');
13459
+ console.warn('Quadrel Framework | QdMultiInput - Please use <qd-multi-input> with the QdFormArray form control.');
13246
13460
  }
13247
13461
  this.disabled = formArray.disabled;
13248
13462
  this._onDisabledChange = (disabled) => {
@@ -13251,7 +13465,7 @@ class QdMultiInputComponent {
13251
13465
  this.formArray.registerOnDisabledChange(this._onDisabledChange);
13252
13466
  }
13253
13467
  else {
13254
- console.warn('QD-UI | QdMultiInputComponent - Missing [formArrayName] directive from host element of the component');
13468
+ console.warn('Quadrel Framework | QdMultiInput - Missing [formArrayName] directive from host element of the component.');
13255
13469
  }
13256
13470
  }
13257
13471
  ngOnChanges(changes) {
@@ -13777,7 +13991,7 @@ class QdPinCodeComponent {
13777
13991
  this.control = this.controlContainer.control.get(this.formControlName);
13778
13992
  }
13779
13993
  else {
13780
- console.warn('QD-UI | QdPinCodeComponent - Missing FormControlName directive from host element of the component');
13994
+ console.warn('Quadrel Framework | QdPinCode - Missing FormControlName directive from host element of the component.');
13781
13995
  }
13782
13996
  }
13783
13997
  this._subs.add(this.actionEmitterService.hintEventEmitter$.subscribe(() => this.clickHint.emit()));
@@ -14237,7 +14451,7 @@ class QdRadioButtonsComponent {
14237
14451
  this.control = this.controlContainer.control.get(this.formControlName);
14238
14452
  }
14239
14453
  else {
14240
- console.warn('QD-UI | QdRadioButtonsComponent - Missing FormControlName directive from host element of the component');
14454
+ console.warn('Quadrel Framework | QdRadioButtons - Missing FormControlName directive from host element of the component.');
14241
14455
  }
14242
14456
  }
14243
14457
  this.initRadioButtonList();
@@ -14642,7 +14856,7 @@ class QdRichtextComponent {
14642
14856
  this.control = this.controlContainer.control?.get(this.formControlName) ?? undefined;
14643
14857
  }
14644
14858
  else {
14645
- console.warn('QD-UI | QdSwitchesComponent - Missing FormControlName directive from host element of the component');
14859
+ console.warn('Quadrel Framework | QdSwitches - Missing FormControlName directive from host element of the component.');
14646
14860
  }
14647
14861
  }
14648
14862
  this._subs.add(this.actionEmitterService.hintEventEmitter$.subscribe(() => this.clickHint.emit()));
@@ -14967,7 +15181,7 @@ class QdSwitchesComponent {
14967
15181
  this.control = this.controlContainer.control.get(this.formControlName);
14968
15182
  }
14969
15183
  else {
14970
- console.warn('QD-UI | QdSwitchesComponent - Missing FormControlName directive from host element of the component');
15184
+ console.warn('Quadrel Framework | QdSwitches - Missing FormControlName directive from host element of the component.');
14971
15185
  }
14972
15186
  }
14973
15187
  this.switchesService.setList(this.options);
@@ -15235,11 +15449,11 @@ class QdTextareaComponent {
15235
15449
  this.control = this.controlContainer.control.get(this.formControlName);
15236
15450
  // TODO remove logic for support of angular FormControl with angular 18 update
15237
15451
  if (!(this.control instanceof QdFormControl)) {
15238
- console.warn('QD-UI | QdTextareaComponent - Please use the QdFormControl instead of the Angular FormControl');
15452
+ console.warn('Quadrel Framework | QdTextarea - Please use the QdFormControl instead of the Angular FormControl.');
15239
15453
  }
15240
15454
  }
15241
15455
  else {
15242
- console.warn('QD-UI | QdTextareaComponent - Missing FormControlName directive from host element of the component');
15456
+ console.warn('Quadrel Framework | QdTextarea - Missing FormControlName directive from host element of the component.');
15243
15457
  }
15244
15458
  }
15245
15459
  this.valueForView = this.value || getValue(this.config);
@@ -16296,7 +16510,7 @@ class QdButtonStackButtonComponent {
16296
16510
  ngOnInit() {
16297
16511
  // TODO: Delete directive "qd-button-stack" in Version 15
16298
16512
  if (this._elementRef.nativeElement.attributes.hasOwnProperty('qd-button-stack')) {
16299
- console.warn('QD-UI | QdButtonStack - The directive "qd-button-stack" is deprecated. Please use "qdButtonStack" instead.');
16513
+ console.warn('Quadrel Framework | QdButtonStack - The directive "qd-button-stack" is deprecated. Please use "qdButtonStack" instead.');
16300
16514
  }
16301
16515
  }
16302
16516
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdButtonStackButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -16389,7 +16603,7 @@ class QdMenuButtonComponent {
16389
16603
  }
16390
16604
  ngOnInit() {
16391
16605
  if (!this.config)
16392
- console.error('QD-UI | QdMenuButtonComponent - Please provide a valid config.');
16606
+ console.error('Quadrel Framework | QdMenuButton - Please provide a valid config.');
16393
16607
  }
16394
16608
  hasUnhiddenActions() {
16395
16609
  return this.config?.actions?.some(action => !action.isHidden) ?? false;
@@ -16648,7 +16862,7 @@ class QdColumnAutoFillDirective {
16648
16862
  }
16649
16863
  }
16650
16864
  logErrorMessage(message) {
16651
- console.error(`${QdColumnAutoFillDirective.name} | ${message}`);
16865
+ console.error(`Quadrel Framework | QdColumnAutoFill - ${message}`);
16652
16866
  }
16653
16867
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnAutoFillDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
16654
16868
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnAutoFillDirective, isStandalone: false, selector: "[qdColumnAutoFill]", ngImport: i0 });
@@ -16697,7 +16911,7 @@ class QdColumnsDisableAutoFillDirective {
16697
16911
  }
16698
16912
  }
16699
16913
  logErrorMessage(message) {
16700
- console.error(`${QdColumnsDisableAutoFillDirective.name} | ${message}`);
16914
+ console.error(`Quadrel Framework | QdColumnsDisableAutoFill - ${message}`);
16701
16915
  }
16702
16916
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnsDisableAutoFillDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
16703
16917
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnsDisableAutoFillDirective, isStandalone: false, selector: "[qdColumnsDisableAutoFill]", ngImport: i0 });
@@ -16971,7 +17185,7 @@ class QdColumnDisableResponsiveColspansDirective {
16971
17185
  }
16972
17186
  }
16973
17187
  logErrorMessage(message) {
16974
- console.error(`${QdColumnDisableResponsiveColspansDirective.name} | ${message}`);
17188
+ console.error(`Quadrel Framework | QdColumnDisableResponsiveColspans - ${message}`);
16975
17189
  }
16976
17190
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnDisableResponsiveColspansDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
16977
17191
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnDisableResponsiveColspansDirective, isStandalone: false, selector: "[qdColumnDisableResponsiveColspans]", ngImport: i0 });
@@ -17030,7 +17244,7 @@ class QdColumnsMaxDirective {
17030
17244
  }
17031
17245
  }
17032
17246
  logErrorMessage(message) {
17033
- console.error(`${QdColumnsMaxDirective.name} | ${message}`);
17247
+ console.error(`Quadrel Framework | QdColumnsMax - ${message}`);
17034
17248
  }
17035
17249
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnsMaxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
17036
17250
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnsMaxDirective, isStandalone: false, selector: "[qdColumnsMax]", inputs: { qdColumnsMax: "qdColumnsMax" }, ngImport: i0 });
@@ -17197,7 +17411,7 @@ class QdColumnBreakBeforeDirective {
17197
17411
  }
17198
17412
  }
17199
17413
  logErrorMessage(message) {
17200
- console.error(`${QdColumnBreakBeforeDirective.name} | ${message}`);
17414
+ console.error(`Quadrel Framework | QdColumnBreakBefore - ${message}`);
17201
17415
  }
17202
17416
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnBreakBeforeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
17203
17417
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnBreakBeforeDirective, isStandalone: false, selector: "[qdColumnBreakBefore]", ngImport: i0 });
@@ -17248,7 +17462,7 @@ class QdColumnNextInSameRowDirective {
17248
17462
  }
17249
17463
  if (!nextSiblingColspan) {
17250
17464
  this.logErrorMessage('The next sibling of the element marked with qdColumnNextInSameRow ' +
17251
- 'has to be an element with a qdColumn directive!');
17465
+ 'has to be an element with a qdColumn directive.');
17252
17466
  }
17253
17467
  if (nextSiblingColspan) {
17254
17468
  this._renderer.addClass(this.element, QdColumnNextInSameRowDirective.className);
@@ -17270,7 +17484,7 @@ class QdColumnNextInSameRowDirective {
17270
17484
  return QdColumnDirective.getQdColumnColspan(nextSibling);
17271
17485
  }
17272
17486
  logErrorMessage(message) {
17273
- console.error(`${QdColumnNextInSameRowDirective.name} | ${message}`);
17487
+ console.error(`Quadrel Framework | QdColumnNextInSameRow - ${message}`);
17274
17488
  }
17275
17489
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnNextInSameRowDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
17276
17490
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnNextInSameRowDirective, isStandalone: false, selector: "[qdColumnNextInSameRow]", ngImport: i0 });
@@ -17320,7 +17534,7 @@ class QdColumnFullGridWidthDirective {
17320
17534
  }
17321
17535
  }
17322
17536
  logErrorMessage(message) {
17323
- console.error(`${QdColumnFullGridWidthDirective.name} | ${message}`);
17537
+ console.error(`Quadrel Framework | QdColumnFullGridWidth - ${message}`);
17324
17538
  }
17325
17539
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnFullGridWidthDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
17326
17540
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnFullGridWidthDirective, isStandalone: false, selector: "[qdColumnFullGridWidth]", ngImport: i0 });
@@ -17368,7 +17582,7 @@ class QdColumnsDisableResponsiveColspansDirective {
17368
17582
  }
17369
17583
  }
17370
17584
  logErrorMessage(message) {
17371
- console.error(`${QdColumnsDisableResponsiveColspansDirective.name} | ${message}`);
17585
+ console.error(`Quadrel Framework | QdColumnsDisableResponsiveColspans - ${message}`);
17372
17586
  }
17373
17587
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdColumnsDisableResponsiveColspansDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
17374
17588
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: QdColumnsDisableResponsiveColspansDirective, isStandalone: false, selector: "[qdColumnsDisableResponsiveColspans]", ngImport: i0 });
@@ -18166,7 +18380,7 @@ class QdPendingChangesGuardDirective {
18166
18380
  formGroup;
18167
18381
  constructor() {
18168
18382
  if (!this.ngForm && !this.formGroupDirective) {
18169
- console.error('QD-UI | QdPendingChangesGuardDirective - requires NgForm or FormGroupDirective to be present on the host element.');
18383
+ console.error('Quadrel Framework | QdPendingChangesGuard - requires NgForm or FormGroupDirective to be present on the host element.');
18170
18384
  }
18171
18385
  }
18172
18386
  ngOnInit() {
@@ -19341,7 +19555,7 @@ class QdFileCollectorComponent {
19341
19555
  isEqual$1(config.allowedFileNamePattern, this.fileTypeService.getFileNamePattern(config.allowedFileTypes)));
19342
19556
  }
19343
19557
  logError(message) {
19344
- console.error(`QD-UI | QdFileCollector - ${message}`);
19558
+ console.error(`Quadrel Framework | QdFileCollector - ${message}`);
19345
19559
  }
19346
19560
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdFileCollectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19347
19561
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdFileCollectorComponent, isStandalone: false, selector: "qd-file-collector", inputs: { config: "config", testId: ["data-test-id", "testId"] }, providers: [QdFileCollectorService, QdFileCollectorValidationService], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<button\n qdButton\n qdButtonGhost\n icon=\"plus\"\n *ngIf=\"canShowAddButton\"\n (click)=\"clickFileInput()\"\n [data-test-id]=\"testId + '-button-add-new'\"\n>\n {{ config?.standaloneAddNewLabel?.i18n || \"i18n.qd.fileCollector.standalone.addNew\" | translate }}\n</button>\n\n<input\n [disabled]=\"config?.readonly || config?.viewonly\"\n type=\"file\"\n (change)=\"handleFiles($event)\"\n #fileInput\n hidden\n multiple=\"multiple\"\n/>\n\n<qd-file-collector-allowed-files-description\n *ngIf=\"!config?.readonly && !config?.viewonly\"\n [attr.data-test-id]=\"testId + '-allowed-files-description'\"\n></qd-file-collector-allowed-files-description>\n\n<ng-container *ngFor=\"let fileUpload of this.fileUploads; let i = index\">\n <qd-file-collector-item\n *ngIf=\"!fileUpload.error && fileUpload.progress === 100\"\n [progress]=\"fileUpload.progress\"\n [newlyUploaded]=\"fileUpload.newlyUploaded\"\n [collectedFile]=\"fileUpload.collectedFile\"\n [error]=\"fileUpload.error\"\n [readonly]=\"config?.readonly\"\n [viewonly]=\"config?.viewonly\"\n [downloadFilesWithHttpClient]=\"config?.downloadFilesWithHttpClient\"\n [data-test-id]=\"testId + '-item-' + i\"\n ></qd-file-collector-item>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column}:host>.qd-button{align-self:end;margin-bottom:1.5rem}\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: "component", type: QdButtonComponent, selector: "button[qdButton], a[qdButton], button[qd-button]", inputs: ["disabled", "color", "icon", "data-test-id", "additionalInfo"] }, { kind: "directive", type: QdButtonGhostDirective, selector: "button[qdButtonGhost], a[qdButtonGhost]" }, { kind: "component", type: QdFileCollectorAllowedFilesDescriptionComponent, selector: "qd-file-collector-allowed-files-description" }, { kind: "component", type: QdFileCollectorItemComponent, selector: "qd-file-collector-item", inputs: ["progress", "newlyUploaded", "collectedFile", "error", "readonly", "viewonly", "downloadFilesWithHttpClient", "data-test-id"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
@@ -19582,7 +19796,7 @@ function resetCategoryFilter$1(state, categoryIndex) {
19582
19796
  const isIsoTimestampValid = (isoTimestamp) => {
19583
19797
  const valid = new RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d((:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|([+-][0-2]\d:[0-5]\d|Z))/).test(isoTimestamp);
19584
19798
  if (!valid && isoTimestamp !== '') {
19585
- console.warn('QD-UI | QdFilterService - The given ISO 8601 date string is not valid.');
19799
+ console.warn('Quadrel Framework | QdFilter - The given ISO 8601 date string is not valid.');
19586
19800
  }
19587
19801
  return valid;
19588
19802
  };
@@ -19694,7 +19908,7 @@ function validateFilterSelection(filterSelection, filterCategories, selectionSou
19694
19908
  Object.keys(filterSelection).forEach(selectionCategory => {
19695
19909
  const categoryInFilter = filterCategories.find(category => category.category === selectionCategory);
19696
19910
  if (!categoryInFilter) {
19697
- console.warn(`The category "${selectionCategory}" that is given in the ${selectionSource} is not part of the filter!`);
19911
+ console.warn(`Quadrel Framework | QdFilter - The category "${selectionCategory}" that is given in the ${selectionSource} is not part of the filter.`);
19698
19912
  return;
19699
19913
  }
19700
19914
  switch (categoryInFilter.type) {
@@ -19704,8 +19918,8 @@ function validateFilterSelection(filterSelection, filterCategories, selectionSou
19704
19918
  const items = categoryInFilter.items;
19705
19919
  filterSelection[selectionCategory].forEach(selectionItem => {
19706
19920
  if (!items.some(item => item.item === selectionItem)) {
19707
- console.warn(`The item "${selectionItem}" that is given in the ${selectionSource} ` +
19708
- `is not contained in the filter category "${selectionCategory}"!`);
19921
+ console.warn(`Quadrel Framework | QdFilter - The item "${selectionItem}" that is given in the ${selectionSource} ` +
19922
+ `is not contained in the filter category "${selectionCategory}".`);
19709
19923
  }
19710
19924
  });
19711
19925
  break;
@@ -19715,7 +19929,7 @@ function validateFilterSelection(filterSelection, filterCategories, selectionSou
19715
19929
  case 'dateTimeRange':
19716
19930
  filterSelection[selectionCategory].forEach((selectionItem, itemIndex) => {
19717
19931
  if (selectionItem !== '' && isNaN(Date.parse(selectionItem))) {
19718
- console.error(`The given ${selectionSource} contains an invalid date for the category "${selectionCategory}"!`);
19932
+ console.error(`Quadrel Framework | QdFilter - The given ${selectionSource} contains an invalid date for the category "${selectionCategory}".`);
19719
19933
  filterSelection[selectionCategory][itemIndex] = '';
19720
19934
  }
19721
19935
  });
@@ -19727,7 +19941,7 @@ function validateFilterSelection(filterSelection, filterCategories, selectionSou
19727
19941
  const initialState$2 = {};
19728
19942
  const _filterReducer = createReducer(initialState$2, on(QdFilterActions.initFilterState, (state, { filterId, filterData }) => {
19729
19943
  if (filterData === undefined || filterData.categories.length === 0) {
19730
- console.warn('QD-UI | QdFilterService - The filterData input is invalid. To use this input, please read the documentation.');
19944
+ console.warn('Quadrel Framework | QdFilter - The "filterData" input is invalid. To use this input, please read the documentation.');
19731
19945
  return state;
19732
19946
  }
19733
19947
  return updateStateWithNewFilter(state, filterId, createFilterState(filterData));
@@ -19767,7 +19981,7 @@ const _filterReducer = createReducer(initialState$2, on(QdFilterActions.initFilt
19767
19981
  }), on(QdFilterActions.updateCategoryTranslation, (state, { filterId, filterData }) => {
19768
19982
  const newFilter = getNewFilter(state, filterId);
19769
19983
  if (filterData === undefined || filterData.categories.length === 0) {
19770
- console.warn('QD-UI | QdFilterService - The filterData input is invalid. To use this input, please read the documentation.');
19984
+ console.warn('Quadrel Framework | QdFilter - The "filterData" input is invalid. To use this input, please read the documentation.');
19771
19985
  return state;
19772
19986
  }
19773
19987
  newFilter.categories.forEach((_category, i) => {
@@ -20963,7 +21177,7 @@ class QdFilterRouterConnectorService {
20963
21177
  return of(false);
20964
21178
  }
20965
21179
  if (this._connectedFilter) {
20966
- console.error('QdUi | QdFilterComponent | More than one filter with enabled connectWithRouter config is not allowed! ' +
21180
+ console.error('Quadrel Framework | QdFilter - More than one filter with enabled "connectWithRouter" config is not allowed. ' +
20967
21181
  'Please set connectWithRouter to false except for one filter.');
20968
21182
  return of(false);
20969
21183
  }
@@ -21251,7 +21465,7 @@ class QdFilterComponent {
21251
21465
  }
21252
21466
  validateConfig() {
21253
21467
  if (this.filterData?.outputLegacyQueryStringFormat !== false && this.queryStringOutput.observers.length > 0) {
21254
- console.warn('QdFilter | You use the queryStringOutput with the legacy format. To use the new format please set outputLegacyQueryStringFormat to false. The legacy format will be removed in future releases.');
21468
+ console.warn('Quadrel Framework | QdFilter - You use the "queryStringOutput" with the legacy format. To use the new format please set "outputLegacyQueryStringFormat" to false. The legacy format will be removed in future releases.');
21255
21469
  }
21256
21470
  }
21257
21471
  init() {
@@ -21938,9 +22152,9 @@ class NavigationTileComponent {
21938
22152
  }
21939
22153
  validate() {
21940
22154
  if (!this.title)
21941
- console.error('QdUi | Navigation Tiles | You should provide a title.');
22155
+ console.error('Quadrel Framework | QdNavigationTile - You should provide a title.');
21942
22156
  if (!this.icon)
21943
- console.error('QdUi | Navigation Tiles | You should provide an icon.');
22157
+ console.error('Quadrel Framework | QdNavigationTile - You should provide an icon.');
21944
22158
  }
21945
22159
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: NavigationTileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21946
22160
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: NavigationTileComponent, isStandalone: false, selector: "a[qd-navigation-tile]", inputs: { title: "title", icon: "icon" }, ngImport: i0, template: "<qd-icon *ngIf=\"icon\" [icon]=\"icon\"></qd-icon>\n<small>{{ title | translate }}</small>\n", styles: [":host{display:block;height:10rem;align-items:unset;padding:.75rem;border:1px solid rgb(213,213,213);background-color:#fff;color:unset;line-height:unset;text-align:unset;text-decoration:unset}qd-icon{display:block;margin-bottom:2.8125rem;font-size:2rem}small{color:#171717;font-size:14px;font-weight:500;line-height:20px;text-wrap:normal}@media (min-width: 1280px){small{font-size:1rem}}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: QdIconComponent, selector: "qd-icon", inputs: ["icon"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
@@ -22038,7 +22252,7 @@ class QdSearchRouterConnectorService {
22038
22252
  return of(false);
22039
22253
  }
22040
22254
  if (this._connectedSearch) {
22041
- console.error('QdUi | QdSearchComponent | More than one search with enabled connectWithRouter config is not allowed! ' +
22255
+ console.error('Quadrel Framework | QdSearch - More than one search with enabled "connectWithRouter" config is not allowed. ' +
22042
22256
  'Please set connectWithRouter to false except for one search.');
22043
22257
  return of(false);
22044
22258
  }
@@ -22493,7 +22707,7 @@ class QdContextService {
22493
22707
  setValue(contextId, selection) {
22494
22708
  const index = this._configuredContexts.value.findIndex(context => context.id === contextId);
22495
22709
  if (index < 0)
22496
- throw new Error(`QdUi | QdContextService - Cannot set value of unconfigured context ${contextId}`);
22710
+ throw new Error(`Quadrel Framework | QdContext - Cannot set value of unconfigured context ${contextId}`);
22497
22711
  this._values.next([
22498
22712
  ...this._values.value.filter(value => value.contextId !== contextId),
22499
22713
  { contextId, value: selection }
@@ -23131,7 +23345,7 @@ class QdTableResolverService {
23131
23345
  refresh(resolverOptions = {}) {
23132
23346
  const resolver = this.tableDataResolver;
23133
23347
  if (!resolver)
23134
- return console.warn('QD-UI | QdTable - Refresh skipped: resolver not provided.');
23348
+ return console.warn('Quadrel Framework | QdTable - Refresh skipped: resolver not provided.');
23135
23349
  const { pageIndex } = resolverOptions;
23136
23350
  if (this._refreshSubscription)
23137
23351
  this._refreshSubscription.unsubscribe();
@@ -23255,7 +23469,7 @@ class QdTableResponsiveRowService {
23255
23469
  const maxCurrentColumns = this.columnMapping[this._currentBreakpoint];
23256
23470
  let columnsDefinitions = this._config.columns.map(column => column.column);
23257
23471
  if (this.mainColumnIndex >= maxCurrentColumns) {
23258
- console.warn('QD-UI | QdTableComponent - The index of the "mainColumn" cannot be equal or greater than maximum columns for this breakpoint.');
23472
+ console.warn('Quadrel Framework | QdTable - The index of the "mainColumn" cannot be equal or greater than maximum columns for this breakpoint.');
23259
23473
  return columnsDefinitions;
23260
23474
  }
23261
23475
  if (maxCurrentColumns >= columnsLength)
@@ -23655,10 +23869,10 @@ class QdTablePaginatorComponent {
23655
23869
  }
23656
23870
  isConfigValid() {
23657
23871
  if (this.config?.hasPagination) {
23658
- console.warn('QD-UI | QdTable Pagination - The config "hasPagination" is deprecated. Please use "pagination" instead.');
23872
+ console.warn('Quadrel Framework | QdTable Pagination - The config "hasPagination" is deprecated. Please use "pagination" instead.');
23659
23873
  }
23660
23874
  if (!this.tableDataResolver) {
23661
- console.error('QD-UI | QdTable Pagination - Provide a resolver for pagination. Please use the "QD_TABLE_DATA_RESOLVER_TOKEN" injection token.');
23875
+ console.error('Quadrel Framework | QdTable Pagination - Provide a resolver for pagination. Please use the "QD_TABLE_DATA_RESOLVER_TOKEN" injection token.');
23662
23876
  return false;
23663
23877
  }
23664
23878
  return true;
@@ -23952,7 +24166,7 @@ class QdTableBodyComponent {
23952
24166
  }
23953
24167
  primaryAction(rowData, index) {
23954
24168
  if (!this.config.primaryAction?.handler)
23955
- return console.warn('QD-UI | QdTable - No handler defined for primary action.');
24169
+ return console.warn('Quadrel Framework | QdTable - No handler defined for primary action.');
23956
24170
  if (this.config.primaryAction?.highlightOnRevisit) {
23957
24171
  this.tableStoreService.setLastVisitedRow(resolveRowIdentifier(rowData, index, this.config.trackRowBy));
23958
24172
  }
@@ -24014,7 +24228,7 @@ class QdTableEmptyStateComponent {
24014
24228
  }
24015
24229
  getI18n() {
24016
24230
  if (!this.emptyStateService.i18ns)
24017
- console.warn('QD-UI | QdTable - No translations available.');
24231
+ console.warn('Quadrel Framework | QdTable - No translations available.');
24018
24232
  return this.emptyStateService.i18ns;
24019
24233
  }
24020
24234
  handleClick() {
@@ -24473,7 +24687,7 @@ class QdTableComponent {
24473
24687
  }
24474
24688
  registerConnector(connectorName) {
24475
24689
  if (!this.tableDataResolver) {
24476
- console.warn('QD-UI | QdTable - qdConnectToFilter only works with a resolver. Please inject the resolver using QD_TABLE_DATA_RESOLVER_TOKEN.');
24690
+ console.warn('Quadrel Framework | QdTable - qdConnectToFilter only works with a resolver. Please inject the resolver using QD_TABLE_DATA_RESOLVER_TOKEN.');
24477
24691
  return;
24478
24692
  }
24479
24693
  this._connectors.push({ connectorName, connectorState: QdTableConnectorState.AWAITING });
@@ -24522,7 +24736,7 @@ class QdTableComponent {
24522
24736
  this.secondaryActionOutput.emit(recentAction);
24523
24737
  const action = this.config.secondaryActions?.find(a => a.type === recentAction.type);
24524
24738
  if (!action?.handler)
24525
- return console.warn('QD-UI | QdTable - No handler defined for secondary action:', recentAction.type);
24739
+ return console.warn('Quadrel Framework | QdTable - No handler defined for secondary action:', recentAction.type);
24526
24740
  if (action.highlightOnRevisit) {
24527
24741
  this.tableStoreService.setLastVisitedRow(resolveRowIdentifier(recentAction.rowData, recentAction.index, this.config.trackRowBy));
24528
24742
  }
@@ -24546,13 +24760,13 @@ class QdTableComponent {
24546
24760
  if (!this.config.refreshOnPushEvent)
24547
24761
  return;
24548
24762
  if (!this.config.uid) {
24549
- console.error('QD-UI | QdTable - A uid has to be defined when refreshOnPushEvent is enabled. ' +
24550
- 'The table uid has to match the path of the server side event.');
24763
+ console.error('Quadrel Framework | QdTable - A "uid" has to be defined when "refreshOnPushEvent" is enabled. ' +
24764
+ 'The table "uid" has to match the path of the server side event.');
24551
24765
  return;
24552
24766
  }
24553
24767
  if (!this.pushEventsService || !this.pushEventsService.isConnectedOrConnecting()) {
24554
- console.error('QD-UI | QdTable - You have to connect the QdPushEventsService on your own ' +
24555
- 'if you enable the refreshOnPushEvent flag in the table.');
24768
+ console.error('Quadrel Framework | QdTable - You have to connect the QdPushEventsService on your own ' +
24769
+ 'if you enable the "refreshOnPushEvent" flag in the table.');
24556
24770
  return;
24557
24771
  }
24558
24772
  const pushEventsService = this.pushEventsService;
@@ -24565,11 +24779,11 @@ class QdTableComponent {
24565
24779
  return data.path.includes(this.config.uid);
24566
24780
  }
24567
24781
  catch (error) {
24568
- console.warn('Failed to process messageEvent:', error);
24782
+ console.warn('Quadrel Framework | QdTable - Failed to process messageEvent:', error);
24569
24783
  return false;
24570
24784
  }
24571
24785
  }), catchError(error => {
24572
- console.error('Error in event stream:', error);
24786
+ console.error('Quadrel Framework | QdTable - Error in event stream:', error);
24573
24787
  return NEVER;
24574
24788
  }))
24575
24789
  .subscribe(() => this.triggerRefresh());
@@ -24589,14 +24803,14 @@ class QdTableComponent {
24589
24803
  }
24590
24804
  validateConfig() {
24591
24805
  if (!this.config.i18ns) {
24592
- console.warn('QD-UI | QdTable - No translations available for the secondaryActions.');
24806
+ console.warn('Quadrel Framework | QdTable - No translations available for the secondaryActions.');
24593
24807
  }
24594
24808
  if (this.hasHighlightOnRevisit() && !this.config.uid) {
24595
- console.warn('QD-UI | QdTable - A uid has to be defined when highlightOnRevisit is enabled. ' +
24809
+ console.warn('Quadrel Framework | QdTable - A "uid" has to be defined when "highlightOnRevisit" is enabled. ' +
24596
24810
  'Without a uid, the table state does not persist across navigation.');
24597
24811
  }
24598
24812
  if (this.config.selection?.type === 'multiSelect' && this.hasPagination && !this.config.trackRowBy) {
24599
- throw new Error('QD-UI | QdTable - "trackRowBy" is required when combining "selection: multiSelect" with pagination. ' +
24813
+ throw new Error('Quadrel Framework | QdTable - "trackRowBy" is required when combining "selection: multiSelect" with pagination. ' +
24600
24814
  'Provide a trackRowBy function (e.g. `trackRowBy: row => row.uid`) that returns a unique identifier ' +
24601
24815
  'per row, otherwise selections cannot be persisted across pages, page-size or sort changes.');
24602
24816
  }
@@ -24612,7 +24826,7 @@ class QdTableComponent {
24612
24826
  mapColumnFillsWidth() {
24613
24827
  if (!this.config.mainColumnNotFillingWidth)
24614
24828
  return;
24615
- console.warn('QD-UI | QdTable - The config key "mainColumnNotFillingWidth" is deprecated. Please use "whichColumnFillsWidth" instead.');
24829
+ console.warn('Quadrel Framework | QdTable - The config key "mainColumnNotFillingWidth" is deprecated. Please use "whichColumnFillsWidth" instead.');
24616
24830
  if (this.config.whichColumnFillsWidth)
24617
24831
  return;
24618
24832
  this.config.whichColumnFillsWidth = 'none';
@@ -24865,7 +25079,7 @@ class QdConnectorTableFilterDirective {
24865
25079
  constructor() {
24866
25080
  const toolbarComponentsService = this.toolbarComponentsService;
24867
25081
  if (!toolbarComponentsService)
24868
- throw new Error('QD-UI | QdConnectorTableFilterDirective - Please use this directive only within a QdSection!');
25082
+ throw new Error('Quadrel Framework | QdConnectorTableFilter - Please use this directive only within <qd-section>.');
24869
25083
  this.tableComponent.registerConnector('filter');
24870
25084
  }
24871
25085
  ngAfterViewInit() {
@@ -24887,7 +25101,7 @@ class QdConnectorTableFilterDirective {
24887
25101
  }
24888
25102
  validateAndApplyConfig() {
24889
25103
  if (this.filterComponent.hasFilterData())
24890
- console.error('QD-UI | QdConnectorTableFilterDirective - Please remove the redundant filterConfig in the sectionConfig. Will be overridden by this directive.');
25104
+ console.error('Quadrel Framework | QdConnectorTableFilter - Please remove the redundant "filterConfig" in the "sectionConfig". Will be overridden by this directive.');
24891
25105
  this.filterComponent.setFilterConfig({ ...this.qdConnectToFilter, emitOutputsInitially: true });
24892
25106
  }
24893
25107
  subscribeToFilterChanges() {
@@ -24951,7 +25165,7 @@ class QdConnectorTableSearchDirective {
24951
25165
  constructor() {
24952
25166
  const toolbarComponentsService = this.toolbarComponentsService;
24953
25167
  if (!toolbarComponentsService)
24954
- throw new Error('QD-UI | QdConnectorTableSearchDirective - Please use this directive only within a QdSection!');
25168
+ throw new Error('Quadrel Framework | QdConnectorTableSearch - Please use this directive only within <qd-section>.');
24955
25169
  this.tableComponent.registerConnector('search');
24956
25170
  }
24957
25171
  ngAfterViewInit() {
@@ -24969,7 +25183,7 @@ class QdConnectorTableSearchDirective {
24969
25183
  }
24970
25184
  validateAndApplyConfig() {
24971
25185
  if (this.searchComponent.hasConfigData())
24972
- console.warn('QD-UI | QdConnectorTableSearchDirective - Please remove the redundant searchConfig in the sectionConfig. Will overridden by this directive.');
25186
+ console.warn('Quadrel Framework | QdConnectorTableSearch - Please remove the redundant "searchConfig" in the "sectionConfig". Will be overridden by this directive.');
24973
25187
  this.searchComponent.configData = { emitEmptySearch: true, ...this.qdConnectToSearch };
24974
25188
  }
24975
25189
  subscribeToSearchChanges() {
@@ -25038,7 +25252,7 @@ class QdSectionAdapterDirective {
25038
25252
  const toRemove = Array.from(host.children).filter(child => child.tagName !== 'QD-SECTION');
25039
25253
  toRemove.forEach(el => {
25040
25254
  this.renderer.removeChild(host, el);
25041
- console.warn('QD-UI | QdSectionAdapterDirective Only "qd-section" is supported. The following content is not rendered:', el);
25255
+ console.warn('Quadrel Framework | QdSectionAdapter - Only "qd-section" is supported. The following content is not rendered:', el);
25042
25256
  });
25043
25257
  }
25044
25258
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdSectionAdapterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -25158,13 +25372,13 @@ class QdSectionToolbarActionComponent {
25158
25372
  }
25159
25373
  validateConfig() {
25160
25374
  if (this._config.action) {
25161
- console.warn('QD-UI | QdSectionComponent - The `action` key is deprecated and will be removed in v18. Use `actions` instead.');
25375
+ console.warn('Quadrel Framework | QdSection - The "action" key is deprecated and will be removed in v18. Use "actions" instead.');
25162
25376
  }
25163
25377
  if (this._config.action && this._config.actions) {
25164
- console.error('QD-UI | QdSectionComponent - Both `action` and `actions` are defined in the configuration. Please use only `actions`.');
25378
+ console.error('Quadrel Framework | QdSection - Both "action" and "actions" are defined in the configuration. Please use only "actions".');
25165
25379
  }
25166
25380
  if (this._config.actions && this._config.actions.filter(action => action.type === 'addNew').length > 1) {
25167
- console.error('QD-UI | QdSectionComponent - The action type `addNew` is used multiple times in `actions`. Please use `addNew` only once.');
25381
+ console.error('Quadrel Framework | QdSection - The action type "addNew" is used multiple times in "actions". Please use "addNew" only once.');
25168
25382
  }
25169
25383
  }
25170
25384
  // TODO: Remove in v19
@@ -26182,7 +26396,7 @@ class QdTreeEmptyStateComponent {
26182
26396
  config;
26183
26397
  getI18n() {
26184
26398
  if (!this.emptyStateService.i18ns)
26185
- console.warn('QD-UI | QdTree - No translations available.');
26399
+ console.warn('Quadrel Framework | QdTree - No translations available.');
26186
26400
  return this.emptyStateService.i18ns;
26187
26401
  }
26188
26402
  handleClick() {
@@ -26371,7 +26585,7 @@ class QdTreeComponent {
26371
26585
  }
26372
26586
  validateConfig() {
26373
26587
  if (!this.config.i18ns) {
26374
- console.warn('QD-UI | QdTree - No translations available for the secondaryActions.');
26588
+ console.warn('Quadrel Framework | QdTree - No translations available for the secondaryActions.');
26375
26589
  }
26376
26590
  }
26377
26591
  initializeGroupService() {
@@ -26380,7 +26594,7 @@ class QdTreeComponent {
26380
26594
  }
26381
26595
  catch (err) {
26382
26596
  if (err instanceof QdGroupedIndicesNotConsecutiveError) {
26383
- console.error('QD-UI | QdTree - Non-sequential "tree" content types are not allowed.');
26597
+ console.error('Quadrel Framework | QdTree - Non-sequential "tree" content types are not allowed.');
26384
26598
  }
26385
26599
  }
26386
26600
  }
@@ -26414,7 +26628,7 @@ class QdTreeComponent {
26414
26628
  this.secondaryActionOutput.emit(recentAction);
26415
26629
  const action = this.config.secondaryActions?.find(a => a.type === recentAction.type);
26416
26630
  if (!action?.handler)
26417
- return console.warn('QD-UI | QdTree - No handler defined for secondary action:', recentAction.type);
26631
+ return console.warn('Quadrel Framework | QdTree - No handler defined for secondary action:', recentAction.type);
26418
26632
  action.handler(recentAction);
26419
26633
  });
26420
26634
  }
@@ -26665,7 +26879,7 @@ class QdPageFooterService {
26665
26879
  updates.forEach(({ actionKey, partialAction }) => {
26666
26880
  const action = currentActionsMap.get(actionKey);
26667
26881
  if (!action)
26668
- return console.warn(`QdUi | QdPageFooterService - Action with key "${actionKey}" not found.`);
26882
+ return console.warn(`Quadrel Framework | QdPageFooter - Action with key "${actionKey}" not found.`);
26669
26883
  updatedActionsMap.set(actionKey, { ...action, ...partialAction });
26670
26884
  });
26671
26885
  this._pageFooterActions.next(updatedActionsMap);
@@ -27185,7 +27399,7 @@ class QdDynamicFacetComponent {
27185
27399
  ngOnInit() {
27186
27400
  const facet = this.dynamicFacetsService.getFacet(this.facet.options.type);
27187
27401
  if (!facet) {
27188
- console.error('QdUi | QdPage | Facet could not be found.');
27402
+ console.error('Quadrel Framework | QdPage - Facet could not be found.');
27189
27403
  return;
27190
27404
  }
27191
27405
  const viewContainerRef = this.dynamicFacet.viewContainerRef;
@@ -27234,13 +27448,13 @@ class QdPageCommitActionExecutor {
27234
27448
  onAfterSnapshot?.();
27235
27449
  }
27236
27450
  catch (err) {
27237
- console.error('QD-UI | QdPage - internal onAfterSnapshot hook threw after form was marked as saved.', err);
27451
+ console.error('Quadrel Framework | QdPage - internal onAfterSnapshot hook threw after form was marked as saved.', err);
27238
27452
  }
27239
27453
  try {
27240
27454
  action.onSuccess?.();
27241
27455
  }
27242
27456
  catch (err) {
27243
- console.error('QD-UI | QdPage - onSuccess callback threw after form was marked as saved.', err);
27457
+ console.error('Quadrel Framework | QdPage - onSuccess callback threw after form was marked as saved.', err);
27244
27458
  }
27245
27459
  });
27246
27460
  };
@@ -27259,14 +27473,14 @@ class QdPageCommitActionExecutor {
27259
27473
  }
27260
27474
  static handleError(action, err) {
27261
27475
  if (!action.onError) {
27262
- console.error('QD-UI | QdPage - Commit action observable errored — form was not marked as saved. Provide an `onError` hook on the action, or handle errors in the handler.', err);
27476
+ console.error('Quadrel Framework | QdPage - Commit action observable errored — form was not marked as saved. Provide an `onError` hook on the action, or handle errors in the handler.', err);
27263
27477
  return;
27264
27478
  }
27265
27479
  try {
27266
27480
  action.onError(err);
27267
27481
  }
27268
27482
  catch (callbackErr) {
27269
- console.error('QD-UI | QdPage - onError callback threw.', callbackErr);
27483
+ console.error('Quadrel Framework | QdPage - onError callback threw.', callbackErr);
27270
27484
  }
27271
27485
  }
27272
27486
  }
@@ -27401,7 +27615,7 @@ class QdFormGroupManagerService {
27401
27615
  captured.set(key, structuredClone(fg.getRawValue()));
27402
27616
  }
27403
27617
  catch (err) {
27404
- throw new Error(`QD-UI | QdFormGroupManager - captureFormValues() failed for group "${key}". ` +
27618
+ throw new Error(`Quadrel Framework | QdFormGroupManager - captureFormValues() failed for group "${key}". ` +
27405
27619
  `Form values must be structured-cloneable. Non-cloneable values like functions, ` +
27406
27620
  `symbols, or DOM nodes are not supported. Original error: ${String(err)}`);
27407
27621
  }
@@ -27495,7 +27709,7 @@ class QdFormGroupManagerService {
27495
27709
  initFormArrayFromValues(array, values) {
27496
27710
  const protoValue = values[0];
27497
27711
  if (!protoValue || typeof protoValue !== 'object') {
27498
- console.warn('QD-UI | QdFormGroupManager - Cannot restore FormArray: no prototype and value is not object-like.');
27712
+ console.warn('Quadrel Framework | QdFormGroupManager - Cannot restore FormArray: no prototype and value is not object-like.');
27499
27713
  return;
27500
27714
  }
27501
27715
  for (let i = 0; i < values.length; i++) {
@@ -27517,7 +27731,7 @@ class QdFormGroupManagerService {
27517
27731
  const arrControls = control.controls.map(c => this.deepCloneControl(c));
27518
27732
  return new FormArray(arrControls, control.validator, control.asyncValidator);
27519
27733
  }
27520
- throw new Error('QD-UI | QdFormGroupManager - Unsupported control type');
27734
+ throw new Error('Quadrel Framework | QdFormGroupManager - Unsupported control type.');
27521
27735
  }
27522
27736
  areFormGroupsValid(fg) {
27523
27737
  return Object.values(fg.controls).every(c => (c.disabled && !c.validator && !c.asyncValidator ? true : c.valid));
@@ -27949,7 +28163,7 @@ class QdPageObjectHeaderComponent {
27949
28163
  !(metadata$ instanceof ReplaySubject) &&
27950
28164
  !(metadata$ instanceof BehaviorSubject)) {
27951
28165
  this._metadataStreamTypeWarned = true;
27952
- console.warn('QdUi | QdPageObjectHeaderComponent - metadata$ is a plain Subject. Emissions fired before the ' +
28166
+ console.warn('Quadrel Framework | QdPageObjectHeader - metadata$ is a plain Subject. Emissions fired before the ' +
27953
28167
  "header subscribes (e.g. during the consuming component's ngOnInit) will be lost. " +
27954
28168
  'Use createMetadataStream() or pass a ReplaySubject(1)/BehaviorSubject instead.');
27955
28169
  }
@@ -28061,7 +28275,7 @@ class QdPageStepperAdapterDirective {
28061
28275
  const toRemove = Array.from(host.children).filter(child => child.tagName !== 'QD-PAGE-STEPPER');
28062
28276
  toRemove.forEach(el => {
28063
28277
  this.renderer.removeChild(host, el);
28064
- console.warn('QD-UI | QdPageStepperAdapterDirective Only "qd-page-stepper" is supported. The following content is not rendered:', el);
28278
+ console.warn('Quadrel Framework | QdPageStepperAdapter - Only "qd-page-stepper" is supported. The following content is not rendered:', el);
28065
28279
  });
28066
28280
  }
28067
28281
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageStepperAdapterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -28211,7 +28425,7 @@ class QdPageStepperComponent extends CdkStepper {
28211
28425
  ngOnInit() {
28212
28426
  this.linear = true;
28213
28427
  if (this.footerService && (this.config?.submit || this.config?.cancel)) {
28214
- throw new Error('QD-UI | QdPageStepperComponent - When using the Page Stepper in QdPage, don\'t use the "submit" and "cancel" attributes. Instead, use the QdPage configuration.');
28428
+ throw new Error('Quadrel Framework | QdPageStepper - When using <qd-page-stepper> inside <qd-page>, don\'t use the "submit" and "cancel" attributes. Instead, use the QdPageConfig.');
28215
28429
  }
28216
28430
  if (this.footerService) {
28217
28431
  this.selectedIndexChange.pipe(takeUntil(this._destroyed$)).subscribe(() => this.updateFooterActionsVisibility());
@@ -28417,7 +28631,7 @@ class QdPageStepperComponent extends CdkStepper {
28417
28631
  .subscribe(isValid => this.footerService.updateActions([{ actionKey: 'submit', partialAction: { isDisabled: !isValid } }]));
28418
28632
  }
28419
28633
  blockCdkInput(inputName) {
28420
- throw new Error(`QD-UI | QdPageStepperComponent - The ${inputName} attribute is not allowed. Please use QdPageStepperConfig instead.`);
28634
+ throw new Error(`Quadrel Framework | QdPageStepper - The "${inputName}" attribute is not allowed. Please use QdPageStepperConfig instead.`);
28421
28635
  }
28422
28636
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageStepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
28423
28637
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageStepperComponent, isStandalone: true, selector: "qd-page-stepper", inputs: { config: "config", testId: ["data-test-id", "testId"] }, outputs: { submitted: "submitted" }, host: { properties: { "class.standalone": "!footerService" }, classAttribute: "qd-stepper" }, providers: [{ provide: CdkStepper, useExisting: QdPageStepperComponent }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"qd-stepper-items-container\" *ngIf=\"steps.length > 1\">\n <qd-page-step-header\n *ngFor=\"let step of steps; let i = index\"\n (click)=\"handleClickHeader(step, i)\"\n [id]=\"_getStepLabelId(i)\"\n [ngClass]=\"'qd-step'\"\n [index]=\"i\"\n [state]=\"_getIndicatorType(i, step.state)\"\n [label]=\"step.config.label.i18n | translate\"\n [selected]=\"selectedIndex === i\"\n [active]=\"step.completed || selectedIndex === i || !linear\"\n [optional]=\"step.optional\"\n [locked]=\"!step.editable && i < selectedIndex\"\n >\n </qd-page-step-header>\n</div>\n\n<div class=\"stepper-content\">\n <ng-container [ngTemplateOutlet]=\"selected?.content\"></ng-container>\n</div>\n\n<div class=\"qd-stepper-action-area\" *ngIf=\"!footerService\">\n <button qdButton qdButtonGhost (click)=\"cancel()\" [data-test-id]=\"testId + '-cancel'\">\n {{ config?.cancel?.i18n || \"i18n.qd.stepper.cancel\" | translate }}\n </button>\n\n <button\n *ngIf=\"showPreviousButton(selectedIndex)\"\n qdButton\n qdButtonGhost\n (click)=\"previousStep()\"\n [data-test-id]=\"testId + '-previous'\"\n >\n {{ config?.previous?.i18n || \"i18n.qd.stepper.previous\" | translate }}\n </button>\n\n <button\n *ngIf=\"showNextButton(selectedIndex)\"\n qdButton\n [disabled]=\"(selectedStepValid$ | async) === false\"\n (click)=\"nextStep()\"\n [data-test-id]=\"testId + '-next'\"\n >\n {{ config?.next?.i18n || \"i18n.qd.stepper.next\" | translate }}\n </button>\n\n <button\n *ngIf=\"showSubmitButton(selectedIndex)\"\n qdButton\n (click)=\"submit()\"\n [disabled]=\"(allStepsValid$ | async) === false\"\n [data-test-id]=\"testId + '-submit'\"\n >\n {{ config?.submit?.i18n || \"i18n.qd.stepper.submit\" | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host.standalone{height:calc(100% - 50px)}:host .qd-stepper-items-container{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;padding:0 1.25rem;border-bottom:.125rem solid rgb(213,213,213);background-color:#fff;gap:0 .625rem}@media (max-width: 599.98px){:host .qd-stepper-items-container{padding:0 .9375rem}}:host .stepper-content{flex:1 1 auto}:host .qd-stepper-action-area{display:flex;width:100%;height:3.125rem;justify-content:flex-end}:host .qd-stepper-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: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: QdPageStepHeaderComponent, selector: "qd-page-step-header", inputs: ["state", "label", "index", "selected", "active", "optional", "locked"] }, { 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: "directive", type: QdButtonGhostDirective, selector: "button[qdButtonGhost], a[qdButtonGhost]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -28492,7 +28706,7 @@ class QdPageTabsAdapterDirective {
28492
28706
  const toRemove = Array.from(host.children).filter(child => child.tagName !== 'QD-PAGE-TABS');
28493
28707
  toRemove.forEach(el => {
28494
28708
  this.renderer.removeChild(host, el);
28495
- console.warn('QD-UI | QdPageTabsAdapterDirective Only "qd-page-tabs" is supported. The following content is not rendered:', el);
28709
+ console.warn('Quadrel Framework | QdPageTabsAdapter - Only "qd-page-tabs" is supported. The following content is not rendered:', el);
28496
28710
  });
28497
28711
  }
28498
28712
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabsAdapterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -28841,7 +29055,7 @@ class QdPageTabsComponent extends CdkStepper {
28841
29055
  pageTab.select();
28842
29056
  }
28843
29057
  else {
28844
- console.warn('QD-UI | QdPageTabsComponent - No tab found with name ' + tabNameFromParams);
29058
+ console.warn('Quadrel Framework | QdPageTabs - No tab found with name "' + tabNameFromParams + '".');
28845
29059
  this.selectFirstNotDisabledTab(true);
28846
29060
  }
28847
29061
  });
@@ -28865,7 +29079,7 @@ class QdPageTabsComponent extends CdkStepper {
28865
29079
  });
28866
29080
  }
28867
29081
  else {
28868
- console.warn('QD-UI | QdPageTabsComponent - connectedWithRouter is active, however QdPageTab has no name attribute.');
29082
+ console.warn('Quadrel Framework | QdPageTabs - "connectedWithRouter" is active, however <qd-page-tab> has no "name" attribute.');
28869
29083
  }
28870
29084
  }
28871
29085
  });
@@ -28929,7 +29143,7 @@ class QdPageTabsComponent extends CdkStepper {
28929
29143
  return this._getStepLabelId(i);
28930
29144
  }
28931
29145
  blockCdkInput(inputName) {
28932
- throw new Error(`QD-UI | QdPageTabsComponent - The use of the ${inputName} attribute is not permitted. Please use QdPageTabsConfig instead.`);
29146
+ throw new Error(`Quadrel Framework | QdPageTabs - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabsConfig instead.`);
28933
29147
  }
28934
29148
  mapSelectionChangeToTabSelectionOutput() {
28935
29149
  this.selectionChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(selectionEvent => {
@@ -29495,7 +29709,7 @@ class QdPageComponent {
29495
29709
  infoBanners;
29496
29710
  footerHasContent$;
29497
29711
  isFooterVisible;
29498
- projectionGuardMessage = 'QD-UI | QdPage - This content is not supported. Please use QdSectionAdapterDirective for custom content projection.';
29712
+ projectionGuardMessage = 'Quadrel Framework | QdPage - This content is not supported. Please use the [qdSectionAdapter] directive for custom content projection.';
29499
29713
  _isInitialized = false;
29500
29714
  _destroyed$ = new Subject();
29501
29715
  _cancelSubmitValidation$ = new Subject();
@@ -29590,7 +29804,7 @@ class QdPageComponent {
29590
29804
  }
29591
29805
  checkConfigValidity() {
29592
29806
  if (!this.config)
29593
- console.warn('QdUi | QdPageComponent - To configure the page you should provide a valid config.');
29807
+ console.warn('Quadrel Framework | QdPage - To configure the page you should provide a valid config.');
29594
29808
  }
29595
29809
  setupCreatePageFooterActions() {
29596
29810
  const pageTypeConfig = this.config?.pageTypeConfig;
@@ -29836,15 +30050,15 @@ class QdConnectFormStateToPageDirective {
29836
30050
  isValid() {
29837
30051
  const hasFormGroup = this.formGroupDirective?.control;
29838
30052
  if (!hasFormGroup) {
29839
- console.error('QD-UI | QdConnectFormStateToPageDirective - Either FormGroupDirective or QdQuickEditComponent with a FormGroup is required.');
30053
+ console.error('Quadrel Framework | QdConnectFormStateToPage - Either a [formGroup] binding or <qd-quick-edit> with a FormGroup is required.');
29840
30054
  return false;
29841
30055
  }
29842
30056
  if (!this.formGroupManagerService) {
29843
- console.error('QD-UI | QdConnectFormStateToPageDirective - The Connector must be used within a QdPage component.');
30057
+ console.error('Quadrel Framework | QdConnectFormStateToPage - The connector must be used within <qd-page>.');
29844
30058
  return false;
29845
30059
  }
29846
30060
  if (!this.formGroupManagerService.isFormGroupKeyUnique(this.qdConnectFormStateToPage)) {
29847
- console.error(`QD-UI | QdConnectFormStateToPageDirective - The FormGroup key "${this.qdConnectFormStateToPage}" is not unique.`);
30061
+ console.error(`Quadrel Framework | QdConnectFormStateToPage - The FormGroup key "${this.qdConnectFormStateToPage}" is not unique.`);
29848
30062
  return false;
29849
30063
  }
29850
30064
  return true;
@@ -30844,6 +31058,7 @@ class QdShellServiceNavigationComponent {
30844
31058
  _config;
30845
31059
  _destroyed$ = new Subject();
30846
31060
  _attributesHaveBeenSet$ = new ReplaySubject(1);
31061
+ localeService = inject(QdLocaleService);
30847
31062
  ngOnInit() {
30848
31063
  loadJavascriptAsset(this.config?.javascriptAssetPath ?? DEFAULT_JAVASCRIPT_ASSET_PATH$1, {
30849
31064
  defer: '',
@@ -30858,9 +31073,7 @@ class QdShellServiceNavigationComponent {
30858
31073
  this.logPamsEnvironmentMissingError();
30859
31074
  }
30860
31075
  logPamsEnvironmentMissingError() {
30861
- console.error('QdShellServiceNavigationComponent - The service navigation could not be rendered because the ' +
30862
- 'pamsEnvrionment is missing. The pamsEnvironment has to be given in the shell service navigation config or ' +
30863
- 'has to be provided in the backend auth config!');
31076
+ console.error('Quadrel Framework | QdShell - Config key "pamsEnvironment" is required to render <qd-shell-service-navigation>. Provide it in the service-navigation config or via the backend auth config.');
30864
31077
  }
30865
31078
  setLanguageFromUrlAfterNavigation() {
30866
31079
  this.languageFromUrlService
@@ -30888,6 +31101,7 @@ class QdShellServiceNavigationComponent {
30888
31101
  this._destroyed$.complete();
30889
31102
  }
30890
31103
  handleLanguageChange($event) {
31104
+ this.localeService.setServiceNavigationLanguage($event.detail);
30891
31105
  this.useLanguage($event.detail);
30892
31106
  }
30893
31107
  handleLoginStatusChange($event) {
@@ -31406,7 +31620,7 @@ class QdShellHeaderComponent {
31406
31620
  }
31407
31621
  validateTitle() {
31408
31622
  if (this.config.title && typeof this.config.title === 'string') {
31409
- console.warn('QdUi | QdShellComponent - Title of type string is deprecated and will be removed in the next major release. Please Use the i18n key instead!');
31623
+ console.warn('Quadrel Framework | QdShell - "title" as a plain string is deprecated and will be removed in the next major release. Please use an i18n key instead.');
31410
31624
  }
31411
31625
  }
31412
31626
  async = async;
@@ -31442,7 +31656,7 @@ class QdShellNavigationLinkComponent {
31442
31656
  config;
31443
31657
  handleClick() {
31444
31658
  if (!this.config.handler) {
31445
- console.error('QD-UI | QdShell - Please provide a handler function for the navigation element!');
31659
+ console.error('Quadrel Framework | QdShell - Please provide a handler function for the navigation element.');
31446
31660
  return;
31447
31661
  }
31448
31662
  if (this.config.handler && !this.config.isCurrent)
@@ -31955,7 +32169,7 @@ class QdShellComponent {
31955
32169
  ngAfterViewInit() {
31956
32170
  // TODO: Remove in v17! The comments will be integrated in the QdPage.
31957
32171
  if (this.commentsComponent.length > 0)
31958
- console.warn('QD-UI | QdShell - Comments in the QdShell is deprecated and will be removed in v17. Will be part of QdPage.');
32172
+ console.warn('Quadrel Framework | QdShell - Using comments inside <qd-shell> is deprecated and will be removed in v17. Use <qd-page> instead.');
31959
32173
  this.closeShellRightIfCommentsDisappear();
31960
32174
  }
31961
32175
  closeShellRightIfCommentsDisappear() {
@@ -32464,11 +32678,11 @@ class QdPageStepComponent extends CdkStep {
32464
32678
  this._destroyed$.complete();
32465
32679
  }
32466
32680
  blockCdkInput(inputName) {
32467
- throw new Error(`QD-UI | QdPageStepComponent - The use of the ${inputName} attribute is not permitted. Please use QdPageStepConfig instead.`);
32681
+ throw new Error(`Quadrel Framework | QdPageStep - The use of the "${inputName}" attribute is not permitted. Please use QdPageStepConfig instead.`);
32468
32682
  }
32469
32683
  validateLabel() {
32470
32684
  if (!this.config?.label?.i18n)
32471
- console.error('QD-UI | QdPageStepComponent - Please provide a label for the step.');
32685
+ console.error('Quadrel Framework | QdPageStep - Please provide a label for the step.');
32472
32686
  }
32473
32687
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32474
32688
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdPageStepComponent, isStandalone: true, selector: "qd-page-step", inputs: { config: "config", control: "control" }, host: { classAttribute: "qd-stepper" }, providers: [
@@ -32574,11 +32788,11 @@ class QdPageTabComponent extends CdkStep {
32574
32788
  this._destroyed$.complete();
32575
32789
  }
32576
32790
  blockCdkInput(inputName) {
32577
- throw new Error(`QD-UI | QdPageTabComponent - The use of the ${inputName} attribute is not permitted. Please use QdPageTabConfig instead.`);
32791
+ throw new Error(`Quadrel Framework | QdPageTab - The use of the "${inputName}" attribute is not permitted. Please use QdPageTabConfig instead.`);
32578
32792
  }
32579
32793
  validateLabel() {
32580
32794
  if (!this.config?.label?.i18n)
32581
- console.error('QD-UI | QdPageTabComponent - Please provide a label for the tab.');
32795
+ console.error('Quadrel Framework | QdPageTab - Please provide a label for the tab.');
32582
32796
  }
32583
32797
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdPageTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32584
32798
  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: [
@@ -33026,11 +33240,11 @@ class QdQuickEditComponent {
33026
33240
  }
33027
33241
  validateSetup() {
33028
33242
  if (this.data != null && this.controlContainer != null)
33029
- console.warn('QdQuickEdit | Data is being ignored when used as FormArray');
33243
+ console.warn('Quadrel Framework | QdQuickEdit - Data is being ignored when used as FormArray.');
33030
33244
  if (!this.data && !this.controlContainer)
33031
- console.warn('QdQuickEdit | Either use QuickEdit as FormControl with formArrayName binding or provide data via input.');
33245
+ console.warn('Quadrel Framework | QdQuickEdit - Either use <qd-quick-edit> as a FormControl with formArrayName binding or provide data via input.');
33032
33246
  if (this.controlContainer && this.config.columns.some(column => column.validators != null))
33033
- console.warn('QdQuickEdit | Please provide validators in the specific FormControls directly for default validators to be added.');
33247
+ console.warn('Quadrel Framework | QdQuickEdit - Please provide validators in the specific FormControls directly for default validators to be added.');
33034
33248
  }
33035
33249
  redrawOnNextChange() {
33036
33250
  this.togglerDrawing = !this.togglerDrawing;
@@ -33283,5 +33497,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
33283
33497
  * Generated bundle index. Do not edit.
33284
33498
  */
33285
33499
 
33286
- 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, 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, 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, QdRwdDisabledDirective, QdSearchComponent, QdSearchModule, 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, updateHtmlLang };
33500
+ 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, 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, QdRwdDisabledDirective, QdSearchComponent, QdSearchModule, 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, updateHtmlLang };
33287
33501
  //# sourceMappingURL=quadrel-enterprise-ui-framework.mjs.map