From d4dff4ebfd52274d449be371f7e429ef53ba49a0 Mon Sep 17 00:00:00 2001 From: ahasani194 Date: Sat, 11 Apr 2026 14:46:52 +0330 Subject: [PATCH] create consumer domain accounts permissions --- .../core/interceptors/error.interceptor.ts | 7 -- src/app/core/models/user.model.ts | 1 + .../accounts/components/layout.component.html | 5 + .../accounts/components/layout.component.ts | 26 +++++ .../permissions/list.component.html | 41 ++++++++ .../components/permissions/list.component.ts | 95 +++++++++++++++++++ .../accounts/constants/apiRoutes/index.ts | 2 + .../constants/apiRoutes/permissions.ts | 6 ++ .../accounts/constants/routes/index.ts | 17 +++- .../accounts/constants/routes/permissions.ts | 23 +++++ .../consumer/modules/accounts/models/index.ts | 1 + .../consumer/modules/accounts/models/io.d.ts | 9 +- .../accounts/models/permissions.io.d.ts | 32 +++++++ .../accounts/services/permissions.service.ts | 20 ++++ .../modules/accounts/store/account.store.ts | 77 +++++++++++++++ .../consumer/modules/accounts/views/index.ts | 1 + .../accounts/views/list.component.html | 2 + .../modules/accounts/views/list.component.ts | 7 ++ .../accounts/views/permissions/index.ts | 1 + .../views/permissions/list.component.html | 1 + .../views/permissions/list.component.ts | 36 +++++++ .../accounts/views/single.component.html | 14 ++- .../accounts/views/single.component.ts | 35 ++++++- .../views/poses/single.component.ts | 1 + .../views/saleInvoices/single.component.html | 5 +- .../views/saleInvoices/single.component.ts | 3 +- .../domains/pos/layouts/layout.component.ts | 2 +- src/app/domains/pos/pos.store.ts | 30 +++--- .../components/accounts/form.component.html | 2 +- .../components/accounts/form.component.ts | 4 +- src/app/modules/auth/pages/auth.component.ts | 9 +- .../apiEnum/constants/apiEnumTranslates.ts | 1 + src/app/shared/apiEnum/constants/apiRoutes.ts | 1 + 33 files changed, 480 insertions(+), 37 deletions(-) create mode 100644 src/app/domains/consumer/modules/accounts/components/layout.component.html create mode 100644 src/app/domains/consumer/modules/accounts/components/layout.component.ts create mode 100644 src/app/domains/consumer/modules/accounts/components/permissions/list.component.html create mode 100644 src/app/domains/consumer/modules/accounts/components/permissions/list.component.ts create mode 100644 src/app/domains/consumer/modules/accounts/constants/apiRoutes/permissions.ts create mode 100644 src/app/domains/consumer/modules/accounts/constants/routes/permissions.ts create mode 100644 src/app/domains/consumer/modules/accounts/models/permissions.io.d.ts create mode 100644 src/app/domains/consumer/modules/accounts/services/permissions.service.ts create mode 100644 src/app/domains/consumer/modules/accounts/store/account.store.ts create mode 100644 src/app/domains/consumer/modules/accounts/views/permissions/index.ts create mode 100644 src/app/domains/consumer/modules/accounts/views/permissions/list.component.html create mode 100644 src/app/domains/consumer/modules/accounts/views/permissions/list.component.ts diff --git a/src/app/core/interceptors/error.interceptor.ts b/src/app/core/interceptors/error.interceptor.ts index 876086f..094b6b6 100644 --- a/src/app/core/interceptors/error.interceptor.ts +++ b/src/app/core/interceptors/error.interceptor.ts @@ -18,9 +18,6 @@ export const errorInterceptor: HttpInterceptorFn = (req, next) => { return next(req).pipe( catchError((error: HttpErrorResponse) => { - console.log('error'); - console.log(error); - let errorMessage = 'خطای نامشخص رخ داده است'; if (error.error instanceof ErrorEvent) { @@ -133,13 +130,9 @@ export enum ErrorType { * Helper function to determine error type */ export function getErrorType(error: HttpErrorResponse): ErrorType { - console.log('getErrorType'); - console.log(error); - if (error.error instanceof ErrorEvent) { return ErrorType.NETWORK; } - console.log(error.status); switch (error.status) { case 400: diff --git a/src/app/core/models/user.model.ts b/src/app/core/models/user.model.ts index 35a4920..54026e4 100644 --- a/src/app/core/models/user.model.ts +++ b/src/app/core/models/user.model.ts @@ -47,6 +47,7 @@ export interface IAuthAccountResponse { provider_id?: string; pos_id?: string; user: IAuthAccountUser; + role: string; } interface IAuthAccountUser { id: string; diff --git a/src/app/domains/consumer/modules/accounts/components/layout.component.html b/src/app/domains/consumer/modules/accounts/components/layout.component.html new file mode 100644 index 0000000..5416fe1 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/components/layout.component.html @@ -0,0 +1,5 @@ +@if (loading()) { + +} @else { + +} diff --git a/src/app/domains/consumer/modules/accounts/components/layout.component.ts b/src/app/domains/consumer/modules/accounts/components/layout.component.ts new file mode 100644 index 0000000..db0f1eb --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/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 { AccountStore } from '../store/account.store'; + +@Component({ + selector: 'consumer-account-layout', + templateUrl: './layout.component.html', + imports: [PageLoadingComponent, RouterOutlet], +}) +export class ConsumerAccountLayoutComponent { + private readonly route = inject(ActivatedRoute); + private readonly store = inject(AccountStore); + + readonly accountId = signal(this.route.snapshot.paramMap.get('accountId')!); + + readonly loading = computed(() => this.store.loading()); + + getData() { + this.store.getData(this.accountId()); + } + + ngOnInit() { + this.getData(); + } +} diff --git a/src/app/domains/consumer/modules/accounts/components/permissions/list.component.html b/src/app/domains/consumer/modules/accounts/components/permissions/list.component.html new file mode 100644 index 0000000..763c881 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/components/permissions/list.component.html @@ -0,0 +1,41 @@ +
+ + @if (isOwner()) { +
+ کاربر با سطح Owner به تمامی سطوح دسترسی داشته و قابل ویرایش نمی‌باشد +
+ } @else if (loading()) { +
+ +
+ } @else if (permissions()) { +
+ پیام مفهومی برای مشخص کردن نوع دسترسی دادن + @for (pos of permissions()?.poses; track $index) { +
+ + + {{ pos.name }} - {{ pos.complex.name }} - {{ pos.complex.business_activity.name }} + +
+ } + @for (complex of permissions()?.complexes; track $index) { +
+ + {{ complex.name }} - {{ complex.business_activity.name }} +
+ } + @for (ba of permissions()?.business_activities; track $index) { +
+ + {{ ba.name }} +
+ } +
+ +
+ +
+ } +
+
diff --git a/src/app/domains/consumer/modules/accounts/components/permissions/list.component.ts b/src/app/domains/consumer/modules/accounts/components/permissions/list.component.ts new file mode 100644 index 0000000..48c6fd3 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/components/permissions/list.component.ts @@ -0,0 +1,95 @@ +// import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; +import { Maybe } from '@/core'; +import { AppCardComponent } from '@/shared/components'; +import pageParamsUtils from '@/utils/page-params.utils'; +import { Component, computed, inject, signal } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { ButtonDirective } from 'primeng/button'; +import { Message } from 'primeng/message'; +import { ProgressSpinner } from 'primeng/progressspinner'; +import { ToggleSwitch } from 'primeng/toggleswitch'; +import { finalize } from 'rxjs'; +import { IPermissionRequest, IPermissionResponse } from '../../models'; +import { PermissionsService } from '../../services/permissions.service'; +import { AccountStore } from '../../store/account.store'; + +@Component({ + selector: 'consumer-account-permission-list', + templateUrl: './list.component.html', + imports: [AppCardComponent, ProgressSpinner, ToggleSwitch, FormsModule, Message, ButtonDirective], +}) +export class ConsumerAccountPermissionListComponent { + private readonly route = inject(ActivatedRoute); + + private readonly service = inject(PermissionsService); + private readonly accountStore = inject(AccountStore); + + pageParams = computed(() => pageParamsUtils(this.route)); + accountId = signal(this.pageParams()['accountId']); + permissions = signal>(null); + loading = signal(true); + submitLoading = signal(false); + + account = computed(() => this.accountStore.entity()); + isOwner = computed(() => this.account()?.role === 'OWNER'); + + getData() { + this.loading.set(true); + this.permissions.set(null); + this.service + .getAll(this.accountId()) + .pipe( + finalize(() => { + this.loading.set(false); + }), + ) + .subscribe((res) => { + if (res) { + this.permissions.set(res); + } + }); + } + + submit() { + const dataToSet: IPermissionRequest = {}; + const posPermissions = this.permissions() + ?.poses.filter((pos) => pos.hasAccess) + .map((pos) => pos.id); + const complexPermissions = this.permissions() + ?.complexes?.filter((complex) => complex.hasAccess) + .map((pos) => pos.id); + const baPermissions = this.permissions() + ?.business_activities?.filter((ba) => ba.hasAccess) + .map((ba) => ba.id); + + if (posPermissions?.length) { + dataToSet.poses = posPermissions; + } + if (complexPermissions?.length) { + dataToSet.complexes = complexPermissions; + } + if (baPermissions?.length) { + dataToSet.business_activities = baPermissions; + } + + this.submitLoading.set(true); + + this.service + .update(this.accountId(), dataToSet) + .pipe( + finalize(() => { + this.submitLoading.set(false); + }), + ) + .subscribe((res) => { + this.getData(); + }); + } + + ngOnInit() { + if (!this.isOwner()) { + this.getData(); + } + } +} diff --git a/src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts b/src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts index f296d20..196e9bb 100644 --- a/src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts +++ b/src/app/domains/consumer/modules/accounts/constants/apiRoutes/index.ts @@ -1,3 +1,5 @@ +export * from './permissions'; + const baseUrl = '/api/v1/consumer/accounts'; export const CONSUMER_Accounts_API_ROUTES = { diff --git a/src/app/domains/consumer/modules/accounts/constants/apiRoutes/permissions.ts b/src/app/domains/consumer/modules/accounts/constants/apiRoutes/permissions.ts new file mode 100644 index 0000000..9c0cc2d --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/constants/apiRoutes/permissions.ts @@ -0,0 +1,6 @@ +const baseUrl = (accountId: string) => `/api/v1/consumer/accounts/${accountId}/permissions`; + +export const CONSUMER_PERMISSIONS_API_ROUTES = { + list: (accountId: string) => `${baseUrl(accountId)}`, + single: (accountId: string, id: string) => `${baseUrl(accountId)}/${id}`, +}; diff --git a/src/app/domains/consumer/modules/accounts/constants/routes/index.ts b/src/app/domains/consumer/modules/accounts/constants/routes/index.ts index b6bc9de..4fe203d 100644 --- a/src/app/domains/consumer/modules/accounts/constants/routes/index.ts +++ b/src/app/domains/consumer/modules/accounts/constants/routes/index.ts @@ -1,5 +1,6 @@ import { NamedRoutes } from '@/core'; import { Routes } from '@angular/router'; +import { CONSUMER_ACCOUNT_PERMISSIONS_ROUTES } from './permissions'; export type TConsumerAccountsRouteNames = 'accounts' | 'account'; @@ -24,4 +25,18 @@ export const consumerAccountsNamedRoutes: NamedRoutes + import('../../components/layout.component').then((m) => m.ConsumerAccountLayoutComponent), + children: [ + { + ...consumerAccountsNamedRoutes.account, + path: '', + }, + ...CONSUMER_ACCOUNT_PERMISSIONS_ROUTES, + ], + }, +]; diff --git a/src/app/domains/consumer/modules/accounts/constants/routes/permissions.ts b/src/app/domains/consumer/modules/accounts/constants/routes/permissions.ts new file mode 100644 index 0000000..977e041 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/constants/routes/permissions.ts @@ -0,0 +1,23 @@ +import { NamedRoutes } from '@/core'; +import { Routes } from '@angular/router'; + +export type TConsumerAccountPermissionsRouteNames = 'permissions'; + +export const consumerAccountPermissionsNamedRoutes: NamedRoutes = + { + permissions: { + path: 'permissions', + loadComponent: () => + import('../../views/permissions/list.component').then( + (m) => m.ConsumerAccountPermissionsComponent, + ), + meta: { + title: 'سطح دسترسی', + pagePath: (accountId: string) => `/consumer/accounts/${accountId}/permissions`, + }, + }, + }; + +export const CONSUMER_ACCOUNT_PERMISSIONS_ROUTES: Routes = Object.values( + consumerAccountPermissionsNamedRoutes, +); diff --git a/src/app/domains/consumer/modules/accounts/models/index.ts b/src/app/domains/consumer/modules/accounts/models/index.ts index 61a518a..fe163c4 100644 --- a/src/app/domains/consumer/modules/accounts/models/index.ts +++ b/src/app/domains/consumer/modules/accounts/models/index.ts @@ -1 +1,2 @@ export * from './io'; +export * from './permissions.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 index fd02418..06ff6de 100644 --- a/src/app/domains/consumer/modules/accounts/models/io.d.ts +++ b/src/app/domains/consumer/modules/accounts/models/io.d.ts @@ -1,6 +1,8 @@ export interface IAccountRawResponse { id: string; - name: string; + role: string; + created_at: string; + account: Account; } export interface IAccountResponse extends IAccountRawResponse {} @@ -11,3 +13,8 @@ export interface IAccountRequest { export interface IAccountPasswordRequest { password: string; } + +interface Account { + username: string; + status: string; +} diff --git a/src/app/domains/consumer/modules/accounts/models/permissions.io.d.ts b/src/app/domains/consumer/modules/accounts/models/permissions.io.d.ts new file mode 100644 index 0000000..21dc884 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/models/permissions.io.d.ts @@ -0,0 +1,32 @@ +import ISummary from '@/core/models/summary'; + +export interface IPermissionRawResponse { + poses: IPosPermissionResponse[]; + complexes: IComplexPermissionResponse[]; + business_activities: ICommonPermissionResponse[]; +} +export interface IPermissionResponse extends IPermissionRawResponse {} + +export interface IPermissionRequest { + poses?: string[]; + complexes?: string[]; + business_activities?: string[]; +} + +interface ICommonPermissionResponse { + id: string; + name: string; + hasAccess: boolean; +} + +interface IComplexPermissionResponse extends ICommonPermissionResponse { + business_activity: ISummary; +} + +interface IPosPermissionResponse extends ICommonPermissionResponse { + complex: Complex; +} + +interface Complex extends ISummary { + business_activity: ISummary; +} diff --git a/src/app/domains/consumer/modules/accounts/services/permissions.service.ts b/src/app/domains/consumer/modules/accounts/services/permissions.service.ts new file mode 100644 index 0000000..d1332fa --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/services/permissions.service.ts @@ -0,0 +1,20 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { CONSUMER_PERMISSIONS_API_ROUTES } from '../constants'; +import { IPermissionRawResponse, IPermissionRequest, IPermissionResponse } from '../models'; + +@Injectable({ providedIn: 'root' }) +export class PermissionsService { + constructor(private http: HttpClient) {} + + private apiRoutes = CONSUMER_PERMISSIONS_API_ROUTES; + + getAll(accountId: string): Observable { + return this.http.get(this.apiRoutes.list(accountId)); + } + + update(accountId: string, data: IPermissionRequest): Observable { + return this.http.put(this.apiRoutes.list(accountId), data); + } +} diff --git a/src/app/domains/consumer/modules/accounts/store/account.store.ts b/src/app/domains/consumer/modules/accounts/store/account.store.ts new file mode 100644 index 0000000..ccdf44d --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/store/account.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 { consumerAccountsNamedRoutes } from '../constants'; +import { IAccountResponse } from '../models'; +import { AccountsService } from '../services/main.service'; + +interface AccountState extends EntityState { + breadcrumbItems: MenuItem[]; +} + +@Injectable({ + providedIn: 'root', +}) +export class AccountStore extends EntityStore { + private readonly service = inject(AccountsService); + constructor() { + super({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } + + breadcrumbItems = computed(() => this._state().breadcrumbItems); + + private setBreadcrumb(accountId: string) { + this.patchState({ + breadcrumbItems: [ + { + ...consumerAccountsNamedRoutes.accounts.meta, + routerLink: consumerAccountsNamedRoutes.accounts.meta.pagePath!(), + }, + { + title: this.entity()?.account.username, + routerLink: consumerAccountsNamedRoutes.account.meta.pagePath!(accountId), + }, + ], + }); + } + + getData(accountId: string) { + this.patchState({ loading: true }); + this.service + .getSingle(accountId) + .pipe( + finalize(() => { + this.patchState({ loading: false }); + }), + catchError(() => { + this.patchState({ + error: '', + }); + return throwError(''); + }), + ) + .subscribe((entity) => { + this.patchState({ entity }); + this.setBreadcrumb(accountId); + }); + } + + override reset(): void { + this.setState({ + loading: false, + error: null, + entity: null, + initialized: false, + isRefreshing: false, + breadcrumbItems: [], + }); + } +} diff --git a/src/app/domains/consumer/modules/accounts/views/index.ts b/src/app/domains/consumer/modules/accounts/views/index.ts index bc9dfc9..322afba 100644 --- a/src/app/domains/consumer/modules/accounts/views/index.ts +++ b/src/app/domains/consumer/modules/accounts/views/index.ts @@ -1,2 +1,3 @@ export * from './list.component'; +export * from './permissions'; 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 index f7429d0..e41a2a1 100644 --- a/src/app/domains/consumer/modules/accounts/views/list.component.html +++ b/src/app/domains/consumer/modules/accounts/views/list.component.html @@ -3,7 +3,9 @@ [columns]="columns" emptyPlaceholderTitle="حساب‌ کاربری‌ای یافت نشد" [items]="items()" + [showDetails]="true" [loading]="loading()" + (onDetails)="toSinglePage($event)" /> @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 index 703abb6..714ee2b 100644 --- a/src/app/domains/consumer/modules/accounts/views/list.component.ts +++ b/src/app/domains/consumer/modules/accounts/views/list.component.ts @@ -2,7 +2,9 @@ import { AbstractList } from '@/shared/abstractClasses/abstract-list'; import { PageDataListComponent } from '@/shared/components/pageDataList/page-data-list.component'; import { Component, inject } from '@angular/core'; +import { Router } from '@angular/router'; import { ConsumerAccountPasswordFormComponent } from '../components/form.component'; +import { consumerAccountsNamedRoutes } from '../constants'; import { IAccountResponse } from '../models'; import { AccountsService } from '../services/main.service'; @@ -13,6 +15,7 @@ import { AccountsService } from '../services/main.service'; }) export class ConsumerAccountsComponent extends AbstractList { private readonly service = inject(AccountsService); + private readonly router = inject(Router); override setColumns(): void { this.columns = [ @@ -31,4 +34,8 @@ export class ConsumerAccountsComponent extends AbstractList { override getDataRequest() { return this.service.getAll(); } + + toSinglePage(account: IAccountResponse) { + this.router.navigateByUrl(consumerAccountsNamedRoutes.account.meta.pagePath!(account.id)); + } } diff --git a/src/app/domains/consumer/modules/accounts/views/permissions/index.ts b/src/app/domains/consumer/modules/accounts/views/permissions/index.ts new file mode 100644 index 0000000..576a89e --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/permissions/index.ts @@ -0,0 +1 @@ +export * from './list.component'; diff --git a/src/app/domains/consumer/modules/accounts/views/permissions/list.component.html b/src/app/domains/consumer/modules/accounts/views/permissions/list.component.html new file mode 100644 index 0000000..763cda3 --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/permissions/list.component.html @@ -0,0 +1 @@ + diff --git a/src/app/domains/consumer/modules/accounts/views/permissions/list.component.ts b/src/app/domains/consumer/modules/accounts/views/permissions/list.component.ts new file mode 100644 index 0000000..4c0e22d --- /dev/null +++ b/src/app/domains/consumer/modules/accounts/views/permissions/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 { ConsumerAccountPermissionListComponent } from '../../components/permissions/list.component'; +import { consumerAccountPermissionsNamedRoutes } from '../../constants/routes/permissions'; +import { AccountStore } from '../../store/account.store'; + +@Component({ + selector: 'consumer-account-permissions', + templateUrl: './list.component.html', + imports: [ConsumerAccountPermissionListComponent], +}) +export class ConsumerAccountPermissionsComponent { + private readonly route = inject(ActivatedRoute); + private readonly breadcrumbService = inject(BreadcrumbService); + + private readonly accountStore = inject(AccountStore); + + pageParams = computed(() => pageParamsUtils(this.route)); + accountId = signal(this.pageParams()['accountId']); + + account = computed(() => this.accountStore.entity()); + + ngAfterViewInit() { + this.setBreadcrumb(); + } + + setBreadcrumb() { + this.breadcrumbService.setItems([ + ...this.accountStore.breadcrumbItems(), + consumerAccountPermissionsNamedRoutes.permissions.meta, + ]); + } +} diff --git a/src/app/domains/consumer/modules/accounts/views/single.component.html b/src/app/domains/consumer/modules/accounts/views/single.component.html index 7144e26..a023a5c 100644 --- a/src/app/domains/consumer/modules/accounts/views/single.component.html +++ b/src/app/domains/consumer/modules/accounts/views/single.component.html @@ -1 +1,13 @@ -
+
+ +
+
+ + + +
+
+
+ + +
diff --git a/src/app/domains/consumer/modules/accounts/views/single.component.ts b/src/app/domains/consumer/modules/accounts/views/single.component.ts index b7e27c0..31ef772 100644 --- a/src/app/domains/consumer/modules/accounts/views/single.component.ts +++ b/src/app/domains/consumer/modules/accounts/views/single.component.ts @@ -1,9 +1,40 @@ -import { Component } from '@angular/core'; +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 { ConsumerAccountPermissionListComponent } from '../components/permissions/list.component'; +import { AccountStore } from '../store/account.store'; @Component({ selector: 'consumer-account', templateUrl: './single.component.html', + imports: [AppCardComponent, KeyValueComponent, ConsumerAccountPermissionListComponent], }) export class ConsumerAccountComponent { - constructor() {} + private readonly store = inject(AccountStore); + private readonly route = inject(ActivatedRoute); + private readonly breadcrumbService = inject(BreadcrumbService); + + readonly accountId = signal(this.route.snapshot.paramMap.get('accountId')!); + editMode = signal(false); + + readonly loading = computed(() => this.store.loading()); + readonly account = computed(() => this.store.entity()); + readonly accountBreadcrumb = computed(() => this.store.breadcrumbItems()); + + constructor() { + effect(() => { + if (this.account()?.id) { + this.setBreadcrumb(); + } + }); + } + + getData() { + this.store.getData(this.accountId()); + } + + setBreadcrumb() { + this.breadcrumbService.setItems(this.accountBreadcrumb()); + } } 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 index 6bbab0e..6182fd6 100644 --- a/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.ts +++ b/src/app/domains/consumer/modules/businessActivities/views/poses/single.component.ts @@ -53,6 +53,7 @@ export class SuperAdminUserPosComponent { } toPosLanding() { + // this.cookieService.delete('posId', '/', 'localhost', false, 'Lax'); this.cookieService.set('posId', this.posId(), { sameSite: 'Lax', // or 'Strict' for same-site requests only secure: false, diff --git a/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.html b/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.html index 61ea1b5..b692211 100644 --- a/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.html +++ b/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.html @@ -1,10 +1,13 @@
- +
+ + +
diff --git a/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.ts b/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.ts index 5bef7de..76980b3 100644 --- a/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.ts +++ b/src/app/domains/consumer/modules/customers/views/saleInvoices/single.component.ts @@ -3,6 +3,7 @@ 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 { Badge } from 'primeng/badge'; import { Divider } from 'primeng/divider'; import { ConsumerCustomerStore } from '../../store/customer.store'; import { ConsumerCustomerSaleInvoiceStore } from '../../store/saleInvoice.store'; @@ -10,7 +11,7 @@ import { ConsumerCustomerSaleInvoiceStore } from '../../store/saleInvoice.store' @Component({ selector: 'consumer-customer-saleInvoice', templateUrl: './single.component.html', - imports: [AppCardComponent, KeyValueComponent, Divider], + imports: [AppCardComponent, KeyValueComponent, Divider, Badge], }) export class ConsumerCustomerSaleInvoiceComponent { private readonly route = inject(ActivatedRoute); diff --git a/src/app/domains/pos/layouts/layout.component.ts b/src/app/domains/pos/layouts/layout.component.ts index 536aacf..ffcb6f1 100644 --- a/src/app/domains/pos/layouts/layout.component.ts +++ b/src/app/domains/pos/layouts/layout.component.ts @@ -26,7 +26,7 @@ export class PosLayoutComponent { now = new Date(); getData() { - this.store.getData(); + this.store.getData().subscribe(); } ngOnInit() { diff --git a/src/app/domains/pos/pos.store.ts b/src/app/domains/pos/pos.store.ts index 7257eff..a24ef80 100644 --- a/src/app/domains/pos/pos.store.ts +++ b/src/app/domains/pos/pos.store.ts @@ -1,7 +1,7 @@ import { EntityState, EntityStore } from '@/core/state'; import { computed, inject, Injectable } from '@angular/core'; import { CookieService } from 'ngx-cookie-service'; -import { catchError, finalize, throwError } from 'rxjs'; +import { finalize, map } from 'rxjs'; import { IPosInfoResponse } from './models/pos.io'; import { PosService } from './modules/landing/services/main.service'; @@ -30,22 +30,18 @@ export class PosStore extends EntityStore { getData() { this.patchState({ loading: true }); - this.service - .getInfo() - .pipe( - finalize(() => { - this.patchState({ loading: false }); - }), - catchError(() => { - this.patchState({ - error: '', - }); - return throwError(''); - }), - ) - .subscribe((entity) => { - this.patchState({ entity }); - }); + return this.service.getInfo().pipe( + finalize(() => { + this.patchState({ loading: false }); + }), + + map((entity: IPosInfoResponse) => { + if (entity) { + this.patchState({ entity: entity }); + } + return entity; + }), + ); } override reset(): void { diff --git a/src/app/domains/superAdmin/modules/consumers/components/accounts/form.component.html b/src/app/domains/superAdmin/modules/consumers/components/accounts/form.component.html index babb102..dffb39e 100644 --- a/src/app/domains/superAdmin/modules/consumers/components/accounts/form.component.html +++ b/src/app/domains/superAdmin/modules/consumers/components/accounts/form.component.html @@ -8,7 +8,7 @@ >
- + (this.defaultStep); selectedRole = signal(this.role); + accountRole = signal(''); toSignUp = () => { this.activeStep.set('signup'); @@ -36,7 +37,9 @@ export class AuthComponent { onLoggedIn = (data: IAuthResponse) => { this.toastService.success({ text: 'شما با موفقیت وارد شدید.' }); + this.selectedRole.set(data.account.type.toUpperCase() as TRoles); + this.accountRole.set(data.account.role); // if (data.mustChangePassword) { // this.activeStep.set('modifyLoginInfo'); // return; @@ -70,7 +73,11 @@ export class AuthComponent { redirectUrl = '/partner'; break; case 'CONSUMER': - redirectUrl = '/consumer'; + if (this.accountRole() === 'OPERATOR') { + redirectUrl = '/pos'; + } else { + redirectUrl = '/consumer'; + } break; } } diff --git a/src/app/shared/apiEnum/constants/apiEnumTranslates.ts b/src/app/shared/apiEnum/constants/apiEnumTranslates.ts index ba80758..60e492b 100644 --- a/src/app/shared/apiEnum/constants/apiEnumTranslates.ts +++ b/src/app/shared/apiEnum/constants/apiEnumTranslates.ts @@ -15,6 +15,7 @@ export const apiEnumTranslates = { partnerRole: 'نقش', businessRole: 'نقش', providerRole: 'نقش', + consumerRole: 'نقش', unitType: 'واحد اندازه‌گیری', goodPricingModel: 'مدل محاسبه', } as Record; diff --git a/src/app/shared/apiEnum/constants/apiRoutes.ts b/src/app/shared/apiEnum/constants/apiRoutes.ts index a2b77e0..4e806a3 100644 --- a/src/app/shared/apiEnum/constants/apiRoutes.ts +++ b/src/app/shared/apiEnum/constants/apiRoutes.ts @@ -18,4 +18,5 @@ export const ENUMS_API_ROUTES = { tokenType: `${baseUrl}/token_type`, unitType: `${baseUrl}/unit_type`, goodPricingModel: `${baseUrl}/good_pricing_model`, + consumerRole: `${baseUrl}/consumer_role`, };