techlify-inventory-common 18.24.0 → 18.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/esm2022/lib/inventory-common/category/category-form/category-form.component.mjs +3 -3
  2. package/esm2022/lib/inventory-common/category/category-form-button/category-form-button.component.mjs +3 -3
  3. package/esm2022/lib/inventory-common/category/category-list-page/category-list-page.component.mjs +3 -3
  4. package/esm2022/lib/inventory-common/category/category-routing.module.mjs +4 -4
  5. package/esm2022/lib/inventory-common/category/category-view/category-view.component.mjs +3 -3
  6. package/esm2022/lib/inventory-common/category/category.module.mjs +4 -4
  7. package/esm2022/lib/inventory-common/category/category.service.mjs +3 -3
  8. package/esm2022/lib/inventory-common/incident/incident-form/incident-form.component.mjs +3 -3
  9. package/esm2022/lib/inventory-common/incident/incident-form-button/incident-form-button.component.mjs +3 -3
  10. package/esm2022/lib/inventory-common/incident/incident-list/incident-list.component.mjs +9 -11
  11. package/esm2022/lib/inventory-common/incident/incident-routing.module.mjs +4 -4
  12. package/esm2022/lib/inventory-common/incident/incident.module.mjs +4 -4
  13. package/esm2022/lib/inventory-common/incident/incident.service.mjs +3 -3
  14. package/esm2022/lib/inventory-common/inventory-common-routing.module.mjs +6 -6
  15. package/esm2022/lib/inventory-common/inventory-common.module.mjs +4 -4
  16. package/esm2022/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.mjs +3 -3
  17. package/esm2022/lib/inventory-common/inventory-value-report.service.mjs +3 -3
  18. package/esm2022/lib/inventory-common/location/location-delete-button/location-delete-button.component.mjs +3 -3
  19. package/esm2022/lib/inventory-common/location/location-form/location-form.component.mjs +3 -3
  20. package/esm2022/lib/inventory-common/location/location-form-button/location-form-button.component.mjs +3 -3
  21. package/esm2022/lib/inventory-common/location/location-information/location-information.component.mjs +3 -3
  22. package/esm2022/lib/inventory-common/location/location-list/location-list.component.mjs +7 -10
  23. package/esm2022/lib/inventory-common/location/location-product-statistics/location-product-statistics.component.mjs +7 -10
  24. package/esm2022/lib/inventory-common/location/location-routing.module.mjs +4 -4
  25. package/esm2022/lib/inventory-common/location/location-status-changer/location-status-changer.component.mjs +3 -3
  26. package/esm2022/lib/inventory-common/location/location-view/location-view.component.mjs +3 -3
  27. package/esm2022/lib/inventory-common/location/location.module.mjs +4 -4
  28. package/esm2022/lib/inventory-common/location/location.service.mjs +3 -3
  29. package/esm2022/lib/inventory-common/location/shelf/shelf-delete-button/shelf-delete-button.component.mjs +3 -3
  30. package/esm2022/lib/inventory-common/location/shelf/shelf-form/shelf-form.component.mjs +3 -3
  31. package/esm2022/lib/inventory-common/location/shelf/shelf-form-button/shelf-form-button.component.mjs +3 -3
  32. package/esm2022/lib/inventory-common/location/shelf/shelf-list/shelf-list.component.mjs +14 -18
  33. package/esm2022/lib/inventory-common/location/shelf/shelf-routing.module.mjs +4 -4
  34. package/esm2022/lib/inventory-common/location/shelf/shelf.module.mjs +4 -4
  35. package/esm2022/lib/inventory-common/location/shelf/shelf.service.mjs +3 -3
  36. package/esm2022/lib/inventory-common/low-stock-report.service.mjs +3 -3
  37. package/esm2022/lib/inventory-common/material.module.mjs +4 -4
  38. package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete-button/measure-delete-button.component.mjs +3 -3
  39. package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete.module.mjs +4 -4
  40. package/esm2022/lib/inventory-common/measure/measure-form/measure-form/measure-form.component.mjs +3 -3
  41. package/esm2022/lib/inventory-common/measure/measure-form/measure-form-button/measure-form-button.component.mjs +3 -3
  42. package/esm2022/lib/inventory-common/measure/measure-form/measure-form.module.mjs +4 -4
  43. package/esm2022/lib/inventory-common/measure/measure-routing.module.mjs +4 -4
  44. package/esm2022/lib/inventory-common/measure/measure.module.mjs +4 -4
  45. package/esm2022/lib/inventory-common/measure/measure.service.mjs +3 -3
  46. package/esm2022/lib/inventory-common/measure/measures-list/measures-list.component.mjs +3 -3
  47. package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.mjs +3 -3
  48. package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.module.mjs +4 -4
  49. package/esm2022/lib/inventory-common/product/product-basic-info/product-basic-info.component.mjs +3 -3
  50. package/esm2022/lib/inventory-common/product/product-batch-update-form/product-batch-update-form.component.mjs +3 -3
  51. package/esm2022/lib/inventory-common/product/product-delete-button/product-delete-button.component.mjs +3 -3
  52. package/esm2022/lib/inventory-common/product/product-form/product-form.component.mjs +3 -3
  53. package/esm2022/lib/inventory-common/product/product-form-button/product-form-button.component.mjs +3 -3
  54. package/esm2022/lib/inventory-common/product/product-form.service.mjs +3 -3
  55. package/esm2022/lib/inventory-common/product/product-import-page/product-import-page.component.mjs +3 -3
  56. package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +9 -11
  57. package/esm2022/lib/inventory-common/product/product-location/product-location-list/product-location-list.component.mjs +3 -3
  58. package/esm2022/lib/inventory-common/product/product-measure-form/product-measure-form.component.mjs +3 -3
  59. package/esm2022/lib/inventory-common/product/product-measures-list/product-measures-list.component.mjs +3 -3
  60. package/esm2022/lib/inventory-common/product/product-nav-bar/product-nav-bar.component.mjs +3 -3
  61. package/esm2022/lib/inventory-common/product/product-quick-search/product-quick-search.component.mjs +3 -3
  62. package/esm2022/lib/inventory-common/product/product-routing.module.mjs +4 -4
  63. package/esm2022/lib/inventory-common/product/product-search/product-search.component.mjs +3 -3
  64. package/esm2022/lib/inventory-common/product/product-search/product-search.module.mjs +4 -4
  65. package/esm2022/lib/inventory-common/product/product-statistics.service.mjs +3 -3
  66. package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.component.mjs +3 -3
  67. package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.module.mjs +4 -4
  68. package/esm2022/lib/inventory-common/product/product-summary.service.mjs +3 -3
  69. package/esm2022/lib/inventory-common/product/product-tax/product-tax-delete-button/product-tax-delete-button.component.mjs +3 -3
  70. package/esm2022/lib/inventory-common/product/product-tax/product-tax-form-button/product-tax-form-button.component.mjs +3 -3
  71. package/esm2022/lib/inventory-common/product/product-tax/product-tax-list/product-tax-list.component.mjs +3 -3
  72. package/esm2022/lib/inventory-common/product/product-tax/product-tax.module.mjs +4 -4
  73. package/esm2022/lib/inventory-common/product/product-tax/product-tax.service.mjs +3 -3
  74. package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +6 -6
  75. package/esm2022/lib/inventory-common/product/product.module.mjs +9 -9
  76. package/esm2022/lib/inventory-common/product/product.service.mjs +3 -3
  77. package/esm2022/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.mjs +3 -3
  78. package/esm2022/lib/inventory-common/product-batch.service.mjs +3 -3
  79. package/esm2022/lib/inventory-common/rating/rating-form/rating-form.component.mjs +3 -3
  80. package/esm2022/lib/inventory-common/rating/rating-form-button/rating-form-button.component.mjs +3 -3
  81. package/esm2022/lib/inventory-common/rating/rating-list/rating-list.component.mjs +10 -13
  82. package/esm2022/lib/inventory-common/rating/rating-routing.module.mjs +4 -4
  83. package/esm2022/lib/inventory-common/rating/rating.module.mjs +4 -4
  84. package/esm2022/lib/inventory-common/rating/rating.service.mjs +3 -3
  85. package/esm2022/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.mjs +21 -21
  86. package/esm2022/lib/inventory-common/reports/low-stock-report/low-stock-report.component.mjs +8 -10
  87. package/esm2022/lib/inventory-common/shared/export-to-excel-button/export-to-excel-button.component.mjs +3 -3
  88. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.mjs +10 -10
  89. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.mjs +4 -4
  90. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.mjs +29 -12
  91. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.mjs +3 -3
  92. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.mjs +4 -4
  93. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-import-page/stock-issue-import-page.component.mjs +3 -3
  94. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.mjs +179 -0
  95. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.mjs +67 -0
  96. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-routing.module.mjs +36 -0
  97. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-view/stock-issue-view.component.mjs +68 -0
  98. package/esm2022/lib/inventory-common/stock-issuances/stock-issue.module.mjs +67 -0
  99. package/esm2022/lib/inventory-common/stock-issuances/stock-issue.service.mjs +18 -0
  100. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.mjs +3 -3
  101. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.mjs +4 -5
  102. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.mjs +3 -3
  103. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.module.mjs +4 -4
  104. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-import-page/stock-receipt-import-page.component.mjs +3 -3
  105. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-view/stock-receipt-view.component.mjs +6 -6
  106. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt.service.mjs +3 -3
  107. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +24 -11
  108. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-routing.module.mjs +4 -4
  109. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +11 -8
  110. package/esm2022/lib/inventory-common/stock-summary.service.mjs +3 -3
  111. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-form/stock-transfer-form.component.mjs +3 -3
  112. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-form-button/stock-transfer-form-button.component.mjs +3 -3
  113. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-list/stock-transfer-list.component.mjs +6 -8
  114. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer.service.mjs +3 -3
  115. package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector/payee-selector.component.mjs +3 -3
  116. package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector.module.mjs +4 -4
  117. package/esm2022/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.mjs +3 -3
  118. package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form-button/supplier-form-button.component.mjs +3 -3
  119. package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.component.mjs +3 -3
  120. package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.service.mjs +3 -3
  121. package/esm2022/lib/inventory-common/supplier/supplier-information/supplier-information.component.mjs +3 -3
  122. package/esm2022/lib/inventory-common/supplier/supplier-routing.module.mjs +4 -4
  123. package/esm2022/lib/inventory-common/supplier/supplier-type.service.mjs +3 -3
  124. package/esm2022/lib/inventory-common/supplier/supplier-view/supplier-view.component.mjs +3 -3
  125. package/esm2022/lib/inventory-common/supplier/supplier.component.mjs +3 -3
  126. package/esm2022/lib/inventory-common/supplier/supplier.module.mjs +4 -4
  127. package/esm2022/lib/inventory-common/supplier/supplier.service.mjs +3 -3
  128. package/esm2022/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.mjs +7 -9
  129. package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.component.mjs +3 -3
  130. package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.module.mjs +4 -4
  131. package/esm2022/public-api.mjs +4 -4
  132. package/fesm2022/{techlify-inventory-common-category.module-Dw7cV-28.mjs → techlify-inventory-common-category.module-CW1zB9DQ.mjs} +35 -35
  133. package/fesm2022/{techlify-inventory-common-category.module-Dw7cV-28.mjs.map → techlify-inventory-common-category.module-CW1zB9DQ.mjs.map} +1 -1
  134. package/fesm2022/{techlify-inventory-common-measure.module-BvuwOooQ.mjs → techlify-inventory-common-measure.module-DJqtbIad.mjs} +37 -37
  135. package/fesm2022/{techlify-inventory-common-measure.module-BvuwOooQ.mjs.map → techlify-inventory-common-measure.module-DJqtbIad.mjs.map} +1 -1
  136. package/fesm2022/techlify-inventory-common-stock-issue-view.component-eeonvCBl.mjs +66 -0
  137. package/fesm2022/techlify-inventory-common-stock-issue-view.component-eeonvCBl.mjs.map +1 -0
  138. package/fesm2022/techlify-inventory-common-techlify-inventory-common-EAdspCEd.mjs +6328 -0
  139. package/fesm2022/techlify-inventory-common-techlify-inventory-common-EAdspCEd.mjs.map +1 -0
  140. package/fesm2022/techlify-inventory-common.mjs +1 -6300
  141. package/fesm2022/techlify-inventory-common.mjs.map +1 -1
  142. package/lib/inventory-common/incident/incident-list/incident-list.component.d.ts +2 -3
  143. package/lib/inventory-common/location/location-list/location-list.component.d.ts +2 -3
  144. package/lib/inventory-common/location/location-product-statistics/location-product-statistics.component.d.ts +2 -3
  145. package/lib/inventory-common/location/shelf/shelf-list/shelf-list.component.d.ts +2 -3
  146. package/lib/inventory-common/product/product-list/product-list.component.d.ts +2 -3
  147. package/lib/inventory-common/product/product-view-page/product-view-page.component.d.ts +2 -2
  148. package/lib/inventory-common/product/product.module.d.ts +2 -2
  149. package/lib/inventory-common/rating/rating-list/rating-list.component.d.ts +2 -3
  150. package/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.d.ts +2 -3
  151. package/lib/inventory-common/reports/low-stock-report/low-stock-report.component.d.ts +2 -3
  152. package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.d.ts +3 -3
  153. package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.d.ts +10 -3
  154. package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.d.ts +37 -0
  155. package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.d.ts +17 -0
  156. package/lib/inventory-common/stock-issuances/stock-issue-routing.module.d.ts +7 -0
  157. package/lib/inventory-common/stock-issuances/stock-issue-view/stock-issue-view.component.d.ts +19 -0
  158. package/lib/inventory-common/stock-issuances/stock-issue.module.d.ts +19 -0
  159. package/lib/inventory-common/stock-issuances/stock-issue.service.d.ts +7 -0
  160. package/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.d.ts +5 -3
  161. package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +1 -1
  162. package/lib/inventory-common/stock-transfer/stock-transfer-list/stock-transfer-list.component.d.ts +2 -3
  163. package/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.d.ts +3 -4
  164. package/package.json +3 -3
  165. package/public-api.d.ts +3 -3
  166. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance.service.mjs +0 -18
  167. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.mjs +0 -172
  168. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.mjs +0 -64
  169. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-routing.module.mjs +0 -31
  170. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances.module.mjs +0 -67
  171. package/lib/inventory-common/stock-issuances/stock-issuance.service.d.ts +0 -7
  172. package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.d.ts +0 -36
  173. package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.d.ts +0 -17
  174. package/lib/inventory-common/stock-issuances/stock-issuances-routing.module.d.ts +0 -7
  175. package/lib/inventory-common/stock-issuances/stock-issuances.module.d.ts +0 -19
@@ -0,0 +1,179 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { TechlifyListingControllerInterface } from 'ngx-techlify-core';
3
+ import { debounceTime, distinctUntilChanged } from 'rxjs';
4
+ import moment from 'moment';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "../stock-issue.service";
8
+ import * as i3 from "@angular/router";
9
+ import * as i4 from "ngx-techlify-core";
10
+ import * as i5 from "@angular/common";
11
+ import * as i6 from "@angular/material/form-field";
12
+ import * as i7 from "@angular/material/input";
13
+ import * as i8 from "@angular/material/sort";
14
+ import * as i9 from "@angular/material/table";
15
+ import * as i10 from "@angular/material/card";
16
+ import * as i11 from "@angular/material/tooltip";
17
+ import * as i12 from "@angular/material/progress-bar";
18
+ import * as i13 from "../stock-issue-form/stock-issue-form-button/stock-issue-form-button.component";
19
+ import * as i14 from "ngx-infinite-scroll";
20
+ import * as i15 from "../stock-issuance-delete-button/stock-issuance-delete-button.component";
21
+ import * as i16 from "../../product/widgets/product-category-badges/product-category-badges.component";
22
+ export class StockIssueListComponent extends TechlifyListingControllerInterface {
23
+ formBuilder;
24
+ stockIssueService;
25
+ activatedRoute;
26
+ featureService;
27
+ product;
28
+ issuableType;
29
+ issuableId;
30
+ label = 'Stock Issues';
31
+ showActions = true;
32
+ showFilters = true;
33
+ listUpdated = new EventEmitter();
34
+ defaultSelectedColumns = [
35
+ 'no', 'product', 'sku', 'date', 'quantity', 'measure', 'location', 'related', 'particulars',
36
+ ];
37
+ columnConfig = [
38
+ { label: 'Creator', def: 'creator', isSelected: false, isEditable: true },
39
+ ];
40
+ selectedColumns = this.columnConfig.filter(col => col.isSelected);
41
+ get displayedColumns() {
42
+ const selectedColumns = this.selectedColumns.map(col => col.def);
43
+ return this.defaultSelectedColumns.concat(...selectedColumns, 'actions');
44
+ }
45
+ get totalQuantity() {
46
+ return this.models.reduce((sum, model) => {
47
+ const products = model?.stock_issue_products ?? [];
48
+ return sum + products.reduce((productSum, product) => productSum + Number(product?.quantity ?? 0), 0);
49
+ }, 0);
50
+ }
51
+ get footerColumns() {
52
+ return this.displayedColumns.map(col => `footer-${col}`);
53
+ }
54
+ constructor(formBuilder, stockIssueService, activatedRoute, featureService) {
55
+ super();
56
+ this.formBuilder = formBuilder;
57
+ this.stockIssueService = stockIssueService;
58
+ this.activatedRoute = activatedRoute;
59
+ this.featureService = featureService;
60
+ this.lastPage = 0;
61
+ this.filterForm = this.formBuilder.group({
62
+ category_ids: [''],
63
+ date_from: [''],
64
+ date_to: [''],
65
+ duration: [''],
66
+ import_id: [''],
67
+ location_ids: [''],
68
+ measure_ids: [''],
69
+ product_ids: [''],
70
+ search: [''],
71
+ sort_by: ['date|desc'],
72
+ });
73
+ }
74
+ ngOnInit() {
75
+ this.loadFeatures();
76
+ if (this.product) {
77
+ this.filterForm.get('product_ids')?.setValue(this.product?.id);
78
+ this.defaultSelectedColumns = this.defaultSelectedColumns.filter(c => c !== 'product' && c !== 'sku');
79
+ }
80
+ this.updateFormWithQueryParams();
81
+ this.subscribeToFormChanges();
82
+ this.subscribeToRouteChanges();
83
+ }
84
+ loadData() {
85
+ const params = {
86
+ page: this.page,
87
+ perPage: this.perPage,
88
+ with: `creator,issuable.fixedAsset,stockIssueProducts.product,stockIssueProducts.location,stockIssueProducts.product.categories,stockTransfer,stockIssueProducts.batch`,
89
+ ...this.requestHelperService.convertToFormData(this.filterForm.value),
90
+ };
91
+ if (this.issuableId && this.issuableType) {
92
+ params.issuable_ids = this.issuableId;
93
+ params.issuable_types = this.issuableType;
94
+ }
95
+ this.isWorking = true;
96
+ this.stockIssueService.index(params).subscribe({
97
+ next: (response) => {
98
+ this.models = this.models.concat(response?.data);
99
+ this.lastPage = response?.last_page;
100
+ this.isWorking = false;
101
+ },
102
+ error: () => {
103
+ this.isWorking = false;
104
+ },
105
+ });
106
+ }
107
+ onSortChange(sort) {
108
+ let { active, direction } = sort;
109
+ if (!active) {
110
+ active = 'date';
111
+ }
112
+ if (!direction) {
113
+ direction = 'desc';
114
+ active = 'date';
115
+ }
116
+ this.filterForm.get('sort_by').setValue(active + '|' + direction);
117
+ }
118
+ updateFormWithQueryParams() {
119
+ this.requestHelperService.updateFormWithQueryParams(this.filterForm, {
120
+ product_ids: { multiple: true },
121
+ measure_ids: { multiple: true },
122
+ category_ids: { multiple: true },
123
+ supplier_ids: { multiple: true },
124
+ location_ids: { multiple: true },
125
+ });
126
+ }
127
+ subscribeToFormChanges() {
128
+ this.filterForm.valueChanges.pipe(debounceTime(800)).subscribe({
129
+ next: () => {
130
+ this.requestHelperService.updateQueryParams(this.requestHelperService.convertToFormData(this.filterForm.value));
131
+ }
132
+ });
133
+ }
134
+ subscribeToRouteChanges() {
135
+ this.activatedRoute.queryParams
136
+ .pipe(debounceTime(500), distinctUntilChanged())
137
+ .subscribe(() => {
138
+ this.reload();
139
+ });
140
+ }
141
+ onDurationChange(timelineValue) {
142
+ let { date_to, date_from } = timelineValue;
143
+ this.filterForm.patchValue({
144
+ date_from: date_from ? moment(date_from).format("YYYY-MM-DD") : "",
145
+ date_to: date_to ? moment(date_to).format("YYYY-MM-DD") : "",
146
+ }, { emitEvent: false });
147
+ }
148
+ loadFeatures() {
149
+ let isBatchEnabled = this.featureService.isFeatureExists('product-batch-numbers');
150
+ // now update displayedColumns accordingly
151
+ if (isBatchEnabled) {
152
+ const qtyIndex = this.defaultSelectedColumns.indexOf('quantity');
153
+ if (qtyIndex >= 0) {
154
+ this.defaultSelectedColumns.splice(qtyIndex + 1, 0, 'batch');
155
+ }
156
+ }
157
+ }
158
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueListComponent, deps: [{ token: i1.FormBuilder }, { token: i2.StockIssueService }, { token: i3.ActivatedRoute }, { token: i4.TechlifyFeatureService }], target: i0.ɵɵFactoryTarget.Component });
159
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StockIssueListComponent, selector: "app-stock-issue-list", inputs: { product: "product", issuableType: "issuableType", issuableId: "issuableId", label: "label", showActions: "showActions", showFilters: "showFilters" }, outputs: { listUpdated: "listUpdated" }, usesInheritance: true, ngImport: i0, template: "<mat-card *ngIf=\"!product\" class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"mb-0\">{{ label }}</h3>\n\n <app-stock-issue-form-button icon=\"add\" [issuableType]=\"issuableType\" [issuableId]=\"issuableId\"\n (saved)=\"reload()\"></app-stock-issue-form-button>\n\n <span *ngIf=\"showActions\" matTooltip=\"Import\" routerLink=\"import\"\n class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n\n <app-column-selector *ngIf=\"showActions\" mode=\"icon\" class=\"mt-2 d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <form [formGroup]=\"filterForm\" *ngIf=\"showFilters\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <app-timeline-filter appearance=\"fill\" labelText=\"Date\" formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\" [showClearButton]=\"true\" [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"></app-timeline-filter>\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\n <mat-form-field>\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Location</mat-label>\n <app-searchable-selector apiUrl=\"api/inventory-locations\" formControlName=\"location_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n</mat-card>\n\n<mat-card>\n <mat-card-content *ngIf=\"product\" class=\"mb-0\">\n <div class=\"d-flex justify-content-start align-items-center gap-2 mb-2\">\n <span class=\"material-symbols-outlined\"> ungroup </span>\n <h3 class=\"mb-0\">Stock Issues</h3>\n\n <app-stock-issue-form-button class=\"mt-2\" [product]=\"product\" icon=\"add\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Stock Issuances\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" matSort\n (matSortChange)=\"onSortChange($event)\">\n <!-- # Column -->\n <ng-container matColumnDef=\"no\">\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>Product</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <a class=\"text-decoration-none text-dark\"\n [routerLink]=\"['/inventory/products', element?.stock_issue_products[0]?.product?.id, 'view']\">\n {{ element?.stock_issue_products[0]?.product.name }}\n </a>\n <app-product-category-badges\n [product]=\"element?.stock_issue_products[0]?.product\"></app-product-category-badges>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.sku }}</td>\n </ng-container>\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.date | date }}</td>\n </ng-container>\n\n <!-- Location Column -->\n <ng-container matColumnDef=\"location\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Location</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-decoration-none text-dark\"\n [routerLink]=\"['/inventory/locations', element?.stock_issue_products[0]?.location_id, 'view']\">\n {{ element?.stock_issue_products[0]?.location?.title }}\n </a>\n </td>\n </ng-container>\n\n <!-- Related Column -->\n <ng-container matColumnDef=\"related\">\n <th mat-header-cell *matHeaderCellDef>Related</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-dark\" *ngIf=\"element?.issuable\" [routerLink]=\"['/maintenances', element?.issuable_id, 'view']\">\n Maintenance for {{ element?.issuable?.fixed_asset?.name }}\n </a>\n </td>\n </ng-container>\n\n <!-- Quantity Column -->\n <ng-container matColumnDef=\"quantity\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.quantity }} {{\n element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Batch Column -->\n <ng-container matColumnDef=\"batch\">\n <th mat-header-cell *matHeaderCellDef>Batch</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\" *ngIf=\"element?.stock_issue_products[0]?.batch?.batch_number\">{{\n element?.stock_issue_products[0]?.batch?.batch_number }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.stock_issue_products[0]?.batch?.expires_on\">\n Expires {{ element?.stock_issue_products[0]?.batch?.expires_on | date }}\n </small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Measure</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Purchase Price Column -->\n <ng-container matColumnDef=\"purchase_price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Purchase Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.purchase_price | currency }}\n </td>\n </ng-container>\n\n <!-- Total Value Column -->\n <ng-container matColumnDef=\"amount\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Total Value</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.amount | currency }}\n </td>\n </ng-container>\n\n <!-- Particulars Column -->\n <ng-container matColumnDef=\"particulars\">\n <th mat-header-cell *matHeaderCellDef>Particulars</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.particulars }}</td>\n </ng-container>\n\n <!-- Supplier Column -->\n <ng-container matColumnDef=\"supplier\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Supplier</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.supplier?.company_name }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-1\">{{ element?.creator?.name }}</p>\n <small class=\"text-secondary\">{{ element?.created_at | date }}</small>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div *ngIf=\"!element.stock_transfer\" class=\"d-flex gap-1 text-secondary\">\n <app-techlify-icon name=\"view\" size=\"md\"\n [routerLink]=\"['/inventory', 'stock-issues', element?.id, 'view']\"></app-techlify-icon>\n <app-stock-issue-form-button [stockIssue]=\"element\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n <app-stock-issuance-delete-button [stockIssuance]=\"element\"\n (deleted)=\"reload(); listUpdated.emit()\"></app-stock-issuance-delete-button>\n </div>\n\n <span *ngIf=\"element.stock_transfer\" class=\"badge rounded-pill text-bg-secondary\">Stock Transfer</span>\n </td>\n </ng-container>\n\n <!-- Footer Cells for Total Row -->\n <ng-container matColumnDef=\"footer-no\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-product\">\n <td mat-footer-cell *matFooterCellDef><strong>Total</strong></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-sku\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-date\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-location\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-related\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-quantity\">\n <td mat-footer-cell *matFooterCellDef><strong>{{ totalQuantity }}</strong></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-batch\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-measure\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-purchase_price\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-amount\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-particulars\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-supplier\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-creator\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-actions\">\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=\"footerColumns\"></tr>\n </table>\n\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: [":host ::ng-deep .mat-mdc-footer-row{position:sticky;bottom:0;background-color:#fff;z-index:10;box-shadow:0 -2px 4px #0000001a}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.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: i8.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i9.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i9.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i10.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i10.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i13.StockIssueFormButtonComponent, selector: "app-stock-issue-form-button", inputs: ["product", "stockIssueProduct", "stockIssue", "icon", "issuableType", "issuableId"], outputs: ["saved"] }, { kind: "directive", type: i14.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: i15.StockIssuanceDeleteButtonComponent, selector: "app-stock-issuance-delete-button", inputs: ["stockIssuance"], outputs: ["deleted"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.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: "component", type: i4.TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i16.ProductCategoryBadgesComponent, selector: "app-product-category-badges", inputs: ["product"] }, { kind: "component", type: i4.ColumnSelectorComponent, selector: "app-column-selector", inputs: ["label", "mode", "columnConfigs", "selectedColumns"], outputs: ["selectedColumnsChange", "displayedColumnsChange"] }, { kind: "component", type: i4.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "pipe", type: i5.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i5.DatePipe, name: "date" }], preserveWhitespaces: true });
160
+ }
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueListComponent, decorators: [{
162
+ type: Component,
163
+ args: [{ selector: 'app-stock-issue-list', template: "<mat-card *ngIf=\"!product\" class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"mb-0\">{{ label }}</h3>\n\n <app-stock-issue-form-button icon=\"add\" [issuableType]=\"issuableType\" [issuableId]=\"issuableId\"\n (saved)=\"reload()\"></app-stock-issue-form-button>\n\n <span *ngIf=\"showActions\" matTooltip=\"Import\" routerLink=\"import\"\n class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n\n <app-column-selector *ngIf=\"showActions\" mode=\"icon\" class=\"mt-2 d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <form [formGroup]=\"filterForm\" *ngIf=\"showFilters\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <app-timeline-filter appearance=\"fill\" labelText=\"Date\" formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\" [showClearButton]=\"true\" [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"></app-timeline-filter>\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\n <mat-form-field>\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Location</mat-label>\n <app-searchable-selector apiUrl=\"api/inventory-locations\" formControlName=\"location_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n</mat-card>\n\n<mat-card>\n <mat-card-content *ngIf=\"product\" class=\"mb-0\">\n <div class=\"d-flex justify-content-start align-items-center gap-2 mb-2\">\n <span class=\"material-symbols-outlined\"> ungroup </span>\n <h3 class=\"mb-0\">Stock Issues</h3>\n\n <app-stock-issue-form-button class=\"mt-2\" [product]=\"product\" icon=\"add\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Stock Issuances\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" matSort\n (matSortChange)=\"onSortChange($event)\">\n <!-- # Column -->\n <ng-container matColumnDef=\"no\">\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>Product</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <a class=\"text-decoration-none text-dark\"\n [routerLink]=\"['/inventory/products', element?.stock_issue_products[0]?.product?.id, 'view']\">\n {{ element?.stock_issue_products[0]?.product.name }}\n </a>\n <app-product-category-badges\n [product]=\"element?.stock_issue_products[0]?.product\"></app-product-category-badges>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.sku }}</td>\n </ng-container>\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.date | date }}</td>\n </ng-container>\n\n <!-- Location Column -->\n <ng-container matColumnDef=\"location\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Location</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-decoration-none text-dark\"\n [routerLink]=\"['/inventory/locations', element?.stock_issue_products[0]?.location_id, 'view']\">\n {{ element?.stock_issue_products[0]?.location?.title }}\n </a>\n </td>\n </ng-container>\n\n <!-- Related Column -->\n <ng-container matColumnDef=\"related\">\n <th mat-header-cell *matHeaderCellDef>Related</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-dark\" *ngIf=\"element?.issuable\" [routerLink]=\"['/maintenances', element?.issuable_id, 'view']\">\n Maintenance for {{ element?.issuable?.fixed_asset?.name }}\n </a>\n </td>\n </ng-container>\n\n <!-- Quantity Column -->\n <ng-container matColumnDef=\"quantity\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.quantity }} {{\n element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Batch Column -->\n <ng-container matColumnDef=\"batch\">\n <th mat-header-cell *matHeaderCellDef>Batch</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\" *ngIf=\"element?.stock_issue_products[0]?.batch?.batch_number\">{{\n element?.stock_issue_products[0]?.batch?.batch_number }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.stock_issue_products[0]?.batch?.expires_on\">\n Expires {{ element?.stock_issue_products[0]?.batch?.expires_on | date }}\n </small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Measure</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Purchase Price Column -->\n <ng-container matColumnDef=\"purchase_price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Purchase Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.purchase_price | currency }}\n </td>\n </ng-container>\n\n <!-- Total Value Column -->\n <ng-container matColumnDef=\"amount\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Total Value</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.amount | currency }}\n </td>\n </ng-container>\n\n <!-- Particulars Column -->\n <ng-container matColumnDef=\"particulars\">\n <th mat-header-cell *matHeaderCellDef>Particulars</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.particulars }}</td>\n </ng-container>\n\n <!-- Supplier Column -->\n <ng-container matColumnDef=\"supplier\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Supplier</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.supplier?.company_name }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-1\">{{ element?.creator?.name }}</p>\n <small class=\"text-secondary\">{{ element?.created_at | date }}</small>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div *ngIf=\"!element.stock_transfer\" class=\"d-flex gap-1 text-secondary\">\n <app-techlify-icon name=\"view\" size=\"md\"\n [routerLink]=\"['/inventory', 'stock-issues', element?.id, 'view']\"></app-techlify-icon>\n <app-stock-issue-form-button [stockIssue]=\"element\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n <app-stock-issuance-delete-button [stockIssuance]=\"element\"\n (deleted)=\"reload(); listUpdated.emit()\"></app-stock-issuance-delete-button>\n </div>\n\n <span *ngIf=\"element.stock_transfer\" class=\"badge rounded-pill text-bg-secondary\">Stock Transfer</span>\n </td>\n </ng-container>\n\n <!-- Footer Cells for Total Row -->\n <ng-container matColumnDef=\"footer-no\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-product\">\n <td mat-footer-cell *matFooterCellDef><strong>Total</strong></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-sku\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-date\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-location\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-related\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-quantity\">\n <td mat-footer-cell *matFooterCellDef><strong>{{ totalQuantity }}</strong></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-batch\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-measure\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-purchase_price\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-amount\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-particulars\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-supplier\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-creator\">\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"footer-actions\">\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=\"footerColumns\"></tr>\n </table>\n\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: [":host ::ng-deep .mat-mdc-footer-row{position:sticky;bottom:0;background-color:#fff;z-index:10;box-shadow:0 -2px 4px #0000001a}\n"] }]
164
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.StockIssueService }, { type: i3.ActivatedRoute }, { type: i4.TechlifyFeatureService }], propDecorators: { product: [{
165
+ type: Input
166
+ }], issuableType: [{
167
+ type: Input
168
+ }], issuableId: [{
169
+ type: Input
170
+ }], label: [{
171
+ type: Input
172
+ }], showActions: [{
173
+ type: Input
174
+ }], showFilters: [{
175
+ type: Input
176
+ }], listUpdated: [{
177
+ type: Output
178
+ }] } });
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtbGlzdC9zdG9jay1pc3N1ZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3N0b2NrLWlzc3VhbmNlcy9zdG9jay1pc3N1ZS1saXN0L3N0b2NrLWlzc3VlLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBRUwsa0NBQWtDLEVBQ25DLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU81QixNQUFNLE9BQU8sdUJBQXdCLFNBQVEsa0NBQWtDO0lBcUNuRTtJQUNBO0lBQ0E7SUFDQTtJQXZDRCxPQUFPLENBQU07SUFDYixZQUFZLENBQVU7SUFDdEIsVUFBVSxDQUFVO0lBQ3BCLEtBQUssR0FBRyxjQUFjLENBQUM7SUFDdkIsV0FBVyxHQUFZLElBQUksQ0FBQztJQUM1QixXQUFXLEdBQVksSUFBSSxDQUFDO0lBQzNCLFdBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUVuRSxzQkFBc0IsR0FBYTtRQUNqQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxV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QUF2Qix1QkFBdUIsNFJDakJwQyxvdVdBd1FXOzs0RkR2UEUsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHNCQUFzQjtrTEFLdkIsT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb2x1bW5Db25maWcsIFJlcXVlc3RIZWxwZXJTZXJ2aWNlLCBUZWNobGlmeUZlYXR1cmVTZXJ2aWNlLFxuICBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlLCBUaW1lbGluZVZhbHVlXG59IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBTdG9ja0lzc3VlU2VydmljZSB9IGZyb20gJy4uL3N0b2NrLWlzc3VlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc3RvY2staXNzdWUtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9jay1pc3N1ZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3RvY2staXNzdWUtbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9ja0lzc3VlTGlzdENvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwcm9kdWN0OiBhbnk7XG4gIEBJbnB1dCgpIGlzc3VhYmxlVHlwZSE6IHN0cmluZztcbiAgQElucHV0KCkgaXNzdWFibGVJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgbGFiZWwgPSAnU3RvY2sgSXNzdWVzJztcbiAgQElucHV0KCkgc2hvd0FjdGlvbnM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RmlsdGVyczogYm9vbGVhbiA9IHRydWU7XG4gIEBPdXRwdXQoKSBsaXN0VXBkYXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBkZWZhdWx0U2VsZWN0ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtcbiAgICAnbm8nLCAncHJvZHVjdCcsICdza3UnLCAnZGF0ZScsICdxdWFudGl0eScsICdtZWFzdXJlJywgJ2xvY2F0aW9uJywgJ3JlbGF0ZWQnLCAncGFydGljdWxhcnMnLFxuICBdO1xuXG4gIGNvbHVtbkNvbmZpZzogQ29sdW1uQ29uZmlnW10gPSBbXG4gICAgeyBsYWJlbDogJ0NyZWF0b3InLCBkZWY6ICdjcmVhdG9yJywgaXNTZWxlY3RlZDogZmFsc2UsIGlzRWRpdGFibGU6IHRydWUgfSxcbiAgXTtcblxuICBzZWxlY3RlZENvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID0gdGhpcy5jb2x1bW5Db25maWcuZmlsdGVyKGNvbCA9PiBjb2wuaXNTZWxlY3RlZCk7XG5cbiAgZ2V0IGRpc3BsYXllZENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1uczogc3RyaW5nW10gPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoY29sID0+IGNvbC5kZWYpO1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRTZWxlY3RlZENvbHVtbnMuY29uY2F0KC4uLnNlbGVjdGVkQ29sdW1ucywgJ2FjdGlvbnMnKTtcbiAgfVxuXG4gIGdldCB0b3RhbFF1YW50aXR5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzLnJlZHVjZSgoc3VtLCBtb2RlbCkgPT4ge1xuICAgICAgY29uc3QgcHJvZHVjdHMgPSBtb2RlbD8uc3RvY2tfaXNzdWVfcHJvZHVjdHMgPz8gW107XG4gICAgICByZXR1cm4gc3VtICsgcHJvZHVjdHMucmVkdWNlKChwcm9kdWN0U3VtOiBudW1iZXIsIHByb2R1Y3Q6IGFueSkgPT5cbiAgICAgICAgcHJvZHVjdFN1bSArIE51bWJlcihwcm9kdWN0Py5xdWFudGl0eSA/PyAwKSwgMCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXQgZm9vdGVyQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5tYXAoY29sID0+IGBmb290ZXItJHtjb2x9YCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHN0b2NrSXNzdWVTZXJ2aWNlOiBTdG9ja0lzc3VlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGZlYXR1cmVTZXJ2aWNlOiBUZWNobGlmeUZlYXR1cmVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sYXN0UGFnZSA9IDA7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBjYXRlZ29yeV9pZHM6IFsnJ10sXG4gICAgICBkYXRlX2Zyb206IFsnJ10sXG4gICAgICBkYXRlX3RvOiBbJyddLFxuICAgICAgZHVyYXRpb246IFsnJ10sXG4gICAgICBpbXBvcnRfaWQ6IFsnJ10sXG4gICAgICBsb2NhdGlvbl9pZHM6IFsnJ10sXG4gICAgICBtZWFzdXJlX2lkczogWycnXSxcbiAgICAgIHByb2R1Y3RfaWRzOiBbJyddLFxuICAgICAgc2VhcmNoOiBbJyddLFxuICAgICAgc29ydF9ieTogWydkYXRlfGRlc2MnXSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEZlYXR1cmVzKCk7XG4gICAgaWYgKHRoaXMucHJvZHVjdCkge1xuICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgncHJvZHVjdF9pZHMnKT8uc2V0VmFsdWUodGhpcy5wcm9kdWN0Py5pZCk7XG4gICAgICB0aGlzLmRlZmF1bHRTZWxlY3RlZENvbHVtbnMgPSB0aGlzLmRlZmF1bHRTZWxlY3RlZENvbHVtbnMuZmlsdGVyKGMgPT4gYyAhPT0gJ3Byb2R1Y3QnICYmIGMgIT09ICdza3UnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvRm9ybUNoYW5nZXMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUm91dGVDaGFuZ2VzKCk7XG4gIH1cblxuICBsb2FkRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgIHBlclBhZ2U6IHRoaXMucGVyUGFnZSxcbiAgICAgIHdpdGg6IGBjcmVhdG9yLGlzc3VhYmxlLmZpeGVkQXNzZXQsc3RvY2tJc3N1ZVByb2R1Y3RzLnByb2R1Y3Qsc3RvY2tJc3N1ZVByb2R1Y3RzLmxvY2F0aW9uLHN0b2NrSXNzdWVQcm9kdWN0cy5wcm9kdWN0LmNhdGVnb3JpZXMsc3RvY2tUcmFuc2ZlcixzdG9ja0lzc3VlUHJvZHVjdHMuYmF0Y2hgLFxuICAgICAgLi4udGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh0aGlzLmZpbHRlckZvcm0udmFsdWUpLFxuICAgIH07XG4gICAgaWYgKHRoaXMuaXNzdWFibGVJZCAmJiB0aGlzLmlzc3VhYmxlVHlwZSkge1xuICAgICAgcGFyYW1zLmlzc3VhYmxlX2lkcyA9IHRoaXMuaXNzdWFibGVJZDtcbiAgICAgIHBhcmFtcy5pc3N1YWJsZV90eXBlcyA9IHRoaXMuaXNzdWFibGVUeXBlO1xuICAgIH1cbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgdGhpcy5zdG9ja0lzc3VlU2VydmljZS5pbmRleChwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1vZGVscyA9IHRoaXMubW9kZWxzLmNvbmNhdChyZXNwb25zZT8uZGF0YSk7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXNwb25zZT8ubGFzdF9wYWdlO1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICBsZXQgeyBhY3RpdmUsIGRpcmVjdGlvbiB9ID0gc29ydDtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgYWN0aXZlID0gJ2RhdGUnO1xuICAgIH1cbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgZGlyZWN0aW9uID0gJ2Rlc2MnO1xuICAgICAgYWN0aXZlID0gJ2RhdGUnO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdzb3J0X2J5Jykuc2V0VmFsdWUoYWN0aXZlICsgJ3wnICsgZGlyZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybVdpdGhRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXModGhpcy5maWx0ZXJGb3JtLCB7XG4gICAgICBwcm9kdWN0X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgbWVhc3VyZV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGNhdGVnb3J5X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgc3VwcGxpZXJfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBsb2NhdGlvbl9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Gb3JtQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAodGhpcy5maWx0ZXJGb3JtIGFzIEZvcm1Hcm91cCkudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UudXBkYXRlUXVlcnlQYXJhbXMoXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh0aGlzLmZpbHRlckZvcm0udmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUm91dGVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uRHVyYXRpb25DaGFuZ2UodGltZWxpbmVWYWx1ZTogVGltZWxpbmVWYWx1ZSkge1xuICAgIGxldCB7IGRhdGVfdG8sIGRhdGVfZnJvbSB9ID0gdGltZWxpbmVWYWx1ZTtcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgZGF0ZV9mcm9tOiBkYXRlX2Zyb20gPyBtb21lbnQoZGF0ZV9mcm9tKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpIDogXCJcIixcbiAgICAgICAgZGF0ZV90bzogZGF0ZV90byA/IG1vbWVudChkYXRlX3RvKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpIDogXCJcIixcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRGZWF0dXJlcygpIHtcbiAgICBsZXQgaXNCYXRjaEVuYWJsZWQgPSB0aGlzLmZlYXR1cmVTZXJ2aWNlLmlzRmVhdHVyZUV4aXN0cygncHJvZHVjdC1iYXRjaC1udW1iZXJzJyk7XG4gICAgLy8gbm93IHVwZGF0ZSBkaXNwbGF5ZWRDb2x1bW5zIGFjY29yZGluZ2x5XG4gICAgaWYgKGlzQmF0Y2hFbmFibGVkKSB7XG4gICAgICBjb25zdCBxdHlJbmRleCA9IHRoaXMuZGVmYXVsdFNlbGVjdGVkQ29sdW1ucy5pbmRleE9mKCdxdWFudGl0eScpO1xuICAgICAgaWYgKHF0eUluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VsZWN0ZWRDb2x1bW5zLnNwbGljZShxdHlJbmRleCArIDEsIDAsICdiYXRjaCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPG1hdC1jYXJkICpuZ0lmPVwiIXByb2R1Y3RcIiBjbGFzcz1cIm1iLTJcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+e3sgbGFiZWwgfX08L2gzPlxuXG4gICAgICA8YXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uIGljb249XCJhZGRcIiBbaXNzdWFibGVUeXBlXT1cImlzc3VhYmxlVHlwZVwiIFtpc3N1YWJsZUlkXT1cImlzc3VhYmxlSWRcIlxuICAgICAgICAoc2F2ZWQpPVwicmVsb2FkKClcIj48L2FwcC1zdG9jay1pc3N1ZS1mb3JtLWJ1dHRvbj5cblxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93QWN0aW9uc1wiIG1hdFRvb2x0aXA9XCJJbXBvcnRcIiByb3V0ZXJMaW5rPVwiaW1wb3J0XCJcbiAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+XG4gICAgICAgIGZpbGVfdXBsb2FkXG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxhcHAtY29sdW1uLXNlbGVjdG9yICpuZ0lmPVwic2hvd0FjdGlvbnNcIiBtb2RlPVwiaWNvblwiIGNsYXNzPVwibXQtMiBkLXByaW50LW5vbmVcIiBbY29sdW1uQ29uZmlnc109XCJjb2x1bW5Db25maWdcIlxuICAgICAgICBbKHNlbGVjdGVkQ29sdW1ucyldPVwic2VsZWN0ZWRDb2x1bW5zXCI+PC9hcHAtY29sdW1uLXNlbGVjdG9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgKm5nSWY9XCJzaG93RmlsdGVyc1wiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsPlNlYXJjaDwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggcHJvZHVjdHNcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hcIiAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPGFwcC10aW1lbGluZS1maWx0ZXIgYXBwZWFyYW5jZT1cImZpbGxcIiBsYWJlbFRleHQ9XCJEYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25cIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRHVyYXRpb25DaGFuZ2UoJGV2ZW50KVwiIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiIFtkYXRlRnJvbV09XCJmaWx0ZXJGb3JtLnZhbHVlPy5kYXRlX2Zyb21cIlxuICAgICAgICBbZGF0ZVRvXT1cImZpbHRlckZvcm0udmFsdWU/LmRhdGVfdG9cIj48L2FwcC10aW1lbGluZS1maWx0ZXI+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1sYWJlbD5DYXRlZ29yeTwvbWF0LWxhYmVsPlxuICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtY2F0ZWdvcmllc1wiIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5X2lkc1wiIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtbGFiZWw+TWVhc3VyZTwvbWF0LWxhYmVsPlxuICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtbWVhc3VyZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJtZWFzdXJlX2lkc1wiIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtbGFiZWw+TG9jYXRpb248L21hdC1sYWJlbD5cbiAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9pbnZlbnRvcnktbG9jYXRpb25zXCIgZm9ybUNvbnRyb2xOYW1lPVwibG9jYXRpb25faWRzXCIgW211bHRpcGxlXT1cInRydWVcIj5cbiAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9mb3JtPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPlxuXG48bWF0LWNhcmQ+XG4gIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwicHJvZHVjdFwiIGNsYXNzPVwibWItMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gdW5ncm91cCA8L3NwYW4+XG4gICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+U3RvY2sgSXNzdWVzPC9oMz5cblxuICAgICAgPGFwcC1zdG9jay1pc3N1ZS1mb3JtLWJ1dHRvbiBjbGFzcz1cIm10LTJcIiBbcHJvZHVjdF09XCJwcm9kdWN0XCIgaWNvbj1cImFkZFwiXG4gICAgICAgIChzYXZlZCk9XCJyZWxvYWQoKTsgbGlzdFVwZGF0ZWQuZW1pdCgpXCI+PC9hcHAtc3RvY2staXNzdWUtZm9ybS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJwLTBcIj5cbiAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cIm1vZGVsc1wiIGNsYXNzPVwidy0xMDBcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiU3RvY2sgSXNzdWFuY2VzXCIgaW5maW5pdGVTY3JvbGxcbiAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIiBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MFwiIChzY3JvbGxlZCk9XCJvblNjcm9sbCgpXCIgbWF0U29ydFxuICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIj5cbiAgICAgIDwhLS0gIyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5vXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IzwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGluZGV4XCI+e3sgaSArIDEgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gUHJvZHVjdCBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByb2R1Y3RcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+UHJvZHVjdDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMVwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LWRhcmtcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9pbnZlbnRvcnkvcHJvZHVjdHMnLCBlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ucHJvZHVjdD8uaWQsICd2aWV3J11cIj5cbiAgICAgICAgICAgICAge3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3QubmFtZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGFwcC1wcm9kdWN0LWNhdGVnb3J5LWJhZGdlc1xuICAgICAgICAgICAgICBbcHJvZHVjdF09XCJlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ucHJvZHVjdFwiPjwvYXBwLXByb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0tVIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2t1XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlNLVTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3Quc2t1IH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIERhdGUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPkRhdGU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/LmRhdGUgfCBkYXRlIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIExvY2F0aW9uIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibG9jYXRpb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+TG9jYXRpb248L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLW5vbmUgdGV4dC1kYXJrXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2ludmVudG9yeS9sb2NhdGlvbnMnLCBlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ubG9jYXRpb25faWQsICd2aWV3J11cIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5sb2NhdGlvbj8udGl0bGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBSZWxhdGVkIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVsYXRlZFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlJlbGF0ZWQ8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGV4dC1kYXJrXCIgKm5nSWY9XCJlbGVtZW50Py5pc3N1YWJsZVwiIFtyb3V0ZXJMaW5rXT1cIlsnL21haW50ZW5hbmNlcycsIGVsZW1lbnQ/Lmlzc3VhYmxlX2lkLCAndmlldyddXCI+XG4gICAgICAgICAgICBNYWludGVuYW5jZSBmb3Ige3sgZWxlbWVudD8uaXNzdWFibGU/LmZpeGVkX2Fzc2V0Py5uYW1lIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gUXVhbnRpdHkgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJxdWFudGl0eVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5RdWFudGl0eTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnF1YW50aXR5IH19IHt7XG4gICAgICAgICAgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3QubWVhc3VyZT8udGl0bGUgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQmF0Y2ggQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJiYXRjaFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkJhdGNoPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIiAqbmdJZj1cImVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5iYXRjaD8uYmF0Y2hfbnVtYmVyXCI+e3tcbiAgICAgICAgICAgIGVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5iYXRjaD8uYmF0Y2hfbnVtYmVyIH19PC9wPlxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8uYmF0Y2g/LmV4cGlyZXNfb25cIj5cbiAgICAgICAgICAgIEV4cGlyZXMge3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LmJhdGNoPy5leHBpcmVzX29uIHwgZGF0ZSB9fVxuICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJtZWFzdXJlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPk1lYXN1cmU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5wcm9kdWN0Lm1lYXN1cmU/LnRpdGxlIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFB1cmNoYXNlIFByaWNlIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHVyY2hhc2VfcHJpY2VcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+UHVyY2hhc2UgUHJpY2U8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIHt7IGVsZW1lbnQ/LnB1cmNoYXNlX3ByaWNlIHwgY3VycmVuY3kgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFRvdGFsIFZhbHVlIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYW1vdW50XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlRvdGFsIFZhbHVlPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICB7eyBlbGVtZW50Py5hbW91bnQgfCBjdXJyZW5jeSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gUGFydGljdWxhcnMgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwYXJ0aWN1bGFyc1wiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlBhcnRpY3VsYXJzPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ucGFydGljdWxhcnMgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU3VwcGxpZXIgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdXBwbGllclwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5TdXBwbGllcjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3sgZWxlbWVudD8uc3VwcGxpZXI/LmNvbXBhbnlfbmFtZSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQ3JlYXRvciBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNyZWF0b3JcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5DcmVhdG9yPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj57eyBlbGVtZW50Py5jcmVhdG9yPy5uYW1lIH19PC9wPlxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+e3sgZWxlbWVudD8uY3JlYXRlZF9hdCB8IGRhdGUgfX08L3NtYWxsPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5BY3Rpb25zPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWVsZW1lbnQuc3RvY2tfdHJhbnNmZXJcIiBjbGFzcz1cImQtZmxleCBnYXAtMSB0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgPGFwcC10ZWNobGlmeS1pY29uIG5hbWU9XCJ2aWV3XCIgc2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvaW52ZW50b3J5JywgJ3N0b2NrLWlzc3VlcycsIGVsZW1lbnQ/LmlkLCAndmlldyddXCI+PC9hcHAtdGVjaGxpZnktaWNvbj5cbiAgICAgICAgICAgIDxhcHAtc3RvY2staXNzdWUtZm9ybS1idXR0b24gW3N0b2NrSXNzdWVdPVwiZWxlbWVudFwiXG4gICAgICAgICAgICAgIChzYXZlZCk9XCJyZWxvYWQoKTsgbGlzdFVwZGF0ZWQuZW1pdCgpXCI+PC9hcHAtc3RvY2staXNzdWUtZm9ybS1idXR0b24+XG4gICAgICAgICAgICA8YXBwLXN0b2NrLWlzc3VhbmNlLWRlbGV0ZS1idXR0b24gW3N0b2NrSXNzdWFuY2VdPVwiZWxlbWVudFwiXG4gICAgICAgICAgICAgIChkZWxldGVkKT1cInJlbG9hZCgpOyBsaXN0VXBkYXRlZC5lbWl0KClcIj48L2FwcC1zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJlbGVtZW50LnN0b2NrX3RyYW5zZmVyXCIgY2xhc3M9XCJiYWRnZSByb3VuZGVkLXBpbGwgdGV4dC1iZy1zZWNvbmRhcnlcIj5TdG9jayBUcmFuc2Zlcjwvc3Bhbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEZvb3RlciBDZWxscyBmb3IgVG90YWwgUm93IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmb290ZXItbm9cIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZm9vdGVyLXByb2R1Y3RcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48c3Ryb25nPlRvdGFsPC9zdHJvbmc+PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZvb3Rlci1za3VcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZm9vdGVyLWRhdGVcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZm9vdGVyLWxvY2F0aW9uXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZvb3Rlci1yZWxhdGVkXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZvb3Rlci1xdWFudGl0eVwiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjxzdHJvbmc+e3sgdG90YWxRdWFudGl0eSB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmb290ZXItYmF0Y2hcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZm9vdGVyLW1lYXN1cmVcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZm9vdGVyLXB1cmNoYXNlX3ByaWNlXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZvb3Rlci1hbW91bnRcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZm9vdGVyLXBhcnRpY3VsYXJzXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZvb3Rlci1zdXBwbGllclwiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmb290ZXItY3JlYXRvclwiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmb290ZXItYWN0aW9uc1wiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwiZm9vdGVyQ29sdW1uc1wiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiaXNXb3JraW5nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbjwvbWF0LWNhcmQ+Il19
@@ -0,0 +1,67 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { StockIssueListComponent } from './stock-issue-list.component';
4
+ import { StockIssueFormModule } from '../stock-issue-form/stock-issue-form.module';
5
+ import { InfiniteScrollModule } from 'ngx-infinite-scroll';
6
+ import { StockIssuanceDeleteButtonModule } from '../stock-issuance-delete-button/stock-issuance-delete-button.module';
7
+ import { ColumnSelectorModule, MaterialModule, SearchableSelectorModule, TechlifyIconModule, TimelineFilterModule } from 'ngx-techlify-core';
8
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
9
+ import { RouterModule } from '@angular/router';
10
+ import { TechlifyFilterModule } from '../../techlify-filter/techlify-filter.module';
11
+ import { ReactiveFormsModule } from '@angular/forms';
12
+ import { ProductCategoryBadgesComponent } from "../../product/widgets/product-category-badges/product-category-badges.component";
13
+ import * as i0 from "@angular/core";
14
+ export class StockIssueListModule {
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: StockIssueListModule, declarations: [StockIssueListComponent], imports: [CommonModule,
17
+ MaterialModule,
18
+ TechlifyFilterModule,
19
+ StockIssueFormModule,
20
+ InfiniteScrollModule,
21
+ StockIssuanceDeleteButtonModule,
22
+ MatProgressBarModule,
23
+ RouterModule,
24
+ SearchableSelectorModule,
25
+ TimelineFilterModule,
26
+ ReactiveFormsModule,
27
+ ProductCategoryBadgesComponent,
28
+ ColumnSelectorModule,
29
+ TechlifyIconModule], exports: [StockIssueListComponent] });
30
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueListModule, imports: [CommonModule,
31
+ MaterialModule,
32
+ TechlifyFilterModule,
33
+ StockIssueFormModule,
34
+ InfiniteScrollModule,
35
+ StockIssuanceDeleteButtonModule,
36
+ MatProgressBarModule,
37
+ RouterModule,
38
+ SearchableSelectorModule,
39
+ TimelineFilterModule,
40
+ ReactiveFormsModule,
41
+ ColumnSelectorModule,
42
+ TechlifyIconModule] });
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueListModule, decorators: [{
45
+ type: NgModule,
46
+ args: [{
47
+ declarations: [StockIssueListComponent],
48
+ imports: [
49
+ CommonModule,
50
+ MaterialModule,
51
+ TechlifyFilterModule,
52
+ StockIssueFormModule,
53
+ InfiniteScrollModule,
54
+ StockIssuanceDeleteButtonModule,
55
+ MatProgressBarModule,
56
+ RouterModule,
57
+ SearchableSelectorModule,
58
+ TimelineFilterModule,
59
+ ReactiveFormsModule,
60
+ ProductCategoryBadgesComponent,
61
+ ColumnSelectorModule,
62
+ TechlifyIconModule
63
+ ],
64
+ exports: [StockIssueListComponent],
65
+ }]
66
+ }] });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtbGlzdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtbGlzdC9zdG9jay1pc3N1ZS1saXN0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUN0SCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNyQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsOEJBQThCLEVBQy9CLE1BQU0saUZBQWlGLENBQUM7O0FBc0J6RixNQUFNLE9BQU8sb0JBQW9CO3dHQUFwQixvQkFBb0I7eUdBQXBCLG9CQUFvQixpQkFuQmhCLHVCQUF1QixhQUVwQyxZQUFZO1lBQ1osY0FBYztZQUNkLG9CQUFvQjtZQUNwQixvQkFBb0I7WUFDcEIsb0JBQW9CO1lBQ3BCLCtCQUErQjtZQUMvQixvQkFBb0I7WUFDcEIsWUFBWTtZQUNaLHdCQUF3QjtZQUN4QixvQkFBb0I7WUFDcEIsbUJBQW1CO1lBQ25CLDhCQUE4QjtZQUM5QixvQkFBb0I7WUFDcEIsa0JBQWtCLGFBRVYsdUJBQXVCO3lHQUV0QixvQkFBb0IsWUFqQjdCLFlBQVk7WUFDWixjQUFjO1lBQ2Qsb0JBQW9CO1lBQ3BCLG9CQUFvQjtZQUNwQixvQkFBb0I7WUFDcEIsK0JBQStCO1lBQy9CLG9CQUFvQjtZQUNwQixZQUFZO1lBQ1osd0JBQXdCO1lBQ3hCLG9CQUFvQjtZQUNwQixtQkFBbUI7WUFFbkIsb0JBQW9CO1lBQ3BCLGtCQUFrQjs7NEZBSVQsb0JBQW9CO2tCQXBCaEMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDdkMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxvQkFBb0I7d0JBQ3BCLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQiwrQkFBK0I7d0JBQy9CLG9CQUFvQjt3QkFDcEIsWUFBWTt3QkFDWix3QkFBd0I7d0JBQ3hCLG9CQUFvQjt3QkFDcEIsbUJBQW1CO3dCQUNuQiw4QkFBOEI7d0JBQzlCLG9CQUFvQjt3QkFDcEIsa0JBQWtCO3FCQUNuQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztpQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFN0b2NrSXNzdWVMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9zdG9jay1pc3N1ZS1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdG9ja0lzc3VlRm9ybU1vZHVsZSB9IGZyb20gJy4uL3N0b2NrLWlzc3VlLWZvcm0vc3RvY2staXNzdWUtZm9ybS5tb2R1bGUnO1xuaW1wb3J0IHsgSW5maW5pdGVTY3JvbGxNb2R1bGUgfSBmcm9tICduZ3gtaW5maW5pdGUtc2Nyb2xsJztcbmltcG9ydCB7IFN0b2NrSXNzdWFuY2VEZWxldGVCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uL3N0b2NrLWlzc3VhbmNlLWRlbGV0ZS1idXR0b24ubW9kdWxlJztcbmltcG9ydCB7XG4gIENvbHVtblNlbGVjdG9yTW9kdWxlLFxuICBNYXRlcmlhbE1vZHVsZSxcbiAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICBUZWNobGlmeUljb25Nb2R1bGUsXG4gIFRpbWVsaW5lRmlsdGVyTW9kdWxlXG59IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUZWNobGlmeUZpbHRlck1vZHVsZSB9IGZyb20gJy4uLy4uL3RlY2hsaWZ5LWZpbHRlci90ZWNobGlmeS1maWx0ZXIubW9kdWxlJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBQcm9kdWN0Q2F0ZWdvcnlCYWRnZXNDb21wb25lbnRcbn0gZnJvbSBcIi4uLy4uL3Byb2R1Y3Qvd2lkZ2V0cy9wcm9kdWN0LWNhdGVnb3J5LWJhZGdlcy9wcm9kdWN0LWNhdGVnb3J5LWJhZGdlcy5jb21wb25lbnRcIjtcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbU3RvY2tJc3N1ZUxpc3RDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdGVyaWFsTW9kdWxlLFxuICAgIFRlY2hsaWZ5RmlsdGVyTW9kdWxlLFxuICAgIFN0b2NrSXNzdWVGb3JtTW9kdWxlLFxuICAgIEluZmluaXRlU2Nyb2xsTW9kdWxlLFxuICAgIFN0b2NrSXNzdWFuY2VEZWxldGVCdXR0b25Nb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIFNlYXJjaGFibGVTZWxlY3Rvck1vZHVsZSxcbiAgICBUaW1lbGluZUZpbHRlck1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFByb2R1Y3RDYXRlZ29yeUJhZGdlc0NvbXBvbmVudCxcbiAgICBDb2x1bW5TZWxlY3Rvck1vZHVsZSxcbiAgICBUZWNobGlmeUljb25Nb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1N0b2NrSXNzdWVMaXN0Q29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgU3RvY2tJc3N1ZUxpc3RNb2R1bGUgeyB9XG4iXX0=
@@ -0,0 +1,36 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import { StockIssueListComponent } from './stock-issue-list/stock-issue-list.component';
4
+ import { StockIssueImportPageComponent } from './stock-issue-import-page/stock-issue-import-page.component';
5
+ import { AuthenticationGuard } from 'ngx-techlify-core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/router";
8
+ const routes = [
9
+ {
10
+ path: '',
11
+ component: StockIssueListComponent,
12
+ },
13
+ {
14
+ path: 'import',
15
+ component: StockIssueImportPageComponent,
16
+ canLoad: [AuthenticationGuard]
17
+ },
18
+ {
19
+ path: ':id/view',
20
+ loadComponent: () => import('./stock-issue-view/stock-issue-view.component').then(m => m.StockIssueViewComponent),
21
+ canLoad: [AuthenticationGuard]
22
+ }
23
+ ];
24
+ export class StockIssueRoutingModule {
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
26
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: StockIssueRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] });
27
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] });
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueRoutingModule, decorators: [{
30
+ type: NgModule,
31
+ args: [{
32
+ imports: [RouterModule.forChild(routes)],
33
+ exports: [RouterModule],
34
+ }]
35
+ }] });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtcm91dGluZy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtcm91dGluZy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDNUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUV4RCxNQUFNLE1BQU0sR0FBVztJQUNyQjtRQUNFLElBQUksRUFBRSxFQUFFO1FBQ1IsU0FBUyxFQUFFLHVCQUF1QjtLQUNuQztJQUNEO1FBQ0UsSUFBSSxFQUFFLFFBQVE7UUFDZCxTQUFTLEVBQUUsNkJBQTZCO1FBQ3hDLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO0tBQy9CO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsVUFBVTtRQUNoQixhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLCtDQUErQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDO1FBQ2pILE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO0tBQy9CO0NBQ0YsQ0FBQztBQU1GLE1BQU0sT0FBTyx1QkFBdUI7d0dBQXZCLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLHdDQUZ4QixZQUFZO3lHQUVYLHVCQUF1QixZQUh4QixZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUM3QixZQUFZOzs0RkFFWCx1QkFBdUI7a0JBSm5DLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9ja0lzc3VlTGlzdENvbXBvbmVudCB9IGZyb20gJy4vc3RvY2staXNzdWUtbGlzdC9zdG9jay1pc3N1ZS1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdG9ja0lzc3VlSW1wb3J0UGFnZUNvbXBvbmVudCB9IGZyb20gJy4vc3RvY2staXNzdWUtaW1wb3J0LXBhZ2Uvc3RvY2staXNzdWUtaW1wb3J0LXBhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uR3VhcmQgfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5cbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICB7XG4gICAgcGF0aDogJycsXG4gICAgY29tcG9uZW50OiBTdG9ja0lzc3VlTGlzdENvbXBvbmVudCxcbiAgfSxcbiAge1xuICAgIHBhdGg6ICdpbXBvcnQnLFxuICAgIGNvbXBvbmVudDogU3RvY2tJc3N1ZUltcG9ydFBhZ2VDb21wb25lbnQsXG4gICAgY2FuTG9hZDogW0F1dGhlbnRpY2F0aW9uR3VhcmRdXG4gIH0sXG4gIHtcbiAgICBwYXRoOiAnOmlkL3ZpZXcnLFxuICAgIGxvYWRDb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9zdG9jay1pc3N1ZS12aWV3L3N0b2NrLWlzc3VlLXZpZXcuY29tcG9uZW50JykudGhlbihtID0+IG0uU3RvY2tJc3N1ZVZpZXdDb21wb25lbnQpLFxuICAgIGNhbkxvYWQ6IFtBdXRoZW50aWNhdGlvbkd1YXJkXVxuICB9XG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbUm91dGVyTW9kdWxlLmZvckNoaWxkKHJvdXRlcyldLFxuICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RvY2tJc3N1ZVJvdXRpbmdNb2R1bGUgeyB9XG5cbiJdfQ==
@@ -0,0 +1,68 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { RouterLink } from '@angular/router';
4
+ import { MaterialModule } from '../../material.module';
5
+ import { EntityFilesViewAllModule, NoteModule, TechlifyFeatureModule } from 'ngx-techlify-core';
6
+ import { StockIssueFormModule } from '../stock-issue-form/stock-issue-form.module';
7
+ import { StockIssuanceDeleteButtonModule } from '../stock-issuance-delete-button/stock-issuance-delete-button.module';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/router";
10
+ import * as i2 from "../stock-issue.service";
11
+ import * as i3 from "@angular/common";
12
+ import * as i4 from "@angular/material/card";
13
+ import * as i5 from "@angular/material/progress-bar";
14
+ import * as i6 from "../stock-issue-form/stock-issue-form-button/stock-issue-form-button.component";
15
+ import * as i7 from "../stock-issuance-delete-button/stock-issuance-delete-button.component";
16
+ import * as i8 from "ngx-techlify-core";
17
+ export class StockIssueViewComponent {
18
+ activatedRoute;
19
+ service;
20
+ location;
21
+ id;
22
+ isLoading;
23
+ stockIssue;
24
+ constructor(activatedRoute, service, location) {
25
+ this.activatedRoute = activatedRoute;
26
+ this.service = service;
27
+ this.location = location;
28
+ }
29
+ ngOnInit() {
30
+ this.activatedRoute.params.subscribe(params => {
31
+ this.id = parseInt(params['id']);
32
+ if (this.id) {
33
+ this.loadData();
34
+ }
35
+ });
36
+ }
37
+ loadData() {
38
+ this.isLoading = true;
39
+ this.service.show(this.id).subscribe({
40
+ next: (response) => {
41
+ this.stockIssue = response?.item;
42
+ this.isLoading = false;
43
+ },
44
+ error: () => {
45
+ this.isLoading = false;
46
+ }
47
+ });
48
+ }
49
+ redirectBack() {
50
+ this.location.back();
51
+ }
52
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueViewComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.StockIssueService }, { token: i3.Location }], target: i0.ɵɵFactoryTarget.Component });
53
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StockIssueViewComponent, isStandalone: true, selector: "app-stock-issue-view", ngImport: i0, template: "<mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n\n<div *ngIf=\"stockIssue\" class=\"d-flex flex-column justify-content-start gap-2\">\n <mat-card>\n <mat-card-content>\n <h3 class=\"mb-0\">Stock Issue for {{ stockIssue?.stock_issue_products[0]?.product?.name }}</h3>\n </mat-card-content>\n </mat-card>\n <div class=\"d-flex justify-content-start align-items-start gap-2\">\n <div class=\"d-flex flex-column gap-2\" style=\"width: 350px\">\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 <span class=\"material-symbols-outlined\"> ungroup </span>\n <strong class=\"mb-0 text-dark\">Information</strong>\n </div>\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <app-stock-issue-form-button [stockIssue]=\"stockIssue\" (saved)=\"loadData()\">\n </app-stock-issue-form-button>\n <app-stock-issuance-delete-button [stockIssuance]=\"stockIssue\" (deleted)=\"redirectBack()\">\n </app-stock-issuance-delete-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"d-flex flex-column justify-content-start gap-2 mt-3\">\n <!-- Product & SKU / Date -->\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex flex-column gap-0\">\n <a class=\"text-decoration-none text-black\"\n [routerLink]=\"['/inventory/products', stockIssue?.stock_issue_products[0]?.product?.id, 'view']\">\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.product?.name }}</p>\n </a>\n <small *ngIf=\"stockIssue?.stock_issue_products[0]?.product?.sku\">{{\n stockIssue?.stock_issue_products[0]?.product?.sku }}</small>\n </div>\n <div class=\"d-flex flex-column justify-content-end gap-0\">\n <small *ngIf=\"stockIssue?.date\">{{ stockIssue?.date | date }}</small>\n <ng-container *ngIf=\"stockIssue?.stock_issue_products[0]?.batch?.expires_on\">\n <small techlifyFeatureEnabled=\"product-batch-numbers\">\n Expires on {{ stockIssue?.stock_issue_products[0]?.batch?.expires_on | date }}\n </small>\n </ng-container>\n </div>\n </div>\n\n <!-- Quantity & Location -->\n <div class=\"row\">\n <div class=\"col-6\" *ngIf=\"stockIssue?.stock_issue_products[0]?.quantity\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Quantity</small>\n <div class=\"d-flex gap-1\">\n <h3 class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.quantity }}</h3>\n <small class=\"text-secondary\">{{\n stockIssue?.stock_issue_products[0]?.product?.measure?.title\n }}</small>\n </div>\n </div>\n </div>\n\n <div class=\"col-6\" *ngIf=\"stockIssue?.stock_issue_products[0]?.location\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Location</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.location?.title }}</p>\n </div>\n </div>\n </div>\n\n <!-- Batch & Expires On (if feature enabled) -->\n <ng-container *ngIf=\"stockIssue?.stock_issue_products[0]?.batch\">\n <div class=\"row\" techlifyFeatureEnabled=\"product-batch-numbers\">\n <div class=\"col-6\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Batch</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.batch?.batch_number }}</p>\n </div>\n </div>\n <div class=\"col-6\" *ngIf=\"stockIssue?.stock_issue_products[0]?.batch?.expires_on\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Expires On</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.batch?.expires_on | date }}\n </p>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Particulars -->\n <div class=\"row\" *ngIf=\"stockIssue?.stock_issue_products[0]?.particulars\">\n <div class=\"col-12\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Particulars</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.particulars }}</p>\n </div>\n </div>\n </div>\n\n <!-- Creator -->\n <div class=\"row\" *ngIf=\"stockIssue?.creator\">\n <div class=\"col-12\">\n <small class=\"mb-0\">\n <span class=\"text-secondary\">Created By</span> {{ stockIssue?.creator?.name }}\n <span class=\"text-secondary\">On</span> {{ stockIssue?.created_at | date }}\n </small>\n </div>\n </div>\n </mat-card-content>\n </mat-card>\n\n <app-note-list labelText=\"Notes\" viewMode=\"timeline\" modelType=\"StockIssue\"\n [relatedModelId]=\"stockIssue?.id\"></app-note-list>\n </div>\n\n <div style=\"width: calc(100% - 350px - 0.5rem)\">\n <app-entity-files-view-all title=\"Documents\" [entityId]=\"stockIssue?.id\" entityType=\"StockIssue\"\n viewMode=\"timeline\">\n </app-entity-files-view-all>\n </div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "ngmodule", type: MaterialModule }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: StockIssueFormModule }, { kind: "component", type: i6.StockIssueFormButtonComponent, selector: "app-stock-issue-form-button", inputs: ["product", "stockIssueProduct", "stockIssue", "icon", "issuableType", "issuableId"], outputs: ["saved"] }, { kind: "ngmodule", type: StockIssuanceDeleteButtonModule }, { kind: "component", type: i7.StockIssuanceDeleteButtonComponent, selector: "app-stock-issuance-delete-button", inputs: ["stockIssuance"], outputs: ["deleted"] }, { kind: "ngmodule", type: NoteModule }, { kind: "component", type: i8.NoteListComponent, selector: "app-note-list", inputs: ["relatedModelId", "modelType", "readonly", "labelText", "commentsView", "viewMode"] }, { kind: "ngmodule", type: EntityFilesViewAllModule }, { kind: "component", type: i8.EntityFilesViewAllComponent, selector: "app-entity-files-view-all", inputs: ["entityId", "entityType", "viewOnly", "removeSearch", "hideTitleAndDetails", "displayMode", "allowMultipleFiles", "allowBulkUpdate", "viewMode", "fileDropperHeight", "isShowDragDropSection", "useTechlifyTags", "techlifyTagCategories", "techlifyTagConfig", "title", "permission"] }, { kind: "ngmodule", type: TechlifyFeatureModule }, { kind: "directive", type: i8.TechlifyFeatureEnabledDirective, selector: "[techlifyFeatureEnabled]", inputs: ["techlifyFeatureEnabled"] }], preserveWhitespaces: true });
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueViewComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: 'app-stock-issue-view', standalone: true, imports: [
58
+ CommonModule,
59
+ MaterialModule,
60
+ RouterLink,
61
+ StockIssueFormModule,
62
+ StockIssuanceDeleteButtonModule,
63
+ NoteModule,
64
+ EntityFilesViewAllModule,
65
+ TechlifyFeatureModule,
66
+ ], template: "<mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n\n<div *ngIf=\"stockIssue\" class=\"d-flex flex-column justify-content-start gap-2\">\n <mat-card>\n <mat-card-content>\n <h3 class=\"mb-0\">Stock Issue for {{ stockIssue?.stock_issue_products[0]?.product?.name }}</h3>\n </mat-card-content>\n </mat-card>\n <div class=\"d-flex justify-content-start align-items-start gap-2\">\n <div class=\"d-flex flex-column gap-2\" style=\"width: 350px\">\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 <span class=\"material-symbols-outlined\"> ungroup </span>\n <strong class=\"mb-0 text-dark\">Information</strong>\n </div>\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <app-stock-issue-form-button [stockIssue]=\"stockIssue\" (saved)=\"loadData()\">\n </app-stock-issue-form-button>\n <app-stock-issuance-delete-button [stockIssuance]=\"stockIssue\" (deleted)=\"redirectBack()\">\n </app-stock-issuance-delete-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"d-flex flex-column justify-content-start gap-2 mt-3\">\n <!-- Product & SKU / Date -->\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex flex-column gap-0\">\n <a class=\"text-decoration-none text-black\"\n [routerLink]=\"['/inventory/products', stockIssue?.stock_issue_products[0]?.product?.id, 'view']\">\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.product?.name }}</p>\n </a>\n <small *ngIf=\"stockIssue?.stock_issue_products[0]?.product?.sku\">{{\n stockIssue?.stock_issue_products[0]?.product?.sku }}</small>\n </div>\n <div class=\"d-flex flex-column justify-content-end gap-0\">\n <small *ngIf=\"stockIssue?.date\">{{ stockIssue?.date | date }}</small>\n <ng-container *ngIf=\"stockIssue?.stock_issue_products[0]?.batch?.expires_on\">\n <small techlifyFeatureEnabled=\"product-batch-numbers\">\n Expires on {{ stockIssue?.stock_issue_products[0]?.batch?.expires_on | date }}\n </small>\n </ng-container>\n </div>\n </div>\n\n <!-- Quantity & Location -->\n <div class=\"row\">\n <div class=\"col-6\" *ngIf=\"stockIssue?.stock_issue_products[0]?.quantity\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Quantity</small>\n <div class=\"d-flex gap-1\">\n <h3 class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.quantity }}</h3>\n <small class=\"text-secondary\">{{\n stockIssue?.stock_issue_products[0]?.product?.measure?.title\n }}</small>\n </div>\n </div>\n </div>\n\n <div class=\"col-6\" *ngIf=\"stockIssue?.stock_issue_products[0]?.location\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Location</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.location?.title }}</p>\n </div>\n </div>\n </div>\n\n <!-- Batch & Expires On (if feature enabled) -->\n <ng-container *ngIf=\"stockIssue?.stock_issue_products[0]?.batch\">\n <div class=\"row\" techlifyFeatureEnabled=\"product-batch-numbers\">\n <div class=\"col-6\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Batch</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.batch?.batch_number }}</p>\n </div>\n </div>\n <div class=\"col-6\" *ngIf=\"stockIssue?.stock_issue_products[0]?.batch?.expires_on\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Expires On</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.batch?.expires_on | date }}\n </p>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Particulars -->\n <div class=\"row\" *ngIf=\"stockIssue?.stock_issue_products[0]?.particulars\">\n <div class=\"col-12\">\n <div class=\"d-flex flex-column gap-0\">\n <small class=\"text-secondary\">Particulars</small>\n <p class=\"mb-0\">{{ stockIssue?.stock_issue_products[0]?.particulars }}</p>\n </div>\n </div>\n </div>\n\n <!-- Creator -->\n <div class=\"row\" *ngIf=\"stockIssue?.creator\">\n <div class=\"col-12\">\n <small class=\"mb-0\">\n <span class=\"text-secondary\">Created By</span> {{ stockIssue?.creator?.name }}\n <span class=\"text-secondary\">On</span> {{ stockIssue?.created_at | date }}\n </small>\n </div>\n </div>\n </mat-card-content>\n </mat-card>\n\n <app-note-list labelText=\"Notes\" viewMode=\"timeline\" modelType=\"StockIssue\"\n [relatedModelId]=\"stockIssue?.id\"></app-note-list>\n </div>\n\n <div style=\"width: calc(100% - 350px - 0.5rem)\">\n <app-entity-files-view-all title=\"Documents\" [entityId]=\"stockIssue?.id\" entityType=\"StockIssue\"\n viewMode=\"timeline\">\n </app-entity-files-view-all>\n </div>\n </div>\n</div>" }]
67
+ }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.StockIssueService }, { type: i3.Location }] });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtdmlldy9zdG9jay1pc3N1ZS12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3N0b2NrLWlzc3VhbmNlcy9zdG9jay1pc3N1ZS12aWV3L3N0b2NrLWlzc3VlLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFrQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHFFQUFxRSxDQUFDOzs7Ozs7Ozs7O0FBa0J0SCxNQUFNLE9BQU8sdUJBQXVCO0lBT3BCO0lBQ0E7SUFDQTtJQVBaLEVBQUUsQ0FBVTtJQUNaLFNBQVMsQ0FBVztJQUNwQixVQUFVLENBQU87SUFFakIsWUFDWSxjQUE4QixFQUM5QixPQUEwQixFQUMxQixRQUFrQjtRQUZsQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUMxQixDQUFDO0lBRUwsUUFBUTtRQUNKLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2pDLElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsWUFBWTtRQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQzt3R0FwQ1EsdUJBQXVCOzRGQUF2Qix1QkFBdUIsZ0ZDekJwQyxzL05BcUhNLHlERHRHRSxZQUFZLHFMQUNaLGNBQWMscVpBQ2QsVUFBVSxtT0FDVixvQkFBb0Isd1BBQ3BCLCtCQUErQixpTUFDL0IsVUFBVSwwTUFDVix3QkFBd0IsbWFBQ3hCLHFCQUFxQjs7NEZBR2hCLHVCQUF1QjtrQkFoQm5DLFNBQVM7K0JBQ0ksc0JBQXNCLGNBR3BCLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixvQkFBb0I7d0JBQ3BCLCtCQUErQjt3QkFDL0IsVUFBVTt3QkFDVix3QkFBd0I7d0JBQ3hCLHFCQUFxQjtxQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNYXRlcmlhbE1vZHVsZSB9IGZyb20gJy4uLy4uL21hdGVyaWFsLm1vZHVsZSc7XG5pbXBvcnQgeyBTdG9ja0lzc3VlU2VydmljZSB9IGZyb20gJy4uL3N0b2NrLWlzc3VlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5RmlsZXNWaWV3QWxsTW9kdWxlLCBOb3RlTW9kdWxlLCBUZWNobGlmeUZlYXR1cmVNb2R1bGUgfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBTdG9ja0lzc3VlRm9ybU1vZHVsZSB9IGZyb20gJy4uL3N0b2NrLWlzc3VlLWZvcm0vc3RvY2staXNzdWUtZm9ybS5tb2R1bGUnO1xuaW1wb3J0IHsgU3RvY2tJc3N1YW5jZURlbGV0ZUJ1dHRvbk1vZHVsZSB9IGZyb20gJy4uL3N0b2NrLWlzc3VhbmNlLWRlbGV0ZS1idXR0b24vc3RvY2staXNzdWFuY2UtZGVsZXRlLWJ1dHRvbi5tb2R1bGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1zdG9jay1pc3N1ZS12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3RvY2staXNzdWUtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL3N0b2NrLWlzc3VlLXZpZXcuY29tcG9uZW50LmNzcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0ZXJpYWxNb2R1bGUsXG4gICAgICAgIFJvdXRlckxpbmssXG4gICAgICAgIFN0b2NrSXNzdWVGb3JtTW9kdWxlLFxuICAgICAgICBTdG9ja0lzc3VhbmNlRGVsZXRlQnV0dG9uTW9kdWxlLFxuICAgICAgICBOb3RlTW9kdWxlLFxuICAgICAgICBFbnRpdHlGaWxlc1ZpZXdBbGxNb2R1bGUsXG4gICAgICAgIFRlY2hsaWZ5RmVhdHVyZU1vZHVsZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9ja0lzc3VlVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBpZCE6IG51bWJlcjtcbiAgICBpc0xvYWRpbmchOiBib29sZWFuO1xuICAgIHN0b2NrSXNzdWUhOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgc2VydmljZTogU3RvY2tJc3N1ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uXG4gICAgKSB7IH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSBwYXJzZUludChwYXJhbXNbJ2lkJ10pO1xuICAgICAgICAgICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWREYXRhKCkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VydmljZS5zaG93KHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvY2tJc3N1ZSA9IHJlc3BvbnNlPy5pdGVtO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWRpcmVjdEJhY2soKSB7XG4gICAgICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICAgIH1cbn1cbiIsIjxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj48L21hdC1wcm9ncmVzcy1iYXI+XG5cbjxkaXYgKm5nSWY9XCJzdG9ja0lzc3VlXCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LXN0YXJ0IGdhcC0yXCI+XG4gICAgPG1hdC1jYXJkPlxuICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDxoMyBjbGFzcz1cIm1iLTBcIj5TdG9jayBJc3N1ZSBmb3Ige3sgc3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3Q/Lm5hbWUgfX08L2gzPlxuICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPC9tYXQtY2FyZD5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yXCIgc3R5bGU9XCJ3aWR0aDogMzUwcHhcIj5cbiAgICAgICAgICAgIDxtYXQtY2FyZD5cbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gdW5ncm91cCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPVwibWItMCB0ZXh0LWRhcmtcIj5JbmZvcm1hdGlvbjwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uIFtzdG9ja0lzc3VlXT1cInN0b2NrSXNzdWVcIiAoc2F2ZWQpPVwibG9hZERhdGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtc3RvY2staXNzdWUtZm9ybS1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXN0b2NrLWlzc3VhbmNlLWRlbGV0ZS1idXR0b24gW3N0b2NrSXNzdWFuY2VdPVwic3RvY2tJc3N1ZVwiIChkZWxldGVkKT1cInJlZGlyZWN0QmFjaygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LXN0YXJ0IGdhcC0yIG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm9kdWN0ICYgU0tVIC8gRGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi1ub25lIHRleHQtYmxhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9pbnZlbnRvcnkvcHJvZHVjdHMnLCBzdG9ja0lzc3VlPy5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ucHJvZHVjdD8uaWQsICd2aWV3J11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgc3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3Q/Lm5hbWUgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInN0b2NrSXNzdWU/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5wcm9kdWN0Py5za3VcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9ja0lzc3VlPy5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ucHJvZHVjdD8uc2t1IH19PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwic3RvY2tJc3N1ZT8uZGF0ZVwiPnt7IHN0b2NrSXNzdWU/LmRhdGUgfCBkYXRlIH19PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LmJhdGNoPy5leHBpcmVzX29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCB0ZWNobGlmeUZlYXR1cmVFbmFibGVkPVwicHJvZHVjdC1iYXRjaC1udW1iZXJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBpcmVzIG9uIHt7IHN0b2NrSXNzdWU/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5iYXRjaD8uZXhwaXJlc19vbiB8IGRhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFF1YW50aXR5ICYgTG9jYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiICpuZ0lmPVwic3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnF1YW50aXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPlF1YW50aXR5PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibWItMFwiPnt7IHN0b2NrSXNzdWU/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5xdWFudGl0eSB9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3Q/Lm1lYXN1cmU/LnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIiAqbmdJZj1cInN0b2NrSXNzdWU/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5sb2NhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5Mb2NhdGlvbjwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IHN0b2NrSXNzdWU/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5sb2NhdGlvbj8udGl0bGUgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBCYXRjaCAmIEV4cGlyZXMgT24gKGlmIGZlYXR1cmUgZW5hYmxlZCkgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdG9ja0lzc3VlPy5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8uYmF0Y2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiB0ZWNobGlmeUZlYXR1cmVFbmFibGVkPVwicHJvZHVjdC1iYXRjaC1udW1iZXJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+QmF0Y2g8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgc3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LmJhdGNoPy5iYXRjaF9udW1iZXIgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiICpuZ0lmPVwic3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LmJhdGNoPy5leHBpcmVzX29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+RXhwaXJlcyBPbjwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57eyBzdG9ja0lzc3VlPy5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8uYmF0Y2g/LmV4cGlyZXNfb24gfCBkYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGFydGljdWxhcnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cInN0b2NrSXNzdWU/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5wYXJ0aWN1bGFyc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5QYXJ0aWN1bGFyczwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IHN0b2NrSXNzdWU/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5wYXJ0aWN1bGFycyB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIENyZWF0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cInN0b2NrSXNzdWU/LmNyZWF0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5DcmVhdGVkIEJ5PC9zcGFuPiB7eyBzdG9ja0lzc3VlPy5jcmVhdG9yPy5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5Pbjwvc3Bhbj4ge3sgc3RvY2tJc3N1ZT8uY3JlYXRlZF9hdCB8IGRhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxhcHAtbm90ZS1saXN0IGxhYmVsVGV4dD1cIk5vdGVzXCIgdmlld01vZGU9XCJ0aW1lbGluZVwiIG1vZGVsVHlwZT1cIlN0b2NrSXNzdWVcIlxuICAgICAgICAgICAgICAgIFtyZWxhdGVkTW9kZWxJZF09XCJzdG9ja0lzc3VlPy5pZFwiPjwvYXBwLW5vdGUtbGlzdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiBjYWxjKDEwMCUgLSAzNTBweCAtIDAuNXJlbSlcIj5cbiAgICAgICAgICAgIDxhcHAtZW50aXR5LWZpbGVzLXZpZXctYWxsIHRpdGxlPVwiRG9jdW1lbnRzXCIgW2VudGl0eUlkXT1cInN0b2NrSXNzdWU/LmlkXCIgZW50aXR5VHlwZT1cIlN0b2NrSXNzdWVcIlxuICAgICAgICAgICAgICAgIHZpZXdNb2RlPVwidGltZWxpbmVcIj5cbiAgICAgICAgICAgIDwvYXBwLWVudGl0eS1maWxlcy12aWV3LWFsbD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=