@firestitch/list 18.0.13 → 18.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,9 +9,12 @@ export declare class FsStatusComponent implements OnInit, OnDestroy {
9
9
  rows: any;
10
10
  firstLoad: boolean;
11
11
  PaginationStrategy: typeof PaginationStrategy;
12
- manyLabel: string;
13
12
  paging: PaginationController;
14
13
  sorting: SortingController;
14
+ many: {
15
+ status: 'many' | 'loading' | 'loaded';
16
+ count: number;
17
+ };
15
18
  private _destroy$;
16
19
  private _cdRef;
17
20
  ngOnInit(): void;
@@ -6,17 +6,21 @@ import { PaginationStrategy } from '../../enums';
6
6
  import { SortingDirection } from '../../models/column.model';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@angular/common";
9
- import * as i2 from "@firestitch/menu";
10
- import * as i3 from "@angular/material/tooltip";
11
- import * as i4 from "../saved-filters/saved-filters.component";
9
+ import * as i2 from "@angular/material/progress-spinner";
10
+ import * as i3 from "@firestitch/menu";
11
+ import * as i4 from "@angular/material/tooltip";
12
+ import * as i5 from "../saved-filters/saved-filters.component";
12
13
  export class FsStatusComponent {
13
14
  list;
14
15
  rows;
15
16
  firstLoad;
16
17
  PaginationStrategy = PaginationStrategy;
17
- manyLabel = 'many';
18
18
  paging;
19
19
  sorting;
20
+ many = {
21
+ status: 'many',
22
+ count: 0,
23
+ };
20
24
  _destroy$ = new Subject();
21
25
  _cdRef = inject(ChangeDetectorRef);
22
26
  ngOnInit() {
@@ -30,17 +34,22 @@ export class FsStatusComponent {
30
34
  this.list.filtersQuery$
31
35
  .pipe(takeUntil(this._destroy$))
32
36
  .subscribe(() => {
33
- this.manyLabel = 'many';
37
+ this.many.status = 'many';
38
+ this._cdRef.markForCheck();
34
39
  });
35
40
  }
36
41
  manyClick() {
42
+ this.many.status = 'loading';
37
43
  this.list.fetchRemote({
38
44
  ...this.list.filtersQuery,
39
45
  offset: 0,
40
- limit: 1,
46
+ limit: 0,
47
+ recordCount: true,
41
48
  })
49
+ .pipe(takeUntil(this._destroy$))
42
50
  .subscribe((response) => {
43
- this.manyLabel = response.paging?.records || 0;
51
+ this.many.count = response.paging?.records || 0;
52
+ this.many.status = 'loaded';
44
53
  this._cdRef.markForCheck();
45
54
  });
46
55
  }
@@ -65,11 +74,11 @@ export class FsStatusComponent {
65
74
  this.paging.setLimit(limit);
66
75
  }
67
76
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
68
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsStatusComponent, selector: "fs-list-status", inputs: { list: "list", rows: "rows", firstLoad: "firstLoad" }, host: { properties: { "class.first-load": "this.firstLoad", "class.fs-skeleton-placeholder": "this.firstLoad" } }, ngImport: i0, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (manyLabel === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n {{ manyLabel }}\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i4.FsListSavedFiltersComponent, selector: "fs-list-saved-filters" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
77
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsStatusComponent, selector: "fs-list-status", inputs: { list: "list", rows: "rows", firstLoad: "firstLoad" }, host: { properties: { "class.first-load": "this.firstLoad", "class.fs-skeleton-placeholder": "this.firstLoad" } }, ngImport: i0, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (many.status === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n @if (many.status === 'loading') {\r\n <mat-spinner\r\n [diameter]=\"15\"\r\n [strokeWidth]=\"2\">\r\n </mat-spinner>\r\n } @else {\r\n {{ many.count | number:'1.0':'en-US' }}\r\n }\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}mat-spinner{display:inline-block;margin:0 2px;vertical-align:middle}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i3.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i3.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i3.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i5.FsListSavedFiltersComponent, selector: "fs-list-saved-filters" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
69
78
  }
70
79
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsStatusComponent, decorators: [{
71
80
  type: Component,
72
- args: [{ selector: 'fs-list-status', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: true, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (manyLabel === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n {{ manyLabel }}\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}\n"] }]
81
+ args: [{ selector: 'fs-list-status', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: true, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (many.status === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n @if (many.status === 'loading') {\r\n <mat-spinner\r\n [diameter]=\"15\"\r\n [strokeWidth]=\"2\">\r\n </mat-spinner>\r\n } @else {\r\n {{ many.count | number:'1.0':'en-US' }}\r\n }\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}mat-spinner{display:inline-block;margin:0 2px;vertical-align:middle}\n"] }]
73
82
  }], propDecorators: { list: [{
74
83
  type: Input
75
84
  }], rows: [{
@@ -83,4 +92,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
83
92
  type: HostBinding,
84
93
  args: ['class.fs-skeleton-placeholder']
85
94
  }] } });
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9zdGF0dXMvc3RhdHVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9zdGF0dXMvc3RhdHVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7QUFVN0QsTUFBTSxPQUFPLGlCQUFpQjtJQUVaLElBQUksQ0FBTztJQUNYLElBQUksQ0FBQztJQUtkLFNBQVMsQ0FBVTtJQUVuQixrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUN4QyxTQUFTLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sQ0FBdUI7SUFDN0IsT0FBTyxDQUFvQjtJQUUxQixTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUNoQyxNQUFNLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFcEMsUUFBUTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWU7YUFDekIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7YUFDcEIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNwQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUN6QixNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQzthQUNDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxNQUFNO1FBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFTSxRQUFRLENBQUMsS0FBSztRQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO3VHQXZFVSxpQkFBaUI7MkZBQWpCLGlCQUFpQix5T0M1QjlCLHFpSEEwR007OzJGRDlFTyxpQkFBaUI7a0JBUDdCLFNBQVM7K0JBQ0UsZ0JBQWdCLG1CQUdULHVCQUF1QixDQUFDLE1BQU0sdUJBQzFCLElBQUk7OEJBSVQsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUtDLFNBQVM7c0JBSGYsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxrQkFBa0I7O3NCQUM5QixXQUFXO3VCQUFDLCtCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IExpc3QgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2xpc3QtY29udHJvbGxlcic7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvcGFnaW5hdGlvbi1jb250cm9sbGVyJztcbmltcG9ydCB7IFNvcnRpbmdDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9zb3J0aW5nLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgU29ydGluZ0RpcmVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9jb2x1bW4ubW9kZWwnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWxpc3Qtc3RhdHVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0YXR1cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YXR1cy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRnNTdGF0dXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcHVibGljIGxpc3Q6IExpc3Q7XG4gIEBJbnB1dCgpIHB1YmxpYyByb3dzO1xuXG4gIEBJbnB1dCgpXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlyc3QtbG9hZCcpXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZnMtc2tlbGV0b24tcGxhY2Vob2xkZXInKVxuICBwdWJsaWMgZmlyc3RMb2FkOiBib29sZWFuO1xuICBcbiAgcHVibGljIFBhZ2luYXRpb25TdHJhdGVneSA9IFBhZ2luYXRpb25TdHJhdGVneTtcbiAgcHVibGljIG1hbnlMYWJlbCA9ICdtYW55JztcbiAgcHVibGljIHBhZ2luZzogUGFnaW5hdGlvbkNvbnRyb2xsZXI7XG4gIHB1YmxpYyBzb3J0aW5nOiBTb3J0aW5nQ29udHJvbGxlcjtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wYWdpbmcgPSB0aGlzLmxpc3QucGFnaW5nO1xuICAgIHRoaXMuc29ydGluZyA9IHRoaXMubGlzdC5zb3J0aW5nO1xuICAgIHRoaXMuc29ydGluZy5zb3J0aW5nQ2hhbmdlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmxpc3QuZmlsdGVyc1F1ZXJ5JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5tYW55TGFiZWwgPSAnbWFueSc7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtYW55Q2xpY2soKSB7XG4gICAgdGhpcy5saXN0LmZldGNoUmVtb3RlKHtcbiAgICAgIC4uLnRoaXMubGlzdC5maWx0ZXJzUXVlcnksXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgICBsaW1pdDogMSxcbiAgICB9KVxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5tYW55TGFiZWwgPSByZXNwb25zZS5wYWdpbmc/LnJlY29yZHMgfHwgMDtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRGlyZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5kaXJlY3Rpb24gPT09ICdhc2MnKSB7XG4gICAgICB0aGlzLnNvcnRpbmcuc29ydERpcmVjdGlvbihTb3J0aW5nRGlyZWN0aW9uLmRlc2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRpbmcuc29ydERpcmVjdGlvbihTb3J0aW5nRGlyZWN0aW9uLmFzYyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNvcnRhYmxlQ29sdW1uKGNvbHVtbikge1xuICAgIGlmICh0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbiAhPT0gY29sdW1uKSB7XG4gICAgICB0aGlzLnNvcnRpbmcuc29ydEJ5KGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldExpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5wYWdpbmcuc2V0TGltaXQobGltaXQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic3RhdHVzXCI+XHJcbiAgPHNtYWxsPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhZ2luZy5lbmFibGVkXCI+XHJcbiAgICAgIFNob3dpbmdcclxuICAgICAgPGEgW2ZzTWVudVRyaWdnZXJGb3JdPVwibGltaXRzTWVudVwiPlxyXG4gICAgICAgIHt7IHBhZ2luZy5zdGF0dXNMYWJlbCB9fVxyXG4gICAgICA8L2E+XHJcbiAgICAgIG9mXHJcbiAgICAgIEBpZiAocGFnaW5nLmhhc01hbnlTdHJhdGVneSkge1xyXG4gICAgICBAaWYgKG1hbnlMYWJlbCA9PT0gJ21hbnknKSB7XHJcbiAgICAgICAgPGFcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbnlDbGljaygpXCJcclxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ0NhbGN1bGF0ZSBudW1iZXIgb2YgcmVjb3JkcydcIj5cclxuICAgICAgICAgIG1hbnlcclxuICAgICAgICA8L2E+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIHt7IG1hbnlMYWJlbCB9fVxyXG4gICAgICB9XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIHt7IHBhZ2luZy5yZWNvcmRzIHwgbnVtYmVyOicxLjAnOidlbi1VUycgfX0gcmVzdWx0c1xyXG4gICAgICB9XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzb3J0ZWRCeVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFwYWdpbmcuZW5hYmxlZCkgJiYgcGFnaW5nLmRpc3BsYXllZCA+IDBcIj5cclxuICAgICAgU2hvd2luZ1xyXG4gICAgICA8c3BhbiAqbmdJZj1cInBhZ2luZy5kaXNwbGF5ZWQgPT09IDFcIj5cclxuICAgICAgICB7eyBwYWdpbmcuZGlzcGxheWVkIH19IHJlc3VsdFxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwicGFnaW5nLmRpc3BsYXllZCA+IDFcIj5cclxuICAgICAgICB7eyBwYWdpbmcuZGlzcGxheWVkIHwgbnVtYmVyOicxLjAnOidlbi1VUycgfX0gcmVzdWx0c1xyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzb3J0ZWRCeVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZnMtbGlzdC1zYXZlZC1maWx0ZXJzIGNsYXNzPVwic2F2ZWQtZmlsdGVyc1wiPjwvZnMtbGlzdC1zYXZlZC1maWx0ZXJzPlxyXG4gICAgPGZzLW1lbnVcclxuICAgICAgICBbaGlkZGVuXT1cIiFwYWdpbmcuZW5hYmxlZFwiXHJcbiAgICAgICAgI2xpbWl0c01lbnU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgbmdGb3JcclxuICAgICAgICAgIGxldC1saW1pdFxyXG4gICAgICAgICAgW25nRm9yT2ZdPVwicGFnaW5nLmxpbWl0c1wiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cclxuICAgICAgICAgICAgKGNsaWNrKT1cInNldExpbWl0KGxpbWl0KVwiPlxyXG4gICAgICAgICAge3sgbGltaXQgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9mcy1tZW51PlxyXG4gICAgPGZzLW1lbnVcclxuICAgICAgICBbaGlkZGVuXT1cIiFzb3J0aW5nLnNvcnRpbmdDb2x1bW4gfHwgcGFnaW5nLmRpc3BsYXllZCA9PT0gMFwiXHJcbiAgICAgICAgI29yZGVyQ29sdW1uc01lbnU+XHJcbiAgICAgIDwhLS0gUmVhbCBzb3J0aW5nIGNvbHVtbnMgLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgbmdGb3JcclxuICAgICAgICAgIGxldC1jb2x1bW5cclxuICAgICAgICAgIFtuZ0Zvck9mXT1cInNvcnRpbmcuc29ydGluZ0NvbHVtbnNcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRTb3J0YWJsZUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnRpdGxlOyBlbHNlIHNvcnRCeVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fVxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NvcnRCeVRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPCEtLSBGYWtlIHNvcnRpbmcgY29sdW1ucyAtLT5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICBuZ0ZvclxyXG4gICAgICAgICAgbGV0LWNvbHVtblxyXG4gICAgICAgICAgW25nRm9yT2ZdPVwic29ydGluZy5mYWtlU29ydGluZ0NvbHVtbnNcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRTb3J0YWJsZUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICB7eyBjb2x1bW4udGl0bGUgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9mcy1tZW51PlxyXG4gICAgPG5nLXRlbXBsYXRlICNzb3J0ZWRCeT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNvcnRpbmcuc29ydGluZ0NvbHVtblwiPlxyXG4gICAgICAgIHNvcnRlZCBieVxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzb3J0aW5nLnNvcnRpbmdDb2x1bW4udGl0bGU7IGVsc2Ugc29ydEJ5VGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJvcmRlci10b2dnbGVcIlxyXG4gICAgICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cIm9yZGVyQ29sdW1uc01lbnVcIj5cclxuICAgICAgICAgICAge3sgc29ydGluZy5zb3J0aW5nQ29sdW1uLnRpdGxlIH19XHJcbiAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAsXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNzb3J0QnlUZW1wbGF0ZT5cclxuICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJvcmRlci10b2dnbGVcIlxyXG4gICAgICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cIm9yZGVyQ29sdW1uc01lbnVcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNvcnRpbmcuc29ydGluZ0NvbHVtbi5oZWFkZXJUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAsXHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgICBjbGFzcz1cIm9yZGVyLXRvZ2dsZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAge3sgc29ydGluZy5zb3J0aW5nQ29sdW1uLmZ1bGxOYW1lRGlyZWN0aW9uIH19XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9zbWFsbD5cclxuPC9kaXY+Il19
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9zdGF0dXMvc3RhdHVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9zdGF0dXMvc3RhdHVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7O0FBVTdELE1BQU0sT0FBTyxpQkFBaUI7SUFFWixJQUFJLENBQU87SUFDWCxJQUFJLENBQUM7SUFLZCxTQUFTLENBQVU7SUFFbkIsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7SUFDeEMsTUFBTSxDQUF1QjtJQUM3QixPQUFPLENBQW9CO0lBQzNCLElBQUksR0FHTDtRQUNGLE1BQU0sRUFBRSxNQUFNO1FBQ2QsS0FBSyxFQUFFLENBQUM7S0FDVCxDQUFDO0lBRUksU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRXBDLFFBQVE7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO2FBQ3pCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO2FBQ3BCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3BCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQ3pCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDO2FBQ0MsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRU0saUJBQWlCLENBQUMsTUFBTTtRQUM3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQUs7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzt1R0FwRlUsaUJBQWlCOzJGQUFqQixpQkFBaUIseU9DNUI5QiwydkhBaUhNOzsyRkRyRk8saUJBQWlCO2tCQVA3QixTQUFTOytCQUNFLGdCQUFnQixtQkFHVCx1QkFBdUIsQ0FBQyxNQUFNLHVCQUMxQixJQUFJOzhCQUlULElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFLQyxTQUFTO3NCQUhmLEtBQUs7O3NCQUNMLFdBQVc7dUJBQUMsa0JBQWtCOztzQkFDOUIsV0FBVzt1QkFBQywrQkFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSG9zdEJpbmRpbmcsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBMaXN0IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9saXN0LWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3BhZ2luYXRpb24tY29udHJvbGxlcic7XG5pbXBvcnQgeyBTb3J0aW5nQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvc29ydGluZy1jb250cm9sbGVyJztcbmltcG9ydCB7IFBhZ2luYXRpb25TdHJhdGVneSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1saXN0LXN0YXR1cycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGF0dXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGF0dXMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEZzU3RhdHVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBsaXN0OiBMaXN0O1xuICBASW5wdXQoKSBwdWJsaWMgcm93cztcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpcnN0LWxvYWQnKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLXNrZWxldG9uLXBsYWNlaG9sZGVyJylcbiAgcHVibGljIGZpcnN0TG9hZDogYm9vbGVhbjtcbiAgXG4gIHB1YmxpYyBQYWdpbmF0aW9uU3RyYXRlZ3kgPSBQYWdpbmF0aW9uU3RyYXRlZ3k7XG4gIHB1YmxpYyBwYWdpbmc6IFBhZ2luYXRpb25Db250cm9sbGVyO1xuICBwdWJsaWMgc29ydGluZzogU29ydGluZ0NvbnRyb2xsZXI7XG4gIHB1YmxpYyBtYW55OiB7XG4gICAgc3RhdHVzOiAnbWFueScgfCAnbG9hZGluZycgfCAnbG9hZGVkJztcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIH0gPSB7IFxuICAgICAgc3RhdHVzOiAnbWFueScsXG4gICAgICBjb3VudDogMCxcbiAgICB9O1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhZ2luZyA9IHRoaXMubGlzdC5wYWdpbmc7XG4gICAgdGhpcy5zb3J0aW5nID0gdGhpcy5saXN0LnNvcnRpbmc7XG4gICAgdGhpcy5zb3J0aW5nLnNvcnRpbmdDaGFuZ2VkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMubGlzdC5maWx0ZXJzUXVlcnkkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLm1hbnkuc3RhdHVzID0gJ21hbnknO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1hbnlDbGljaygpIHtcbiAgICB0aGlzLm1hbnkuc3RhdHVzID0gJ2xvYWRpbmcnO1xuICAgIHRoaXMubGlzdC5mZXRjaFJlbW90ZSh7XG4gICAgICAuLi50aGlzLmxpc3QuZmlsdGVyc1F1ZXJ5LFxuICAgICAgb2Zmc2V0OiAwLFxuICAgICAgbGltaXQ6IDAsXG4gICAgICByZWNvcmRDb3VudDogdHJ1ZSxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLm1hbnkuY291bnQgPSByZXNwb25zZS5wYWdpbmc/LnJlY29yZHMgfHwgMDtcbiAgICAgICAgdGhpcy5tYW55LnN0YXR1cyA9ICdsb2FkZWQnO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVEaXJlY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uLmRpcmVjdGlvbiA9PT0gJ2FzYycpIHtcbiAgICAgIHRoaXMuc29ydGluZy5zb3J0RGlyZWN0aW9uKFNvcnRpbmdEaXJlY3Rpb24uZGVzYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydGluZy5zb3J0RGlyZWN0aW9uKFNvcnRpbmdEaXJlY3Rpb24uYXNjKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U29ydGFibGVDb2x1bW4oY29sdW1uKSB7XG4gICAgaWYgKHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uICE9PSBjb2x1bW4pIHtcbiAgICAgIHRoaXMuc29ydGluZy5zb3J0QnkoY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0TGltaXQobGltaXQpIHtcbiAgICB0aGlzLnBhZ2luZy5zZXRMaW1pdChsaW1pdCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzdGF0dXNcIj5cclxuICA8c21hbGw+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFnaW5nLmVuYWJsZWRcIj5cclxuICAgICAgU2hvd2luZ1xyXG4gICAgICA8YSBbZnNNZW51VHJpZ2dlckZvcl09XCJsaW1pdHNNZW51XCI+XHJcbiAgICAgICAge3sgcGFnaW5nLnN0YXR1c0xhYmVsIH19XHJcbiAgICAgIDwvYT5cclxuICAgICAgb2ZcclxuICAgICAgQGlmIChwYWdpbmcuaGFzTWFueVN0cmF0ZWd5KSB7XHJcbiAgICAgIEBpZiAobWFueS5zdGF0dXMgPT09ICdtYW55Jykge1xyXG4gICAgICAgIDxhXHJcbiAgICAgICAgICAgIChjbGljayk9XCJtYW55Q2xpY2soKVwiXHJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidDYWxjdWxhdGUgbnVtYmVyIG9mIHJlY29yZHMnXCI+XHJcbiAgICAgICAgICBtYW55XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgQGlmIChtYW55LnN0YXR1cyA9PT0gJ2xvYWRpbmcnKSB7XHJcbiAgICAgICAgPG1hdC1zcGlubmVyXHJcbiAgICAgICAgICBbZGlhbWV0ZXJdPVwiMTVcIlxyXG4gICAgICAgICAgW3N0cm9rZVdpZHRoXT1cIjJcIj5cclxuICAgICAgICA8L21hdC1zcGlubmVyPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICB7eyBtYW55LmNvdW50IHwgbnVtYmVyOicxLjAnOidlbi1VUycgfX1cclxuICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIHt7IHBhZ2luZy5yZWNvcmRzIHwgbnVtYmVyOicxLjAnOidlbi1VUycgfX0gcmVzdWx0c1xyXG4gICAgICB9XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzb3J0ZWRCeVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFwYWdpbmcuZW5hYmxlZCkgJiYgcGFnaW5nLmRpc3BsYXllZCA+IDBcIj5cclxuICAgICAgU2hvd2luZ1xyXG4gICAgICA8c3BhbiAqbmdJZj1cInBhZ2luZy5kaXNwbGF5ZWQgPT09IDFcIj5cclxuICAgICAgICB7eyBwYWdpbmcuZGlzcGxheWVkIH19IHJlc3VsdFxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwicGFnaW5nLmRpc3BsYXllZCA+IDFcIj5cclxuICAgICAgICB7eyBwYWdpbmcuZGlzcGxheWVkIHwgbnVtYmVyOicxLjAnOidlbi1VUycgfX0gcmVzdWx0c1xyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzb3J0ZWRCeVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZnMtbGlzdC1zYXZlZC1maWx0ZXJzIGNsYXNzPVwic2F2ZWQtZmlsdGVyc1wiPjwvZnMtbGlzdC1zYXZlZC1maWx0ZXJzPlxyXG4gICAgPGZzLW1lbnVcclxuICAgICAgICBbaGlkZGVuXT1cIiFwYWdpbmcuZW5hYmxlZFwiXHJcbiAgICAgICAgI2xpbWl0c01lbnU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgbmdGb3JcclxuICAgICAgICAgIGxldC1saW1pdFxyXG4gICAgICAgICAgW25nRm9yT2ZdPVwicGFnaW5nLmxpbWl0c1wiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cclxuICAgICAgICAgICAgKGNsaWNrKT1cInNldExpbWl0KGxpbWl0KVwiPlxyXG4gICAgICAgICAge3sgbGltaXQgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9mcy1tZW51PlxyXG4gICAgPGZzLW1lbnVcclxuICAgICAgICBbaGlkZGVuXT1cIiFzb3J0aW5nLnNvcnRpbmdDb2x1bW4gfHwgcGFnaW5nLmRpc3BsYXllZCA9PT0gMFwiXHJcbiAgICAgICAgI29yZGVyQ29sdW1uc01lbnU+XHJcbiAgICAgIDwhLS0gUmVhbCBzb3J0aW5nIGNvbHVtbnMgLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgbmdGb3JcclxuICAgICAgICAgIGxldC1jb2x1bW5cclxuICAgICAgICAgIFtuZ0Zvck9mXT1cInNvcnRpbmcuc29ydGluZ0NvbHVtbnNcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRTb3J0YWJsZUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnRpdGxlOyBlbHNlIHNvcnRCeVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fVxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NvcnRCeVRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPCEtLSBGYWtlIHNvcnRpbmcgY29sdW1ucyAtLT5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICBuZ0ZvclxyXG4gICAgICAgICAgbGV0LWNvbHVtblxyXG4gICAgICAgICAgW25nRm9yT2ZdPVwic29ydGluZy5mYWtlU29ydGluZ0NvbHVtbnNcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRTb3J0YWJsZUNvbHVtbihjb2x1bW4pXCI+XHJcbiAgICAgICAgICB7eyBjb2x1bW4udGl0bGUgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9mcy1tZW51PlxyXG4gICAgPG5nLXRlbXBsYXRlICNzb3J0ZWRCeT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNvcnRpbmcuc29ydGluZ0NvbHVtblwiPlxyXG4gICAgICAgIHNvcnRlZCBieVxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzb3J0aW5nLnNvcnRpbmdDb2x1bW4udGl0bGU7IGVsc2Ugc29ydEJ5VGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJvcmRlci10b2dnbGVcIlxyXG4gICAgICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cIm9yZGVyQ29sdW1uc01lbnVcIj5cclxuICAgICAgICAgICAge3sgc29ydGluZy5zb3J0aW5nQ29sdW1uLnRpdGxlIH19XHJcbiAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAsXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNzb3J0QnlUZW1wbGF0ZT5cclxuICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJvcmRlci10b2dnbGVcIlxyXG4gICAgICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cIm9yZGVyQ29sdW1uc01lbnVcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNvcnRpbmcuc29ydGluZ0NvbHVtbi5oZWFkZXJUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAsXHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgICBjbGFzcz1cIm9yZGVyLXRvZ2dsZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAge3sgc29ydGluZy5zb3J0aW5nQ29sdW1uLmZ1bGxOYW1lRGlyZWN0aW9uIH19XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9zbWFsbD5cclxuPC9kaXY+Il19
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2ludGVyZmFjZXMvcGFnaW5hdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhZ2VDaGFuZ2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvcGFnZS1jaGFuZ2UtdHlwZS5lbnVtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlQYWdlU3RyYXRlZ3kge1xyXG4gIHBhZ2U/OiBudW1iZXI7XHJcbiAgbGltaXQ/OiBudW1iZXI7XHJcbiAgcmVjb3JkQ291bnQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T2Zmc2V0U3RyYXRlZ3kge1xyXG4gIG9mZnNldD86IG51bWJlcjtcclxuICBsaW1pdD86IG51bWJlcjtcclxuICByZWNvcmRDb3VudD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlNYW55U3RyYXRlZ3kge1xyXG4gIGxpbWl0PzogbnVtYmVyO1xyXG4gIHJlY29yZENvdW50PzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlQ2hhbmdlIHtcclxuICB0eXBlOiBQYWdlQ2hhbmdlVHlwZTtcclxuICBwYXlsb2FkOiBhbnk7XHJcbn1cclxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2ludGVyZmFjZXMvcGFnaW5hdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhZ2VDaGFuZ2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvcGFnZS1jaGFuZ2UtdHlwZS5lbnVtJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeVBhZ2VTdHJhdGVneSB7XG4gIHBhZ2U/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICByZWNvcmRDb3VudD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlPZmZzZXRTdHJhdGVneSB7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHJlY29yZENvdW50PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeU1hbnlTdHJhdGVneSB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICByZWNvcmRDb3VudD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUNoYW5nZSB7XG4gIHR5cGU6IFBhZ2VDaGFuZ2VUeXBlO1xuICBwYXlsb2FkOiBhbnk7XG59XG4iXX0=
@@ -15,6 +15,7 @@ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
15
15
  import * as i3$1 from '@angular/material/icon';
16
16
  import { MatIconModule } from '@angular/material/icon';
17
17
  import { MatMenuModule } from '@angular/material/menu';
18
+ import * as i2$1 from '@angular/material/progress-spinner';
18
19
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
19
20
  import * as i6$1 from '@angular/material/tooltip';
20
21
  import { MatTooltipModule } from '@angular/material/tooltip';
@@ -22,9 +23,9 @@ import * as i5$1 from '@firestitch/common';
22
23
  import { getNormalizedPath, FsCommonModule } from '@firestitch/common';
23
24
  import * as i5 from '@firestitch/file';
24
25
  import { FsFileModule } from '@firestitch/file';
25
- import * as i2$1 from '@firestitch/filter';
26
+ import * as i2 from '@firestitch/filter';
26
27
  import { ItemType, FilterComponent, FsFilterModule } from '@firestitch/filter';
27
- import * as i2 from '@firestitch/menu';
28
+ import * as i3$2 from '@firestitch/menu';
28
29
  import { FsMenuModule } from '@firestitch/menu';
29
30
  import * as i1$1 from '@firestitch/prompt';
30
31
  import { FsPromptModule } from '@firestitch/prompt';
@@ -32,7 +33,7 @@ import { FsScrollModule } from '@firestitch/scroll';
32
33
  import { get, isString, isObject, isBoolean, isNumber, isFunction, cloneDeep, random, mergeWith, merge as merge$1 } from 'lodash-es';
33
34
  import { BehaviorSubject, Subject, Observable, merge, from, of, combineLatest, EMPTY } from 'rxjs';
34
35
  import { takeUntil, take, filter, tap, skip, distinctUntilChanged, map, shareReplay, delay, switchMap, debounceTime, mapTo, catchError } from 'rxjs/operators';
35
- import * as i3$2 from '@firestitch/drawer';
36
+ import * as i3$3 from '@firestitch/drawer';
36
37
  import * as i4$2 from '@firestitch/selection';
37
38
  import * as i1$3 from '@firestitch/store';
38
39
  import { FsPersistanceStore } from '@firestitch/store';
@@ -1423,13 +1424,13 @@ class FsRowMenuActionComponent {
1423
1424
  closeMenu() {
1424
1425
  this._menu.closeMenu();
1425
1426
  }
1426
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsRowMenuActionComponent, deps: [{ token: i2.FsMenuComponent }], target: i0.ɵɵFactoryTarget.Component });
1427
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsRowMenuActionComponent, deps: [{ token: i3$2.FsMenuComponent }], target: i0.ɵɵFactoryTarget.Component });
1427
1428
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsRowMenuActionComponent, selector: "fs-list-row-menu-action", inputs: { row: "row", icon: "icon", label: "label", file: "file" }, outputs: { fileSelect: "fileSelect", fileError: "fileError" }, ngImport: i0, template: "<ng-container *ngIf=\"!file else withFile\">\n <mat-icon *ngIf=\"icon\">{{icon}}</mat-icon>\n {{label| actionLabel:row}}\n</ng-container>\n\n<ng-template #withFile>\n <fs-file\n class=\"action-button\"\n [accept]=\"file.accept || '*'\"\n [multiple]=\"file.multiple\"\n [minWidth]=\"file.minWidth\"\n [minHeight]=\"file.minHeight\"\n [imageWidth]=\"file.maxWidth\"\n [imageHeight]=\"file.maxHeight\"\n (click)=\"$event.stopPropagation();\"\n (select)=\"selectFile($event)\"\n (error)=\"errorFile($event)\"\n (cancel)=\"closeMenu()\">\n <mat-icon *ngIf=\"icon\">{{icon}}</mat-icon>\n {{label| actionLabel:row}}\n </fs-file>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.FsFileComponent, selector: "fs-file", inputs: ["minHeight", "minWidth", "orientate", "multiple", "capture", "allowClick", "allowDrop", "accept", "disabled", "imageWidth", "imageHeight", "imageQuality"], outputs: ["select", "error", "beforeProcessing", "clicked", "declined"] }, { kind: "pipe", type: ActionLabelPipe, name: "actionLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1428
1429
  }
1429
1430
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsRowMenuActionComponent, decorators: [{
1430
1431
  type: Component,
1431
1432
  args: [{ selector: 'fs-list-row-menu-action', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!file else withFile\">\n <mat-icon *ngIf=\"icon\">{{icon}}</mat-icon>\n {{label| actionLabel:row}}\n</ng-container>\n\n<ng-template #withFile>\n <fs-file\n class=\"action-button\"\n [accept]=\"file.accept || '*'\"\n [multiple]=\"file.multiple\"\n [minWidth]=\"file.minWidth\"\n [minHeight]=\"file.minHeight\"\n [imageWidth]=\"file.maxWidth\"\n [imageHeight]=\"file.maxHeight\"\n (click)=\"$event.stopPropagation();\"\n (select)=\"selectFile($event)\"\n (error)=\"errorFile($event)\"\n (cancel)=\"closeMenu()\">\n <mat-icon *ngIf=\"icon\">{{icon}}</mat-icon>\n {{label| actionLabel:row}}\n </fs-file>\n</ng-template>\n" }]
1432
- }], ctorParameters: () => [{ type: i2.FsMenuComponent }], propDecorators: { row: [{
1433
+ }], ctorParameters: () => [{ type: i3$2.FsMenuComponent }], propDecorators: { row: [{
1433
1434
  type: Input
1434
1435
  }], icon: [{
1435
1436
  type: Input
@@ -1508,7 +1509,7 @@ class FsRowActionsComponent {
1508
1509
  }
1509
1510
  }
1510
1511
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsRowActionsComponent, deps: [{ token: i1$1.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
1511
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsRowActionsComponent, selector: "fs-list-row-actions", inputs: { row: "row", index: "index", restoreMode: "restoreMode", rowActions: "rowActions", rowRemoved: "rowRemoved", menuRowActions: "menuRowActions", inlineRowActions: "inlineRowActions", restoreAction: "restoreAction" }, ngImport: i0, template: "<ng-container *ngIf=\"!restoreMode || (restoreMode && !restoreAction)\">\n <ng-container *ngFor=\"let action of inlineRowActions; trackBy: trackByFn\">\n <fs-list-row-inline-action\n class=\"row-inline-action row-inline-action-{{action.type}}\"\n [action]=\"action\"\n [ngClass]=\"{'mobile-hide': action.menu === undefined}\"\n (clicked)=\"actionClick(action, row, $event)\"\n (fileSelect)=\"action.fileConfig.select($event, row, index)\">\n </fs-list-row-inline-action>\n </ng-container>\n</ng-container>\n\n<!-- Menu -->\n<fs-menu\n class=\"row-menu-action\"\n *ngIf=\"menuRowActions.length || (restoreMode && restoreAction)\"\n #menuRef>\n <!-- Case when we have usual menu actions -->\n <ng-container *ngIf=\"!restoreMode || (restoreMode && !restoreAction)\">\n <ng-container *ngFor=\"let action of inlineRowActions; trackBy: trackByFn\">\n <ng-template\n class=\"hidden-mobile-menu-action\"\n fs-menu-item\n [link]=\"action.routerLink?.link\"\n [queryParams]=\"action.routerLink?.queryParams\"\n [target]=\"action.routerLink?.target\"\n [hidden]=\"action.menu !== undefined && !action.isShown\">\n <fs-list-row-menu-action\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [row]=\"row\"\n [file]=\"action.fileConfig\"\n (fileSelect)=\"action.fileConfig.select($event, row, index)\"\n (fileError)=\"action.fileConfig.error && action.fileConfig.error($event)\">\n </fs-list-row-menu-action>\n </ng-template>\n </ng-container>\n\n <ng-container *ngFor=\"let action of menuRowActions; trackBy: trackByFn\">\n <ng-container *ngIf=\"action.isGroup else simpleMenuItem\">\n <fs-menu-group [label]=\"action.label | actionLabel:row\">\n <ng-container *ngFor=\"let subAction of action.rowActions\">\n <ng-template\n fs-menu-item\n [link]=\"subAction.routerLink?.link\"\n [queryParams]=\"subAction.routerLink?.queryParams\"\n [target]=\"subAction.routerLink?.target\"\n [hidden]=\"!subAction.isShown\"\n [class]=\"subAction.className\"\n (click)=\"actionClick(subAction, row, $event, menuRef);\">\n <fs-list-row-menu-action\n [icon]=\"subAction.icon\"\n [label]=\"subAction.label\"\n [row]=\"row\"\n [file]=\"subAction.fileConfig\"\n (fileSelect)=\"subAction.fileConfig.select($event, row, index)\"\n (fileError)=\"subAction.fileConfig.error && subAction.fileConfig.error($event)\">\n </fs-list-row-menu-action>\n </ng-template>\n </ng-container>\n </fs-menu-group>\n </ng-container>\n <ng-template #simpleMenuItem>\n <ng-template\n fs-menu-item\n [link]=\"action.routerLink?.link\"\n [queryParams]=\"action.routerLink?.queryParams\"\n [target]=\"action.routerLink?.target\"\n [hidden]=\"!action.isShown\"\n [class]=\"action.className\"\n (click)=\"actionClick(action, row, $event, menuRef);\">\n <fs-list-row-menu-action\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [row]=\"row\"\n [file]=\"action.fileConfig\"\n (fileSelect)=\"action.fileConfig.select($event, row, index)\"\n (fileError)=\"action.fileConfig.error && action.fileConfig.error($event)\">\n </fs-list-row-menu-action>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <!-- Case when we have restore mode enabled and must hide menu actions -->\n <ng-container *ngIf=\"restoreMode && restoreAction\">\n <ng-template fs-menu-item (click)=\"actionClick(restoreAction, row, $event, menuRef)\">\n <mat-icon *ngIf=\"restoreAction.icon\">{{restoreAction.icon}}</mat-icon>\n {{restoreAction.label | actionLabel:row}}\n </ng-template>\n </ng-container>\n</fs-menu>\n", styles: [":host{display:flex;align-items:center;justify-content:flex-end}:host ::ng-deep fs-list-row-inline-action{margin-left:5px}:host ::ng-deep fs-list-row-inline-action:first-child{margin-left:0}::ng-deep .hidden-mobile-menu-action{display:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "component", type: FsRowInlineActionComponent, selector: "fs-list-row-inline-action", inputs: ["action"], outputs: ["clicked", "fileSelect"] }, { kind: "component", type: FsRowMenuActionComponent, selector: "fs-list-row-menu-action", inputs: ["row", "icon", "label", "file"], outputs: ["fileSelect", "fileError"] }, { kind: "pipe", type: ActionLabelPipe, name: "actionLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1512
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsRowActionsComponent, selector: "fs-list-row-actions", inputs: { row: "row", index: "index", restoreMode: "restoreMode", rowActions: "rowActions", rowRemoved: "rowRemoved", menuRowActions: "menuRowActions", inlineRowActions: "inlineRowActions", restoreAction: "restoreAction" }, ngImport: i0, template: "<ng-container *ngIf=\"!restoreMode || (restoreMode && !restoreAction)\">\n <ng-container *ngFor=\"let action of inlineRowActions; trackBy: trackByFn\">\n <fs-list-row-inline-action\n class=\"row-inline-action row-inline-action-{{action.type}}\"\n [action]=\"action\"\n [ngClass]=\"{'mobile-hide': action.menu === undefined}\"\n (clicked)=\"actionClick(action, row, $event)\"\n (fileSelect)=\"action.fileConfig.select($event, row, index)\">\n </fs-list-row-inline-action>\n </ng-container>\n</ng-container>\n\n<!-- Menu -->\n<fs-menu\n class=\"row-menu-action\"\n *ngIf=\"menuRowActions.length || (restoreMode && restoreAction)\"\n #menuRef>\n <!-- Case when we have usual menu actions -->\n <ng-container *ngIf=\"!restoreMode || (restoreMode && !restoreAction)\">\n <ng-container *ngFor=\"let action of inlineRowActions; trackBy: trackByFn\">\n <ng-template\n class=\"hidden-mobile-menu-action\"\n fs-menu-item\n [link]=\"action.routerLink?.link\"\n [queryParams]=\"action.routerLink?.queryParams\"\n [target]=\"action.routerLink?.target\"\n [hidden]=\"action.menu !== undefined && !action.isShown\">\n <fs-list-row-menu-action\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [row]=\"row\"\n [file]=\"action.fileConfig\"\n (fileSelect)=\"action.fileConfig.select($event, row, index)\"\n (fileError)=\"action.fileConfig.error && action.fileConfig.error($event)\">\n </fs-list-row-menu-action>\n </ng-template>\n </ng-container>\n\n <ng-container *ngFor=\"let action of menuRowActions; trackBy: trackByFn\">\n <ng-container *ngIf=\"action.isGroup else simpleMenuItem\">\n <fs-menu-group [label]=\"action.label | actionLabel:row\">\n <ng-container *ngFor=\"let subAction of action.rowActions\">\n <ng-template\n fs-menu-item\n [link]=\"subAction.routerLink?.link\"\n [queryParams]=\"subAction.routerLink?.queryParams\"\n [target]=\"subAction.routerLink?.target\"\n [hidden]=\"!subAction.isShown\"\n [class]=\"subAction.className\"\n (click)=\"actionClick(subAction, row, $event, menuRef);\">\n <fs-list-row-menu-action\n [icon]=\"subAction.icon\"\n [label]=\"subAction.label\"\n [row]=\"row\"\n [file]=\"subAction.fileConfig\"\n (fileSelect)=\"subAction.fileConfig.select($event, row, index)\"\n (fileError)=\"subAction.fileConfig.error && subAction.fileConfig.error($event)\">\n </fs-list-row-menu-action>\n </ng-template>\n </ng-container>\n </fs-menu-group>\n </ng-container>\n <ng-template #simpleMenuItem>\n <ng-template\n fs-menu-item\n [link]=\"action.routerLink?.link\"\n [queryParams]=\"action.routerLink?.queryParams\"\n [target]=\"action.routerLink?.target\"\n [hidden]=\"!action.isShown\"\n [class]=\"action.className\"\n (click)=\"actionClick(action, row, $event, menuRef);\">\n <fs-list-row-menu-action\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [row]=\"row\"\n [file]=\"action.fileConfig\"\n (fileSelect)=\"action.fileConfig.select($event, row, index)\"\n (fileError)=\"action.fileConfig.error && action.fileConfig.error($event)\">\n </fs-list-row-menu-action>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <!-- Case when we have restore mode enabled and must hide menu actions -->\n <ng-container *ngIf=\"restoreMode && restoreAction\">\n <ng-template fs-menu-item (click)=\"actionClick(restoreAction, row, $event, menuRef)\">\n <mat-icon *ngIf=\"restoreAction.icon\">{{restoreAction.icon}}</mat-icon>\n {{restoreAction.label | actionLabel:row}}\n </ng-template>\n </ng-container>\n</fs-menu>\n", styles: [":host{display:flex;align-items:center;justify-content:flex-end}:host ::ng-deep fs-list-row-inline-action{margin-left:5px}:host ::ng-deep fs-list-row-inline-action:first-child{margin-left:0}::ng-deep .hidden-mobile-menu-action{display:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3$2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i3$2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "component", type: FsRowInlineActionComponent, selector: "fs-list-row-inline-action", inputs: ["action"], outputs: ["clicked", "fileSelect"] }, { kind: "component", type: FsRowMenuActionComponent, selector: "fs-list-row-menu-action", inputs: ["row", "icon", "label", "file"], outputs: ["fileSelect", "fileError"] }, { kind: "pipe", type: ActionLabelPipe, name: "actionLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1512
1513
  }
1513
1514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsRowActionsComponent, decorators: [{
1514
1515
  type: Component,
@@ -5268,22 +5269,25 @@ class FsListSavedFiltersComponent {
5268
5269
  // viewContainerRef: this._vcRef,
5269
5270
  // });
5270
5271
  }
5271
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListSavedFiltersComponent, deps: [{ token: i1$2.MatDialog }, { token: i2$1.ExternalParamsController }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
5272
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsListSavedFiltersComponent, selector: "fs-list-saved-filters", ngImport: i0, template: "<ng-container *ngIf=\"savedFiltersEnabled$ | async\"><!--\r\n -->, saved filter\r\n <fs-filter-saved-filters-menu (manage)=\"showManageDialog()\"></fs-filter-saved-filters-menu>\r\n</ng-container>\r\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$1.FsSavedFiltersMenuComponent, selector: "fs-filter-saved-filters-menu", outputs: ["clear"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
5272
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListSavedFiltersComponent, deps: [{ token: i1$2.MatDialog }, { token: i2.ExternalParamsController }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
5273
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsListSavedFiltersComponent, selector: "fs-list-saved-filters", ngImport: i0, template: "<ng-container *ngIf=\"savedFiltersEnabled$ | async\"><!--\r\n -->, saved filter\r\n <fs-filter-saved-filters-menu (manage)=\"showManageDialog()\"></fs-filter-saved-filters-menu>\r\n</ng-container>\r\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.FsSavedFiltersMenuComponent, selector: "fs-filter-saved-filters-menu", outputs: ["clear"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
5273
5274
  }
5274
5275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListSavedFiltersComponent, decorators: [{
5275
5276
  type: Component,
5276
5277
  args: [{ selector: 'fs-list-saved-filters', template: "<ng-container *ngIf=\"savedFiltersEnabled$ | async\"><!--\r\n -->, saved filter\r\n <fs-filter-saved-filters-menu (manage)=\"showManageDialog()\"></fs-filter-saved-filters-menu>\r\n</ng-container>\r\n" }]
5277
- }], ctorParameters: () => [{ type: i1$2.MatDialog }, { type: i2$1.ExternalParamsController }, { type: i0.ViewContainerRef }] });
5278
+ }], ctorParameters: () => [{ type: i1$2.MatDialog }, { type: i2.ExternalParamsController }, { type: i0.ViewContainerRef }] });
5278
5279
 
5279
5280
  class FsStatusComponent {
5280
5281
  list;
5281
5282
  rows;
5282
5283
  firstLoad;
5283
5284
  PaginationStrategy = PaginationStrategy;
5284
- manyLabel = 'many';
5285
5285
  paging;
5286
5286
  sorting;
5287
+ many = {
5288
+ status: 'many',
5289
+ count: 0,
5290
+ };
5287
5291
  _destroy$ = new Subject();
5288
5292
  _cdRef = inject(ChangeDetectorRef);
5289
5293
  ngOnInit() {
@@ -5297,17 +5301,22 @@ class FsStatusComponent {
5297
5301
  this.list.filtersQuery$
5298
5302
  .pipe(takeUntil(this._destroy$))
5299
5303
  .subscribe(() => {
5300
- this.manyLabel = 'many';
5304
+ this.many.status = 'many';
5305
+ this._cdRef.markForCheck();
5301
5306
  });
5302
5307
  }
5303
5308
  manyClick() {
5309
+ this.many.status = 'loading';
5304
5310
  this.list.fetchRemote({
5305
5311
  ...this.list.filtersQuery,
5306
5312
  offset: 0,
5307
- limit: 1,
5313
+ limit: 0,
5314
+ recordCount: true,
5308
5315
  })
5316
+ .pipe(takeUntil(this._destroy$))
5309
5317
  .subscribe((response) => {
5310
- this.manyLabel = response.paging?.records || 0;
5318
+ this.many.count = response.paging?.records || 0;
5319
+ this.many.status = 'loaded';
5311
5320
  this._cdRef.markForCheck();
5312
5321
  });
5313
5322
  }
@@ -5332,11 +5341,11 @@ class FsStatusComponent {
5332
5341
  this.paging.setLimit(limit);
5333
5342
  }
5334
5343
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5335
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsStatusComponent, selector: "fs-list-status", inputs: { list: "list", rows: "rows", firstLoad: "firstLoad" }, host: { properties: { "class.first-load": "this.firstLoad", "class.fs-skeleton-placeholder": "this.firstLoad" } }, ngImport: i0, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (manyLabel === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n {{ manyLabel }}\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FsListSavedFiltersComponent, selector: "fs-list-saved-filters" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
5344
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsStatusComponent, selector: "fs-list-status", inputs: { list: "list", rows: "rows", firstLoad: "firstLoad" }, host: { properties: { "class.first-load": "this.firstLoad", "class.fs-skeleton-placeholder": "this.firstLoad" } }, ngImport: i0, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (many.status === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n @if (many.status === 'loading') {\r\n <mat-spinner\r\n [diameter]=\"15\"\r\n [strokeWidth]=\"2\">\r\n </mat-spinner>\r\n } @else {\r\n {{ many.count | number:'1.0':'en-US' }}\r\n }\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}mat-spinner{display:inline-block;margin:0 2px;vertical-align:middle}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i3$2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i3$2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i3$2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FsListSavedFiltersComponent, selector: "fs-list-saved-filters" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
5336
5345
  }
5337
5346
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsStatusComponent, decorators: [{
5338
5347
  type: Component,
5339
- args: [{ selector: 'fs-list-status', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: true, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (manyLabel === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n {{ manyLabel }}\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}\n"] }]
5348
+ args: [{ selector: 'fs-list-status', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: true, template: "<div class=\"status\">\r\n <small>\r\n <ng-container *ngIf=\"paging.enabled\">\r\n Showing\r\n <a [fsMenuTriggerFor]=\"limitsMenu\">\r\n {{ paging.statusLabel }}\r\n </a>\r\n of\r\n @if (paging.hasManyStrategy) {\r\n @if (many.status === 'many') {\r\n <a\r\n (click)=\"manyClick()\"\r\n [matTooltip]=\"'Calculate number of records'\">\r\n many\r\n </a>\r\n } @else {\r\n @if (many.status === 'loading') {\r\n <mat-spinner\r\n [diameter]=\"15\"\r\n [strokeWidth]=\"2\">\r\n </mat-spinner>\r\n } @else {\r\n {{ many.count | number:'1.0':'en-US' }}\r\n }\r\n }\r\n } @else {\r\n {{ paging.records | number:'1.0':'en-US' }} results\r\n }\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"(!paging.enabled) && paging.displayed > 0\">\r\n Showing\r\n <span *ngIf=\"paging.displayed === 1\">\r\n {{ paging.displayed }} result\r\n </span>\r\n <span *ngIf=\"paging.displayed > 1\">\r\n {{ paging.displayed | number:'1.0':'en-US' }} results\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"sortedBy\"></ng-container>\r\n </ng-container>\r\n <fs-list-saved-filters class=\"saved-filters\"></fs-list-saved-filters>\r\n <fs-menu\r\n [hidden]=\"!paging.enabled\"\r\n #limitsMenu>\r\n <ng-template\r\n ngFor\r\n let-limit\r\n [ngForOf]=\"paging.limits\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setLimit(limit)\">\r\n {{ limit }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <fs-menu\r\n [hidden]=\"!sorting.sortingColumn || paging.displayed === 0\"\r\n #orderColumnsMenu>\r\n <!-- Real sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.sortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n <ng-container *ngIf=\"column.title; else sortByTemplate\">\r\n {{ column.title }}\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <ng-template [ngTemplateOutlet]=\"column.headerTemplate\"></ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n <!-- Fake sorting columns -->\r\n <ng-template\r\n ngFor\r\n let-column\r\n [ngForOf]=\"sorting.fakeSortingColumns\">\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"setSortableColumn(column)\">\r\n {{ column.title }}\r\n </ng-template>\r\n </ng-template>\r\n </fs-menu>\r\n <ng-template #sortedBy>\r\n <ng-container *ngIf=\"sorting.sortingColumn\">\r\n sorted by\r\n <ng-container *ngIf=\"sorting.sortingColumn.title; else sortByTemplate\">\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n {{ sorting.sortingColumn.title }}\r\n </a>\r\n ,\r\n </ng-container>\r\n <ng-template #sortByTemplate>\r\n <a\r\n class=\"order-toggle\"\r\n [fsMenuTriggerFor]=\"orderColumnsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"sorting.sortingColumn.headerTemplate\"></ng-template>\r\n </a>\r\n ,\r\n </ng-template>\r\n <a\r\n class=\"order-toggle\"\r\n (click)=\"toggleDirection()\">\r\n {{ sorting.sortingColumn.fullNameDirection }}\r\n </a>\r\n </ng-container>\r\n </ng-template>\r\n </small>\r\n</div>", styles: [":host.hidden-mobile{display:none!important}:host.first-load .status{visibility:hidden}.order-toggle{white-space:nowrap}a{cursor:pointer}mat-spinner{display:inline-block;margin:0 2px;vertical-align:middle}\n"] }]
5340
5349
  }], propDecorators: { list: [{
5341
5350
  type: Input
5342
5351
  }], rows: [{
@@ -5747,12 +5756,12 @@ class FsListComponent {
5747
5756
  const namespace = getNormalizedPath(this._location);
5748
5757
  this._persistance.setConfig(persistConfig, namespace, this._inDialog);
5749
5758
  }
5750
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListComponent, deps: [{ token: ReorderController }, { token: FS_LIST_DEFAULT_CONFIG, optional: true }, { token: i1$2.MatDialogRef, optional: true }, { token: i3$2.DrawerRef, optional: true }, { token: i0.ElementRef }, { token: i4$2.SelectionDialog }, { token: i1$2.MatDialog }, { token: i0.ChangeDetectorRef }, { token: GroupExpandNotifierService }, { token: i6.Router }, { token: i6.ActivatedRoute }, { token: PersistanceController }, { token: i1.Location }], target: i0.ɵɵFactoryTarget.Component });
5759
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListComponent, deps: [{ token: ReorderController }, { token: FS_LIST_DEFAULT_CONFIG, optional: true }, { token: i1$2.MatDialogRef, optional: true }, { token: i3$3.DrawerRef, optional: true }, { token: i0.ElementRef }, { token: i4$2.SelectionDialog }, { token: i1$2.MatDialog }, { token: i0.ChangeDetectorRef }, { token: GroupExpandNotifierService }, { token: i6.Router }, { token: i6.ActivatedRoute }, { token: PersistanceController }, { token: i1.Location }], target: i0.ɵɵFactoryTarget.Component });
5751
5760
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsListComponent, selector: "fs-list", inputs: { config: "config", loaderLines: "loaderLines" }, outputs: { filtersReady: "filtersReady" }, host: { properties: { "class.fs-list": "this.classFsList", "class.fs-list-row-highlight": "this.rowHoverHighlight" } }, providers: [
5752
5761
  GroupExpandNotifierService,
5753
5762
  PersistanceController,
5754
5763
  ReorderController,
5755
- ], queries: [{ propertyName: "headingTemplate", first: true, predicate: FsListHeadingDirective, descendants: true, read: TemplateRef }, { propertyName: "headingContainerTemplate", first: true, predicate: FsListHeadingContainerDirective, descendants: true, read: TemplateRef }, { propertyName: "subheadingTemplate", first: true, predicate: FsListSubheadingDirective, descendants: true, read: TemplateRef }, { propertyName: "_emptyStateTemplate", first: true, predicate: FsListEmptyStateDirective, descendants: true, read: TemplateRef }, { propertyName: "columnTemplates", predicate: FsListColumnDirective }], viewQueries: [{ propertyName: "body", first: true, predicate: FsBodyComponent, descendants: true }, { propertyName: "filterReference", first: true, predicate: FilterComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"fs-list-container\"\n [ngClass]=\"{\n 'has-filter-keyword': hasFilterKeyword,\n 'has-filters': list.filterConfig?.items.length,\n 'has-heading': list.heading || headingTemplate,\n 'has-status': hasStatus,\n 'has-chips': list.chips,\n 'has-actions': list.actions.hasActions,\n 'has-row-actions-hover': list.rowActionsHover,\n 'first-load': firstLoad,\n 'loading': list.loading$ | async\n }\">\n <ng-template [ngTemplateOutlet]=\"listContainerContent\"></ng-template>\n</div>\n<ng-template #listContainerContent>\n <ng-container *ngIf=\"list.dataController.visibleRows$ | async as listData\">\n <div class=\"fs-list-header-container\">\n <div\n class=\"fs-list-header\"\n [ngClass]=\"{ 'no-wrap': reorderController.manualReorderActivated || !list.filterConfig?.items.length }\">\n <ng-container\n *ngIf=\"hasFilterKeyword\"\n [ngTemplateOutlet]=\"heading\">\n </ng-container>\n @if (list.filterConfig) {\n <fs-filter\n class=\"fs-list-filter\"\n [filter]=\"list.filterConfig\"\n [showSortBy]=\"!list.status\"\n [showFilterInput]=\"list.filterInput\"\n (ready)=\"filterReady()\">\n <ng-template fsFilterStatusBar>\n <ng-container\n *ngIf=\"!hasFilterKeyword\"\n [ngTemplateOutlet]=\"heading\">\n </ng-container>\n <ng-container *ngIf=\"hasStatus\">\n <fs-list-status\n class=\"fs-list-status\"\n [ngClass]=\"{ 'hidden-mobile': !list.status }\"\n [rows]=\"listData\"\n [list]=\"list\"\n [firstLoad]=\"firstLoad\">\n </fs-list-status>\n </ng-container>\n </ng-template>\n </fs-filter>\n }\n </div>\n </div>\n <ng-content select=\"[fs-list-content]\"></ng-content>\n <!-- Table implementation -->\n <div class=\"fs-list-table-container\">\n <ng-container *ngIf=\"!firstLoad && listData.length > 0 && !list.emptyStateEnabled\">\n <table\n class=\"fs-list-table\"\n role=\"grid\"\n [fsListContentInit]=\"list.afterContentInit\"\n [ngClass]=\"{\n 'style-card': list.style === 'card',\n 'style-basic': list.style === 'basic',\n 'style-line': (list.style || 'line') === 'line'\n }\">\n <thead\n fs-list-head\n class=\"fs-list-head\"\n role=\"rowgroup\"\n *ngIf=\"list.columns.hasHeader\"\n [ngClass]=\"list.columns.theadClass\"\n [columns]=\"list.columns.visibleColumns$ | async\"\n [sorting]=\"list.sorting\"\n [selection]=\"list.selection\"\n [hasRowActions]=\"list.hasRowActions\"\n [activeFiltersCount]=\"list.activeFiltersCount$ | async\"\n [reorderEnabled]=\"reorderController.enabled$ | async\"\n [reorderPosition]=\"reorderController.position$ | async\"\n [reorderStrategy]=\"reorderController.strategy$ | async\">\n </thead>\n <tbody\n fs-list-body\n fsListDraggableList\n class=\"fs-list-body\"\n role=\"rowgroup\"\n [class.disabled]=\"!!(reorderController.reorderDisabled$ | async)\"\n [rows]=\"listData\"\n [rowActionsRaw]=\"list.rowActionsRaw\"\n [groupActionsRaw]=\"list.groupActionsRaw\"\n [hasRowActions]=\"list.hasRowActions\"\n [rowEvents]=\"list.rowEvents\"\n [rowClass]=\"list.rowClass\"\n [columns]=\"list.columns.visibleColumns$ | async\"\n [restoreMode]=\"list.restoreMode\"\n [selection]=\"list.selection\"\n [rowRemoved]=\"rowRemoved\"\n [activeFiltersCount]=\"list.activeFiltersCount$ | async\"\n [reorderEnabled]=\"reorderController.enabled$ | async\"\n [reorderPosition]=\"reorderController.position$ | async\"\n [reorderStrategy]=\"reorderController.strategy$ | async\"\n [reorderMultiple]=\"reorderController.multiple\">\n </tbody>\n <tfoot\n fs-list-footer\n class=\"fs-list-footer\"\n *ngIf=\"list.columns.hasFooter\"\n [columns]=\"list.columns.visibleColumns$ | async\"\n [selection]=\"list.selection\"\n [hasRowActions]=\"list.hasRowActions\"\n [activeFiltersCount]=\"list.activeFiltersCount$ | async\"\n [reorderEnabled]=\"reorderController.enabled$ | async\"\n [reorderPosition]=\"reorderController.position$ | async\"\n [reorderStrategy]=\"reorderController.strategy$ | async\">\n </tfoot>\n </table>\n </ng-container>\n <fs-list-loader\n *ngIf=\"firstLoad\"\n [columns]=\"list.columns.columns\"\n [loaderLines]=\"loaderLines\">\n </fs-list-loader>\n </div>\n <fs-list-pagination\n class=\"fs-list-pagination\"\n [rows]=\"listData\"\n [pagination]=\"list.paging\">\n </fs-list-pagination>\n <ng-container *ngIf=\"!firstLoad\">\n <div\n *ngIf=\"listData.length === 0\"\n class=\"fs-list-no-results-container\">\n <div\n *ngIf=\"list.noResults?.message && !list.emptyStateEnabled\"\n class=\"fs-list-no-results\">\n {{ list.noResults?.message }}\n </div>\n <ng-container *ngIf=\"list.emptyStateEnabled\">\n <ng-template [ngTemplateOutlet]=\"list.emptyStateTemplate\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #heading>\n <div\n class=\"heading-container\"\n *ngIf=\"headingContainerTemplate || list.heading || list.subheading || headingTemplate\">\n <ng-container *ngIf=\"headingContainerTemplate; else headingContainer\">\n <ng-container\n [ngTemplateOutlet]=\"headingContainerTemplate\"\n [ngTemplateOutletContext]=\"{ template: headingContainer }\">\n </ng-container>\n </ng-container>\n <ng-template #headingContainer>\n <h2\n class=\"heading\"\n *ngIf=\"list.heading || headingTemplate\">\n {{ list.heading }}\n <ng-container [ngTemplateOutlet]=\"headingTemplate\"></ng-container>\n </h2>\n <div\n class=\"small subheading\"\n *ngIf=\"list.subheading || subheadingTemplate\">\n {{ list.subheading }}\n <ng-container [ngTemplateOutlet]=\"subheadingTemplate\"></ng-container>\n </div>\n </ng-template>\n </div>\n</ng-template>", styles: [":host{display:block;width:100%}:host ::ng-deep .fs-list-swap-restricted{opacity:.5}:host ::ng-deep .fs-list-no-drop{cursor:no-drop}:host ::ng-deep .hidden{display:none}:host ::ng-deep .multiple-selection{background-color:#2196f380}:host ::ng-deep .multiple-selection ::ng-deep .fs-list-col{background-color:#2196f380}@media print{:host ::ng-deep .fs-list-row-group{page-break-after:avoid}:host ::ng-deep .fs-list-row-group-child{page-break-before:avoid}:host ::ng-deep .fs-list-row-group-footer{page-break-before:avoid}}.fs-list-container{width:100%}.fs-list-container:not(.has-filters):not(.has-actions):not(.has-heading) .fs-list-header-container{display:none}.fs-list-container:not(.has-filter-keyword) .fs-list-header{display:flex;margin-bottom:4px}.fs-list-container:not(.has-filter-keyword) .fs-list-header .heading-container{flex:1}.fs-list-container:not(.has-filter-keyword) .fs-list-header fs-filter{display:flex}.fs-list-container.has-filters .heading-container{margin-bottom:4px}.fs-list-container.loading .fs-list-status,.fs-list-container.loading .fs-list-body,.fs-list-container.loading .fs-list-head,.fs-list-container.loading .fs-list-footer,.fs-list-container.loading fs-list-pagination,.fs-list-container.loading ::ng-deep fs-filter-chips,.fs-list-container.loading .fs-list-no-results-container,.fs-list-container.first-load .fs-list-status,.fs-list-container.first-load .fs-list-body,.fs-list-container.first-load .fs-list-head,.fs-list-container.first-load .fs-list-footer,.fs-list-container.first-load fs-list-pagination,.fs-list-container.first-load ::ng-deep fs-filter-chips,.fs-list-container.first-load .fs-list-no-results-container{opacity:.4;pointer-events:none}.fs-list-container.first-load ::ng-deep fs-filter-chips .fs-chip{color:transparent}.fs-list-container.first-load ::ng-deep fs-filter-chips .fs-chip .remove{visibility:hidden}.fs-list-container.has-actions .fs-list-actions{margin-left:5px}@media screen and (min-width: 800px){.fs-list-container.has-row-actions-hover ::ng-deep .actions-col{width:0px;position:relative;overflow:visible;padding:0}.fs-list-container.has-row-actions-hover ::ng-deep .actions-col fs-list-row-actions{display:none;position:absolute;border-radius:5px;top:50%;right:5px;transform:translateY(-50%)}.fs-list-container.has-row-actions-hover ::ng-deep .actions-col fs-list-row-actions .mat-mdc-button-base{background:#fefefe;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.fs-list-container.has-row-actions-hover ::ng-deep tr:hover fs-list-row-actions{display:flex}}.fs-list-container .fs-list-header .heading-container{display:flex;flex-direction:column;justify-content:center}.fs-list-container .fs-list-header .heading{margin:0}.fs-list-container .fs-list-header h2+.subheading{margin:2px 0 0}.fs-list-container .fs-list-filter{margin-bottom:0;position:initial!important;display:block;width:100%}.fs-list-container .fs-list-no-results-container .fs-list-no-results{text-align:center;color:#999;padding:10px 0}.fs-list-container .fs-list-table-container{width:100%;overflow-x:auto;overflow-y:hidden}::ng-deep .fs-list-table{border-spacing:0;display:table;width:100%;border-collapse:collapse}::ng-deep .fs-list-table thead{display:table-header-group}::ng-deep .fs-list-table thead th{color:#999;padding:8px;font-weight:400;color:#8f8f8f;font-size:85%;text-align:left}::ng-deep .fs-list-table tbody{display:table-row-group;position:relative}::ng-deep .fs-list-table tbody tr,::ng-deep .fs-list-table thead tr,::ng-deep .fs-list-table tfoot tr{display:table-row}::ng-deep .fs-list-table tbody tr td,::ng-deep .fs-list-table thead tr td,::ng-deep .fs-list-table tfoot tr td{display:table-cell;padding:8px;vertical-align:middle;outline:none;text-align:left}::ng-deep .fs-list-table tfoot td{padding:8px}::ng-deep .fs-list-table.style-line tbody .fs-list-col,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) tbody .fs-list-col{box-sizing:border-box;border-top:1px solid #e7e7e7}::ng-deep .fs-list-table.style-line tbody .fs-list-row:first-child .fs-list-col,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) tbody .fs-list-row:first-child .fs-list-col{border-color:#c4c4c4}::ng-deep .fs-list-table.style-line tbody .fs-list-row:last-child .fs-list-col,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) tbody .fs-list-row:last-child .fs-list-col{border-bottom:1px solid #c4c4c4}::ng-deep .fs-list-table.style-line .fs-list-container.has-dragging thead th,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) .fs-list-container.has-dragging thead th{border-color:#e7e7e7}::ng-deep .fs-list-table.style-line .fs-list-container.has-dragging tbody tr:nth-child(2) td,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) .fs-list-container.has-dragging tbody tr:nth-child(2) td{border-top:none}::ng-deep .fs-list-table.style-card tbody tr:not(.fs-list-row-group-footer):not(.fs-list-row-group){clip-path:xywh(0 3px 100% calc(100% - 6px) round 10px)}::ng-deep .fs-list-table.style-card tbody tr td{border:none!important;background-color:#fafafa;padding:8px 16px}::ng-deep .fs-list-preview-block{position:fixed;height:30px;width:200px;background:gray;display:flex;justify-content:center;align-items:center;z-index:1000;box-shadow:2px 2px 2px #9e9e9ea6;border-radius:6px}::ng-deep .reorder-in-progress{-webkit-user-select:none;user-select:none}@media only screen and (max-width: 600px){::ng-deep .fs-list-filter .inline-actions{top:initial!important;position:initial!important}::ng-deep .fs-list-filter .inline-actions .action-filter{margin-bottom:0!important}::ng-deep .fs-list-header .filter-input-field .mat-form-field-wrapper{padding:0!important}::ng-deep .fs-list-header.has-filters{flex-flow:row wrap}}@media only screen and (max-width: 768px){::ng-deep .show-mobile{display:inline-block!important}::ng-deep .fs-list-actions .action-button{display:none}::ng-deep .row-inline-action.mobile-hide{display:none}::ng-deep .hidden-mobile-menu-action{display:block!important}}:host(.fs-list-row-highlight) ::ng-deep tbody .fs-list-row:hover .fs-list-col{background-color:#f6f6f6}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$1.FilterComponent, selector: "fs-filter", inputs: ["config", "filter", "showSortBy", "showFilterInput"], outputs: ["closed", "opened", "ready"] }, { kind: "directive", type: i2$1.FilterStatusBarDirective, selector: "[fsFilterStatusBar]" }, { kind: "component", type: FsStatusComponent, selector: "fs-list-status", inputs: ["list", "rows", "firstLoad"] }, { kind: "component", type: FsListLoaderComponent, selector: "fs-list-loader", inputs: ["columns", "loaderLines"] }, { kind: "component", type: FsHeadComponent, selector: "[fs-list-head]", inputs: ["sorting", "columns", "hasRowActions", "selection", "activeFiltersCount", "reorderEnabled", "reorderPosition", "reorderStrategy"] }, { kind: "component", type: FsBodyComponent, selector: "[fs-list-body]", inputs: ["rows", "columns", "hasFooter", "rowActionsRaw", "groupActionsRaw", "rowEvents", "rowClass", "hasRowActions", "selection", "restoreMode", "rowRemoved", "activeFiltersCount", "reorderEnabled", "reorderPosition", "reorderStrategy", "reorderMultiple"] }, { kind: "component", type: FsFooterComponent, selector: "[fs-list-footer]", inputs: ["hasRowActions", "columns", "selection", "activeFiltersCount", "reorderEnabled", "reorderPosition", "reorderStrategy"] }, { kind: "component", type: FsPaginationComponent, selector: "fs-list-pagination", inputs: ["pagination", "rows"] }, { kind: "directive", type: FsListFooterDirective, selector: "[fs-list-footer]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: FsListDraggableListDirective, selector: "[fsListDraggableList]", inputs: ["rows"] }, { kind: "directive", type: FsListContentInitDirective, selector: "[fsListContentInit]", inputs: ["fsListContentInit"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5764
+ ], queries: [{ propertyName: "headingTemplate", first: true, predicate: FsListHeadingDirective, descendants: true, read: TemplateRef }, { propertyName: "headingContainerTemplate", first: true, predicate: FsListHeadingContainerDirective, descendants: true, read: TemplateRef }, { propertyName: "subheadingTemplate", first: true, predicate: FsListSubheadingDirective, descendants: true, read: TemplateRef }, { propertyName: "_emptyStateTemplate", first: true, predicate: FsListEmptyStateDirective, descendants: true, read: TemplateRef }, { propertyName: "columnTemplates", predicate: FsListColumnDirective }], viewQueries: [{ propertyName: "body", first: true, predicate: FsBodyComponent, descendants: true }, { propertyName: "filterReference", first: true, predicate: FilterComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"fs-list-container\"\n [ngClass]=\"{\n 'has-filter-keyword': hasFilterKeyword,\n 'has-filters': list.filterConfig?.items.length,\n 'has-heading': list.heading || headingTemplate,\n 'has-status': hasStatus,\n 'has-chips': list.chips,\n 'has-actions': list.actions.hasActions,\n 'has-row-actions-hover': list.rowActionsHover,\n 'first-load': firstLoad,\n 'loading': list.loading$ | async\n }\">\n <ng-template [ngTemplateOutlet]=\"listContainerContent\"></ng-template>\n</div>\n<ng-template #listContainerContent>\n <ng-container *ngIf=\"list.dataController.visibleRows$ | async as listData\">\n <div class=\"fs-list-header-container\">\n <div\n class=\"fs-list-header\"\n [ngClass]=\"{ 'no-wrap': reorderController.manualReorderActivated || !list.filterConfig?.items.length }\">\n <ng-container\n *ngIf=\"hasFilterKeyword\"\n [ngTemplateOutlet]=\"heading\">\n </ng-container>\n @if (list.filterConfig) {\n <fs-filter\n class=\"fs-list-filter\"\n [filter]=\"list.filterConfig\"\n [showSortBy]=\"!list.status\"\n [showFilterInput]=\"list.filterInput\"\n (ready)=\"filterReady()\">\n <ng-template fsFilterStatusBar>\n <ng-container\n *ngIf=\"!hasFilterKeyword\"\n [ngTemplateOutlet]=\"heading\">\n </ng-container>\n <ng-container *ngIf=\"hasStatus\">\n <fs-list-status\n class=\"fs-list-status\"\n [ngClass]=\"{ 'hidden-mobile': !list.status }\"\n [rows]=\"listData\"\n [list]=\"list\"\n [firstLoad]=\"firstLoad\">\n </fs-list-status>\n </ng-container>\n </ng-template>\n </fs-filter>\n }\n </div>\n </div>\n <ng-content select=\"[fs-list-content]\"></ng-content>\n <!-- Table implementation -->\n <div class=\"fs-list-table-container\">\n <ng-container *ngIf=\"!firstLoad && listData.length > 0 && !list.emptyStateEnabled\">\n <table\n class=\"fs-list-table\"\n role=\"grid\"\n [fsListContentInit]=\"list.afterContentInit\"\n [ngClass]=\"{\n 'style-card': list.style === 'card',\n 'style-basic': list.style === 'basic',\n 'style-line': (list.style || 'line') === 'line'\n }\">\n <thead\n fs-list-head\n class=\"fs-list-head\"\n role=\"rowgroup\"\n *ngIf=\"list.columns.hasHeader\"\n [ngClass]=\"list.columns.theadClass\"\n [columns]=\"list.columns.visibleColumns$ | async\"\n [sorting]=\"list.sorting\"\n [selection]=\"list.selection\"\n [hasRowActions]=\"list.hasRowActions\"\n [activeFiltersCount]=\"list.activeFiltersCount$ | async\"\n [reorderEnabled]=\"reorderController.enabled$ | async\"\n [reorderPosition]=\"reorderController.position$ | async\"\n [reorderStrategy]=\"reorderController.strategy$ | async\">\n </thead>\n <tbody\n fs-list-body\n fsListDraggableList\n class=\"fs-list-body\"\n role=\"rowgroup\"\n [class.disabled]=\"!!(reorderController.reorderDisabled$ | async)\"\n [rows]=\"listData\"\n [rowActionsRaw]=\"list.rowActionsRaw\"\n [groupActionsRaw]=\"list.groupActionsRaw\"\n [hasRowActions]=\"list.hasRowActions\"\n [rowEvents]=\"list.rowEvents\"\n [rowClass]=\"list.rowClass\"\n [columns]=\"list.columns.visibleColumns$ | async\"\n [restoreMode]=\"list.restoreMode\"\n [selection]=\"list.selection\"\n [rowRemoved]=\"rowRemoved\"\n [activeFiltersCount]=\"list.activeFiltersCount$ | async\"\n [reorderEnabled]=\"reorderController.enabled$ | async\"\n [reorderPosition]=\"reorderController.position$ | async\"\n [reorderStrategy]=\"reorderController.strategy$ | async\"\n [reorderMultiple]=\"reorderController.multiple\">\n </tbody>\n <tfoot\n fs-list-footer\n class=\"fs-list-footer\"\n *ngIf=\"list.columns.hasFooter\"\n [columns]=\"list.columns.visibleColumns$ | async\"\n [selection]=\"list.selection\"\n [hasRowActions]=\"list.hasRowActions\"\n [activeFiltersCount]=\"list.activeFiltersCount$ | async\"\n [reorderEnabled]=\"reorderController.enabled$ | async\"\n [reorderPosition]=\"reorderController.position$ | async\"\n [reorderStrategy]=\"reorderController.strategy$ | async\">\n </tfoot>\n </table>\n </ng-container>\n <fs-list-loader\n *ngIf=\"firstLoad\"\n [columns]=\"list.columns.columns\"\n [loaderLines]=\"loaderLines\">\n </fs-list-loader>\n </div>\n <fs-list-pagination\n class=\"fs-list-pagination\"\n [rows]=\"listData\"\n [pagination]=\"list.paging\">\n </fs-list-pagination>\n <ng-container *ngIf=\"!firstLoad\">\n <div\n *ngIf=\"listData.length === 0\"\n class=\"fs-list-no-results-container\">\n <div\n *ngIf=\"list.noResults?.message && !list.emptyStateEnabled\"\n class=\"fs-list-no-results\">\n {{ list.noResults?.message }}\n </div>\n <ng-container *ngIf=\"list.emptyStateEnabled\">\n <ng-template [ngTemplateOutlet]=\"list.emptyStateTemplate\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #heading>\n <div\n class=\"heading-container\"\n *ngIf=\"headingContainerTemplate || list.heading || list.subheading || headingTemplate\">\n <ng-container *ngIf=\"headingContainerTemplate; else headingContainer\">\n <ng-container\n [ngTemplateOutlet]=\"headingContainerTemplate\"\n [ngTemplateOutletContext]=\"{ template: headingContainer }\">\n </ng-container>\n </ng-container>\n <ng-template #headingContainer>\n <h2\n class=\"heading\"\n *ngIf=\"list.heading || headingTemplate\">\n {{ list.heading }}\n <ng-container [ngTemplateOutlet]=\"headingTemplate\"></ng-container>\n </h2>\n <div\n class=\"small subheading\"\n *ngIf=\"list.subheading || subheadingTemplate\">\n {{ list.subheading }}\n <ng-container [ngTemplateOutlet]=\"subheadingTemplate\"></ng-container>\n </div>\n </ng-template>\n </div>\n</ng-template>", styles: [":host{display:block;width:100%}:host ::ng-deep .fs-list-swap-restricted{opacity:.5}:host ::ng-deep .fs-list-no-drop{cursor:no-drop}:host ::ng-deep .hidden{display:none}:host ::ng-deep .multiple-selection{background-color:#2196f380}:host ::ng-deep .multiple-selection ::ng-deep .fs-list-col{background-color:#2196f380}@media print{:host ::ng-deep .fs-list-row-group{page-break-after:avoid}:host ::ng-deep .fs-list-row-group-child{page-break-before:avoid}:host ::ng-deep .fs-list-row-group-footer{page-break-before:avoid}}.fs-list-container{width:100%}.fs-list-container:not(.has-filters):not(.has-actions):not(.has-heading) .fs-list-header-container{display:none}.fs-list-container:not(.has-filter-keyword) .fs-list-header{display:flex;margin-bottom:4px}.fs-list-container:not(.has-filter-keyword) .fs-list-header .heading-container{flex:1}.fs-list-container:not(.has-filter-keyword) .fs-list-header fs-filter{display:flex}.fs-list-container.has-filters .heading-container{margin-bottom:4px}.fs-list-container.loading .fs-list-status,.fs-list-container.loading .fs-list-body,.fs-list-container.loading .fs-list-head,.fs-list-container.loading .fs-list-footer,.fs-list-container.loading fs-list-pagination,.fs-list-container.loading ::ng-deep fs-filter-chips,.fs-list-container.loading .fs-list-no-results-container,.fs-list-container.first-load .fs-list-status,.fs-list-container.first-load .fs-list-body,.fs-list-container.first-load .fs-list-head,.fs-list-container.first-load .fs-list-footer,.fs-list-container.first-load fs-list-pagination,.fs-list-container.first-load ::ng-deep fs-filter-chips,.fs-list-container.first-load .fs-list-no-results-container{opacity:.4;pointer-events:none}.fs-list-container.first-load ::ng-deep fs-filter-chips .fs-chip{color:transparent}.fs-list-container.first-load ::ng-deep fs-filter-chips .fs-chip .remove{visibility:hidden}.fs-list-container.has-actions .fs-list-actions{margin-left:5px}@media screen and (min-width: 800px){.fs-list-container.has-row-actions-hover ::ng-deep .actions-col{width:0px;position:relative;overflow:visible;padding:0}.fs-list-container.has-row-actions-hover ::ng-deep .actions-col fs-list-row-actions{display:none;position:absolute;border-radius:5px;top:50%;right:5px;transform:translateY(-50%)}.fs-list-container.has-row-actions-hover ::ng-deep .actions-col fs-list-row-actions .mat-mdc-button-base{background:#fefefe;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.fs-list-container.has-row-actions-hover ::ng-deep tr:hover fs-list-row-actions{display:flex}}.fs-list-container .fs-list-header .heading-container{display:flex;flex-direction:column;justify-content:center}.fs-list-container .fs-list-header .heading{margin:0}.fs-list-container .fs-list-header h2+.subheading{margin:2px 0 0}.fs-list-container .fs-list-filter{margin-bottom:0;position:initial!important;display:block;width:100%}.fs-list-container .fs-list-no-results-container .fs-list-no-results{text-align:center;color:#999;padding:10px 0}.fs-list-container .fs-list-table-container{width:100%;overflow-x:auto;overflow-y:hidden}::ng-deep .fs-list-table{border-spacing:0;display:table;width:100%;border-collapse:collapse}::ng-deep .fs-list-table thead{display:table-header-group}::ng-deep .fs-list-table thead th{color:#999;padding:8px;font-weight:400;color:#8f8f8f;font-size:85%;text-align:left}::ng-deep .fs-list-table tbody{display:table-row-group;position:relative}::ng-deep .fs-list-table tbody tr,::ng-deep .fs-list-table thead tr,::ng-deep .fs-list-table tfoot tr{display:table-row}::ng-deep .fs-list-table tbody tr td,::ng-deep .fs-list-table thead tr td,::ng-deep .fs-list-table tfoot tr td{display:table-cell;padding:8px;vertical-align:middle;outline:none;text-align:left}::ng-deep .fs-list-table tfoot td{padding:8px}::ng-deep .fs-list-table.style-line tbody .fs-list-col,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) tbody .fs-list-col{box-sizing:border-box;border-top:1px solid #e7e7e7}::ng-deep .fs-list-table.style-line tbody .fs-list-row:first-child .fs-list-col,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) tbody .fs-list-row:first-child .fs-list-col{border-color:#c4c4c4}::ng-deep .fs-list-table.style-line tbody .fs-list-row:last-child .fs-list-col,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) tbody .fs-list-row:last-child .fs-list-col{border-bottom:1px solid #c4c4c4}::ng-deep .fs-list-table.style-line .fs-list-container.has-dragging thead th,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) .fs-list-container.has-dragging thead th{border-color:#e7e7e7}::ng-deep .fs-list-table.style-line .fs-list-container.has-dragging tbody tr:nth-child(2) td,::ng-deep .fs-list-table:not(.style-card):not(.style-basic) .fs-list-container.has-dragging tbody tr:nth-child(2) td{border-top:none}::ng-deep .fs-list-table.style-card tbody tr:not(.fs-list-row-group-footer):not(.fs-list-row-group){clip-path:xywh(0 3px 100% calc(100% - 6px) round 10px)}::ng-deep .fs-list-table.style-card tbody tr td{border:none!important;background-color:#fafafa;padding:8px 16px}::ng-deep .fs-list-preview-block{position:fixed;height:30px;width:200px;background:gray;display:flex;justify-content:center;align-items:center;z-index:1000;box-shadow:2px 2px 2px #9e9e9ea6;border-radius:6px}::ng-deep .reorder-in-progress{-webkit-user-select:none;user-select:none}@media only screen and (max-width: 600px){::ng-deep .fs-list-filter .inline-actions{top:initial!important;position:initial!important}::ng-deep .fs-list-filter .inline-actions .action-filter{margin-bottom:0!important}::ng-deep .fs-list-header .filter-input-field .mat-form-field-wrapper{padding:0!important}::ng-deep .fs-list-header.has-filters{flex-flow:row wrap}}@media only screen and (max-width: 768px){::ng-deep .show-mobile{display:inline-block!important}::ng-deep .fs-list-actions .action-button{display:none}::ng-deep .row-inline-action.mobile-hide{display:none}::ng-deep .hidden-mobile-menu-action{display:block!important}}:host(.fs-list-row-highlight) ::ng-deep tbody .fs-list-row:hover .fs-list-col{background-color:#f6f6f6}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.FilterComponent, selector: "fs-filter", inputs: ["config", "filter", "showSortBy", "showFilterInput"], outputs: ["closed", "opened", "ready"] }, { kind: "directive", type: i2.FilterStatusBarDirective, selector: "[fsFilterStatusBar]" }, { kind: "component", type: FsStatusComponent, selector: "fs-list-status", inputs: ["list", "rows", "firstLoad"] }, { kind: "component", type: FsListLoaderComponent, selector: "fs-list-loader", inputs: ["columns", "loaderLines"] }, { kind: "component", type: FsHeadComponent, selector: "[fs-list-head]", inputs: ["sorting", "columns", "hasRowActions", "selection", "activeFiltersCount", "reorderEnabled", "reorderPosition", "reorderStrategy"] }, { kind: "component", type: FsBodyComponent, selector: "[fs-list-body]", inputs: ["rows", "columns", "hasFooter", "rowActionsRaw", "groupActionsRaw", "rowEvents", "rowClass", "hasRowActions", "selection", "restoreMode", "rowRemoved", "activeFiltersCount", "reorderEnabled", "reorderPosition", "reorderStrategy", "reorderMultiple"] }, { kind: "component", type: FsFooterComponent, selector: "[fs-list-footer]", inputs: ["hasRowActions", "columns", "selection", "activeFiltersCount", "reorderEnabled", "reorderPosition", "reorderStrategy"] }, { kind: "component", type: FsPaginationComponent, selector: "fs-list-pagination", inputs: ["pagination", "rows"] }, { kind: "directive", type: FsListFooterDirective, selector: "[fs-list-footer]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: FsListDraggableListDirective, selector: "[fsListDraggableList]", inputs: ["rows"] }, { kind: "directive", type: FsListContentInitDirective, selector: "[fsListContentInit]", inputs: ["fsListContentInit"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5756
5765
  }
5757
5766
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListComponent, decorators: [{
5758
5767
  type: Component,
@@ -5768,7 +5777,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
5768
5777
  args: [FS_LIST_DEFAULT_CONFIG]
5769
5778
  }] }, { type: i1$2.MatDialogRef, decorators: [{
5770
5779
  type: Optional
5771
- }] }, { type: i3$2.DrawerRef, decorators: [{
5780
+ }] }, { type: i3$3.DrawerRef, decorators: [{
5772
5781
  type: Optional
5773
5782
  }] }, { type: i0.ElementRef }, { type: i4$2.SelectionDialog }, { type: i1$2.MatDialog }, { type: i0.ChangeDetectorRef }, { type: GroupExpandNotifierService }, { type: i6.Router }, { type: i6.ActivatedRoute }, { type: PersistanceController }, { type: i1.Location }], propDecorators: { classFsList: [{
5774
5783
  type: HostBinding,
@@ -5865,13 +5874,13 @@ class FsListManageSavedFiltersComponent {
5865
5874
  },
5866
5875
  };
5867
5876
  }
5868
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListManageSavedFiltersComponent, deps: [{ token: i2$1.ExternalParamsController }], target: i0.ɵɵFactoryTarget.Component });
5877
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListManageSavedFiltersComponent, deps: [{ token: i2.ExternalParamsController }], target: i0.ɵɵFactoryTarget.Component });
5869
5878
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsListManageSavedFiltersComponent, selector: "ng-component", ngImport: i0, template: "<h1 mat-dialog-title>\r\n Manage Saved Filters\r\n</h1>\r\n<div mat-dialog-content>\r\n <fs-list [config]=\"config\">\r\n <fs-list-column name=\"name\" title=\"Name\">\r\n <ng-template fs-list-cell let-row=\"row\">\r\n {{ row.name }}\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list>\r\n</div>\r\n<div mat-dialog-actions>\r\n <button mat-button\r\n [mat-dialog-close]=\"null\"\r\n type=\"button\"\r\n color=\"primary\">\r\n Done\r\n </button>\r\n</div>\r\n", dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1$2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5870
5879
  }
5871
5880
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListManageSavedFiltersComponent, decorators: [{
5872
5881
  type: Component,
5873
5882
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<h1 mat-dialog-title>\r\n Manage Saved Filters\r\n</h1>\r\n<div mat-dialog-content>\r\n <fs-list [config]=\"config\">\r\n <fs-list-column name=\"name\" title=\"Name\">\r\n <ng-template fs-list-cell let-row=\"row\">\r\n {{ row.name }}\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list>\r\n</div>\r\n<div mat-dialog-actions>\r\n <button mat-button\r\n [mat-dialog-close]=\"null\"\r\n type=\"button\"\r\n color=\"primary\">\r\n Done\r\n </button>\r\n</div>\r\n" }]
5874
- }], ctorParameters: () => [{ type: i2$1.ExternalParamsController }] });
5883
+ }], ctorParameters: () => [{ type: i2.ExternalParamsController }] });
5875
5884
 
5876
5885
  class FsListContentDirective {
5877
5886
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsListContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });