create bankAccount, posAccount and update inventories

This commit is contained in:
2025-12-26 01:20:44 +03:30
parent f671e37b14
commit abfb2f3479
42 changed files with 920 additions and 95 deletions
@@ -21,8 +21,6 @@ export class BanksSelectComponent extends AbstractSelectComponent<IBankResponse>
this.loading.set(true);
this.store.getItems().subscribe({
next: (res) => {
console.log(res);
this.items.set(res || []);
this.loading.set(false);
},
@@ -0,0 +1,67 @@
import { ToastService } from '@/core/services/toast.service';
import { Component, effect, EventEmitter, inject, Input, Output, signal } from '@angular/core';
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
import { Subscribable } from 'rxjs';
@Component({
selector: 'abstract-form-dialog',
template: '',
imports: [ReactiveFormsModule],
})
export abstract class AbstractFormDialog<T, U> {
@Input() initialValues?: T;
@Input()
set visible(v: boolean) {
this.visibleSignal.set(!!v);
}
get visible() {
return this.visibleSignal();
}
private visibleSignal = signal(false);
@Output() visibleChange = new EventEmitter<boolean>();
@Output() onSubmit = new EventEmitter<T>();
protected readonly fb = inject(FormBuilder);
constructor(private toastService: ToastService) {
effect(() => {
const v = this.visibleSignal();
if (!v) this.form.reset();
});
}
abstract form: ReturnType<FormBuilder['group']>;
abstract submitForm(payload: U): Subscribable<T> | void;
submitLoading = signal(false);
submit() {
this.form.markAllAsTouched();
if (this.form.valid) {
this.form.disable();
this.submitLoading.set(true);
this.submitForm(this.form.value as U)?.subscribe({
next: (res) => {
this.toastService.success({
text: `با موفقیت ایجاد شد`,
});
this.close();
this.submitLoading.set(false);
this.form.enable();
this.form.reset();
this.onSubmit.emit(res);
},
error: () => {
this.submitLoading.set(false);
this.form.enable();
},
});
}
}
close() {
this.visibleChange.emit(false);
}
}
@@ -16,6 +16,7 @@ export abstract class AbstractSelectComponent<T = ISelectItem> {
@Input() canInsert: boolean = false;
@Input() showLabel: boolean = true;
@Input() showErrors: boolean = true;
@Input() showClear: boolean = true;
@Input() isFullDataOptionValue: boolean = false;
@Input() optionValue = 'id';
@Output() onChange = new EventEmitter<Maybe<T>>();
@@ -119,6 +119,7 @@ export class PageDataListComponent<I> {
if (!item || !column) return '';
try {
const { field } = column;
if (column.customDataModel) {
return this.renderCustom(column, item);
}