From 739aef67a3c5166c8da350a0a00d0ab471fa4bfe Mon Sep 17 00:00:00 2001 From: ahasani194 Date: Mon, 16 Mar 2026 17:56:22 +0330 Subject: [PATCH] create consumer domain until pos list --- .../consumer/constants/menuItems.const.ts | 10 +++ .../accounts/components/form.component.html | 41 +++++++++ .../accounts/components/form.component.ts | 40 +++++++++ .../accounts/constants/apiRoutes/index.ts | 6 ++ .../modules/accounts/constants/index.ts | 2 + .../accounts/constants/routes/index.ts | 27 ++++++ .../consumer/modules/accounts/models/index.ts | 1 + .../consumer/modules/accounts/models/io.d.ts | 13 +++ .../modules/accounts/services/main.service.ts | 24 ++++++ .../consumer/modules/accounts/views/index.ts | 2 + .../accounts/views/list.component.html | 17 ++++ .../modules/accounts/views/list.component.ts | 34 ++++++++ .../accounts/views/single.component.html | 1 + .../accounts/views/single.component.ts | 9 ++ .../components/complexes/form.component.html | 15 ++++ .../components/complexes/form.component.ts | 47 +++++++++++ .../complexes/layout.component.html | 5 ++ .../components/complexes/layout.component.ts | 29 +++++++ .../components/complexes/list.component.html | 20 +++++ .../components/complexes/list.component.ts | 48 +++++++++++ .../components/form.component.html | 13 +++ .../components/form.component.ts | 29 +++++++ .../components/layout.component.html | 5 ++ .../components/layout.component.ts | 26 ++++++ .../components/list.component.html | 18 ++++ .../components/list.component.ts | 48 +++++++++++ .../components/poses/form.component.html | 20 +++++ .../components/poses/form.component.ts | 83 +++++++++++++++++++ .../components/poses/layout.component.html | 5 ++ .../components/poses/layout.component.ts | 30 +++++++ .../components/poses/list.component.html | 21 +++++ .../components/poses/list.component.ts | 54 ++++++++++++ .../apiRoutes/businessActivityComplexes.ts | 8 ++ .../constants/apiRoutes/complexPoses.ts | 9 ++ .../constants/apiRoutes/index.ts | 6 ++ .../businessActivities/constants/index.ts | 2 + .../constants/routes/complexes.ts | 46 ++++++++++ .../constants/routes/index.ts | 44 ++++++++++ .../constants/routes/poses.ts | 48 +++++++++++ .../models/complexes_io.d.ts | 13 +++ .../businessActivities/models/index.ts | 3 + .../modules/businessActivities/models/io.d.ts | 12 +++ .../businessActivities/models/poses_io.d.ts | 24 ++++++ .../services/complexes.service.ts | 33 ++++++++ .../services/main.service.ts | 31 +++++++ .../services/poses.service.ts | 43 ++++++++++ .../store/businessActivity.store.ts | 81 ++++++++++++++++++ .../businessActivities/store/complex.store.ts | 76 +++++++++++++++++ .../businessActivities/store/pos.store.ts | 77 +++++++++++++++++ .../views/complexes/index.ts | 1 + .../views/complexes/list.component.html | 1 + .../views/complexes/list.component.ts | 36 ++++++++ .../views/complexes/single.component.html | 22 +++++ .../views/complexes/single.component.ts | 55 ++++++++++++ .../modules/businessActivities/views/index.ts | 2 + .../views/list.component.html | 1 + .../views/list.component.ts | 31 +++++++ .../businessActivities/views/poses/index.ts | 1 + .../views/poses/list.component.html | 1 + .../views/poses/list.component.ts | 43 ++++++++++ .../views/poses/single.component.html | 19 +++++ .../views/poses/single.component.ts | 52 ++++++++++++ .../views/single.component.html | 21 +++++ .../views/single.component.ts | 46 ++++++++++ .../dashboard/views/index.component.html | 2 +- src/app/domains/consumer/routes.ts | 4 + .../services/businessActivities.service.ts | 2 + 67 files changed, 1638 insertions(+), 1 deletion(-) create mode 100644 src/app/domains/consumer/modules/accounts/components/form.component.html create mode 100644 src/app/domains/consumer/modules/accounts/components/form.component.ts create mode 100644 src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts create mode 100644 src/app/domains/consumer/modules/accounts/constants/index.ts create mode 100644 src/app/domains/consumer/modules/accounts/constants/routes/index.ts create mode 100644 src/app/domains/consumer/modules/accounts/models/index.ts create mode 100644 src/app/domains/consumer/modules/accounts/models/io.d.ts create mode 100644 src/app/domains/consumer/modules/accounts/services/main.service.ts create mode 100644 src/app/domains/consumer/modules/accounts/views/index.ts create mode 100644 src/app/domains/consumer/modules/accounts/views/list.component.html create mode 100644 src/app/domains/consumer/modules/accounts/views/list.component.ts create mode 100644 src/app/domains/consumer/modules/accounts/views/single.component.html create mode 100644 src/app/domains/consumer/modules/accounts/views/single.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/form.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/form.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/layout.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/layout.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/list.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/list.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/components/poses/list.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/components/poses/list.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/businessActivityComplexes.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/complexPoses.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/index.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/constants/index.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/constants/routes/complexes.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/constants/routes/index.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/constants/routes/poses.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/models/complexes_io.d.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/models/index.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/models/io.d.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/services/main.service.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/services/poses.service.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/store/complex.store.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/store/pos.store.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/complexes/index.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/index.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/list.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/views/list.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/poses/index.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/poses/list.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/views/poses/list.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/views/poses/single.component.ts create mode 100644 src/app/domains/consumer/modules/businessActivities/views/single.component.html create mode 100644 src/app/domains/consumer/modules/businessActivities/views/single.component.ts diff --git a/src/app/domains/consumer/constants/menuItems.const.ts b/src/app/domains/consumer/constants/menuItems.const.ts index 835f8be..a52678a 100644 --- a/src/app/domains/consumer/constants/menuItems.const.ts +++ b/src/app/domains/consumer/constants/menuItems.const.ts @@ -7,6 +7,16 @@ export const CONSUMER_MENU_ITEMS = [ icon: 'pi pi-fw pi-home', routerLink: ['/'], }, + { + label: 'حساب‌های کاربری', + icon: 'pi pi-fw pi-home', + routerLink: ['/consumer/accounts'], + }, + { + label: 'فعالیت‌های اقتصادی', + icon: 'pi pi-fw pi-home', + routerLink: ['/consumer/business_activities'], + }, ], }, ] as MenuItem[]; diff --git a/src/app/domains/consumer/modules/accounts/components/form.component.html b/src/app/domains/consumer/modules/accounts/components/form.component.html new file mode 100644 index 0000000..79a0dc2 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/components/form.component.html @@ -0,0 +1,41 @@ + +
+ + + + رمز باید حداقل ۸ کاراکتر بوده و شامل حداقل یک حرف بزرگ، یک حرف کوچک، یک عدد و یک کاراکتر ویژه باشد. + + + + + + + + + +
diff --git a/src/app/domains/consumer/modules/accounts/components/form.component.ts b/src/app/domains/consumer/modules/accounts/components/form.component.ts new file mode 100644 index 0000000..a64efb6 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/components/form.component.ts @@ -0,0 +1,40 @@ +import { MustMatch, password } from '@/core/validators'; +import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { UikitFieldComponent } from '@/uikit'; +import { Component, inject, Input } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Dialog } from 'primeng/dialog'; +import { Password } from 'primeng/password'; +import { IAccountRequest, IAccountResponse } from '../models'; +import { AccountsService } from '../services/main.service'; + +@Component({ + selector: 'account-password-form', + templateUrl: './form.component.html', + imports: [ReactiveFormsModule, Dialog, FormFooterActionsComponent, UikitFieldComponent, Password], +}) +export class ConsumerAccountPasswordFormComponent extends AbstractFormDialog< + IAccountRequest, + IAccountResponse +> { + @Input({ required: true }) accountId!: string; + private service = inject(AccountsService); + + form = this.fb.group( + { + password: ['', [Validators.required, password()]], + confirmPassword: ['', [Validators.required]], + }, + { + validators: [MustMatch('password', 'confirmPassword')], + }, + ); + + override submitForm(payload: IAccountRequest) { + return this.service.update(this.accountId, payload); + // @ts-ignore + // const { confirmPassword, ...rest } = payload; + // return this.service.create(rest); + } +} diff --git a/src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts b/src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts new file mode 100644 index 0000000..eec704b --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts @@ -0,0 +1,6 @@ +const baseUrl = '/api/v1/consumer/accounts'; + +export const CONSUMERS_API_ROUTES = { + list: () => `${baseUrl}`, + single: (id: string) => `${baseUrl}/${id}`, +}; diff --git a/src/app/domains/consumer/modules/accounts/constants/index.ts b/src/app/domains/consumer/modules/accounts/constants/index.ts new file mode 100644 index 0000000..ee61bd7 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/constants/index.ts @@ -0,0 +1,2 @@ +export * from './apiRoutes'; +export * from './routes'; diff --git a/src/app/domains/consumer/modules/accounts/constants/routes/index.ts b/src/app/domains/consumer/modules/accounts/constants/routes/index.ts new file mode 100644 index 0000000..b6bc9de --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/constants/routes/index.ts @@ -0,0 +1,27 @@ +import { NamedRoutes } from '@/core'; +import { Routes } from '@angular/router'; + +export type TConsumerAccountsRouteNames = 'accounts' | 'account'; + +export const consumerAccountsNamedRoutes: NamedRoutes = { + accounts: { + path: 'accounts', + loadComponent: () => + import('../../views/list.component').then((m) => m.ConsumerAccountsComponent), + meta: { + title: 'حساب‌های کاربری', + pagePath: () => '/consumer/accounts', + }, + }, + account: { + path: 'accounts/:accountId', + loadComponent: () => + import('../../views/single.component').then((m) => m.ConsumerAccountComponent), + meta: { + title: 'حساب کاربری', + pagePath: (accountId: string) => `/consumer/accounts/${accountId}`, + }, + }, +}; + +export const CONSUMER_ACCOUNTS_ROUTES: Routes = Object.values(consumerAccountsNamedRoutes); diff --git a/src/app/domains/consumer/modules/accounts/models/index.ts b/src/app/domains/consumer/modules/accounts/models/index.ts new file mode 100644 index 0000000..61a518a --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/models/index.ts @@ -0,0 +1 @@ +export * from './io'; diff --git a/src/app/domains/consumer/modules/accounts/models/io.d.ts b/src/app/domains/consumer/modules/accounts/models/io.d.ts new file mode 100644 index 0000000..fd02418 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/models/io.d.ts @@ -0,0 +1,13 @@ +export interface IAccountRawResponse { + id: string; + name: string; +} +export interface IAccountResponse extends IAccountRawResponse {} + +export interface IAccountRequest { + name: string; +} + +export interface IAccountPasswordRequest { + password: string; +} diff --git a/src/app/domains/consumer/modules/accounts/services/main.service.ts b/src/app/domains/consumer/modules/accounts/services/main.service.ts new file mode 100644 index 0000000..a6b9e00 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/services/main.service.ts @@ -0,0 +1,24 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { CONSUMERS_API_ROUTES as CONSUMER_ACCOUNTS_API_ROUTES } from '../constants'; +import { IAccountRawResponse, IAccountRequest, IAccountResponse } from '../models'; + +@Injectable({ providedIn: 'root' }) +export class AccountsService { + constructor(private http: HttpClient) {} + + private apiRoutes = CONSUMER_ACCOUNTS_API_ROUTES; + + getAll(): Observable> { + return this.http.get>(this.apiRoutes.list()); + } + getSingle(accountId: string): Observable { + return this.http.get(this.apiRoutes.single(accountId)); + } + + update(accountId: string, userData: IAccountRequest): Observable { + return this.http.patch(this.apiRoutes.single(accountId), userData); + } +} diff --git a/src/app/domains/consumer/modules/accounts/views/index.ts b/src/app/domains/consumer/modules/accounts/views/index.ts new file mode 100644 index 0000000..bc9dfc9 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/index.ts @@ -0,0 +1,2 @@ +export * from './list.component'; +export * from './single.component'; diff --git a/src/app/domains/consumer/modules/accounts/views/list.component.html b/src/app/domains/consumer/modules/accounts/views/list.component.html new file mode 100644 index 0000000..f7429d0 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/list.component.html @@ -0,0 +1,17 @@ + + +@if (selectedItemForEdit()) { + +} diff --git a/src/app/domains/consumer/modules/accounts/views/list.component.ts b/src/app/domains/consumer/modules/accounts/views/list.component.ts new file mode 100644 index 0000000..6f93257 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/list.component.ts @@ -0,0 +1,34 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { AbstractList } from '@/shared/abstractClasses/abstract-list'; +import { PageDataListComponent } from '@/shared/components/pageDataList/page-data-list.component'; +import { Component, inject } from '@angular/core'; +import { ConsumerAccountPasswordFormComponent } from '../components/form.component'; +import { IAccountResponse } from '../models'; +import { AccountsService } from '../services/main.service'; + +@Component({ + selector: 'consumer-accounts', + templateUrl: './list.component.html', + imports: [PageDataListComponent, ConsumerAccountPasswordFormComponent], +}) +export class ConsumerAccountsComponent extends AbstractList { + private readonly service = inject(AccountsService); + + override setColumns(): void { + this.columns = [ + { field: 'id', header: 'شناسه' }, + { field: 'username', header: 'نام کاربری', type: 'nested', nestedPath: 'account.username' }, + { field: 'role', header: 'نقش' }, + { field: 'status', header: 'وضعیت', type: 'nested', nestedPath: 'account.status' }, + { + field: 'created_at', + header: 'تاریخ ایجاد', + type: 'date', + }, + ]; + } + + override getDataRequest() { + return this.service.getAll(); + } +} diff --git a/src/app/domains/consumer/modules/accounts/views/single.component.html b/src/app/domains/consumer/modules/accounts/views/single.component.html new file mode 100644 index 0000000..7144e26 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/single.component.html @@ -0,0 +1 @@ +
diff --git a/src/app/domains/consumer/modules/accounts/views/single.component.ts b/src/app/domains/consumer/modules/accounts/views/single.component.ts new file mode 100644 index 0000000..b7e27c0 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/single.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'consumer-account', + templateUrl: './single.component.html', +}) +export class ConsumerAccountComponent { + constructor() {} +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.html b/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.html new file mode 100644 index 0000000..394ad56 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.html @@ -0,0 +1,15 @@ + +
+ + + + + +
diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts b/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts new file mode 100644 index 0000000..b71a8c7 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/form.component.ts @@ -0,0 +1,47 @@ +// import { CatalogRolesComponent } from '@/shared/catalog/roles'; +import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { InputComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { Component, inject, Input } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Dialog } from 'primeng/dialog'; +import { IComplexRequest, IComplexResponse } from '../../models'; +import { ConsumerComplexesService } from '../../services/complexes.service'; + +@Component({ + selector: 'consumer-complex-form', + templateUrl: './form.component.html', + imports: [ReactiveFormsModule, Dialog, InputComponent, FormFooterActionsComponent], +}) +export class ConsumerComplexFormComponent extends AbstractFormDialog< + IComplexRequest, + IComplexResponse +> { + private readonly service = inject(ConsumerComplexesService); + + @Input({ required: true }) businessActivityId!: string; + @Input({ required: true }) complexId!: string; + + initForm = () => { + return this.fb.group({ + name: [this.initialValues?.name || '', [Validators.required]], + tax_id: [this.initialValues?.tax_id || '', [Validators.required]], + address: [this.initialValues?.address || '', [Validators.required]], + }); + }; + + form = this.initForm(); + + get preparedTitle() { + return `ویرایش فروشگاه ${this.initialValues?.name}`; + } + + override ngOnChanges(): void { + this.form = this.initForm(); + } + + submitForm() { + const formValue = this.form.value as IComplexRequest; + return this.service.update(this.businessActivityId, this.complexId, formValue); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.html b/src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.html new file mode 100644 index 0000000..5416fe1 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.html @@ -0,0 +1,5 @@ +@if (loading()) { + +} @else { + +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.ts b/src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.ts new file mode 100644 index 0000000..ec2bdaf --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/layout.component.ts @@ -0,0 +1,29 @@ +import { PageLoadingComponent } from '@/shared/components/page-loading.component'; +import pageParamsUtils from '@/utils/page-params.utils'; +import { Component, computed, inject } from '@angular/core'; +import { ActivatedRoute, RouterOutlet } from '@angular/router'; +import { ConsumerComplexStore } from '../../store/complex.store'; + +@Component({ + selector: 'consumer-complex-layout', + templateUrl: './layout.component.html', + imports: [PageLoadingComponent, RouterOutlet], +}) +export class ConsumerComplexLayoutComponent { + private readonly store = inject(ConsumerComplexStore); + private readonly route = inject(ActivatedRoute); + + readonly loading = computed(() => this.store.loading()); + readonly pageParams = computed(() => pageParamsUtils(this.route)); + + readonly businessId = computed(() => this.pageParams()['businessActivityId']!); + readonly complexId = computed(() => this.pageParams()['complexId']!); + + getData() { + this.store.getData(this.businessId(), this.complexId()); + } + + ngOnInit() { + this.getData(); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html b/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html new file mode 100644 index 0000000..3198c56 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.html @@ -0,0 +1,20 @@ + + + diff --git a/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.ts b/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.ts new file mode 100644 index 0000000..f7cb3e9 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/complexes/list.component.ts @@ -0,0 +1,48 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { AbstractList } from '@/shared/abstractClasses/abstract-list'; +import { + IColumn, + PageDataListComponent, +} from '@/shared/components/pageDataList/page-data-list.component'; +import { Component, inject, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { consumerComplexesNamedRoutes } from '../../constants/routes/complexes'; +import { IComplexResponse } from '../../models'; +import { ConsumerComplexesService } from '../../services/complexes.service'; +import { ConsumerComplexFormComponent } from './form.component'; + +@Component({ + selector: 'consumer-complex-list', + templateUrl: './list.component.html', + imports: [PageDataListComponent, ConsumerComplexFormComponent], +}) +export class ConsumerComplexListComponent extends AbstractList { + @Input({ required: true }) businessId!: string; + @Input() fullHeight?: boolean; + @Input() header: IColumn[] = [ + { field: 'id', header: 'شناسه' }, + { field: 'name', header: 'عنوان' }, + { + field: 'created_at', + header: 'تاریخ ایجاد', + type: 'date', + }, + ]; + + private readonly service = inject(ConsumerComplexesService); + private readonly router = inject(Router); + + override setColumns(): void { + this.columns = this.header; + } + + override getDataRequest() { + return this.service.getAll(this.businessId); + } + + toSinglePage(item: IComplexResponse) { + this.router.navigateByUrl( + consumerComplexesNamedRoutes.complex.meta.pagePath!(this.businessId, item.id), + ); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/form.component.html b/src/app/domains/consumer/modules/businessActivities/components/form.component.html new file mode 100644 index 0000000..57499c6 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/form.component.html @@ -0,0 +1,13 @@ + +
+ + + +
diff --git a/src/app/domains/consumer/modules/businessActivities/components/form.component.ts b/src/app/domains/consumer/modules/businessActivities/components/form.component.ts new file mode 100644 index 0000000..d20d38b --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/form.component.ts @@ -0,0 +1,29 @@ +import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { InputComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { Component, inject, Input } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Dialog } from 'primeng/dialog'; +import { IBusinessActivityRequest, IBusinessActivityResponse } from '../models'; +import { BusinessActivitiesService } from '../services/main.service'; + +@Component({ + selector: 'consumer-businessActivity-form', + templateUrl: './form.component.html', + imports: [ReactiveFormsModule, Dialog, FormFooterActionsComponent, InputComponent], +}) +export class ConsumerBusinessActivityFormComponent extends AbstractFormDialog< + IBusinessActivityRequest, + IBusinessActivityResponse +> { + @Input({ required: true }) businessId!: string; + private service = inject(BusinessActivitiesService); + + form = this.fb.group({ + name: [this.initialValues?.name, [Validators.required]], + }); + + override submitForm(payload: IBusinessActivityRequest) { + return this.service.update(this.businessId, payload); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/layout.component.html b/src/app/domains/consumer/modules/businessActivities/components/layout.component.html new file mode 100644 index 0000000..5416fe1 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/layout.component.html @@ -0,0 +1,5 @@ +@if (loading()) { + +} @else { + +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/layout.component.ts b/src/app/domains/consumer/modules/businessActivities/components/layout.component.ts new file mode 100644 index 0000000..c469483 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/layout.component.ts @@ -0,0 +1,26 @@ +import { PageLoadingComponent } from '@/shared/components/page-loading.component'; +import { Component, computed, inject, signal } from '@angular/core'; +import { ActivatedRoute, RouterOutlet } from '@angular/router'; +import { BusinessActivityStore } from '../store/businessActivity.store'; + +@Component({ + selector: 'businessActivity-layout', + templateUrl: './layout.component.html', + imports: [PageLoadingComponent, RouterOutlet], +}) +export class BusinessActivityLayoutComponent { + private readonly route = inject(ActivatedRoute); + private readonly store = inject(BusinessActivityStore); + + readonly businessId = signal(this.route.snapshot.paramMap.get('businessActivityId')!); + + readonly loading = computed(() => this.store.loading()); + + getData() { + this.store.getData(this.businessId()); + } + + ngOnInit() { + this.getData(); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/list.component.html b/src/app/domains/consumer/modules/businessActivities/components/list.component.html new file mode 100644 index 0000000..87efeae --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/list.component.html @@ -0,0 +1,18 @@ + + + diff --git a/src/app/domains/consumer/modules/businessActivities/components/list.component.ts b/src/app/domains/consumer/modules/businessActivities/components/list.component.ts new file mode 100644 index 0000000..5707a17 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/list.component.ts @@ -0,0 +1,48 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { AbstractList } from '@/shared/abstractClasses/abstract-list'; +import { + IColumn, + PageDataListComponent, +} from '@/shared/components/pageDataList/page-data-list.component'; +import { Component, inject, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { consumerBusinessActivityNamedRoutes } from '../constants'; +import { IBusinessActivityResponse } from '../models'; +import { BusinessActivitiesService } from '../services/main.service'; +import { ConsumerBusinessActivityFormComponent } from './form.component'; + +@Component({ + selector: 'consumer-businessActivity-list', + templateUrl: './list.component.html', + imports: [PageDataListComponent, ConsumerBusinessActivityFormComponent], +}) +export class ConsumerBusinessActivityListComponent extends AbstractList { + @Input() fullHeight?: boolean; + @Input() header: IColumn[] = [ + { field: 'id', header: 'شناسه' }, + { field: 'name', header: 'عنوان' }, + { field: 'guild', header: 'صنف', type: 'nested', nestedPath: 'name' }, + { + field: 'created_at', + header: 'تاریخ ایجاد', + type: 'date', + }, + ]; + + private readonly service = inject(BusinessActivitiesService); + private readonly router = inject(Router); + + override setColumns(): void { + this.columns = this.header; + } + + override getDataRequest() { + return this.service.getAll(); + } + + toSinglePage(item: IBusinessActivityResponse) { + this.router.navigateByUrl( + consumerBusinessActivityNamedRoutes.businessActivity.meta.pagePath!(item.id), + ); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html new file mode 100644 index 0000000..d902c50 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.html @@ -0,0 +1,20 @@ + +
+ + + + + @if (form.controls.pos_type.value === "PSP") { + + + } + + +
diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts new file mode 100644 index 0000000..0a35407 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/form.component.ts @@ -0,0 +1,83 @@ +// import { CatalogRolesComponent } from '@/shared/catalog/roles'; +import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { EnumSelectComponent } from '@/shared/apiEnum/select.component'; +import { CatalogProviderSelectComponent } from '@/shared/catalog'; +import { CatalogDeviceSelectComponent } from '@/shared/catalog/devices'; +import { InputComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { Component, inject, Input } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Dialog } from 'primeng/dialog'; +import { IPosRequest, IPosResponse } from '../../models'; +import { ConsumerPosesService } from '../../services/poses.service'; + +@Component({ + selector: 'consumer-pos-form', + templateUrl: './form.component.html', + imports: [ + ReactiveFormsModule, + Dialog, + InputComponent, + FormFooterActionsComponent, + CatalogDeviceSelectComponent, + CatalogProviderSelectComponent, + EnumSelectComponent, + ], +}) +export class ConsumerPosFormComponent extends AbstractFormDialog { + private readonly service = inject(ConsumerPosesService); + + @Input({ required: true }) businessActivityId!: string; + @Input({ required: true }) complexId!: string; + @Input({ required: true }) posId!: string; + + initForm = () => { + const form = this.fb.group({ + name: [this.initialValues?.name || '', [Validators.required]], + serial: [this.initialValues?.serial || '', [Validators.required]], + // model: [this.initialValues?.model || '', [Validators.required]], + pos_type: [this.initialValues?.pos_type || '', [Validators.required]], + device_id: [this.initialValues?.device?.id || ''], + provider_id: [this.initialValues?.provider?.id || ''], + }); + form.controls.pos_type.valueChanges.subscribe((value) => { + if (value === 'PSP') { + form.addControl( + 'device_id', + this.fb.control(this.initialValues?.device?.id ?? '', { + nonNullable: true, + validators: [Validators.required], + }), + ); + form.addControl( + 'provider_id', + this.fb.control(this.initialValues?.provider?.id ?? '', { + nonNullable: true, + validators: [Validators.required], + }), + ); + } else { + // @ts-ignore + form.removeControl('device_id'); + // @ts-ignore + form.removeControl('provider_id'); + } + }); + return form; + }; + + form = this.initForm(); + + get preparedTitle() { + return `ویرایش پایانه فروش ${this.initialValues?.name}`; + } + + override ngOnChanges(): void { + this.form = this.initForm(); + } + + submitForm() { + const formValue = this.form.value as IPosRequest; + return this.service.update(this.businessActivityId, this.complexId, this.posId, formValue); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.html b/src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.html new file mode 100644 index 0000000..5416fe1 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.html @@ -0,0 +1,5 @@ +@if (loading()) { + +} @else { + +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.ts b/src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.ts new file mode 100644 index 0000000..8a13e4a --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/layout.component.ts @@ -0,0 +1,30 @@ +import { PageLoadingComponent } from '@/shared/components/page-loading.component'; +import pageParamsUtils from '@/utils/page-params.utils'; +import { Component, computed, inject } from '@angular/core'; +import { ActivatedRoute, RouterOutlet } from '@angular/router'; +import { PosStore } from '../../store/pos.store'; + +@Component({ + selector: 'superAdmin-consumer-pos-layout', + templateUrl: './layout.component.html', + imports: [PageLoadingComponent, RouterOutlet], +}) +export class SuperAdminConsumerPosLayoutComponent { + private readonly store = inject(PosStore); + private readonly route = inject(ActivatedRoute); + + readonly loading = computed(() => this.store.loading()); + readonly pageParams = computed(() => pageParamsUtils(this.route)); + + readonly businessId = computed(() => this.pageParams()['businessActivityId']!); + readonly complexId = computed(() => this.pageParams()['complexId']!); + readonly posId = computed(() => this.pageParams()['posId']!); + + getData() { + this.store.getData(this.businessId(), this.complexId(), this.posId()); + } + + ngOnInit() { + this.getData(); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/list.component.html b/src/app/domains/consumer/modules/businessActivities/components/poses/list.component.html new file mode 100644 index 0000000..ceaee81 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/list.component.html @@ -0,0 +1,21 @@ + + + diff --git a/src/app/domains/consumer/modules/businessActivities/components/poses/list.component.ts b/src/app/domains/consumer/modules/businessActivities/components/poses/list.component.ts new file mode 100644 index 0000000..593ba48 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/components/poses/list.component.ts @@ -0,0 +1,54 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { AbstractList } from '@/shared/abstractClasses/abstract-list'; +import { + IColumn, + PageDataListComponent, +} from '@/shared/components/pageDataList/page-data-list.component'; +import { Component, inject, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { consumerPosesNamedRoutes } from '../../constants/routes/poses'; +import { IPosResponse } from '../../models'; +import { ConsumerPosesService } from '../../services/poses.service'; +import { ConsumerPosFormComponent } from './form.component'; + +@Component({ + selector: 'consumer-poses-list', + templateUrl: './list.component.html', + imports: [PageDataListComponent, ConsumerPosFormComponent], +}) +export class ConsumerPosesComponent extends AbstractList { + @Input({ required: true }) businessId!: string; + @Input({ required: true }) complexId!: string; + @Input() fullHeight?: boolean; + @Input() header: IColumn[] = [ + { field: 'id', header: 'شناسه' }, + { field: 'name', header: 'عنوان' }, + { field: 'serial', header: 'شماره سریال' }, + { field: 'device', header: 'دستگاه', type: 'nested', nestedPath: 'device.name' }, + { field: 'pos_type', header: 'نوع دستگاه' }, + { field: 'provider', header: 'ارایه‌دهنده', type: 'nested', nestedPath: 'provider.name' }, + { field: 'status', header: 'وضعیت' }, + { + field: 'created_at', + header: 'تاریخ ایجاد', + type: 'date', + }, + ]; + + private readonly service = inject(ConsumerPosesService); + private readonly router = inject(Router); + + override setColumns(): void { + this.columns = this.header; + } + + override getDataRequest() { + return this.service.getAll(this.businessId, this.complexId); + } + + toSinglePage(item: IPosResponse) { + this.router.navigateByUrl( + consumerPosesNamedRoutes.pos.meta.pagePath!(this.businessId, this.complexId, item.id), + ); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/businessActivityComplexes.ts b/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/businessActivityComplexes.ts new file mode 100644 index 0000000..bcbffbc --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/businessActivityComplexes.ts @@ -0,0 +1,8 @@ +const baseUrl = (business_activity_id: string) => + `/api/v1/consumer/business_activities/${business_activity_id}/complexes`; + +export const BUSINESS_ACTIVITY_COMPLEXES_API_ROUTES = { + list: (business_activity_id: string) => `${baseUrl(business_activity_id)}`, + single: (business_activity_id: string, complex_id: string) => + `${baseUrl(business_activity_id)}/${complex_id}`, +}; diff --git a/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/complexPoses.ts b/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/complexPoses.ts new file mode 100644 index 0000000..2a09ef0 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/complexPoses.ts @@ -0,0 +1,9 @@ +const baseUrl = (business_activity_id: string, complex_id: string) => + `/api/v1/consumer/business_activities/${business_activity_id}/complexes/${complex_id}/poses`; + +export const COMPLEX_POSES_API_ROUTES = { + list: (business_activity_id: string, complex_id: string) => + `${baseUrl(business_activity_id, complex_id)}`, + single: (business_activity_id: string, complex_id: string, posId: string) => + `${baseUrl(business_activity_id, complex_id)}/${posId}`, +}; diff --git a/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/index.ts b/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/index.ts new file mode 100644 index 0000000..570ea9e --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/constants/apiRoutes/index.ts @@ -0,0 +1,6 @@ +const baseUrl = '/api/v1/consumer/business_activities'; + +export const CONSUMER_BUSINESS_ACTIVITIES_API_ROUTES = { + list: () => `${baseUrl}`, + single: (id: string) => `${baseUrl}/${id}`, +}; diff --git a/src/app/domains/consumer/modules/businessActivities/constants/index.ts b/src/app/domains/consumer/modules/businessActivities/constants/index.ts new file mode 100644 index 0000000..ee61bd7 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/constants/index.ts @@ -0,0 +1,2 @@ +export * from './apiRoutes'; +export * from './routes'; diff --git a/src/app/domains/consumer/modules/businessActivities/constants/routes/complexes.ts b/src/app/domains/consumer/modules/businessActivities/constants/routes/complexes.ts new file mode 100644 index 0000000..7475b76 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/constants/routes/complexes.ts @@ -0,0 +1,46 @@ +import { NamedRoutes } from '@/core'; +import { Routes } from '@angular/router'; +import { CONSUMER_POSES_ROUTES } from './poses'; + +export type TComplexesRouteNames = 'complexes' | 'complex'; + +const baseUrl = (businessId: string) => `/consumer/business_activities/${businessId}/complexes`; + +export const consumerComplexesNamedRoutes: NamedRoutes = { + complexes: { + path: 'complexes', + loadComponent: () => + import('../../views/complexes/list.component').then((m) => m.ConsumerComplexesComponent), + meta: { + title: 'فروشگاه‌ها', + pagePath: (businessId: string) => baseUrl(businessId), + }, + }, + complex: { + path: 'complexes/:complexId', + loadComponent: () => + import('../../views/complexes/single.component').then((m) => m.ConsumerComplexComponent), + meta: { + title: 'فروشگاه', + pagePath: (businessId: string, complexId: string) => `${baseUrl(businessId)}/${complexId}`, + }, + }, +}; + +export const CONSUMER_COMPLEXES_ROUTES: Routes = [ + consumerComplexesNamedRoutes.complexes, + { + path: consumerComplexesNamedRoutes.complex.path, + loadComponent: () => + import('../../components/complexes/layout.component').then( + (m) => m.ConsumerComplexLayoutComponent, + ), + children: [ + { + ...consumerComplexesNamedRoutes.complex, + path: '', + }, + ...CONSUMER_POSES_ROUTES, + ], + }, +]; diff --git a/src/app/domains/consumer/modules/businessActivities/constants/routes/index.ts b/src/app/domains/consumer/modules/businessActivities/constants/routes/index.ts new file mode 100644 index 0000000..ae7ab6b --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/constants/routes/index.ts @@ -0,0 +1,44 @@ +import { NamedRoutes } from '@/core'; +import { Routes } from '@angular/router'; +import { CONSUMER_COMPLEXES_ROUTES } from './complexes'; + +export type TConsumerBusinessActivityRouteNames = 'businessActivities' | 'businessActivity'; + +export const consumerBusinessActivityNamedRoutes: NamedRoutes = + { + businessActivities: { + path: 'business_activities', + loadComponent: () => + import('../../views/list.component').then((m) => m.ConsumerBusinessActivitiesComponent), + meta: { + title: 'کسب‌و‌کارها', + pagePath: () => '/consumer/business_activities', + }, + }, + businessActivity: { + path: 'business_activities/:businessActivityId', + loadComponent: () => + import('../../views/single.component').then((m) => m.ConsumerBusinessActivityComponent), + meta: { + title: 'کسب‌و‌کار', + pagePath: (businessActivityId: string) => + `/consumer/business_activities/${businessActivityId}`, + }, + }, + }; + +export const CONSUMER_BUSINESS_ACTIVITIES_ROUTES: Routes = [ + consumerBusinessActivityNamedRoutes.businessActivities, + { + path: consumerBusinessActivityNamedRoutes.businessActivity.path, + loadComponent: () => + import('../../components/layout.component').then((m) => m.BusinessActivityLayoutComponent), + children: [ + { + ...consumerBusinessActivityNamedRoutes.businessActivity, + path: '', + }, + ...CONSUMER_COMPLEXES_ROUTES, + ], + }, +]; diff --git a/src/app/domains/consumer/modules/businessActivities/constants/routes/poses.ts b/src/app/domains/consumer/modules/businessActivities/constants/routes/poses.ts new file mode 100644 index 0000000..62dc66a --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/constants/routes/poses.ts @@ -0,0 +1,48 @@ +import { NamedRoutes } from '@/core'; +import { Routes } from '@angular/router'; + +export type TPosesRouteNames = 'poses' | 'pos'; + +const baseUrl = (businessId: string, complexId: string) => + `/consumer/business_activities/${businessId}/complexes/${complexId}/poses`; + +export const consumerPosesNamedRoutes: NamedRoutes = { + poses: { + path: 'poses', + loadComponent: () => + import('../../views/poses/list.component').then((m) => m.SuperAdminUserPosesComponent), + // @ts-ignore + meta: { + title: 'پایانه‌های فروش', + pagePath: (businessId: string, complexId: string) => baseUrl(businessId, complexId), + }, + }, + pos: { + path: 'poses/:posId', + loadComponent: () => + import('../../views/poses/single.component').then((m) => m.SuperAdminUserPosComponent), + // @ts-ignore + meta: { + title: 'پایانه‌ی فروش', + pagePath: (businessId: string, complexId: string, posId: string) => + `${baseUrl(businessId, complexId)}/${posId}`, + }, + }, +}; + +export const CONSUMER_POSES_ROUTES: Routes = [ + consumerPosesNamedRoutes.poses, + { + path: consumerPosesNamedRoutes.pos.path, + loadComponent: () => + import('../../components/poses/layout.component').then( + (m) => m.SuperAdminConsumerPosLayoutComponent, + ), + children: [ + { + path: '', + loadComponent: consumerPosesNamedRoutes.pos.loadComponent, + }, + ], + }, +]; diff --git a/src/app/domains/consumer/modules/businessActivities/models/complexes_io.d.ts b/src/app/domains/consumer/modules/businessActivities/models/complexes_io.d.ts new file mode 100644 index 0000000..ba9ebe0 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/models/complexes_io.d.ts @@ -0,0 +1,13 @@ +export interface IComplexRawResponse { + name: string; + address: string; + tax_id: string; + id: string; +} +export interface IComplexResponse extends IComplexRawResponse {} + +export interface IComplexRequest { + name: string; + address: string; + tax_id: string; +} diff --git a/src/app/domains/consumer/modules/businessActivities/models/index.ts b/src/app/domains/consumer/modules/businessActivities/models/index.ts new file mode 100644 index 0000000..cf6f041 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/models/index.ts @@ -0,0 +1,3 @@ +export * from './complexes_io'; +export * from './io'; +export * from './poses_io'; diff --git a/src/app/domains/consumer/modules/businessActivities/models/io.d.ts b/src/app/domains/consumer/modules/businessActivities/models/io.d.ts new file mode 100644 index 0000000..b04691b --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/models/io.d.ts @@ -0,0 +1,12 @@ +import ISummary from '@/core/models/summary'; + +export interface IBusinessActivityRawResponse { + id: string; + name: string; + guild: ISummary; +} +export interface IBusinessActivityResponse extends IBusinessActivityRawResponse {} + +export interface IBusinessActivityRequest { + name: string; +} diff --git a/src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts b/src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts new file mode 100644 index 0000000..1c76cae --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/models/poses_io.d.ts @@ -0,0 +1,24 @@ +import ISummary from '@/core/models/summary'; + +export interface IPosRawResponse { + id: string; + name: string; + serial: string; + model?: string; + status: string; + pos_type: string; + complex: ISummary; + device?: ISummary; + provider?: ISummary; +} +export interface IPosResponse extends IPosRawResponse {} + +export interface IPosRequest { + name: string; + serial: string; + model?: string; + status: string; + pos_type: string; + device_id: string; + provider_id: string; +} diff --git a/src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts b/src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts new file mode 100644 index 0000000..4a36beb --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/services/complexes.service.ts @@ -0,0 +1,33 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { BUSINESS_ACTIVITY_COMPLEXES_API_ROUTES } from '../constants/apiRoutes/businessActivityComplexes'; +import { IComplexRawResponse, IComplexRequest, IComplexResponse } from '../models'; + +@Injectable({ providedIn: 'root' }) +export class ConsumerComplexesService { + constructor(private http: HttpClient) {} + + private apiRoutes = BUSINESS_ACTIVITY_COMPLEXES_API_ROUTES; + + getAll(businessActivityId: string): Observable> { + return this.http.get>( + this.apiRoutes.list(businessActivityId), + ); + } + getSingle(businessActivityId: string, complexId: string): Observable { + return this.http.get(this.apiRoutes.single(businessActivityId, complexId)); + } + + update( + businessActivityId: string, + complexId: string, + data: IComplexRequest, + ): Observable { + return this.http.patch( + this.apiRoutes.single(businessActivityId, complexId), + data, + ); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/services/main.service.ts b/src/app/domains/consumer/modules/businessActivities/services/main.service.ts new file mode 100644 index 0000000..354c96d --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/services/main.service.ts @@ -0,0 +1,31 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { CONSUMER_BUSINESS_ACTIVITIES_API_ROUTES } from '../constants'; +import { + IBusinessActivityRawResponse, + IBusinessActivityRequest, + IBusinessActivityResponse, +} from '../models'; + +@Injectable({ providedIn: 'root' }) +export class BusinessActivitiesService { + constructor(private http: HttpClient) {} + + private apiRoutes = CONSUMER_BUSINESS_ACTIVITIES_API_ROUTES; + + getAll(): Observable> { + return this.http.get>(this.apiRoutes.list()); + } + getSingle(businessId: string): Observable { + return this.http.get(this.apiRoutes.single(businessId)); + } + + update( + businessId: string, + userData: IBusinessActivityRequest, + ): Observable { + return this.http.patch(this.apiRoutes.single(businessId), userData); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/services/poses.service.ts b/src/app/domains/consumer/modules/businessActivities/services/poses.service.ts new file mode 100644 index 0000000..5a5e24f --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/services/poses.service.ts @@ -0,0 +1,43 @@ +import { IPaginatedResponse } from '@/core/models/service.model'; +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { COMPLEX_POSES_API_ROUTES } from '../constants/apiRoutes/complexPoses'; +import { IPosRawResponse, IPosRequest, IPosResponse } from '../models'; + +@Injectable({ providedIn: 'root' }) +export class ConsumerPosesService { + constructor(private http: HttpClient) {} + + private apiRoutes = COMPLEX_POSES_API_ROUTES; + + getAll( + businessActivityId: string, + complexId: string, + ): Observable> { + return this.http.get>( + this.apiRoutes.list(businessActivityId, complexId), + ); + } + getSingle( + businessActivityId: string, + complexId: string, + posId: string, + ): Observable { + return this.http.get( + this.apiRoutes.single(businessActivityId, complexId, posId), + ); + } + + update( + businessActivityId: string, + complexId: string, + posId: string, + data: IPosRequest, + ): Observable { + return this.http.patch( + this.apiRoutes.single(businessActivityId, complexId, posId), + data, + ); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts b/src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts new file mode 100644 index 0000000..bc8e1ff --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts @@ -0,0 +1,81 @@ +import { EntityState, EntityStore } from '@/core/state'; +import { computed, inject, Injectable } from '@angular/core'; +import { MenuItem } from 'primeng/api'; +import { catchError, finalize, throwError } from 'rxjs'; +import { consumerBusinessActivityNamedRoutes } from '../constants'; +import { IBusinessActivityResponse } from '../models'; +import { BusinessActivitiesService } from '../services/main.service'; + +interface BusinessActivityState extends EntityState { + breadcrumbItems: MenuItem[]; +} + +@Injectable({ + providedIn: 'root', +}) +export class BusinessActivityStore extends EntityStore< + IBusinessActivityResponse, + BusinessActivityState +> { + private readonly service = inject(BusinessActivitiesService); + constructor() { + super({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } + + breadcrumbItems = computed(() => this._state().breadcrumbItems); + + private setBreadcrumb(business_id: string) { + this.patchState({ + breadcrumbItems: [ + { + ...consumerBusinessActivityNamedRoutes.businessActivities.meta, + routerLink: consumerBusinessActivityNamedRoutes.businessActivities.meta.pagePath!(), + }, + { + title: this.entity()?.name, + routerLink: + consumerBusinessActivityNamedRoutes.businessActivity.meta.pagePath!(business_id), + }, + ], + }); + } + + getData(business_id: string) { + this.patchState({ loading: true }); + this.service + .getSingle(business_id) + .pipe( + finalize(() => { + this.patchState({ loading: false }); + }), + catchError(() => { + this.patchState({ + error: '', + }); + return throwError(''); + }), + ) + .subscribe((entity) => { + this.patchState({ entity }); + this.setBreadcrumb(business_id); + }); + } + + override reset(): void { + this.setState({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/store/complex.store.ts b/src/app/domains/consumer/modules/businessActivities/store/complex.store.ts new file mode 100644 index 0000000..02d6172 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/store/complex.store.ts @@ -0,0 +1,76 @@ +import { EntityState, EntityStore } from '@/core/state'; +import { computed, inject, Injectable } from '@angular/core'; +import { MenuItem } from 'primeng/api'; +import { catchError, finalize, throwError } from 'rxjs'; +import { consumerComplexesNamedRoutes } from '../constants/routes/complexes'; +import { IComplexResponse } from '../models'; +import { ConsumerComplexesService } from '../services/complexes.service'; + +interface ComplexState extends EntityState { + breadcrumbItems: MenuItem[]; +} + +@Injectable({ + providedIn: 'root', +}) +export class ConsumerComplexStore extends EntityStore { + private readonly service = inject(ConsumerComplexesService); + constructor() { + super({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } + breadcrumbItems = computed(() => this._state().breadcrumbItems); + + private setBreadcrumb(businessId: string, complexId: string) { + this.patchState({ + breadcrumbItems: [ + { + ...consumerComplexesNamedRoutes.complexes.meta, + routerLink: consumerComplexesNamedRoutes.complexes.meta.pagePath!(businessId), + }, + { + title: this.entity()?.name, + routerLink: consumerComplexesNamedRoutes.complex.meta.pagePath!(businessId, complexId), + }, + ], + }); + } + + getData(businessId: string, complexId: string) { + this.patchState({ loading: true }); + this.service + .getSingle(businessId, complexId) + .pipe( + finalize(() => { + this.patchState({ loading: false }); + }), + catchError(() => { + this.patchState({ + error: '', + }); + return throwError(''); + }), + ) + .subscribe((entity) => { + this.patchState({ entity }); + this.setBreadcrumb(businessId, complexId); + }); + } + + override reset(): void { + this.setState({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/store/pos.store.ts b/src/app/domains/consumer/modules/businessActivities/store/pos.store.ts new file mode 100644 index 0000000..0ba1d34 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/store/pos.store.ts @@ -0,0 +1,77 @@ +import { EntityState, EntityStore } from '@/core/state'; +import { computed, inject, Injectable } from '@angular/core'; +import { MenuItem } from 'primeng/api'; +import { catchError, finalize, throwError } from 'rxjs'; +import { consumerPosesNamedRoutes } from '../constants/routes/poses'; +import { IPosResponse } from '../models'; +import { ConsumerPosesService } from '../services/poses.service'; + +interface PosState extends EntityState { + breadcrumbItems: MenuItem[]; +} + +@Injectable({ + providedIn: 'root', +}) +export class PosStore extends EntityStore { + private readonly service = inject(ConsumerPosesService); + constructor() { + super({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } + + breadcrumbItems = computed(() => this._state().breadcrumbItems); + + private setBreadcrumb(businessId: string, complexId: string, posId: string) { + this.patchState({ + breadcrumbItems: [ + { + ...consumerPosesNamedRoutes.poses.meta, + routerLink: consumerPosesNamedRoutes.poses.meta.pagePath!(businessId, complexId), + }, + { + title: this.entity()?.name, + routerLink: consumerPosesNamedRoutes.pos.meta.pagePath!(businessId, complexId, posId), + }, + ], + }); + } + + getData(businessId: string, complexId: string, posId: string) { + this.patchState({ loading: true }); + this.service + .getSingle(businessId, complexId, posId) + .pipe( + finalize(() => { + this.patchState({ loading: false }); + }), + catchError(() => { + this.patchState({ + error: '', + }); + return throwError(''); + }), + ) + .subscribe((entity) => { + this.patchState({ entity }); + this.setBreadcrumb(businessId, complexId, posId); + }); + } + + override reset(): void { + this.setState({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/views/complexes/index.ts b/src/app/domains/consumer/modules/businessActivities/views/complexes/index.ts new file mode 100644 index 0000000..576a89e --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/complexes/index.ts @@ -0,0 +1 @@ +export * from './list.component'; diff --git a/src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.html b/src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.html new file mode 100644 index 0000000..6c6f198 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.html @@ -0,0 +1 @@ + diff --git a/src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.ts b/src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.ts new file mode 100644 index 0000000..b66aa4c --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/complexes/list.component.ts @@ -0,0 +1,36 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { BreadcrumbService } from '@/core/services'; +import pageParamsUtils from '@/utils/page-params.utils'; +import { Component, computed, inject, signal } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { ConsumerComplexListComponent } from '../../components/complexes/list.component'; +import { consumerComplexesNamedRoutes } from '../../constants/routes/complexes'; +import { BusinessActivityStore } from '../../store/businessActivity.store'; + +@Component({ + selector: 'superAdmin-user-complexes', + templateUrl: './list.component.html', + imports: [ConsumerComplexListComponent], +}) +export class ConsumerComplexesComponent { + private readonly route = inject(ActivatedRoute); + private readonly breadcrumbService = inject(BreadcrumbService); + private readonly businessStore = inject(BusinessActivityStore); + + pageParams = computed(() => pageParamsUtils(this.route)); + businessId = signal(this.pageParams()['businessActivityId']); + + ngAfterViewInit() { + this.setBreadcrumb(); + } + + setBreadcrumb() { + this.breadcrumbService.setItems([ + ...this.businessStore.breadcrumbItems(), + { + title: consumerComplexesNamedRoutes.complexes.meta.title, + routerLink: consumerComplexesNamedRoutes.complexes.meta.pagePath!(this.businessId()), + }, + ]); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.html b/src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.html new file mode 100644 index 0000000..b7a361f --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.html @@ -0,0 +1,22 @@ +
+ +
+
+ + + +
+
+
+ + + + +
diff --git a/src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.ts b/src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.ts new file mode 100644 index 0000000..c5e36e3 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/complexes/single.component.ts @@ -0,0 +1,55 @@ +import { BreadcrumbService } from '@/core/services'; +import { AppCardComponent, KeyValueComponent } from '@/shared/components'; +import pageParamsUtils from '@/utils/page-params.utils'; +import { Component, computed, effect, inject, signal } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { ConsumerComplexFormComponent } from '../../components/complexes/form.component'; +import { ConsumerPosesComponent } from '../../components/poses/list.component'; +import { BusinessActivityStore } from '../../store/businessActivity.store'; +import { ConsumerComplexStore } from '../../store/complex.store'; + +@Component({ + selector: 'consumer-complex', + templateUrl: './single.component.html', + imports: [ + AppCardComponent, + KeyValueComponent, + ConsumerComplexFormComponent, + ConsumerPosesComponent, + ], +}) +export class ConsumerComplexComponent { + private readonly route = inject(ActivatedRoute); + private readonly breadcrumbService = inject(BreadcrumbService); + private readonly store = inject(ConsumerComplexStore); + private readonly businessStore = inject(BusinessActivityStore); + + pageParams = computed(() => pageParamsUtils(this.route)); + + readonly businessId = signal(this.pageParams()['businessActivityId']!); + readonly complexId = signal(this.pageParams()['complexId']!); + + editMode = signal(false); + + readonly loading = computed(() => this.store.loading()); + readonly complex = computed(() => this.store.entity()); + + constructor() { + effect(() => { + if (this.complex()?.id) { + this.setBreadcrumb(); + } + }); + } + + getData() { + this.store.getData(this.businessId(), this.complexId()); + } + + setBreadcrumb() { + this.breadcrumbService.setItems([ + ...this.businessStore.breadcrumbItems(), + ...this.store.breadcrumbItems(), + ]); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/views/index.ts b/src/app/domains/consumer/modules/businessActivities/views/index.ts new file mode 100644 index 0000000..bc9dfc9 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/index.ts @@ -0,0 +1,2 @@ +export * from './list.component'; +export * from './single.component'; diff --git a/src/app/domains/consumer/modules/businessActivities/views/list.component.html b/src/app/domains/consumer/modules/businessActivities/views/list.component.html new file mode 100644 index 0000000..fc12f6d --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/list.component.html @@ -0,0 +1 @@ + diff --git a/src/app/domains/consumer/modules/businessActivities/views/list.component.ts b/src/app/domains/consumer/modules/businessActivities/views/list.component.ts new file mode 100644 index 0000000..48a646a --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/list.component.ts @@ -0,0 +1,31 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { AbstractList } from '@/shared/abstractClasses/abstract-list'; +import { Component, inject } from '@angular/core'; +import { ConsumerBusinessActivityListComponent } from '../components/list.component'; +import { IBusinessActivityResponse } from '../models'; +import { BusinessActivitiesService } from '../services/main.service'; + +@Component({ + selector: 'consumer-businessActivities', + templateUrl: './list.component.html', + imports: [ConsumerBusinessActivityListComponent], +}) +export class ConsumerBusinessActivitiesComponent extends AbstractList { + private readonly service = inject(BusinessActivitiesService); + + override setColumns(): void { + this.columns = [ + { field: 'id', header: 'شناسه' }, + { field: 'name', header: 'عنوان' }, + { + field: 'created_at', + header: 'تاریخ ایجاد', + type: 'date', + }, + ]; + } + + override getDataRequest() { + return this.service.getAll(); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/views/poses/index.ts b/src/app/domains/consumer/modules/businessActivities/views/poses/index.ts new file mode 100644 index 0000000..576a89e --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/poses/index.ts @@ -0,0 +1 @@ +export * from './list.component'; diff --git a/src/app/domains/consumer/modules/businessActivities/views/poses/list.component.html b/src/app/domains/consumer/modules/businessActivities/views/poses/list.component.html new file mode 100644 index 0000000..4020a49 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/poses/list.component.html @@ -0,0 +1 @@ + diff --git a/src/app/domains/consumer/modules/businessActivities/views/poses/list.component.ts b/src/app/domains/consumer/modules/businessActivities/views/poses/list.component.ts new file mode 100644 index 0000000..2007634 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/poses/list.component.ts @@ -0,0 +1,43 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { BreadcrumbService } from '@/core/services'; +import pageParamsUtils from '@/utils/page-params.utils'; +import { Component, computed, inject, signal } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { ConsumerPosesComponent } from '../../components/poses/list.component'; +import { consumerPosesNamedRoutes } from '../../constants/routes/poses'; +import { BusinessActivityStore } from '../../store/businessActivity.store'; +import { ConsumerComplexStore } from '../../store/complex.store'; + +@Component({ + selector: 'superAdmin-user-poses', + templateUrl: './list.component.html', + imports: [ConsumerPosesComponent], +}) +export class SuperAdminUserPosesComponent { + private readonly route = inject(ActivatedRoute); + private readonly breadcrumbService = inject(BreadcrumbService); + private readonly businessStore = inject(BusinessActivityStore); + private readonly complexStore = inject(ConsumerComplexStore); + + pageParams = computed(() => pageParamsUtils(this.route)); + businessId = signal(this.pageParams()['businessActivityId']); + complexId = signal(this.pageParams()['complexId']); + + ngOnInit() { + this.setBreadcrumb(); + } + + setBreadcrumb() { + this.breadcrumbService.setItems([ + ...this.businessStore.breadcrumbItems(), + ...this.complexStore.breadcrumbItems(), + { + title: consumerPosesNamedRoutes.poses.meta.title, + routerLink: consumerPosesNamedRoutes.poses.meta.pagePath!( + this.businessId(), + this.complexId(), + ), + }, + ]); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html b/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html new file mode 100644 index 0000000..4acbcb2 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.html @@ -0,0 +1,19 @@ +
+ +
+
+ +
+
+
+ + +
diff --git a/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.ts b/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.ts new file mode 100644 index 0000000..6ced908 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.ts @@ -0,0 +1,52 @@ +import { BreadcrumbService } from '@/core/services'; +import { AppCardComponent, KeyValueComponent } from '@/shared/components'; +import pageParamsUtils from '@/utils/page-params.utils'; +import { Component, computed, effect, inject, signal } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { ConsumerPosFormComponent } from '../../components/poses/form.component'; +import { BusinessActivityStore } from '../../store/businessActivity.store'; +import { ConsumerComplexStore } from '../../store/complex.store'; +import { PosStore } from '../../store/pos.store'; + +@Component({ + selector: 'superAdmin-user-pos', + templateUrl: './single.component.html', + imports: [AppCardComponent, KeyValueComponent, ConsumerPosFormComponent], +}) +export class SuperAdminUserPosComponent { + private readonly businessStore = inject(BusinessActivityStore); + private readonly complexStore = inject(ConsumerComplexStore); + private readonly store = inject(PosStore); + private readonly route = inject(ActivatedRoute); + private readonly breadcrumbService = inject(BreadcrumbService); + + pageParams = computed(() => pageParamsUtils(this.route)); + + readonly businessId = signal(this.pageParams()['businessActivityId']!); + readonly complexId = signal(this.pageParams()['complexId']!); + readonly posId = signal(this.pageParams()['posId']!); + editMode = signal(false); + + constructor() { + effect(() => { + if (this.pos()?.id) { + this.setBreadcrumb(); + } + }); + } + + readonly loading = computed(() => this.store.loading()); + readonly pos = computed(() => this.store.entity()); + + getData() { + this.store.getData(this.businessId(), this.complexId(), this.posId()); + } + + setBreadcrumb() { + this.breadcrumbService.setItems([ + ...this.businessStore.breadcrumbItems(), + ...this.complexStore.breadcrumbItems(), + ...this.store.breadcrumbItems(), + ]); + } +} diff --git a/src/app/domains/consumer/modules/businessActivities/views/single.component.html b/src/app/domains/consumer/modules/businessActivities/views/single.component.html new file mode 100644 index 0000000..e149282 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/single.component.html @@ -0,0 +1,21 @@ +
+ + +
+
+ + +
+
+
+ + + + +
diff --git a/src/app/domains/consumer/modules/businessActivities/views/single.component.ts b/src/app/domains/consumer/modules/businessActivities/views/single.component.ts new file mode 100644 index 0000000..b854b71 --- /dev/null +++ b/src/app/domains/consumer/modules/businessActivities/views/single.component.ts @@ -0,0 +1,46 @@ +import { BreadcrumbService } from '@/core/services'; +import { AppCardComponent, KeyValueComponent } from '@/shared/components'; +import { Component, computed, effect, inject, signal } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { ConsumerComplexListComponent } from '../components/complexes/list.component'; +import { ConsumerBusinessActivityFormComponent } from '../components/form.component'; +import { BusinessActivityStore } from '../store/businessActivity.store'; + +@Component({ + selector: 'business-businessActivity', + templateUrl: './single.component.html', + imports: [ + AppCardComponent, + KeyValueComponent, + ConsumerBusinessActivityFormComponent, + ConsumerComplexListComponent, + ], +}) +export class ConsumerBusinessActivityComponent { + private readonly store = inject(BusinessActivityStore); + private readonly route = inject(ActivatedRoute); + private readonly breadcrumbService = inject(BreadcrumbService); + + readonly businessId = signal(this.route.snapshot.paramMap.get('businessActivityId')!); + editMode = signal(false); + + readonly loading = computed(() => this.store.loading()); + readonly business = computed(() => this.store.entity()); + readonly businessBreadcrumb = computed(() => this.store.breadcrumbItems()); + + constructor() { + effect(() => { + if (this.business()?.id) { + this.setBreadcrumb(); + } + }); + } + + getData() { + this.store.getData(this.businessId()); + } + + setBreadcrumb() { + this.breadcrumbService.setItems(this.businessBreadcrumb()); + } +} diff --git a/src/app/domains/consumer/modules/dashboard/views/index.component.html b/src/app/domains/consumer/modules/dashboard/views/index.component.html index bcac5c5..1424343 100644 --- a/src/app/domains/consumer/modules/dashboard/views/index.component.html +++ b/src/app/domains/consumer/modules/dashboard/views/index.component.html @@ -1,3 +1,3 @@ -
+
به پنل کسب و کار خوش آمدید
diff --git a/src/app/domains/consumer/routes.ts b/src/app/domains/consumer/routes.ts index 9d4be79..79b2bfd 100644 --- a/src/app/domains/consumer/routes.ts +++ b/src/app/domains/consumer/routes.ts @@ -1,4 +1,6 @@ import { Route } from '@angular/router'; +import { CONSUMER_ACCOUNTS_ROUTES } from './modules/accounts/constants'; +import { CONSUMER_BUSINESS_ACTIVITIES_ROUTES } from './modules/businessActivities/constants'; export const CONSUMER_ROUTES = { path: 'consumer', @@ -9,5 +11,7 @@ export const CONSUMER_ROUTES = { loadComponent: () => import('./modules/dashboard/views/index.component').then((m) => m.DashboardComponent), }, + ...CONSUMER_ACCOUNTS_ROUTES, + ...CONSUMER_BUSINESS_ACTIVITIES_ROUTES, ], } as Route; diff --git a/src/app/domains/superAdmin/modules/consumers/services/businessActivities.service.ts b/src/app/domains/superAdmin/modules/consumers/services/businessActivities.service.ts index 414abc9..bd99394 100644 --- a/src/app/domains/superAdmin/modules/consumers/services/businessActivities.service.ts +++ b/src/app/domains/superAdmin/modules/consumers/services/businessActivities.service.ts @@ -21,6 +21,8 @@ export class AdminConsumerBusinessActivitiesService { ); } getSingle(consumerId: string, businessActivityId: string): Observable { + console.log(consumerId, businessActivityId); + return this.http.get( this.apiRoutes.single(consumerId, businessActivityId), );