diff --git a/src/app/modules/bankAccounts/components/select/select.component.ts b/src/app/modules/bankAccounts/components/select/select.component.ts index 76f20d9..1aab0dd 100644 --- a/src/app/modules/bankAccounts/components/select/select.component.ts +++ b/src/app/modules/bankAccounts/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component } from '@angular/core'; @@ -13,22 +14,16 @@ import { BankAccountFormComponent } from '../form.component'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent, Button, BankAccountFormComponent], }) -export class BankAccountsSelectComponent extends AbstractSelectComponent { +export class BankAccountsSelectComponent extends AbstractSelectComponent< + IBankAccountsResponse, + IPaginatedResponse +> { constructor(private service: BankAccountsService) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/modules/bankBranches/components/select/select.component.ts b/src/app/modules/bankBranches/components/select/select.component.ts index cf717c2..0f9fca9 100644 --- a/src/app/modules/bankBranches/components/select/select.component.ts +++ b/src/app/modules/bankBranches/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component } from '@angular/core'; @@ -13,22 +14,16 @@ import { BankBranchFormComponent } from '../form.component'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent, Button, BankBranchFormComponent], }) -export class BankBranchesSelectComponent extends AbstractSelectComponent { +export class BankBranchesSelectComponent extends AbstractSelectComponent< + IBankBranchResponse, + IPaginatedResponse +> { constructor(private service: BankBranchesService) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/modules/cardex/components/filters/filters.component.html b/src/app/modules/cardex/components/filters/filters.component.html index 992f8b4..3fa3ea3 100644 --- a/src/app/modules/cardex/components/filters/filters.component.html +++ b/src/app/modules/cardex/components/filters/filters.component.html @@ -1,9 +1,17 @@
- - - - + + + +
diff --git a/src/app/modules/cardex/components/filters/filters.component.ts b/src/app/modules/cardex/components/filters/filters.component.ts index d77b414..4f4a422 100644 --- a/src/app/modules/cardex/components/filters/filters.component.ts +++ b/src/app/modules/cardex/components/filters/filters.component.ts @@ -1,6 +1,8 @@ import { Maybe } from '@/core'; import { InventoriesSelectComponent } from '@/modules/inventories/components'; +import { IInventorySummaryResponse } from '@/modules/inventories/models'; import { ProductsSelectComponent } from '@/modules/products/components/select/select.component'; +import { IProductResponse } from '@/modules/products/models'; import { UikitFlatpickrJalaliComponent } from '@/uikit'; import { Component, EventEmitter, inject, Output } from '@angular/core'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; @@ -34,6 +36,7 @@ export class CardexFiltersComponent { constructor(private router: Router) { this.filters = this.store.filters(); + this.form.patchValue(this.filters); } form = this.fb.group({ @@ -55,4 +58,13 @@ export class CardexFiltersComponent { this.store.getCardex(); } + + setDefaultInventory(inventory: IInventorySummaryResponse) { + this.store.setDefaultInventory(inventory); + } + setDefaultProduct(product: IProductResponse) { + console.log('setDefaultProduct'); + + this.store.setDefaultProduct(product); + } } diff --git a/src/app/modules/cardex/components/templates/inventory.component.html b/src/app/modules/cardex/components/templates/inventory.component.html index 9492d25..1e2b66f 100644 --- a/src/app/modules/cardex/components/templates/inventory.component.html +++ b/src/app/modules/cardex/components/templates/inventory.component.html @@ -13,7 +13,11 @@ شرح شماره طرف حساب - کالا + @if (variant === "inventory") { + کالا + } @else if (variant === "product") { + انبار + } ورودی خروجی مانده @@ -44,7 +48,11 @@ {{ (item.referenceType === "SALES" ? item.customer?.name : item.supplier?.name) || "-" }} - {{ item.product.name || "-" }} + @if (variant === "inventory") { + {{ item.product.name || "-" }} + } @else if (variant === "product") { + {{ item.inventory.name || "-" }} + } {{ item.type === "IN" ? item.quantity : 0 }} diff --git a/src/app/modules/cardex/components/templates/inventory.component.ts b/src/app/modules/cardex/components/templates/inventory.component.ts index 367530e..08f4ef5 100644 --- a/src/app/modules/cardex/components/templates/inventory.component.ts +++ b/src/app/modules/cardex/components/templates/inventory.component.ts @@ -18,5 +18,6 @@ import { IInventoryCardex } from './types'; export class CardexComponent { @Input() items: IInventoryCardex[] = []; @Input() loading: boolean = false; + @Input() variant: 'inventory' | 'product' | 'general' = 'inventory'; constructor() {} } diff --git a/src/app/modules/cardex/store/main.store.ts b/src/app/modules/cardex/store/main.store.ts index f633125..f603844 100644 --- a/src/app/modules/cardex/store/main.store.ts +++ b/src/app/modules/cardex/store/main.store.ts @@ -15,7 +15,7 @@ export interface CardexState extends PaginatedState { filters: ICardexRequestPayload; selectedInventory: Maybe; selectedProduct: Maybe; - variant: 'inventory' | 'product' | 'both'; + variant: 'inventory' | 'product' | 'general'; canChangeVariant: boolean; } @@ -28,17 +28,17 @@ export class CardexStore extends PaginatedStore { filters: {}, selectedInventory: null, selectedProduct: null, - variant: 'both', + variant: 'general', canChangeVariant: true, }; constructor( private router: Router, - private activeRoute: ActivatedRoute, + private route: ActivatedRoute, private service: CardexService, private toastService: ToastService, ) { - const queryParams = activeRoute.snapshot.queryParams; + const queryParams = route.snapshot.queryParams; super({ loading: false, @@ -52,14 +52,16 @@ export class CardexStore extends PaginatedStore { totalPages: 0, hasMore: false, filters: { - inventoryId: queryParams['inventoryId'], - productId: queryParams['productId'], + inventoryId: queryParams['inventoryId'] + ? parseInt(queryParams['inventoryId'], 10) + : undefined, + productId: queryParams['productId'] ? parseInt(queryParams['productId'], 10) : undefined, startDate: queryParams['startDate'], endDate: queryParams['endDate'], }, selectedInventory: null, selectedProduct: null, - variant: 'both', + variant: 'general', canChangeVariant: true, }); this.initial(); @@ -75,7 +77,9 @@ export class CardexStore extends PaginatedStore { case 'inventory': return `کاردکس انبار ${this._state().selectedInventory?.name}`; default: - return 'کاردکس'; + return `کاردکس ${this._state().selectedProduct ? 'کالای ' + this._state().selectedProduct?.name : ''} ${ + this._state().selectedInventory ? 'در انبار ' + this._state().selectedInventory?.name : '' + }`; } }); @@ -83,7 +87,7 @@ export class CardexStore extends PaginatedStore { * Reset state to initial values */ reset(): void { - const queryParams = this.activeRoute.snapshot.queryParams; + const queryParams = this.route.snapshot.queryParams; this.setState({ loading: false, initialized: false, @@ -103,7 +107,7 @@ export class CardexStore extends PaginatedStore { }, selectedInventory: null, selectedProduct: null, - variant: 'both', + variant: 'general', canChangeVariant: this.state().canChangeVariant, }); } @@ -132,7 +136,7 @@ export class CardexStore extends PaginatedStore { const { productId, inventoryId, startDate, endDate } = this.filters(); const filters = {} as Partial; Object.entries(this.filters()).forEach(([key, value]) => { - if (value) { + if (value && value !== '0') { filters[key as keyof ICardexRequestPayload] = value; } }); @@ -151,10 +155,19 @@ export class CardexStore extends PaginatedStore { updateFilter(filters: ICardexRequestPayload) { this.updateVariant(); - this.router.navigate([], { - queryParams: filters, - skipLocationChange: true, - }); + console.log('filters'); + console.log(filters); + const cleanedFilters = this.validateFilters() || {}; + + this.router + .navigate([], { + relativeTo: this.route, + queryParams: cleanedFilters, + }) + .then((res) => console.log(res)) + .catch((err) => { + console.log(err); + }); this.patchState({ filters }); } @@ -169,10 +182,18 @@ export class CardexStore extends PaginatedStore { this.patchState({ canChangeVariant: status }); } + setDefaultInventory(inventory: ICardexInventorySummary) { + this.patchState({ selectedInventory: inventory }); + } + + setDefaultProduct(product: ICardexProductSummary) { + this.patchState({ selectedProduct: product }); + } + private updateVariant() { const inventoryIsSelected = Boolean(this._state().selectedInventory); const productIsSelected = Boolean(this._state().selectedProduct); - let variant = 'both' as 'product' | 'inventory' | 'both'; + let variant = 'general' as 'product' | 'inventory' | 'general'; if (inventoryIsSelected) { if (!productIsSelected) { variant = 'inventory'; diff --git a/src/app/modules/cardex/views/cardex.component.html b/src/app/modules/cardex/views/cardex.component.html index d2b23bb..7553dda 100644 --- a/src/app/modules/cardex/views/cardex.component.html +++ b/src/app/modules/cardex/views/cardex.component.html @@ -7,9 +7,8 @@ } @else {

{{ cardexTitle }}

- @if (variant === "inventory") { - - } + + }
diff --git a/src/app/modules/customers/components/select/select.component.ts b/src/app/modules/customers/components/select/select.component.ts index be4a5eb..698a3ff 100644 --- a/src/app/modules/customers/components/select/select.component.ts +++ b/src/app/modules/customers/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component } from '@angular/core'; @@ -13,22 +14,16 @@ import { CustomerFormComponent } from '../form.component'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent, Button, CustomerFormComponent], }) -export class CustomersSelectComponent extends AbstractSelectComponent { +export class CustomersSelectComponent extends AbstractSelectComponent< + ICustomerResponse, + IPaginatedResponse +> { constructor(private service: CustomersService) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/modules/inventories/components/bankAccounts/select.component.ts b/src/app/modules/inventories/components/bankAccounts/select.component.ts index d8fee77..3e314a7 100644 --- a/src/app/modules/inventories/components/bankAccounts/select.component.ts +++ b/src/app/modules/inventories/components/bankAccounts/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component, Input } from '@angular/core'; @@ -19,27 +20,19 @@ import { InventoryBankAccountFormComponent } from './form.component'; ReactiveFormsModule, ], }) -export class InventoryBankAccountSelectComponent extends AbstractSelectComponent { +export class InventoryBankAccountSelectComponent extends AbstractSelectComponent< + IInventoryBankAccountResponse, + IPaginatedResponse +> { @Input() inventoryId!: string; @Input() override showClear: boolean = false; + constructor(private service: InventoryBankAccountsService) { super(); - } - - ngOnInit() { this.getData(); } - getData(): void { - this.loading.set(true); - this.service.getBankAccounts(Number(this.inventoryId)).subscribe({ - next: (res) => { - this.loading.set(false); - this.items.set(res.data); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getBankAccounts(Number(this.inventoryId)); } } diff --git a/src/app/modules/inventories/components/select/select.component.ts b/src/app/modules/inventories/components/select/select.component.ts index 5c4f7af..91e2bcd 100644 --- a/src/app/modules/inventories/components/select/select.component.ts +++ b/src/app/modules/inventories/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component } from '@angular/core'; @@ -11,22 +12,16 @@ import { InventoriesService } from '../../services/main.service'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent], }) -export class InventoriesSelectComponent extends AbstractSelectComponent { +export class InventoriesSelectComponent extends AbstractSelectComponent< + IInventorySummaryResponse, + IPaginatedResponse +> { constructor(private service: InventoriesService) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/modules/inventories/models/posAccounts.io.ts b/src/app/modules/inventories/models/posAccounts.io.ts index 4105a15..19b9e79 100644 --- a/src/app/modules/inventories/models/posAccounts.io.ts +++ b/src/app/modules/inventories/models/posAccounts.io.ts @@ -1,3 +1,4 @@ +import ISummary from '@/core/models/summary'; import { IInventoryBankAccountSummary } from './types'; export interface IInventoryPosAccountRawResponse { @@ -6,7 +7,7 @@ export interface IInventoryPosAccountRawResponse { code: string; description: string; bankAccountId: number; - inventoryId: number; + inventory: ISummary; createdAt: string; updatedAt: string; deletedAt: null; diff --git a/src/app/modules/inventories/store/inventory.store.ts b/src/app/modules/inventories/store/inventory.store.ts new file mode 100644 index 0000000..9cfc318 --- /dev/null +++ b/src/app/modules/inventories/store/inventory.store.ts @@ -0,0 +1,80 @@ +import { ToastService } from '@/core/services/toast.service'; +import { EntityState, EntityStore } from '@/core/state'; +import { Injectable } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { IInventoryDetailResponse } from '../models'; +import { InventoriesService } from '../services'; + +export interface InventoryState extends EntityState {} + +@Injectable({ + providedIn: 'root', +}) +export class InventoryStore extends EntityStore { + private readonly _inventoryState = { + isRefreshing: false, + }; + + constructor( + private activeRoute: ActivatedRoute, + private service: InventoriesService, + private toastService: ToastService, + ) { + super({ + loading: false, + initialized: false, + error: null, + isRefreshing: false, + entities: {}, + selectedId: null, + ids: [], + }); + this.initial(); + } + + supplierId!: string; + + initial() {} + + getSingle(inventoryId: string) { + if (this.entities()[inventoryId]) { + return; + } + this.patchState({ loading: true }); + this.service.getSingle(inventoryId).subscribe({ + next: (res) => { + this.patchState({ + entities: { [res.id]: res }, + loading: false, + }); + }, + error: (err) => { + this.patchState({ loading: false, error: err }); + this.toastService.error({ + text: 'خطا در دریافت اطلاعات انبار', + }); + }, + }); + } + + refresh(inventoryId: string) { + const { inventoryId: _, ...entities } = this.entities(); + this.patchState({ + entities, + }); + this.getSingle(inventoryId); + } + + reset(): void { + const queryParams = this.activeRoute.snapshot.queryParams; + this.setState({ + loading: false, + initialized: false, + error: null, + isRefreshing: false, + entities: {}, + selectedId: null, + ids: [], + }); + } +} diff --git a/src/app/modules/inventories/views/posAccounts/list.component.html b/src/app/modules/inventories/views/posAccounts/list.component.html index 11022d9..11a330e 100644 --- a/src/app/modules/inventories/views/posAccounts/list.component.html +++ b/src/app/modules/inventories/views/posAccounts/list.component.html @@ -1,21 +1,22 @@ -
- نقاط فروش متصل به انبار -
+ + -
-
+
+ @if (inventoryId) { diff --git a/src/app/modules/inventories/views/posAccounts/list.component.ts b/src/app/modules/inventories/views/posAccounts/list.component.ts index 0d90b16..bf9c698 100644 --- a/src/app/modules/inventories/views/posAccounts/list.component.ts +++ b/src/app/modules/inventories/views/posAccounts/list.component.ts @@ -1,32 +1,44 @@ +import { InnerPagesHeaderComponent } from '@/shared/components/innerPagesHeader/inner-pages-header.component'; import { IColumn, PageDataListComponent, } from '@/shared/components/pageDataList/page-data-list.component'; -import { Component, inject, signal } from '@angular/core'; +import { Component, computed, inject, signal } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { ButtonDirective } from 'primeng/button'; import { Card } from 'primeng/card'; import { InventoryPosAccountFormComponent } from '../../components/posAccounts/form.component'; import { IInventoryPosAccountResponse } from '../../models'; import { InventoryPosAccountsService } from '../../services/posAccounts.service'; +import { InventoryStore } from '../../store/inventory.store'; @Component({ selector: 'app-inventory-pos-account-list', templateUrl: './list.component.html', - imports: [PageDataListComponent, Card, ButtonDirective, InventoryPosAccountFormComponent], + imports: [ + PageDataListComponent, + Card, + ButtonDirective, + InventoryPosAccountFormComponent, + InnerPagesHeaderComponent, + ], }) export class InventoryPosAccountListComponent { private readonly route = inject(ActivatedRoute); private readonly service = inject(InventoryPosAccountsService); + private readonly inventoryStore = inject(InventoryStore); + inventoryId = this.route.snapshot.params['inventoryId']; items = signal([]); loading = signal(false); visibleForm = signal(false); - inventoryId = this.route.snapshot.params['inventoryId']; + inventory = computed(() => this.inventoryStore.entities()[this.inventoryId]); columns = [] as IColumn[]; + pageTitle = computed(() => `نقاط فروش متصل به انبار ${this.inventory()?.name || ''}`); ngOnInit() { + this.inventoryStore.getSingle(this.inventoryId); this.getItems(); this.columns = [ { @@ -73,4 +85,8 @@ export class InventoryPosAccountListComponent { openAddForm() { this.visibleForm.set(true); } + + toPos(item: IInventoryPosAccountResponse) { + window.open(`/pos/${item.id}`, '_blank'); + } } diff --git a/src/app/modules/productBrands/components/select/select.component.ts b/src/app/modules/productBrands/components/select/select.component.ts index 6e6e7a8..00fbf49 100644 --- a/src/app/modules/productBrands/components/select/select.component.ts +++ b/src/app/modules/productBrands/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component } from '@angular/core'; @@ -13,22 +14,16 @@ import { ProductBrandFormComponent } from '../form.component'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent, Button, ProductBrandFormComponent], }) -export class ProductBrandsSelectComponent extends AbstractSelectComponent { +export class ProductBrandsSelectComponent extends AbstractSelectComponent< + IProductBrandResponse, + IPaginatedResponse +> { constructor(private service: ProductBrandsService) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/modules/productCategories/components/select/select.component.ts b/src/app/modules/productCategories/components/select/select.component.ts index d326e7c..0b06447 100644 --- a/src/app/modules/productCategories/components/select/select.component.ts +++ b/src/app/modules/productCategories/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component } from '@angular/core'; @@ -13,22 +14,16 @@ import { ProductCategoryFormComponent } from '../form.component'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent, Button, ProductCategoryFormComponent], }) -export class ProductCategoriesSelectComponent extends AbstractSelectComponent { +export class ProductCategoriesSelectComponent extends AbstractSelectComponent< + IProductCategoryResponse, + IPaginatedResponse +> { constructor(private service: ProductCategoriesService) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/modules/products/components/select/select.component.ts b/src/app/modules/products/components/select/select.component.ts index 0f9d942..ac40f04 100644 --- a/src/app/modules/products/components/select/select.component.ts +++ b/src/app/modules/products/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { CommonModule } from '@angular/common'; @@ -12,26 +13,16 @@ import { ProductsService } from '../../services/main.service'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent, CommonModule], }) -export class ProductsSelectComponent extends AbstractSelectComponent { +export class ProductsSelectComponent extends AbstractSelectComponent< + IProductResponse, + IPaginatedResponse +> { constructor(private service: ProductsService) { super(); this.getData(); } - getLabel(): string { - return 'کالا'; - } - - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/modules/suppliers/components/ledger/ledger.component.html b/src/app/modules/suppliers/components/ledger/ledger.component.html index e3fd9c9..33bdd30 100644 --- a/src/app/modules/suppliers/components/ledger/ledger.component.html +++ b/src/app/modules/suppliers/components/ledger/ledger.component.html @@ -1,7 +1,7 @@
- تراکنش‌های تامین‌کننده + دفتر کل تامین‌کننده
@if (showViewAllCTA) { @@ -24,8 +24,8 @@ {{ i + 1 }} - - + + diff --git a/src/app/modules/suppliers/components/select/select.component.ts b/src/app/modules/suppliers/components/select/select.component.ts index 2de4751..8467a27 100644 --- a/src/app/modules/suppliers/components/select/select.component.ts +++ b/src/app/modules/suppliers/components/select/select.component.ts @@ -1,3 +1,4 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; import { AbstractSelectComponent } from '@/shared/components'; import { UikitFieldComponent } from '@/uikit'; import { Component } from '@angular/core'; @@ -11,21 +12,16 @@ import { SuppliersService } from '../../services/main.service'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, SelectModule, UikitFieldComponent], }) -export class SuppliersSelectComponent extends AbstractSelectComponent { +export class SuppliersSelectComponent extends AbstractSelectComponent< + ISupplierResponse, + IPaginatedResponse +> { constructor(private service: SuppliersService) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.service.getAll().subscribe({ - next: (res) => { - this.items.set(res.data); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + + getDataService() { + return this.service.getAll(); } } diff --git a/src/app/shared/catalog/banks/components/select/select.component.ts b/src/app/shared/catalog/banks/components/select/select.component.ts index 99cb6a0..2dc17e7 100644 --- a/src/app/shared/catalog/banks/components/select/select.component.ts +++ b/src/app/shared/catalog/banks/components/select/select.component.ts @@ -11,22 +11,13 @@ import { BanksStore } from '../../store/main.store'; templateUrl: './select.component.html', imports: [ReactiveFormsModule, Select, UikitFieldComponent], }) -export class BanksSelectComponent extends AbstractSelectComponent { +export class BanksSelectComponent extends AbstractSelectComponent { constructor(private store: BanksStore) { super(); this.getData(); } - getData() { - this.loading.set(true); - this.store.getItems().subscribe({ - next: (res) => { - this.items.set(res || []); - this.loading.set(false); - }, - error: () => { - this.loading.set(false); - }, - }); + getDataService() { + return this.store.getItems(); } } diff --git a/src/app/shared/components/abstract-select.component.ts b/src/app/shared/components/abstract-select.component.ts index e534a29..975e029 100644 --- a/src/app/shared/components/abstract-select.component.ts +++ b/src/app/shared/components/abstract-select.component.ts @@ -1,6 +1,7 @@ import { Maybe } from '@/core'; import { Component, EventEmitter, Input, model, Output, signal } from '@angular/core'; import { FormControl } from '@angular/forms'; +import { Observable } from 'rxjs'; export interface ISelectItem { id: number; @@ -11,7 +12,7 @@ export interface ISelectItem { selector: 'abstract-select-field', template: '', }) -export abstract class AbstractSelectComponent { +export abstract class AbstractSelectComponent { @Input() control = new FormControl>(null); @Input() canInsert: boolean = false; @Input() showLabel: boolean = true; @@ -20,6 +21,7 @@ export abstract class AbstractSelectComponent { @Input() isFullDataOptionValue: boolean = false; @Input() optionValue = 'id'; @Output() onChange = new EventEmitter>(); + @Output() onSetDefaultDataItem = new EventEmitter(); loading = signal(false); items = signal>(null); @@ -36,7 +38,40 @@ export abstract class AbstractSelectComponent { }); } - abstract getData(): void; + abstract getDataService(): Observable; + getData() { + this.loading.set(true); + this.getDataService().subscribe({ + next: (res) => { + if (Array.isArray(res)) { + this.items.set(res); + // @ts-ignore + } else if ('data' in res) { + // @ts-ignore + this.items.set(res.data); + } + + const defaultValue = this.control.value; + if (defaultValue) { + const selectedItem = this.items()?.find( + (item) => (item as Record)[this.optionValue] == defaultValue, + ) as T; + + if (selectedItem) { + this.onSetDefaultDataItem.emit(selectedItem); + } + } + this.loading.set(false); + }, + error: () => { + this.loading.set(false); + }, + }); + } + + setDefaultDataItem(item: T) { + this.onSetDefaultDataItem.emit(item); + } refresh() { this.getData(); @@ -54,6 +89,8 @@ export abstract class AbstractSelectComponent { } change(value: Maybe) { + console.log('first'); + if (typeof value !== 'object') { // @ts-ignore this.onChange.emit(this.items()?.find((item) => item[this.optionValue] === value)); diff --git a/src/app/shared/components/cardex/cardex.component.html b/src/app/shared/components/cardex/cardex.component.html index 7b6aaca..3711044 100644 --- a/src/app/shared/components/cardex/cardex.component.html +++ b/src/app/shared/components/cardex/cardex.component.html @@ -64,4 +64,15 @@ --> + + + + + + + + diff --git a/src/app/shared/components/cardex/cardex.component.ts b/src/app/shared/components/cardex/cardex.component.ts index 9605c36..303d280 100644 --- a/src/app/shared/components/cardex/cardex.component.ts +++ b/src/app/shared/components/cardex/cardex.component.ts @@ -1,5 +1,6 @@ import { CatalogMovementReferenceTagComponent } from '@/shared/catalog/movementReferenceTypes'; import { JalaliDateDirective, PriceMaskDirective } from '@/shared/directives'; +import { UikitEmptyStateComponent } from '@/uikit'; import { Component, Input } from '@angular/core'; import { TableModule } from 'primeng/table'; import { ICardexItem } from './type'; @@ -12,6 +13,7 @@ import { ICardexItem } from './type'; JalaliDateDirective, CatalogMovementReferenceTagComponent, PriceMaskDirective, + UikitEmptyStateComponent, ], hostDirectives: [PriceMaskDirective], }) diff --git a/src/app/shared/components/innerPagesHeader/inner-pages-header.component.html b/src/app/shared/components/innerPagesHeader/inner-pages-header.component.html index e32cfa3..e40a458 100644 --- a/src/app/shared/components/innerPagesHeader/inner-pages-header.component.html +++ b/src/app/shared/components/innerPagesHeader/inner-pages-header.component.html @@ -4,7 +4,7 @@ @if (backRoute) { } -

{{ pageTitle }}

+

{{ pageTitle }}

@if (actions) { diff --git a/src/app/uikit/uikit-emptystate.component.html b/src/app/uikit/uikit-emptystate.component.html index 6e86269..06dcd1e 100644 --- a/src/app/uikit/uikit-emptystate.component.html +++ b/src/app/uikit/uikit-emptystate.component.html @@ -1,12 +1,12 @@ -
+
- {{ title }} + {{ title }} @if (description) {

{{ description }}

} - + @if (!hasCtaContent && ctaLabel && showCTA) { {{ ctaLabel }}