@quadrel-enterprise-ui/framework 20.28.0 → 20.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ import { inject, ElementRef, Directive, InjectionToken, HostBinding, Input, View
3
3
  import { Dialog, DialogRef, DIALOG_DATA, DialogModule } from '@angular/cdk/dialog';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule, DOCUMENT, NgFor, NgIf, NgClass, NgTemplateOutlet, AsyncPipe } from '@angular/common';
6
- import { BehaviorSubject, pairwise, map as map$1, Subject, throwError, of, ReplaySubject, merge, fromEvent, isObservable, NEVER, Observable, EMPTY, shareReplay, Subscription, distinctUntilChanged as distinctUntilChanged$1, debounce, timer, switchMap, startWith as startWith$1, debounceTime as debounceTime$1, takeUntil as takeUntil$1, firstValueFrom, combineLatest, concat, take as take$1, tap as tap$1, from, delay, first, scan, queueScheduler, filter as filter$1, concatMap as concatMap$1, exhaustMap, finalize, forkJoin, delayWhen, combineLatestWith, withLatestFrom as withLatestFrom$1, async } from 'rxjs';
6
+ import { BehaviorSubject, pairwise, map as map$1, Subject, throwError, of, ReplaySubject, merge, fromEvent, isObservable, NEVER, Observable, EMPTY, shareReplay, Subscription, distinctUntilChanged as distinctUntilChanged$1, debounce, timer, switchMap, startWith as startWith$1, debounceTime as debounceTime$1, takeUntil as takeUntil$1, firstValueFrom, combineLatest, concat, take as take$1, tap as tap$1, from, delay, first, defer, scan, queueScheduler, filter as filter$1, concatMap as concatMap$1, exhaustMap, finalize, forkJoin, delayWhen, combineLatestWith, withLatestFrom as withLatestFrom$1, async } from 'rxjs';
7
7
  import { map, takeUntil, take, filter, catchError, debounceTime, startWith, distinctUntilChanged, concatMap, skip, tap, auditTime, withLatestFrom, observeOn, switchMap as switchMap$1, pairwise as pairwise$1, mergeMap, delay as delay$1 } from 'rxjs/operators';
8
8
  import { v4 } from 'uuid';
9
9
  import * as i3 from '@ngx-translate/core';
@@ -6142,11 +6142,11 @@ class QdDataFacetsChipComponent {
6142
6142
  }));
6143
6143
  }
6144
6144
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdDataFacetsChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6145
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdDataFacetsChipComponent, isStandalone: false, selector: "qd-data-facets-chip", inputs: { config: "config", data: "data", i18n: "i18n", testId: "testId" }, host: { properties: { "attr.data-test-id": "testId" }, classAttribute: "qd-data-facets" }, usesOnChanges: true, ngImport: i0, template: "<qd-chip *ngFor=\"let chip of chips$ | async\" [state]=\"chip.level\">\n {{ config?.isTranslated ? (i18n + \".\" + chip.label | translate) : chip.label }}\n</qd-chip>\n\n<ng-container *ngIf=\"truncatedChips$ | async as truncatedChips\">\n <qd-data-facets-chip-truncated-indicator\n *ngIf=\"truncatedChips.length > 0\"\n [truncatedChips]=\"truncatedChips\"\n ></qd-data-facets-chip-truncated-indicator>\n</ng-container>\n", styles: [":host{line-height:normal}qd-chip{margin-right:.5625rem;margin-bottom:.125rem}qd-truncated-chips-indicator,qd-chip:last-child{margin-right:0;margin-bottom:.5625rem}span:host{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5625rem}span:host qd-truncated-chips-indicator,span:host qd-chip{margin:0}span:host qd-truncated-chips-indicator:last-child,span:host qd-chip:last-child{margin-bottom:.5625rem}\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: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdDataFacetsChipTruncatedIndicatorComponent, selector: "qd-data-facets-chip-truncated-indicator", inputs: ["truncatedChips", "i18n", "columnOptions"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6145
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdDataFacetsChipComponent, isStandalone: false, selector: "qd-data-facets-chip", inputs: { config: "config", data: "data", i18n: "i18n", testId: "testId" }, host: { properties: { "attr.data-test-id": "testId" }, classAttribute: "qd-data-facets" }, usesOnChanges: true, ngImport: i0, template: "<qd-chip *ngFor=\"let chip of chips$ | async\" [state]=\"chip.level\">\n {{ config?.isTranslated ? (i18n + \".\" + chip.label | translate) : chip.label }}\n</qd-chip>\n\n<ng-container *ngIf=\"truncatedChips$ | async as truncatedChips\">\n <qd-data-facets-chip-truncated-indicator\n *ngIf=\"truncatedChips.length > 0\"\n [truncatedChips]=\"truncatedChips\"\n [i18n]=\"i18n\"\n [columnOptions]=\"config\"\n ></qd-data-facets-chip-truncated-indicator>\n</ng-container>\n", styles: [":host{line-height:normal}qd-chip{margin-right:.5625rem;margin-bottom:.125rem}qd-truncated-chips-indicator,qd-chip:last-child{margin-right:0;margin-bottom:.5625rem}span:host{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5625rem}span:host qd-truncated-chips-indicator,span:host qd-chip{margin:0}span:host qd-truncated-chips-indicator:last-child,span:host qd-chip:last-child{margin-bottom:.5625rem}\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: QdChipComponent, selector: "qd-chip", inputs: ["state", "close", "data", "data-test-id"], outputs: ["closeClickEmitter"] }, { kind: "component", type: QdDataFacetsChipTruncatedIndicatorComponent, selector: "qd-data-facets-chip-truncated-indicator", inputs: ["truncatedChips", "i18n", "columnOptions"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6146
6146
  }
6147
6147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdDataFacetsChipComponent, decorators: [{
6148
6148
  type: Component,
6149
- args: [{ selector: 'qd-data-facets-chip', host: { class: 'qd-data-facets', '[attr.data-test-id]': 'testId' }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<qd-chip *ngFor=\"let chip of chips$ | async\" [state]=\"chip.level\">\n {{ config?.isTranslated ? (i18n + \".\" + chip.label | translate) : chip.label }}\n</qd-chip>\n\n<ng-container *ngIf=\"truncatedChips$ | async as truncatedChips\">\n <qd-data-facets-chip-truncated-indicator\n *ngIf=\"truncatedChips.length > 0\"\n [truncatedChips]=\"truncatedChips\"\n ></qd-data-facets-chip-truncated-indicator>\n</ng-container>\n", styles: [":host{line-height:normal}qd-chip{margin-right:.5625rem;margin-bottom:.125rem}qd-truncated-chips-indicator,qd-chip:last-child{margin-right:0;margin-bottom:.5625rem}span:host{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5625rem}span:host qd-truncated-chips-indicator,span:host qd-chip{margin:0}span:host qd-truncated-chips-indicator:last-child,span:host qd-chip:last-child{margin-bottom:.5625rem}\n"] }]
6149
+ args: [{ selector: 'qd-data-facets-chip', host: { class: 'qd-data-facets', '[attr.data-test-id]': 'testId' }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<qd-chip *ngFor=\"let chip of chips$ | async\" [state]=\"chip.level\">\n {{ config?.isTranslated ? (i18n + \".\" + chip.label | translate) : chip.label }}\n</qd-chip>\n\n<ng-container *ngIf=\"truncatedChips$ | async as truncatedChips\">\n <qd-data-facets-chip-truncated-indicator\n *ngIf=\"truncatedChips.length > 0\"\n [truncatedChips]=\"truncatedChips\"\n [i18n]=\"i18n\"\n [columnOptions]=\"config\"\n ></qd-data-facets-chip-truncated-indicator>\n</ng-container>\n", styles: [":host{line-height:normal}qd-chip{margin-right:.5625rem;margin-bottom:.125rem}qd-truncated-chips-indicator,qd-chip:last-child{margin-right:0;margin-bottom:.5625rem}span:host{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5625rem}span:host qd-truncated-chips-indicator,span:host qd-chip{margin:0}span:host qd-truncated-chips-indicator:last-child,span:host qd-chip:last-child{margin-bottom:.5625rem}\n"] }]
6150
6150
  }], propDecorators: { config: [{
6151
6151
  type: Input
6152
6152
  }], data: [{
@@ -24048,6 +24048,7 @@ var QdTableRequestState;
24048
24048
  (function (QdTableRequestState) {
24049
24049
  QdTableRequestState[QdTableRequestState["PENDING"] = 0] = "PENDING";
24050
24050
  QdTableRequestState[QdTableRequestState["SUCCESS"] = 1] = "SUCCESS";
24051
+ QdTableRequestState[QdTableRequestState["ERROR"] = 2] = "ERROR";
24051
24052
  })(QdTableRequestState || (QdTableRequestState = {}));
24052
24053
 
24053
24054
  function resolveRowIdentifier(row, rowIndex, trackRowBy) {
@@ -24558,15 +24559,7 @@ class QdTableResolverService {
24558
24559
  this.subscribeToLangChanges();
24559
24560
  this.tableStoreService
24560
24561
  .selectDataResolutionCriteria$()
24561
- .pipe(takeUntil(this._destroyed$), distinctUntilChanged(isEqual$1), filter((resolutionCriteria) => !!resolutionCriteria && this.shouldDataBeResolved(resolutionCriteria)), map(({ tableParams, connectorParams }) => {
24562
- return {
24563
- ...(this._hasPagination ? tableParams : {}),
24564
- ...connectorParams
24565
- };
24566
- }), tap(() => this.tableStoreService.setRequestState(QdTableRequestState.PENDING)), switchMap(resolutionParams => resolver.resolve(resolutionParams)), tap(result => this.handleResolverResult(result)), filter(() => !this._isNavigatingToValidPage), tap(() => this.tableStoreService.setRequestState(QdTableRequestState.SUCCESS)), catchError(() => {
24567
- this._isNavigatingToValidPage = false;
24568
- return EMPTY;
24569
- }))
24562
+ .pipe(takeUntil(this._destroyed$), distinctUntilChanged(isEqual$1), filter((resolutionCriteria) => !!resolutionCriteria && this.shouldDataBeResolved(resolutionCriteria)), map(resolutionCriteria => this.buildCriteriaParams(resolutionCriteria)), switchMap(resolutionParams => this.resolveAndApply(resolver, resolutionParams)))
24570
24563
  .subscribe();
24571
24564
  }
24572
24565
  refresh(resolverOptions = {}) {
@@ -24574,18 +24567,10 @@ class QdTableResolverService {
24574
24567
  if (!resolver)
24575
24568
  return console.warn('Quadrel Framework | QdTable - Refresh skipped: resolver not provided.');
24576
24569
  const { pageIndex } = resolverOptions;
24577
- if (this._refreshSubscription)
24578
- this._refreshSubscription.unsubscribe();
24570
+ this._refreshSubscription?.unsubscribe();
24579
24571
  this._refreshSubscription = this.tableStoreService
24580
24572
  .selectDataResolutionCriteria$()
24581
- .pipe(filter((criteria) => !!criteria), first(), tap(() => this.tableStoreService.setRequestState(QdTableRequestState.PENDING)), switchMap(resolutionCriteria => resolver.resolve({
24582
- ...resolutionCriteria.tableParams,
24583
- ...resolutionCriteria.connectorParams,
24584
- ...(this._hasPagination && pageIndex !== undefined ? { page: pageIndex } : {})
24585
- })), tap(result => this.handleResolverResult(result)), filter(() => !this._isNavigatingToValidPage), tap(() => this.tableStoreService.setRequestState(QdTableRequestState.SUCCESS)), catchError(() => {
24586
- this._isNavigatingToValidPage = false;
24587
- return EMPTY;
24588
- }))
24573
+ .pipe(filter((criteria) => !!criteria), first(), switchMap(resolutionCriteria => this.resolveAndApply(resolver, this.buildRefreshParams(resolutionCriteria, pageIndex))), takeUntil(this._destroyed$))
24589
24574
  .subscribe();
24590
24575
  }
24591
24576
  subscribeToLangChanges() {
@@ -24603,16 +24588,35 @@ class QdTableResolverService {
24603
24588
  .pipe(takeUntil(this._destroyed$))
24604
24589
  .subscribe(pageIndex => this.refresh({ pageIndex }));
24605
24590
  }
24591
+ buildCriteriaParams({ tableParams, connectorParams }) {
24592
+ return {
24593
+ ...(this._hasPagination ? tableParams : {}),
24594
+ ...connectorParams
24595
+ };
24596
+ }
24597
+ buildRefreshParams(criteria, pageIndex) {
24598
+ return {
24599
+ ...criteria.tableParams,
24600
+ ...criteria.connectorParams,
24601
+ ...(this._hasPagination && pageIndex !== undefined ? { page: pageIndex } : {})
24602
+ };
24603
+ }
24604
+ resolveAndApply(resolver, params) {
24605
+ return defer(() => {
24606
+ this.tableStoreService.setRequestState(QdTableRequestState.PENDING);
24607
+ return resolver.resolve(params);
24608
+ }).pipe(tap(result => this.handleResolverResult(result)), filter(() => !this._isNavigatingToValidPage), tap(() => this.tableStoreService.setRequestState(QdTableRequestState.SUCCESS)), catchError(() => this.recoverFromFailedRequest()));
24609
+ }
24610
+ recoverFromFailedRequest() {
24611
+ this._isNavigatingToValidPage = false;
24612
+ this.tableStoreService.setRequestState(QdTableRequestState.ERROR);
24613
+ return EMPTY;
24614
+ }
24606
24615
  handleResolverResult(result) {
24616
+ if (!result?.data)
24617
+ throw new Error('Quadrel Framework | QdTable - Resolver result has no data.');
24607
24618
  const { page, data, size, totalElements } = result;
24608
- // Check if current page is empty but there are still entries (deleted last item on page)
24609
- if (this._hasPagination &&
24610
- !this._isNavigatingToValidPage &&
24611
- data.length === 0 &&
24612
- totalElements > 0 &&
24613
- page !== undefined &&
24614
- page > 0) {
24615
- // Calculate last valid page index
24619
+ if (this.isOnEmptyPageWithRemainingEntries(result)) {
24616
24620
  const lastValidPage = Math.ceil(totalElements / size) - 1;
24617
24621
  this._isNavigatingToValidPage = true;
24618
24622
  this.refresh({ pageIndex: lastValidPage });
@@ -24621,6 +24625,14 @@ class QdTableResolverService {
24621
24625
  this._isNavigatingToValidPage = false;
24622
24626
  this.tableStoreService.setPage(page ?? 0, size, totalElements, data);
24623
24627
  }
24628
+ isOnEmptyPageWithRemainingEntries(result) {
24629
+ if (!this._hasPagination || this._isNavigatingToValidPage)
24630
+ return false;
24631
+ return this.isEmptyPageBeyondFirst(result);
24632
+ }
24633
+ isEmptyPageBeyondFirst({ page, data, totalElements }) {
24634
+ return data.length === 0 && totalElements > 0 && page !== undefined && page > 0;
24635
+ }
24624
24636
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTableResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
24625
24637
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTableResolverService });
24626
24638
  }
@@ -25012,7 +25024,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
25012
25024
  }]
25013
25025
  }] });
25014
25026
 
25015
- // @ts-strict-ignore
25016
25027
  /**
25017
25028
  * The `QdScrollToPaginationDirective` directive makes it possible to scroll to the pagination section of a table when changing pages. It synchronizes with the page change events of the table and triggers scrolling when it is necessary to keep the pagination section accessible to the user.
25018
25029
  *
@@ -25032,6 +25043,7 @@ class QdScrollToPaginationDirective {
25032
25043
  .subscribe();
25033
25044
  }
25034
25045
  ngOnDestroy() {
25046
+ this._destroyed$.next(null);
25035
25047
  this._destroyed$.complete();
25036
25048
  }
25037
25049
  getScrollBottom() {
@@ -25076,7 +25088,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
25076
25088
  }]
25077
25089
  }] });
25078
25090
 
25079
- // @ts-strict-ignore
25080
25091
  /**
25081
25092
  * A directive that allows the paginator to set the page size of a table paginator. Also writes the result to the store.
25082
25093
  *
@@ -25096,6 +25107,7 @@ class QdTablePaginatorPageSizeDirective {
25096
25107
  }
25097
25108
  }
25098
25109
  ngOnDestroy() {
25110
+ this._destroyed$.next(null);
25099
25111
  this._destroyed$.complete();
25100
25112
  }
25101
25113
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTablePaginatorPageSizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -25742,7 +25754,9 @@ class QdTableBodyComponent {
25742
25754
  if (!this.config.primaryAction?.refresh?.isEnabled)
25743
25755
  return;
25744
25756
  if (result instanceof Observable) {
25745
- this._primaryActionRefreshSubscription = result.subscribe(success => success && this.triggerRefresh());
25757
+ this._primaryActionRefreshSubscription = result
25758
+ .pipe(take(1))
25759
+ .subscribe(success => success && this.triggerRefresh());
25746
25760
  return;
25747
25761
  }
25748
25762
  this.triggerRefresh();
@@ -25764,11 +25778,11 @@ class QdTableBodyComponent {
25764
25778
  this.resolverService.refresh(pageIndex !== undefined ? { pageIndex } : undefined);
25765
25779
  }
25766
25780
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTableBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
25767
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdTableBodyComponent, isStandalone: false, selector: "[qd-table-body]", inputs: { config: "config", data: "data", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-table__body qd-table__body--plain" }, ngImport: i0, template: "<div class=\"loading-overlay\" *ngIf=\"isLoading$ | async\">\n <qd-spinner></qd-spinner>\n</div>\n<ng-container *ngFor=\"let rowData of data; index as rowIndex; trackBy: trackByRowIdentifier\">\n <tr\n qd-table-row\n [rowData]=\"rowData\"\n [rowIndex]=\"rowIndex\"\n [config]=\"config\"\n [class]=\"'qd-table__body-row'\"\n [data-test-id]=\"testId + '-row-' + rowIndex\"\n (click)=\"config.primaryAction && primaryAction(rowData, rowIndex)\"\n [class.hasAction]=\"config.primaryAction\"\n [class.qd-table__body-row--last-visited]=\"isLastVisitedRow(rowData, rowIndex)\"\n ></tr>\n</ng-container>\n", styles: [".qd-table__body--plain{position:relative}.qd-table__body--plain td{border-bottom:.0625rem solid rgb(213,213,213)}.qd-table__body--plain td.qd-table__body-cell--selection{padding-left:1rem;vertical-align:top}.qd-table__body--plain td>div{display:flex;align-items:stretch;line-height:1.5rem}.qd-table__body--plain td>div:first-child{font-weight:500;line-height:1.5rem}.qd-table__body--plain td>div:not(:first-child) .qd-table__body-cell{padding:0 .5rem}.qd-table__body--plain td.qd-table__body-cell--merged{padding:.5rem 0;vertical-align:top}.qd-table__body--plain td .qd-table__body-cell--merged-headings{width:33%;padding-left:1rem;color:#757575;overflow-wrap:break-word}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell{width:66%}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell>*{overflow-wrap:break-word;text-align:left}@media (max-width: 959.98px){.qd-table__body--plain td.qd-table__body-cell--merged{display:grid;max-width:100%;grid-template-columns:fit-content(66%) 1fr}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child{display:block;font-weight:500;grid-column:1/-1;line-height:1.5rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child>span.qd-table__body-cell{display:block;width:auto;padding-left:1rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child){display:grid;grid-column:1/-1;grid-template-columns:subgrid}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell--merged-headings{display:block;overflow:hidden;width:auto;min-width:0;padding-right:0;padding-left:1rem;color:#757575;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell{display:block;overflow:hidden;width:auto;min-width:0;padding:0 .5rem;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell>*{display:block;overflow:hidden;-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}}.qd-table__body--plain td span.qd-table__body-cell--boolean{display:flex;align-items:center}.qd-table__body--plain td span.qd-table__body-cell--progress{flex-grow:1;align-self:center;padding-top:0}.qd-table__body--plain td span.qd-table__body-cell--status{margin-top:-.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text{min-height:auto;padding-top:0;line-height:1.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text+.text{margin-top:.1875rem}.qd-table__body--plain tr:hover{background-color:#f5f5f5}.qd-table__body--plain tr.hasAction{cursor:pointer}.qd-table__body--plain tr.hasAction:hover{background-color:#f2f7fa}.qd-table__body--plain tr.qd-table__body-row--last-visited{animation:last-visited-fade 1.5s linear}@keyframes last-visited-fade{0%,33%{background-color:#c3e8cd}to{background-color:transparent}}.loading-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:#0003}\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: QdSpinnerComponent, selector: "qd-spinner" }, { kind: "component", type: QdTableRowComponent, selector: "[qd-table-row]", inputs: ["config", "rowData", "rowIndex", "data-test-id"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
25781
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: QdTableBodyComponent, isStandalone: false, selector: "[qd-table-body]", inputs: { config: "config", data: "data", testId: ["data-test-id", "testId"] }, host: { classAttribute: "qd-table__body qd-table__body--plain" }, ngImport: i0, template: "<div class=\"loading-overlay\" [attr.data-test-id]=\"testId + '-loading-overlay'\" *ngIf=\"isLoading$ | async\">\n <qd-spinner></qd-spinner>\n</div>\n<ng-container *ngFor=\"let rowData of data; index as rowIndex; trackBy: trackByRowIdentifier\">\n <tr\n qd-table-row\n [rowData]=\"rowData\"\n [rowIndex]=\"rowIndex\"\n [config]=\"config\"\n [class]=\"'qd-table__body-row'\"\n [data-test-id]=\"testId + '-row-' + rowIndex\"\n (click)=\"config.primaryAction && primaryAction(rowData, rowIndex)\"\n [class.hasAction]=\"config.primaryAction\"\n [class.qd-table__body-row--last-visited]=\"isLastVisitedRow(rowData, rowIndex)\"\n ></tr>\n</ng-container>\n", styles: [".qd-table__body--plain{position:relative}.qd-table__body--plain td{border-bottom:.0625rem solid rgb(213,213,213)}.qd-table__body--plain td.qd-table__body-cell--selection{padding-left:1rem;vertical-align:top}.qd-table__body--plain td>div{display:flex;align-items:stretch;line-height:1.5rem}.qd-table__body--plain td>div:first-child{font-weight:500;line-height:1.5rem}.qd-table__body--plain td>div:not(:first-child) .qd-table__body-cell{padding:0 .5rem}.qd-table__body--plain td.qd-table__body-cell--merged{padding:.5rem 0;vertical-align:top}.qd-table__body--plain td .qd-table__body-cell--merged-headings{width:33%;padding-left:1rem;color:#757575;overflow-wrap:break-word}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell{width:66%}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell>*{overflow-wrap:break-word;text-align:left}@media (max-width: 959.98px){.qd-table__body--plain td.qd-table__body-cell--merged{display:grid;max-width:100%;grid-template-columns:fit-content(66%) 1fr}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child{display:block;font-weight:500;grid-column:1/-1;line-height:1.5rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child>span.qd-table__body-cell{display:block;width:auto;padding-left:1rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child){display:grid;grid-column:1/-1;grid-template-columns:subgrid}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell--merged-headings{display:block;overflow:hidden;width:auto;min-width:0;padding-right:0;padding-left:1rem;color:#757575;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell{display:block;overflow:hidden;width:auto;min-width:0;padding:0 .5rem;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell>*{display:block;overflow:hidden;-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}}.qd-table__body--plain td span.qd-table__body-cell--boolean{display:flex;align-items:center}.qd-table__body--plain td span.qd-table__body-cell--progress{flex-grow:1;align-self:center;padding-top:0}.qd-table__body--plain td span.qd-table__body-cell--status{margin-top:-.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text{min-height:auto;padding-top:0;line-height:1.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text+.text{margin-top:.1875rem}.qd-table__body--plain tr:hover{background-color:#f5f5f5}.qd-table__body--plain tr.hasAction{cursor:pointer}.qd-table__body--plain tr.hasAction:hover{background-color:#f2f7fa}.qd-table__body--plain tr.qd-table__body-row--last-visited{animation:last-visited-fade 1.5s linear}@keyframes last-visited-fade{0%,33%{background-color:#c3e8cd}to{background-color:transparent}}.loading-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:#0003}\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: QdSpinnerComponent, selector: "qd-spinner" }, { kind: "component", type: QdTableRowComponent, selector: "[qd-table-row]", inputs: ["config", "rowData", "rowIndex", "data-test-id"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
25768
25782
  }
25769
25783
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: QdTableBodyComponent, decorators: [{
25770
25784
  type: Component,
25771
- args: [{ selector: '[qd-table-body]', host: { class: 'qd-table__body qd-table__body--plain' }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"loading-overlay\" *ngIf=\"isLoading$ | async\">\n <qd-spinner></qd-spinner>\n</div>\n<ng-container *ngFor=\"let rowData of data; index as rowIndex; trackBy: trackByRowIdentifier\">\n <tr\n qd-table-row\n [rowData]=\"rowData\"\n [rowIndex]=\"rowIndex\"\n [config]=\"config\"\n [class]=\"'qd-table__body-row'\"\n [data-test-id]=\"testId + '-row-' + rowIndex\"\n (click)=\"config.primaryAction && primaryAction(rowData, rowIndex)\"\n [class.hasAction]=\"config.primaryAction\"\n [class.qd-table__body-row--last-visited]=\"isLastVisitedRow(rowData, rowIndex)\"\n ></tr>\n</ng-container>\n", styles: [".qd-table__body--plain{position:relative}.qd-table__body--plain td{border-bottom:.0625rem solid rgb(213,213,213)}.qd-table__body--plain td.qd-table__body-cell--selection{padding-left:1rem;vertical-align:top}.qd-table__body--plain td>div{display:flex;align-items:stretch;line-height:1.5rem}.qd-table__body--plain td>div:first-child{font-weight:500;line-height:1.5rem}.qd-table__body--plain td>div:not(:first-child) .qd-table__body-cell{padding:0 .5rem}.qd-table__body--plain td.qd-table__body-cell--merged{padding:.5rem 0;vertical-align:top}.qd-table__body--plain td .qd-table__body-cell--merged-headings{width:33%;padding-left:1rem;color:#757575;overflow-wrap:break-word}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell{width:66%}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell>*{overflow-wrap:break-word;text-align:left}@media (max-width: 959.98px){.qd-table__body--plain td.qd-table__body-cell--merged{display:grid;max-width:100%;grid-template-columns:fit-content(66%) 1fr}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child{display:block;font-weight:500;grid-column:1/-1;line-height:1.5rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child>span.qd-table__body-cell{display:block;width:auto;padding-left:1rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child){display:grid;grid-column:1/-1;grid-template-columns:subgrid}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell--merged-headings{display:block;overflow:hidden;width:auto;min-width:0;padding-right:0;padding-left:1rem;color:#757575;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell{display:block;overflow:hidden;width:auto;min-width:0;padding:0 .5rem;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell>*{display:block;overflow:hidden;-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}}.qd-table__body--plain td span.qd-table__body-cell--boolean{display:flex;align-items:center}.qd-table__body--plain td span.qd-table__body-cell--progress{flex-grow:1;align-self:center;padding-top:0}.qd-table__body--plain td span.qd-table__body-cell--status{margin-top:-.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text{min-height:auto;padding-top:0;line-height:1.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text+.text{margin-top:.1875rem}.qd-table__body--plain tr:hover{background-color:#f5f5f5}.qd-table__body--plain tr.hasAction{cursor:pointer}.qd-table__body--plain tr.hasAction:hover{background-color:#f2f7fa}.qd-table__body--plain tr.qd-table__body-row--last-visited{animation:last-visited-fade 1.5s linear}@keyframes last-visited-fade{0%,33%{background-color:#c3e8cd}to{background-color:transparent}}.loading-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:#0003}\n"] }]
25785
+ args: [{ selector: '[qd-table-body]', host: { class: 'qd-table__body qd-table__body--plain' }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"loading-overlay\" [attr.data-test-id]=\"testId + '-loading-overlay'\" *ngIf=\"isLoading$ | async\">\n <qd-spinner></qd-spinner>\n</div>\n<ng-container *ngFor=\"let rowData of data; index as rowIndex; trackBy: trackByRowIdentifier\">\n <tr\n qd-table-row\n [rowData]=\"rowData\"\n [rowIndex]=\"rowIndex\"\n [config]=\"config\"\n [class]=\"'qd-table__body-row'\"\n [data-test-id]=\"testId + '-row-' + rowIndex\"\n (click)=\"config.primaryAction && primaryAction(rowData, rowIndex)\"\n [class.hasAction]=\"config.primaryAction\"\n [class.qd-table__body-row--last-visited]=\"isLastVisitedRow(rowData, rowIndex)\"\n ></tr>\n</ng-container>\n", styles: [".qd-table__body--plain{position:relative}.qd-table__body--plain td{border-bottom:.0625rem solid rgb(213,213,213)}.qd-table__body--plain td.qd-table__body-cell--selection{padding-left:1rem;vertical-align:top}.qd-table__body--plain td>div{display:flex;align-items:stretch;line-height:1.5rem}.qd-table__body--plain td>div:first-child{font-weight:500;line-height:1.5rem}.qd-table__body--plain td>div:not(:first-child) .qd-table__body-cell{padding:0 .5rem}.qd-table__body--plain td.qd-table__body-cell--merged{padding:.5rem 0;vertical-align:top}.qd-table__body--plain td .qd-table__body-cell--merged-headings{width:33%;padding-left:1rem;color:#757575;overflow-wrap:break-word}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell{width:66%}.qd-table__body--plain td .qd-table__body-cell--merged-headings+.qd-table__body-cell>*{overflow-wrap:break-word;text-align:left}@media (max-width: 959.98px){.qd-table__body--plain td.qd-table__body-cell--merged{display:grid;max-width:100%;grid-template-columns:fit-content(66%) 1fr}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child{display:block;font-weight:500;grid-column:1/-1;line-height:1.5rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:first-child>span.qd-table__body-cell{display:block;width:auto;padding-left:1rem}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child){display:grid;grid-column:1/-1;grid-template-columns:subgrid}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell--merged-headings{display:block;overflow:hidden;width:auto;min-width:0;padding-right:0;padding-left:1rem;color:#757575;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell{display:block;overflow:hidden;width:auto;min-width:0;padding:0 .5rem;-webkit-hyphens:auto;hyphens:auto;line-height:1.5rem;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}.qd-table__body--plain td.qd-table__body-cell--merged>div:not(:first-child)>span.qd-table__body-cell>*{display:block;overflow:hidden;-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word;text-align:left;text-overflow:ellipsis}}.qd-table__body--plain td span.qd-table__body-cell--boolean{display:flex;align-items:center}.qd-table__body--plain td span.qd-table__body-cell--progress{flex-grow:1;align-self:center;padding-top:0}.qd-table__body--plain td span.qd-table__body-cell--status{margin-top:-.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text{min-height:auto;padding-top:0;line-height:1.5rem}.qd-table__body--plain td span.qd-table__body-cell--text .text+.text{margin-top:.1875rem}.qd-table__body--plain tr:hover{background-color:#f5f5f5}.qd-table__body--plain tr.hasAction{cursor:pointer}.qd-table__body--plain tr.hasAction:hover{background-color:#f2f7fa}.qd-table__body--plain tr.qd-table__body-row--last-visited{animation:last-visited-fade 1.5s linear}@keyframes last-visited-fade{0%,33%{background-color:#c3e8cd}to{background-color:transparent}}.loading-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:#0003}\n"] }]
25772
25786
  }], ctorParameters: () => [], propDecorators: { config: [{
25773
25787
  type: Input
25774
25788
  }], data: [{
@@ -26748,6 +26762,7 @@ class QdConnectorTableSearchDirective {
26748
26762
  this.subscribeToSearchChanges();
26749
26763
  }
26750
26764
  ngOnDestroy() {
26765
+ this._destroy$.next();
26751
26766
  this._destroy$.complete();
26752
26767
  }
26753
26768
  setSearchComponent() {