techlify-inventory-common 18.1.0 → 18.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/inventory-common/category/category-form/category-form.component.mjs +12 -12
- package/esm2022/lib/inventory-common/category/category-form-button/category-form-button.component.mjs +5 -5
- package/esm2022/lib/inventory-common/category/category-list-page/category-list-page.component.mjs +22 -26
- package/esm2022/lib/inventory-common/category/category-routing.module.mjs +10 -5
- package/esm2022/lib/inventory-common/category/category-view/category-view.component.mjs +46 -0
- package/esm2022/lib/inventory-common/category/category.module.mjs +23 -24
- package/esm2022/lib/inventory-common/category/category.service.mjs +6 -6
- package/esm2022/lib/inventory-common/inventory-common-routing.module.mjs +32 -18
- package/esm2022/lib/inventory-common/inventory-common.module.mjs +13 -9
- package/esm2022/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.mjs +12 -10
- package/esm2022/lib/inventory-common/inventory-value-report.service.mjs +21 -0
- package/esm2022/lib/inventory-common/location/location-delete-button/location-delete-button.component.mjs +68 -0
- package/esm2022/lib/inventory-common/location/location-form/location-form.component.mjs +86 -0
- package/esm2022/lib/inventory-common/location/location-form-button/location-form-button.component.mjs +35 -0
- package/esm2022/lib/inventory-common/location/location-information/location-information.component.mjs +34 -0
- package/esm2022/lib/inventory-common/location/location-list/location-list.component.mjs +121 -0
- package/esm2022/lib/inventory-common/location/location-product-statistics/location-product-statistics.component.mjs +127 -0
- package/esm2022/lib/inventory-common/location/location-routing.module.mjs +29 -0
- package/esm2022/lib/inventory-common/location/location-view/location-view.component.mjs +53 -0
- package/esm2022/lib/inventory-common/location/location.module.mjs +22 -0
- package/esm2022/lib/inventory-common/location/location.service.mjs +23 -0
- package/esm2022/lib/inventory-common/low-stock-report.service.mjs +23 -0
- package/esm2022/lib/inventory-common/material.module.mjs +37 -37
- package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete-button/measure-delete-button.component.mjs +4 -4
- package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete.module.mjs +4 -4
- package/esm2022/lib/inventory-common/measure/measure-form/measure-form/measure-form.component.mjs +14 -14
- package/esm2022/lib/inventory-common/measure/measure-form/measure-form-button/measure-form-button.component.mjs +5 -5
- package/esm2022/lib/inventory-common/measure/measure-form/measure-form.module.mjs +6 -6
- package/esm2022/lib/inventory-common/measure/measure-routing.module.mjs +5 -5
- package/esm2022/lib/inventory-common/measure/measure.module.mjs +10 -10
- package/esm2022/lib/inventory-common/measure/measure.service.mjs +6 -6
- package/esm2022/lib/inventory-common/measure/measures-list/measures-list.component.mjs +12 -18
- package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.mjs +13 -11
- package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.module.mjs +10 -24
- package/esm2022/lib/inventory-common/product/product-basic-info/product-basic-info.component.mjs +5 -5
- package/esm2022/lib/inventory-common/product/product-batch-update-form/product-batch-update-form.component.mjs +56 -0
- package/esm2022/lib/inventory-common/product/product-delete-button/product-delete-button.component.mjs +6 -6
- package/esm2022/lib/inventory-common/product/product-form/product-form.component.mjs +43 -45
- package/esm2022/lib/inventory-common/product/product-form-button/product-form-button.component.mjs +5 -5
- package/esm2022/lib/inventory-common/product/product-form.service.mjs +4 -4
- package/esm2022/lib/inventory-common/product/product-import-page/product-import-page.component.mjs +32 -32
- package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +65 -87
- package/esm2022/lib/inventory-common/product/product-location/product-location-list/product-location-list.component.mjs +56 -0
- package/esm2022/lib/inventory-common/product/product-measure-form/product-measure-form.component.mjs +12 -12
- package/esm2022/lib/inventory-common/product/product-measures-list/product-measures-list.component.mjs +22 -28
- package/esm2022/lib/inventory-common/product/product-nav-bar/product-nav-bar.component.mjs +3 -3
- package/esm2022/lib/inventory-common/product/product-quick-search/product-quick-search.component.mjs +92 -0
- package/esm2022/lib/inventory-common/product/product-routing.module.mjs +17 -17
- package/esm2022/lib/inventory-common/product/product-statistics.service.mjs +23 -0
- package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.component.mjs +10 -16
- package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.module.mjs +9 -20
- package/esm2022/lib/inventory-common/product/product-tax/product-tax-delete-button/product-tax-delete-button.component.mjs +6 -6
- package/esm2022/lib/inventory-common/product/product-tax/product-tax-form-button/product-tax-form-button.component.mjs +14 -14
- package/esm2022/lib/inventory-common/product/product-tax/product-tax-list/product-tax-list.component.mjs +6 -6
- package/esm2022/lib/inventory-common/product/product-tax/product-tax.module.mjs +9 -26
- package/esm2022/lib/inventory-common/product/product-tax/product-tax.service.mjs +6 -6
- package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +9 -7
- package/esm2022/lib/inventory-common/product/product.module.mjs +37 -26
- package/esm2022/lib/inventory-common/product/product.service.mjs +7 -7
- package/esm2022/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.mjs +15 -0
- package/esm2022/lib/inventory-common/product-batch.service.mjs +20 -0
- package/esm2022/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.mjs +168 -0
- package/esm2022/lib/inventory-common/reports/low-stock-report/low-stock-report.component.mjs +163 -0
- package/esm2022/lib/inventory-common/services/techlify-form-service.mjs +2 -2
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.mjs +6 -6
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.mjs +5 -5
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance.service.mjs +6 -6
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.mjs +84 -56
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.mjs +28 -12
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-routing.module.mjs +5 -5
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances.module.mjs +14 -14
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.mjs +14 -14
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.mjs +5 -5
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.mjs +13 -13
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.mjs +6 -6
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.mjs +18 -18
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.mjs +5 -5
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.module.mjs +12 -12
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt.service.mjs +6 -6
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +82 -44
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-routing.module.mjs +5 -5
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +24 -22
- package/esm2022/lib/inventory-common/stock-summary.service.mjs +5 -5
- package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-form/stock-transfer-form.component.mjs +105 -0
- package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-form-button/stock-transfer-form-button.component.mjs +38 -0
- package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-list/stock-transfer-list.component.mjs +77 -0
- package/esm2022/lib/inventory-common/stock-transfer/stock-transfer.service.mjs +18 -0
- package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector/payee-selector.component.mjs +9 -9
- package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector.module.mjs +10 -24
- package/esm2022/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.mjs +64 -0
- package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form-button/supplier-form-button.component.mjs +43 -0
- package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.component.mjs +24 -24
- package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.service.mjs +4 -4
- package/esm2022/lib/inventory-common/supplier/supplier-information/supplier-information.component.mjs +16 -15
- package/esm2022/lib/inventory-common/supplier/supplier-routing.module.mjs +9 -16
- package/esm2022/lib/inventory-common/supplier/supplier-view/supplier-view.component.mjs +13 -14
- package/esm2022/lib/inventory-common/supplier/supplier.component.mjs +3 -3
- package/esm2022/lib/inventory-common/supplier/supplier.module.mjs +23 -15
- package/esm2022/lib/inventory-common/supplier/supplier.service.mjs +5 -5
- package/esm2022/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.mjs +6 -65
- package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.component.mjs +16 -18
- package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.module.mjs +13 -9
- package/fesm2022/techlify-inventory-common-category.module-BsvJ6rVx.mjs +290 -0
- package/fesm2022/techlify-inventory-common-category.module-BsvJ6rVx.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-location.module-Cwx9mHKE.mjs +529 -0
- package/fesm2022/techlify-inventory-common-location.module-Cwx9mHKE.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-measure.module-C2v0-n_m.mjs +307 -0
- package/fesm2022/techlify-inventory-common-measure.module-C2v0-n_m.mjs.map +1 -0
- package/fesm2022/{techlify-inventory-common-stock-issuances.module-BQRRP-hW.mjs → techlify-inventory-common-stock-issuances.module-CPccetrp.mjs} +3 -5
- package/fesm2022/techlify-inventory-common-stock-issuances.module-CPccetrp.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-supplier.module-CYq-2pV1.mjs +464 -0
- package/fesm2022/techlify-inventory-common-supplier.module-CYq-2pV1.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-BMNkSTd6.mjs +3620 -0
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-BMNkSTd6.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common.mjs +1 -1
- package/lib/inventory-common/category/category-form/category-form.component.d.ts +4 -4
- package/lib/inventory-common/category/category-form-button/category-form-button.component.d.ts +2 -2
- package/lib/inventory-common/category/category-list-page/category-list-page.component.d.ts +4 -4
- package/lib/inventory-common/category/category-view/category-view.component.d.ts +16 -0
- package/lib/inventory-common/category/category.module.d.ts +12 -11
- package/lib/inventory-common/category/category.service.d.ts +1 -1
- package/lib/inventory-common/inventory-common.module.d.ts +2 -1
- package/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.d.ts +1 -1
- package/lib/inventory-common/inventory-value-report.service.d.ts +9 -0
- package/lib/inventory-common/location/location-delete-button/location-delete-button.component.d.ts +28 -0
- package/lib/inventory-common/location/location-form/location-form.component.d.ts +19 -0
- package/lib/inventory-common/location/location-form-button/location-form-button.component.d.ts +13 -0
- package/lib/inventory-common/location/location-information/location-information.component.d.ts +10 -0
- package/lib/inventory-common/location/location-list/location-list.component.d.ts +20 -0
- package/lib/inventory-common/location/location-product-statistics/location-product-statistics.component.d.ts +21 -0
- package/lib/inventory-common/location/location-routing.module.d.ts +7 -0
- package/lib/inventory-common/location/location-view/location-view.component.d.ts +16 -0
- package/lib/inventory-common/location/location.module.d.ts +8 -0
- package/lib/inventory-common/location/location.service.d.ts +10 -0
- package/lib/inventory-common/low-stock-report.service.d.ts +10 -0
- package/lib/inventory-common/measure/measure-delete/measure-delete-button/measure-delete-button.component.d.ts +3 -3
- package/lib/inventory-common/measure/measure-form/measure-form/measure-form.component.d.ts +4 -4
- package/lib/inventory-common/measure/measure-form/measure-form-button/measure-form-button.component.d.ts +2 -2
- package/lib/inventory-common/measure/measure.service.d.ts +1 -1
- package/lib/inventory-common/measure/measures-list/measures-list.component.d.ts +5 -5
- package/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.d.ts +3 -3
- package/lib/inventory-common/product/product-basic-info/product-basic-info.component.d.ts +2 -2
- package/lib/inventory-common/product/product-batch-update-form/product-batch-update-form.component.d.ts +18 -0
- package/lib/inventory-common/product/product-delete-button/product-delete-button.component.d.ts +4 -4
- package/lib/inventory-common/product/product-form/product-form.component.d.ts +6 -6
- package/lib/inventory-common/product/product-form-button/product-form-button.component.d.ts +3 -3
- package/lib/inventory-common/product/product-import-page/product-import-page.component.d.ts +2 -2
- package/lib/inventory-common/product/product-list/product-list.component.d.ts +15 -24
- package/lib/inventory-common/product/product-location/product-location-list/product-location-list.component.d.ts +15 -0
- package/lib/inventory-common/product/product-measure-form/product-measure-form.component.d.ts +6 -6
- package/lib/inventory-common/product/product-measures-list/product-measures-list.component.d.ts +7 -7
- package/lib/inventory-common/product/product-quick-search/product-quick-search.component.d.ts +15 -0
- package/lib/inventory-common/product/product-statistics.service.d.ts +9 -0
- package/lib/inventory-common/product/product-summary-chart/product-summary-chart.component.d.ts +1 -1
- package/lib/inventory-common/product/product-tax/product-tax-delete-button/product-tax-delete-button.component.d.ts +4 -4
- package/lib/inventory-common/product/product-tax/product-tax-form-button/product-tax-form-button.component.d.ts +5 -5
- package/lib/inventory-common/product/product-tax/product-tax-list/product-tax-list.component.d.ts +2 -2
- package/lib/inventory-common/product/product-tax/product-tax.service.d.ts +1 -1
- package/lib/inventory-common/product/product-view-page/product-view-page.component.d.ts +4 -4
- package/lib/inventory-common/product/product.module.d.ts +16 -13
- package/lib/inventory-common/product/product.service.d.ts +2 -2
- package/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.d.ts +6 -0
- package/lib/inventory-common/product-batch.service.d.ts +8 -0
- package/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.d.ts +26 -0
- package/lib/inventory-common/reports/low-stock-report/low-stock-report.component.d.ts +26 -0
- package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.d.ts +4 -4
- package/lib/inventory-common/stock-issuances/stock-issuance.service.d.ts +1 -1
- package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.d.ts +16 -8
- package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.d.ts +3 -1
- package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.d.ts +4 -4
- package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.d.ts +2 -2
- package/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.d.ts +4 -4
- package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.d.ts +4 -4
- package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.d.ts +2 -2
- package/lib/inventory-common/stock-receipts/stock-receipt.service.d.ts +1 -1
- package/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.d.ts +12 -4
- package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +2 -1
- package/lib/inventory-common/stock-summary.service.d.ts +1 -1
- package/lib/inventory-common/stock-transfer/stock-transfer-form/stock-transfer-form.component.d.ts +19 -0
- package/lib/inventory-common/stock-transfer/stock-transfer-form-button/stock-transfer-form-button.component.d.ts +14 -0
- package/lib/inventory-common/stock-transfer/stock-transfer-list/stock-transfer-list.component.d.ts +17 -0
- package/lib/inventory-common/stock-transfer/stock-transfer.service.d.ts +7 -0
- package/lib/inventory-common/supplier/payee-selector/payee-selector/payee-selector.component.d.ts +3 -3
- package/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.d.ts +18 -0
- package/lib/inventory-common/supplier/supplier-form/supplier-form-button/supplier-form-button.component.d.ts +13 -0
- package/lib/inventory-common/supplier/supplier-form/supplier-form.component.d.ts +6 -6
- package/lib/inventory-common/supplier/supplier-information/supplier-information.component.d.ts +4 -4
- package/lib/inventory-common/supplier/supplier-view/supplier-view.component.d.ts +4 -4
- package/lib/inventory-common/supplier/supplier.component.d.ts +2 -2
- package/lib/inventory-common/supplier/supplier.module.d.ts +3 -1
- package/lib/inventory-common/supplier/supplier.service.d.ts +1 -1
- package/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.d.ts +0 -8
- package/lib/inventory-common/techlify-filter/techlify-filter.component.d.ts +4 -4
- package/lib/inventory-common/techlify-filter/techlify-filter.module.d.ts +2 -1
- package/package.json +1 -1
- package/fesm2022/techlify-inventory-common-category.module-CNm2bEsx.mjs +0 -257
- package/fesm2022/techlify-inventory-common-category.module-CNm2bEsx.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-measure.module-BEaRHh5Z.mjs +0 -313
- package/fesm2022/techlify-inventory-common-measure.module-BEaRHh5Z.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-product.module-BV9Cy88x.mjs +0 -1168
- package/fesm2022/techlify-inventory-common-product.module-BV9Cy88x.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs +0 -436
- package/fesm2022/techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-stock-issuances.module-BQRRP-hW.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-stock-receipt-form.module-DND0GNlf.mjs +0 -302
- package/fesm2022/techlify-inventory-common-stock-receipt-form.module-DND0GNlf.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-stock-receipts.module-BvYaKITT.mjs +0 -253
- package/fesm2022/techlify-inventory-common-stock-receipts.module-BvYaKITT.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-supplier-form.component-DVBnhiyH.mjs +0 -177
- package/fesm2022/techlify-inventory-common-supplier-form.component-DVBnhiyH.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-supplier.module-Bwa7gx14.mjs +0 -608
- package/fesm2022/techlify-inventory-common-supplier.module-Bwa7gx14.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs +0 -14
- package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs.map +0 -1
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-GFYF7JCA.mjs +0 -495
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-GFYF7JCA.mjs.map +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { MatCard, MatCardContent } from '@angular/material/card';
|
|
3
|
+
import { MatCell, MatCellDef, MatColumnDef, MatFooterCell, MatFooterCellDef, MatFooterRow, MatFooterRowDef, MatHeaderCell, MatHeaderCellDef, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, } from '@angular/material/table';
|
|
4
|
+
import { SearchableSelectorModule, TechlifyListingControllerInterface } from 'ngx-techlify-core';
|
|
5
|
+
import { RouterLink } from '@angular/router';
|
|
6
|
+
import { ProductCategoryBadgesComponent } from '../../product/widgets/product-category-badges/product-category-badges.component';
|
|
7
|
+
import { CurrencyPipe, NgIf } from '@angular/common';
|
|
8
|
+
import { MatProgressBar } from '@angular/material/progress-bar';
|
|
9
|
+
import { debounceTime, distinctUntilChanged } from 'rxjs';
|
|
10
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
11
|
+
import { MatFormField, MatLabel } from '@angular/material/form-field';
|
|
12
|
+
import { MatInput } from '@angular/material/input';
|
|
13
|
+
import { InfiniteScrollDirective } from 'ngx-infinite-scroll';
|
|
14
|
+
import { MatSort, MatSortHeader } from '@angular/material/sort';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../../inventory-value-report.service";
|
|
17
|
+
import * as i2 from "@angular/router";
|
|
18
|
+
import * as i3 from "ngx-techlify-core";
|
|
19
|
+
import * as i4 from "@angular/forms";
|
|
20
|
+
export class InventoryValueReportComponent extends TechlifyListingControllerInterface {
|
|
21
|
+
service;
|
|
22
|
+
activatedRoute;
|
|
23
|
+
requestHelperService;
|
|
24
|
+
formBuilder;
|
|
25
|
+
displayedColumns = [
|
|
26
|
+
'#',
|
|
27
|
+
'Product',
|
|
28
|
+
'Description',
|
|
29
|
+
'Categories',
|
|
30
|
+
'Available Stock',
|
|
31
|
+
'Average Price',
|
|
32
|
+
'Inventory Value',
|
|
33
|
+
'Last Purchase Price',
|
|
34
|
+
'Inventory Value Based On Last Purchase Price',
|
|
35
|
+
];
|
|
36
|
+
totalInventoryValue = 0;
|
|
37
|
+
isExporting = false;
|
|
38
|
+
constructor(service, activatedRoute, requestHelperService, formBuilder) {
|
|
39
|
+
super();
|
|
40
|
+
this.service = service;
|
|
41
|
+
this.activatedRoute = activatedRoute;
|
|
42
|
+
this.requestHelperService = requestHelperService;
|
|
43
|
+
this.formBuilder = formBuilder;
|
|
44
|
+
this.filterForm = this.formBuilder.group({
|
|
45
|
+
category_ids: [''],
|
|
46
|
+
search: [''],
|
|
47
|
+
sort_by: ['id|desc'],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
ngOnInit() {
|
|
51
|
+
this.updateFormWithQueryParams();
|
|
52
|
+
this.subscribeToFormChanges();
|
|
53
|
+
this.subscribeToRouteChanges();
|
|
54
|
+
}
|
|
55
|
+
loadData() {
|
|
56
|
+
const params = {
|
|
57
|
+
...this.requestHelperService.convertToFormData(this.filterForm.value),
|
|
58
|
+
page: this.page,
|
|
59
|
+
perPage: this.perPage,
|
|
60
|
+
with: 'categories,lastStockReceipt',
|
|
61
|
+
};
|
|
62
|
+
this.isWorking = true;
|
|
63
|
+
this.service.index(params).subscribe({
|
|
64
|
+
next: (response) => {
|
|
65
|
+
this.models = this.models?.concat(response?.data);
|
|
66
|
+
this.isWorking = false;
|
|
67
|
+
this.models.forEach((model) => {
|
|
68
|
+
this.totalInventoryValue += model?.inventory_value;
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
error: () => (this.isWorking = false),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
updateFormWithQueryParams() {
|
|
75
|
+
this.requestHelperService.updateFormWithQueryParams(this.filterForm, {
|
|
76
|
+
category_ids: { multiple: true },
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
subscribeToFormChanges() {
|
|
80
|
+
this.filterForm.valueChanges.pipe(debounceTime(800)).subscribe({
|
|
81
|
+
next: () => {
|
|
82
|
+
this.requestHelperService.updateQueryParams(this.requestHelperService.convertToFormData(this.filterForm.value));
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
subscribeToRouteChanges() {
|
|
87
|
+
this.activatedRoute.queryParams.pipe(debounceTime(500), distinctUntilChanged()).subscribe(() => {
|
|
88
|
+
this.reload();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
onSortChange(sort) {
|
|
92
|
+
let { active, direction } = sort;
|
|
93
|
+
if (!active)
|
|
94
|
+
active = 'id';
|
|
95
|
+
if (!direction)
|
|
96
|
+
direction = 'desc';
|
|
97
|
+
this.filterForm.get('sort_by')?.setValue(active + '|' + direction);
|
|
98
|
+
}
|
|
99
|
+
export(type = 'excel') {
|
|
100
|
+
const params = {
|
|
101
|
+
...this.requestHelperService.convertToFormData(this.filterForm.value),
|
|
102
|
+
page: this.page,
|
|
103
|
+
perPage: 50000,
|
|
104
|
+
with: 'categories,lastStockReceipt',
|
|
105
|
+
export_type: type,
|
|
106
|
+
};
|
|
107
|
+
this.isExporting = true;
|
|
108
|
+
this.service.export(params).subscribe({
|
|
109
|
+
next: (response) => {
|
|
110
|
+
this.isExporting = false;
|
|
111
|
+
window.open(response?.item?.file_link, '_blank');
|
|
112
|
+
},
|
|
113
|
+
error: () => (this.isExporting = false),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InventoryValueReportComponent, deps: [{ token: i1.InventoryValueReportService }, { token: i2.ActivatedRoute }, { token: i3.RequestHelperService }, { token: i4.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
117
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InventoryValueReportComponent, isStandalone: true, selector: "app-inventory-value-report", usesInheritance: true, ngImport: i0, template: "<div class=\"container\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"mb-0\">Inventory Value Report</h3>\n <i class=\"fa-solid fa-file-excel cursor-pointer d-print-none\" (click)=\"export('excel')\"></i>\n <i class=\"fa-solid fa-file-pdf cursor-pointer d-print-none\" (click)=\"export('pdf')\"></i>\n </div>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n </mat-card>\n\n <mat-card class=\"mt-3\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n >\n <!-- # Column -->\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 <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Product Column -->\n <ng-container matColumnDef=\"Product\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"name\">Product</th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"['/inventory/products', element?.id, 'view']\" class=\"text-dark\">\n {{ element?.name }}\n </a>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"Description\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.description }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"Categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\">\n <app-product-category-badges [product]=\"element\"></app-product-category-badges>\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <strong>Total</strong>\n </td>\n </ng-container>\n\n <!-- Available Stock Column -->\n <ng-container matColumnDef=\"Available Stock\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"current_stock\">Available Stock</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.current_stock }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Average Price Column -->\n <ng-container matColumnDef=\"Average Price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"average_purchase_price\">Average Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.average_purchase_price | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Inventory Value Column -->\n <ng-container matColumnDef=\"Inventory Value\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"inventory_value\">Inventory Value</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.inventory_value | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <strong>{{ totalInventoryValue | currency }}</strong>\n </td>\n </ng-container>\n\n <!-- Last Purchase Price Column -->\n <ng-container matColumnDef=\"Last Purchase Price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"last_stock_receipt.purchase_price\">\n Last Purchase Price\n </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_receipt?.purchase_price ?? 0 | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Inventory Value Based On Last Purchase Price Column -->\n <ng-container matColumnDef=\"Inventory Value Based On Last Purchase Price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"last_stock_receipt.amount\">\n <div>\n <p class=\"mb-0\">Inventory Value</p>\n <small class=\"text-secondary\">Based on last purchase price</small>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.inventory_value_based_on_last_price ?? 0 | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ProductCategoryBadgesComponent, selector: "app-product-category-badges", inputs: ["product"] }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "component", type: MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: SearchableSelectorModule }, { kind: "component", type: i3.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "directive", type: 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: "directive", type: InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }], preserveWhitespaces: true });
|
|
118
|
+
}
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InventoryValueReportComponent, decorators: [{
|
|
120
|
+
type: Component,
|
|
121
|
+
args: [{ selector: 'app-inventory-value-report', standalone: true, imports: [
|
|
122
|
+
MatCard,
|
|
123
|
+
MatCardContent,
|
|
124
|
+
MatTable,
|
|
125
|
+
MatColumnDef,
|
|
126
|
+
MatColumnDef,
|
|
127
|
+
MatCellDef,
|
|
128
|
+
MatRow,
|
|
129
|
+
MatCellDef,
|
|
130
|
+
MatHeaderCell,
|
|
131
|
+
MatCell,
|
|
132
|
+
MatRowDef,
|
|
133
|
+
MatCellDef,
|
|
134
|
+
MatHeaderCell,
|
|
135
|
+
MatColumnDef,
|
|
136
|
+
MatCell,
|
|
137
|
+
MatColumnDef,
|
|
138
|
+
MatHeaderCell,
|
|
139
|
+
MatHeaderRowDef,
|
|
140
|
+
MatHeaderCell,
|
|
141
|
+
MatCell,
|
|
142
|
+
MatHeaderRow,
|
|
143
|
+
MatCell,
|
|
144
|
+
MatCellDef,
|
|
145
|
+
MatHeaderCellDef,
|
|
146
|
+
MatHeaderCellDef,
|
|
147
|
+
MatHeaderCellDef,
|
|
148
|
+
MatHeaderCellDef,
|
|
149
|
+
RouterLink,
|
|
150
|
+
ProductCategoryBadgesComponent,
|
|
151
|
+
CurrencyPipe,
|
|
152
|
+
MatProgressBar,
|
|
153
|
+
NgIf,
|
|
154
|
+
MatFooterRowDef,
|
|
155
|
+
MatFooterRow,
|
|
156
|
+
MatFooterCellDef,
|
|
157
|
+
MatFooterCell,
|
|
158
|
+
MatFormField,
|
|
159
|
+
MatLabel,
|
|
160
|
+
ReactiveFormsModule,
|
|
161
|
+
SearchableSelectorModule,
|
|
162
|
+
MatInput,
|
|
163
|
+
InfiniteScrollDirective,
|
|
164
|
+
MatSort,
|
|
165
|
+
MatSortHeader,
|
|
166
|
+
], template: "<div class=\"container\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"mb-0\">Inventory Value Report</h3>\n <i class=\"fa-solid fa-file-excel cursor-pointer d-print-none\" (click)=\"export('excel')\"></i>\n <i class=\"fa-solid fa-file-pdf cursor-pointer d-print-none\" (click)=\"export('pdf')\"></i>\n </div>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n </mat-card>\n\n <mat-card class=\"mt-3\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n >\n <!-- # Column -->\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 <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Product Column -->\n <ng-container matColumnDef=\"Product\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"name\">Product</th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"['/inventory/products', element?.id, 'view']\" class=\"text-dark\">\n {{ element?.name }}\n </a>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"Description\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.description }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"Categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\">\n <app-product-category-badges [product]=\"element\"></app-product-category-badges>\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <strong>Total</strong>\n </td>\n </ng-container>\n\n <!-- Available Stock Column -->\n <ng-container matColumnDef=\"Available Stock\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"current_stock\">Available Stock</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.current_stock }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Average Price Column -->\n <ng-container matColumnDef=\"Average Price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"average_purchase_price\">Average Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.average_purchase_price | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Inventory Value Column -->\n <ng-container matColumnDef=\"Inventory Value\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"inventory_value\">Inventory Value</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.inventory_value | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <strong>{{ totalInventoryValue | currency }}</strong>\n </td>\n </ng-container>\n\n <!-- Last Purchase Price Column -->\n <ng-container matColumnDef=\"Last Purchase Price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"last_stock_receipt.purchase_price\">\n Last Purchase Price\n </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_receipt?.purchase_price ?? 0 | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!-- Inventory Value Based On Last Purchase Price Column -->\n <ng-container matColumnDef=\"Inventory Value Based On Last Purchase Price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"last_stock_receipt.amount\">\n <div>\n <p class=\"mb-0\">Inventory Value</p>\n <small class=\"text-secondary\">Based on last purchase price</small>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.inventory_value_based_on_last_price ?? 0 | currency }}\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>\n" }]
|
|
167
|
+
}], ctorParameters: () => [{ type: i1.InventoryValueReportService }, { type: i2.ActivatedRoute }, { type: i3.RequestHelperService }, { type: i4.FormBuilder }] });
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52ZW50b3J5LXZhbHVlLXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9yZXBvcnRzL2ludmVudG9yeS12YWx1ZS1yZXBvcnQvaW52ZW50b3J5LXZhbHVlLXJlcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9yZXBvcnRzL2ludmVudG9yeS12YWx1ZS1yZXBvcnQvaW52ZW50b3J5LXZhbHVlLXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUNMLE9BQU8sRUFDUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixlQUFlLEVBQ2YsTUFBTSxFQUNOLFNBQVMsRUFDVCxRQUFRLEdBQ1QsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQXdCLHdCQUF3QixFQUFFLGtDQUFrQyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdkgsT0FBTyxFQUFrQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpRkFBaUYsQ0FBQztBQUNqSSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FB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d0JBQ1AsY0FBYzt3QkFDZCxRQUFRO3dCQUNSLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixVQUFVO3dCQUNWLE1BQU07d0JBQ04sVUFBVTt3QkFDVixhQUFhO3dCQUNiLE9BQU87d0JBQ1AsU0FBUzt3QkFDVCxVQUFVO3dCQUNWLGFBQWE7d0JBQ2IsWUFBWTt3QkFDWixPQUFPO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxZQUFZO3dCQUNaLE9BQU87d0JBQ1AsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLFVBQVU7d0JBQ1YsOEJBQThCO3dCQUM5QixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsSUFBSTt3QkFDSixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixtQkFBbUI7d0JBQ25CLHdCQUF3Qjt3QkFDeEIsUUFBUTt3QkFDUix1QkFBdUI7d0JBQ3ZCLE9BQU87d0JBQ1AsYUFBYTtxQkFDZCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRDYXJkLCBNYXRDYXJkQ29udGVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHtcbiAgTWF0Q2VsbCxcbiAgTWF0Q2VsbERlZixcbiAgTWF0Q29sdW1uRGVmLFxuICBNYXRGb290ZXJDZWxsLFxuICBNYXRGb290ZXJDZWxsRGVmLFxuICBNYXRGb290ZXJSb3csXG4gIE1hdEZvb3RlclJvd0RlZixcbiAgTWF0SGVhZGVyQ2VsbCxcbiAgTWF0SGVhZGVyQ2VsbERlZixcbiAgTWF0SGVhZGVyUm93LFxuICBNYXRIZWFkZXJSb3dEZWYsXG4gIE1hdFJvdyxcbiAgTWF0Um93RGVmLFxuICBNYXRUYWJsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgUmVxdWVzdEhlbHBlclNlcnZpY2UsIFNlYXJjaGFibGVTZWxlY3Rvck1vZHVsZSwgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSB9IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IEludmVudG9yeVZhbHVlUmVwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL2ludmVudG9yeS12YWx1ZS1yZXBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBQcm9kdWN0Q2F0ZWdvcnlCYWRnZXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wcm9kdWN0L3dpZGdldHMvcHJvZHVjdC1jYXRlZ29yeS1iYWRnZXMvcHJvZHVjdC1jYXRlZ29yeS1iYWRnZXMuY29tcG9uZW50JztcbmltcG9ydCB7IEN1cnJlbmN5UGlwZSwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkLCBNYXRMYWJlbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZSB9IGZyb20gJ25neC1pbmZpbml0ZS1zY3JvbGwnO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydEhlYWRlciwgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtaW52ZW50b3J5LXZhbHVlLXJlcG9ydCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRDYXJkLFxuICAgIE1hdENhcmRDb250ZW50LFxuICAgIE1hdFRhYmxlLFxuICAgIE1hdENvbHVtbkRlZixcbiAgICBNYXRDb2x1bW5EZWYsXG4gICAgTWF0Q2VsbERlZixcbiAgICBNYXRSb3csXG4gICAgTWF0Q2VsbERlZixcbiAgICBNYXRIZWFkZXJDZWxsLFxuICAgIE1hdENlbGwsXG4gICAgTWF0Um93RGVmLFxuICAgIE1hdENlbGxEZWYsXG4gICAgTWF0SGVhZGVyQ2VsbCxcbiAgICBNYXRDb2x1bW5EZWYsXG4gICAgTWF0Q2VsbCxcbiAgICBNYXRDb2x1bW5EZWYsXG4gICAgTWF0SGVhZGVyQ2VsbCxcbiAgICBNYXRIZWFkZXJSb3dEZWYsXG4gICAgTWF0SGVhZGVyQ2VsbCxcbiAgICBNYXRDZWxsLFxuICAgIE1hdEhlYWRlclJvdyxcbiAgICBNYXRDZWxsLFxuICAgIE1hdENlbGxEZWYsXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcbiAgICBNYXRIZWFkZXJDZWxsRGVmLFxuICAgIE1hdEhlYWRlckNlbGxEZWYsXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcbiAgICBSb3V0ZXJMaW5rLFxuICAgIFByb2R1Y3RDYXRlZ29yeUJhZGdlc0NvbXBvbmVudCxcbiAgICBDdXJyZW5jeVBpcGUsXG4gICAgTWF0UHJvZ3Jlc3NCYXIsXG4gICAgTmdJZixcbiAgICBNYXRGb290ZXJSb3dEZWYsXG4gICAgTWF0Rm9vdGVyUm93LFxuICAgIE1hdEZvb3RlckNlbGxEZWYsXG4gICAgTWF0Rm9vdGVyQ2VsbCxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBTZWFyY2hhYmxlU2VsZWN0b3JNb2R1bGUsXG4gICAgTWF0SW5wdXQsXG4gICAgSW5maW5pdGVTY3JvbGxEaXJlY3RpdmUsXG4gICAgTWF0U29ydCxcbiAgICBNYXRTb3J0SGVhZGVyLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vaW52ZW50b3J5LXZhbHVlLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9pbnZlbnRvcnktdmFsdWUtcmVwb3J0LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgSW52ZW50b3J5VmFsdWVSZXBvcnRDb21wb25lbnQgZXh0ZW5kcyBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJyMnLFxuICAgICdQcm9kdWN0JyxcbiAgICAnRGVzY3JpcHRpb24nLFxuICAgICdDYXRlZ29yaWVzJyxcbiAgICAnQXZhaWxhYmxlIFN0b2NrJyxcbiAgICAnQXZlcmFnZSBQcmljZScsXG4gICAgJ0ludmVudG9yeSBWYWx1ZScsXG4gICAgJ0xhc3QgUHVyY2hhc2UgUHJpY2UnLFxuICAgICdJbnZlbnRvcnkgVmFsdWUgQmFzZWQgT24gTGFzdCBQdXJjaGFzZSBQcmljZScsXG4gIF07XG4gIHRvdGFsSW52ZW50b3J5VmFsdWUgPSAwO1xuICBpc0V4cG9ydGluZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmljZTogSW52ZW50b3J5VmFsdWVSZXBvcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVxdWVzdEhlbHBlclNlcnZpY2U6IFJlcXVlc3RIZWxwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmZpbHRlckZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGNhdGVnb3J5X2lkczogWycnXSxcbiAgICAgIHNlYXJjaDogWycnXSxcbiAgICAgIHNvcnRfYnk6IFsnaWR8ZGVzYyddLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVGb3JtV2l0aFF1ZXJ5UGFyYW1zKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0Zvcm1DaGFuZ2VzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb1JvdXRlQ2hhbmdlcygpO1xuICB9XG5cbiAgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAuLi50aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHRoaXMuZmlsdGVyRm9ybS52YWx1ZSksXG4gICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICBwZXJQYWdlOiB0aGlzLnBlclBhZ2UsXG4gICAgICB3aXRoOiAnY2F0ZWdvcmllcyxsYXN0U3RvY2tSZWNlaXB0JyxcbiAgICB9O1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2UuaW5kZXgocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscz8uY29uY2F0KHJlc3BvbnNlPy5kYXRhKTtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm1vZGVscy5mb3JFYWNoKChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy50b3RhbEludmVudG9yeVZhbHVlICs9IG1vZGVsPy5pbnZlbnRvcnlfdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5pc1dvcmtpbmcgPSBmYWxzZSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVGb3JtV2l0aFF1ZXJ5UGFyYW1zKHRoaXMuZmlsdGVyRm9ybSwge1xuICAgICAgY2F0ZWdvcnlfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvRm9ybUNoYW5nZXMoKTogdm9pZCB7XG4gICAgKHRoaXMuZmlsdGVyRm9ybSBhcyBGb3JtR3JvdXApLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg4MDApKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZVF1ZXJ5UGFyYW1zKHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UuY29udmVydFRvRm9ybURhdGEodGhpcy5maWx0ZXJGb3JtLnZhbHVlKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1JvdXRlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICBsZXQgeyBhY3RpdmUsIGRpcmVjdGlvbiB9ID0gc29ydDtcbiAgICBpZiAoIWFjdGl2ZSkgYWN0aXZlID0gJ2lkJztcbiAgICBpZiAoIWRpcmVjdGlvbikgZGlyZWN0aW9uID0gJ2Rlc2MnO1xuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ3NvcnRfYnknKT8uc2V0VmFsdWUoYWN0aXZlICsgJ3wnICsgZGlyZWN0aW9uKTtcbiAgfVxuXG4gIGV4cG9ydCh0eXBlOiBzdHJpbmcgPSAnZXhjZWwnKSB7XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAuLi50aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHRoaXMuZmlsdGVyRm9ybS52YWx1ZSksXG4gICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICBwZXJQYWdlOiA1MDAwMCxcbiAgICAgIHdpdGg6ICdjYXRlZ29yaWVzLGxhc3RTdG9ja1JlY2VpcHQnLFxuICAgICAgZXhwb3J0X3R5cGU6IHR5cGUsXG4gICAgfTtcbiAgICB0aGlzLmlzRXhwb3J0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2UuZXhwb3J0KHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgd2luZG93Lm9wZW4ocmVzcG9uc2U/Lml0ZW0/LmZpbGVfbGluaywgJ19ibGFuaycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5pc0V4cG9ydGluZyA9IGZhbHNlKSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8bWF0LWNhcmQ+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwibWItMFwiPkludmVudG9yeSBWYWx1ZSBSZXBvcnQ8L2gzPlxuICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWZpbGUtZXhjZWwgY3Vyc29yLXBvaW50ZXIgZC1wcmludC1ub25lXCIgKGNsaWNrKT1cImV4cG9ydCgnZXhjZWwnKVwiPjwvaT5cbiAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1maWxlLXBkZiBjdXJzb3ItcG9pbnRlciBkLXByaW50LW5vbmVcIiAoY2xpY2spPVwiZXhwb3J0KCdwZGYnKVwiPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWw+U2VhcmNoPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VhcmNoIHByb2R1Y3RzXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNoXCIgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1sYWJlbD5DYXRlZ29yeTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvcHJvZHVjdC1jYXRlZ29yaWVzXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcnlfaWRzXCIgW211bHRpcGxlXT1cInRydWVcIj5cbiAgICAgICAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cblxuICA8bWF0LWNhcmQgY2xhc3M9XCJtdC0zXCI+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJwLTBcIj5cbiAgICAgIDx0YWJsZVxuICAgICAgICBtYXQtdGFibGVcbiAgICAgICAgW2RhdGFTb3VyY2VdPVwibW9kZWxzXCJcbiAgICAgICAgY2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MFwiXG4gICAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbCgpXCJcbiAgICAgICAgbWF0U29ydFxuICAgICAgICAobWF0U29ydENoYW5nZSk9XCJvblNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gIyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiI1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IzwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj57eyBpICsgMSB9fTwvdGQ+XG4gICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFByb2R1Y3QgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIlByb2R1Y3RcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj1cIm5hbWVcIj5Qcm9kdWN0PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiWycvaW52ZW50b3J5L3Byb2R1Y3RzJywgZWxlbWVudD8uaWQsICd2aWV3J11cIiBjbGFzcz1cInRleHQtZGFya1wiPlxuICAgICAgICAgICAgICB7eyBlbGVtZW50Py5uYW1lIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gRGVzY3JpcHRpb24gQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQ2F0ZWdvcmllcyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiQ2F0ZWdvcmllc1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+Q2F0ZWdvcmllczwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxhcHAtcHJvZHVjdC1jYXRlZ29yeS1iYWRnZXMgW3Byb2R1Y3RdPVwiZWxlbWVudFwiPjwvYXBwLXByb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj5cbiAgICAgICAgICAgIDxzdHJvbmc+VG90YWw8L3N0cm9uZz5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEF2YWlsYWJsZSBTdG9jayBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiQXZhaWxhYmxlIFN0b2NrXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI9XCJjdXJyZW50X3N0b2NrXCI+QXZhaWxhYmxlIFN0b2NrPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8uY3VycmVudF9zdG9jayB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEF2ZXJhZ2UgUHJpY2UgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkF2ZXJhZ2UgUHJpY2VcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj1cImF2ZXJhZ2VfcHVyY2hhc2VfcHJpY2VcIj5BdmVyYWdlIFByaWNlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8uYXZlcmFnZV9wdXJjaGFzZV9wcmljZSB8IGN1cnJlbmN5IH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gSW52ZW50b3J5IFZhbHVlIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJJbnZlbnRvcnkgVmFsdWVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj1cImludmVudG9yeV92YWx1ZVwiPkludmVudG9yeSBWYWx1ZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LmludmVudG9yeV92YWx1ZSB8IGN1cnJlbmN5IH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0b3RhbEludmVudG9yeVZhbHVlIHwgY3VycmVuY3kgfX08L3N0cm9uZz5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIExhc3QgUHVyY2hhc2UgUHJpY2UgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkxhc3QgUHVyY2hhc2UgUHJpY2VcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj1cImxhc3Rfc3RvY2tfcmVjZWlwdC5wdXJjaGFzZV9wcmljZVwiPlxuICAgICAgICAgICAgTGFzdCBQdXJjaGFzZSBQcmljZVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/Lmxhc3Rfc3RvY2tfcmVjZWlwdD8ucHVyY2hhc2VfcHJpY2UgPz8gMCB8IGN1cnJlbmN5IH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gSW52ZW50b3J5IFZhbHVlIEJhc2VkIE9uIExhc3QgUHVyY2hhc2UgUHJpY2UgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkludmVudG9yeSBWYWx1ZSBCYXNlZCBPbiBMYXN0IFB1cmNoYXNlIFByaWNlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI9XCJsYXN0X3N0b2NrX3JlY2VpcHQuYW1vdW50XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj5JbnZlbnRvcnkgVmFsdWU8L3A+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+QmFzZWQgb24gbGFzdCBwdXJjaGFzZSBwcmljZTwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5pbnZlbnRvcnlfdmFsdWVfYmFzZWRfb25fbGFzdF9wcmljZSA/PyAwIHwgY3VycmVuY3kgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gIDwvbWF0LWNhcmQ+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CurrencyPipe, DatePipe, NgIf } from '@angular/common';
|
|
3
|
+
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { InfiniteScrollDirective } from 'ngx-infinite-scroll';
|
|
5
|
+
import { MatCard, MatCardContent } from '@angular/material/card';
|
|
6
|
+
import { MatCell, MatCellDef, MatColumnDef, MatFooterCell, MatFooterCellDef, MatFooterRow, MatFooterRowDef, MatHeaderCell, MatHeaderCellDef, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, } from '@angular/material/table';
|
|
7
|
+
import { MatFormField, MatLabel } from '@angular/material/form-field';
|
|
8
|
+
import { MatInput } from '@angular/material/input';
|
|
9
|
+
import { MatProgressBar } from '@angular/material/progress-bar';
|
|
10
|
+
import { MatSort, MatSortHeader } from '@angular/material/sort';
|
|
11
|
+
import { ProductCategoryBadgesComponent } from '../../product/widgets/product-category-badges/product-category-badges.component';
|
|
12
|
+
import { SearchableSelectorModule, TechlifyListingControllerInterface } from 'ngx-techlify-core';
|
|
13
|
+
import { RouterLink } from '@angular/router';
|
|
14
|
+
import { debounceTime, distinctUntilChanged } from 'rxjs';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../../low-stock-report.service";
|
|
17
|
+
import * as i2 from "@angular/router";
|
|
18
|
+
import * as i3 from "ngx-techlify-core";
|
|
19
|
+
import * as i4 from "@angular/forms";
|
|
20
|
+
export class LowStockReportComponent extends TechlifyListingControllerInterface {
|
|
21
|
+
service;
|
|
22
|
+
activatedRoute;
|
|
23
|
+
requestHelperService;
|
|
24
|
+
formBuilder;
|
|
25
|
+
displayedColumns = [
|
|
26
|
+
'#',
|
|
27
|
+
'Product',
|
|
28
|
+
'Type',
|
|
29
|
+
'Categories',
|
|
30
|
+
'Reorder Point',
|
|
31
|
+
'Stock',
|
|
32
|
+
'Last Purchase',
|
|
33
|
+
'30d Issues',
|
|
34
|
+
'30d Receipts',
|
|
35
|
+
'60d Issues',
|
|
36
|
+
'60d Receipts',
|
|
37
|
+
'90d Issues',
|
|
38
|
+
'90d Receipts',
|
|
39
|
+
'1y Issues',
|
|
40
|
+
'1y Receipts',
|
|
41
|
+
];
|
|
42
|
+
totalInventoryValue = 0;
|
|
43
|
+
isExporting = false;
|
|
44
|
+
constructor(service, activatedRoute, requestHelperService, formBuilder) {
|
|
45
|
+
super();
|
|
46
|
+
this.service = service;
|
|
47
|
+
this.activatedRoute = activatedRoute;
|
|
48
|
+
this.requestHelperService = requestHelperService;
|
|
49
|
+
this.formBuilder = formBuilder;
|
|
50
|
+
this.filterForm = this.formBuilder.group({
|
|
51
|
+
category_ids: [''],
|
|
52
|
+
search: [''],
|
|
53
|
+
sort_by: ['id|desc'],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
ngOnInit() {
|
|
57
|
+
this.updateFormWithQueryParams();
|
|
58
|
+
this.subscribeToFormChanges();
|
|
59
|
+
this.subscribeToRouteChanges();
|
|
60
|
+
}
|
|
61
|
+
loadData() {
|
|
62
|
+
const params = {
|
|
63
|
+
...this.requestHelperService.convertToFormData(this.filterForm.value),
|
|
64
|
+
page: this.page,
|
|
65
|
+
perPage: this.perPage,
|
|
66
|
+
with: 'categories,lastStockReceipt,type,measure',
|
|
67
|
+
};
|
|
68
|
+
this.isWorking = true;
|
|
69
|
+
this.service.index(params).subscribe({
|
|
70
|
+
next: (response) => {
|
|
71
|
+
this.models = this.models?.concat(response?.data);
|
|
72
|
+
this.isWorking = false;
|
|
73
|
+
this.models.forEach((model) => {
|
|
74
|
+
this.totalInventoryValue += model?.inventory_value;
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
error: () => (this.isWorking = false),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
onSortChange(sort) {
|
|
81
|
+
let { active, direction } = sort;
|
|
82
|
+
if (!active)
|
|
83
|
+
active = 'id';
|
|
84
|
+
if (!direction)
|
|
85
|
+
direction = 'desc';
|
|
86
|
+
this.filterForm.get('sort_by')?.setValue(active + '|' + direction);
|
|
87
|
+
}
|
|
88
|
+
export() {
|
|
89
|
+
const params = {
|
|
90
|
+
...this.requestHelperService.convertToFormData(this.filterForm.value),
|
|
91
|
+
page: this.page,
|
|
92
|
+
perPage: 50000,
|
|
93
|
+
with: 'categories,lastStockReceipt',
|
|
94
|
+
};
|
|
95
|
+
this.isExporting = true;
|
|
96
|
+
this.service.export(params).subscribe({
|
|
97
|
+
next: (response) => {
|
|
98
|
+
this.isExporting = false;
|
|
99
|
+
window.open(response?.item?.file_link, '_blank');
|
|
100
|
+
},
|
|
101
|
+
error: () => (this.isExporting = false),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
updateFormWithQueryParams() {
|
|
105
|
+
this.requestHelperService.updateFormWithQueryParams(this.filterForm, {
|
|
106
|
+
category_ids: { multiple: true },
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
subscribeToFormChanges() {
|
|
110
|
+
this.filterForm.valueChanges.pipe(debounceTime(800)).subscribe({
|
|
111
|
+
next: () => {
|
|
112
|
+
this.requestHelperService.updateQueryParams(this.requestHelperService.convertToFormData(this.filterForm.value));
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
subscribeToRouteChanges() {
|
|
117
|
+
this.activatedRoute.queryParams.pipe(debounceTime(500), distinctUntilChanged()).subscribe(() => {
|
|
118
|
+
this.reload();
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LowStockReportComponent, deps: [{ token: i1.LowStockReportService }, { token: i2.ActivatedRoute }, { token: i3.RequestHelperService }, { token: i4.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
122
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LowStockReportComponent, isStandalone: true, selector: "app-low-stock-report", usesInheritance: true, ngImport: i0, template: "<div>\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"mb-0\">Low Stock Report</h3>\n <i class=\"fa-solid fa-file-excel cursor-pointer d-print-none\" (click)=\"export()\"></i>\n </div>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n </mat-card>\n\n <mat-card class=\"mt-3\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n >\n <!-- # Column -->\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 <!-- Product Column -->\n <ng-container matColumnDef=\"Product\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"name\">Product</th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"['/inventory/products', element?.id, 'view']\" class=\"text-dark\">\n {{ element?.name }}\n </a>\n </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"Type\">\n <th mat-header-cell *matHeaderCellDef>Type</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.type?.title }}\n </td>\n </ng-container>\n\n <!-- Reorder Point Column -->\n <ng-container matColumnDef=\"Reorder Point\">\n <th mat-header-cell *matHeaderCellDef>Reorder Point</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.reorder_point }}\n </td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"Categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\">\n <app-product-category-badges [product]=\"element\"></app-product-category-badges>\n </td>\n </ng-container>\n\n <!-- Stock Column -->\n <ng-container matColumnDef=\"Stock\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"stock\">Stock</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock }}\n </td>\n </ng-container>\n\n <!-- Last Purchase Column -->\n <ng-container matColumnDef=\"Last Purchase\">\n <th mat-header-cell *matHeaderCellDef>Last Purchase</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\" *ngIf=\"element?.last_stock_receipt\">\n {{ element?.last_stock_receipt?.date | date }} - {{ element?.last_stock_receipt?.quantity }}\n {{ element?.measure?.title }}\n </p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_receipt\">\n {{ element?.last_stock_receipt?.purchase_price ?? 0 | currency }} per {{ element?.measure?.title }}\n </small>\n </td>\n </ng-container>\n\n <!-- 30d Issues -->\n <ng-container matColumnDef=\"30d Issues\">\n <th mat-header-cell *matHeaderCellDef>30d Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_30d }}</td>\n </ng-container>\n\n <!-- 30d Receipts -->\n <ng-container matColumnDef=\"30d Receipts\">\n <th mat-header-cell *matHeaderCellDef>30d Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_30d }}</td>\n </ng-container>\n\n <!-- 60d Issues -->\n <ng-container matColumnDef=\"60d Issues\">\n <th mat-header-cell *matHeaderCellDef>60d Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_60d }}</td>\n </ng-container>\n\n <!-- 60d Receipts -->\n <ng-container matColumnDef=\"60d Receipts\">\n <th mat-header-cell *matHeaderCellDef>60d Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_60d }}</td>\n </ng-container>\n\n <!-- 90d Issues -->\n <ng-container matColumnDef=\"90d Issues\">\n <th mat-header-cell *matHeaderCellDef>90d Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_90d }}</td>\n </ng-container>\n\n <!-- 90d Receipts -->\n <ng-container matColumnDef=\"90d Receipts\">\n <th mat-header-cell *matHeaderCellDef>90d Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_90d }}</td>\n </ng-container>\n\n <!-- 1y Issues -->\n <ng-container matColumnDef=\"1y Issues\">\n <th mat-header-cell *matHeaderCellDef>1y Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_1y }}</td>\n </ng-container>\n\n <!-- 60d Receipts -->\n <ng-container matColumnDef=\"1y Receipts\">\n <th mat-header-cell *matHeaderCellDef>1y Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_1y }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>\n", styles: [""], dependencies: [{ kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: 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: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ProductCategoryBadgesComponent, selector: "app-product-category-badges", inputs: ["product"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: SearchableSelectorModule }, { kind: "component", type: i3.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "pipe", type: DatePipe, name: "date" }], preserveWhitespaces: true });
|
|
123
|
+
}
|
|
124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LowStockReportComponent, decorators: [{
|
|
125
|
+
type: Component,
|
|
126
|
+
args: [{ selector: 'app-low-stock-report', standalone: true, imports: [
|
|
127
|
+
CurrencyPipe,
|
|
128
|
+
FormsModule,
|
|
129
|
+
InfiniteScrollDirective,
|
|
130
|
+
MatCard,
|
|
131
|
+
MatCardContent,
|
|
132
|
+
MatCell,
|
|
133
|
+
MatCellDef,
|
|
134
|
+
MatColumnDef,
|
|
135
|
+
MatFooterCell,
|
|
136
|
+
MatFooterRow,
|
|
137
|
+
MatFooterRowDef,
|
|
138
|
+
MatFormField,
|
|
139
|
+
MatHeaderCell,
|
|
140
|
+
MatHeaderRow,
|
|
141
|
+
MatHeaderRowDef,
|
|
142
|
+
MatInput,
|
|
143
|
+
MatLabel,
|
|
144
|
+
MatProgressBar,
|
|
145
|
+
MatRow,
|
|
146
|
+
MatRowDef,
|
|
147
|
+
MatSort,
|
|
148
|
+
MatSortHeader,
|
|
149
|
+
MatTable,
|
|
150
|
+
NgIf,
|
|
151
|
+
ProductCategoryBadgesComponent,
|
|
152
|
+
ReactiveFormsModule,
|
|
153
|
+
SearchableSelectorModule,
|
|
154
|
+
RouterLink,
|
|
155
|
+
MatFooterCellDef,
|
|
156
|
+
MatHeaderCellDef,
|
|
157
|
+
MatFooterCellDef,
|
|
158
|
+
MatHeaderCellDef,
|
|
159
|
+
MatHeaderCellDef,
|
|
160
|
+
DatePipe,
|
|
161
|
+
], template: "<div>\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"mb-0\">Low Stock Report</h3>\n <i class=\"fa-solid fa-file-excel cursor-pointer d-print-none\" (click)=\"export()\"></i>\n </div>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n </mat-card>\n\n <mat-card class=\"mt-3\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n >\n <!-- # Column -->\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 <!-- Product Column -->\n <ng-container matColumnDef=\"Product\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"name\">Product</th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"['/inventory/products', element?.id, 'view']\" class=\"text-dark\">\n {{ element?.name }}\n </a>\n </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"Type\">\n <th mat-header-cell *matHeaderCellDef>Type</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.type?.title }}\n </td>\n </ng-container>\n\n <!-- Reorder Point Column -->\n <ng-container matColumnDef=\"Reorder Point\">\n <th mat-header-cell *matHeaderCellDef>Reorder Point</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.reorder_point }}\n </td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"Categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\">\n <app-product-category-badges [product]=\"element\"></app-product-category-badges>\n </td>\n </ng-container>\n\n <!-- Stock Column -->\n <ng-container matColumnDef=\"Stock\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header=\"stock\">Stock</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock }}\n </td>\n </ng-container>\n\n <!-- Last Purchase Column -->\n <ng-container matColumnDef=\"Last Purchase\">\n <th mat-header-cell *matHeaderCellDef>Last Purchase</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\" *ngIf=\"element?.last_stock_receipt\">\n {{ element?.last_stock_receipt?.date | date }} - {{ element?.last_stock_receipt?.quantity }}\n {{ element?.measure?.title }}\n </p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_receipt\">\n {{ element?.last_stock_receipt?.purchase_price ?? 0 | currency }} per {{ element?.measure?.title }}\n </small>\n </td>\n </ng-container>\n\n <!-- 30d Issues -->\n <ng-container matColumnDef=\"30d Issues\">\n <th mat-header-cell *matHeaderCellDef>30d Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_30d }}</td>\n </ng-container>\n\n <!-- 30d Receipts -->\n <ng-container matColumnDef=\"30d Receipts\">\n <th mat-header-cell *matHeaderCellDef>30d Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_30d }}</td>\n </ng-container>\n\n <!-- 60d Issues -->\n <ng-container matColumnDef=\"60d Issues\">\n <th mat-header-cell *matHeaderCellDef>60d Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_60d }}</td>\n </ng-container>\n\n <!-- 60d Receipts -->\n <ng-container matColumnDef=\"60d Receipts\">\n <th mat-header-cell *matHeaderCellDef>60d Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_60d }}</td>\n </ng-container>\n\n <!-- 90d Issues -->\n <ng-container matColumnDef=\"90d Issues\">\n <th mat-header-cell *matHeaderCellDef>90d Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_90d }}</td>\n </ng-container>\n\n <!-- 90d Receipts -->\n <ng-container matColumnDef=\"90d Receipts\">\n <th mat-header-cell *matHeaderCellDef>90d Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_90d }}</td>\n </ng-container>\n\n <!-- 1y Issues -->\n <ng-container matColumnDef=\"1y Issues\">\n <th mat-header-cell *matHeaderCellDef>1y Issues</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.issues_1y }}</td>\n </ng-container>\n\n <!-- 60d Receipts -->\n <ng-container matColumnDef=\"1y Receipts\">\n <th mat-header-cell *matHeaderCellDef>1y Receipts</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.receipts_1y }}</td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>\n" }]
|
|
162
|
+
}], ctorParameters: () => [{ type: i1.LowStockReportService }, { type: i2.ActivatedRoute }, { type: i3.RequestHelperService }, { type: i4.FormBuilder }] });
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG93LXN0b2NrLXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9yZXBvcnRzL2xvdy1zdG9jay1yZXBvcnQvbG93LXN0b2NrLXJlcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9yZXBvcnRzL2xvdy1zdG9jay1yZXBvcnQvbG93LXN0b2NrLXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBMEIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUNmLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsR0FDVCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25E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d0JBQ3ZCLE9BQU87d0JBQ1AsY0FBYzt3QkFDZCxPQUFPO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixhQUFhO3dCQUNiLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFFBQVE7d0JBQ1IsUUFBUTt3QkFDUixjQUFjO3dCQUNkLE1BQU07d0JBQ04sU0FBUzt3QkFDVCxPQUFPO3dCQUNQLGFBQWE7d0JBQ2IsUUFBUTt3QkFDUixJQUFJO3dCQUNKLDhCQUE4Qjt3QkFDOUIsbUJBQW1CO3dCQUNuQix3QkFBd0I7d0JBQ3hCLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLFFBQVE7cUJBQ1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3VycmVuY3lQaXBlLCBEYXRlUGlwZSwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWluZmluaXRlLXNjcm9sbCc7XG5pbXBvcnQgeyBNYXRDYXJkLCBNYXRDYXJkQ29udGVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHtcbiAgTWF0Q2VsbCxcbiAgTWF0Q2VsbERlZixcbiAgTWF0Q29sdW1uRGVmLFxuICBNYXRGb290ZXJDZWxsLFxuICBNYXRGb290ZXJDZWxsRGVmLFxuICBNYXRGb290ZXJSb3csXG4gIE1hdEZvb3RlclJvd0RlZixcbiAgTWF0SGVhZGVyQ2VsbCxcbiAgTWF0SGVhZGVyQ2VsbERlZixcbiAgTWF0SGVhZGVyUm93LFxuICBNYXRIZWFkZXJSb3dEZWYsXG4gIE1hdFJvdyxcbiAgTWF0Um93RGVmLFxuICBNYXRUYWJsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkLCBNYXRMYWJlbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0SGVhZGVyLCBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBQcm9kdWN0Q2F0ZWdvcnlCYWRnZXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wcm9kdWN0L3dpZGdldHMvcHJvZHVjdC1jYXRlZ29yeS1iYWRnZXMvcHJvZHVjdC1jYXRlZ29yeS1iYWRnZXMuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcXVlc3RIZWxwZXJTZXJ2aWNlLCBTZWFyY2hhYmxlU2VsZWN0b3JNb2R1bGUsIFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UgfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBJbnZlbnRvcnlWYWx1ZVJlcG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnZlbnRvcnktdmFsdWUtcmVwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG93U3RvY2tSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbG93LXN0b2NrLXJlcG9ydC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxvdy1zdG9jay1yZXBvcnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ3VycmVuY3lQaXBlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlLFxuICAgIE1hdENhcmQsXG4gICAgTWF0Q2FyZENvbnRlbnQsXG4gICAgTWF0Q2VsbCxcbiAgICBNYXRDZWxsRGVmLFxuICAgIE1hdENvbHVtbkRlZixcbiAgICBNYXRGb290ZXJDZWxsLFxuICAgIE1hdEZvb3RlclJvdyxcbiAgICBNYXRGb290ZXJSb3dEZWYsXG4gICAgTWF0Rm9ybUZpZWxkLFxuICAgIE1hdEhlYWRlckNlbGwsXG4gICAgTWF0SGVhZGVyUm93LFxuICAgIE1hdEhlYWRlclJvd0RlZixcbiAgICBNYXRJbnB1dCxcbiAgICBNYXRMYWJlbCxcbiAgICBNYXRQcm9ncmVzc0JhcixcbiAgICBNYXRSb3csXG4gICAgTWF0Um93RGVmLFxuICAgIE1hdFNvcnQsXG4gICAgTWF0U29ydEhlYWRlcixcbiAgICBNYXRUYWJsZSxcbiAgICBOZ0lmLFxuICAgIFByb2R1Y3RDYXRlZ29yeUJhZGdlc0NvbXBvbmVudCxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFNlYXJjaGFibGVTZWxlY3Rvck1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rLFxuICAgIE1hdEZvb3RlckNlbGxEZWYsXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcbiAgICBNYXRGb290ZXJDZWxsRGVmLFxuICAgIE1hdEhlYWRlckNlbGxEZWYsXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcbiAgICBEYXRlUGlwZSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvdy1zdG9jay1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbG93LXN0b2NrLXJlcG9ydC5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIExvd1N0b2NrUmVwb3J0Q29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgICcjJyxcbiAgICAnUHJvZHVjdCcsXG4gICAgJ1R5cGUnLFxuICAgICdDYXRlZ29yaWVzJyxcbiAgICAnUmVvcmRlciBQb2ludCcsXG4gICAgJ1N0b2NrJyxcbiAgICAnTGFzdCBQdXJjaGFzZScsXG4gICAgJzMwZCBJc3N1ZXMnLFxuICAgICczMGQgUmVjZWlwdHMnLFxuICAgICc2MGQgSXNzdWVzJyxcbiAgICAnNjBkIFJlY2VpcHRzJyxcbiAgICAnOTBkIElzc3VlcycsXG4gICAgJzkwZCBSZWNlaXB0cycsXG4gICAgJzF5IElzc3VlcycsXG4gICAgJzF5IFJlY2VpcHRzJyxcbiAgXTtcbiAgdG90YWxJbnZlbnRvcnlWYWx1ZSA9IDA7XG4gIGlzRXhwb3J0aW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBMb3dTdG9ja1JlcG9ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZXF1ZXN0SGVscGVyU2VydmljZTogUmVxdWVzdEhlbHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZmlsdGVyRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgY2F0ZWdvcnlfaWRzOiBbJyddLFxuICAgICAgc2VhcmNoOiBbJyddLFxuICAgICAgc29ydF9ieTogWydpZHxkZXNjJ10sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvRm9ybUNoYW5nZXMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUm91dGVDaGFuZ2VzKCk7XG4gIH1cblxuICBsb2FkRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIC4uLnRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UuY29udmVydFRvRm9ybURhdGEodGhpcy5maWx0ZXJGb3JtLnZhbHVlKSxcbiAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgIHBlclBhZ2U6IHRoaXMucGVyUGFnZSxcbiAgICAgIHdpdGg6ICdjYXRlZ29yaWVzLGxhc3RTdG9ja1JlY2VpcHQsdHlwZSxtZWFzdXJlJyxcbiAgICB9O1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2UuaW5kZXgocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscz8uY29uY2F0KHJlc3BvbnNlPy5kYXRhKTtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm1vZGVscy5mb3JFYWNoKChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy50b3RhbEludmVudG9yeVZhbHVlICs9IG1vZGVsPy5pbnZlbnRvcnlfdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5pc1dvcmtpbmcgPSBmYWxzZSksXG4gICAgfSk7XG4gIH1cblxuICBvblNvcnRDaGFuZ2Uoc29ydDogU29ydCkge1xuICAgIGxldCB7IGFjdGl2ZSwgZGlyZWN0aW9uIH0gPSBzb3J0O1xuICAgIGlmICghYWN0aXZlKSBhY3RpdmUgPSAnaWQnO1xuICAgIGlmICghZGlyZWN0aW9uKSBkaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnc29ydF9ieScpPy5zZXRWYWx1ZShhY3RpdmUgKyAnfCcgKyBkaXJlY3Rpb24pO1xuICB9XG5cbiAgZXhwb3J0KCkge1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgLi4udGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh0aGlzLmZpbHRlckZvcm0udmFsdWUpLFxuICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgcGVyUGFnZTogNTAwMDAsXG4gICAgICB3aXRoOiAnY2F0ZWdvcmllcyxsYXN0U3RvY2tSZWNlaXB0JyxcbiAgICB9O1xuICAgIHRoaXMuaXNFeHBvcnRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5leHBvcnQocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICB3aW5kb3cub3BlbihyZXNwb25zZT8uaXRlbT8uZmlsZV9saW5rLCAnX2JsYW5rJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzRXhwb3J0aW5nID0gZmFsc2UpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtV2l0aFF1ZXJ5UGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UudXBkYXRlRm9ybVdpdGhRdWVyeVBhcmFtcyh0aGlzLmZpbHRlckZvcm0sIHtcbiAgICAgIGNhdGVnb3J5X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0Zvcm1DaGFuZ2VzKCk6IHZvaWQge1xuICAgICh0aGlzLmZpbHRlckZvcm0gYXMgRm9ybUdyb3VwKS52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoODAwKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVRdWVyeVBhcmFtcyh0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHRoaXMuZmlsdGVyRm9ybS52YWx1ZSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Sb3V0ZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGRlYm91bmNlVGltZSg1MDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgPG1hdC1jYXJkPlxuICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cIm1iLTBcIj5Mb3cgU3RvY2sgUmVwb3J0PC9oMz5cbiAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1maWxlLWV4Y2VsIGN1cnNvci1wb2ludGVyIGQtcHJpbnQtbm9uZVwiIChjbGljayk9XCJleHBvcnQoKVwiPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWw+U2VhcmNoPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VhcmNoIHByb2R1Y3RzXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNoXCIgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1sYWJlbD5DYXRlZ29yeTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvcHJvZHVjdC1jYXRlZ29yaWVzXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcnlfaWRzXCIgW211bHRpcGxlXT1cInRydWVcIj5cbiAgICAgICAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cblxuICA8bWF0LWNhcmQgY2xhc3M9XCJtdC0zXCI+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJwLTBcIj5cbiAgICAgIDx0YWJsZVxuICAgICAgICBtYXQtdGFibGVcbiAgICAgICAgW2RhdGFTb3VyY2VdPVwibW9kZWxzXCJcbiAgICAgICAgY2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MFwiXG4gICAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbCgpXCJcbiAgICAgICAgbWF0U29ydFxuICAgICAgICAobWF0U29ydENoYW5nZSk9XCJvblNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gIyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiI1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IzwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj57eyBpICsgMSB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUHJvZHVjdCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiUHJvZHVjdFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPVwibmFtZVwiPlByb2R1Y3Q8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbJy9pbnZlbnRvcnkvcHJvZHVjdHMnLCBlbGVtZW50Py5pZCwgJ3ZpZXcnXVwiIGNsYXNzPVwidGV4dC1kYXJrXCI+XG4gICAgICAgICAgICAgIHt7IGVsZW1lbnQ/Lm5hbWUgfX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFR5cGUgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIlR5cGVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlR5cGU8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py50eXBlPy50aXRsZSB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVvcmRlciBQb2ludCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiUmVvcmRlciBQb2ludFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+UmVvcmRlciBQb2ludDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnJlb3JkZXJfcG9pbnQgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIENhdGVnb3JpZXMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkNhdGVnb3JpZXNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkNhdGVnb3JpZXM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8YXBwLXByb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzIFtwcm9kdWN0XT1cImVsZW1lbnRcIj48L2FwcC1wcm9kdWN0LWNhdGVnb3J5LWJhZGdlcz5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFN0b2NrIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJTdG9ja1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPVwic3RvY2tcIj5TdG9jazwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnN0b2NrIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBMYXN0IFB1cmNoYXNlIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJMYXN0IFB1cmNoYXNlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5MYXN0IFB1cmNoYXNlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCIgKm5nSWY9XCJlbGVtZW50Py5sYXN0X3N0b2NrX3JlY2VpcHRcIj5cbiAgICAgICAgICAgICAge3sgZWxlbWVudD8ubGFzdF9zdG9ja19yZWNlaXB0Py5kYXRlIHwgZGF0ZSB9fSAtIHt7IGVsZW1lbnQ/Lmxhc3Rfc3RvY2tfcmVjZWlwdD8ucXVhbnRpdHkgfX1cbiAgICAgICAgICAgICAge3sgZWxlbWVudD8ubWVhc3VyZT8udGl0bGUgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50Py5sYXN0X3N0b2NrX3JlY2VpcHRcIj5cbiAgICAgICAgICAgICAge3sgZWxlbWVudD8ubGFzdF9zdG9ja19yZWNlaXB0Py5wdXJjaGFzZV9wcmljZSA/PyAwIHwgY3VycmVuY3kgfX0gcGVyIHt7IGVsZW1lbnQ/Lm1lYXN1cmU/LnRpdGxlIH19XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gMzBkIElzc3VlcyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCIzMGQgSXNzdWVzXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4zMGQgSXNzdWVzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/Lmlzc3Vlc18zMGQgfX08L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIDMwZCBSZWNlaXB0cyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCIzMGQgUmVjZWlwdHNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjMwZCBSZWNlaXB0czwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50Py5yZWNlaXB0c18zMGQgfX08L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIDYwZCBJc3N1ZXMgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiNjBkIElzc3Vlc1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+NjBkIElzc3VlczwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50Py5pc3N1ZXNfNjBkIH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSA2MGQgUmVjZWlwdHMgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiNjBkIFJlY2VpcHRzXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj42MGQgUmVjZWlwdHM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8ucmVjZWlwdHNfNjBkIH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSA5MGQgSXNzdWVzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIjkwZCBJc3N1ZXNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjkwZCBJc3N1ZXM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uaXNzdWVzXzkwZCB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gOTBkIFJlY2VpcHRzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIjkwZCBSZWNlaXB0c1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+OTBkIFJlY2VpcHRzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/LnJlY2VpcHRzXzkwZCB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gMXkgSXNzdWVzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIjF5IElzc3Vlc1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+MXkgSXNzdWVzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/Lmlzc3Vlc18xeSB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gNjBkIFJlY2VpcHRzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIjF5IFJlY2VpcHRzXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4xeSBSZWNlaXB0czwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50Py5yZWNlaXB0c18xeSB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDwvdGFibGU+XG5cbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJpc1dvcmtpbmdcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICA8L21hdC1jYXJkPlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BehaviorSubject } from
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
2
2
|
export default class TechlifyFormService {
|
|
3
3
|
_isListUpdated = new BehaviorSubject(false);
|
|
4
4
|
isListUpdated() {
|
|
@@ -8,4 +8,4 @@ export default class TechlifyFormService {
|
|
|
8
8
|
this._isListUpdated.next(val);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktZm9ybS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc2VydmljZXMvdGVjaGxpZnktZm9ybS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsTUFBTSxDQUFDLE9BQU8sT0FBTyxtQkFBbUI7SUFDOUIsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFZO1FBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZWNobGlmeUZvcm1TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfaXNMaXN0VXBkYXRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIGlzTGlzdFVwZGF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTGlzdFVwZGF0ZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBsaXN0VXBkYXRlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0xpc3RVcGRhdGVkLm5leHQodmFsKTtcbiAgfVxufVxuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/material/dialog";
|
|
4
4
|
import * as i2 from "../stock-issuance.service";
|
|
@@ -17,7 +17,7 @@ export class StockIssuanceDeleteButtonComponent {
|
|
|
17
17
|
this.alertService = alertService;
|
|
18
18
|
}
|
|
19
19
|
showDeleteConfirmModel(templateRef) {
|
|
20
|
-
this.matDialog.open(templateRef, { width:
|
|
20
|
+
this.matDialog.open(templateRef, { width: '400px' });
|
|
21
21
|
}
|
|
22
22
|
delete() {
|
|
23
23
|
this.isDeleting = true;
|
|
@@ -26,7 +26,7 @@ export class StockIssuanceDeleteButtonComponent {
|
|
|
26
26
|
this.matDialog.closeAll();
|
|
27
27
|
this.isDeleting = false;
|
|
28
28
|
this.deleted.emit();
|
|
29
|
-
this.alertService.addAlert(
|
|
29
|
+
this.alertService.addAlert('Stock Issuance deleted successfully!', 'success');
|
|
30
30
|
},
|
|
31
31
|
error: () => {
|
|
32
32
|
this.isDeleting = false;
|
|
@@ -34,14 +34,14 @@ export class StockIssuanceDeleteButtonComponent {
|
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonComponent, deps: [{ token: i1.MatDialog }, { token: i2.StockIssuanceService }, { token: i3.AlertService }], target: i0.ɵɵFactoryTarget.Component });
|
|
37
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StockIssuanceDeleteButtonComponent, selector: "app-stock-issuance-delete-button", inputs: { stockIssuance: "stockIssuance" }, outputs: { deleted: "deleted" }, ngImport: i0, template: "<span
|
|
37
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StockIssuanceDeleteButtonComponent, selector: "app-stock-issuance-delete-button", inputs: { stockIssuance: "stockIssuance" }, outputs: { deleted: "deleted" }, ngImport: i0, template: "<span class=\"material-symbols-outlined cursor-pointer\" (click)=\"showDeleteConfirmModel(deleteModelTemplate)\">\n delete\n</span>\n\n<ng-template #deleteModelTemplate>\n <h3 mat-dialog-title>Delete Stock Issuance</h3>\n <div mat-dialog-content>\n <p>Are you sure you want to delete the stock issuance record?</p>\n </div>\n <div mat-dialog-actions class=\"d-flex justify-content-end gap-2\">\n <button [disabled]=\"isDeleting\" mat-raised-button type=\"button\" color=\"warn\" (click)=\"delete()\">Delete</button>\n <button [disabled]=\"isDeleting\" mat-flat-button mat-dialog-close type=\"button\">Cancel</button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }], preserveWhitespaces: true });
|
|
38
38
|
}
|
|
39
39
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonComponent, decorators: [{
|
|
40
40
|
type: Component,
|
|
41
|
-
args: [{ selector:
|
|
41
|
+
args: [{ selector: 'app-stock-issuance-delete-button', template: "<span class=\"material-symbols-outlined cursor-pointer\" (click)=\"showDeleteConfirmModel(deleteModelTemplate)\">\n delete\n</span>\n\n<ng-template #deleteModelTemplate>\n <h3 mat-dialog-title>Delete Stock Issuance</h3>\n <div mat-dialog-content>\n <p>Are you sure you want to delete the stock issuance record?</p>\n </div>\n <div mat-dialog-actions class=\"d-flex justify-content-end gap-2\">\n <button [disabled]=\"isDeleting\" mat-raised-button type=\"button\" color=\"warn\" (click)=\"delete()\">Delete</button>\n <button [disabled]=\"isDeleting\" mat-flat-button mat-dialog-close type=\"button\">Cancel</button>\n </div>\n</ng-template>\n" }]
|
|
42
42
|
}], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.StockIssuanceService }, { type: i3.AlertService }], propDecorators: { stockIssuance: [{
|
|
43
43
|
type: Input
|
|
44
44
|
}], deleted: [{
|
|
45
45
|
type: Output
|
|
46
46
|
}] } });
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWFuY2UtZGVsZXRlLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWFuY2UtZGVsZXRlLWJ1dHRvbi9zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3N0b2NrLWlzc3VhbmNlcy9zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uL3N0b2NrLWlzc3VhbmNlLWRlbGV0ZS1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBVXBGLE1BQU0sT0FBTyxrQ0FBa0M7SUFNbkM7SUFDQTtJQUNBO0lBUEQsYUFBYSxDQUFNO0lBQ2xCLE9BQU8sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUMvRCxVQUFVLEdBQVksS0FBSyxDQUFDO0lBRTVCLFlBQ1UsU0FBb0IsRUFDcEIsb0JBQTBDLEVBQzFDLFlBQTBCO1FBRjFCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUNqQyxDQUFDO0lBRUosc0JBQXNCLENBQUMsV0FBNkI7UUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDN0QsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsc0NBQXNDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDMUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBNUJVLGtDQUFrQzs0RkFBbEMsa0NBQWtDLHFKQ1YvQyxvcEJBY0E7OzRGREphLGtDQUFrQztrQkFMOUMsU0FBUzsrQkFDRSxrQ0FBa0M7NElBS25DLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFN0b2NrSXNzdWFuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vc3RvY2staXNzdWFuY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0b2NrLWlzc3VhbmNlLWRlbGV0ZS1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFN0b2NrSXNzdWFuY2VEZWxldGVCdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSBzdG9ja0lzc3VhbmNlOiBhbnk7XG4gIEBPdXRwdXQoKSBkZWxldGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBpc0RlbGV0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtYXREaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHN0b2NrSXNzdWFuY2VTZXJ2aWNlOiBTdG9ja0lzc3VhbmNlU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBzaG93RGVsZXRlQ29uZmlybU1vZGVsKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgdGhpcy5tYXREaWFsb2cub3Blbih0ZW1wbGF0ZVJlZiwgeyB3aWR0aDogJzQwMHB4JyB9KTtcbiAgfVxuXG4gIGRlbGV0ZSgpIHtcbiAgICB0aGlzLmlzRGVsZXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RvY2tJc3N1YW5jZVNlcnZpY2UuZGVsZXRlKHRoaXMuc3RvY2tJc3N1YW5jZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcbiAgICAgICAgdGhpcy5pc0RlbGV0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsZXRlZC5lbWl0KCk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdTdG9jayBJc3N1YW5jZSBkZWxldGVkIHN1Y2Nlc3NmdWxseSEnLCAnc3VjY2VzcycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNEZWxldGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNob3dEZWxldGVDb25maXJtTW9kZWwoZGVsZXRlTW9kZWxUZW1wbGF0ZSlcIj5cbiAgZGVsZXRlXG48L3NwYW4+XG5cbjxuZy10ZW1wbGF0ZSAjZGVsZXRlTW9kZWxUZW1wbGF0ZT5cbiAgPGgzIG1hdC1kaWFsb2ctdGl0bGU+RGVsZXRlIFN0b2NrIElzc3VhbmNlPC9oMz5cbiAgPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgc3RvY2sgaXNzdWFuY2UgcmVjb3JkPzwvcD5cbiAgPC9kaXY+XG4gIDxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTJcIj5cbiAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc0RlbGV0aW5nXCIgbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNvbG9yPVwid2FyblwiIChjbGljayk9XCJkZWxldGUoKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImlzRGVsZXRpbmdcIiBtYXQtZmxhdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSB0eXBlPVwiYnV0dG9uXCI+Q2FuY2VsPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|