ngx-techlify-core 18.72.1 → 18.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (19) hide show
  1. package/esm2022/lib/app-admin/admin-role/admin-role-list/admin-role-list.component.mjs +2 -2
  2. package/esm2022/lib/base-model/index.mjs +3 -2
  3. package/esm2022/lib/base-model/techlify-list/techlify-list.component.mjs +277 -0
  4. package/esm2022/lib/base-model/techlify-list/techlify-list.contract.spec.mjs +85 -0
  5. package/esm2022/lib/searchable-selector/searchable-selector.component.mjs +5 -5
  6. package/esm2022/lib/subscription/subscription-listing/subscription-listing.component.mjs +2 -2
  7. package/esm2022/lib/subscription/subscription-package-listing/subscription-package-listing.component.mjs +2 -2
  8. package/esm2022/lib/techlify-view/my-techlify-view-listing/my-techlify-view-listing.component.mjs +2 -2
  9. package/fesm2022/ngx-techlify-core.mjs +90 -6
  10. package/fesm2022/ngx-techlify-core.mjs.map +1 -1
  11. package/lib/app-admin/admin-role/admin-role-list/admin-role-list.component.d.ts +1 -1
  12. package/lib/base-model/index.d.ts +2 -1
  13. package/lib/base-model/{techlify-list.component.d.ts → techlify-list/techlify-list.component.d.ts} +3 -3
  14. package/lib/base-model/techlify-list/techlify-list.contract.spec.d.ts +10 -0
  15. package/lib/subscription/subscription-listing/subscription-listing.component.d.ts +1 -1
  16. package/lib/subscription/subscription-package-listing/subscription-package-listing.component.d.ts +1 -1
  17. package/lib/techlify-view/my-techlify-view-listing/my-techlify-view-listing.component.d.ts +1 -1
  18. package/package.json +1 -1
  19. package/esm2022/lib/base-model/techlify-list.component.mjs +0 -277
@@ -2,7 +2,7 @@ import { __decorate } from "tslib";
2
2
  import { Component } from '@angular/core';
3
3
  import { debounceTime, finalize } from 'rxjs';
4
4
  import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
5
- import { TechlifyListComponent } from '../../../base-model/techlify-list.component';
5
+ import { TechlifyListComponent } from '../../../base-model/techlify-list/techlify-list.component';
6
6
  import { ActionPopupComponent } from '../../../action-popup';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "../admin-role.service";
@@ -113,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
113
113
  type: Component,
114
114
  args: [{ selector: 'app-admin-role-list', template: "<div fxLayout=\"column\" class=\"m-2\">\n <mat-card appearance=\"outlined\" fxLayout fxLayoutGap=\"0.5rem\" fxLayoutAlign=\"start center\">\n <div fxLayout fxLayoutAlign=\"start center\">\n <h5 class=\"m-0\">Global Roles</h5>\n <app-role-form-button (success)=\"reload()\" class=\"mt-2\"></app-role-form-button>\n </div>\n </mat-card>\n <mat-card appearance=\"outlined\" class=\"mt-2\">\n <table mat-table matSort [dataSource]=\"models\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" (matSortChange)=\"sortColumn($event)\">\n\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let role; let i = index\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> Label </th>\n <td mat-cell *matCellDef=\"let role\">\n <span>{{role?.label }}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> Description </th>\n <td mat-cell *matCellDef=\"let role\">\n <span>{{role?.description }}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"permissions_count\">\n <th mat-header-cell *matHeaderCellDef> Permissions </th>\n <td mat-cell *matCellDef=\"let role\">\n <div>{{role?.permissions_count}}</div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let role\">\n <div class=\"text-secondary\" fxLayoutAlign=\"start center\">\n <app-admin-role-permission-form (success)=\"reload()\" [roleInfo]=\"role\"\n class=\"text-muted\"></app-admin-role-permission-form>\n <app-techlify-icon name=\"view\" matTooltip=\"View\" [routerLink]=\"['/admin/role-view',role?.id]\"\n class=\"clickable ml-1\"></app-techlify-icon>\n </div>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </mat-card>\n</div>" }]
115
115
  }], ctorParameters: () => [{ type: i1.AdminRoleService }, { type: i2.FilterService }, { type: i3.ActivatedRoute }, { type: i4.UntypedFormBuilder }, { type: i5.MatDialog }, { type: i6.NgxSpinnerService }] });
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tcm9sZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvYXBwLWFkbWluL2FkbWluLXJvbGUvYWRtaW4tcm9sZS1saXN0L2FkbWluLXJvbGUtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2FwcC1hZG1pbi9hZG1pbi1yb2xlL2FkbWluLXJvbGUtbGlzdC9hZG1pbi1yb2xlLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUtyRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVwRixPQUFPLEVBQWUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRbkUsSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBdUIsU0FBUSxxQkFBcUI7SUFXL0QsWUFDVSxXQUE2QixFQUM3QixhQUE0QixFQUM1QixjQUE4QixFQUM5QixFQUFzQixFQUN0QixNQUFpQixFQUNqQixjQUFpQztRQUV6QyxLQUFLLEVBQUUsQ0FBQztRQVBBLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixtQkFBYyxHQUFk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IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbmFsaXplIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBOZ3hTcGlubmVyU2VydmljZSB9IGZyb20gJ25neC1zcGlubmVyJztcbmltcG9ydCB7IEFkbWluUm9sZVNlcnZpY2UgfSBmcm9tICcuLi9hZG1pbi1yb2xlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGVjaGxpZnlMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYmFzZS1tb2RlbC90ZWNobGlmeS1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9maWx0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBY3Rpb25Qb3B1cCwgQWN0aW9uUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9hY3Rpb24tcG9wdXAnO1xuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hZG1pbi1yb2xlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRtaW4tcm9sZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWRtaW4tcm9sZS1saXN0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQWRtaW5Sb2xlTGlzdENvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgZmlsdGVyRm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtcbiAgICAnaW5kZXgnLFxuICAgICdsYWJlbCcsXG4gICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAncGVybWlzc2lvbnNfY291bnQnLFxuICAgICdhY3Rpb25zJyxcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvbGVTZXJ2aWNlOiBBZG1pblJvbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHNwaW5uZXJTZXJ2aWNlOiBOZ3hTcGlubmVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHNlYXJjaDogWycnXSxcbiAgICAgIGlzX2dsb2JhbDogW3RydWVdLFxuICAgICAgc29ydF9ieTogWycnXSxcbiAgICAgIHdpdGhDb3VudDogWydwZXJtaXNzaW9ucyddLFxuICAgICAgbG9hZFBlcm1pc3Npb25zOiBbdHJ1ZV1cbiAgICB9KTtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYXRjaEZpbHRlcnMoKTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgdGhpcy5saXN0ZW5Gb3JDaGFuZ2VzKCk7XG4gIH1cblxuICBsaXN0ZW5Gb3JDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIHVudGlsRGVzdHJveWVkKHRoaXMpKVxuICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UuYXBwbHlGaWx0ZXJUb1JvdXRlKFxuICAgICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcGF0Y2hGaWx0ZXJzKCkge1xuICAgIGxldCByb3V0ZUZpbHRlcnMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0RmlsdGVyc0Zyb21Sb3V0ZShcbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUsXG4gICAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZVxuICAgICk7XG4gICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAuc2V0VmFsdWUocm91dGVGaWx0ZXJzKTtcbiAgfVxuXG5cbiAgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XG4gICAgY29uc3QgZmlsdGVycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXJGb3JtR3JvdXAudmFsdWUpKTtcbiAgICBmaWx0ZXJzLnBhZ2UgPSB0aGlzLnBhZ2U7XG4gICAgdGhpcy5yb2xlU2VydmljZS5pbmRleChmaWx0ZXJzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpKVxuICAgICAgKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXM/Lmxhc3RfcGFnZSB8fCB0aGlzLnBhZ2U7XG4gICAgICAgIGlmIChyZXM/LmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5tb2RlbHMuY29uY2F0KHJlcy5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBzb3J0Q29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBldmVudC5kaXJlY3Rpb24udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMubW9kZWxzID0gW107XG4gICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAuZ2V0KCdzb3J0X2J5Jykuc2V0VmFsdWUoYCR7ZXZlbnQ/LmFjdGl2ZX18JHtkaXJlY3Rpb259YCk7XG4gIH1cblxuICAvL0Fic3RyYWN0IGltcGxlbWVudGF0aW9uXG4gIGVkaXRGb3JtKG1vZGVsOiBhbnkpOiB2b2lkIHtcblxuICB9XG5cbiAgZGVsZXRlRm9ybShtb2RlbDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Qb3B1cENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6IFwiNDAwcHhcIixcbiAgICAgIGRhdGE6IDxBY3Rpb25Qb3B1cD57XG4gICAgICAgIHRpdGxlOiBcIkRlbGV0ZSBDb250cmlidXRpb24gVHlwZVwiLFxuICAgICAgICBtZXNzYWdlOiBgRGVsZXRpbmcgdGhpcyBDb250cmlidXRpb24gVHlwZSBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/YFxuICAgICAgfSxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2VcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhc3luYyByZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvL0FjdGlvbiBjb25maXJtZWRcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XG4gICAgICAgIHRoaXMucm9sZVNlcnZpY2VcbiAgICAgICAgICAuZGVsZXRlKG1vZGVsKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCkpXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKF86IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscy5maWx0ZXIoeCA9PiB4LmlkICE9PSBtb2RlbC5pZCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG5cbn1cbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBjbGFzcz1cIm0tMlwiPlxuICAgIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIiBmeExheW91dCBmeExheW91dEdhcD1cIjAuNXJlbVwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgICAgPGRpdiBmeExheW91dCBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtLTBcIj5HbG9iYWwgUm9sZXM8L2g1PlxuICAgICAgICAgICAgPGFwcC1yb2xlLWZvcm0tYnV0dG9uIChzdWNjZXNzKT1cInJlbG9hZCgpXCIgY2xhc3M9XCJtdC0yXCI+PC9hcHAtcm9sZS1mb3JtLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtY2FyZD5cbiAgICA8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCIgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgIDx0YWJsZSBtYXQtdGFibGUgbWF0U29ydCBbZGF0YVNvdXJjZV09XCJtb2RlbHNcIiBjbGFzcz1cInctMTAwXCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MFwiIChzY3JvbGxlZCk9XCJvblNjcm9sbCgpXCIgKG1hdFNvcnRDaGFuZ2UpPVwic29ydENvbHVtbigkZXZlbnQpXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiAjIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvbGU7IGxldCBpID0gaW5kZXhcIj4ge3sgaSsxIH19IDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYWJlbFwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIGRpc2FibGVDbGVhcj4gTGFiZWwgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm9sZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3JvbGU/LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIGRpc2FibGVDbGVhcj4gRGVzY3JpcHRpb24gPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm9sZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3JvbGU/LmRlc2NyaXB0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwZXJtaXNzaW9uc19jb3VudFwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFBlcm1pc3Npb25zIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj57e3JvbGU/LnBlcm1pc3Npb25zX2NvdW50fX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGlvbnMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm9sZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWFkbWluLXJvbGUtcGVybWlzc2lvbi1mb3JtIChzdWNjZXNzKT1cInJlbG9hZCgpXCIgW3JvbGVJbmZvXT1cInJvbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiPjwvYXBwLWFkbWluLXJvbGUtcGVybWlzc2lvbi1mb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC10ZWNobGlmeS1pY29uIG5hbWU9XCJ2aWV3XCIgbWF0VG9vbHRpcD1cIlZpZXdcIiBbcm91dGVyTGlua109XCJbJy9hZG1pbi9yb2xlLXZpZXcnLHJvbGU/LmlkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlja2FibGUgbWwtMVwiPjwvYXBwLXRlY2hsaWZ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIj48L3RyPlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvbWF0LWNhcmQ+XG48L2Rpdj4iXX0=
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tcm9sZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvYXBwLWFkbWluL2FkbWluLXJvbGUvYWRtaW4tcm9sZS1saXN0L2FkbWluLXJvbGUtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2FwcC1hZG1pbi9hZG1pbi1yb2xlL2FkbWluLXJvbGUtbGlzdC9hZG1pbi1yb2xlLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUtyRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUVsRyxPQUFPLEVBQWUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRbkUsSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBdUIsU0FBUSxxQkFBcUI7SUFXL0QsWUFDVSxXQUE2QixFQUM3QixhQUE0QixFQUM1QixjQUE4QixFQUM5QixFQUFzQixFQUN0QixNQUFpQixFQUNqQixjQUFpQztRQUV6QyxLQUFLLEVBQUUsQ0FBQztRQVBBLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixtQkFBYyxHQUFk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IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbmFsaXplIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBOZ3hTcGlubmVyU2VydmljZSB9IGZyb20gJ25neC1zcGlubmVyJztcbmltcG9ydCB7IEFkbWluUm9sZVNlcnZpY2UgfSBmcm9tICcuLi9hZG1pbi1yb2xlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGVjaGxpZnlMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYmFzZS1tb2RlbC90ZWNobGlmeS1saXN0L3RlY2hsaWZ5LWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2ZpbHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblBvcHVwLCBBY3Rpb25Qb3B1cENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2FjdGlvbi1wb3B1cCc7XG5cbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkbWluLXJvbGUtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZG1pbi1yb2xlLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hZG1pbi1yb2xlLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBZG1pblJvbGVMaXN0Q29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBmaWx0ZXJGb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXA7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgICdpbmRleCcsXG4gICAgJ2xhYmVsJyxcbiAgICAnZGVzY3JpcHRpb24nLFxuICAgICdwZXJtaXNzaW9uc19jb3VudCcsXG4gICAgJ2FjdGlvbnMnLFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm9sZVNlcnZpY2U6IEFkbWluUm9sZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc2VhcmNoOiBbJyddLFxuICAgICAgaXNfZ2xvYmFsOiBbdHJ1ZV0sXG4gICAgICBzb3J0X2J5OiBbJyddLFxuICAgICAgd2l0aENvdW50OiBbJ3Blcm1pc3Npb25zJ10sXG4gICAgICBsb2FkUGVybWlzc2lvbnM6IFt0cnVlXVxuICAgIH0pO1xuICB9XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhdGNoRmlsdGVycygpO1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB0aGlzLmxpc3RlbkZvckNoYW5nZXMoKTtcbiAgfVxuXG4gIGxpc3RlbkZvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtR3JvdXAudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgdW50aWxEZXN0cm95ZWQodGhpcykpXG4gICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5hcHBseUZpbHRlclRvUm91dGUoXG4gICAgICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwYXRjaEZpbHRlcnMoKSB7XG4gICAgbGV0IHJvdXRlRmlsdGVycyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXRGaWx0ZXJzRnJvbVJvdXRlKFxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlXG4gICAgKTtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC5zZXRWYWx1ZShyb3V0ZUZpbHRlcnMpO1xuICB9XG5cblxuICBsb2FkRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcbiAgICBjb25zdCBmaWx0ZXJzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZSkpO1xuICAgIGZpbHRlcnMucGFnZSA9IHRoaXMucGFnZTtcbiAgICB0aGlzLnJvbGVTZXJ2aWNlLmluZGV4KGZpbHRlcnMpXG4gICAgICAucGlwZShcbiAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCkpXG4gICAgICApLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sYXN0UGFnZSA9IHJlcz8ubGFzdF9wYWdlIHx8IHRoaXMucGFnZTtcbiAgICAgICAgaWYgKHJlcz8uZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscy5jb25jYXQocmVzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHNvcnRDb2x1bW4oZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50LmRpcmVjdGlvbi50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG4gICAgdGhpcy5tb2RlbHMgPSBbXTtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC5nZXQoJ3NvcnRfYnknKS5zZXRWYWx1ZShgJHtldmVudD8uYWN0aXZlfXwke2RpcmVjdGlvbn1gKTtcbiAgfVxuXG4gIC8vQWJzdHJhY3QgaW1wbGVtZW50YXRpb25cbiAgZWRpdEZvcm0obW9kZWw6IGFueSk6IHZvaWQge1xuXG4gIH1cblxuICBkZWxldGVGb3JtKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFjdGlvblBvcHVwQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogXCI0MDBweFwiLFxuICAgICAgZGF0YTogPEFjdGlvblBvcHVwPntcbiAgICAgICAgdGl0bGU6IFwiRGVsZXRlIENvbnRyaWJ1dGlvbiBUeXBlXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBEZWxldGluZyB0aGlzIENvbnRyaWJ1dGlvbiBUeXBlIGNhbm5vdCBiZSB1bmRvbmUuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT9gXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vQWN0aW9uIGNvbmZpcm1lZFxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcbiAgICAgICAgdGhpcy5yb2xlU2VydmljZVxuICAgICAgICAgIC5kZWxldGUobW9kZWwpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKSlcbiAgICAgICAgICApLnN1YnNjcmliZSgoXzogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGVscyA9IHRoaXMubW9kZWxzLmZpbHRlcih4ID0+IHguaWQgIT09IG1vZGVsLmlkKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cblxufVxuIiwiPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwibS0yXCI+XG4gICAgPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiIGZ4TGF5b3V0IGZ4TGF5b3V0R2FwPVwiMC41cmVtXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0IGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm0tMFwiPkdsb2JhbCBSb2xlczwvaDU+XG4gICAgICAgICAgICA8YXBwLXJvbGUtZm9ybS1idXR0b24gKHN1Y2Nlc3MpPVwicmVsb2FkKClcIiBjbGFzcz1cIm10LTJcIj48L2FwcC1yb2xlLWZvcm0tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L21hdC1jYXJkPlxuICAgIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIiBjbGFzcz1cIm10LTJcIj5cbiAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBtYXRTb3J0IFtkYXRhU291cmNlXT1cIm1vZGVsc1wiIGNsYXNzPVwidy0xMDBcIiBpbmZpbml0ZVNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIiAobWF0U29ydENoYW5nZSk9XCJzb3J0Q29sdW1uKCRldmVudClcIj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbmRleFwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+ICMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm9sZTsgbGV0IGkgPSBpbmRleFwiPiB7eyBpKzEgfX0gPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgZGlzYWJsZUNsZWFyPiBMYWJlbCA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cm9sZT8ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgZGlzYWJsZUNsZWFyPiBEZXNjcmlwdGlvbiA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cm9sZT8uZGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInBlcm1pc3Npb25zX2NvdW50XCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gUGVybWlzc2lvbnMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm9sZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7cm9sZT8ucGVybWlzc2lvbnNfY291bnR9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQWN0aW9ucyA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYWRtaW4tcm9sZS1wZXJtaXNzaW9uLWZvcm0gKHN1Y2Nlc3MpPVwicmVsb2FkKClcIiBbcm9sZUluZm9dPVwicm9sZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+PC9hcHAtYWRtaW4tcm9sZS1wZXJtaXNzaW9uLWZvcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXRlY2hsaWZ5LWljb24gbmFtZT1cInZpZXdcIiBtYXRUb29sdGlwPVwiVmlld1wiIFtyb3V0ZXJMaW5rXT1cIlsnL2FkbWluL3JvbGUtdmlldycscm9sZT8uaWRdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaWNrYWJsZSBtbC0xXCI+PC9hcHAtdGVjaGxpZnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgIDwvdGFibGU+XG4gICAgPC9tYXQtY2FyZD5cbjwvZGl2PiJdfQ==
@@ -1,4 +1,5 @@
1
1
  export * from './techlify-form.component';
2
- export * from './techlify-list.component';
2
+ export * from './techlify-list/techlify-list.component';
3
+ export * from './techlify-list/techlify-list.contract.spec';
3
4
  export * from './techlify-service';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2Jhc2UtbW9kZWwvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQTtBQUN6QyxjQUFjLDJCQUEyQixDQUFBO0FBQ3pDLGNBQWMsb0JBQW9CLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3RlY2hsaWZ5LWZvcm0uY29tcG9uZW50J1xuZXhwb3J0ICogZnJvbSAnLi90ZWNobGlmeS1saXN0LmNvbXBvbmVudCdcbmV4cG9ydCAqIGZyb20gJy4vdGVjaGxpZnktc2VydmljZSdcbiJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2Jhc2UtbW9kZWwvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQTtBQUN6QyxjQUFjLHlDQUF5QyxDQUFBO0FBQ3ZELGNBQWMsNkNBQTZDLENBQUE7QUFDM0QsY0FBYyxvQkFBb0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdGVjaGxpZnktZm9ybS5jb21wb25lbnQnXG5leHBvcnQgKiBmcm9tICcuL3RlY2hsaWZ5LWxpc3QvdGVjaGxpZnktbGlzdC5jb21wb25lbnQnXG5leHBvcnQgKiBmcm9tICcuL3RlY2hsaWZ5LWxpc3QvdGVjaGxpZnktbGlzdC5jb250cmFjdC5zcGVjJ1xuZXhwb3J0ICogZnJvbSAnLi90ZWNobGlmeS1zZXJ2aWNlJ1xuIl19
@@ -0,0 +1,277 @@
1
+ import { __decorate } from "tslib";
2
+ import { debounceTime, finalize } from 'rxjs/operators';
3
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
4
+ import { Title } from '@angular/platform-browser';
5
+ import { Directive, inject, Optional } from '@angular/core';
6
+ import { EnvironmentService } from '../../core/environment.service';
7
+ import { RequestHelperService } from '../../request-helper/request-helper.service';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../techlify-service";
10
+ /**
11
+ * Interface used to ensure we have a consistent structure across our listing pages
12
+ *
13
+ * @todo This should be moved to ngx-techlify-core
14
+ *
15
+ * Advantages of this abstract class
16
+ * - Less code, less maintenance, less bugs
17
+ * - more consistent code
18
+ * - comments on more code
19
+ * - save time, save energy
20
+ */
21
+ let TechlifyListComponent = class TechlifyListComponent {
22
+ get isFilterPatchFromRoute() {
23
+ return this._isFilterPatchFromRoute;
24
+ }
25
+ set isFilterPatchFromRoute(value) {
26
+ this._isFilterPatchFromRoute = value;
27
+ }
28
+ /**
29
+ * Child classes can override this.
30
+ * If left undefined/empty, falls back to environment.appTitle
31
+ */
32
+ get pageTitle() {
33
+ return undefined; // default
34
+ }
35
+ constructor(service) {
36
+ this.service = service;
37
+ this.models = [];
38
+ this.selectedModelIds = [];
39
+ this.isAllSelected = false;
40
+ this.page = 1;
41
+ this.perPage = 50;
42
+ this.lastPage = 0;
43
+ this.isWorking = false;
44
+ this.isViewLoaded = false;
45
+ this.columnConfigs = [];
46
+ /**
47
+ * Boolean to turn off, if we don't want to patch filters from route.
48
+ * This can be overriden in child classes if need
49
+ */
50
+ this._isFilterPatchFromRoute = true;
51
+ this.titleService = inject(Title, { optional: true });
52
+ this.environmentService = inject(EnvironmentService, { optional: true });
53
+ //Request helper service to inherited and overriden if needed
54
+ this.requestHelperService = inject(RequestHelperService);
55
+ const resolvedTitle = this.pageTitle && this.pageTitle.trim().length > 0
56
+ ? this.pageTitle
57
+ : this.environmentService.get().appTitle;
58
+ this.titleService.setTitle(resolvedTitle);
59
+ }
60
+ /**
61
+ * Function that listens for any changes in the filter form group
62
+ * It updates the route automatically
63
+ * Also reload the page on change
64
+ */
65
+ listenFilterChanges() {
66
+ this.filterForm.valueChanges.pipe(debounceTime(500), untilDestroyed(this))
67
+ .subscribe(_ => {
68
+ if (this.isFilterPatchFromRoute) {
69
+ const unformatedFilters = JSON.parse(JSON.stringify(this.filterForm.value));
70
+ this.filters = this.requestHelperService.convertToFormData(unformatedFilters, this.filterFormConfiguration);
71
+ this.requestHelperService.updateQueryParams(this.filters);
72
+ }
73
+ this.reload();
74
+ });
75
+ }
76
+ /**
77
+ * Function decodes the route params and patches the filter
78
+ * Setup the filterFormConfigurtion to override for multiple and date attributes.
79
+ */
80
+ patchFiltersFromRoute() {
81
+ this.requestHelperService.updateFormWithQueryParams(this.filterForm, this.filterFormConfiguration);
82
+ }
83
+ /**
84
+ * Function that loads the main models of the application
85
+ */
86
+ loadData(filters) {
87
+ if (!this.service) {
88
+ throw new Error(`${this.constructor.name}: Service is required to load the data`);
89
+ }
90
+ this.isWorking = true;
91
+ if (!filters) {
92
+ /**
93
+ * Convert to form data gives flexibility to convert the form array values to string
94
+ * No need to override the loadData method in child class to convert array values to string.
95
+ * */
96
+ filters = this.requestHelperService.convertToFormData(JSON.parse(JSON.stringify(this.filterForm.value)), this.filterFormConfiguration);
97
+ filters.page = this.page;
98
+ filters.per_page = this.perPage;
99
+ }
100
+ this.service.index(filters)
101
+ .pipe(finalize(() => this.isWorking = false))
102
+ .subscribe((result) => {
103
+ this.lastPage = result?.last_page || this.page;
104
+ if (result?.data?.length > 0) {
105
+ this.models = this.models.concat(result.data);
106
+ }
107
+ });
108
+ }
109
+ ;
110
+ /**
111
+ * Reload all data from page 1
112
+ */
113
+ reload() {
114
+ this.models = [];
115
+ this.selectedModelIds = [];
116
+ this.page = 1;
117
+ if (!this.isWorking) {
118
+ this.loadData();
119
+ }
120
+ }
121
+ /**
122
+ * Can be called when the user is scrolling,
123
+ * to trigger loading a new page of data
124
+ */
125
+ onScroll() {
126
+ if (!this.isWorking && this.page < this.lastPage) {
127
+ this.page += 1;
128
+ this.loadData();
129
+ }
130
+ }
131
+ /**
132
+ * Reset the Filter.
133
+ *
134
+ * @param field Field name.
135
+ */
136
+ resetFilter(field) {
137
+ this.filterForm.get(field).reset('');
138
+ }
139
+ /**
140
+ * Updates one or more models in the list by matching on their `id`.
141
+ * Accepts a single model or an array of models.
142
+ * @param models The updated model or array of models.
143
+ */
144
+ modelsUpdatedById(models) {
145
+ if (!Array.isArray(models)) {
146
+ models = [models];
147
+ }
148
+ models.forEach((updatedModel) => {
149
+ const index = this.models.findIndex((m) => m.id === updatedModel.id);
150
+ if (index !== -1) {
151
+ this.models[index] = updatedModel;
152
+ }
153
+ });
154
+ this.models = [...this.models];
155
+ }
156
+ /**
157
+ * Deletes one or more models in the list by matching on their `id`.
158
+ * Accepts a single model or an array of models.
159
+ * @param models The updated model or array of models.
160
+ */
161
+ modelsDeletedById(models) {
162
+ if (!Array.isArray(models)) {
163
+ models = [models];
164
+ }
165
+ this.models = this.models.filter((m) => !(models.some((item) => item.id === m.id)));
166
+ }
167
+ /**
168
+ * Clears the list of selected models, this will also
169
+ * close the bulk update form that checks
170
+ * for selected models length
171
+ */
172
+ clearSelectedModels() {
173
+ this.selectedModelIds = [];
174
+ }
175
+ /**
176
+ * Adds a new model at the first position in the table.
177
+ * @param model The new model to be added.
178
+ */
179
+ modelCreated(model) {
180
+ if (Array.isArray(model)) {
181
+ //When create another feature is used, we get array of models
182
+ this.models.unshift(...model);
183
+ }
184
+ else {
185
+ this.models.unshift(model);
186
+ }
187
+ this.models = [...this.models];
188
+ }
189
+ /**
190
+ * Used for multi select
191
+ * Trigerred when select all is toggled
192
+ */
193
+ selectAll() {
194
+ this.selectedModelIds = [];
195
+ this.models.map((model) => {
196
+ model.is_selected = this.isAllSelected;
197
+ if (this.isAllSelected) {
198
+ this.selectedModelIds.push(model.id);
199
+ }
200
+ });
201
+ this.models = [...this.models];
202
+ }
203
+ /**
204
+ * Used for multi select
205
+ * Trigerred if any entry section is modified
206
+ */
207
+ isSelectionModified(event, model) {
208
+ this.isAllSelected = false;
209
+ if (event.checked) {
210
+ this.selectedModelIds.push(model?.id);
211
+ }
212
+ else {
213
+ this.selectedModelIds = this.selectedModelIds.filter((modelId) => modelId != model?.id);
214
+ }
215
+ }
216
+ /**
217
+ * Defualt method to listen to sort column updates
218
+ * @param event
219
+ */
220
+ sortColumn(event) {
221
+ const direction = event.direction.toString().toUpperCase();
222
+ this.models = [];
223
+ this.filterForm.get('sort_by').setValue(`${event?.active}|${direction}`);
224
+ }
225
+ /**
226
+ * It should be overrided in child class to reset a filter form instance.
227
+ * Used by setView method.
228
+ */
229
+ resetFilterForm() {
230
+ //If filterForm exists, then reset
231
+ if (this.filterForm) {
232
+ this.filterForm.reset();
233
+ }
234
+ }
235
+ /**
236
+ * It should be overrided in child class to reset column configs.
237
+ * Used by setView method.
238
+ */
239
+ resetColumnConfigs() {
240
+ this.columnConfigs = [];
241
+ }
242
+ /**
243
+ * Hook method used to set the selected view
244
+ * @param view optional used by my-view-list
245
+ */
246
+ setView(view) {
247
+ //Reset the query params
248
+ this.requestHelperService.updateQueryParams({});
249
+ this.isViewLoaded = false;
250
+ this.resetColumnConfigs();
251
+ this.resetFilterForm();
252
+ setTimeout(() => {
253
+ if (view) {
254
+ //If there is a view, then set it.
255
+ //Setup view filters
256
+ this.filterForm.setValue(this.requestHelperService.convertToFormData(view?.filters, this.filterFormConfiguration));
257
+ //Setup view columns
258
+ this.columnConfigs.forEach(column => {
259
+ column.isSelected = (view?.columns).some(col => col === column.def);
260
+ });
261
+ }
262
+ this.isViewLoaded = true;
263
+ }, 500);
264
+ }
265
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyListComponent, deps: [{ token: i1.TechlifyService, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
266
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TechlifyListComponent, ngImport: i0 }); }
267
+ };
268
+ TechlifyListComponent = __decorate([
269
+ UntilDestroy()
270
+ ], TechlifyListComponent);
271
+ export { TechlifyListComponent };
272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyListComponent, decorators: [{
273
+ type: Directive
274
+ }], ctorParameters: () => [{ type: i1.TechlifyService, decorators: [{
275
+ type: Optional
276
+ }] }] });
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2Jhc2UtbW9kZWwvdGVjaGxpZnktbGlzdC90ZWNobGlmeS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQUluRjs7Ozs7Ozs7OztHQVVHO0FBR0ksSUFBZSxxQkFBcUIsR0FBcEMsTUFBZSxxQkFBcUI7SUFxQnpDLElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLHNCQUFzQixDQUFDLEtBQWM7UUFDdkMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBcUJEOzs7UUFHSTtJQUNKLElBQWMsU0FBUztRQUNyQixPQUFPLFNBQVMsQ0FBQyxDQUFDLFVBQVU7SUFDOUIsQ0FBQztJQVNELFlBQWtDLE9BQXlCO1FBQXpCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBNUQzRCxXQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ25CLHFCQUFnQixHQUFVLEVBQUUsQ0FBQztRQUM3QixrQkFBYSxHQUFHLEtBQUssQ0FBQztR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Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ILG9CQUFvQjtnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ2xDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBb0IsQ0FBQSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xGLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7K0dBalNtQixxQkFBcUI7bUdBQXJCLHFCQUFxQjs7QUFBckIscUJBQXFCO0lBRjFDLFlBQVksRUFBRTtHQUVPLHFCQUFxQixDQWtTMUM7OzRGQWxTcUIscUJBQXFCO2tCQUQxQyxTQUFTOzswQkErREssUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlYm91bmNlVGltZSwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIGluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3JlcXVlc3QtaGVscGVyL3JlcXVlc3QtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGVjaGxpZnlTZXJ2aWNlIH0gZnJvbSAnLi4vdGVjaGxpZnktc2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5Db25maWcgfSBmcm9tICcuLi8uLi9jb2x1bW4tc2VsZWN0b3InO1xuXG4vKipcbiAqIEludGVyZmFjZSB1c2VkIHRvIGVuc3VyZSB3ZSBoYXZlIGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUgYWNyb3NzIG91ciBsaXN0aW5nIHBhZ2VzXG4gKlxuICogQHRvZG8gVGhpcyBzaG91bGQgYmUgbW92ZWQgdG8gbmd4LXRlY2hsaWZ5LWNvcmVcbiAqXG4gKiBBZHZhbnRhZ2VzIG9mIHRoaXMgYWJzdHJhY3QgY2xhc3NcbiAqIC0gTGVzcyBjb2RlLCBsZXNzIG1haW50ZW5hbmNlLCBsZXNzIGJ1Z3NcbiAqIC0gbW9yZSBjb25zaXN0ZW50IGNvZGVcbiAqIC0gY29tbWVudHMgb24gbW9yZSBjb2RlXG4gKiAtIHNhdmUgdGltZSwgc2F2ZSBlbmVyZ3lcbiAqL1xuQFVudGlsRGVzdHJveSgpXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZWNobGlmeUxpc3RDb21wb25lbnQge1xuXG4gIG1vZGVsczogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRNb2RlbElkczogYW55W10gPSBbXTtcbiAgaXNBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICBwYWdlID0gMTtcbiAgcGVyUGFnZSA9IDUwO1xuICBsYXN0UGFnZSA9IDA7XG4gIGlzV29ya2luZyA9IGZhbHNlO1xuICBmaWx0ZXJGb3JtOiBhbnk7XG4gIGlzVmlld0xvYWRlZCA9IGZhbHNlO1xuICBjb2x1bW5Db25maWdzOiBDb2x1bW5Db25maWdbXSA9IFtdO1xuXG4gIC8vRmlsdGVycyB0byBiZSBleHBvcnRlZCBmb3IgdmlldyBpbnRlZ3JhdGlvblxuICBmaWx0ZXJzOiBhbnk7XG5cbiAgLyoqXG4gICAqIEJvb2xlYW4gdG8gdHVybiBvZmYsIGlmIHdlIGRvbid0IHdhbnQgdG8gcGF0Y2ggZmlsdGVycyBmcm9tIHJvdXRlLlxuICAgKiBUaGlzIGNhbiBiZSBvdmVycmlkZW4gaW4gY2hpbGQgY2xhc3NlcyBpZiBuZWVkIFxuICAgKi9cbiAgcHJvdGVjdGVkIF9pc0ZpbHRlclBhdGNoRnJvbVJvdXRlID0gdHJ1ZTtcbiAgZ2V0IGlzRmlsdGVyUGF0Y2hGcm9tUm91dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRmlsdGVyUGF0Y2hGcm9tUm91dGU7XG4gIH1cbiAgc2V0IGlzRmlsdGVyUGF0Y2hGcm9tUm91dGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0ZpbHRlclBhdGNoRnJvbVJvdXRlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGZvcm0gY29uZmlndXJhdGlvbiB1c2VkIHRvIGRlY29kZSB0aGUgcm91dGUgcGFyYW1zLlxuICAgKiBFZzogT3ZlcnJpZGUgaW4gY2hpbGQgY2xhc3NcbiAgICogIGBgYCBcbiAgICogZmlsdGVyRm9ybUNvbmZpZ3VyYXRpb246IGFueSA9IHtcbiAgICBzdGF0dXNfaWQ6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICBicmFuY2hfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgZGVwYXJ0bWVudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICBlbXBsb3llZV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICBjb3Vyc2VfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgZGF0ZV9mcm9tOiB7IGRhdGU6IHRydWUgfSxcbiAgICBkYXRlX3RvOiB7IGRhdGU6IHRydWUgfSxcbiAgICBkdWVfZGF0ZV9mcm9tOiB7IGRhdGU6IHRydWUgfSxcbiAgICBkdWVfZGF0ZV90bzogeyBkYXRlOiB0cnVlIH0sXG4gICB9IFxuICAgKmBgYFxuICAgKi9cbiAgZmlsdGVyRm9ybUNvbmZpZ3VyYXRpb246IGFueTtcblxuICAvKipcbiAgICAqIENoaWxkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMuXG4gICAgKiBJZiBsZWZ0IHVuZGVmaW5lZC9lbXB0eSwgZmFsbHMgYmFjayB0byBlbnZpcm9ubWVudC5hcHBUaXRsZVxuICAgICovXG4gIHByb3RlY3RlZCBnZXQgcGFnZVRpdGxlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZGVmYXVsdFxuICB9XG5cblxuICBwcml2YXRlIHRpdGxlU2VydmljZSA9IGluamVjdChUaXRsZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudFNlcnZpY2UgPSBpbmplY3QoRW52aXJvbm1lbnRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8vUmVxdWVzdCBoZWxwZXIgc2VydmljZSB0byBpbmhlcml0ZWQgYW5kIG92ZXJyaWRlbiBpZiBuZWVkZWRcbiAgcHJvdGVjdGVkIHJlcXVlc3RIZWxwZXJTZXJ2aWNlID0gaW5qZWN0KFJlcXVlc3RIZWxwZXJTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgc2VydmljZT86IFRlY2hsaWZ5U2VydmljZSkge1xuICAgIGNvbnN0IHJlc29sdmVkVGl0bGUgPVxuICAgICAgdGhpcy5wYWdlVGl0bGUgJiYgdGhpcy5wYWdlVGl0bGUudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLnBhZ2VUaXRsZVxuICAgICAgICA6IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldCgpLmFwcFRpdGxlO1xuICAgIHRoaXMudGl0bGVTZXJ2aWNlLnNldFRpdGxlKHJlc29sdmVkVGl0bGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRoYXQgbGlzdGVucyBmb3IgYW55IGNoYW5nZXMgaW4gdGhlIGZpbHRlciBmb3JtIGdyb3VwXG4gICAqIEl0IHVwZGF0ZXMgdGhlIHJvdXRlIGF1dG9tYXRpY2FsbHlcbiAgICogQWxzbyByZWxvYWQgdGhlIHBhZ2Ugb24gY2hhbmdlXG4gICAqL1xuICBsaXN0ZW5GaWx0ZXJDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgdW50aWxEZXN0cm95ZWQodGhpcykpXG4gICAgICAuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbHRlclBhdGNoRnJvbVJvdXRlKSB7XG4gICAgICAgICAgY29uc3QgdW5mb3JtYXRlZEZpbHRlcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyRm9ybS52YWx1ZSkpO1xuICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UuY29udmVydFRvRm9ybURhdGEodW5mb3JtYXRlZEZpbHRlcnMsIHRoaXMuZmlsdGVyRm9ybUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICAgIHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UudXBkYXRlUXVlcnlQYXJhbXModGhpcy5maWx0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gZGVjb2RlcyB0aGUgcm91dGUgcGFyYW1zIGFuZCBwYXRjaGVzIHRoZSBmaWx0ZXJcbiAgICogU2V0dXAgdGhlIGZpbHRlckZvcm1Db25maWd1cnRpb24gdG8gb3ZlcnJpZGUgZm9yIG11bHRpcGxlIGFuZCBkYXRlIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBwYXRjaEZpbHRlcnNGcm9tUm91dGUoKSB7XG4gICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVGb3JtV2l0aFF1ZXJ5UGFyYW1zKHRoaXMuZmlsdGVyRm9ybSwgdGhpcy5maWx0ZXJGb3JtQ29uZmlndXJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdGhhdCBsb2FkcyB0aGUgbWFpbiBtb2RlbHMgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAqL1xuICBsb2FkRGF0YShmaWx0ZXJzPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogU2VydmljZSBpcyByZXF1aXJlZCB0byBsb2FkIHRoZSBkYXRhYFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIGlmICghZmlsdGVycykge1xuICAgICAgLyoqXG4gICAgICAgKiBDb252ZXJ0IHRvIGZvcm0gZGF0YSBnaXZlcyBmbGV4aWJpbGl0eSB0byBjb252ZXJ0IHRoZSBmb3JtIGFycmF5IHZhbHVlcyB0byBzdHJpbmdcbiAgICAgICAqIE5vIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGxvYWREYXRhIG1ldGhvZCBpbiBjaGlsZCBjbGFzcyB0byBjb252ZXJ0IGFycmF5IHZhbHVlcyB0byBzdHJpbmcuXG4gICAgICAgKiAqL1xuICAgICAgZmlsdGVycyA9IHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UuY29udmVydFRvRm9ybURhdGEoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlckZvcm0udmFsdWUpKSwgdGhpcy5maWx0ZXJGb3JtQ29uZmlndXJhdGlvbik7XG4gICAgICBmaWx0ZXJzLnBhZ2UgPSB0aGlzLnBhZ2U7XG4gICAgICBmaWx0ZXJzLnBlcl9wYWdlID0gdGhpcy5wZXJQYWdlO1xuICAgIH1cbiAgICB0aGlzLnNlcnZpY2UuaW5kZXgoZmlsdGVycylcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMuaXNXb3JraW5nID0gZmFsc2UpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sYXN0UGFnZSA9IHJlc3VsdD8ubGFzdF9wYWdlIHx8IHRoaXMucGFnZTtcbiAgICAgICAgaWYgKHJlc3VsdD8uZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5tb2RlbHMuY29uY2F0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbG9hZCBhbGwgZGF0YSBmcm9tIHBhZ2UgMVxuICAgKi9cbiAgcmVsb2FkKCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWxzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZE1vZGVsSWRzID0gW107XG4gICAgdGhpcy5wYWdlID0gMTtcbiAgICBpZiAoIXRoaXMuaXNXb3JraW5nKSB7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbiBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBpcyBzY3JvbGxpbmcsXG4gICAqIHRvIHRyaWdnZXIgbG9hZGluZyBhIG5ldyBwYWdlIG9mIGRhdGFcbiAgICovXG4gIG9uU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1dvcmtpbmcgJiYgdGhpcy5wYWdlIDwgdGhpcy5sYXN0UGFnZSkge1xuICAgICAgdGhpcy5wYWdlICs9IDE7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBGaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZCBGaWVsZCBuYW1lLlxuICAgKi9cbiAgcmVzZXRGaWx0ZXIoZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoZmllbGQpLnJlc2V0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIG9uZSBvciBtb3JlIG1vZGVscyBpbiB0aGUgbGlzdCBieSBtYXRjaGluZyBvbiB0aGVpciBgaWRgLlxuICAgKiBBY2NlcHRzIGEgc2luZ2xlIG1vZGVsIG9yIGFuIGFycmF5IG9mIG1vZGVscy5cbiAgICogQHBhcmFtIG1vZGVscyBUaGUgdXBkYXRlZCBtb2RlbCBvciBhcnJheSBvZiBtb2RlbHMuXG4gICAqL1xuICBtb2RlbHNVcGRhdGVkQnlJZChtb2RlbHM6IGFueSB8IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICAgIG1vZGVscyA9IFttb2RlbHNdO1xuICAgIH1cbiAgICBtb2RlbHMuZm9yRWFjaCgodXBkYXRlZE1vZGVsOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tb2RlbHMuZmluZEluZGV4KChtOiBhbnkpID0+IG0uaWQgPT09IHVwZGF0ZWRNb2RlbC5pZCk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMubW9kZWxzW2luZGV4XSA9IHVwZGF0ZWRNb2RlbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1vZGVscyA9IFsuLi50aGlzLm1vZGVsc107XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBvbmUgb3IgbW9yZSBtb2RlbHMgaW4gdGhlIGxpc3QgYnkgbWF0Y2hpbmcgb24gdGhlaXIgYGlkYC5cbiAgICogQWNjZXB0cyBhIHNpbmdsZSBtb2RlbCBvciBhbiBhcnJheSBvZiBtb2RlbHMuXG4gICAqIEBwYXJhbSBtb2RlbHMgVGhlIHVwZGF0ZWQgbW9kZWwgb3IgYXJyYXkgb2YgbW9kZWxzLlxuICAgKi9cbiAgbW9kZWxzRGVsZXRlZEJ5SWQobW9kZWxzOiBhbnkgfCBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShtb2RlbHMpKSB7XG4gICAgICBtb2RlbHMgPSBbbW9kZWxzXTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscy5maWx0ZXIoKG06IGFueSkgPT4gIShtb2RlbHMuc29tZSgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09PSBtLmlkKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgbGlzdCBvZiBzZWxlY3RlZCBtb2RlbHMsIHRoaXMgd2lsbCBhbHNvXG4gICAqIGNsb3NlIHRoZSBidWxrIHVwZGF0ZSBmb3JtIHRoYXQgY2hlY2tzIFxuICAgKiBmb3Igc2VsZWN0ZWQgbW9kZWxzIGxlbmd0aFxuICAgKi9cbiAgY2xlYXJTZWxlY3RlZE1vZGVscygpIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZWxJZHMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IG1vZGVsIGF0IHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgdGFibGUuXG4gICAqIEBwYXJhbSBtb2RlbCBUaGUgbmV3IG1vZGVsIHRvIGJlIGFkZGVkLlxuICAgKi9cbiAgbW9kZWxDcmVhdGVkKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbCkpIHtcbiAgICAgIC8vV2hlbiBjcmVhdGUgYW5vdGhlciBmZWF0dXJlIGlzIHVzZWQsIHdlIGdldCBhcnJheSBvZiBtb2RlbHNcbiAgICAgIHRoaXMubW9kZWxzLnVuc2hpZnQoLi4ubW9kZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGVscy51bnNoaWZ0KG1vZGVsKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbHMgPSBbLi4udGhpcy5tb2RlbHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgZm9yIG11bHRpIHNlbGVjdFxuICAgKiBUcmlnZXJyZWQgd2hlbiBzZWxlY3QgYWxsIGlzIHRvZ2dsZWRcbiAgICovXG4gIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZWxJZHMgPSBbXTtcbiAgICB0aGlzLm1vZGVscy5tYXAoKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgIG1vZGVsLmlzX3NlbGVjdGVkID0gdGhpcy5pc0FsbFNlbGVjdGVkO1xuICAgICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTW9kZWxJZHMucHVzaChtb2RlbC5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5tb2RlbHMgPSBbLi4udGhpcy5tb2RlbHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgZm9yIG11bHRpIHNlbGVjdFxuICAgKiBUcmlnZXJyZWQgaWYgYW55IGVudHJ5IHNlY3Rpb24gaXMgbW9kaWZpZWRcbiAgICovXG4gIGlzU2VsZWN0aW9uTW9kaWZpZWQoZXZlbnQ6IGFueSwgbW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTW9kZWxJZHMucHVzaChtb2RlbD8uaWQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbElkcyA9IHRoaXMuc2VsZWN0ZWRNb2RlbElkcy5maWx0ZXIoKG1vZGVsSWQ6IGFueSkgPT4gbW9kZWxJZCAhPSBtb2RlbD8uaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZ1YWx0IG1ldGhvZCB0byBsaXN0ZW4gdG8gc29ydCBjb2x1bW4gdXBkYXRlc1xuICAgKiBAcGFyYW0gZXZlbnQgXG4gICAqL1xuICBzb3J0Q29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBldmVudC5kaXJlY3Rpb24udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMubW9kZWxzID0gW107XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnc29ydF9ieScpLnNldFZhbHVlKGAke2V2ZW50Py5hY3RpdmV9fCR7ZGlyZWN0aW9ufWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHNob3VsZCBiZSBvdmVycmlkZWQgaW4gY2hpbGQgY2xhc3MgdG8gcmVzZXQgYSBmaWx0ZXIgZm9ybSBpbnN0YW5jZS5cbiAgICogVXNlZCBieSBzZXRWaWV3IG1ldGhvZC5cbiAgICovXG4gIHByb3RlY3RlZCByZXNldEZpbHRlckZvcm0oKTogdm9pZCB7XG4gICAgLy9JZiBmaWx0ZXJGb3JtIGV4aXN0cywgdGhlbiByZXNldFxuICAgIGlmICh0aGlzLmZpbHRlckZvcm0pIHtcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBzaG91bGQgYmUgb3ZlcnJpZGVkIGluIGNoaWxkIGNsYXNzIHRvIHJlc2V0IGNvbHVtbiBjb25maWdzLlxuICAgKiBVc2VkIGJ5IHNldFZpZXcgbWV0aG9kLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc2V0Q29sdW1uQ29uZmlncygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbkNvbmZpZ3MgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIG1ldGhvZCB1c2VkIHRvIHNldCB0aGUgc2VsZWN0ZWQgdmlld1xuICAgKiBAcGFyYW0gdmlldyBvcHRpb25hbCB1c2VkIGJ5IG15LXZpZXctbGlzdFxuICAgKi9cbiAgc2V0Vmlldyh2aWV3PzogYW55KSB7XG4gICAgLy9SZXNldCB0aGUgcXVlcnkgcGFyYW1zXG4gICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVRdWVyeVBhcmFtcyh7fSk7XG4gICAgdGhpcy5pc1ZpZXdMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2V0Q29sdW1uQ29uZmlncygpO1xuICAgIHRoaXMucmVzZXRGaWx0ZXJGb3JtKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodmlldykge1xuICAgICAgICAvL0lmIHRoZXJlIGlzIGEgdmlldywgdGhlbiBzZXQgaXQuXG4gICAgICAgIC8vU2V0dXAgdmlldyBmaWx0ZXJzXG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5zZXRWYWx1ZSh0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHZpZXc/LmZpbHRlcnMsIHRoaXMuZmlsdGVyRm9ybUNvbmZpZ3VyYXRpb24pKTtcbiAgICAgICAgLy9TZXR1cCB2aWV3IGNvbHVtbnNcbiAgICAgICAgdGhpcy5jb2x1bW5Db25maWdzLmZvckVhY2goY29sdW1uID0+IHtcbiAgICAgICAgICBjb2x1bW4uaXNTZWxlY3RlZCA9ICh2aWV3Py5jb2x1bW5zIGFzIHN0cmluZ1tdKS5zb21lKGNvbCA9PiBjb2wgPT09IGNvbHVtbi5kZWYpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXNWaWV3TG9hZGVkID0gdHJ1ZTtcbiAgICB9LCA1MDApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,85 @@
1
+ import { fakeAsync, tick } from '@angular/core/testing';
2
+ import { By } from '@angular/platform-browser';
3
+ import 'jasmine';
4
+ export function techlifyListContract(options) {
5
+ fdescribe('TechlifyListComponent Contract', () => {
6
+ it('should pass a service to the base class', () => {
7
+ const component = options.getComponent();
8
+ expect(component.service).toBe(options.getService());
9
+ });
10
+ it('should have a filter form', () => {
11
+ const component = options.getComponent();
12
+ expect(component.filterForm).toBeTruthy();
13
+ });
14
+ it('should call loadData on init', () => {
15
+ const component = options.getComponent();
16
+ spyOn(component, 'loadData');
17
+ component.ngOnInit();
18
+ expect(component.loadData).toHaveBeenCalled();
19
+ });
20
+ it('should patch filters from route on init', () => {
21
+ const component = options.getComponent();
22
+ spyOn(component, 'patchFiltersFromRoute');
23
+ component.ngOnInit();
24
+ expect(component.patchFiltersFromRoute).toHaveBeenCalled();
25
+ });
26
+ it('should reload when filter changes', fakeAsync(() => {
27
+ const component = options.getComponent();
28
+ const filterField = options.filterField ?? 'search';
29
+ if (!component.filterForm?.contains(filterField)) {
30
+ pending(`Filter '${filterField}' does not exist.`);
31
+ return;
32
+ }
33
+ spyOn(component, 'reload');
34
+ component.listenFilterChanges();
35
+ component.filterForm.get(filterField)?.setValue('abc');
36
+ tick(501);
37
+ expect(component.reload).toHaveBeenCalled();
38
+ }));
39
+ it('should show progress bar while loading', () => {
40
+ const component = options.getComponent();
41
+ const fixture = options.getFixture();
42
+ component.isWorking = true;
43
+ fixture.detectChanges();
44
+ expect(fixture.debugElement.query(By.css('mat-progress-bar'))).toBeTruthy();
45
+ });
46
+ it('should hide progress bar when not loading', () => {
47
+ const component = options.getComponent();
48
+ const fixture = options.getFixture();
49
+ component.isWorking = false;
50
+ fixture.detectChanges();
51
+ expect(fixture.debugElement.query(By.css('mat-progress-bar'))).toBeFalsy();
52
+ });
53
+ it('should load next page on scroll', () => {
54
+ const component = options.getComponent();
55
+ component.page = 1;
56
+ component.lastPage = 3;
57
+ component.isWorking = false;
58
+ spyOn(component, 'loadData');
59
+ component.onScroll();
60
+ expect(component.page).toBe(2);
61
+ expect(component.loadData).toHaveBeenCalled();
62
+ });
63
+ it('should not load next page while already loading', () => {
64
+ const component = options.getComponent();
65
+ component.page = 1;
66
+ component.lastPage = 3;
67
+ component.isWorking = true;
68
+ spyOn(component, 'loadData');
69
+ component.onScroll();
70
+ expect(component.loadData).not.toHaveBeenCalled();
71
+ });
72
+ it('should update sort_by filter', () => {
73
+ const component = options.getComponent();
74
+ const control = component.filterForm.get('sort_by');
75
+ if (!control) {
76
+ pending('No sort_by control.');
77
+ return;
78
+ }
79
+ spyOn(control, 'setValue');
80
+ component.sortColumn({ active: 'name', direction: 'asc' });
81
+ expect(control.setValue).toHaveBeenCalledWith('name|ASC');
82
+ });
83
+ });
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktbGlzdC5jb250cmFjdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9iYXNlLW1vZGVsL3RlY2hsaWZ5LWxpc3QvdGVjaGxpZnktbGlzdC5jb250cmFjdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFvQixNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUvQyxPQUFPLFNBQVMsQ0FBQztBQVNqQixNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLE9BQW9DO0lBRXBDLFNBQVMsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7UUFDN0MsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFFLFNBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtZQUNqQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7WUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLEtBQUssQ0FBQyxTQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ25DLFNBQWlCLENBQUMsUUFBUSxF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QUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBRVAsQ0FBQyxDQUFDLENBQUM7QUFFUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmFrZUFzeW5jLCB0aWNrLCBDb21wb25lbnRGaXh0dXJlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7IEJ5IH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBUZWNobGlmeUxpc3RDb21wb25lbnQgfSBmcm9tICcuL3RlY2hsaWZ5LWxpc3QuY29tcG9uZW50JztcbmltcG9ydCAnamFzbWluZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVjaGxpZnlMaXN0Q29udHJhY3RPcHRpb25zIHtcbiAgICBnZXRGaXh0dXJlOiAoKSA9PiBDb21wb25lbnRGaXh0dXJlPGFueT47XG4gICAgZ2V0Q29tcG9uZW50OiAoKSA9PiBUZWNobGlmeUxpc3RDb21wb25lbnQ7XG4gICAgZ2V0U2VydmljZTogKCkgPT4gYW55O1xuICAgIGZpbHRlckZpZWxkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVjaGxpZnlMaXN0Q29udHJhY3QoXG4gICAgb3B0aW9uczogVGVjaGxpZnlMaXN0Q29udHJhY3RPcHRpb25zXG4pOiB2b2lkIHtcbiAgICBmZGVzY3JpYmUoJ1RlY2hsaWZ5TGlzdENvbXBvbmVudCBDb250cmFjdCcsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBwYXNzIGEgc2VydmljZSB0byB0aGUgYmFzZSBjbGFzcycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG9wdGlvbnMuZ2V0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICBleHBlY3QoKGNvbXBvbmVudCBhcyBhbnkpLnNlcnZpY2UpLnRvQmUob3B0aW9ucy5nZXRTZXJ2aWNlKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhdmUgYSBmaWx0ZXIgZm9ybScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG9wdGlvbnMuZ2V0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICBleHBlY3QoY29tcG9uZW50LmZpbHRlckZvcm0pLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjYWxsIGxvYWREYXRhIG9uIGluaXQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBvcHRpb25zLmdldENvbXBvbmVudCgpO1xuICAgICAgICAgICAgc3B5T24oY29tcG9uZW50IGFzIGFueSwgJ2xvYWREYXRhJyk7XG4gICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkubmdPbkluaXQoKTtcbiAgICAgICAgICAgIGV4cGVjdChjb21wb25lbnQubG9hZERhdGEpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBmaWx0ZXJzIGZyb20gcm91dGUgb24gaW5pdCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG9wdGlvbnMuZ2V0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICBzcHlPbihjb21wb25lbnQgYXMgYW55LCAncGF0Y2hGaWx0ZXJzRnJvbVJvdXRlJyk7XG4gICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkubmdPbkluaXQoKTtcbiAgICAgICAgICAgIGV4cGVjdChjb21wb25lbnQucGF0Y2hGaWx0ZXJzRnJvbVJvdXRlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmVsb2FkIHdoZW4gZmlsdGVyIGNoYW5nZXMnLCBmYWtlQXN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckZpZWxkID0gb3B0aW9ucy5maWx0ZXJGaWVsZCA/PyAnc2VhcmNoJztcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50LmZpbHRlckZvcm0/LmNvbnRhaW5zKGZpbHRlckZpZWxkKSkge1xuICAgICAgICAgICAgICAgIHBlbmRpbmcoYEZpbHRlciAnJHtmaWx0ZXJGaWVsZH0nIGRvZXMgbm90IGV4aXN0LmApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNweU9uKGNvbXBvbmVudCBhcyBhbnksICdyZWxvYWQnKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5saXN0ZW5GaWx0ZXJDaGFuZ2VzKCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZmlsdGVyRm9ybS5nZXQoZmlsdGVyRmllbGQpPy5zZXRWYWx1ZSgnYWJjJyk7XG4gICAgICAgICAgICB0aWNrKDUwMSk7XG4gICAgICAgICAgICBleHBlY3QoY29tcG9uZW50LnJlbG9hZCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpdCgnc2hvdWxkIHNob3cgcHJvZ3Jlc3MgYmFyIHdoaWxlIGxvYWRpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBvcHRpb25zLmdldENvbXBvbmVudCgpO1xuICAgICAgICAgICAgY29uc3QgZml4dHVyZSA9IG9wdGlvbnMuZ2V0Rml4dHVyZSgpO1xuICAgICAgICAgICAgY29tcG9uZW50LmlzV29ya2luZyA9IHRydWU7XG4gICAgICAgICAgICBmaXh0dXJlLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGV4cGVjdChmaXh0dXJlLmRlYnVnRWxlbWVudC5xdWVyeShCeS5jc3MoJ21hdC1wcm9ncmVzcy1iYXInKSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoaWRlIHByb2dyZXNzIGJhciB3aGVuIG5vdCBsb2FkaW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBvcHRpb25zLmdldEZpeHR1cmUoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZpeHR1cmUuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgZXhwZWN0KGZpeHR1cmUuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmNzcygnbWF0LXByb2dyZXNzLWJhcicpKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgbG9hZCBuZXh0IHBhZ2Ugb24gc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5wYWdlID0gMTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5sYXN0UGFnZSA9IDM7XG4gICAgICAgICAgICBjb21wb25lbnQuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgICAgICBzcHlPbihjb21wb25lbnQgYXMgYW55LCAnbG9hZERhdGEnKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vblNjcm9sbCgpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbXBvbmVudC5wYWdlKS50b0JlKDIpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbXBvbmVudC5sb2FkRGF0YSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIG5vdCBsb2FkIG5leHQgcGFnZSB3aGlsZSBhbHJlYWR5IGxvYWRpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBvcHRpb25zLmdldENvbXBvbmVudCgpO1xuICAgICAgICAgICAgY29tcG9uZW50LnBhZ2UgPSAxO1xuICAgICAgICAgICAgY29tcG9uZW50Lmxhc3RQYWdlID0gMztcbiAgICAgICAgICAgIGNvbXBvbmVudC5pc1dvcmtpbmcgPSB0cnVlO1xuICAgICAgICAgICAgc3B5T24oY29tcG9uZW50IGFzIGFueSwgJ2xvYWREYXRhJyk7XG4gICAgICAgICAgICBjb21wb25lbnQub25TY3JvbGwoKTtcbiAgICAgICAgICAgIGV4cGVjdChjb21wb25lbnQubG9hZERhdGEpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIHNvcnRfYnkgZmlsdGVyJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjb21wb25lbnQuZmlsdGVyRm9ybS5nZXQoJ3NvcnRfYnknKTtcbiAgICAgICAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICAgICAgICAgIHBlbmRpbmcoJ05vIHNvcnRfYnkgY29udHJvbC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcHlPbihjb250cm9sLCAnc2V0VmFsdWUnKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zb3J0Q29sdW1uKHsgYWN0aXZlOiAnbmFtZScsIGRpcmVjdGlvbjogJ2FzYycgfSk7XG4gICAgICAgICAgICBleHBlY3QoY29udHJvbC5zZXRWYWx1ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ25hbWV8QVNDJyk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0iXX0=