techlify-inventory-common 18.36.1 → 18.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/esm2022/lib/inventory-common/inventory-common-routing.module.mjs +2 -2
  2. package/esm2022/lib/inventory-common/product/product-quick-search/product-quick-search.component.mjs +17 -36
  3. package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +4 -4
  4. package/esm2022/lib/inventory-common/product/product.module.mjs +7 -7
  5. package/esm2022/lib/inventory-common/stock-issue/stock-issue-form/stock-issue-form.component.mjs +165 -0
  6. package/esm2022/lib/inventory-common/stock-issue/stock-issue-import-page/stock-issue-import-page.component.mjs +59 -0
  7. package/esm2022/lib/inventory-common/stock-issue/stock-issue-list/stock-issue-list.component.mjs +140 -0
  8. package/esm2022/lib/inventory-common/stock-issue/stock-issue-page/stock-issue-page.component.mjs +96 -0
  9. package/esm2022/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-page/stock-issue-page.module.mjs +2 -6
  10. package/esm2022/lib/inventory-common/stock-issue/stock-issue-product-form/stock-issue-product-form-button/stock-issue-product-form-button.component.mjs +35 -0
  11. package/esm2022/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-product-form/stock-issue-product-form.component.mjs +1 -1
  12. package/esm2022/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-product.service.mjs +1 -1
  13. package/esm2022/lib/inventory-common/stock-issue/stock-issue-products-list/stock-issue-products-list.component.mjs +138 -0
  14. package/esm2022/lib/inventory-common/stock-issue/stock-issue-routing.module.mjs +46 -0
  15. package/esm2022/lib/inventory-common/stock-issue/stock-issue-simple-form/stock-issue-form-button/stock-issue-form-button.component.mjs +48 -0
  16. package/esm2022/lib/inventory-common/stock-issue/stock-issue-simple-form/stock-issue-form.module.mjs +43 -0
  17. package/esm2022/lib/inventory-common/stock-issue/stock-issue-simple-form/stock-issue-simple-form/stock-issue-simple-form.component.mjs +201 -0
  18. package/esm2022/lib/inventory-common/stock-issue/stock-issue-view/stock-issue-view.component.mjs +66 -0
  19. package/esm2022/lib/inventory-common/stock-issue/stock-issue.module.mjs +51 -0
  20. package/esm2022/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue.service.mjs +1 -1
  21. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.component.mjs +221 -0
  22. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-list/stock-receipt-list.component.mjs +4 -4
  23. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-product-list/stock-receipt-product-list.component.mjs +3 -3
  24. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-simple-form/stock-receipt-form-button/stock-receipt-form-button.component.mjs +42 -0
  25. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-simple-form/stock-receipt-simple-form/stock-receipt-simple-form.component.mjs +180 -0
  26. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-simple-form/stock-receipt-simple-form.module.mjs +51 -0
  27. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-view/stock-receipt-view.component.mjs +4 -5
  28. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-page/stock-receipts-page.component.mjs +3 -3
  29. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-routing.module.mjs +6 -6
  30. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +6 -11
  31. package/esm2022/lib/inventory-common/supplier/supplier.module.mjs +8 -9
  32. package/esm2022/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.mjs +3 -4
  33. package/esm2022/public-api.mjs +13 -14
  34. package/fesm2022/{techlify-inventory-common-category.module-qyYKbe_g.mjs → techlify-inventory-common-category.module-CJbYoRGj.mjs} +4 -4
  35. package/fesm2022/{techlify-inventory-common-category.module-qyYKbe_g.mjs.map → techlify-inventory-common-category.module-CJbYoRGj.mjs.map} +1 -1
  36. package/fesm2022/{techlify-inventory-common-measure.module-Azgdcpqu.mjs → techlify-inventory-common-measure.module-D8oqfZTV.mjs} +4 -4
  37. package/fesm2022/{techlify-inventory-common-measure.module-Azgdcpqu.mjs.map → techlify-inventory-common-measure.module-D8oqfZTV.mjs.map} +1 -1
  38. package/fesm2022/{techlify-inventory-common-purchase-order-view.component-tSf0_Lj_.mjs → techlify-inventory-common-purchase-order-view.component-BDuk0Xek.mjs} +4 -4
  39. package/fesm2022/{techlify-inventory-common-purchase-order-view.component-tSf0_Lj_.mjs.map → techlify-inventory-common-purchase-order-view.component-BDuk0Xek.mjs.map} +1 -1
  40. package/fesm2022/techlify-inventory-common-stock-issue-form.component-B0-TBlZL.mjs +164 -0
  41. package/fesm2022/techlify-inventory-common-stock-issue-form.component-B0-TBlZL.mjs.map +1 -0
  42. package/fesm2022/techlify-inventory-common-stock-issue-view.component-DJIQ6dVF.mjs +66 -0
  43. package/fesm2022/techlify-inventory-common-stock-issue-view.component-DJIQ6dVF.mjs.map +1 -0
  44. package/fesm2022/{techlify-inventory-common-techlify-inventory-common-CqakmnCI.mjs → techlify-inventory-common-techlify-inventory-common-CQSzjNhk.mjs} +141 -300
  45. package/fesm2022/techlify-inventory-common-techlify-inventory-common-CQSzjNhk.mjs.map +1 -0
  46. package/fesm2022/techlify-inventory-common.mjs +1 -1
  47. package/lib/inventory-common/product/product-view-page/product-view-page.component.d.ts +1 -1
  48. package/lib/inventory-common/product/product.module.d.ts +4 -4
  49. package/lib/inventory-common/{stock-issuances/stock-issue-batch-form/stock-issue-batch-form.component.d.ts → stock-issue/stock-issue-form/stock-issue-form.component.d.ts} +6 -4
  50. package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-page/stock-issue-page.module.d.ts +8 -9
  51. package/lib/inventory-common/{stock-issuances/stock-issue-form → stock-issue/stock-issue-simple-form}/stock-issue-form.module.d.ts +2 -2
  52. package/lib/inventory-common/{stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.d.ts → stock-issue/stock-issue-simple-form/stock-issue-simple-form/stock-issue-simple-form.component.d.ts} +3 -3
  53. package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-view/stock-issue-view.component.d.ts +1 -1
  54. package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue.module.d.ts +3 -3
  55. package/lib/inventory-common/stock-receipts/{stock-receipt-batch-form/stock-receipt-batch-form.component.d.ts → stock-receipt-form/stock-receipt-form.component.d.ts} +6 -4
  56. package/lib/inventory-common/stock-receipts/{stock-receipt-form/stock-receipt-form/stock-receipt-form.component.d.ts → stock-receipt-simple-form/stock-receipt-simple-form/stock-receipt-simple-form.component.d.ts} +1 -1
  57. package/lib/inventory-common/stock-receipts/stock-receipt-simple-form/stock-receipt-simple-form.module.d.ts +15 -0
  58. package/lib/inventory-common/stock-receipts/stock-receipt-view/stock-receipt-view.component.d.ts +2 -2
  59. package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +17 -18
  60. package/lib/inventory-common/supplier/supplier.module.d.ts +6 -7
  61. package/package.json +5 -2
  62. package/public-api.d.ts +12 -13
  63. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.mjs +0 -47
  64. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.mjs +0 -19
  65. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-batch-form/stock-issue-batch-form.component.mjs +0 -163
  66. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.mjs +0 -201
  67. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.mjs +0 -48
  68. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.mjs +0 -43
  69. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-import-page/stock-issue-import-page.component.mjs +0 -59
  70. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.mjs +0 -141
  71. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-page/stock-issue-page.component.mjs +0 -96
  72. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-product-form/stock-issue-product-form-button/stock-issue-product-form-button.component.mjs +0 -35
  73. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-products-list/stock-issue-products-list.component.mjs +0 -138
  74. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-routing.module.mjs +0 -46
  75. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-view/stock-issue-view.component.mjs +0 -68
  76. package/esm2022/lib/inventory-common/stock-issuances/stock-issue.module.mjs +0 -51
  77. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-batch-form/stock-receipt-batch-form.component.mjs +0 -208
  78. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.mjs +0 -47
  79. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.mjs +0 -180
  80. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.mjs +0 -42
  81. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.module.mjs +0 -51
  82. package/esm2022/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.mjs +0 -64
  83. package/fesm2022/techlify-inventory-common-stock-issue-batch-form.component-8u8sZ4gb.mjs +0 -162
  84. package/fesm2022/techlify-inventory-common-stock-issue-batch-form.component-8u8sZ4gb.mjs.map +0 -1
  85. package/fesm2022/techlify-inventory-common-stock-issue-view.component-C-SHFxmY.mjs +0 -66
  86. package/fesm2022/techlify-inventory-common-stock-issue-view.component-C-SHFxmY.mjs.map +0 -1
  87. package/fesm2022/techlify-inventory-common-techlify-inventory-common-CqakmnCI.mjs.map +0 -1
  88. package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.d.ts +0 -18
  89. package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.d.ts +0 -9
  90. package/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.d.ts +0 -18
  91. package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.module.d.ts +0 -15
  92. package/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.d.ts +0 -18
  93. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-import-page/stock-issue-import-page.component.d.ts +0 -0
  94. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-list/stock-issue-list.component.d.ts +0 -0
  95. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-page/stock-issue-page.component.d.ts +0 -0
  96. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-product-form/stock-issue-product-form-button/stock-issue-product-form-button.component.d.ts +0 -0
  97. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-product-form/stock-issue-product-form.component.d.ts +0 -0
  98. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-product.service.d.ts +0 -0
  99. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-products-list/stock-issue-products-list.component.d.ts +0 -0
  100. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue-routing.module.d.ts +0 -0
  101. /package/lib/inventory-common/{stock-issuances/stock-issue-form → stock-issue/stock-issue-simple-form}/stock-issue-form-button/stock-issue-form-button.component.d.ts +0 -0
  102. /package/lib/inventory-common/{stock-issuances → stock-issue}/stock-issue.service.d.ts +0 -0
  103. /package/lib/inventory-common/stock-receipts/{stock-receipt-form → stock-receipt-simple-form}/stock-receipt-form-button/stock-receipt-form-button.component.d.ts +0 -0
@@ -1,163 +0,0 @@
1
- import { Component, signal } from "@angular/core";
2
- import { ReactiveFormsModule, Validators } from '@angular/forms';
3
- import { TechlifyFormComponentInterface, TechlifyIconModule } from "ngx-techlify-core";
4
- import { MaterialModule } from '../../material.module';
5
- import { CommonModule } from '@angular/common';
6
- import { SearchableSelectorModule } from 'ngx-techlify-core';
7
- import { LocationSelectorComponent } from '../../location/location-selector/location-selector.component';
8
- import moment from 'moment';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "ngx-techlify-core";
11
- import * as i2 from "@angular/forms";
12
- import * as i3 from "../stock-issue.service";
13
- import * as i4 from "@angular/router";
14
- import * as i5 from "../../location/location.service";
15
- import * as i6 from "@angular/common";
16
- import * as i7 from "@angular/material/button";
17
- import * as i8 from "@angular/material/card";
18
- import * as i9 from "@angular/material/datepicker";
19
- import * as i10 from "@angular/material/form-field";
20
- import * as i11 from "@angular/material/icon";
21
- import * as i12 from "@angular/material/input";
22
- import * as i13 from "@angular/material/tooltip";
23
- export class StockIssueBatchFormComponent extends TechlifyFormComponentInterface {
24
- formValidatorService;
25
- fb;
26
- stockIssueService;
27
- router;
28
- route;
29
- locationService;
30
- locationCount = signal(0);
31
- stockIssue = signal(null);
32
- constructor(formValidatorService, fb, stockIssueService, router, route, locationService) {
33
- super(formValidatorService);
34
- this.formValidatorService = formValidatorService;
35
- this.fb = fb;
36
- this.stockIssueService = stockIssueService;
37
- this.router = router;
38
- this.route = route;
39
- this.locationService = locationService;
40
- this.form = this.fb.group({
41
- date: [new Date(), Validators.compose([Validators.required])],
42
- particulars: ['', Validators.compose([Validators.required])],
43
- stock_issue_products: this.fb.array([])
44
- });
45
- }
46
- ngOnInit() {
47
- this.locationService.count().subscribe((count) => {
48
- this.locationCount.set(count);
49
- });
50
- const id = this.route.snapshot.paramMap.get('id');
51
- if (id) {
52
- this.loadStockIssue(+id);
53
- }
54
- }
55
- loadStockIssue(id) {
56
- this.isWorking = true;
57
- this.stockIssueService.show(id, { with: 'stockIssueProducts.product' }).subscribe({
58
- next: (response) => {
59
- this.isWorking = false;
60
- this.stockIssue.set(response.item);
61
- },
62
- error: () => {
63
- this.isWorking = false;
64
- },
65
- complete: () => {
66
- const issue = this.stockIssue();
67
- this.form.patchValue({
68
- date: issue.date ? new Date(issue.date) : new Date(),
69
- particulars: issue.details,
70
- });
71
- this.stockIssueProducts.clear();
72
- issue.stock_issue_products?.forEach((sip) => {
73
- const group = this.createStockIssueProduct();
74
- group.patchValue({
75
- id: sip.id,
76
- product_id: sip.product_id,
77
- location_id: sip.location_id,
78
- quantity: sip.quantity,
79
- particulars: sip.particulars,
80
- });
81
- this.stockIssueProducts.push(group);
82
- });
83
- }
84
- });
85
- }
86
- get stockIssueProducts() {
87
- return this.form.get('stock_issue_products');
88
- }
89
- createStockIssueProduct() {
90
- return this.fb.group({
91
- id: [''],
92
- product_id: ['', Validators.required],
93
- location_id: ['', this.locationCount() > 0 ? Validators.required : null],
94
- quantity: [1, [Validators.required, Validators.min(1)]],
95
- particulars: ['']
96
- });
97
- }
98
- addStockIssueProduct() {
99
- this.stockIssueProducts.push(this.createStockIssueProduct());
100
- }
101
- removeStockIssueProduct(index) {
102
- this.stockIssueProducts.removeAt(index);
103
- }
104
- clearProducts() {
105
- this.stockIssueProducts.clear();
106
- }
107
- save() {
108
- if (this.form.invalid) {
109
- this.form.markAllAsTouched();
110
- this.form.markAsDirty();
111
- this.alertService.addAlert('Please check the form for errors.', 'error');
112
- return;
113
- }
114
- if (this.stockIssueProducts.length === 0) {
115
- this.alertService.addAlert('Please add at least one product.', 'error');
116
- return;
117
- }
118
- const formData = this.form.getRawValue();
119
- const data = {
120
- id: this.stockIssue()?.id ?? null,
121
- date: moment(formData.date).format('YYYY-MM-DD'),
122
- details: formData.particulars,
123
- products: formData.stock_issue_products.map((row) => ({
124
- id: row.product_id,
125
- product_id: row.product_id,
126
- quantity: row.quantity,
127
- location_id: row.location_id,
128
- particulars: row.particulars,
129
- }))
130
- };
131
- this.isWorking = true;
132
- const request$ = this.stockIssue()?.id
133
- ? this.stockIssueService.update(data)
134
- : this.stockIssueService.store(data);
135
- request$.subscribe({
136
- next: () => {
137
- this.isWorking = false;
138
- this.alertService.addAlert('Stock issues saved successfully!', 'success');
139
- this.router.navigate(['/inventory/stock-issues']);
140
- },
141
- error: () => {
142
- this.isWorking = false;
143
- }
144
- });
145
- }
146
- cancel() {
147
- this.router.navigate(['/inventory/stock-issues']);
148
- }
149
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueBatchFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.FormBuilder }, { token: i3.StockIssueService }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i5.LocationService }], target: i0.ɵɵFactoryTarget.Component });
150
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StockIssueBatchFormComponent, isStandalone: true, selector: "app-stock-issue-batch-form", usesInheritance: true, ngImport: i0, template: "<mat-card class=\"d-flex flex-column gap-2 container\">\n <mat-card-content>\n\n <div class=\"d-flex flex-column gap-1\">\n <h5>\n <span class=\"material-symbols-outlined align-middle\">upload</span>\n Issue Stock\n </h5>\n </div>\n\n <form class=\"d-flex flex-column gap-2\" [formGroup]=\"form\" (submit)=\"save()\">\n\n <div class=\"d-flex flex-column\">\n <div class=\"d-flex flex-row gap-2 justify-content-between\">\n <mat-form-field appearance='outline' class=\"w-100\">\n <mat-label>Start Date</mat-label>\n <input matInput [matDatepicker]=\"picker\" placeholder=\"Date\" formControlName=\"date\" required>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('date')\">{{ getErrorMessage('date') }}</mat-error>\n </mat-form-field>\n\n <mat-form-field appearance='outline' class=\"w-100\">\n <mat-label>Particulars</mat-label>\n <textarea matInput placeholder=\"Particulars\" formControlName=\"particulars\"></textarea>\n <mat-error *ngIf=\"isFieldValid('particulars')\">{{ getErrorMessage('particulars') }}</mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <table class=\"table mt-3\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Product</th>\n <th *ngIf=\"locationCount() > 0\" scope=\"col\">Location</th>\n <th scope=\"col\">Quantity</th>\n <th scope=\"col\">Particulars</th>\n <th scope=\"col\" class=\"text-center\" width=\"50\"></th>\n </tr>\n </thead>\n <tbody formArrayName=\"stock_issue_products\">\n <tr *ngFor=\"let row of stockIssueProducts.controls; let i = index\" [formGroupName]=\"i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td>\n <mat-form-field appearance='outline' class=\"w-100\">\n <mat-label>Product</mat-label>\n <app-searchable-selector apiUrl='api/products' formControlName=\"product_id\"\n titleField='name' [cache]=\"true\" required></app-searchable-selector>\n </mat-form-field>\n </td>\n <td *ngIf=\"locationCount() > 0\">\n <app-location-selector appearance='outline'\n formControlName=\"location_id\"></app-location-selector>\n </td>\n <td>\n <mat-form-field appearance='outline' class='fl-sm'>\n <mat-label>Quantity</mat-label>\n <input matInput formControlName=\"quantity\" type=\"number\" min=\"1\">\n </mat-form-field>\n </td>\n <td>\n <mat-form-field appearance='outline'>\n <mat-label>Particulars</mat-label>\n <input matInput formControlName=\"particulars\">\n </mat-form-field>\n </td>\n <td class=\"text-center align-middle\">\n <div class=\"d-flex gap-2 justify-content-center align-items-center text-secondary\">\n <app-techlify-icon role='button' name='delete' (click)=\"removeStockIssueProduct(i)\"\n matTooltip=\"Remove row\"></app-techlify-icon>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"6\" class=\"text-end\">\n <div class=\"d-flex flex-row gap-2 justify-content-end\">\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearProducts()\"\n [disabled]=\"stockIssueProducts.length === 0\">\n <mat-icon>block</mat-icon> CLEAR ALL\n </button>\n <button mat-raised-button color=\"primary\" type=\"button\"\n (click)=\"addStockIssueProduct()\">\n <mat-icon>add</mat-icon> ADD\n </button>\n </div>\n </td>\n </tr>\n </tfoot>\n </table>\n\n <div class=\"d-flex justify-content-end align-items-center gap-2 mt-2\">\n <button [disabled]=\"isWorking\" mat-flat-button type=\"button\" (click)=\"cancel()\">Cancel</button>\n <button [disabled]=\"isWorking || stockIssueProducts.length === 0\" mat-raised-button color=\"primary\"\n type=\"submit\">Save</button>\n </div>\n\n </form>\n\n </mat-card-content>\n</mat-card>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MaterialModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i8.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.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: i13.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: SearchableSelectorModule }, { kind: "component", type: i1.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: LocationSelectorComponent, selector: "app-location-selector", inputs: ["appearance", "label", "placeholder", "includeNone"] }, { kind: "ngmodule", type: TechlifyIconModule }, { kind: "component", type: i1.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }], preserveWhitespaces: true });
151
- }
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueBatchFormComponent, decorators: [{
153
- type: Component,
154
- args: [{ selector: 'app-stock-issue-batch-form', standalone: true, imports: [
155
- CommonModule,
156
- ReactiveFormsModule,
157
- MaterialModule,
158
- SearchableSelectorModule,
159
- LocationSelectorComponent,
160
- TechlifyIconModule
161
- ], template: "<mat-card class=\"d-flex flex-column gap-2 container\">\n <mat-card-content>\n\n <div class=\"d-flex flex-column gap-1\">\n <h5>\n <span class=\"material-symbols-outlined align-middle\">upload</span>\n Issue Stock\n </h5>\n </div>\n\n <form class=\"d-flex flex-column gap-2\" [formGroup]=\"form\" (submit)=\"save()\">\n\n <div class=\"d-flex flex-column\">\n <div class=\"d-flex flex-row gap-2 justify-content-between\">\n <mat-form-field appearance='outline' class=\"w-100\">\n <mat-label>Start Date</mat-label>\n <input matInput [matDatepicker]=\"picker\" placeholder=\"Date\" formControlName=\"date\" required>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('date')\">{{ getErrorMessage('date') }}</mat-error>\n </mat-form-field>\n\n <mat-form-field appearance='outline' class=\"w-100\">\n <mat-label>Particulars</mat-label>\n <textarea matInput placeholder=\"Particulars\" formControlName=\"particulars\"></textarea>\n <mat-error *ngIf=\"isFieldValid('particulars')\">{{ getErrorMessage('particulars') }}</mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <table class=\"table mt-3\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Product</th>\n <th *ngIf=\"locationCount() > 0\" scope=\"col\">Location</th>\n <th scope=\"col\">Quantity</th>\n <th scope=\"col\">Particulars</th>\n <th scope=\"col\" class=\"text-center\" width=\"50\"></th>\n </tr>\n </thead>\n <tbody formArrayName=\"stock_issue_products\">\n <tr *ngFor=\"let row of stockIssueProducts.controls; let i = index\" [formGroupName]=\"i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td>\n <mat-form-field appearance='outline' class=\"w-100\">\n <mat-label>Product</mat-label>\n <app-searchable-selector apiUrl='api/products' formControlName=\"product_id\"\n titleField='name' [cache]=\"true\" required></app-searchable-selector>\n </mat-form-field>\n </td>\n <td *ngIf=\"locationCount() > 0\">\n <app-location-selector appearance='outline'\n formControlName=\"location_id\"></app-location-selector>\n </td>\n <td>\n <mat-form-field appearance='outline' class='fl-sm'>\n <mat-label>Quantity</mat-label>\n <input matInput formControlName=\"quantity\" type=\"number\" min=\"1\">\n </mat-form-field>\n </td>\n <td>\n <mat-form-field appearance='outline'>\n <mat-label>Particulars</mat-label>\n <input matInput formControlName=\"particulars\">\n </mat-form-field>\n </td>\n <td class=\"text-center align-middle\">\n <div class=\"d-flex gap-2 justify-content-center align-items-center text-secondary\">\n <app-techlify-icon role='button' name='delete' (click)=\"removeStockIssueProduct(i)\"\n matTooltip=\"Remove row\"></app-techlify-icon>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"6\" class=\"text-end\">\n <div class=\"d-flex flex-row gap-2 justify-content-end\">\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearProducts()\"\n [disabled]=\"stockIssueProducts.length === 0\">\n <mat-icon>block</mat-icon> CLEAR ALL\n </button>\n <button mat-raised-button color=\"primary\" type=\"button\"\n (click)=\"addStockIssueProduct()\">\n <mat-icon>add</mat-icon> ADD\n </button>\n </div>\n </td>\n </tr>\n </tfoot>\n </table>\n\n <div class=\"d-flex justify-content-end align-items-center gap-2 mt-2\">\n <button [disabled]=\"isWorking\" mat-flat-button type=\"button\" (click)=\"cancel()\">Cancel</button>\n <button [disabled]=\"isWorking || stockIssueProducts.length === 0\" mat-raised-button color=\"primary\"\n type=\"submit\">Save</button>\n </div>\n\n </form>\n\n </mat-card-content>\n</mat-card>\n" }]
162
- }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.FormBuilder }, { type: i3.StockIssueService }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.LocationService }] });
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtYmF0Y2gtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtYmF0Y2gtZm9ybS9zdG9jay1pc3N1ZS1iYXRjaC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3N0b2NrLWlzc3VhbmNlcy9zdG9jay1pc3N1ZS1iYXRjaC1mb3JtL3N0b2NrLWlzc3VlLWJhdGNoLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQXdCLDhCQUE4QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0csT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUd6RyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWlCNUIsTUFBTSxPQUFPLDRCQUE2QixTQUFRLDhCQUE4QjtJQUs3QztJQUNuQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBUlosYUFBYSxHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FB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QkFBd0I7d0JBQ3hCLHlCQUF5Qjt3QkFDekIsa0JBQWtCO3FCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBzaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1WYWxpZGF0b3JTZXJ2aWNlLCBUZWNobGlmeUZvcm1Db21wb25lbnRJbnRlcmZhY2UsIFRlY2hsaWZ5SWNvbk1vZHVsZSB9IGZyb20gXCJuZ3gtdGVjaGxpZnktY29yZVwiO1xuaW1wb3J0IHsgTWF0ZXJpYWxNb2R1bGUgfSBmcm9tICcuLi8uLi9tYXRlcmlhbC5tb2R1bGUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNlYXJjaGFibGVTZWxlY3Rvck1vZHVsZSB9IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IExvY2F0aW9uU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi9sb2NhdGlvbi9sb2NhdGlvbi1zZWxlY3Rvci9sb2NhdGlvbi1zZWxlY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RvY2tJc3N1ZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9jay1pc3N1ZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgTG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbG9jYXRpb24vbG9jYXRpb24uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXN0b2NrLWlzc3VlLWJhdGNoLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zdG9jay1pc3N1ZS1iYXRjaC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRlcmlhbE1vZHVsZSxcbiAgICAgICAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICAgICAgICBMb2NhdGlvblNlbGVjdG9yQ29tcG9uZW50LFxuICAgICAgICBUZWNobGlmeUljb25Nb2R1bGVcbiAgICBdXG59KVxuXG5leHBvcnQgY2xhc3MgU3RvY2tJc3N1ZUJhdGNoRm9ybUNvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5Rm9ybUNvbXBvbmVudEludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBsb2NhdGlvbkNvdW50ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gICAgc3RvY2tJc3N1ZSA9IHNpZ25hbDxhbnk+KG51bGwpO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIG92ZXJyaWRlIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgc3RvY2tJc3N1ZVNlcnZpY2U6IFN0b2NrSXNzdWVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBsb2NhdGlvblNlcnZpY2U6IExvY2F0aW9uU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihmb3JtVmFsaWRhdG9yU2VydmljZSk7XG5cbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBkYXRlOiBbbmV3IERhdGUoKSwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgICAgICAgcGFydGljdWxhcnM6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgICAgICAgc3RvY2tfaXNzdWVfcHJvZHVjdHM6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvY2F0aW9uU2VydmljZS5jb3VudCgpLnN1YnNjcmliZSgoY291bnQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbkNvdW50LnNldChjb3VudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkU3RvY2tJc3N1ZSgraWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkU3RvY2tJc3N1ZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdG9ja0lzc3VlU2VydmljZS5zaG93KGlkLCB7IHdpdGg6ICdzdG9ja0lzc3VlUHJvZHVjdHMucHJvZHVjdCcgfSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b2NrSXNzdWUuc2V0KHJlc3BvbnNlLml0ZW0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzc3VlID0gdGhpcy5zdG9ja0lzc3VlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICBkYXRlOiBpc3N1ZS5kYXRlID8gbmV3IERhdGUoaXNzdWUuZGF0ZSkgOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyczogaXNzdWUuZGV0YWlscyxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3RvY2tJc3N1ZVByb2R1Y3RzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgaXNzdWUuc3RvY2tfaXNzdWVfcHJvZHVjdHM/LmZvckVhY2goKHNpcDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5jcmVhdGVTdG9ja0lzc3VlUHJvZHVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBncm91cC5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzaXAuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2lkOiBzaXAucHJvZHVjdF9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBzaXAubG9jYXRpb25faWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogc2lwLnF1YW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljdWxhcnM6IHNpcC5wYXJ0aWN1bGFycyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvY2tJc3N1ZVByb2R1Y3RzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgc3RvY2tJc3N1ZVByb2R1Y3RzKCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdzdG9ja19pc3N1ZV9wcm9kdWN0cycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBjcmVhdGVTdG9ja0lzc3VlUHJvZHVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgaWQ6IFsnJ10sXG4gICAgICAgICAgICBwcm9kdWN0X2lkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgbG9jYXRpb25faWQ6IFsnJywgdGhpcy5sb2NhdGlvbkNvdW50KCkgPiAwID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IG51bGxdLFxuICAgICAgICAgICAgcXVhbnRpdHk6IFsxLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldXSxcbiAgICAgICAgICAgIHBhcnRpY3VsYXJzOiBbJyddXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFN0b2NrSXNzdWVQcm9kdWN0KCkge1xuICAgICAgICB0aGlzLnN0b2NrSXNzdWVQcm9kdWN0cy5wdXNoKHRoaXMuY3JlYXRlU3RvY2tJc3N1ZVByb2R1Y3QoKSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU3RvY2tJc3N1ZVByb2R1Y3QoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLnN0b2NrSXNzdWVQcm9kdWN0cy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgY2xlYXJQcm9kdWN0cygpIHtcbiAgICAgICAgdGhpcy5zdG9ja0lzc3VlUHJvZHVjdHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBzYXZlKCkge1xuICAgICAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdQbGVhc2UgY2hlY2sgdGhlIGZvcm0gZm9yIGVycm9ycy4nLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0b2NrSXNzdWVQcm9kdWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdQbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwcm9kdWN0LicsICdlcnJvcicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuc3RvY2tJc3N1ZSgpPy5pZCA/PyBudWxsLFxuICAgICAgICAgICAgZGF0ZTogbW9tZW50KGZvcm1EYXRhLmRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgICAgICAgZGV0YWlsczogZm9ybURhdGEucGFydGljdWxhcnMsXG4gICAgICAgICAgICBwcm9kdWN0czogZm9ybURhdGEuc3RvY2tfaXNzdWVfcHJvZHVjdHMubWFwKChyb3c6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICBpZDogcm93LnByb2R1Y3RfaWQsXG4gICAgICAgICAgICAgICAgcHJvZHVjdF9pZDogcm93LnByb2R1Y3RfaWQsXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IHJvdy5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogcm93LmxvY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgIHBhcnRpY3VsYXJzOiByb3cucGFydGljdWxhcnMsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QkID0gdGhpcy5zdG9ja0lzc3VlKCk/LmlkXG4gICAgICAgICAgICA/IHRoaXMuc3RvY2tJc3N1ZVNlcnZpY2UudXBkYXRlKGRhdGEpXG4gICAgICAgICAgICA6IHRoaXMuc3RvY2tJc3N1ZVNlcnZpY2Uuc3RvcmUoZGF0YSk7XG5cbiAgICAgICAgcmVxdWVzdCQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdTdG9jayBpc3N1ZXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvaW52ZW50b3J5L3N0b2NrLWlzc3VlcyddKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvaW52ZW50b3J5L3N0b2NrLWlzc3VlcyddKTtcbiAgICB9XG59XG4iLCI8bWF0LWNhcmQgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTIgY29udGFpbmVyXCI+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMVwiPlxuICAgICAgICAgICAgPGg1PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBhbGlnbi1taWRkbGVcIj51cGxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgSXNzdWUgU3RvY2tcbiAgICAgICAgICAgIDwvaDU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxmb3JtIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cgZ2FwLTIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9J291dGxpbmUnIGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U3RhcnQgRGF0ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiIHBsYWNlaG9sZGVyPVwiRGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImRhdGVcIiByZXF1aXJlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnZGF0ZScpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdkYXRlJykgfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT0nb3V0bGluZScgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5QYXJ0aWN1bGFyczwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiUGFydGljdWxhcnNcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXJ0aWN1bGFyc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdwYXJ0aWN1bGFycycpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdwYXJ0aWN1bGFycycpIH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgbXQtM1wiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+IzwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5Qcm9kdWN0PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImxvY2F0aW9uQ291bnQoKSA+IDBcIiBzY29wZT1cImNvbFwiPkxvY2F0aW9uPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlF1YW50aXR5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlBhcnRpY3VsYXJzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIiB3aWR0aD1cIjUwXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keSBmb3JtQXJyYXlOYW1lPVwic3RvY2tfaXNzdWVfcHJvZHVjdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2Ygc3RvY2tJc3N1ZVByb2R1Y3RzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+e3sgaSArIDEgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPSdvdXRsaW5lJyBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+UHJvZHVjdDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPSdhcGkvcHJvZHVjdHMnIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RfaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVGaWVsZD0nbmFtZScgW2NhY2hlXT1cInRydWVcIiByZXF1aXJlZD48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibG9jYXRpb25Db3VudCgpID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtbG9jYXRpb24tc2VsZWN0b3IgYXBwZWFyYW5jZT0nb3V0bGluZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibG9jYXRpb25faWRcIj48L2FwcC1sb2NhdGlvbi1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9J291dGxpbmUnIGNsYXNzPSdmbC1zbSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+UXVhbnRpdHk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInF1YW50aXR5XCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT0nb3V0bGluZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+UGFydGljdWxhcnM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInBhcnRpY3VsYXJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlciBhbGlnbi1taWRkbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHRleHQtc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtdGVjaGxpZnktaWNvbiByb2xlPSdidXR0b24nIG5hbWU9J2RlbGV0ZScgKGNsaWNrKT1cInJlbW92ZVN0b2NrSXNzdWVQcm9kdWN0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZW1vdmUgcm93XCI+PC9hcHAtdGVjaGxpZnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNlwiIGNsYXNzPVwidGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGdhcC0yIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXJQcm9kdWN0cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzdG9ja0lzc3VlUHJvZHVjdHMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YmxvY2s8L21hdC1pY29uPiBDTEVBUiBBTExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3RvY2tJc3N1ZVByb2R1Y3QoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+IEFERFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Zm9vdD5cbiAgICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImlzV29ya2luZ1wiIG1hdC1mbGF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNXb3JraW5nIHx8IHN0b2NrSXNzdWVQcm9kdWN0cy5sZW5ndGggPT09IDBcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9mb3JtPlxuXG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cbiJdfQ==
@@ -1,201 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { TechlifyFormComponentInterface } from 'ngx-techlify-core';
3
- import { Validators } from '@angular/forms';
4
- import { debounceTime, distinctUntilChanged } from "rxjs";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "ngx-techlify-core";
7
- import * as i2 from "@angular/forms";
8
- import * as i3 from "../../stock-issue.service";
9
- import * as i4 from "../../../location/location.service";
10
- import * as i5 from "@angular/common";
11
- import * as i6 from "@angular/material/button";
12
- import * as i7 from "@angular/material/datepicker";
13
- import * as i8 from "@angular/material/form-field";
14
- import * as i9 from "@angular/material/input";
15
- export class StockIssueFormComponent extends TechlifyFormComponentInterface {
16
- formBuilder;
17
- stockIssueService;
18
- dateUtils;
19
- locationService;
20
- product;
21
- stockIssueProduct;
22
- stockIssue;
23
- issuableType;
24
- issuableId;
25
- saved = new EventEmitter();
26
- cancelled = new EventEmitter();
27
- batchSearchableSelector;
28
- locationsCountValue = 0;
29
- batchesApiUrl = '';
30
- isBatchPatched = false;
31
- constructor(formValidatorService, formBuilder, stockIssueService, dateUtils, locationService) {
32
- super(formValidatorService);
33
- this.formBuilder = formBuilder;
34
- this.stockIssueService = stockIssueService;
35
- this.dateUtils = dateUtils;
36
- this.locationService = locationService;
37
- this.errorMessages = {
38
- date: {
39
- required: 'The date field is required.',
40
- },
41
- quantity: {
42
- required: 'The quantity field is required.',
43
- },
44
- };
45
- this.form = this.formBuilder.group({
46
- id: [''],
47
- product_id: [''],
48
- location_id: [''],
49
- batch_id: [''],
50
- date: [new Date(), Validators.required],
51
- quantity: [1, Validators.required],
52
- particulars: [''],
53
- });
54
- }
55
- ngOnInit() {
56
- // Update the stock receipt batches when the location changes
57
- this.form.get('location_id')?.valueChanges?.pipe(debounceTime(50), distinctUntilChanged()).subscribe((val) => {
58
- this.resetBatchSelector(val);
59
- });
60
- this.locationService.count().subscribe((count) => {
61
- this.locationsCountValue = count;
62
- });
63
- if (this.product) {
64
- this.form.patchValue({
65
- product_id: this.product.id,
66
- });
67
- }
68
- this.patchFormData();
69
- }
70
- patchFormData() {
71
- if (this.stockIssue) {
72
- let data = { ...this.stockIssue };
73
- if (data.date) {
74
- data.date = new Date(data.date);
75
- }
76
- this.form.patchValue(data, { emitEvent: false });
77
- this.resetBatchSelector(data.location_id, false);
78
- this.patchFormProducts(this.stockIssue);
79
- }
80
- else {
81
- // on create for set default quantity from last record
82
- if (this.product?.last_stock_issuance) {
83
- const { quantity, location_id } = this.product.last_stock_issuance;
84
- this.form.patchValue({
85
- quantity,
86
- location_id,
87
- });
88
- }
89
- }
90
- }
91
- patchFormProducts(stockIssuance) {
92
- if (stockIssuance.stock_issue_products.length > 0) {
93
- this.updateFormWithProductArray(stockIssuance.stock_issue_products[0]);
94
- this.product = stockIssuance.stock_issue_products[0].product;
95
- }
96
- }
97
- updateFormWithProductArray(stockIssueProduct) {
98
- this.form.patchValue({
99
- product_id: stockIssueProduct.product_id,
100
- quantity: stockIssueProduct.quantity,
101
- location_id: stockIssueProduct.location_id,
102
- batch_id: stockIssueProduct.batch_id,
103
- particulars: stockIssueProduct.particulars,
104
- issuable_type: stockIssueProduct.issuable_type,
105
- issuable_id: stockIssueProduct.issuable_id
106
- });
107
- }
108
- get locationsCount() {
109
- return this.locationsCountValue;
110
- }
111
- save() {
112
- if (this.form.invalid) {
113
- this.alertService.addAlert('Please check the form for errors', 'error');
114
- return;
115
- }
116
- const data = {
117
- ...this.form.value,
118
- products: [
119
- {
120
- ...this.form.value,
121
- id: this.form.value.product_id,
122
- }
123
- ]
124
- };
125
- if (data.date) {
126
- data.date = this.dateUtils.getYYYYMMDDString(data.date);
127
- }
128
- this.isWorking = true;
129
- let request = this.stockIssueService.store(data);
130
- if (this.stockIssue?.id) {
131
- request = this.stockIssueService.update(data);
132
- }
133
- request.subscribe({
134
- next: (response) => {
135
- this.isWorking = false;
136
- this.saved.emit(response?.item);
137
- this.alertService.addAlert('Stock Issuance Saved Successfully!', 'success');
138
- },
139
- error: () => (this.isWorking = false),
140
- });
141
- }
142
- onProductChange(product) {
143
- this.product = product;
144
- }
145
- /**
146
- * We needed a way to detect when the batch field and items are loaded to then
147
- * patch the batch field. So we'll wait for the selector to trigger this function when
148
- * data is loaded
149
- */
150
- onBatchItemsChange() {
151
- /**
152
- * We only want to batch the data once so we'll set a flag
153
- * to prevent this function from running more than once
154
- */
155
- if (this.stockIssue && !this.isBatchPatched) {
156
- this.form.get('batch_id')?.setValue(this.stockIssue?.stock_issue_products[0]?.batch_id);
157
- this.batchSearchableSelector.selectedValue = this.stockIssue?.stock_issue_products[0]?.batch;
158
- this.isBatchPatched = true;
159
- }
160
- }
161
- resetBatchSelector(val, reset = true) {
162
- if (reset) {
163
- this.form.get('batch_id')?.setValue(null, { emitEvent: false });
164
- }
165
- this.batchesApiUrl = val ? `api/stock-receipt-batches?location_ids=${val}` : '';
166
- // let Angular apply the new [apiUrl] binding first, then reload
167
- Promise.resolve().then(() => {
168
- if (this.batchSearchableSelector) {
169
- if (reset) {
170
- this.batchSearchableSelector.selectedValue = null;
171
- }
172
- this.batchSearchableSelector.apiUrl = this.batchesApiUrl;
173
- this.batchSearchableSelector?.reloadData();
174
- }
175
- });
176
- }
177
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.FormBuilder }, { token: i3.StockIssueService }, { token: i1.DateUtils }, { token: i4.LocationService }], target: i0.ɵɵFactoryTarget.Component });
178
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StockIssueFormComponent, selector: "app-stock-issue-form", inputs: { product: "product", stockIssueProduct: "stockIssueProduct", stockIssue: "stockIssue", issuableType: "issuableType", issuableId: "issuableId" }, outputs: { saved: "saved", cancelled: "cancelled" }, viewQueries: [{ propertyName: "batchSearchableSelector", first: true, predicate: ["batchSearchableSelector"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<h3 class=\"text-center\">{{ stockIssue?.id ? 'Edit' : 'Issue' }} Stock for {{ product?.name }}</h3>\n<form [formGroup]=\"form\" class=\"d-flex flex-column gap-1 justify-content-start\" (submit)=\"save()\">\n <mat-form-field *ngIf=\"!product\">\n <mat-label>Product</mat-label>\n <app-searchable-selector formControlName=\"product_id\" apiUrl=\"api/products\" titleField=\"name\"\n (selectedValueChange)=\"onProductChange($event)\"></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"locationsCount > 1\">\n <mat-label>Location</mat-label>\n <app-searchable-selector formControlName=\"location_id\" apiUrl=\"api/inventory-locations\"\n [selectedValue]=\"stockIssue?.stock_issue_products[0]?.location\"></app-searchable-selector>\n </mat-form-field>\n\n <ng-container *ngIf=\"locationsCount > 1 && form.value?.location_id && batchesApiUrl\">\n <mat-form-field techlifyFeatureEnabled=\"product-batch-numbers\">\n <mat-label>Batch</mat-label>\n <app-searchable-selector #batchSearchableSelector formControlName=\"batch_id\"\n [apiUrl]=\"batchesApiUrl\" [enableSearch]=\"false\"\n (itemsChange)=\"onBatchItemsChange()\">\n </app-searchable-selector>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input matInput [matDatepicker]=\"datePicker\" formControlName=\"date\" (focus)=\"datePicker.open()\" />\n <mat-datepicker #datePicker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('date')\">\n {{ getErrorMessage('date') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Quantity</mat-label>\n <input matInput formControlName=\"quantity\" type=\"number\" min=\"0\" />\n <mat-error *ngIf=\"isFieldValid('quantity')\">\n {{ getErrorMessage('quantity') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Particulars</mat-label>\n <textarea matInput formControlName=\"particulars\" rows=\"3\"></textarea>\n </mat-form-field>\n\n <div class=\"d-flex justify-content-end align-items-center gap-2\">\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" type=\"submit\">Save</button>\n <button [disabled]=\"isWorking\" (click)=\"cancelled.emit()\" mat-flat-button type=\"button\">Cancel</button>\n </div>\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i1.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "directive", type: i1.TechlifyFeatureEnabledDirective, selector: "[techlifyFeatureEnabled]", inputs: ["techlifyFeatureEnabled"] }], preserveWhitespaces: true });
179
- }
180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormComponent, decorators: [{
181
- type: Component,
182
- args: [{ selector: 'app-stock-issue-form', template: "<h3 class=\"text-center\">{{ stockIssue?.id ? 'Edit' : 'Issue' }} Stock for {{ product?.name }}</h3>\n<form [formGroup]=\"form\" class=\"d-flex flex-column gap-1 justify-content-start\" (submit)=\"save()\">\n <mat-form-field *ngIf=\"!product\">\n <mat-label>Product</mat-label>\n <app-searchable-selector formControlName=\"product_id\" apiUrl=\"api/products\" titleField=\"name\"\n (selectedValueChange)=\"onProductChange($event)\"></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"locationsCount > 1\">\n <mat-label>Location</mat-label>\n <app-searchable-selector formControlName=\"location_id\" apiUrl=\"api/inventory-locations\"\n [selectedValue]=\"stockIssue?.stock_issue_products[0]?.location\"></app-searchable-selector>\n </mat-form-field>\n\n <ng-container *ngIf=\"locationsCount > 1 && form.value?.location_id && batchesApiUrl\">\n <mat-form-field techlifyFeatureEnabled=\"product-batch-numbers\">\n <mat-label>Batch</mat-label>\n <app-searchable-selector #batchSearchableSelector formControlName=\"batch_id\"\n [apiUrl]=\"batchesApiUrl\" [enableSearch]=\"false\"\n (itemsChange)=\"onBatchItemsChange()\">\n </app-searchable-selector>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input matInput [matDatepicker]=\"datePicker\" formControlName=\"date\" (focus)=\"datePicker.open()\" />\n <mat-datepicker #datePicker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('date')\">\n {{ getErrorMessage('date') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Quantity</mat-label>\n <input matInput formControlName=\"quantity\" type=\"number\" min=\"0\" />\n <mat-error *ngIf=\"isFieldValid('quantity')\">\n {{ getErrorMessage('quantity') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Particulars</mat-label>\n <textarea matInput formControlName=\"particulars\" rows=\"3\"></textarea>\n </mat-form-field>\n\n <div class=\"d-flex justify-content-end align-items-center gap-2\">\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" type=\"submit\">Save</button>\n <button [disabled]=\"isWorking\" (click)=\"cancelled.emit()\" mat-flat-button type=\"button\">Cancel</button>\n </div>\n</form>" }]
183
- }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.FormBuilder }, { type: i3.StockIssueService }, { type: i1.DateUtils }, { type: i4.LocationService }], propDecorators: { product: [{
184
- type: Input
185
- }], stockIssueProduct: [{
186
- type: Input
187
- }], stockIssue: [{
188
- type: Input
189
- }], issuableType: [{
190
- type: Input
191
- }], issuableId: [{
192
- type: Input
193
- }], saved: [{
194
- type: Output
195
- }], cancelled: [{
196
- type: Output
197
- }], batchSearchableSelector: [{
198
- type: ViewChild,
199
- args: ['batchSearchableSelector']
200
- }] } });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtZm9ybS9zdG9jay1pc3N1ZS1mb3JtL3N0b2NrLWlzc3VlLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3RvY2staXNzdWFuY2VzL3N0b2NrLWlzc3VlLWZvcm0vc3RvY2staXNzdWUtZm9ybS9zdG9jay1pc3N1ZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFLTCw4QkFBOEIsRUFDL0IsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUFPMUQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLDhCQUE4QjtJQWlCL0Q7SUFDQTtJQUNBO0lBQ0E7SUFuQkQsT0FBTyxDQUFNO0lBQ2IsaUJBQWlCLENBQU07SUFFdkIsVUFBVSxDQUFNO0lBQ2hCLFlBQVksQ0FBVTtJQUN0QixVQUFVLENBQVU7SUFDbkIsS0FBSyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ25ELFNBQVMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUMzQix1QkFBdUIsQ0FBK0I7SUFFcEYsbUJBQW1CLEdBQVcs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QUFDLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUN6RCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F2TFUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsc2FDbEJwQyxnMkVBa0RPOzs0RkRoQ00sdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHNCQUFzQjt5TUFLdkIsT0FBTztzQkFBZixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDK0IsdUJBQXVCO3NCQUE1RCxTQUFTO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBEYXRlVXRpbHMsXG4gIEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICBTZWFyY2hhYmxlU2VsZWN0b3JDb21wb25lbnQsXG4gIFRlY2hsaWZ5Rm9ybUNvbXBvbmVudEludGVyZmFjZVxufSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN0b2NrSXNzdWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvY2staXNzdWUuc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9sb2NhdGlvbi9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tIFwicnhqc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc3RvY2staXNzdWUtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9jay1pc3N1ZS1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3RvY2staXNzdWUtZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9ja0lzc3VlRm9ybUNvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5Rm9ybUNvbXBvbmVudEludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb2R1Y3Q6IGFueTtcbiAgQElucHV0KCkgc3RvY2tJc3N1ZVByb2R1Y3Q6IGFueTtcblxuICBASW5wdXQoKSBzdG9ja0lzc3VlOiBhbnk7XG4gIEBJbnB1dCgpIGlzc3VhYmxlVHlwZSE6IHN0cmluZztcbiAgQElucHV0KCkgaXNzdWFibGVJZCE6IG51bWJlcjtcbiAgQE91dHB1dCgpIHNhdmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAVmlld0NoaWxkKCdiYXRjaFNlYXJjaGFibGVTZWxlY3RvcicpIGJhdGNoU2VhcmNoYWJsZVNlbGVjdG9yITogU2VhcmNoYWJsZVNlbGVjdG9yQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgbG9jYXRpb25zQ291bnRWYWx1ZTogbnVtYmVyID0gMDtcbiAgYmF0Y2hlc0FwaVVybCA9ICcnO1xuICBpc0JhdGNoUGF0Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHN0b2NrSXNzdWVTZXJ2aWNlOiBTdG9ja0lzc3VlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVVdGlsczogRGF0ZVV0aWxzLFxuICAgIHByaXZhdGUgbG9jYXRpb25TZXJ2aWNlOiBMb2NhdGlvblNlcnZpY2UsXG4gICkge1xuICAgIHN1cGVyKGZvcm1WYWxpZGF0b3JTZXJ2aWNlKTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZXMgPSB7XG4gICAgICBkYXRlOiB7XG4gICAgICAgIHJlcXVpcmVkOiAnVGhlIGRhdGUgZmllbGQgaXMgcmVxdWlyZWQuJyxcbiAgICAgIH0sXG4gICAgICBxdWFudGl0eToge1xuICAgICAgICByZXF1aXJlZDogJ1RoZSBxdWFudGl0eSBmaWVsZCBpcyByZXF1aXJlZC4nLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBpZDogWycnXSxcbiAgICAgIHByb2R1Y3RfaWQ6IFsnJ10sXG4gICAgICBsb2NhdGlvbl9pZDogWycnXSxcbiAgICAgIGJhdGNoX2lkOiBbJyddLFxuICAgICAgZGF0ZTogW25ldyBEYXRlKCksIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgcXVhbnRpdHk6IFsxLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHBhcnRpY3VsYXJzOiBbJyddLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBzdG9jayByZWNlaXB0IGJhdGNoZXMgd2hlbiB0aGUgbG9jYXRpb24gY2hhbmdlc1xuICAgIHRoaXMuZm9ybS5nZXQoJ2xvY2F0aW9uX2lkJyk/LnZhbHVlQ2hhbmdlcz8ucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSg1MCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICkuc3Vic2NyaWJlKCh2YWw6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5yZXNldEJhdGNoU2VsZWN0b3IodmFsKTtcbiAgICB9KTtcblxuICAgIHRoaXMubG9jYXRpb25TZXJ2aWNlLmNvdW50KCkuc3Vic2NyaWJlKChjb3VudDogbnVtYmVyKSA9PiB7XG4gICAgICB0aGlzLmxvY2F0aW9uc0NvdW50VmFsdWUgPSBjb3VudDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnByb2R1Y3QpIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgcHJvZHVjdF9pZDogdGhpcy5wcm9kdWN0LmlkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wYXRjaEZvcm1EYXRhKCk7XG4gIH1cblxuICBwYXRjaEZvcm1EYXRhKCkge1xuICAgIGlmICh0aGlzLnN0b2NrSXNzdWUpIHtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSB7IC4uLnRoaXMuc3RvY2tJc3N1ZSB9O1xuICAgICAgaWYgKGRhdGEuZGF0ZSkge1xuICAgICAgICBkYXRhLmRhdGUgPSBuZXcgRGF0ZShkYXRhLmRhdGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoZGF0YSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5yZXNldEJhdGNoU2VsZWN0b3IoZGF0YS5sb2NhdGlvbl9pZCwgZmFsc2UpO1xuXG4gICAgICB0aGlzLnBhdGNoRm9ybVByb2R1Y3RzKHRoaXMuc3RvY2tJc3N1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb24gY3JlYXRlIGZvciBzZXQgZGVmYXVsdCBxdWFudGl0eSBmcm9tIGxhc3QgcmVjb3JkXG4gICAgICBpZiAodGhpcy5wcm9kdWN0Py5sYXN0X3N0b2NrX2lzc3VhbmNlKSB7XG4gICAgICAgIGNvbnN0IHsgcXVhbnRpdHksIGxvY2F0aW9uX2lkIH0gPSB0aGlzLnByb2R1Y3QubGFzdF9zdG9ja19pc3N1YW5jZTtcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIHF1YW50aXR5LFxuICAgICAgICAgIGxvY2F0aW9uX2lkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwYXRjaEZvcm1Qcm9kdWN0cyhzdG9ja0lzc3VhbmNlOiBhbnkpIHtcbiAgICBpZiAoc3RvY2tJc3N1YW5jZS5zdG9ja19pc3N1ZV9wcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1XaXRoUHJvZHVjdEFycmF5KHN0b2NrSXNzdWFuY2Uuc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0pO1xuXG4gICAgICB0aGlzLnByb2R1Y3QgPSBzdG9ja0lzc3VhbmNlLnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdLnByb2R1Y3Q7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRm9ybVdpdGhQcm9kdWN0QXJyYXkoc3RvY2tJc3N1ZVByb2R1Y3Q6IGFueSkge1xuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIHByb2R1Y3RfaWQ6IHN0b2NrSXNzdWVQcm9kdWN0LnByb2R1Y3RfaWQsXG4gICAgICBxdWFudGl0eTogc3RvY2tJc3N1ZVByb2R1Y3QucXVhbnRpdHksXG4gICAgICBsb2NhdGlvbl9pZDogc3RvY2tJc3N1ZVByb2R1Y3QubG9jYXRpb25faWQsXG4gICAgICBiYXRjaF9pZDogc3RvY2tJc3N1ZVByb2R1Y3QuYmF0Y2hfaWQsXG4gICAgICBwYXJ0aWN1bGFyczogc3RvY2tJc3N1ZVByb2R1Y3QucGFydGljdWxhcnMsXG4gICAgICBpc3N1YWJsZV90eXBlOiBzdG9ja0lzc3VlUHJvZHVjdC5pc3N1YWJsZV90eXBlLFxuICAgICAgaXNzdWFibGVfaWQ6IHN0b2NrSXNzdWVQcm9kdWN0Lmlzc3VhYmxlX2lkXG4gICAgfSk7XG4gIH1cblxuICBnZXQgbG9jYXRpb25zQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhdGlvbnNDb3VudFZhbHVlO1xuICB9XG5cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdQbGVhc2UgY2hlY2sgdGhlIGZvcm0gZm9yIGVycm9ycycsICdlcnJvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgIC4uLnRoaXMuZm9ybS52YWx1ZSxcbiAgICAgIHByb2R1Y3RzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLmZvcm0udmFsdWUsXG4gICAgICAgICAgaWQ6IHRoaXMuZm9ybS52YWx1ZS5wcm9kdWN0X2lkLFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgICBpZiAoZGF0YS5kYXRlKSB7XG4gICAgICBkYXRhLmRhdGUgPSB0aGlzLmRhdGVVdGlscy5nZXRZWVlZTU1ERFN0cmluZyhkYXRhLmRhdGUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICBsZXQgcmVxdWVzdDogYW55ID0gdGhpcy5zdG9ja0lzc3VlU2VydmljZS5zdG9yZShkYXRhKTtcbiAgICBpZiAodGhpcy5zdG9ja0lzc3VlPy5pZCkge1xuICAgICAgcmVxdWVzdCA9IHRoaXMuc3RvY2tJc3N1ZVNlcnZpY2UudXBkYXRlKGRhdGEpO1xuICAgIH1cbiAgICByZXF1ZXN0LnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNhdmVkLmVtaXQocmVzcG9uc2U/Lml0ZW0pO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnU3RvY2sgSXNzdWFuY2UgU2F2ZWQgU3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzV29ya2luZyA9IGZhbHNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uUHJvZHVjdENoYW5nZShwcm9kdWN0OiBhbnkpIHtcbiAgICB0aGlzLnByb2R1Y3QgPSBwcm9kdWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdlIG5lZWRlZCBhIHdheSB0byBkZXRlY3Qgd2hlbiB0aGUgYmF0Y2ggZmllbGQgYW5kIGl0ZW1zIGFyZSBsb2FkZWQgdG8gdGhlblxuICAgKiBwYXRjaCB0aGUgYmF0Y2ggZmllbGQuIFNvIHdlJ2xsIHdhaXQgZm9yIHRoZSBzZWxlY3RvciB0byB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24gd2hlblxuICAgKiBkYXRhIGlzIGxvYWRlZFxuICAgKi9cbiAgb25CYXRjaEl0ZW1zQ2hhbmdlKCkge1xuICAgIC8qKlxuICAgICAqIFdlIG9ubHkgd2FudCB0byBiYXRjaCB0aGUgZGF0YSBvbmNlIHNvIHdlJ2xsIHNldCBhIGZsYWdcbiAgICAgKiB0byBwcmV2ZW50IHRoaXMgZnVuY3Rpb24gZnJvbSBydW5uaW5nIG1vcmUgdGhhbiBvbmNlXG4gICAgICovXG4gICAgaWYgKHRoaXMuc3RvY2tJc3N1ZSAmJiAhdGhpcy5pc0JhdGNoUGF0Y2hlZCkge1xuICAgICAgdGhpcy5mb3JtLmdldCgnYmF0Y2hfaWQnKT8uc2V0VmFsdWUodGhpcy5zdG9ja0lzc3VlPy5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8uYmF0Y2hfaWQpO1xuICAgICAgdGhpcy5iYXRjaFNlYXJjaGFibGVTZWxlY3Rvci5zZWxlY3RlZFZhbHVlID0gdGhpcy5zdG9ja0lzc3VlPy5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8uYmF0Y2g7XG5cbiAgICAgIHRoaXMuaXNCYXRjaFBhdGNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRCYXRjaFNlbGVjdG9yKHZhbDogbnVtYmVyLCByZXNldCA9IHRydWUpIHtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2JhdGNoX2lkJyk/LnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgdGhpcy5iYXRjaGVzQXBpVXJsID0gdmFsID8gYGFwaS9zdG9jay1yZWNlaXB0LWJhdGNoZXM/bG9jYXRpb25faWRzPSR7dmFsfWAgOiAnJztcblxuICAgIC8vIGxldCBBbmd1bGFyIGFwcGx5IHRoZSBuZXcgW2FwaVVybF0gYmluZGluZyBmaXJzdCwgdGhlbiByZWxvYWRcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmJhdGNoU2VhcmNoYWJsZVNlbGVjdG9yKSB7XG4gICAgICAgIGlmIChyZXNldCkge1xuICAgICAgICAgIHRoaXMuYmF0Y2hTZWFyY2hhYmxlU2VsZWN0b3Iuc2VsZWN0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXRjaFNlYXJjaGFibGVTZWxlY3Rvci5hcGlVcmwgPSB0aGlzLmJhdGNoZXNBcGlVcmw7XG4gICAgICAgIHRoaXMuYmF0Y2hTZWFyY2hhYmxlU2VsZWN0b3I/LnJlbG9hZERhdGEoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGgzIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyBzdG9ja0lzc3VlPy5pZCA/ICdFZGl0JyA6ICdJc3N1ZScgfX0gU3RvY2sgZm9yIHt7IHByb2R1Y3Q/Lm5hbWUgfX08L2gzPlxuPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTEganVzdGlmeS1jb250ZW50LXN0YXJ0XCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiIXByb2R1Y3RcIj5cbiAgICA8bWF0LWxhYmVsPlByb2R1Y3Q8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdF9pZFwiIGFwaVVybD1cImFwaS9wcm9kdWN0c1wiIHRpdGxlRmllbGQ9XCJuYW1lXCJcbiAgICAgIChzZWxlY3RlZFZhbHVlQ2hhbmdlKT1cIm9uUHJvZHVjdENoYW5nZSgkZXZlbnQpXCI+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJsb2NhdGlvbnNDb3VudCA+IDFcIj5cbiAgICA8bWF0LWxhYmVsPkxvY2F0aW9uPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGZvcm1Db250cm9sTmFtZT1cImxvY2F0aW9uX2lkXCIgYXBpVXJsPVwiYXBpL2ludmVudG9yeS1sb2NhdGlvbnNcIlxuICAgICAgW3NlbGVjdGVkVmFsdWVdPVwic3RvY2tJc3N1ZT8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LmxvY2F0aW9uXCI+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9jYXRpb25zQ291bnQgPiAxICYmIGZvcm0udmFsdWU/LmxvY2F0aW9uX2lkICYmIGJhdGNoZXNBcGlVcmxcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgdGVjaGxpZnlGZWF0dXJlRW5hYmxlZD1cInByb2R1Y3QtYmF0Y2gtbnVtYmVyc1wiPlxuICAgICAgPG1hdC1sYWJlbD5CYXRjaDwvbWF0LWxhYmVsPlxuICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yICNiYXRjaFNlYXJjaGFibGVTZWxlY3RvciBmb3JtQ29udHJvbE5hbWU9XCJiYXRjaF9pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwaVVybF09XCJiYXRjaGVzQXBpVXJsXCIgW2VuYWJsZVNlYXJjaF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW1zQ2hhbmdlKT1cIm9uQmF0Y2hJdGVtc0NoYW5nZSgpXCI+XG4gICAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPkRhdGU8L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwiZGF0ZVBpY2tlclwiIGZvcm1Db250cm9sTmFtZT1cImRhdGVcIiAoZm9jdXMpPVwiZGF0ZVBpY2tlci5vcGVuKClcIiAvPlxuICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZVBpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ2RhdGUnKVwiPlxuICAgICAge3sgZ2V0RXJyb3JNZXNzYWdlKCdkYXRlJykgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgPG1hdC1sYWJlbD5RdWFudGl0eTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJxdWFudGl0eVwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgLz5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdxdWFudGl0eScpXCI+XG4gICAgICB7eyBnZXRFcnJvck1lc3NhZ2UoJ3F1YW50aXR5JykgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgPG1hdC1sYWJlbD5QYXJ0aWN1bGFyczwvbWF0LWxhYmVsPlxuICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwYXJ0aWN1bGFyc1wiIHJvd3M9XCIzXCI+PC90ZXh0YXJlYT5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNXb3JraW5nXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiPlNhdmU8L2J1dHRvbj5cbiAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiAoY2xpY2spPVwiY2FuY2VsbGVkLmVtaXQoKVwiIG1hdC1mbGF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+Q2FuY2VsPC9idXR0b24+XG4gIDwvZGl2PlxuPC9mb3JtPiJdfQ==
@@ -1,48 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/material/dialog";
4
- import * as i2 from "ngx-techlify-core";
5
- import * as i3 from "@angular/router";
6
- import * as i4 from "../stock-issue-form/stock-issue-form.component";
7
- export class StockIssueFormButtonComponent {
8
- matDialog;
9
- product;
10
- stockIssueProduct;
11
- stockIssue;
12
- icon;
13
- issuableType;
14
- issuableId;
15
- saved = new EventEmitter();
16
- matDialogRef;
17
- constructor(matDialog) {
18
- this.matDialog = matDialog;
19
- }
20
- showStockIssuanceForm(templateRef) {
21
- this.matDialogRef = this.matDialog.open(templateRef, { width: '500px' });
22
- }
23
- onStockIssuanceSaved(item) {
24
- this.matDialogRef.close();
25
- this.saved.emit(item);
26
- }
27
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormButtonComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
28
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StockIssueFormButtonComponent, selector: "app-stock-issue-form-button", inputs: { product: "product", stockIssueProduct: "stockIssueProduct", stockIssue: "stockIssue", icon: "icon", issuableType: "issuableType", issuableId: "issuableId" }, outputs: { saved: "saved" }, ngImport: i0, template: "<app-techlify-icon role='button' name='edit'\n [routerLink]=\"['/inventory/stock-issues/batch-form', stockIssue?.id]\"></app-techlify-icon>\n\n<ng-template #stockIssuanceFormTemplate>\n <app-stock-issue-form mat-dialog-content [product]=\"product\" [stockIssueProduct]=\"stockIssueProduct\"\n [stockIssue]=\"stockIssue\" [issuableType]=\"issuableType\" [issuableId]=\"issuableId\" (cancelled)=\"matDialogRef.close()\"\n (saved)=\"onStockIssuanceSaved($event)\"></app-stock-issue-form>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i2.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.StockIssueFormComponent, selector: "app-stock-issue-form", inputs: ["product", "stockIssueProduct", "stockIssue", "issuableType", "issuableId"], outputs: ["saved", "cancelled"] }], preserveWhitespaces: true });
29
- }
30
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormButtonComponent, decorators: [{
31
- type: Component,
32
- args: [{ selector: 'app-stock-issue-form-button', template: "<app-techlify-icon role='button' name='edit'\n [routerLink]=\"['/inventory/stock-issues/batch-form', stockIssue?.id]\"></app-techlify-icon>\n\n<ng-template #stockIssuanceFormTemplate>\n <app-stock-issue-form mat-dialog-content [product]=\"product\" [stockIssueProduct]=\"stockIssueProduct\"\n [stockIssue]=\"stockIssue\" [issuableType]=\"issuableType\" [issuableId]=\"issuableId\" (cancelled)=\"matDialogRef.close()\"\n (saved)=\"onStockIssuanceSaved($event)\"></app-stock-issue-form>\n</ng-template>\n" }]
33
- }], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { product: [{
34
- type: Input
35
- }], stockIssueProduct: [{
36
- type: Input
37
- }], stockIssue: [{
38
- type: Input
39
- }], icon: [{
40
- type: Input
41
- }], issuableType: [{
42
- type: Input
43
- }], issuableId: [{
44
- type: Input
45
- }], saved: [{
46
- type: Output
47
- }] } });
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtZm9ybS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3RvY2staXNzdWFuY2VzL3N0b2NrLWlzc3VlLWZvcm0vc3RvY2staXNzdWUtZm9ybS1idXR0b24vc3RvY2staXNzdWUtZm9ybS1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3RvY2staXNzdWFuY2VzL3N0b2NrLWlzc3VlLWZvcm0vc3RvY2staXNzdWUtZm9ybS1idXR0b24vc3RvY2staXNzdWUtZm9ybS1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUXBGLE1BQU0sT0FBTyw2QkFBNkI7SUFhcEI7SUFaWCxPQUFPLENBQU07SUFDYixpQkFBaUIsQ0FBTTtJQUd2QixVQUFVLENBQU07SUFDaEIsSUFBSSxDQUFpQjtJQUNyQixZQUFZLENBQVU7SUFDdEIsVUFBVSxDQUFVO0lBQ25CLEtBQUssR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUU3RCxZQUFZLENBQXFCO0lBRWpDLFlBQW9CLFNBQW9CO1FBQXBCLGNBQVMsR0FBVCxTQUFTLENBQVc7SUFBSSxDQUFDO0lBRTdDLHFCQUFxQixDQUFDLFdBQTZCO1FBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVM7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO3dHQXRCVSw2QkFBNkI7NEZBQTdCLDZCQUE2Qix3UUNSMUMsZ2dCQVFBOzs0RkRBYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsNkJBQTZCOzhFQUs5QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0b2NrLWlzc3VlLWZvcm0tYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3RvY2staXNzdWUtZm9ybS1idXR0b24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RvY2tJc3N1ZUZvcm1CdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSBwcm9kdWN0OiBhbnk7XG4gIEBJbnB1dCgpIHN0b2NrSXNzdWVQcm9kdWN0OiBhbnk7XG5cblxuICBASW5wdXQoKSBzdG9ja0lzc3VlOiBhbnk7XG4gIEBJbnB1dCgpIGljb24hOiBzdHJpbmcgfCBudWxsO1xuICBASW5wdXQoKSBpc3N1YWJsZVR5cGUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzc3VhYmxlSWQhOiBudW1iZXI7XG4gIEBPdXRwdXQoKSBzYXZlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBtYXREaWFsb2dSZWYhOiBNYXREaWFsb2dSZWY8YW55PjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nKSB7IH1cblxuICBzaG93U3RvY2tJc3N1YW5jZUZvcm0odGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICB0aGlzLm1hdERpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGVSZWYsIHsgd2lkdGg6ICc1MDBweCcgfSk7XG4gIH1cblxuICBvblN0b2NrSXNzdWFuY2VTYXZlZChpdGVtOiBhbnkpIHtcbiAgICB0aGlzLm1hdERpYWxvZ1JlZi5jbG9zZSgpO1xuICAgIHRoaXMuc2F2ZWQuZW1pdChpdGVtKTtcbiAgfVxufVxuIiwiPGFwcC10ZWNobGlmeS1pY29uIHJvbGU9J2J1dHRvbicgbmFtZT0nZWRpdCdcbiAgW3JvdXRlckxpbmtdPVwiWycvaW52ZW50b3J5L3N0b2NrLWlzc3Vlcy9iYXRjaC1mb3JtJywgc3RvY2tJc3N1ZT8uaWRdXCI+PC9hcHAtdGVjaGxpZnktaWNvbj5cblxuPG5nLXRlbXBsYXRlICNzdG9ja0lzc3VhbmNlRm9ybVRlbXBsYXRlPlxuICA8YXBwLXN0b2NrLWlzc3VlLWZvcm0gbWF0LWRpYWxvZy1jb250ZW50IFtwcm9kdWN0XT1cInByb2R1Y3RcIiBbc3RvY2tJc3N1ZVByb2R1Y3RdPVwic3RvY2tJc3N1ZVByb2R1Y3RcIlxuICAgIFtzdG9ja0lzc3VlXT1cInN0b2NrSXNzdWVcIiBbaXNzdWFibGVUeXBlXT1cImlzc3VhYmxlVHlwZVwiIFtpc3N1YWJsZUlkXT1cImlzc3VhYmxlSWRcIiAoY2FuY2VsbGVkKT1cIm1hdERpYWxvZ1JlZi5jbG9zZSgpXCJcbiAgICAoc2F2ZWQpPVwib25TdG9ja0lzc3VhbmNlU2F2ZWQoJGV2ZW50KVwiPjwvYXBwLXN0b2NrLWlzc3VlLWZvcm0+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,43 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { StockIssueFormComponent } from './stock-issue-form/stock-issue-form.component';
4
- import { StockIssueFormButtonComponent } from './stock-issue-form-button/stock-issue-form-button.component';
5
- import { ReactiveFormsModule } from '@angular/forms';
6
- import { SearchableSelectorModule, TechlifyFeatureModule, TechlifyIconModule } from 'ngx-techlify-core';
7
- import { MaterialModule } from '../../material.module';
8
- import { RouterModule } from '@angular/router';
9
- import * as i0 from "@angular/core";
10
- export class StockIssueFormModule {
11
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormModule, declarations: [StockIssueFormComponent, StockIssueFormButtonComponent], imports: [CommonModule,
13
- ReactiveFormsModule,
14
- MaterialModule,
15
- SearchableSelectorModule,
16
- TechlifyFeatureModule,
17
- TechlifyIconModule,
18
- RouterModule], exports: [StockIssueFormButtonComponent] });
19
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormModule, imports: [CommonModule,
20
- ReactiveFormsModule,
21
- MaterialModule,
22
- SearchableSelectorModule,
23
- TechlifyFeatureModule,
24
- TechlifyIconModule,
25
- RouterModule] });
26
- }
27
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssueFormModule, decorators: [{
28
- type: NgModule,
29
- args: [{
30
- declarations: [StockIssueFormComponent, StockIssueFormButtonComponent],
31
- exports: [StockIssueFormButtonComponent],
32
- imports: [
33
- CommonModule,
34
- ReactiveFormsModule,
35
- MaterialModule,
36
- SearchableSelectorModule,
37
- TechlifyFeatureModule,
38
- TechlifyIconModule,
39
- RouterModule
40
- ],
41
- }]
42
- }] });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWUtZm9ybS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtZm9ybS9zdG9jay1pc3N1ZS1mb3JtLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM1RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQWUvQyxNQUFNLE9BQU8sb0JBQW9CO3dHQUFwQixvQkFBb0I7eUdBQXBCLG9CQUFvQixpQkFaaEIsdUJBQXVCLEVBQUUsNkJBQTZCLGFBR25FLFlBQVk7WUFDWixtQkFBbUI7WUFDbkIsY0FBYztZQUNkLHdCQUF3QjtZQUN4QixxQkFBcUI7WUFDckIsa0JBQWtCO1lBQ2xCLFlBQVksYUFSSiw2QkFBNkI7eUdBVzVCLG9CQUFvQixZQVQ3QixZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIscUJBQXFCO1lBQ3JCLGtCQUFrQjtZQUNsQixZQUFZOzs0RkFHSCxvQkFBb0I7a0JBYmhDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsdUJBQXVCLEVBQUUsNkJBQTZCLENBQUM7b0JBQ3RFLE9BQU8sRUFBRSxDQUFDLDZCQUE2QixDQUFDO29CQUN4QyxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2Qsd0JBQXdCO3dCQUN4QixxQkFBcUI7d0JBQ3JCLGtCQUFrQjt3QkFDbEIsWUFBWTtxQkFDYjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3RvY2tJc3N1ZUZvcm1Db21wb25lbnQgfSBmcm9tICcuL3N0b2NrLWlzc3VlLWZvcm0vc3RvY2staXNzdWUtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RvY2tJc3N1ZUZvcm1CdXR0b25Db21wb25lbnQgfSBmcm9tICcuL3N0b2NrLWlzc3VlLWZvcm0tYnV0dG9uL3N0b2NrLWlzc3VlLWZvcm0tYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtTZWFyY2hhYmxlU2VsZWN0b3JNb2R1bGUsIFRlY2hsaWZ5RmVhdHVyZU1vZHVsZSwgVGVjaGxpZnlJY29uTW9kdWxlfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBNYXRlcmlhbE1vZHVsZSB9IGZyb20gJy4uLy4uL21hdGVyaWFsLm1vZHVsZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtTdG9ja0lzc3VlRm9ybUNvbXBvbmVudCwgU3RvY2tJc3N1ZUZvcm1CdXR0b25Db21wb25lbnRdLFxuICBleHBvcnRzOiBbU3RvY2tJc3N1ZUZvcm1CdXR0b25Db21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0ZXJpYWxNb2R1bGUsXG4gICAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICAgIFRlY2hsaWZ5RmVhdHVyZU1vZHVsZSxcbiAgICBUZWNobGlmeUljb25Nb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFN0b2NrSXNzdWVGb3JtTW9kdWxlIHt9XG4iXX0=