techlify-inventory-common 18.1.0 → 18.2.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 (53) hide show
  1. package/esm2022/lib/inventory-common/inventory-common-routing.module.mjs +11 -1
  2. package/esm2022/lib/inventory-common/inventory-common.module.mjs +8 -4
  3. package/esm2022/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.mjs +10 -8
  4. package/esm2022/lib/inventory-common/inventory-value-report.service.mjs +21 -0
  5. package/esm2022/lib/inventory-common/low-stock-report.service.mjs +23 -0
  6. package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.mjs +9 -7
  7. package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +3 -3
  8. package/esm2022/lib/inventory-common/product/product-quick-search/product-quick-search.component.mjs +92 -0
  9. package/esm2022/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.mjs +18 -0
  10. package/esm2022/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.mjs +170 -0
  11. package/esm2022/lib/inventory-common/reports/low-stock-report/low-stock-report.component.mjs +165 -0
  12. package/esm2022/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.mjs +64 -0
  13. package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form-button/supplier-form-button.component.mjs +43 -0
  14. package/esm2022/lib/inventory-common/supplier/supplier.module.mjs +11 -3
  15. package/esm2022/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.mjs +6 -65
  16. package/fesm2022/{techlify-inventory-common-category.module-CNm2bEsx.mjs → techlify-inventory-common-category.module-BKEBFEeZ.mjs} +9 -9
  17. package/fesm2022/{techlify-inventory-common-category.module-CNm2bEsx.mjs.map → techlify-inventory-common-category.module-BKEBFEeZ.mjs.map} +1 -1
  18. package/fesm2022/{techlify-inventory-common-measure.module-BEaRHh5Z.mjs → techlify-inventory-common-measure.module-CZHhYoQd.mjs} +9 -9
  19. package/fesm2022/{techlify-inventory-common-measure.module-BEaRHh5Z.mjs.map → techlify-inventory-common-measure.module-CZHhYoQd.mjs.map} +1 -1
  20. package/fesm2022/{techlify-inventory-common-stock-issuances.module-BQRRP-hW.mjs → techlify-inventory-common-stock-issuances.module-BjPbzqUW.mjs} +2 -4
  21. package/fesm2022/{techlify-inventory-common-stock-issuances.module-BQRRP-hW.mjs.map → techlify-inventory-common-stock-issuances.module-BjPbzqUW.mjs.map} +1 -1
  22. package/fesm2022/{techlify-inventory-common-supplier.module-Bwa7gx14.mjs → techlify-inventory-common-supplier.module-CFDwJ-TS.mjs} +251 -218
  23. package/fesm2022/techlify-inventory-common-supplier.module-CFDwJ-TS.mjs.map +1 -0
  24. package/fesm2022/techlify-inventory-common-techlify-inventory-common-CYiCJfk9.mjs +3143 -0
  25. package/fesm2022/techlify-inventory-common-techlify-inventory-common-CYiCJfk9.mjs.map +1 -0
  26. package/fesm2022/techlify-inventory-common.mjs +1 -1
  27. package/lib/inventory-common/inventory-common.module.d.ts +2 -1
  28. package/lib/inventory-common/inventory-value-report.service.d.ts +9 -0
  29. package/lib/inventory-common/low-stock-report.service.d.ts +10 -0
  30. package/lib/inventory-common/product/product-quick-search/product-quick-search.component.d.ts +15 -0
  31. package/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.d.ts +6 -0
  32. package/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.d.ts +26 -0
  33. package/lib/inventory-common/reports/low-stock-report/low-stock-report.component.d.ts +26 -0
  34. package/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.d.ts +18 -0
  35. package/lib/inventory-common/supplier/supplier-form/supplier-form-button/supplier-form-button.component.d.ts +13 -0
  36. package/lib/inventory-common/supplier/supplier.module.d.ts +3 -1
  37. package/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.d.ts +0 -8
  38. package/package.json +1 -1
  39. package/fesm2022/techlify-inventory-common-product.module-BV9Cy88x.mjs +0 -1168
  40. package/fesm2022/techlify-inventory-common-product.module-BV9Cy88x.mjs.map +0 -1
  41. package/fesm2022/techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs +0 -436
  42. package/fesm2022/techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs.map +0 -1
  43. package/fesm2022/techlify-inventory-common-stock-receipt-form.module-DND0GNlf.mjs +0 -302
  44. package/fesm2022/techlify-inventory-common-stock-receipt-form.module-DND0GNlf.mjs.map +0 -1
  45. package/fesm2022/techlify-inventory-common-stock-receipts.module-BvYaKITT.mjs +0 -253
  46. package/fesm2022/techlify-inventory-common-stock-receipts.module-BvYaKITT.mjs.map +0 -1
  47. package/fesm2022/techlify-inventory-common-supplier-form.component-DVBnhiyH.mjs +0 -177
  48. package/fesm2022/techlify-inventory-common-supplier-form.component-DVBnhiyH.mjs.map +0 -1
  49. package/fesm2022/techlify-inventory-common-supplier.module-Bwa7gx14.mjs.map +0 -1
  50. package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs +0 -14
  51. package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs.map +0 -1
  52. package/fesm2022/techlify-inventory-common-techlify-inventory-common-GFYF7JCA.mjs +0 -495
  53. package/fesm2022/techlify-inventory-common-techlify-inventory-common-GFYF7JCA.mjs.map +0 -1
@@ -1,436 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Output, Input, Component, NgModule } from '@angular/core';
3
- import * as i4 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import * as i1 from 'ngx-techlify-core';
6
- import { TechlifyServiceBaseClass, TechlifyFormComponentInterface, TechlifyListingControllerInterface, Timeline, SearchableSelectorModule, MaterialModule } from 'ngx-techlify-core';
7
- import { debounceTime } from 'rxjs';
8
- import * as i2 from '@angular/forms';
9
- import { Validators, ReactiveFormsModule } from '@angular/forms';
10
- import * as i5 from '@angular/material/sort';
11
- import * as i6$1 from '@angular/material/table';
12
- import * as i3 from '@angular/material/card';
13
- import * as i7$2 from '@angular/material/progress-bar';
14
- import { MatProgressBarModule } from '@angular/material/progress-bar';
15
- import { T as TechlifyFilterComponent, a as TechlifyFilterModule } from './techlify-inventory-common-techlify-inventory-common-GFYF7JCA.mjs';
16
- import * as i1$1 from '@angular/material/dialog';
17
- import { MatDialogModule } from '@angular/material/dialog';
18
- import * as i2$1 from '@angular/material/tooltip';
19
- import { MatTooltipModule } from '@angular/material/tooltip';
20
- import * as i6 from '@angular/material/form-field';
21
- import { MatFormFieldModule } from '@angular/material/form-field';
22
- import * as i7 from '@angular/material/input';
23
- import { MatInputModule } from '@angular/material/input';
24
- import * as i9 from '@angular/material/datepicker';
25
- import { MatDatepickerModule } from '@angular/material/datepicker';
26
- import * as i7$1 from '@angular/material/button';
27
- import { MatButtonModule } from '@angular/material/button';
28
- import * as i10 from 'ngx-infinite-scroll';
29
- import { InfiniteScrollModule } from 'ngx-infinite-scroll';
30
- import * as i2$2 from '@angular/router';
31
- import { RouterModule } from '@angular/router';
32
-
33
- class StockIssuanceService extends TechlifyServiceBaseClass {
34
- constructor(httpService) {
35
- super(httpService, "stock-issuances");
36
- }
37
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceService, deps: [{ token: i1.HttpService }], target: i0.ɵɵFactoryTarget.Injectable });
38
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceService, providedIn: "root" });
39
- }
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceService, decorators: [{
41
- type: Injectable,
42
- args: [{
43
- providedIn: "root",
44
- }]
45
- }], ctorParameters: () => [{ type: i1.HttpService }] });
46
-
47
- class StockIssueFormComponent extends TechlifyFormComponentInterface {
48
- formBuilder;
49
- stockIssuanceService;
50
- alertService;
51
- dateUtils;
52
- product;
53
- stockIssuance;
54
- issuableType;
55
- issuableId;
56
- saved = new EventEmitter();
57
- cancelled = new EventEmitter();
58
- isWorking;
59
- constructor(formValidatorService, formBuilder, stockIssuanceService, alertService, dateUtils) {
60
- super(formValidatorService);
61
- this.formBuilder = formBuilder;
62
- this.stockIssuanceService = stockIssuanceService;
63
- this.alertService = alertService;
64
- this.dateUtils = dateUtils;
65
- this.errorMessages = {
66
- date: {
67
- required: "The date field is required.",
68
- },
69
- quantity: {
70
- required: "The quantity field is required.",
71
- },
72
- };
73
- this.form = this.formBuilder.group({
74
- id: [""],
75
- product_id: [""],
76
- date: [new Date(), Validators.required],
77
- quantity: [1, Validators.required],
78
- particulars: [""],
79
- });
80
- }
81
- ngOnInit() {
82
- if (this.product) {
83
- this.form.get("product_id")?.setValue(this.product?.id);
84
- }
85
- if (this.stockIssuance) {
86
- let data = { ...this.stockIssuance };
87
- if (data.date) {
88
- data.date = new Date(data.date);
89
- }
90
- this.form.patchValue(data);
91
- }
92
- else {
93
- // on create for set default quantity from last record
94
- if (this.product?.last_stock_issuance) {
95
- const { quantity } = this.product.last_stock_issuance;
96
- this.form.patchValue({
97
- quantity,
98
- });
99
- }
100
- }
101
- }
102
- save() {
103
- if (this.form.invalid) {
104
- this.alertService.addAlert("Please check the form for errors", "error");
105
- return;
106
- }
107
- const data = {
108
- product_id: this.product?.id,
109
- ...this.form.value,
110
- };
111
- if (data.date) {
112
- data.date = this.dateUtils.getYYYYMMDDString(data.date);
113
- }
114
- if (this.issuableId && this.issuableType) {
115
- data.issuable_type = this.issuableType;
116
- data.issuable_id = this.issuableId;
117
- }
118
- this.isWorking = true;
119
- let request = this.stockIssuanceService.store(data);
120
- if (this.stockIssuance?.id) {
121
- request = this.stockIssuanceService.update(data);
122
- }
123
- request.subscribe({
124
- next: (response) => {
125
- this.isWorking = false;
126
- this.saved.emit(response?.item);
127
- this.alertService.addAlert("Stock Issuance Saved Successfully!", "success");
128
- },
129
- error: () => (this.isWorking = false),
130
- });
131
- }
132
- onProductChange(product) {
133
- this.product = product;
134
- }
135
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.FormBuilder }, { token: StockIssuanceService }, { token: i1.AlertService }, { token: i1.DateUtils }], target: i0.ɵɵFactoryTarget.Component });
136
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StockIssueFormComponent, selector: "app-stock-issue-form", inputs: { product: "product", stockIssuance: "stockIssuance", issuableType: "issuableType", issuableId: "issuableId" }, outputs: { saved: "saved", cancelled: "cancelled" }, usesInheritance: true, ngImport: i0, template: "<h3 class=\"text-center\">\n {{ stockIssuance?.id ? \"Edit\" : \"Issue\" }} Stock for {{ product?.name }}\n</h3>\n<form\n [formGroup]=\"form\"\n class=\"d-flex flex-column gap-1 justify-content-start\"\n (submit)=\"save()\"\n>\n <mat-form-field *ngIf=\"!product\">\n <mat-label>Product</mat-label>\n <app-searchable-selector\n formControlName=\"product_id\"\n apiUrl=\"api/products\"\n titleField=\"name\"\n (selectedValueChange)=\"onProductChange($event)\"\n ></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input\n matInput\n [matDatepicker]=\"datePicker\"\n formControlName=\"date\"\n (focus)=\"datePicker.open()\"\n />\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\n [disabled]=\"isWorking\"\n mat-raised-button\n color=\"primary\"\n type=\"submit\"\n >\n Save\n </button>\n <button\n [disabled]=\"isWorking\"\n (click)=\"cancelled.emit()\"\n mat-flat-button\n type=\"button\"\n >\n Cancel\n </button>\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.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.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: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { 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: "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: i7$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { 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"] }], preserveWhitespaces: true });
137
- }
138
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormComponent, decorators: [{
139
- type: Component,
140
- args: [{ selector: "app-stock-issue-form", template: "<h3 class=\"text-center\">\n {{ stockIssuance?.id ? \"Edit\" : \"Issue\" }} Stock for {{ product?.name }}\n</h3>\n<form\n [formGroup]=\"form\"\n class=\"d-flex flex-column gap-1 justify-content-start\"\n (submit)=\"save()\"\n>\n <mat-form-field *ngIf=\"!product\">\n <mat-label>Product</mat-label>\n <app-searchable-selector\n formControlName=\"product_id\"\n apiUrl=\"api/products\"\n titleField=\"name\"\n (selectedValueChange)=\"onProductChange($event)\"\n ></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input\n matInput\n [matDatepicker]=\"datePicker\"\n formControlName=\"date\"\n (focus)=\"datePicker.open()\"\n />\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\n [disabled]=\"isWorking\"\n mat-raised-button\n color=\"primary\"\n type=\"submit\"\n >\n Save\n </button>\n <button\n [disabled]=\"isWorking\"\n (click)=\"cancelled.emit()\"\n mat-flat-button\n type=\"button\"\n >\n Cancel\n </button>\n </div>\n</form>\n" }]
141
- }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.FormBuilder }, { type: StockIssuanceService }, { type: i1.AlertService }, { type: i1.DateUtils }], propDecorators: { product: [{
142
- type: Input
143
- }], stockIssuance: [{
144
- type: Input
145
- }], issuableType: [{
146
- type: Input
147
- }], issuableId: [{
148
- type: Input
149
- }], saved: [{
150
- type: Output
151
- }], cancelled: [{
152
- type: Output
153
- }] } });
154
-
155
- class StockIssueFormButtonComponent {
156
- matDialog;
157
- product;
158
- stockIssuance;
159
- icon;
160
- issuableType;
161
- issuableId;
162
- saved = new EventEmitter();
163
- matDialogRef;
164
- constructor(matDialog) {
165
- this.matDialog = matDialog;
166
- }
167
- showStockIssuanceForm(templateRef) {
168
- this.matDialogRef = this.matDialog.open(templateRef, { width: "500px" });
169
- }
170
- onStockIssuanceSaved(item) {
171
- this.matDialogRef.close();
172
- this.saved.emit(item);
173
- }
174
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormButtonComponent, deps: [{ token: i1$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
175
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StockIssueFormButtonComponent, selector: "app-stock-issue-form-button", inputs: { product: "product", stockIssuance: "stockIssuance", icon: "icon", issuableType: "issuableType", issuableId: "issuableId" }, outputs: { saved: "saved" }, ngImport: i0, template: "<span\n class=\"material-symbols-outlined cursor-pointer\"\n [class.text-primary]=\"icon\"\n matTooltip=\"Stock Issuance\"\n (click)=\"showStockIssuanceForm(stockIssuanceFormTemplate)\"\n>\n {{ stockIssuance ? \"edit\" : icon ?? \"upload\" }}\n</span>\n\n<ng-template #stockIssuanceFormTemplate>\n <app-stock-issue-form\n mat-dialog-content\n [product]=\"product\"\n [stockIssuance]=\"stockIssuance\"\n [issuableType]=\"issuableType\"\n [issuableId]=\"issuableId\"\n (cancelled)=\"matDialogRef.close()\"\n (saved)=\"onStockIssuanceSaved($event)\"\n ></app-stock-issue-form>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: StockIssueFormComponent, selector: "app-stock-issue-form", inputs: ["product", "stockIssuance", "issuableType", "issuableId"], outputs: ["saved", "cancelled"] }], preserveWhitespaces: true });
176
- }
177
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormButtonComponent, decorators: [{
178
- type: Component,
179
- args: [{ selector: "app-stock-issue-form-button", template: "<span\n class=\"material-symbols-outlined cursor-pointer\"\n [class.text-primary]=\"icon\"\n matTooltip=\"Stock Issuance\"\n (click)=\"showStockIssuanceForm(stockIssuanceFormTemplate)\"\n>\n {{ stockIssuance ? \"edit\" : icon ?? \"upload\" }}\n</span>\n\n<ng-template #stockIssuanceFormTemplate>\n <app-stock-issue-form\n mat-dialog-content\n [product]=\"product\"\n [stockIssuance]=\"stockIssuance\"\n [issuableType]=\"issuableType\"\n [issuableId]=\"issuableId\"\n (cancelled)=\"matDialogRef.close()\"\n (saved)=\"onStockIssuanceSaved($event)\"\n ></app-stock-issue-form>\n</ng-template>\n" }]
180
- }], ctorParameters: () => [{ type: i1$1.MatDialog }], propDecorators: { product: [{
181
- type: Input
182
- }], stockIssuance: [{
183
- type: Input
184
- }], icon: [{
185
- type: Input
186
- }], issuableType: [{
187
- type: Input
188
- }], issuableId: [{
189
- type: Input
190
- }], saved: [{
191
- type: Output
192
- }] } });
193
-
194
- class StockIssuanceDeleteButtonComponent {
195
- matDialog;
196
- stockIssuanceService;
197
- alertService;
198
- stockIssuance;
199
- deleted = new EventEmitter();
200
- isDeleting = false;
201
- constructor(matDialog, stockIssuanceService, alertService) {
202
- this.matDialog = matDialog;
203
- this.stockIssuanceService = stockIssuanceService;
204
- this.alertService = alertService;
205
- }
206
- showDeleteConfirmModel(templateRef) {
207
- this.matDialog.open(templateRef, { width: "400px" });
208
- }
209
- delete() {
210
- this.isDeleting = true;
211
- this.stockIssuanceService.delete(this.stockIssuance).subscribe({
212
- next: () => {
213
- this.matDialog.closeAll();
214
- this.isDeleting = false;
215
- this.deleted.emit();
216
- this.alertService.addAlert("Stock Issuance deleted successfully!", "success");
217
- },
218
- error: () => {
219
- this.isDeleting = false;
220
- },
221
- });
222
- }
223
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonComponent, deps: [{ token: i1$1.MatDialog }, { token: StockIssuanceService }, { token: i1.AlertService }], target: i0.ɵɵFactoryTarget.Component });
224
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StockIssuanceDeleteButtonComponent, selector: "app-stock-issuance-delete-button", inputs: { stockIssuance: "stockIssuance" }, outputs: { deleted: "deleted" }, ngImport: i0, template: "<span\n class=\"material-symbols-outlined cursor-pointer\"\n (click)=\"showDeleteConfirmModel(deleteModelTemplate)\"\n>\n delete\n</span>\n\n<ng-template #deleteModelTemplate>\n <h3 mat-dialog-title>Delete Stock Issuance</h3>\n <div mat-dialog-content>\n <p>Are you sure you want to delete the stock issuance record?</p>\n </div>\n <div mat-dialog-actions class=\"d-flex justify-content-end gap-2\">\n <button\n [disabled]=\"isDeleting\"\n mat-raised-button\n type=\"button\"\n color=\"warn\"\n (click)=\"delete()\"\n >\n Delete\n </button>\n <button\n [disabled]=\"isDeleting\"\n mat-flat-button\n mat-dialog-close\n type=\"button\"\n >\n Cancel\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "component", type: i7$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }], preserveWhitespaces: true });
225
- }
226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonComponent, decorators: [{
227
- type: Component,
228
- args: [{ selector: "app-stock-issuance-delete-button", template: "<span\n class=\"material-symbols-outlined cursor-pointer\"\n (click)=\"showDeleteConfirmModel(deleteModelTemplate)\"\n>\n delete\n</span>\n\n<ng-template #deleteModelTemplate>\n <h3 mat-dialog-title>Delete Stock Issuance</h3>\n <div mat-dialog-content>\n <p>Are you sure you want to delete the stock issuance record?</p>\n </div>\n <div mat-dialog-actions class=\"d-flex justify-content-end gap-2\">\n <button\n [disabled]=\"isDeleting\"\n mat-raised-button\n type=\"button\"\n color=\"warn\"\n (click)=\"delete()\"\n >\n Delete\n </button>\n <button\n [disabled]=\"isDeleting\"\n mat-flat-button\n mat-dialog-close\n type=\"button\"\n >\n Cancel\n </button>\n </div>\n</ng-template>\n" }]
229
- }], ctorParameters: () => [{ type: i1$1.MatDialog }, { type: StockIssuanceService }, { type: i1.AlertService }], propDecorators: { stockIssuance: [{
230
- type: Input
231
- }], deleted: [{
232
- type: Output
233
- }] } });
234
-
235
- class StockIssuancesListComponent extends TechlifyListingControllerInterface {
236
- formBuilder;
237
- requestHelperService;
238
- stockIssuanceService;
239
- product;
240
- issuableType;
241
- issuableId;
242
- label = "Stock Issuances";
243
- listUpdated = new EventEmitter();
244
- filterConfig = {
245
- duration: {
246
- label: "Date",
247
- },
248
- search: {
249
- placeholder: "Search Product Name, SKU, Description, etc",
250
- },
251
- };
252
- displayedColumns = [
253
- "no",
254
- "product",
255
- "date",
256
- "quantity",
257
- "related",
258
- "particulars",
259
- "creator",
260
- "actions",
261
- ];
262
- constructor(formBuilder, requestHelperService, stockIssuanceService) {
263
- super();
264
- this.formBuilder = formBuilder;
265
- this.requestHelperService = requestHelperService;
266
- this.stockIssuanceService = stockIssuanceService;
267
- this.lastPage = 0;
268
- this.filterForm = this.formBuilder.group({
269
- duration: [Timeline.THIS_MONTH],
270
- date_from: [""],
271
- date_to: [""],
272
- measure_ids: [""],
273
- product_ids: [""],
274
- search: [""],
275
- sort_by: ["date|desc"],
276
- });
277
- }
278
- ngOnInit() {
279
- this.filterForm.valueChanges
280
- .pipe(debounceTime(500))
281
- .subscribe({
282
- next: () => this.reload(),
283
- });
284
- if (this.product) {
285
- this.filterForm.get("product_ids")?.setValue(this.product?.id);
286
- const index = this.displayedColumns.indexOf("product");
287
- if (index !== -1) {
288
- this.displayedColumns.splice(index, 1);
289
- }
290
- }
291
- }
292
- loadData() {
293
- const params = {
294
- page: this.page,
295
- perPage: this.perPage,
296
- with: "creator,product.measure,issuable.fixedAsset",
297
- ...this.requestHelperService.convertToFormData(this.filterForm.value),
298
- };
299
- if (this.issuableId && this.issuableType) {
300
- params.issuable_ids = this.issuableId;
301
- params.issuable_types = this.issuableType;
302
- }
303
- this.isWorking = true;
304
- this.stockIssuanceService.index(params).subscribe({
305
- next: (response) => {
306
- this.models = this.models.concat(response?.data);
307
- this.lastPage = response?.last_page;
308
- this.isWorking = false;
309
- },
310
- error: () => {
311
- this.isWorking = false;
312
- },
313
- });
314
- }
315
- onSortChange(sort) {
316
- let { active, direction } = sort;
317
- if (!active) {
318
- active = "date";
319
- }
320
- if (!direction) {
321
- direction = "desc";
322
- active = "date";
323
- }
324
- this.filterForm.get("sort_by").setValue(active + "|" + direction);
325
- }
326
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuancesListComponent, deps: [{ token: i2.FormBuilder }, { token: i1.RequestHelperService }, { token: StockIssuanceService }], target: i0.ɵɵFactoryTarget.Component });
327
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StockIssuancesListComponent, selector: "app-stock-issuances-list", inputs: { product: "product", issuableType: "issuableType", issuableId: "issuableId", label: "label" }, outputs: { listUpdated: "listUpdated" }, usesInheritance: true, ngImport: i0, template: "<mat-card *ngIf=\"!product\" class=\"mb-2\">\n <mat-card-content\n class=\"d-flex justify-content-between align-items-center gap-3\"\n >\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\n icon=\"add\"\n [issuableType]=\"issuableType\"\n [issuableId]=\"issuableId\"\n (saved)=\"reload()\"\n ></app-stock-issue-form-button>\n </div>\n\n <app-techlify-filter\n [filterForm]=\"filterForm\"\n [filterConfig]=\"filterConfig\"\n (filterUpdated)=\"reload()\"\n ></app-techlify-filter>\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 Issuances</h3>\n\n <app-stock-issue-form-button\n [product]=\"product\"\n icon=\"add\"\n (saved)=\"reload(); listUpdated.emit()\"\n ></app-stock-issue-form-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n aria-describedby=\"Stock Issuances\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n >\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 <a\n [routerLink]=\"[\n '/inventory/products/',\n element?.product?.id,\n 'view'\n ]\"\n >\n {{ element?.product?.name }}\n </a>\n </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 <!-- Related Column -->\n <ng-container matColumnDef=\"related\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Related</th>\n <td mat-cell *matCellDef=\"let element\">\n <a\n class=\"text-dark\"\n *ngIf=\"element?.issuable\"\n [routerLink]=\"['/maintenances', element?.issuable_id, 'view']\"\n >\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\">\n {{ element?.quantity }} {{ element?.product?.measure?.title }}\n </td>\n </ng-container>\n\n <!-- Purchase Price Column -->\n <ng-container matColumnDef=\"purchase_price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n Purchase Price\n </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?.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 class=\"d-flex gap-1\">\n <app-stock-issue-form-button\n [product]=\"element.product\"\n [stockIssuance]=\"element\"\n (saved)=\"reload(); listUpdated.emit()\"\n ></app-stock-issue-form-button>\n <app-stock-issuance-delete-button\n [stockIssuance]=\"element\"\n (deleted)=\"reload(); listUpdated.emit()\"\n ></app-stock-issuance-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i6$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i7$2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: TechlifyFilterComponent, selector: "app-techlify-filter", inputs: ["filterForm", "filterConfig"], outputs: ["filterUpdated"] }, { kind: "component", type: StockIssueFormButtonComponent, selector: "app-stock-issue-form-button", inputs: ["product", "stockIssuance", "icon", "issuableType", "issuableId"], outputs: ["saved"] }, { kind: "directive", type: i10.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: StockIssuanceDeleteButtonComponent, selector: "app-stock-issuance-delete-button", inputs: ["stockIssuance"], outputs: ["deleted"] }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i4.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i4.DatePipe, name: "date" }], preserveWhitespaces: true });
328
- }
329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuancesListComponent, decorators: [{
330
- type: Component,
331
- args: [{ selector: "app-stock-issuances-list", template: "<mat-card *ngIf=\"!product\" class=\"mb-2\">\n <mat-card-content\n class=\"d-flex justify-content-between align-items-center gap-3\"\n >\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\n icon=\"add\"\n [issuableType]=\"issuableType\"\n [issuableId]=\"issuableId\"\n (saved)=\"reload()\"\n ></app-stock-issue-form-button>\n </div>\n\n <app-techlify-filter\n [filterForm]=\"filterForm\"\n [filterConfig]=\"filterConfig\"\n (filterUpdated)=\"reload()\"\n ></app-techlify-filter>\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 Issuances</h3>\n\n <app-stock-issue-form-button\n [product]=\"product\"\n icon=\"add\"\n (saved)=\"reload(); listUpdated.emit()\"\n ></app-stock-issue-form-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n aria-describedby=\"Stock Issuances\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n >\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 <a\n [routerLink]=\"[\n '/inventory/products/',\n element?.product?.id,\n 'view'\n ]\"\n >\n {{ element?.product?.name }}\n </a>\n </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 <!-- Related Column -->\n <ng-container matColumnDef=\"related\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Related</th>\n <td mat-cell *matCellDef=\"let element\">\n <a\n class=\"text-dark\"\n *ngIf=\"element?.issuable\"\n [routerLink]=\"['/maintenances', element?.issuable_id, 'view']\"\n >\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\">\n {{ element?.quantity }} {{ element?.product?.measure?.title }}\n </td>\n </ng-container>\n\n <!-- Purchase Price Column -->\n <ng-container matColumnDef=\"purchase_price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n Purchase Price\n </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?.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 class=\"d-flex gap-1\">\n <app-stock-issue-form-button\n [product]=\"element.product\"\n [stockIssuance]=\"element\"\n (saved)=\"reload(); listUpdated.emit()\"\n ></app-stock-issue-form-button>\n <app-stock-issuance-delete-button\n [stockIssuance]=\"element\"\n (deleted)=\"reload(); listUpdated.emit()\"\n ></app-stock-issuance-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n" }]
332
- }], ctorParameters: () => [{ type: i2.FormBuilder }, { type: i1.RequestHelperService }, { type: StockIssuanceService }], propDecorators: { product: [{
333
- type: Input
334
- }], issuableType: [{
335
- type: Input
336
- }], issuableId: [{
337
- type: Input
338
- }], label: [{
339
- type: Input
340
- }], listUpdated: [{
341
- type: Output
342
- }] } });
343
-
344
- class StockIssueFormModule {
345
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
346
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormModule, declarations: [StockIssueFormComponent, StockIssueFormButtonComponent], imports: [CommonModule,
347
- ReactiveFormsModule,
348
- MatFormFieldModule,
349
- MatInputModule,
350
- MatDatepickerModule,
351
- MatButtonModule,
352
- MatDialogModule,
353
- MatTooltipModule,
354
- SearchableSelectorModule], exports: [StockIssueFormButtonComponent] });
355
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormModule, imports: [CommonModule,
356
- ReactiveFormsModule,
357
- MatFormFieldModule,
358
- MatInputModule,
359
- MatDatepickerModule,
360
- MatButtonModule,
361
- MatDialogModule,
362
- MatTooltipModule,
363
- SearchableSelectorModule] });
364
- }
365
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssueFormModule, decorators: [{
366
- type: NgModule,
367
- args: [{
368
- declarations: [StockIssueFormComponent, StockIssueFormButtonComponent],
369
- exports: [StockIssueFormButtonComponent],
370
- imports: [
371
- CommonModule,
372
- ReactiveFormsModule,
373
- MatFormFieldModule,
374
- MatInputModule,
375
- MatDatepickerModule,
376
- MatButtonModule,
377
- MatDialogModule,
378
- MatTooltipModule,
379
- SearchableSelectorModule,
380
- ],
381
- }]
382
- }] });
383
-
384
- class StockIssuanceDeleteButtonModule {
385
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
386
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonModule, declarations: [StockIssuanceDeleteButtonComponent], imports: [CommonModule, MaterialModule], exports: [StockIssuanceDeleteButtonComponent] });
387
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonModule, imports: [CommonModule, MaterialModule] });
388
- }
389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuanceDeleteButtonModule, decorators: [{
390
- type: NgModule,
391
- args: [{
392
- declarations: [StockIssuanceDeleteButtonComponent],
393
- imports: [CommonModule, MaterialModule],
394
- exports: [StockIssuanceDeleteButtonComponent],
395
- }]
396
- }] });
397
-
398
- class StockIssuancesListModule {
399
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuancesListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
400
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: StockIssuancesListModule, declarations: [StockIssuancesListComponent], imports: [CommonModule,
401
- MaterialModule,
402
- TechlifyFilterModule,
403
- StockIssueFormModule,
404
- InfiniteScrollModule,
405
- StockIssuanceDeleteButtonModule,
406
- MatProgressBarModule,
407
- RouterModule], exports: [StockIssuancesListComponent] });
408
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuancesListModule, imports: [CommonModule,
409
- MaterialModule,
410
- TechlifyFilterModule,
411
- StockIssueFormModule,
412
- InfiniteScrollModule,
413
- StockIssuanceDeleteButtonModule,
414
- MatProgressBarModule,
415
- RouterModule] });
416
- }
417
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StockIssuancesListModule, decorators: [{
418
- type: NgModule,
419
- args: [{
420
- declarations: [StockIssuancesListComponent],
421
- imports: [
422
- CommonModule,
423
- MaterialModule,
424
- TechlifyFilterModule,
425
- StockIssueFormModule,
426
- InfiniteScrollModule,
427
- StockIssuanceDeleteButtonModule,
428
- MatProgressBarModule,
429
- RouterModule,
430
- ],
431
- exports: [StockIssuancesListComponent],
432
- }]
433
- }] });
434
-
435
- export { StockIssuancesListComponent as S, StockIssueFormModule as a, StockIssuancesListModule as b, StockIssueFormButtonComponent as c };
436
- //# sourceMappingURL=techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs","sources":["../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issuance.service.ts","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.ts","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.html","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.ts","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.html","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.ts","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.html","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.ts","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.html","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.ts","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.ts","../../../projects/inventory-common/src/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\nimport { HttpService, TechlifyServiceBaseClass } from \"ngx-techlify-core\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class StockIssuanceService extends TechlifyServiceBaseClass {\n constructor(httpService: HttpService) {\n super(httpService, \"stock-issuances\");\n }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\nimport {\n AlertService,\n DateUtils,\n FormValidatorService,\n TechlifyFormComponentInterface,\n} from \"ngx-techlify-core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { Observable } from \"rxjs\";\nimport { StockIssuanceService } from \"../../stock-issuance.service\";\n\n@Component({\n selector: \"app-stock-issue-form\",\n templateUrl: \"./stock-issue-form.component.html\",\n styleUrls: [\"./stock-issue-form.component.scss\"],\n})\nexport class StockIssueFormComponent\n extends TechlifyFormComponentInterface\n implements OnInit\n{\n @Input() product: any;\n @Input() stockIssuance: any;\n @Input() issuableType!: string;\n @Input() issuableId!: number;\n @Output() saved: EventEmitter<any> = new EventEmitter<any>();\n @Output() cancelled: EventEmitter<any> = new EventEmitter<any>();\n\n isWorking!: boolean;\n\n constructor(\n formValidatorService: FormValidatorService,\n private formBuilder: FormBuilder,\n private stockIssuanceService: StockIssuanceService,\n private alertService: AlertService,\n private dateUtils: DateUtils\n ) {\n super(formValidatorService);\n this.errorMessages = {\n date: {\n required: \"The date field is required.\",\n },\n quantity: {\n required: \"The quantity field is required.\",\n },\n };\n\n this.form = this.formBuilder.group({\n id: [\"\"],\n product_id: [\"\"],\n date: [new Date(), Validators.required],\n quantity: [1, Validators.required],\n particulars: [\"\"],\n });\n }\n\n ngOnInit() {\n if (this.product) {\n this.form.get(\"product_id\")?.setValue(this.product?.id);\n }\n if (this.stockIssuance) {\n let data: any = { ...this.stockIssuance };\n if (data.date) {\n data.date = new Date(data.date);\n }\n this.form.patchValue(data);\n } else {\n // on create for set default quantity from last record\n if (this.product?.last_stock_issuance) {\n const { quantity } = this.product.last_stock_issuance;\n this.form.patchValue({\n quantity,\n });\n }\n }\n }\n\n save() {\n if (this.form.invalid) {\n this.alertService.addAlert(\"Please check the form for errors\", \"error\");\n return;\n }\n const data: any = {\n product_id: this.product?.id,\n ...this.form.value,\n };\n if (data.date) {\n data.date = this.dateUtils.getYYYYMMDDString(data.date);\n }\n if (this.issuableId && this.issuableType) {\n data.issuable_type = this.issuableType;\n data.issuable_id = this.issuableId;\n }\n\n this.isWorking = true;\n let request: Observable<any> = this.stockIssuanceService.store(data);\n if (this.stockIssuance?.id) {\n request = this.stockIssuanceService.update(data);\n }\n request.subscribe({\n next: (response: any) => {\n this.isWorking = false;\n this.saved.emit(response?.item);\n this.alertService.addAlert(\n \"Stock Issuance Saved Successfully!\",\n \"success\"\n );\n },\n error: () => (this.isWorking = false),\n });\n }\n\n onProductChange(product: any) {\n this.product = product;\n }\n}\n","<h3 class=\"text-center\">\n {{ stockIssuance?.id ? \"Edit\" : \"Issue\" }} Stock for {{ product?.name }}\n</h3>\n<form\n [formGroup]=\"form\"\n class=\"d-flex flex-column gap-1 justify-content-start\"\n (submit)=\"save()\"\n>\n <mat-form-field *ngIf=\"!product\">\n <mat-label>Product</mat-label>\n <app-searchable-selector\n formControlName=\"product_id\"\n apiUrl=\"api/products\"\n titleField=\"name\"\n (selectedValueChange)=\"onProductChange($event)\"\n ></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input\n matInput\n [matDatepicker]=\"datePicker\"\n formControlName=\"date\"\n (focus)=\"datePicker.open()\"\n />\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\n [disabled]=\"isWorking\"\n mat-raised-button\n color=\"primary\"\n type=\"submit\"\n >\n Save\n </button>\n <button\n [disabled]=\"isWorking\"\n (click)=\"cancelled.emit()\"\n mat-flat-button\n type=\"button\"\n >\n Cancel\n </button>\n </div>\n</form>\n","import {\n Component,\n EventEmitter,\n Input,\n Output,\n TemplateRef,\n} from \"@angular/core\";\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\n\n@Component({\n selector: \"app-stock-issue-form-button\",\n templateUrl: \"./stock-issue-form-button.component.html\",\n styleUrls: [\"./stock-issue-form-button.component.scss\"],\n})\nexport class StockIssueFormButtonComponent {\n @Input() product: any;\n @Input() stockIssuance: any;\n @Input() icon!: string | null;\n @Input() issuableType!: string;\n @Input() issuableId!: number;\n @Output() saved: EventEmitter<any> = new EventEmitter<any>();\n\n matDialogRef!: MatDialogRef<any>;\n\n constructor(private matDialog: MatDialog) {}\n\n showStockIssuanceForm(templateRef: TemplateRef<any>) {\n this.matDialogRef = this.matDialog.open(templateRef, { width: \"500px\" });\n }\n\n onStockIssuanceSaved(item: any) {\n this.matDialogRef.close();\n this.saved.emit(item);\n }\n}\n","<span\n class=\"material-symbols-outlined cursor-pointer\"\n [class.text-primary]=\"icon\"\n matTooltip=\"Stock Issuance\"\n (click)=\"showStockIssuanceForm(stockIssuanceFormTemplate)\"\n>\n {{ stockIssuance ? \"edit\" : icon ?? \"upload\" }}\n</span>\n\n<ng-template #stockIssuanceFormTemplate>\n <app-stock-issue-form\n mat-dialog-content\n [product]=\"product\"\n [stockIssuance]=\"stockIssuance\"\n [issuableType]=\"issuableType\"\n [issuableId]=\"issuableId\"\n (cancelled)=\"matDialogRef.close()\"\n (saved)=\"onStockIssuanceSaved($event)\"\n ></app-stock-issue-form>\n</ng-template>\n","import {\n Component,\n EventEmitter,\n Input,\n Output,\n TemplateRef,\n} from \"@angular/core\";\nimport { MatDialog } from \"@angular/material/dialog\";\nimport { StockIssuanceService } from \"../stock-issuance.service\";\nimport { AlertService } from \"ngx-techlify-core\";\n\n@Component({\n selector: \"app-stock-issuance-delete-button\",\n templateUrl: \"./stock-issuance-delete-button.component.html\",\n styleUrls: [\"./stock-issuance-delete-button.component.scss\"],\n})\nexport class StockIssuanceDeleteButtonComponent {\n @Input() stockIssuance: any;\n @Output() deleted: EventEmitter<any> = new EventEmitter<any>();\n isDeleting: boolean = false;\n\n constructor(\n private matDialog: MatDialog,\n private stockIssuanceService: StockIssuanceService,\n private alertService: AlertService\n ) {}\n\n showDeleteConfirmModel(templateRef: TemplateRef<any>) {\n this.matDialog.open(templateRef, { width: \"400px\" });\n }\n\n delete() {\n this.isDeleting = true;\n this.stockIssuanceService.delete(this.stockIssuance).subscribe({\n next: () => {\n this.matDialog.closeAll();\n this.isDeleting = false;\n this.deleted.emit();\n this.alertService.addAlert(\n \"Stock Issuance deleted successfully!\",\n \"success\"\n );\n },\n error: () => {\n this.isDeleting = false;\n },\n });\n }\n}\n","<span\n class=\"material-symbols-outlined cursor-pointer\"\n (click)=\"showDeleteConfirmModel(deleteModelTemplate)\"\n>\n delete\n</span>\n\n<ng-template #deleteModelTemplate>\n <h3 mat-dialog-title>Delete Stock Issuance</h3>\n <div mat-dialog-content>\n <p>Are you sure you want to delete the stock issuance record?</p>\n </div>\n <div mat-dialog-actions class=\"d-flex justify-content-end gap-2\">\n <button\n [disabled]=\"isDeleting\"\n mat-raised-button\n type=\"button\"\n color=\"warn\"\n (click)=\"delete()\"\n >\n Delete\n </button>\n <button\n [disabled]=\"isDeleting\"\n mat-flat-button\n mat-dialog-close\n type=\"button\"\n >\n Cancel\n </button>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\nimport {\n RequestHelperService,\n TechlifyListingControllerInterface,\n Timeline,\n} from \"ngx-techlify-core\";\nimport { FormBuilder, FormGroup } from \"@angular/forms\";\nimport { debounceTime } from \"rxjs\";\nimport { Sort } from \"@angular/material/sort\";\nimport { StockIssuanceService } from \"../stock-issuance.service\";\n\n@Component({\n selector: \"app-stock-issuances-list\",\n templateUrl: \"./stock-issuances-list.component.html\",\n styleUrls: [\"./stock-issuances-list.component.scss\"],\n})\nexport class StockIssuancesListComponent\n extends TechlifyListingControllerInterface\n implements OnInit\n{\n @Input() product: any;\n @Input() issuableType!: string;\n @Input() issuableId!: number;\n @Input() label = \"Stock Issuances\";\n @Output() listUpdated: EventEmitter<any> = new EventEmitter<any>();\n\n filterConfig: any = {\n duration: {\n label: \"Date\",\n },\n search: {\n placeholder: \"Search Product Name, SKU, Description, etc\",\n },\n };\n displayedColumns: string[] = [\n \"no\",\n \"product\",\n \"date\",\n \"quantity\",\n \"related\",\n \"particulars\",\n \"creator\",\n \"actions\",\n ];\n constructor(\n private formBuilder: FormBuilder,\n private requestHelperService: RequestHelperService,\n private stockIssuanceService: StockIssuanceService\n ) {\n super();\n this.lastPage = 0;\n this.filterForm = this.formBuilder.group({\n duration: [Timeline.THIS_MONTH],\n date_from: [\"\"],\n date_to: [\"\"],\n measure_ids: [\"\"],\n product_ids: [\"\"],\n search: [\"\"],\n sort_by: [\"date|desc\"],\n });\n }\n\n ngOnInit(): void {\n (this.filterForm as FormGroup).valueChanges\n .pipe(debounceTime(500))\n .subscribe({\n next: () => this.reload(),\n });\n if (this.product) {\n this.filterForm.get(\"product_ids\")?.setValue(this.product?.id);\n const index = this.displayedColumns.indexOf(\"product\");\n if (index !== -1) {\n this.displayedColumns.splice(index, 1);\n }\n }\n }\n\n loadData(): void {\n const params: any = {\n page: this.page,\n perPage: this.perPage,\n with: \"creator,product.measure,issuable.fixedAsset\",\n ...this.requestHelperService.convertToFormData(this.filterForm.value),\n };\n if (this.issuableId && this.issuableType) {\n params.issuable_ids = this.issuableId;\n params.issuable_types = this.issuableType;\n }\n this.isWorking = true;\n this.stockIssuanceService.index(params).subscribe({\n next: (response: any) => {\n this.models = this.models.concat(response?.data);\n this.lastPage = response?.last_page;\n this.isWorking = false;\n },\n error: () => {\n this.isWorking = false;\n },\n });\n }\n\n onSortChange(sort: Sort) {\n let { active, direction } = sort;\n if (!active) {\n active = \"date\";\n }\n if (!direction) {\n direction = \"desc\";\n active = \"date\";\n }\n this.filterForm.get(\"sort_by\").setValue(active + \"|\" + direction);\n }\n}\n","<mat-card *ngIf=\"!product\" class=\"mb-2\">\n <mat-card-content\n class=\"d-flex justify-content-between align-items-center gap-3\"\n >\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\n icon=\"add\"\n [issuableType]=\"issuableType\"\n [issuableId]=\"issuableId\"\n (saved)=\"reload()\"\n ></app-stock-issue-form-button>\n </div>\n\n <app-techlify-filter\n [filterForm]=\"filterForm\"\n [filterConfig]=\"filterConfig\"\n (filterUpdated)=\"reload()\"\n ></app-techlify-filter>\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 Issuances</h3>\n\n <app-stock-issue-form-button\n [product]=\"product\"\n icon=\"add\"\n (saved)=\"reload(); listUpdated.emit()\"\n ></app-stock-issue-form-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n aria-describedby=\"Stock Issuances\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n >\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 <a\n [routerLink]=\"[\n '/inventory/products/',\n element?.product?.id,\n 'view'\n ]\"\n >\n {{ element?.product?.name }}\n </a>\n </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 <!-- Related Column -->\n <ng-container matColumnDef=\"related\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Related</th>\n <td mat-cell *matCellDef=\"let element\">\n <a\n class=\"text-dark\"\n *ngIf=\"element?.issuable\"\n [routerLink]=\"['/maintenances', element?.issuable_id, 'view']\"\n >\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\">\n {{ element?.quantity }} {{ element?.product?.measure?.title }}\n </td>\n </ng-container>\n\n <!-- Purchase Price Column -->\n <ng-container matColumnDef=\"purchase_price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n Purchase Price\n </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?.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 class=\"d-flex gap-1\">\n <app-stock-issue-form-button\n [product]=\"element.product\"\n [stockIssuance]=\"element\"\n (saved)=\"reload(); listUpdated.emit()\"\n ></app-stock-issue-form-button>\n <app-stock-issuance-delete-button\n [stockIssuance]=\"element\"\n (deleted)=\"reload(); listUpdated.emit()\"\n ></app-stock-issuance-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { StockIssueFormComponent } from \"./stock-issue-form/stock-issue-form.component\";\nimport { StockIssueFormButtonComponent } from \"./stock-issue-form-button/stock-issue-form-button.component\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatDatepickerModule } from \"@angular/material/datepicker\";\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatDialogModule } from \"@angular/material/dialog\";\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\nimport { SearchableSelectorModule } from \"ngx-techlify-core\";\n\n@NgModule({\n declarations: [StockIssueFormComponent, StockIssueFormButtonComponent],\n exports: [StockIssueFormButtonComponent],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatDatepickerModule,\n MatButtonModule,\n MatDialogModule,\n MatTooltipModule,\n SearchableSelectorModule,\n ],\n})\nexport class StockIssueFormModule {}\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { StockIssuanceDeleteButtonComponent } from \"./stock-issuance-delete-button.component\";\nimport { MaterialModule } from \"ngx-techlify-core\";\n\n@NgModule({\n declarations: [StockIssuanceDeleteButtonComponent],\n imports: [CommonModule, MaterialModule],\n exports: [StockIssuanceDeleteButtonComponent],\n})\nexport class StockIssuanceDeleteButtonModule {}\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { StockIssuancesListComponent } from \"./stock-issuances-list.component\";\nimport { StockIssueFormModule } from \"../stock-issue-form/stock-issue-form.module\";\nimport { InfiniteScrollModule } from \"ngx-infinite-scroll\";\nimport { StockIssuanceDeleteButtonModule } from \"../stock-issuance-delete-button/stock-issuance-delete-button.module\";\nimport { MaterialModule } from \"ngx-techlify-core\";\nimport { MatProgressBarModule } from \"@angular/material/progress-bar\";\nimport { RouterModule } from \"@angular/router\";\nimport { TechlifyFilterModule } from '../../techlify-filter/techlify-filter.module';\n\n@NgModule({\n declarations: [StockIssuancesListComponent],\n imports: [\n CommonModule,\n MaterialModule,\n TechlifyFilterModule,\n StockIssueFormModule,\n InfiniteScrollModule,\n StockIssuanceDeleteButtonModule,\n MatProgressBarModule,\n RouterModule,\n ],\n exports: [StockIssuancesListComponent],\n})\nexport class StockIssuancesListModule {}\n"],"names":["i3.StockIssuanceService","i5","i6","i7","i8","i1","i2","i3.StockIssueFormComponent","i2.StockIssuanceService","i3","i4","i9.TechlifyFilterComponent","i10.StockIssueFormButtonComponent","i11","i12.StockIssuanceDeleteButtonComponent","i13"],"mappings":"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"}