diff --git a/src/app/core/models/service.model.ts b/src/app/core/models/service.model.ts index cad1674..d1c786b 100644 --- a/src/app/core/models/service.model.ts +++ b/src/app/core/models/service.model.ts @@ -8,6 +8,10 @@ export interface IPaginatedResponse { data: T[]; } +export interface IListingResponse { + data: T[]; +} + export interface IResponseMetadata { page: number; perPage: number; diff --git a/src/app/domains/superAdmin/guilds/components/categories/list.component.ts b/src/app/domains/superAdmin/guilds/components/categories/list.component.ts index f0197ac..5510f27 100644 --- a/src/app/domains/superAdmin/guilds/components/categories/list.component.ts +++ b/src/app/domains/superAdmin/guilds/components/categories/list.component.ts @@ -20,6 +20,7 @@ export class GuildGoodCategoriesListComponent extends AbstractList + + diff --git a/src/app/domains/superAdmin/guilds/components/categories/select.component.ts b/src/app/domains/superAdmin/guilds/components/categories/select.component.ts new file mode 100644 index 0000000..f9a44cf --- /dev/null +++ b/src/app/domains/superAdmin/guilds/components/categories/select.component.ts @@ -0,0 +1,33 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; +import { AbstractSelectComponent } from '@/shared/abstractClasses'; +import { UikitFieldComponent } from '@/uikit'; +import { Component, inject, Input } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { Select } from 'primeng/select'; +import { IGoodCategoriesResponse } from '../../models'; +import { GuildGoodCategoriesService } from '../../services/goodCategories.service'; + +@Component({ + selector: 'admin-guild-categories-select', + templateUrl: './select.component.html', + imports: [UikitFieldComponent, Select, ReactiveFormsModule], +}) +export class GuildCategoriesSelectComponent extends AbstractSelectComponent< + IGoodCategoriesResponse, + IPaginatedResponse +> { + @Input() override showClear: boolean = false; + @Input() label: string = ''; + @Input() guildId!: string; + private readonly service = inject(GuildGoodCategoriesService); + + ngOnChanges() { + if (this.guildId) { + this.getData(); + } + } + + getDataService() { + return this.service.getAll(this.guildId); + } +} diff --git a/src/app/domains/superAdmin/guilds/components/form.component.html b/src/app/domains/superAdmin/guilds/components/form.component.html index cef6f46..c901801 100644 --- a/src/app/domains/superAdmin/guilds/components/form.component.html +++ b/src/app/domains/superAdmin/guilds/components/form.component.html @@ -3,7 +3,6 @@ - {{ editMode }} diff --git a/src/app/domains/superAdmin/guilds/components/goods/form.component.html b/src/app/domains/superAdmin/guilds/components/goods/form.component.html index d31ca2c..89eae19 100644 --- a/src/app/domains/superAdmin/guilds/components/goods/form.component.html +++ b/src/app/domains/superAdmin/guilds/components/goods/form.component.html @@ -1,7 +1,17 @@
+ + + + + - +
diff --git a/src/app/domains/superAdmin/guilds/components/goods/form.component.ts b/src/app/domains/superAdmin/guilds/components/goods/form.component.ts index f8a9c71..913d0b2 100644 --- a/src/app/domains/superAdmin/guilds/components/goods/form.component.ts +++ b/src/app/domains/superAdmin/guilds/components/goods/form.component.ts @@ -5,13 +5,22 @@ import { Component, inject, Input } from '@angular/core'; import { ReactiveFormsModule, Validators } from '@angular/forms'; import { Dialog } from 'primeng/dialog'; +import { EnumSelectComponent } from '@/shared/apiEnum/select.component'; import { IGuildGoodRequest, IGuildGoodsResponse } from '../../models'; import { GuildGoodsService } from '../../services/goods.service'; +import { GuildCategoriesSelectComponent } from '../categories/select.component'; @Component({ selector: 'admin-guild-good-form', templateUrl: './form.component.html', - imports: [ReactiveFormsModule, Dialog, InputComponent, FormFooterActionsComponent], + imports: [ + ReactiveFormsModule, + Dialog, + InputComponent, + FormFooterActionsComponent, + EnumSelectComponent, + GuildCategoriesSelectComponent, + ], }) export class GuildGoodCategoryFormComponent extends AbstractFormDialog< IGuildGoodRequest, @@ -24,6 +33,11 @@ export class GuildGoodCategoryFormComponent extends AbstractFormDialog< form = this.fb.group({ name: [this.initialValues?.name || '', [Validators.required]], + sku: [this.initialValues?.sku || '', [Validators.required]], + unit_type: [this.initialValues?.unit_type || '', [Validators.required]], + pricing_model: [this.initialValues?.pricing_model || '', [Validators.required]], + category_id: [this.initialValues?.category.id || '', [Validators.required]], + description: [this.initialValues?.description || ''], }); override submitForm(payload: IGuildGoodRequest) { diff --git a/src/app/domains/superAdmin/guilds/components/goods/list.component.html b/src/app/domains/superAdmin/guilds/components/goods/list.component.html index ab908ea..0012777 100644 --- a/src/app/domains/superAdmin/guilds/components/goods/list.component.html +++ b/src/app/domains/superAdmin/guilds/components/goods/list.component.html @@ -9,6 +9,16 @@ [loading]="loading()" [showDetails]="true" [showAdd]="true" + [showEdit]="true" + [fullHeight]="fullHeight" + (onEdit)="onEditClick($event)" (onAdd)="openAddForm()" /> - + diff --git a/src/app/domains/superAdmin/guilds/models/goods_io.d.ts b/src/app/domains/superAdmin/guilds/models/goods_io.d.ts index ffa8579..8bb1c60 100644 --- a/src/app/domains/superAdmin/guilds/models/goods_io.d.ts +++ b/src/app/domains/superAdmin/guilds/models/goods_io.d.ts @@ -5,6 +5,8 @@ export interface IGuildGoodsRawResponse { name: string; sku: string; category: ISummary; + unit_type: string; + pricing_model: string; description?: string; created_at: string; updated_at: string; @@ -14,5 +16,8 @@ export interface IGuildGoodsResponse extends IGuildGoodsRawResponse {} export interface IGuildGoodRequest { name: string; sku: string; + category_id: string; + unit_type: string; + pricing_model: string; description?: string; } diff --git a/src/app/domains/superAdmin/partners/shared/select.component.ts b/src/app/domains/superAdmin/partners/shared/select.component.ts index b8280a7..1085b1d 100644 --- a/src/app/domains/superAdmin/partners/shared/select.component.ts +++ b/src/app/domains/superAdmin/partners/shared/select.component.ts @@ -14,7 +14,7 @@ import { PartnersService } from '../services/main.service'; templateUrl: './select.component.html', imports: [UikitFieldComponent, Select, Button, ReactiveFormsModule, GuildFormComponent], }) -export class InventoryBankAccountSelectComponent extends AbstractSelectComponent< +export class PartnerSelectComponent extends AbstractSelectComponent< IPartnerResponse, IPaginatedResponse > { diff --git a/src/app/shared/abstractClasses/abstract-select.component.ts b/src/app/shared/abstractClasses/abstract-select.component.ts index 9cf17b3..3103806 100644 --- a/src/app/shared/abstractClasses/abstract-select.component.ts +++ b/src/app/shared/abstractClasses/abstract-select.component.ts @@ -13,7 +13,7 @@ export interface ISelectItem { template: '', }) export abstract class AbstractSelectComponent { - @Input() control = new FormControl>(null); + @Input() control = new FormControl>(null); @Input() canInsert: boolean = false; @Input() showLabel: boolean = true; @Input() showErrors: boolean = true; @@ -39,6 +39,7 @@ export abstract class AbstractSelectComponent; + getData() { this.loading.set(true); this.getDataService().subscribe({ diff --git a/src/app/shared/apiEnum/constants/apiEnumTranslates.ts b/src/app/shared/apiEnum/constants/apiEnumTranslates.ts new file mode 100644 index 0000000..b41e6e9 --- /dev/null +++ b/src/app/shared/apiEnum/constants/apiEnumTranslates.ts @@ -0,0 +1,20 @@ +import { TEnumApi } from '../models'; + +export const apiEnumTranslates = { + goldKarat: '', + userStatus: 'وضعیت کاربر', + accountRole: 'نقش', + accountStatus: 'وضعیت', + posStatus: 'وضعیت', + posRole: 'نقش', + licenseType: 'نوع لایسنس', + licenseStatus: 'وضعیت لایسنس', + posType: 'نوع پایانه', + userType: 'نوع کاربر', + accountType: 'نوع کاربر', + partnerRole: 'نقش', + businessRole: 'نقش', + providerRole: 'نقش', + unitType: 'واحد اندازه‌گیری', + goodPricingModel: 'مدل محاسبه', +} as Record; diff --git a/src/app/shared/apiEnum/constants/apiRoutes.ts b/src/app/shared/apiEnum/constants/apiRoutes.ts new file mode 100644 index 0000000..a2b77e0 --- /dev/null +++ b/src/app/shared/apiEnum/constants/apiRoutes.ts @@ -0,0 +1,21 @@ +const baseUrl = '/api/v1/enums'; + +export const ENUMS_API_ROUTES = { + goldKarat: `${baseUrl}/gold_karat`, + userStatus: `${baseUrl}/user_status`, + accountRole: `${baseUrl}/account_role`, + accountStatus: `${baseUrl}/account_status`, + posStatus: `${baseUrl}/pos_status`, + posRole: `${baseUrl}/pos_role`, + licenseType: `${baseUrl}/license_type`, + licenseStatus: `${baseUrl}/license_status`, + posType: `${baseUrl}/pos_type`, + userType: `${baseUrl}/user_type`, + accountType: `${baseUrl}/account_type`, + partnerRole: `${baseUrl}/partner_role`, + businessRole: `${baseUrl}/business_role`, + providerRole: `${baseUrl}/provider_role`, + tokenType: `${baseUrl}/token_type`, + unitType: `${baseUrl}/unit_type`, + goodPricingModel: `${baseUrl}/good_pricing_model`, +}; diff --git a/src/app/shared/apiEnum/constants/index.ts b/src/app/shared/apiEnum/constants/index.ts new file mode 100644 index 0000000..0725fb0 --- /dev/null +++ b/src/app/shared/apiEnum/constants/index.ts @@ -0,0 +1,2 @@ +export * from './apiEnumTranslates'; +export * from './apiRoutes'; diff --git a/src/app/shared/apiEnum/models/index.ts b/src/app/shared/apiEnum/models/index.ts new file mode 100644 index 0000000..d390b4d --- /dev/null +++ b/src/app/shared/apiEnum/models/index.ts @@ -0,0 +1,2 @@ +export * from './io'; +export * from './types'; diff --git a/src/app/shared/apiEnum/models/io.d.ts b/src/app/shared/apiEnum/models/io.d.ts new file mode 100644 index 0000000..38d9cba --- /dev/null +++ b/src/app/shared/apiEnum/models/io.d.ts @@ -0,0 +1,4 @@ +export interface IApiEnumResponse { + name: string; + value: string; +} diff --git a/src/app/shared/apiEnum/models/types.d.ts b/src/app/shared/apiEnum/models/types.d.ts new file mode 100644 index 0000000..3a6fee9 --- /dev/null +++ b/src/app/shared/apiEnum/models/types.d.ts @@ -0,0 +1,3 @@ +import { ENUMS_API_ROUTES } from '../constants/apiRoutes'; + +export type TEnumApi = keyof typeof ENUMS_API_ROUTES; diff --git a/src/app/shared/apiEnum/select.component.html b/src/app/shared/apiEnum/select.component.html new file mode 100644 index 0000000..c2e543d --- /dev/null +++ b/src/app/shared/apiEnum/select.component.html @@ -0,0 +1,12 @@ + + + diff --git a/src/app/shared/apiEnum/select.component.ts b/src/app/shared/apiEnum/select.component.ts new file mode 100644 index 0000000..2290cec --- /dev/null +++ b/src/app/shared/apiEnum/select.component.ts @@ -0,0 +1,31 @@ +import { UikitFieldComponent } from '@/uikit'; +import { Component, computed, inject, Input } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { Select } from 'primeng/select'; +import { Observable } from 'rxjs'; +import { AbstractSelectComponent } from '../abstractClasses'; +import { apiEnumTranslates } from './constants'; +import { IApiEnumResponse, TEnumApi } from './models'; +import { EnumsService } from './services'; + +@Component({ + selector: 'app-enum-select', + templateUrl: './select.component.html', + imports: [UikitFieldComponent, Select, ReactiveFormsModule], +}) +export class EnumSelectComponent extends AbstractSelectComponent { + @Input() type!: TEnumApi; + @Input() customLabel?: string; + + private readonly service = inject(EnumsService); + + label = computed(() => this.customLabel ?? apiEnumTranslates[this.type]); + + override getDataService(): Observable { + return this.service.getAll(this.type); + } + + ngOnInit() { + this.getData(); + } +} diff --git a/src/app/shared/apiEnum/services.ts b/src/app/shared/apiEnum/services.ts new file mode 100644 index 0000000..21c11f7 --- /dev/null +++ b/src/app/shared/apiEnum/services.ts @@ -0,0 +1,17 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { ENUMS_API_ROUTES } from './constants/apiRoutes'; +import { TEnumApi } from './models'; +import { IApiEnumResponse } from './models/io'; + +@Injectable({ providedIn: 'root' }) +export class EnumsService { + constructor(private http: HttpClient) {} + + private apiRoutes = ENUMS_API_ROUTES; + + getAll(type: TEnumApi): Observable { + return this.http.get(this.apiRoutes[type]); + } +}