techlify-inventory-common 18.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/inventory-common/category/category-form/category-form.component.mjs +77 -0
- package/esm2022/lib/inventory-common/category/category-form-button/category-form-button.component.mjs +32 -0
- package/esm2022/lib/inventory-common/category/category-list-page/category-list-page.component.mjs +68 -0
- package/esm2022/lib/inventory-common/category/category-routing.module.mjs +24 -0
- package/esm2022/lib/inventory-common/category/category.module.mjs +63 -0
- package/esm2022/lib/inventory-common/category/category.service.mjs +18 -0
- package/esm2022/lib/inventory-common/inventory-common-routing.module.mjs +53 -0
- package/esm2022/lib/inventory-common/inventory-common.module.mjs +39 -0
- package/esm2022/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.mjs +42 -0
- package/esm2022/lib/inventory-common/material.module.mjs +172 -0
- package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete-button/measure-delete-button.component.mjs +44 -0
- package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete.module.mjs +19 -0
- package/esm2022/lib/inventory-common/measure/measure-form/measure-form/measure-form.component.mjs +80 -0
- package/esm2022/lib/inventory-common/measure/measure-form/measure-form-button/measure-form-button.component.mjs +30 -0
- package/esm2022/lib/inventory-common/measure/measure-form/measure-form.module.mjs +21 -0
- package/esm2022/lib/inventory-common/measure/measure-routing.module.mjs +24 -0
- package/esm2022/lib/inventory-common/measure/measure.module.mjs +47 -0
- package/esm2022/lib/inventory-common/measure/measure.service.mjs +18 -0
- package/esm2022/lib/inventory-common/measure/measures-list/measures-list.component.mjs +71 -0
- package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.mjs +45 -0
- package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.module.mjs +36 -0
- package/esm2022/lib/inventory-common/product/product-basic-info/product-basic-info.component.mjs +54 -0
- package/esm2022/lib/inventory-common/product/product-delete-button/product-delete-button.component.mjs +54 -0
- package/esm2022/lib/inventory-common/product/product-form/product-form.component.mjs +180 -0
- package/esm2022/lib/inventory-common/product/product-form-button/product-form-button.component.mjs +40 -0
- package/esm2022/lib/inventory-common/product/product-form.service.mjs +17 -0
- package/esm2022/lib/inventory-common/product/product-import-page/product-import-page.component.mjs +66 -0
- package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +189 -0
- package/esm2022/lib/inventory-common/product/product-measure-form/product-measure-form.component.mjs +101 -0
- package/esm2022/lib/inventory-common/product/product-measures-list/product-measures-list.component.mjs +151 -0
- package/esm2022/lib/inventory-common/product/product-nav-bar/product-nav-bar.component.mjs +12 -0
- package/esm2022/lib/inventory-common/product/product-routing.module.mjs +57 -0
- package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.component.mjs +63 -0
- package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.module.mjs +29 -0
- package/esm2022/lib/inventory-common/product/product-tax/product-tax-delete-button/product-tax-delete-button.component.mjs +54 -0
- package/esm2022/lib/inventory-common/product/product-tax/product-tax-form-button/product-tax-form-button.component.mjs +77 -0
- package/esm2022/lib/inventory-common/product/product-tax/product-tax-list/product-tax-list.component.mjs +35 -0
- package/esm2022/lib/inventory-common/product/product-tax/product-tax.module.mjs +39 -0
- package/esm2022/lib/inventory-common/product/product-tax/product-tax.service.mjs +18 -0
- package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +68 -0
- package/esm2022/lib/inventory-common/product/product.module.mjs +111 -0
- package/esm2022/lib/inventory-common/product/product.service.mjs +49 -0
- package/esm2022/lib/inventory-common/services/techlify-form-service.mjs +11 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.mjs +47 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.mjs +19 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance.service.mjs +18 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.mjs +126 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.mjs +48 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-routing.module.mjs +24 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances.module.mjs +67 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.mjs +120 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.mjs +44 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.mjs +53 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.mjs +47 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.mjs +125 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.mjs +38 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.module.mjs +53 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt.service.mjs +18 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +119 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-routing.module.mjs +24 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +75 -0
- package/esm2022/lib/inventory-common/stock-summary.service.mjs +26 -0
- package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector/payee-selector.component.mjs +59 -0
- package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector.module.mjs +35 -0
- package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.component.mjs +118 -0
- package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.service.mjs +17 -0
- package/esm2022/lib/inventory-common/supplier/supplier-information/supplier-information.component.mjs +72 -0
- package/esm2022/lib/inventory-common/supplier/supplier-routing.module.mjs +40 -0
- package/esm2022/lib/inventory-common/supplier/supplier-type.service.mjs +25 -0
- package/esm2022/lib/inventory-common/supplier/supplier-view/supplier-view.component.mjs +66 -0
- package/esm2022/lib/inventory-common/supplier/supplier.component.mjs +20 -0
- package/esm2022/lib/inventory-common/supplier/supplier.module.mjs +63 -0
- package/esm2022/lib/inventory-common/supplier/supplier.service.mjs +61 -0
- package/esm2022/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.mjs +241 -0
- package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.component.mjs +118 -0
- package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.module.mjs +38 -0
- package/esm2022/public-api.mjs +9 -0
- package/esm2022/techlify-inventory-common.mjs +5 -0
- package/fesm2022/techlify-inventory-common-category.module-Stn6e73V.mjs +257 -0
- package/fesm2022/techlify-inventory-common-category.module-Stn6e73V.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-measure.module-CirswKXn.mjs +313 -0
- package/fesm2022/techlify-inventory-common-measure.module-CirswKXn.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-product.module-qdeafFV5.mjs +1172 -0
- package/fesm2022/techlify-inventory-common-product.module-qdeafFV5.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-stock-issuances-list.module-CyFDxARk.mjs +436 -0
- package/fesm2022/techlify-inventory-common-stock-issuances-list.module-CyFDxARk.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-stock-issuances.module-Dm9i2kcf.mjs +89 -0
- package/fesm2022/techlify-inventory-common-stock-issuances.module-Dm9i2kcf.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-stock-receipt-form.module-BZDrN7la.mjs +302 -0
- package/fesm2022/techlify-inventory-common-stock-receipt-form.module-BZDrN7la.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-stock-receipts.module-CUPdWteR.mjs +253 -0
- package/fesm2022/techlify-inventory-common-stock-receipts.module-CUPdWteR.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-supplier-form.component-CHmMG7O8.mjs +178 -0
- package/fesm2022/techlify-inventory-common-supplier-form.component-CHmMG7O8.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-supplier.module-gzHesNtQ.mjs +665 -0
- package/fesm2022/techlify-inventory-common-supplier.module-gzHesNtQ.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs +14 -0
- package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-Czyc0jLI.mjs +495 -0
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-Czyc0jLI.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common.mjs +2 -0
- package/fesm2022/techlify-inventory-common.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/inventory-common/category/category-form/category-form.component.d.ts +19 -0
- package/lib/inventory-common/category/category-form-button/category-form-button.component.d.ts +13 -0
- package/lib/inventory-common/category/category-list-page/category-list-page.component.d.ts +20 -0
- package/lib/inventory-common/category/category-routing.module.d.ts +7 -0
- package/lib/inventory-common/category/category.module.d.ts +19 -0
- package/lib/inventory-common/category/category.service.d.ts +7 -0
- package/lib/inventory-common/inventory-common-routing.module.d.ts +7 -0
- package/lib/inventory-common/inventory-common.module.d.ts +13 -0
- package/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.d.ts +14 -0
- package/lib/inventory-common/material.module.d.ts +40 -0
- package/lib/inventory-common/measure/measure-delete/measure-delete-button/measure-delete-button.component.d.ts +19 -0
- package/lib/inventory-common/measure/measure-delete/measure-delete.module.d.ts +9 -0
- package/lib/inventory-common/measure/measure-form/measure-form/measure-form.component.d.ts +19 -0
- package/lib/inventory-common/measure/measure-form/measure-form-button/measure-form-button.component.d.ts +13 -0
- package/lib/inventory-common/measure/measure-form/measure-form.module.d.ts +11 -0
- package/lib/inventory-common/measure/measure-routing.module.d.ts +7 -0
- package/lib/inventory-common/measure/measure.module.d.ts +15 -0
- package/lib/inventory-common/measure/measure.service.d.ts +7 -0
- package/lib/inventory-common/measure/measures-list/measures-list.component.d.ts +17 -0
- package/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.d.ts +13 -0
- package/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.module.d.ts +12 -0
- package/lib/inventory-common/product/product-basic-info/product-basic-info.component.d.ts +19 -0
- package/lib/inventory-common/product/product-delete-button/product-delete-button.component.d.ts +26 -0
- package/lib/inventory-common/product/product-form/product-form.component.d.ts +44 -0
- package/lib/inventory-common/product/product-form-button/product-form-button.component.d.ts +20 -0
- package/lib/inventory-common/product/product-form.service.d.ts +7 -0
- package/lib/inventory-common/product/product-import-page/product-import-page.component.d.ts +10 -0
- package/lib/inventory-common/product/product-list/product-list.component.d.ts +44 -0
- package/lib/inventory-common/product/product-measure-form/product-measure-form.component.d.ts +33 -0
- package/lib/inventory-common/product/product-measures-list/product-measures-list.component.d.ts +43 -0
- package/lib/inventory-common/product/product-nav-bar/product-nav-bar.component.d.ts +5 -0
- package/lib/inventory-common/product/product-routing.module.d.ts +7 -0
- package/lib/inventory-common/product/product-summary-chart/product-summary-chart.component.d.ts +15 -0
- package/lib/inventory-common/product/product-summary-chart/product-summary-chart.module.d.ts +10 -0
- package/lib/inventory-common/product/product-tax/product-tax-delete-button/product-tax-delete-button.component.d.ts +26 -0
- package/lib/inventory-common/product/product-tax/product-tax-form-button/product-tax-form-button.component.d.ts +21 -0
- package/lib/inventory-common/product/product-tax/product-tax-list/product-tax-list.component.d.ts +13 -0
- package/lib/inventory-common/product/product-tax/product-tax.module.d.ts +12 -0
- package/lib/inventory-common/product/product-tax/product-tax.service.d.ts +7 -0
- package/lib/inventory-common/product/product-view-page/product-view-page.component.d.ts +33 -0
- package/lib/inventory-common/product/product.module.d.ts +28 -0
- package/lib/inventory-common/product/product.service.d.ts +19 -0
- package/lib/inventory-common/services/techlify-form-service.d.ts +5 -0
- package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.d.ts +18 -0
- package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.d.ts +9 -0
- package/lib/inventory-common/stock-issuances/stock-issuance.service.d.ts +7 -0
- package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.d.ts +24 -0
- package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.d.ts +15 -0
- package/lib/inventory-common/stock-issuances/stock-issuances-routing.module.d.ts +7 -0
- package/lib/inventory-common/stock-issuances/stock-issuances.module.d.ts +19 -0
- package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.d.ts +24 -0
- package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.d.ts +18 -0
- package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.d.ts +17 -0
- package/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.d.ts +18 -0
- package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.d.ts +22 -0
- package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.d.ts +16 -0
- package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.module.d.ts +17 -0
- package/lib/inventory-common/stock-receipts/stock-receipt.service.d.ts +7 -0
- package/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.d.ts +21 -0
- package/lib/inventory-common/stock-receipts/stock-receipts-routing.module.d.ts +7 -0
- package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +20 -0
- package/lib/inventory-common/stock-summary.service.d.ts +14 -0
- package/lib/inventory-common/supplier/payee-selector/payee-selector/payee-selector.component.d.ts +20 -0
- package/lib/inventory-common/supplier/payee-selector/payee-selector.module.d.ts +11 -0
- package/lib/inventory-common/supplier/supplier-form/supplier-form.component.d.ts +29 -0
- package/lib/inventory-common/supplier/supplier-form/supplier-form.service.d.ts +7 -0
- package/lib/inventory-common/supplier/supplier-information/supplier-information.component.d.ts +18 -0
- package/lib/inventory-common/supplier/supplier-routing.module.d.ts +7 -0
- package/lib/inventory-common/supplier/supplier-type.service.d.ts +13 -0
- package/lib/inventory-common/supplier/supplier-view/supplier-view.component.d.ts +20 -0
- package/lib/inventory-common/supplier/supplier.component.d.ts +10 -0
- package/lib/inventory-common/supplier/supplier.module.d.ts +18 -0
- package/lib/inventory-common/supplier/supplier.service.d.ts +39 -0
- package/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.d.ts +51 -0
- package/lib/inventory-common/techlify-filter/techlify-filter.component.d.ts +31 -0
- package/lib/inventory-common/techlify-filter/techlify-filter.module.d.ts +11 -0
- package/package.json +25 -0
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "ngx-techlify-core";
|
|
4
|
+
export class SupplierTypeService {
|
|
5
|
+
httpService;
|
|
6
|
+
constructor(httpService) {
|
|
7
|
+
this.httpService = httpService;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* get all suppliers from API
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
index() {
|
|
14
|
+
return this.httpService.get(`api/supplier-types`);
|
|
15
|
+
}
|
|
16
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierTypeService, deps: [{ token: i1.HttpService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
17
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierTypeService, providedIn: "root" });
|
|
18
|
+
}
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierTypeService, decorators: [{
|
|
20
|
+
type: Injectable,
|
|
21
|
+
args: [{
|
|
22
|
+
providedIn: "root",
|
|
23
|
+
}]
|
|
24
|
+
}], ctorParameters: () => [{ type: i1.HttpService }] });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcGxpZXItdHlwZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3VwcGxpZXIvc3VwcGxpZXItdHlwZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU0zQyxNQUFNLE9BQU8sbUJBQW1CO0lBQ1Y7SUFBcEIsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7SUFBRyxDQUFDO0lBRWhEOzs7T0FHRztJQUNILEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDcEQsQ0FBQzt3R0FUVSxtQkFBbUI7NEdBQW5CLG1CQUFtQixjQUZsQixNQUFNOzs0RkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gXCJuZ3gtdGVjaGxpZnktY29yZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBTdXBwbGllclR5cGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwU2VydmljZTogSHR0cFNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIGdldCBhbGwgc3VwcGxpZXJzIGZyb20gQVBJXG4gICAqXG4gICAqL1xuICBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5nZXQoYGFwaS9zdXBwbGllci10eXBlc2ApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { lastValueFrom } from "rxjs";
|
|
2
|
+
import { Component } from "@angular/core";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../supplier.service";
|
|
5
|
+
import * as i2 from "@angular/router";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "@angular/material/card";
|
|
8
|
+
import * as i5 from "@angular/material/progress-bar";
|
|
9
|
+
import * as i6 from "@angular/material/tabs";
|
|
10
|
+
import * as i7 from "ngx-techlify-core";
|
|
11
|
+
import * as i8 from "../supplier-information/supplier-information.component";
|
|
12
|
+
export class SupplierViewComponent {
|
|
13
|
+
supplierService;
|
|
14
|
+
route;
|
|
15
|
+
router;
|
|
16
|
+
supplier;
|
|
17
|
+
supplierId = 0;
|
|
18
|
+
selectedTabIndex = 0;
|
|
19
|
+
isLoading = false;
|
|
20
|
+
constructor(supplierService, route, router) {
|
|
21
|
+
this.supplierService = supplierService;
|
|
22
|
+
this.route = route;
|
|
23
|
+
this.router = router;
|
|
24
|
+
}
|
|
25
|
+
ngOnInit() {
|
|
26
|
+
this.route.firstChild?.url.subscribe((url) => {
|
|
27
|
+
if (url[0].path === "ratings") {
|
|
28
|
+
this.selectedTabIndex = 1;
|
|
29
|
+
}
|
|
30
|
+
else if (url[0].path === "estimates") {
|
|
31
|
+
this.selectedTabIndex = 2;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.selectedTabIndex = 0;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
this.supplierId = this.route.snapshot.params["id"];
|
|
38
|
+
this.getSupplier(this.supplierId);
|
|
39
|
+
}
|
|
40
|
+
onTabChange(event) {
|
|
41
|
+
switch (event.index) {
|
|
42
|
+
case 0:
|
|
43
|
+
this.router.navigate(["incidents"], { relativeTo: this.route });
|
|
44
|
+
return;
|
|
45
|
+
case 1:
|
|
46
|
+
this.router.navigate(["ratings"], { relativeTo: this.route });
|
|
47
|
+
return;
|
|
48
|
+
case 2:
|
|
49
|
+
this.router.navigate(["estimates"], { relativeTo: this.route });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async getSupplier(id) {
|
|
54
|
+
this.isLoading = true;
|
|
55
|
+
let result = await lastValueFrom(this.supplierService.show(id));
|
|
56
|
+
this.isLoading = false;
|
|
57
|
+
this.supplier = result.item;
|
|
58
|
+
}
|
|
59
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierViewComponent, deps: [{ token: i1.SupplierService }, { token: i2.ActivatedRoute }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
60
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SupplierViewComponent, selector: "app-supplier-view", ngImport: i0, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\n\n<div *ngIf=\"supplier\" class=\"d-flex justify-content-start gap-3\">\n <div style=\"width: 300px\">\n <app-supplier-information [supplier]=\"supplier\"></app-supplier-information>\n <mat-card class=\"mt-3\">\n <mat-card-content class=\"p-0\">\n <app-note-list\n modelType=\"Supplier\"\n [relatedModelId]=\"supplier?.id\"\n ></app-note-list>\n </mat-card-content>\n </mat-card>\n </div>\n\n <div style=\"width: calc(100% - 300px - 1rem)\">\n <mat-card style=\"width: fit-content\">\n <mat-card-content class=\"p-0\">\n <mat-tab-group\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [selectedIndex]=\"selectedTabIndex\"\n (selectedTabChange)=\"onTabChange($event)\"\n >\n <mat-tab>\n <ng-template mat-tab-label>\n <div\n class=\"d-flex justify-content-start align-items-center gap-1\"\n >\n <span class=\"material-symbols-outlined\">unknown_document</span>\n <span class=\"pl-2\">Incidents</span>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <div\n class=\"d-flex justify-content-start align-items-center gap-1\"\n >\n <span class=\"material-symbols-outlined\">star</span>\n <span class=\"pl-2\">Ratings</span>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <div\n class=\"d-flex justify-content-start align-items-center gap-1\"\n >\n <span class=\"material-symbols-outlined\">price_change</span>\n <span class=\"pl-2\">Estimates</span>\n </div>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n </mat-card>\n <router-outlet></router-outlet>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i6.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i7.NoteListComponent, selector: "app-note-list", inputs: ["relatedModelId", "modelType", "readonly", "labelText", "commentsView", "viewMode"] }, { kind: "component", type: i8.SupplierInformationComponent, selector: "app-supplier-information", inputs: ["supplier"] }], preserveWhitespaces: true });
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierViewComponent, decorators: [{
|
|
63
|
+
type: Component,
|
|
64
|
+
args: [{ selector: "app-supplier-view", template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\n\n<div *ngIf=\"supplier\" class=\"d-flex justify-content-start gap-3\">\n <div style=\"width: 300px\">\n <app-supplier-information [supplier]=\"supplier\"></app-supplier-information>\n <mat-card class=\"mt-3\">\n <mat-card-content class=\"p-0\">\n <app-note-list\n modelType=\"Supplier\"\n [relatedModelId]=\"supplier?.id\"\n ></app-note-list>\n </mat-card-content>\n </mat-card>\n </div>\n\n <div style=\"width: calc(100% - 300px - 1rem)\">\n <mat-card style=\"width: fit-content\">\n <mat-card-content class=\"p-0\">\n <mat-tab-group\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [selectedIndex]=\"selectedTabIndex\"\n (selectedTabChange)=\"onTabChange($event)\"\n >\n <mat-tab>\n <ng-template mat-tab-label>\n <div\n class=\"d-flex justify-content-start align-items-center gap-1\"\n >\n <span class=\"material-symbols-outlined\">unknown_document</span>\n <span class=\"pl-2\">Incidents</span>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <div\n class=\"d-flex justify-content-start align-items-center gap-1\"\n >\n <span class=\"material-symbols-outlined\">star</span>\n <span class=\"pl-2\">Ratings</span>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <div\n class=\"d-flex justify-content-start align-items-center gap-1\"\n >\n <span class=\"material-symbols-outlined\">price_change</span>\n <span class=\"pl-2\">Estimates</span>\n </div>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n </mat-card>\n <router-outlet></router-outlet>\n </div>\n</div>\n" }]
|
|
65
|
+
}], ctorParameters: () => [{ type: i1.SupplierService }, { type: i2.ActivatedRoute }, { type: i2.Router }] });
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcGxpZXItdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdXBwbGllci9zdXBwbGllci12aWV3L3N1cHBsaWVyLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3VwcGxpZXIvc3VwcGxpZXItdmlldy9zdXBwbGllci12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVNsRCxNQUFNLE9BQU8scUJBQXFCO0lBT3RCO0lBQ0E7SUFDQTtJQVJWLFFBQVEsQ0FBTTtJQUNkLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFDdkIsZ0JBQWdCLEdBQVcsQ0FBQyxDQUFDO0lBQzdCLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFFM0IsWUFDVSxlQUFnQyxFQUNoQyxLQUFxQixFQUNyQixNQUFjO1FBRmQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDckIsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBd0I7UUFDbEMsUUFBUSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLE9BQU87WUFDVCxLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsT0FBTztZQUNULEtBQUssQ0FBQztnQkFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQVU7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQVEsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQzt3R0E5Q1UscUJBQXFCOzRGQUFyQixxQkFBcUIseURDVmxDLDJtRUE0REE7OzRGRGxEYSxxQkFBcUI7a0JBSmpDLFNBQVM7K0JBQ0UsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbGFzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgU3VwcGxpZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3N1cHBsaWVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IE1hdFRhYkNoYW5nZUV2ZW50IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYnNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1zdXBwbGllci12aWV3XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vc3VwcGxpZXItdmlldy5jb21wb25lbnQuaHRtbFwiLFxufSlcbmV4cG9ydCBjbGFzcyBTdXBwbGllclZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBzdXBwbGllcjogYW55O1xuICBzdXBwbGllcklkOiBudW1iZXIgPSAwO1xuICBzZWxlY3RlZFRhYkluZGV4OiBudW1iZXIgPSAwO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN1cHBsaWVyU2VydmljZTogU3VwcGxpZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGUuZmlyc3RDaGlsZD8udXJsLnN1YnNjcmliZSgodXJsKSA9PiB7XG4gICAgICBpZiAodXJsWzBdLnBhdGggPT09IFwicmF0aW5nc1wiKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHVybFswXS5wYXRoID09PSBcImVzdGltYXRlc1wiKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdXBwbGllcklkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbXCJpZFwiXTtcbiAgICB0aGlzLmdldFN1cHBsaWVyKHRoaXMuc3VwcGxpZXJJZCk7XG4gIH1cblxuICBvblRhYkNoYW5nZShldmVudDogTWF0VGFiQ2hhbmdlRXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmluZGV4KSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImluY2lkZW50c1wiXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInJhdGluZ3NcIl0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJlc3RpbWF0ZXNcIl0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFN1cHBsaWVyKGlkOiBudW1iZXIpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgbGV0IHJlc3VsdDogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbSh0aGlzLnN1cHBsaWVyU2VydmljZS5zaG93KGlkKSk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN1cHBsaWVyID0gcmVzdWx0Lml0ZW07XG4gIH1cbn1cbiIsIjxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiaXNMb2FkaW5nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG5cbjxkaXYgKm5nSWY9XCJzdXBwbGllclwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBnYXAtM1wiPlxuICA8ZGl2IHN0eWxlPVwid2lkdGg6IDMwMHB4XCI+XG4gICAgPGFwcC1zdXBwbGllci1pbmZvcm1hdGlvbiBbc3VwcGxpZXJdPVwic3VwcGxpZXJcIj48L2FwcC1zdXBwbGllci1pbmZvcm1hdGlvbj5cbiAgICA8bWF0LWNhcmQgY2xhc3M9XCJtdC0zXCI+XG4gICAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cInAtMFwiPlxuICAgICAgICA8YXBwLW5vdGUtbGlzdFxuICAgICAgICAgIG1vZGVsVHlwZT1cIlN1cHBsaWVyXCJcbiAgICAgICAgICBbcmVsYXRlZE1vZGVsSWRdPVwic3VwcGxpZXI/LmlkXCJcbiAgICAgICAgPjwvYXBwLW5vdGUtbGlzdD5cbiAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICA8L21hdC1jYXJkPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwid2lkdGg6IGNhbGMoMTAwJSAtIDMwMHB4IC0gMXJlbSlcIj5cbiAgICA8bWF0LWNhcmQgc3R5bGU9XCJ3aWR0aDogZml0LWNvbnRlbnRcIj5cbiAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwicC0wXCI+XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwXG4gICAgICAgICAgbWF0LXN0cmV0Y2gtdGFicz1cImZhbHNlXCJcbiAgICAgICAgICBtYXQtYWxpZ24tdGFicz1cInN0YXJ0XCJcbiAgICAgICAgICBbc2VsZWN0ZWRJbmRleF09XCJzZWxlY3RlZFRhYkluZGV4XCJcbiAgICAgICAgICAoc2VsZWN0ZWRUYWJDaGFuZ2UpPVwib25UYWJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LXRhYj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj51bmtub3duX2RvY3VtZW50PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkluY2lkZW50czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICA8bWF0LXRhYj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5zdGFyPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPlJhdGluZ3M8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgPG1hdC10YWI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTFcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+cHJpY2VfY2hhbmdlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkVzdGltYXRlczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgIDwvbWF0LWNhcmQ+XG4gICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Component } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/material/dialog";
|
|
4
|
+
import * as i2 from "./supplier-form/supplier-form.service";
|
|
5
|
+
import * as i3 from "@angular/router";
|
|
6
|
+
export class SupplierComponent {
|
|
7
|
+
dialog;
|
|
8
|
+
supplierFormService;
|
|
9
|
+
constructor(dialog, supplierFormService) {
|
|
10
|
+
this.dialog = dialog;
|
|
11
|
+
this.supplierFormService = supplierFormService;
|
|
12
|
+
}
|
|
13
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierComponent, deps: [{ token: i1.MatDialog }, { token: i2.SupplierFormService }], target: i0.ɵɵFactoryTarget.Component });
|
|
14
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SupplierComponent, selector: "app-supplier", ngImport: i0, template: "<div>\n <router-outlet></router-outlet>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], preserveWhitespaces: true });
|
|
15
|
+
}
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierComponent, decorators: [{
|
|
17
|
+
type: Component,
|
|
18
|
+
args: [{ selector: "app-supplier", template: "<div>\n <router-outlet></router-outlet>\n</div>\n" }]
|
|
19
|
+
}], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.SupplierFormService }] });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcGxpZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3VwcGxpZXIvc3VwcGxpZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3VwcGxpZXIvc3VwcGxpZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFVMUMsTUFBTSxPQUFPLGlCQUFpQjtJQUVuQjtJQUNDO0lBRlYsWUFDUyxNQUFpQixFQUNoQixtQkFBd0M7UUFEekMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNoQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO0lBQy9DLENBQUM7d0dBSk8saUJBQWlCOzRGQUFqQixpQkFBaUIsb0RDVjlCLG9EQUdBOzs0RkRPYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdXBwbGllckZvcm1Db21wb25lbnQgfSBmcm9tIFwiLi9zdXBwbGllci1mb3JtL3N1cHBsaWVyLWZvcm0uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XG5pbXBvcnQgeyBTdXBwbGllckZvcm1TZXJ2aWNlIH0gZnJvbSBcIi4vc3VwcGxpZXItZm9ybS9zdXBwbGllci1mb3JtLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1zdXBwbGllclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3N1cHBsaWVyLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9zdXBwbGllci5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VwcGxpZXJDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBzdXBwbGllckZvcm1TZXJ2aWNlOiBTdXBwbGllckZvcm1TZXJ2aWNlXG4gICkge31cbn1cbiIsIjxkaXY+XG4gIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { AuditLogForModelModule, NoteModule, SearchableSelectorModule, } from "ngx-techlify-core";
|
|
2
|
+
import { NgModule } from "@angular/core";
|
|
3
|
+
import { CommonModule } from "@angular/common";
|
|
4
|
+
import { SupplierRoutingModule } from "./supplier-routing.module";
|
|
5
|
+
import { SupplierComponent } from "./supplier.component";
|
|
6
|
+
import { SupplierViewComponent } from "./supplier-view/supplier-view.component";
|
|
7
|
+
import { SuppliersListComponent } from "./suppliers-list/suppliers-list.component";
|
|
8
|
+
import { SupplierFormComponent } from "./supplier-form/supplier-form.component";
|
|
9
|
+
import { SupplierInformationComponent } from "./supplier-information/supplier-information.component";
|
|
10
|
+
import { FlexModule } from "@angular/flex-layout";
|
|
11
|
+
import { ReactiveFormsModule } from "@angular/forms";
|
|
12
|
+
import { InfiniteScrollModule } from "ngx-infinite-scroll";
|
|
13
|
+
import { MaterialModule } from '../material.module';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
export class SupplierModule {
|
|
16
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
17
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: SupplierModule, declarations: [SupplierComponent,
|
|
18
|
+
SupplierViewComponent,
|
|
19
|
+
SuppliersListComponent,
|
|
20
|
+
SupplierFormComponent,
|
|
21
|
+
SupplierInformationComponent], imports: [CommonModule,
|
|
22
|
+
SupplierRoutingModule,
|
|
23
|
+
MaterialModule,
|
|
24
|
+
SearchableSelectorModule,
|
|
25
|
+
AuditLogForModelModule,
|
|
26
|
+
NoteModule,
|
|
27
|
+
FlexModule,
|
|
28
|
+
ReactiveFormsModule,
|
|
29
|
+
InfiniteScrollModule] });
|
|
30
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierModule, imports: [CommonModule,
|
|
31
|
+
SupplierRoutingModule,
|
|
32
|
+
MaterialModule,
|
|
33
|
+
SearchableSelectorModule,
|
|
34
|
+
AuditLogForModelModule,
|
|
35
|
+
NoteModule,
|
|
36
|
+
FlexModule,
|
|
37
|
+
ReactiveFormsModule,
|
|
38
|
+
InfiniteScrollModule] });
|
|
39
|
+
}
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierModule, decorators: [{
|
|
41
|
+
type: NgModule,
|
|
42
|
+
args: [{
|
|
43
|
+
declarations: [
|
|
44
|
+
SupplierComponent,
|
|
45
|
+
SupplierViewComponent,
|
|
46
|
+
SuppliersListComponent,
|
|
47
|
+
SupplierFormComponent,
|
|
48
|
+
SupplierInformationComponent,
|
|
49
|
+
],
|
|
50
|
+
imports: [
|
|
51
|
+
CommonModule,
|
|
52
|
+
SupplierRoutingModule,
|
|
53
|
+
MaterialModule,
|
|
54
|
+
SearchableSelectorModule,
|
|
55
|
+
AuditLogForModelModule,
|
|
56
|
+
NoteModule,
|
|
57
|
+
FlexModule,
|
|
58
|
+
ReactiveFormsModule,
|
|
59
|
+
InfiniteScrollModule,
|
|
60
|
+
],
|
|
61
|
+
}]
|
|
62
|
+
}] });
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcGxpZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3VwcGxpZXIvc3VwcGxpZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLHdCQUF3QixHQUN6QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBc0JwRCxNQUFNLE9BQU8sY0FBYzt3R0FBZCxjQUFjO3lHQUFkLGNBQWMsaUJBbEJ2QixpQkFBaUI7WUFDakIscUJBQXFCO1lBQ3JCLHNCQUFzQjtZQUN0QixxQkFBcUI7WUFDckIsNEJBQTRCLGFBRzVCLFlBQVk7WUFDWixxQkFBcUI7WUFDckIsY0FBYztZQUNkLHdCQUF3QjtZQUN4QixzQkFBc0I7WUFDdEIsVUFBVTtZQUNWLFVBQVU7WUFDVixtQkFBbUI7WUFDbkIsb0JBQW9CO3lHQUdYLGNBQWMsWUFYdkIsWUFBWTtZQUNaLHFCQUFxQjtZQUNyQixjQUFjO1lBQ2Qsd0JBQXdCO1lBQ3hCLHNCQUFzQjtZQUN0QixVQUFVO1lBQ1YsVUFBVTtZQUNWLG1CQUFtQjtZQUNuQixvQkFBb0I7OzRGQUdYLGNBQWM7a0JBcEIxQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWixpQkFBaUI7d0JBQ2pCLHFCQUFxQjt3QkFDckIsc0JBQXNCO3dCQUN0QixxQkFBcUI7d0JBQ3JCLDRCQUE0QjtxQkFDN0I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1oscUJBQXFCO3dCQUNyQixjQUFjO3dCQUNkLHdCQUF3Qjt3QkFDeEIsc0JBQXNCO3dCQUN0QixVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsbUJBQW1CO3dCQUNuQixvQkFBb0I7cUJBQ3JCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXRMb2dGb3JNb2RlbE1vZHVsZSxcbiAgTm90ZU1vZHVsZSxcbiAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxufSBmcm9tIFwibmd4LXRlY2hsaWZ5LWNvcmVcIjtcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcblxuaW1wb3J0IHsgU3VwcGxpZXJSb3V0aW5nTW9kdWxlIH0gZnJvbSBcIi4vc3VwcGxpZXItcm91dGluZy5tb2R1bGVcIjtcbmltcG9ydCB7IFN1cHBsaWVyQ29tcG9uZW50IH0gZnJvbSBcIi4vc3VwcGxpZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdXBwbGllclZpZXdDb21wb25lbnQgfSBmcm9tIFwiLi9zdXBwbGllci12aWV3L3N1cHBsaWVyLXZpZXcuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdXBwbGllcnNMaXN0Q29tcG9uZW50IH0gZnJvbSBcIi4vc3VwcGxpZXJzLWxpc3Qvc3VwcGxpZXJzLWxpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdXBwbGllckZvcm1Db21wb25lbnQgfSBmcm9tIFwiLi9zdXBwbGllci1mb3JtL3N1cHBsaWVyLWZvcm0uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdXBwbGllckluZm9ybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4vc3VwcGxpZXItaW5mb3JtYXRpb24vc3VwcGxpZXItaW5mb3JtYXRpb24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2ZsZXgtbGF5b3V0XCI7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBJbmZpbml0ZVNjcm9sbE1vZHVsZSB9IGZyb20gXCJuZ3gtaW5maW5pdGUtc2Nyb2xsXCI7XG5pbXBvcnQgeyBNYXRlcmlhbE1vZHVsZSB9IGZyb20gJy4uL21hdGVyaWFsLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFN1cHBsaWVyQ29tcG9uZW50LFxuICAgIFN1cHBsaWVyVmlld0NvbXBvbmVudCxcbiAgICBTdXBwbGllcnNMaXN0Q29tcG9uZW50LFxuICAgIFN1cHBsaWVyRm9ybUNvbXBvbmVudCxcbiAgICBTdXBwbGllckluZm9ybWF0aW9uQ29tcG9uZW50LFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFN1cHBsaWVyUm91dGluZ01vZHVsZSxcbiAgICBNYXRlcmlhbE1vZHVsZSxcbiAgICBTZWFyY2hhYmxlU2VsZWN0b3JNb2R1bGUsXG4gICAgQXVkaXRMb2dGb3JNb2RlbE1vZHVsZSxcbiAgICBOb3RlTW9kdWxlLFxuICAgIEZsZXhNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBJbmZpbml0ZVNjcm9sbE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VwcGxpZXJNb2R1bGUge31cbiJdfQ==
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { HttpParams } from "@angular/common/http";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "ngx-techlify-core";
|
|
5
|
+
export class SupplierService {
|
|
6
|
+
httpService;
|
|
7
|
+
constructor(httpService) {
|
|
8
|
+
this.httpService = httpService;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* get all suppliers from API
|
|
12
|
+
*
|
|
13
|
+
* @param filters Any attributes to filter suppliers by
|
|
14
|
+
*/
|
|
15
|
+
index(filters) {
|
|
16
|
+
let queries = new HttpParams({ fromObject: filters });
|
|
17
|
+
return this.httpService.get(`api/suppliers`, { params: queries });
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* get individual supplier from API (for view page)
|
|
21
|
+
*
|
|
22
|
+
* @param id ID of the supplier being requested
|
|
23
|
+
*/
|
|
24
|
+
show(id) {
|
|
25
|
+
return this.httpService.get(`api/suppliers/${id}`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* store a new supplier in the DB
|
|
29
|
+
*
|
|
30
|
+
* @param model data from the supplier form that will be stored in the DB
|
|
31
|
+
*/
|
|
32
|
+
store(model) {
|
|
33
|
+
return this.httpService.post(`api/suppliers`, model);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* update a supplier in the DB
|
|
37
|
+
*
|
|
38
|
+
* @param model.id ID of the supplier being updated
|
|
39
|
+
* @param model data from the supplier form that will be updated in the DB
|
|
40
|
+
*/
|
|
41
|
+
update(model) {
|
|
42
|
+
return this.httpService.put(`api/suppliers/${model?.id}`, model);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* delete a supplier from the DB
|
|
46
|
+
*
|
|
47
|
+
* @param id ID of the supplier being deleted
|
|
48
|
+
*/
|
|
49
|
+
destroy(id) {
|
|
50
|
+
return this.httpService.delete(`api/suppliers/${id}`);
|
|
51
|
+
}
|
|
52
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierService, deps: [{ token: i1.HttpService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
53
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierService, providedIn: "root" });
|
|
54
|
+
}
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupplierService, decorators: [{
|
|
56
|
+
type: Injectable,
|
|
57
|
+
args: [{
|
|
58
|
+
providedIn: "root",
|
|
59
|
+
}]
|
|
60
|
+
}], ctorParameters: () => [{ type: i1.HttpService }] });
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcGxpZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3N1cHBsaWVyL3N1cHBsaWVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUtsRCxNQUFNLE9BQU8sZUFBZTtJQUNOO0lBQXBCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQztJQUVoRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLE9BQWE7UUFDakIsSUFBSSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLEVBQU87UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLEtBQVU7UUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsS0FBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxFQUFVO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQzt3R0FoRFUsZUFBZTs0R0FBZixlQUFlLGNBRmQsTUFBTTs7NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSBcIm5neC10ZWNobGlmeS1jb3JlXCI7XG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXG59KVxuZXhwb3J0IGNsYXNzIFN1cHBsaWVyU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cFNlcnZpY2U6IEh0dHBTZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiBnZXQgYWxsIHN1cHBsaWVycyBmcm9tIEFQSVxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVycyBBbnkgYXR0cmlidXRlcyB0byBmaWx0ZXIgc3VwcGxpZXJzIGJ5XG4gICAqL1xuICBpbmRleChmaWx0ZXJzPzogYW55KSB7XG4gICAgbGV0IHF1ZXJpZXMgPSBuZXcgSHR0cFBhcmFtcyh7IGZyb21PYmplY3Q6IGZpbHRlcnMgfSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuZ2V0KGBhcGkvc3VwcGxpZXJzYCwgeyBwYXJhbXM6IHF1ZXJpZXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGluZGl2aWR1YWwgc3VwcGxpZXIgZnJvbSBBUEkgKGZvciB2aWV3IHBhZ2UpXG4gICAqXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgc3VwcGxpZXIgYmVpbmcgcmVxdWVzdGVkXG4gICAqL1xuICBzaG93KGlkOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5nZXQoYGFwaS9zdXBwbGllcnMvJHtpZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdG9yZSBhIG5ldyBzdXBwbGllciBpbiB0aGUgREJcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIGRhdGEgZnJvbSB0aGUgc3VwcGxpZXIgZm9ybSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBEQlxuICAgKi9cbiAgc3RvcmUobW9kZWw6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLnBvc3QoYGFwaS9zdXBwbGllcnNgLCBtb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlIGEgc3VwcGxpZXIgaW4gdGhlIERCXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbC5pZCBJRCBvZiB0aGUgc3VwcGxpZXIgYmVpbmcgdXBkYXRlZFxuICAgKiBAcGFyYW0gbW9kZWwgZGF0YSBmcm9tIHRoZSBzdXBwbGllciBmb3JtIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGluIHRoZSBEQlxuICAgKi9cbiAgdXBkYXRlKG1vZGVsOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5wdXQoYGFwaS9zdXBwbGllcnMvJHttb2RlbD8uaWR9YCwgbW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlbGV0ZSBhIHN1cHBsaWVyIGZyb20gdGhlIERCXG4gICAqXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgc3VwcGxpZXIgYmVpbmcgZGVsZXRlZFxuICAgKi9cbiAgZGVzdHJveShpZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuZGVsZXRlKGBhcGkvc3VwcGxpZXJzLyR7aWR9YCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Component } from "@angular/core";
|
|
3
|
+
import { MatTableDataSource } from "@angular/material/table";
|
|
4
|
+
import { UntilDestroy, untilDestroyed } from "@ngneat/until-destroy";
|
|
5
|
+
import { ActionPopupComponent, TechlifyListingControllerInterface, } from "ngx-techlify-core";
|
|
6
|
+
import { debounceTime, lastValueFrom } from "rxjs";
|
|
7
|
+
import { SupplierFormComponent } from "../supplier-form/supplier-form.component";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "ngx-spinner";
|
|
10
|
+
import * as i2 from "@angular/forms";
|
|
11
|
+
import * as i3 from "../supplier.service";
|
|
12
|
+
import * as i4 from "../supplier-type.service";
|
|
13
|
+
import * as i5 from "ngx-techlify-core";
|
|
14
|
+
import * as i6 from "@angular/router";
|
|
15
|
+
import * as i7 from "@angular/material/dialog";
|
|
16
|
+
import * as i8 from "../supplier-form/supplier-form.service";
|
|
17
|
+
import * as i9 from "@angular/common";
|
|
18
|
+
import * as i10 from "@angular/material/button";
|
|
19
|
+
import * as i11 from "@angular/material/button-toggle";
|
|
20
|
+
import * as i12 from "@angular/material/card";
|
|
21
|
+
import * as i13 from "@angular/material/form-field";
|
|
22
|
+
import * as i14 from "@angular/material/icon";
|
|
23
|
+
import * as i15 from "@angular/material/input";
|
|
24
|
+
import * as i16 from "@angular/material/progress-bar";
|
|
25
|
+
import * as i17 from "@angular/material/sort";
|
|
26
|
+
import * as i18 from "@angular/material/table";
|
|
27
|
+
import * as i19 from "@angular/material/tooltip";
|
|
28
|
+
import * as i20 from "@angular/flex-layout";
|
|
29
|
+
import * as i21 from "ngx-infinite-scroll";
|
|
30
|
+
let SuppliersListComponent = class SuppliersListComponent extends TechlifyListingControllerInterface {
|
|
31
|
+
spinner;
|
|
32
|
+
fb;
|
|
33
|
+
supplierService;
|
|
34
|
+
supplierTypeService;
|
|
35
|
+
errorHandler;
|
|
36
|
+
filterService;
|
|
37
|
+
activatedRoute;
|
|
38
|
+
alertService;
|
|
39
|
+
dialog;
|
|
40
|
+
supplierFormService;
|
|
41
|
+
displayedColumns = [
|
|
42
|
+
"#",
|
|
43
|
+
"company_name",
|
|
44
|
+
"contact_name",
|
|
45
|
+
"phone",
|
|
46
|
+
"address",
|
|
47
|
+
"email",
|
|
48
|
+
"details",
|
|
49
|
+
"actions",
|
|
50
|
+
];
|
|
51
|
+
filterFormGroup;
|
|
52
|
+
dataSource = new MatTableDataSource();
|
|
53
|
+
totalItems = 0;
|
|
54
|
+
currentPage = 1;
|
|
55
|
+
routeFilters;
|
|
56
|
+
supplierTypes;
|
|
57
|
+
isLoading = false;
|
|
58
|
+
constructor(spinner, fb, supplierService, supplierTypeService, errorHandler, filterService, activatedRoute, alertService, dialog, supplierFormService) {
|
|
59
|
+
super();
|
|
60
|
+
this.spinner = spinner;
|
|
61
|
+
this.fb = fb;
|
|
62
|
+
this.supplierService = supplierService;
|
|
63
|
+
this.supplierTypeService = supplierTypeService;
|
|
64
|
+
this.errorHandler = errorHandler;
|
|
65
|
+
this.filterService = filterService;
|
|
66
|
+
this.activatedRoute = activatedRoute;
|
|
67
|
+
this.alertService = alertService;
|
|
68
|
+
this.dialog = dialog;
|
|
69
|
+
this.supplierFormService = supplierFormService;
|
|
70
|
+
this.page = 1;
|
|
71
|
+
this.perPage = 25;
|
|
72
|
+
this.models = [];
|
|
73
|
+
this.filterFormGroup = this.fb.group({
|
|
74
|
+
search: [""],
|
|
75
|
+
supplier_type_ids: ["1,2"],
|
|
76
|
+
num_items: [this.perPage + "|" + this.currentPage],
|
|
77
|
+
sort_by: [""],
|
|
78
|
+
});
|
|
79
|
+
this.supplierTypes = [];
|
|
80
|
+
}
|
|
81
|
+
ngOnInit() {
|
|
82
|
+
this.patchFiltersFromRoute();
|
|
83
|
+
this.listenForChanges();
|
|
84
|
+
this.getSupplierTypes();
|
|
85
|
+
this.loadData();
|
|
86
|
+
}
|
|
87
|
+
listenForChanges() {
|
|
88
|
+
// listen for supplier added event to update the list.
|
|
89
|
+
this.supplierFormService.isListUpdated().subscribe((val) => {
|
|
90
|
+
if (val && !this.isLoading)
|
|
91
|
+
this.reload();
|
|
92
|
+
});
|
|
93
|
+
// listen for form group changes.
|
|
94
|
+
this.filterFormGroup.valueChanges
|
|
95
|
+
.pipe(debounceTime(500), untilDestroyed(this))
|
|
96
|
+
.subscribe((changes) => {
|
|
97
|
+
this.filterService.applyFilterToRoute(this.activatedRoute, this.filterFormGroup.value);
|
|
98
|
+
this.reload();
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
patchFiltersFromRoute() {
|
|
102
|
+
this.routeFilters = this.filterService.getFiltersFromRoute(this.activatedRoute, this.filterFormGroup.value);
|
|
103
|
+
this.filterFormGroup.setValue(this.routeFilters);
|
|
104
|
+
if (this.routeFilters.supplier_type_ids) {
|
|
105
|
+
this.filterFormGroup
|
|
106
|
+
.get("supplier_type_ids")
|
|
107
|
+
.setValue(this.routeFilters.supplier_type_ids.split(",").map(Number));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
sortColumn(event) {
|
|
111
|
+
var direction = event.direction.toString().toUpperCase();
|
|
112
|
+
this.assignFilter(event.active, direction);
|
|
113
|
+
}
|
|
114
|
+
assignFilter(column, direction) {
|
|
115
|
+
return this.filterFormGroup
|
|
116
|
+
.get("sort_by")
|
|
117
|
+
?.setValue(column + "|" + direction);
|
|
118
|
+
}
|
|
119
|
+
async getSupplierTypes() {
|
|
120
|
+
try {
|
|
121
|
+
let res = await lastValueFrom(this.supplierTypeService.index());
|
|
122
|
+
this.supplierTypes = res.data;
|
|
123
|
+
console.log(this.supplierTypes);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
this.errorHandler.handleError(error);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async loadData() {
|
|
130
|
+
let filters = this.filterFormGroup.value;
|
|
131
|
+
filters.page = this.page = 1;
|
|
132
|
+
filters.per_page = this.perPage;
|
|
133
|
+
filters.supplier_type_ids = filters?.supplier_type_ids?.toString();
|
|
134
|
+
filters.num_items = this.perPage + "|" + this.currentPage;
|
|
135
|
+
try {
|
|
136
|
+
this.isLoading = true;
|
|
137
|
+
let res = await lastValueFrom(this.supplierService.index(filters));
|
|
138
|
+
if (this.models.length < 1) {
|
|
139
|
+
this.models = res.data;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
res.data.forEach((item) => this.models.push(item));
|
|
143
|
+
}
|
|
144
|
+
this.dataSource = new MatTableDataSource(this.models);
|
|
145
|
+
this.totalItems = res.total;
|
|
146
|
+
this.lastPage = res.last_page || this.page;
|
|
147
|
+
// list is updated do not listen form isListUpdated
|
|
148
|
+
this.supplierFormService.listUpdated(false);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
this.errorHandler.handleError(error);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
this.isLoading = false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
reload() {
|
|
158
|
+
if (this.isLoading)
|
|
159
|
+
return;
|
|
160
|
+
this.models = [];
|
|
161
|
+
this.currentPage = 1;
|
|
162
|
+
this.loadData();
|
|
163
|
+
}
|
|
164
|
+
onScroll() {
|
|
165
|
+
if (this.totalItems > this.models.length && !this.isLoading) {
|
|
166
|
+
this.currentPage += 1;
|
|
167
|
+
this.loadData();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
editForm(model) {
|
|
171
|
+
const dialogRef = this.dialog.open(SupplierFormComponent, {
|
|
172
|
+
width: "400px",
|
|
173
|
+
autoFocus: false,
|
|
174
|
+
data: {
|
|
175
|
+
details: model,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
dialogRef.afterClosed().subscribe((result) => {
|
|
179
|
+
if (result) {
|
|
180
|
+
this.reload();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
deleteForm(supplier) {
|
|
185
|
+
const dialogRef = this.dialog.open(ActionPopupComponent, {
|
|
186
|
+
width: "400px",
|
|
187
|
+
data: {
|
|
188
|
+
title: "Delete Supplier",
|
|
189
|
+
message: "Are you sure you want to delete the Supplier?",
|
|
190
|
+
},
|
|
191
|
+
autoFocus: false,
|
|
192
|
+
});
|
|
193
|
+
dialogRef.afterClosed().subscribe(async (result) => {
|
|
194
|
+
if (result) {
|
|
195
|
+
this.spinner.show();
|
|
196
|
+
try {
|
|
197
|
+
const result = await lastValueFrom(this.supplierService.destroy(supplier.id));
|
|
198
|
+
this.alertService.addAlert("Successfully deleted the Supplier", "success");
|
|
199
|
+
this.reload();
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
this.errorHandler.handleError(error);
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
this.spinner.hide();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Show the supplier create form.
|
|
212
|
+
*
|
|
213
|
+
* @param model
|
|
214
|
+
*/
|
|
215
|
+
showAddSupplierDialog(model) {
|
|
216
|
+
const dialogRef = this.dialog.open(SupplierFormComponent, {
|
|
217
|
+
width: "400px",
|
|
218
|
+
autoFocus: false,
|
|
219
|
+
data: {
|
|
220
|
+
model,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
dialogRef.afterClosed().subscribe((result) => {
|
|
224
|
+
if (result) {
|
|
225
|
+
// record added successfully, inform the list component.
|
|
226
|
+
this.supplierFormService.listUpdated(true);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SuppliersListComponent, deps: [{ token: i1.NgxSpinnerService }, { token: i2.FormBuilder }, { token: i3.SupplierService }, { token: i4.SupplierTypeService }, { token: i5.ErrorHandlerService }, { token: i5.FilterService }, { token: i6.ActivatedRoute }, { token: i5.AlertService }, { token: i7.MatDialog }, { token: i8.SupplierFormService }], target: i0.ɵɵFactoryTarget.Component });
|
|
231
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SuppliersListComponent, selector: "app-suppliers-list", usesInheritance: true, ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center gap-3 mb-3\">\n <h2 class=\"mb-0\">Suppliers</h2>\n <mat-icon\n color=\"primary\"\n class=\"cursor-pointer\"\n (click)=\"showAddSupplierDialog()\"\n >\n add\n </mat-icon>\n</div>\n<mat-card class=\"mb-3\">\n <mat-card-content>\n <form\n [formGroup]=\"filterFormGroup\"\n fxLayout\n fxLayoutGap=\"1rem\"\n fxLayoutAlign=\"start center\"\n >\n <mat-form-field fxFlex=\"24\">\n <input\n matInput\n placeholder=\"Search Supplier by Name, Phone, Address, Email, Description\"\n formControlName=\"search\"\n />\n <mat-icon matSuffix>search</mat-icon>\n </mat-form-field>\n <mat-label class=\"ml-4\">Type</mat-label>\n <mat-button-toggle-group formControlName=\"supplier_type_ids\" multiple>\n <mat-button-toggle\n *ngFor=\"let item of supplierTypes\"\n [value]=\"item.id\"\n >{{ item.title }}</mat-button-toggle\n >\n </mat-button-toggle-group>\n </form>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n #table\n [dataSource]=\"dataSource\"\n class=\"w-100 table-hover\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n matSort\n (matSortChange)=\"sortColumn($event)\"\n aria-describedby=\"Suppliers List\"\n >\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = index\">{{ i + 1 }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"company_name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Company</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <strong>{{ element?.company_name }}</strong>\n <span class=\"status-pill status-pill-sm status-ongoing\">\n {{ element?.type?.title }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"contact_name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Contact Name</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.contact_name }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"phone\">\n <th mat-header-cell *matHeaderCellDef>Phone</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.phone }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"address\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Address</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.address }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Email</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.email }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.details }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"text-secondary\" fxLayoutGap=\"1rem\">\n <app-audit-log-for-model\n [modelId]=\"element?.id\"\n modelType=\"Supplier\"\n logView=\"all\"\n ></app-audit-log-for-model>\n <button\n mat-icon-button\n [routerLink]=\"['/suppliers', element.id, 'view']\"\n routerLinkActive=\"route-link-active\"\n *ngxPermissionsOnly=\"['supplier.read']\"\n >\n <mat-icon matTooltip=\"View\">remove_red_eye</mat-icon>\n </button>\n <button\n *ngxPermissionsOnly=\"['supplier.update']\"\n mat-icon-button\n (click)=\"editForm(element)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n *ngxPermissionsOnly=\"['supplier.delete']\"\n type=\"button\"\n mat-icon-button\n (click)=\"deleteForm(element)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n", dependencies: [{ kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i11.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i11.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i12.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i12.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatLabel, selector: "mat-label" }, { kind: "directive", type: i13.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i16.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i17.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i17.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i18.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i18.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i18.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i18.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i18.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i18.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i18.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i18.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i18.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i18.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i19.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i5.AuditLogForModelComponent, selector: "app-audit-log-for-model", inputs: ["modelType", "modelId", "logView"] }, { kind: "directive", type: i20.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i20.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i20.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i20.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i21.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }], preserveWhitespaces: true });
|
|
232
|
+
};
|
|
233
|
+
SuppliersListComponent = __decorate([
|
|
234
|
+
UntilDestroy()
|
|
235
|
+
], SuppliersListComponent);
|
|
236
|
+
export { SuppliersListComponent };
|
|
237
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SuppliersListComponent, decorators: [{
|
|
238
|
+
type: Component,
|
|
239
|
+
args: [{ selector: "app-suppliers-list", template: "<div class=\"d-flex justify-content-center align-items-center gap-3 mb-3\">\n <h2 class=\"mb-0\">Suppliers</h2>\n <mat-icon\n color=\"primary\"\n class=\"cursor-pointer\"\n (click)=\"showAddSupplierDialog()\"\n >\n add\n </mat-icon>\n</div>\n<mat-card class=\"mb-3\">\n <mat-card-content>\n <form\n [formGroup]=\"filterFormGroup\"\n fxLayout\n fxLayoutGap=\"1rem\"\n fxLayoutAlign=\"start center\"\n >\n <mat-form-field fxFlex=\"24\">\n <input\n matInput\n placeholder=\"Search Supplier by Name, Phone, Address, Email, Description\"\n formControlName=\"search\"\n />\n <mat-icon matSuffix>search</mat-icon>\n </mat-form-field>\n <mat-label class=\"ml-4\">Type</mat-label>\n <mat-button-toggle-group formControlName=\"supplier_type_ids\" multiple>\n <mat-button-toggle\n *ngFor=\"let item of supplierTypes\"\n [value]=\"item.id\"\n >{{ item.title }}</mat-button-toggle\n >\n </mat-button-toggle-group>\n </form>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n #table\n [dataSource]=\"dataSource\"\n class=\"w-100 table-hover\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n matSort\n (matSortChange)=\"sortColumn($event)\"\n aria-describedby=\"Suppliers List\"\n >\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = index\">{{ i + 1 }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"company_name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Company</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <strong>{{ element?.company_name }}</strong>\n <span class=\"status-pill status-pill-sm status-ongoing\">\n {{ element?.type?.title }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"contact_name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Contact Name</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.contact_name }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"phone\">\n <th mat-header-cell *matHeaderCellDef>Phone</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.phone }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"address\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Address</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.address }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Email</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.email }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.details }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"text-secondary\" fxLayoutGap=\"1rem\">\n <app-audit-log-for-model\n [modelId]=\"element?.id\"\n modelType=\"Supplier\"\n logView=\"all\"\n ></app-audit-log-for-model>\n <button\n mat-icon-button\n [routerLink]=\"['/suppliers', element.id, 'view']\"\n routerLinkActive=\"route-link-active\"\n *ngxPermissionsOnly=\"['supplier.read']\"\n >\n <mat-icon matTooltip=\"View\">remove_red_eye</mat-icon>\n </button>\n <button\n *ngxPermissionsOnly=\"['supplier.update']\"\n mat-icon-button\n (click)=\"editForm(element)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n *ngxPermissionsOnly=\"['supplier.delete']\"\n type=\"button\"\n mat-icon-button\n (click)=\"deleteForm(element)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n" }]
|
|
240
|
+
}], ctorParameters: () => [{ type: i1.NgxSpinnerService }, { type: i2.FormBuilder }, { type: i3.SupplierService }, { type: i4.SupplierTypeService }, { type: i5.ErrorHandlerService }, { type: i5.FilterService }, { type: i6.ActivatedRoute }, { type: i5.AlertService }, { type: i7.MatDialog }, { type: i8.SupplierFormService }] });
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcGxpZXJzLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3VwcGxpZXIvc3VwcGxpZXJzLWxpc3Qvc3VwcGxpZXJzLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3VwcGxpZXIvc3VwcGxpZXJzLWxpc3Qvc3VwcGxpZXJzLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRSxPQUFPLEVBRUwsb0JBQW9CLEVBSXBCLGtDQUFrQyxHQUNuQyxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVMxRSxJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUNYLFNBQVEsa0NBQWtDO0lBdUJoQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTdCVixnQkFBZ0IsR0FBYTtRQUMzQixHQUFHO1FBQ0gsY0FBYztRQUNkLGNBQWM7UUFDZCxPQUFPO1FBQ1AsU0FBUztRQUNULE9BQU87UUFDUCxTQUFTO1FBQ1QsU0FBUztLQUNWLENBQUM7SUFFSyxlQUFlLENBQVk7SUFDM0Is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QUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ2hELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsd0RBQXdEO2dCQUN4RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBck5VLHNCQUFzQjs0RkFBdEIsc0JBQXNCLGlGQ3pCbkMsaTJKQTRJQTs7QURuSGEsc0JBQXNCO0lBTGxDLFlBQVksRUFBRTtHQUtGLHNCQUFzQixDQXNObEM7OzRGQXROWSxzQkFBc0I7a0JBSmxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tIFwiQG5nbmVhdC91bnRpbC1kZXN0cm95XCI7XG5pbXBvcnQgeyBOZ3hTcGlubmVyU2VydmljZSB9IGZyb20gXCJuZ3gtc3Bpbm5lclwiO1xuaW1wb3J0IHtcbiAgQWN0aW9uUG9wdXAsXG4gIEFjdGlvblBvcHVwQ29tcG9uZW50LFxuICBBbGVydFNlcnZpY2UsXG4gIEVycm9ySGFuZGxlclNlcnZpY2UsXG4gIEZpbHRlclNlcnZpY2UsXG4gIFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UsXG59IGZyb20gXCJuZ3gtdGVjaGxpZnktY29yZVwiO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBsYXN0VmFsdWVGcm9tIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IFN1cHBsaWVyRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuLi9zdXBwbGllci1mb3JtL3N1cHBsaWVyLWZvcm0uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdXBwbGllclR5cGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3N1cHBsaWVyLXR5cGUuc2VydmljZVwiO1xuaW1wb3J0IHsgU3VwcGxpZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3N1cHBsaWVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFN1cHBsaWVyRm9ybVNlcnZpY2UgfSBmcm9tIFwiLi4vc3VwcGxpZXItZm9ybS9zdXBwbGllci1mb3JtLnNlcnZpY2VcIjtcbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1zdXBwbGllcnMtbGlzdFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3N1cHBsaWVycy1saXN0LmNvbXBvbmVudC5odG1sXCIsXG59KVxuZXhwb3J0IGNsYXNzIFN1cHBsaWVyc0xpc3RDb21wb25lbnRcbiAgZXh0ZW5kcyBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlXG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgIFwiI1wiLFxuICAgIFwiY29tcGFueV9uYW1lXCIsXG4gICAgXCJjb250YWN0X25hbWVcIixcbiAgICBcInBob25lXCIsXG4gICAgXCJhZGRyZXNzXCIsXG4gICAgXCJlbWFpbFwiLFxuICAgIFwiZGV0YWlsc1wiLFxuICAgIFwiYWN0aW9uc1wiLFxuICBdO1xuXG4gIHB1YmxpYyBmaWx0ZXJGb3JtR3JvdXA6IEZvcm1Hcm91cDtcbiAgcHVibGljIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XG4gIHB1YmxpYyB0b3RhbEl0ZW1zID0gMDtcbiAgcHVibGljIGN1cnJlbnRQYWdlID0gMTtcbiAgcHVibGljIHJvdXRlRmlsdGVyczogYW55O1xuICBwdWJsaWMgc3VwcGxpZXJUeXBlczogYW55O1xuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzcGlubmVyOiBOZ3hTcGlubmVyU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHN1cHBsaWVyU2VydmljZTogU3VwcGxpZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3VwcGxpZXJUeXBlU2VydmljZTogU3VwcGxpZXJUeXBlU2VydmljZSxcbiAgICBwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyU2VydmljZSxcbiAgICBwcml2YXRlIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc3VwcGxpZXJGb3JtU2VydmljZTogU3VwcGxpZXJGb3JtU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFnZSA9IDE7XG4gICAgdGhpcy5wZXJQYWdlID0gMjU7XG4gICAgdGhpcy5tb2RlbHMgPSBbXTtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc2VhcmNoOiBbXCJcIl0sXG4gICAgICBzdXBwbGllcl90eXBlX2lkczogW1wiMSwyXCJdLFxuICAgICAgbnVtX2l0ZW1zOiBbdGhpcy5wZXJQYWdlICsgXCJ8XCIgKyB0aGlzLmN1cnJlbnRQYWdlXSxcbiAgICAgIHNvcnRfYnk6IFtcIlwiXSxcbiAgICB9KTtcbiAgICB0aGlzLnN1cHBsaWVyVHlwZXMgPSBbXTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucGF0Y2hGaWx0ZXJzRnJvbVJvdXRlKCk7XG4gICAgdGhpcy5saXN0ZW5Gb3JDaGFuZ2VzKCk7XG4gICAgdGhpcy5nZXRTdXBwbGllclR5cGVzKCk7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbGlzdGVuRm9yQ2hhbmdlcygpIHtcbiAgICAvLyBsaXN0ZW4gZm9yIHN1cHBsaWVyIGFkZGVkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbGlzdC5cbiAgICB0aGlzLnN1cHBsaWVyRm9ybVNlcnZpY2UuaXNMaXN0VXBkYXRlZCgpLnN1YnNjcmliZSgodmFsOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodmFsICYmICF0aGlzLmlzTG9hZGluZykgdGhpcy5yZWxvYWQoKTtcbiAgICB9KTtcbiAgICAvLyBsaXN0ZW4gZm9yIGZvcm0gZ3JvdXAgY2hhbmdlcy5cbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCB1bnRpbERlc3Ryb3llZCh0aGlzKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmFwcGx5RmlsdGVyVG9Sb3V0ZShcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHBhdGNoRmlsdGVyc0Zyb21Sb3V0ZSgpIHtcbiAgICB0aGlzLnJvdXRlRmlsdGVycyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXRGaWx0ZXJzRnJvbVJvdXRlKFxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlXG4gICAgKTtcbiAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC5zZXRWYWx1ZSh0aGlzLnJvdXRlRmlsdGVycyk7XG5cbiAgICBpZiAodGhpcy5yb3V0ZUZpbHRlcnMuc3VwcGxpZXJfdHlwZV9pZHMpIHtcbiAgICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwXG4gICAgICAgIC5nZXQoXCJzdXBwbGllcl90eXBlX2lkc1wiKSFcbiAgICAgICAgLnNldFZhbHVlKHRoaXMucm91dGVGaWx0ZXJzLnN1cHBsaWVyX3R5cGVfaWRzLnNwbGl0KFwiLFwiKS5tYXAoTnVtYmVyKSk7XG4gICAgfVxuICB9XG5cbiAgc29ydENvbHVtbihldmVudDogYW55KSB7XG4gICAgdmFyIGRpcmVjdGlvbiA9IGV2ZW50LmRpcmVjdGlvbi50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG4gICAgdGhpcy5hc3NpZ25GaWx0ZXIoZXZlbnQuYWN0aXZlLCBkaXJlY3Rpb24pO1xuICB9XG5cbiAgYXNzaWduRmlsdGVyKGNvbHVtbjogYW55LCBkaXJlY3Rpb246IGFueSkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm1Hcm91cFxuICAgICAgLmdldChcInNvcnRfYnlcIilcbiAgICAgID8uc2V0VmFsdWUoY29sdW1uICsgXCJ8XCIgKyBkaXJlY3Rpb24pO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3VwcGxpZXJUeXBlcygpIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbSh0aGlzLnN1cHBsaWVyVHlwZVNlcnZpY2UuaW5kZXgoKSk7XG4gICAgICB0aGlzLnN1cHBsaWVyVHlwZXMgPSByZXMuZGF0YTtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuc3VwcGxpZXJUeXBlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkRGF0YSgpIHtcbiAgICBsZXQgZmlsdGVycyA9IHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlO1xuICAgIGZpbHRlcnMucGFnZSA9IHRoaXMucGFnZSA9IDE7XG4gICAgZmlsdGVycy5wZXJfcGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICBmaWx0ZXJzLnN1cHBsaWVyX3R5cGVfaWRzID0gZmlsdGVycz8uc3VwcGxpZXJfdHlwZV9pZHM/LnRvU3RyaW5nKCk7XG4gICAgZmlsdGVycy5udW1faXRlbXMgPSB0aGlzLnBlclBhZ2UgKyBcInxcIiArIHRoaXMuY3VycmVudFBhZ2U7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIGxldCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5zdXBwbGllclNlcnZpY2UuaW5kZXgoZmlsdGVycykpO1xuICAgICAgaWYgKHRoaXMubW9kZWxzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhpcy5tb2RlbHMgPSByZXMuZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5kYXRhLmZvckVhY2goKGl0ZW06IGFueSkgPT4gdGhpcy5tb2RlbHMucHVzaChpdGVtKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMubW9kZWxzKTtcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlcy50b3RhbDtcbiAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXMubGFzdF9wYWdlIHx8IHRoaXMucGFnZTtcbiAgICAgIC8vIGxpc3QgaXMgdXBkYXRlZCBkbyBub3QgbGlzdGVuIGZvcm0gaXNMaXN0VXBkYXRlZFxuICAgICAgdGhpcy5zdXBwbGllckZvcm1TZXJ2aWNlLmxpc3RVcGRhdGVkKGZhbHNlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbG9hZCgpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHJldHVybjtcbiAgICB0aGlzLm1vZGVscyA9IFtdO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG9uU2Nyb2xsKCkge1xuICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPiB0aGlzLm1vZGVscy5sZW5ndGggJiYgIXRoaXMuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlICs9IDE7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgZWRpdEZvcm0obW9kZWw/OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFN1cHBsaWVyRm9ybUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6IFwiNDAwcHhcIixcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGRldGFpbHM6IG1vZGVsLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBkZWxldGVGb3JtKHN1cHBsaWVyOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFjdGlvblBvcHVwQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogXCI0MDBweFwiLFxuICAgICAgZGF0YTogPEFjdGlvblBvcHVwPntcbiAgICAgICAgdGl0bGU6IFwiRGVsZXRlIFN1cHBsaWVyXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgU3VwcGxpZXI/XCIsXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc3Bpbm5lci5zaG93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcbiAgICAgICAgICAgIHRoaXMuc3VwcGxpZXJTZXJ2aWNlLmRlc3Ryb3koc3VwcGxpZXIuaWQpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcbiAgICAgICAgICAgIFwiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgdGhlIFN1cHBsaWVyXCIsXG4gICAgICAgICAgICBcInN1Y2Nlc3NcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5zcGlubmVyLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIHN1cHBsaWVyIGNyZWF0ZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWxcbiAgICovXG4gIHNob3dBZGRTdXBwbGllckRpYWxvZyhtb2RlbD86IGFueSkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU3VwcGxpZXJGb3JtQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogXCI0MDBweFwiLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgbW9kZWwsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyByZWNvcmQgYWRkZWQgc3VjY2Vzc2Z1bGx5LCBpbmZvcm0gdGhlIGxpc3QgY29tcG9uZW50LlxuICAgICAgICB0aGlzLnN1cHBsaWVyRm9ybVNlcnZpY2UubGlzdFVwZGF0ZWQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTMgbWItM1wiPlxuICA8aDIgY2xhc3M9XCJtYi0wXCI+U3VwcGxpZXJzPC9oMj5cbiAgPG1hdC1pY29uXG4gICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAoY2xpY2spPVwic2hvd0FkZFN1cHBsaWVyRGlhbG9nKClcIlxuICA+XG4gICAgYWRkXG4gIDwvbWF0LWljb24+XG48L2Rpdj5cbjxtYXQtY2FyZCBjbGFzcz1cIm1iLTNcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPGZvcm1cbiAgICAgIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybUdyb3VwXCJcbiAgICAgIGZ4TGF5b3V0XG4gICAgICBmeExheW91dEdhcD1cIjFyZW1cIlxuICAgICAgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiXG4gICAgPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjI0XCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggU3VwcGxpZXIgYnkgTmFtZSwgUGhvbmUsIEFkZHJlc3MsIEVtYWlsLCBEZXNjcmlwdGlvblwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNoXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeD5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJtbC00XCI+VHlwZTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cInN1cHBsaWVyX3R5cGVfaWRzXCIgbXVsdGlwbGU+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHN1cHBsaWVyVHlwZXNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLmlkXCJcbiAgICAgICAgICA+e3sgaXRlbS50aXRsZSB9fTwvbWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgPlxuICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cbiAgICA8L2Zvcm0+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbjwvbWF0LWNhcmQ+XG48bWF0LWNhcmQ+XG4gIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwicC0wXCI+XG4gICAgPHRhYmxlXG4gICAgICBtYXQtdGFibGVcbiAgICAgICN0YWJsZVxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICBjbGFzcz1cInctMTAwIHRhYmxlLWhvdmVyXCJcbiAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCJcbiAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbCgpXCJcbiAgICAgIFtmcm9tUm9vdF09XCJ0cnVlXCJcbiAgICAgIG1hdFNvcnRcbiAgICAgIChtYXRTb3J0Q2hhbmdlKT1cInNvcnRDb2x1bW4oJGV2ZW50KVwiXG4gICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiU3VwcGxpZXJzIExpc3RcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiI1wiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiM8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPnt7IGkgKyAxIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNvbXBhbnlfbmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5Db21wYW55PC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0xXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IGVsZW1lbnQ/LmNvbXBhbnlfbmFtZSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtcGlsbCBzdGF0dXMtcGlsbC1zbSBzdGF0dXMtb25nb2luZ1wiPlxuICAgICAgICAgICAgICB7eyBlbGVtZW50Py50eXBlPy50aXRsZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY29udGFjdF9uYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPkNvbnRhY3QgTmFtZTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3sgZWxlbWVudD8uY29udGFjdF9uYW1lIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwaG9uZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlBob25lPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50Py5waG9uZSB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhZGRyZXNzXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPkFkZHJlc3M8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/LmFkZHJlc3MgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZW1haWxcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+RW1haWw8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/LmVtYWlsIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRldGFpbHNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uZGV0YWlscyB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25zXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+QWN0aW9uczwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgZnhMYXlvdXRHYXA9XCIxcmVtXCI+XG4gICAgICAgICAgICA8YXBwLWF1ZGl0LWxvZy1mb3ItbW9kZWxcbiAgICAgICAgICAgICAgW21vZGVsSWRdPVwiZWxlbWVudD8uaWRcIlxuICAgICAgICAgICAgICBtb2RlbFR5cGU9XCJTdXBwbGllclwiXG4gICAgICAgICAgICAgIGxvZ1ZpZXc9XCJhbGxcIlxuICAgICAgICAgICAgPjwvYXBwLWF1ZGl0LWxvZy1mb3ItbW9kZWw+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9zdXBwbGllcnMnLCBlbGVtZW50LmlkLCAndmlldyddXCJcbiAgICAgICAgICAgICAgcm91dGVyTGlua0FjdGl2ZT1cInJvdXRlLWxpbmstYWN0aXZlXCJcbiAgICAgICAgICAgICAgKm5neFBlcm1pc3Npb25zT25seT1cIlsnc3VwcGxpZXIucmVhZCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFRvb2x0aXA9XCJWaWV3XCI+cmVtb3ZlX3JlZF9leWU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ3hQZXJtaXNzaW9uc09ubHk9XCJbJ3N1cHBsaWVyLnVwZGF0ZSddXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Rm9ybShlbGVtZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmd4UGVybWlzc2lvbnNPbmx5PVwiWydzdXBwbGllci5kZWxldGUnXVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUZvcm0oZWxlbWVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzTG9hZGluZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cbiJdfQ==
|