feat: update app version and build details in ngsw-config.json
fix: add baseZIndex to p-toast component in app.component.ts feat: enhance pagination support in saleInvoices list component refactor: modify saleInvoices service to accept pagination query feat: update API routes for saleInvoices to support pagination fix: adjust layout for consumer accounts in partner module style: improve layout for consumer business activities in partner module fix: update license info display in dashboard component fix: ensure price info card displays default values for discount and tax refactor: clean up gold payload form component fix: adjust root component layout for mobile view refactor: unify consumer account list configuration across modules chore: remove deprecated partner consumer account list config chore: remove deprecated superAdmin consumer account list config feat: add new consumer account list configuration style: add summary list styling in customize.scss chore: switch API base URL for TIS environment
This commit is contained in:
+3
-3
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
|
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
|
||||||
"appData": {
|
"appData": {
|
||||||
"appVersion": "0.0.10",
|
"appVersion": "0.0.12",
|
||||||
"buildDate": "2026-05-13T09:21:01.165Z",
|
"buildDate": "2026-05-16T08:49:47.932Z",
|
||||||
"buildNumber": 10
|
"buildNumber": 12
|
||||||
},
|
},
|
||||||
"assetGroups": [
|
"assetGroups": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { brandingConfig } from './app/branding/branding.config';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [RouterModule, ToastModule, ConfirmDialog],
|
imports: [RouterModule, ToastModule, ConfirmDialog],
|
||||||
template: `
|
template: `
|
||||||
<p-toast [position]="toastPosition" />
|
<p-toast [position]="toastPosition" [baseZIndex]="3000" />
|
||||||
<p-confirmDialog />
|
<p-confirmDialog />
|
||||||
<router-outlet />
|
<router-outlet />
|
||||||
`,
|
`,
|
||||||
|
|||||||
@@ -4,7 +4,11 @@
|
|||||||
emptyPlaceholderTitle="فاکتوری یافت نشد"
|
emptyPlaceholderTitle="فاکتوری یافت نشد"
|
||||||
[items]="items()"
|
[items]="items()"
|
||||||
[loading]="loading()"
|
[loading]="loading()"
|
||||||
|
[perPage]="responseMetaData()?.perPage"
|
||||||
|
[currentPage]="responseMetaData()?.page"
|
||||||
|
[totalRecords]="responseMetaData()?.totalRecords || items().length"
|
||||||
[showDetails]="true"
|
[showDetails]="true"
|
||||||
(onDetails)="toSinglePage($event)"
|
(onDetails)="toSinglePage($event)"
|
||||||
(onRefresh)="refresh()"
|
(onRefresh)="refresh()"
|
||||||
|
(onChangePage)="changePage($event)"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
// import { CatalogRoleTagComponent } from '@/shared/catalog/roles';
|
// import { CatalogRoleTagComponent } from '@/shared/catalog/roles';
|
||||||
|
import { Maybe } from '@/core';
|
||||||
import { AbstractList } from '@/shared/abstractClasses/abstract-list';
|
import { AbstractList } from '@/shared/abstractClasses/abstract-list';
|
||||||
import {
|
import {
|
||||||
IColumn,
|
IColumn,
|
||||||
PageDataListComponent,
|
PageDataListComponent,
|
||||||
} from '@/shared/components/pageDataList/page-data-list.component';
|
} from '@/shared/components/pageDataList/page-data-list.component';
|
||||||
|
import { IPaginatedQuery } from '@/core/models/service.model';
|
||||||
import { saleInvoiceListConfig } from '@/shared/constants/list-configs';
|
import { saleInvoiceListConfig } from '@/shared/constants/list-configs';
|
||||||
import { Component, inject, Input } from '@angular/core';
|
import { Component, inject, Input } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
@@ -16,7 +18,10 @@ import { ConsumerSaleInvoicesService } from '../services/main.service';
|
|||||||
templateUrl: './list.component.html',
|
templateUrl: './list.component.html',
|
||||||
imports: [PageDataListComponent],
|
imports: [PageDataListComponent],
|
||||||
})
|
})
|
||||||
export class ConsumerSaleInvoiceListComponent extends AbstractList<IConsumerSaleInvoicesResponse> {
|
export class ConsumerSaleInvoiceListComponent extends AbstractList<
|
||||||
|
IConsumerSaleInvoicesResponse,
|
||||||
|
IPaginatedQuery
|
||||||
|
> {
|
||||||
@Input() fullHeight?: boolean;
|
@Input() fullHeight?: boolean;
|
||||||
@Input() header: IColumn[] = saleInvoiceListConfig.columns;
|
@Input() header: IColumn[] = saleInvoiceListConfig.columns;
|
||||||
|
|
||||||
@@ -27,8 +32,8 @@ export class ConsumerSaleInvoiceListComponent extends AbstractList<IConsumerSale
|
|||||||
this.columns = this.header;
|
this.columns = this.header;
|
||||||
}
|
}
|
||||||
|
|
||||||
override getDataRequest() {
|
override getDataRequest(payload: Maybe<IPaginatedQuery>) {
|
||||||
return this.service.getAll();
|
return this.service.getAll(payload || undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
toSinglePage(item: IConsumerSaleInvoicesResponse) {
|
toSinglePage(item: IConsumerSaleInvoicesResponse) {
|
||||||
|
|||||||
@@ -1,6 +1,15 @@
|
|||||||
|
import { IPaginatedQuery } from '@/core/models/service.model';
|
||||||
|
|
||||||
const baseUrl = () => `/api/v1/consumer/sale-invoices`;
|
const baseUrl = () => `/api/v1/consumer/sale-invoices`;
|
||||||
|
|
||||||
export const CONSUMER_SALE_INVOICES_API_ROUTES = {
|
export const CONSUMER_SALE_INVOICES_API_ROUTES = {
|
||||||
list: () => baseUrl(),
|
list: (paginationQuery?: IPaginatedQuery) => {
|
||||||
|
if (!paginationQuery) return baseUrl();
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
if (paginationQuery.page) params.set('page', String(paginationQuery.page));
|
||||||
|
if (paginationQuery.pageSize) params.set('perPage', String(paginationQuery.pageSize));
|
||||||
|
const query = params.toString();
|
||||||
|
return query ? `${baseUrl()}?${query}` : baseUrl();
|
||||||
|
},
|
||||||
single: (id: string) => `${baseUrl()}/${id}`,
|
single: (id: string) => `${baseUrl()}/${id}`,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { IPaginatedResponse } from '@/core/models/service.model';
|
import { IPaginatedQuery, IPaginatedResponse } from '@/core/models/service.model';
|
||||||
import { ISaleInvoiceFullRawResponse, ISaleInvoiceFullResponse } from '@/domains/consumer/models';
|
import { ISaleInvoiceFullRawResponse, ISaleInvoiceFullResponse } from '@/domains/consumer/models';
|
||||||
import { HttpClient } from '@angular/common/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
@@ -12,9 +12,9 @@ export class ConsumerSaleInvoicesService {
|
|||||||
|
|
||||||
private apiRoutes = CONSUMER_SALE_INVOICES_API_ROUTES;
|
private apiRoutes = CONSUMER_SALE_INVOICES_API_ROUTES;
|
||||||
|
|
||||||
getAll(): Observable<IPaginatedResponse<IConsumerSaleInvoicesResponse>> {
|
getAll(paginationQuery?: IPaginatedQuery): Observable<IPaginatedResponse<IConsumerSaleInvoicesResponse>> {
|
||||||
return this.http.get<IPaginatedResponse<IConsumerSaleInvoicesRawResponse>>(
|
return this.http.get<IPaginatedResponse<IConsumerSaleInvoicesRawResponse>>(
|
||||||
this.apiRoutes.list(),
|
this.apiRoutes.list(paginationQuery),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
getSingle(invoiceId: string): Observable<ISaleInvoiceFullResponse> {
|
getSingle(invoiceId: string): Observable<ISaleInvoiceFullResponse> {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import {
|
|||||||
IColumn,
|
IColumn,
|
||||||
PageDataListComponent,
|
PageDataListComponent,
|
||||||
} from '@/shared/components/pageDataList/page-data-list.component';
|
} from '@/shared/components/pageDataList/page-data-list.component';
|
||||||
import { partnerConsumerAccountListConfig } from '@/shared/constants/list-configs';
|
import { consumerAccountListConfig } from '@/shared/constants/list-configs';
|
||||||
import { Component, inject, Input } from '@angular/core';
|
import { Component, inject, Input } from '@angular/core';
|
||||||
import { IConsumerAccountResponse } from '../../models';
|
import { IConsumerAccountResponse } from '../../models';
|
||||||
import { PartnerConsumerAccountsService } from '../../services/accounts.service';
|
import { PartnerConsumerAccountsService } from '../../services/accounts.service';
|
||||||
@@ -18,7 +18,7 @@ import { ConsumerAccountFormComponent } from './form.component';
|
|||||||
export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountResponse> {
|
export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountResponse> {
|
||||||
@Input({ required: true }) consumerId!: string;
|
@Input({ required: true }) consumerId!: string;
|
||||||
@Input() fullHeight?: boolean;
|
@Input() fullHeight?: boolean;
|
||||||
@Input() header: IColumn[] = partnerConsumerAccountListConfig.columns;
|
@Input() header: IColumn[] = consumerAccountListConfig.columns;
|
||||||
private readonly service = inject(PartnerConsumerAccountsService);
|
private readonly service = inject(PartnerConsumerAccountsService);
|
||||||
|
|
||||||
override setColumns(): void {
|
override setColumns(): void {
|
||||||
|
|||||||
@@ -16,8 +16,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</app-card-data>
|
</app-card-data>
|
||||||
|
|
||||||
<partner-consumer-businessActivities-list [consumerId]="consumerId()" />
|
<div class="summaryList">
|
||||||
<partner-consumer-account-list [consumerId]="consumerId()" />
|
<partner-consumer-businessActivities-list [consumerId]="consumerId()" />
|
||||||
|
</div>
|
||||||
|
<div class="summaryList">
|
||||||
|
<partner-consumer-account-list [consumerId]="consumerId()" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<partner-consumer-form
|
<partner-consumer-form
|
||||||
[(visible)]="editMode"
|
[(visible)]="editMode"
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
<p-card class="border border-surface-border bg-surface-card rounded-2xl p-4 text-text-color">
|
<p-card class="border border-surface-border bg-surface-card rounded-2xl p-4 text-text-color">
|
||||||
<div class="w-full flex items-center justify-between gap-1">
|
<div class="w-full flex items-center justify-between gap-1">
|
||||||
<span class="text-xl font-semibold">وضعیت {{ title }}</span>
|
<span class="text-xl font-semibold">وضعیت {{ title }}</span>
|
||||||
<p-badge [value]="`تعداد کل: ${total}`" severity="secondary" size="large"></p-badge>
|
<p-badge [value]="`تعداد کل: ${total}`" severity="secondary" size="large" class="shrink-0"></p-badge>
|
||||||
</div>
|
</div>
|
||||||
<hr class="mb-6!" />
|
<hr class="mb-6!" />
|
||||||
<div class="grid grid-cols-3 gap-2">
|
<div class="grid grid-cols-3 gap-2">
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { MenuItem } from 'primeng/api';
|
|||||||
import { Button, ButtonDirective } from 'primeng/button';
|
import { Button, ButtonDirective } from 'primeng/button';
|
||||||
import { Card } from 'primeng/card';
|
import { Card } from 'primeng/card';
|
||||||
import { Menu } from 'primeng/menu';
|
import { Menu } from 'primeng/menu';
|
||||||
|
import { finalize } from 'rxjs';
|
||||||
import images from 'src/assets/images';
|
import images from 'src/assets/images';
|
||||||
import { PosInfoStore, PosProfileStore } from '../../store';
|
import { PosInfoStore, PosProfileStore } from '../../store';
|
||||||
import { DeviceInfoStore } from '../../store/device.store';
|
import { DeviceInfoStore } from '../../store/device.store';
|
||||||
@@ -85,19 +86,22 @@ export class PosPagesLayoutComponent {
|
|||||||
homeRouteLink = '/pos';
|
homeRouteLink = '/pos';
|
||||||
|
|
||||||
async getData() {
|
async getData() {
|
||||||
// await this.layoutService.changeFullPageLoading(true);
|
if (!this.posInfo() || !this.posProfile()) {
|
||||||
// await this.posProfileStore.getData().subscribe({
|
await this.layoutService.changeFullPageLoading(true);
|
||||||
// next: () => {
|
await this.layoutService.changeFullPageLoading(true);
|
||||||
// this.posInfoStore
|
await this.posProfileStore.getData().subscribe({
|
||||||
// .getData()
|
next: () => {
|
||||||
// .pipe(
|
this.posInfoStore
|
||||||
// finalize(() => {
|
.getData()
|
||||||
// this.layoutService.changeFullPageLoading(false);
|
.pipe(
|
||||||
// }),
|
finalize(() => {
|
||||||
// )
|
this.layoutService.changeFullPageLoading(false);
|
||||||
// .subscribe();
|
}),
|
||||||
// },
|
)
|
||||||
// });
|
.subscribe();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleMenu() {
|
toggleMenu() {
|
||||||
|
|||||||
@@ -15,11 +15,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<span>تخفیف</span>
|
<span>تخفیف</span>
|
||||||
<span [appPriceMask]="priceInfo().discountAmount"></span>
|
<span [appPriceMask]="priceInfo().discountAmount || 0"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<span>مالیات</span>
|
<span>مالیات</span>
|
||||||
<span [appPriceMask]="priceInfo().taxAmount"></span>
|
<span [appPriceMask]="priceInfo().taxAmount || 0"></span>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<div class="flex justify-between items-center font-bold text-lg">
|
<div class="flex justify-between items-center font-bold text-lg">
|
||||||
|
|||||||
@@ -31,16 +31,16 @@ export class PosGoldPayloadFormComponent extends AbstractForm<
|
|||||||
IPosOrderItem<IGoldPayload>,
|
IPosOrderItem<IGoldPayload>,
|
||||||
IPosOrderItem<IGoldPayload>
|
IPosOrderItem<IGoldPayload>
|
||||||
> {
|
> {
|
||||||
override defaultValues: Partial<IPosOrderItem<IGoldPayload>> = {
|
// override defaultValues: Partial<IPosOrderItem<IGoldPayload>> = {
|
||||||
unit_price: 200_000_000,
|
// unit_price: 200_000_000,
|
||||||
quantity: 2,
|
// quantity: 2,
|
||||||
payload: {
|
// payload: {
|
||||||
commission: 10_000,
|
// commission: 10_000,
|
||||||
wages: 10_000,
|
// wages: 10_000,
|
||||||
profit: 10_000,
|
// profit: 10_000,
|
||||||
karat: '18' as TGoldKarat,
|
// karat: '18' as TGoldKarat,
|
||||||
} as any,
|
// } as any,
|
||||||
};
|
// };
|
||||||
|
|
||||||
@Output() onSubmitForm = new EventEmitter<IGoldPayload>();
|
@Output() onSubmitForm = new EventEmitter<IGoldPayload>();
|
||||||
@Output() onChangeTotalAmount = new EventEmitter<number>();
|
@Output() onChangeTotalAmount = new EventEmitter<number>();
|
||||||
|
|||||||
@@ -19,9 +19,9 @@
|
|||||||
type="button"
|
type="button"
|
||||||
pButton
|
pButton
|
||||||
class="sticky! bottom-0 inset-x-0 w-full right-0 z-1200 border-t border-surface-border bg-surface-0 px-4 py-3 shadow-[0_-4px_16px_rgba(0,0,0,0.08)] md:hidden! rounded-b-none!"
|
class="sticky! bottom-0 inset-x-0 w-full right-0 z-1200 border-t border-surface-border bg-surface-0 px-4 py-3 shadow-[0_-4px_16px_rgba(0,0,0,0.08)] md:hidden! rounded-b-none!"
|
||||||
[style.paddingBottom]="'calc(0.75rem + {{env(safe-area-inset-bottom)}})'"
|
|
||||||
(click)="openInvoiceBottomSheet()"
|
(click)="openInvoiceBottomSheet()"
|
||||||
>
|
>
|
||||||
|
<!-- [style.paddingBottom]="'calc(0.75rem + {{env(safe-area-inset-bottom)}})'" -->
|
||||||
<div class="mx-auto flex w-full max-w-3xl items-center justify-between">
|
<div class="mx-auto flex w-full max-w-3xl items-center justify-between">
|
||||||
<div class="flex flex-col items-start gap-1">
|
<div class="flex flex-col items-start gap-1">
|
||||||
<span class="text-base">مبلغ کل فاکتور</span>
|
<span class="text-base">مبلغ کل فاکتور</span>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import {
|
|||||||
IColumn,
|
IColumn,
|
||||||
PageDataListComponent,
|
PageDataListComponent,
|
||||||
} from '@/shared/components/pageDataList/page-data-list.component';
|
} from '@/shared/components/pageDataList/page-data-list.component';
|
||||||
import { superAdminConsumerAccountListConfig } from '@/shared/constants/list-configs';
|
import { consumerAccountListConfig } from '@/shared/constants/list-configs';
|
||||||
import { Component, inject, Input } from '@angular/core';
|
import { Component, inject, Input } from '@angular/core';
|
||||||
import { IConsumerAccountResponse } from '../../models';
|
import { IConsumerAccountResponse } from '../../models';
|
||||||
import { AdminConsumerAccountsService } from '../../services/accounts.service';
|
import { AdminConsumerAccountsService } from '../../services/accounts.service';
|
||||||
@@ -18,7 +18,7 @@ import { ConsumerAccountFormComponent } from './form.component';
|
|||||||
export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountResponse> {
|
export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountResponse> {
|
||||||
@Input({ required: true }) consumerId!: string;
|
@Input({ required: true }) consumerId!: string;
|
||||||
@Input() fullHeight?: boolean;
|
@Input() fullHeight?: boolean;
|
||||||
@Input() header: IColumn[] = superAdminConsumerAccountListConfig.columns;
|
@Input() header: IColumn[] = consumerAccountListConfig.columns;
|
||||||
private readonly service = inject(AdminConsumerAccountsService);
|
private readonly service = inject(AdminConsumerAccountsService);
|
||||||
|
|
||||||
override setColumns(): void {
|
override setColumns(): void {
|
||||||
|
|||||||
+10
-1
@@ -1,12 +1,14 @@
|
|||||||
import ISummary from '@/core/models/summary';
|
import ISummary from '@/core/models/summary';
|
||||||
|
|
||||||
export interface IBusinessActivityRawResponse {
|
export interface IBusinessActivityRawResponse {
|
||||||
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
economic_code: string;
|
economic_code: string;
|
||||||
fiscal_id: string;
|
fiscal_id: string;
|
||||||
partner_token: string;
|
partner_token: string;
|
||||||
guild: ISummary;
|
guild: ISummary;
|
||||||
id: string;
|
created_at: string;
|
||||||
|
license_info: LicenseInfo;
|
||||||
}
|
}
|
||||||
export interface IBusinessActivityResponse extends IBusinessActivityRawResponse {}
|
export interface IBusinessActivityResponse extends IBusinessActivityRawResponse {}
|
||||||
|
|
||||||
@@ -17,3 +19,10 @@ export interface IBusinessActivityRequest {
|
|||||||
partner_token: string;
|
partner_token: string;
|
||||||
guild_id: string;
|
guild_id: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface LicenseInfo {
|
||||||
|
id: string;
|
||||||
|
starts_at: string;
|
||||||
|
expires_at: string;
|
||||||
|
accounts_limit: number;
|
||||||
|
}
|
||||||
|
|||||||
+3
@@ -3,7 +3,10 @@
|
|||||||
<div class="flex flex-col gap-4">
|
<div class="flex flex-col gap-4">
|
||||||
<div class="listKeyValue">
|
<div class="listKeyValue">
|
||||||
<app-key-value label="عنوان" [value]="businessActivity()?.name" />
|
<app-key-value label="عنوان" [value]="businessActivity()?.name" />
|
||||||
|
<app-key-value label="کد اقتصادی" [value]="businessActivity()?.economic_code" />
|
||||||
<app-key-value label="صنف" [value]="businessActivity()?.guild?.name" />
|
<app-key-value label="صنف" [value]="businessActivity()?.guild?.name" />
|
||||||
|
<app-key-value label="تاریخ انقضا مجوز" [value]="businessActivity()?.license_info?.expires_at" type="date" />
|
||||||
|
<app-key-value label="تعداد کاربران مجاز" [value]="businessActivity()?.license_info?.accounts_limit" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</app-card-data>
|
</app-card-data>
|
||||||
|
|||||||
@@ -4,21 +4,24 @@
|
|||||||
<div class="flex flex-col gap-4">
|
<div class="flex flex-col gap-4">
|
||||||
<div class="listKeyValue">
|
<div class="listKeyValue">
|
||||||
<app-key-value label="نام مشتری" [value]="consumer()?.name" />
|
<app-key-value label="نام مشتری" [value]="consumer()?.name" />
|
||||||
<app-key-value label="وضعیت" [value]="consumer()?.status?.translate" />
|
|
||||||
<app-key-value label="نوع مشتری" [value]="consumer()?.type?.translate" />
|
<app-key-value label="نوع مشتری" [value]="consumer()?.type?.translate" />
|
||||||
|
|
||||||
@if (consumer()?.type?.value === "LEGAL") {
|
@if (consumer()?.type?.value === "LEGAL") {
|
||||||
<app-key-value label="شناسه ملی" [value]="consumer()?.legal?.registration_code" />
|
<app-key-value label="شناسه ملی" [value]="consumer()?.legal?.registration_code" />
|
||||||
} @else {
|
} @else {
|
||||||
<app-key-value label="شماره موبایل" [value]="consumer()?.individual?.mobile_number" />
|
<app-key-value label="شماره موبایل" [value]="consumer()?.individual?.mobile_number" />
|
||||||
<app-key-value label="کد ملی" [value]="consumer()?.individual?.national_code" />
|
<app-key-value label="کد ملی" [value]="consumer()?.individual?.national_code" />
|
||||||
}
|
}
|
||||||
|
<app-key-value label="وضعیت" [value]="consumer()?.status?.value === 'ACTIVE'" type="active" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</app-card-data>
|
</app-card-data>
|
||||||
|
|
||||||
<superAdmin-consumer-account-list [consumerId]="consumerId()" />
|
<div class="summaryList">
|
||||||
<superAdmin-consumer-businessActivities-list [consumerId]="consumerId()" />
|
<superAdmin-consumer-businessActivities-list [consumerId]="consumerId()" />
|
||||||
|
</div>
|
||||||
|
<div class="summaryList">
|
||||||
|
<superAdmin-consumer-account-list [consumerId]="consumerId()" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<superAdmin-consumer-form
|
<superAdmin-consumer-form
|
||||||
[(visible)]="editMode"
|
[(visible)]="editMode"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Maybe } from '@/core';
|
import { Maybe } from '@/core';
|
||||||
import {
|
import {
|
||||||
IListingResponse,
|
IListingResponse,
|
||||||
|
IPaginatedQuery,
|
||||||
IPaginatedResponse,
|
IPaginatedResponse,
|
||||||
IResponseMetadata,
|
IResponseMetadata,
|
||||||
} from '@/core/models/service.model';
|
} from '@/core/models/service.model';
|
||||||
@@ -82,6 +83,16 @@ export abstract class AbstractList<ResponseModel, RequestParams = null> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
changePage(page: number) {
|
changePage(page: number) {
|
||||||
// this.
|
const perPage = this.responseMetaData()?.perPage;
|
||||||
|
this.requestPayload.update(
|
||||||
|
(prev) =>
|
||||||
|
({
|
||||||
|
...(prev || {}),
|
||||||
|
page,
|
||||||
|
...(perPage ? ({ pageSize: perPage } as IPaginatedQuery) : {}),
|
||||||
|
}) as any,
|
||||||
|
);
|
||||||
|
this.responseMetaData.update((prev) => (prev ? { ...prev, page } : prev));
|
||||||
|
this.getData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,9 +28,7 @@
|
|||||||
[inputStyleClass]="` w-full hasSuffix text-left ${size === 'large' ? 'p-inputtext-lg' : size === 'small' ? 'p-inputtext-sm' : ''}`"
|
[inputStyleClass]="` w-full hasSuffix text-left ${size === 'large' ? 'p-inputtext-lg' : size === 'small' ? 'p-inputtext-sm' : ''}`"
|
||||||
[required]="required"
|
[required]="required"
|
||||||
[invalid]="amountControl.invalid && (amountControl.touched || amountControl.dirty)"
|
[invalid]="amountControl.invalid && (amountControl.touched || amountControl.dirty)"
|
||||||
(onInput)="onPriceInput($event)"
|
|
||||||
/>
|
/>
|
||||||
<!-- (input)="onInput($event)" -->
|
|
||||||
} @else {
|
} @else {
|
||||||
<input
|
<input
|
||||||
pInputText
|
pInputText
|
||||||
@@ -50,7 +48,6 @@
|
|||||||
"
|
"
|
||||||
[required]="required"
|
[required]="required"
|
||||||
[invalid]="percentageControl.invalid && (percentageControl.touched || percentageControl.dirty)"
|
[invalid]="percentageControl.invalid && (percentageControl.touched || percentageControl.dirty)"
|
||||||
(input)="onInput($event)"
|
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+97
-76
@@ -19,7 +19,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|||||||
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
||||||
import { InputGroup } from 'primeng/inputgroup';
|
import { InputGroup } from 'primeng/inputgroup';
|
||||||
import { InputGroupAddon } from 'primeng/inputgroupaddon';
|
import { InputGroupAddon } from 'primeng/inputgroupaddon';
|
||||||
import { InputNumberInputEvent, InputNumberModule } from 'primeng/inputnumber';
|
import { InputNumberModule } from 'primeng/inputnumber';
|
||||||
import { InputText } from 'primeng/inputtext';
|
import { InputText } from 'primeng/inputtext';
|
||||||
import { Select } from 'primeng/select';
|
import { Select } from 'primeng/select';
|
||||||
|
|
||||||
@@ -90,83 +90,85 @@ export class AmountPercentageInputComponent {
|
|||||||
});
|
});
|
||||||
|
|
||||||
preparedLabel = signal(this.label);
|
preparedLabel = signal(this.label);
|
||||||
|
private lastValidAmount = 0;
|
||||||
|
private lastValidPercentage = 0;
|
||||||
|
|
||||||
onPriceInput($event: InputNumberInputEvent) {
|
private parseValue(value: Maybe<any>) {
|
||||||
this.onInput($event.originalEvent, true);
|
const normalized = `${value ?? ''}`.replace(/,/g, '');
|
||||||
|
const parsed = parseFloat(normalized);
|
||||||
|
return Number.isFinite(parsed) ? parsed : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
onInput($event: Event, isPriceType: boolean = false) {
|
private getRangeLabel(value: number, isPercentageType: boolean) {
|
||||||
// @ts-ignore
|
return isPercentageType ? `${value}%` : formatWithCurrency(value);
|
||||||
let value = $event.target.value as string;
|
}
|
||||||
// @ts-ignore
|
|
||||||
const isDotInput = $event.data === '.';
|
|
||||||
|
|
||||||
if (isDotInput) {
|
private isInRange(value: number, min = 0, max = Number.MAX_SAFE_INTEGER) {
|
||||||
|
return value >= min && value <= max;
|
||||||
|
}
|
||||||
|
|
||||||
|
private showOutOfRangeToast(value: number, isPercentageType: boolean, min = 0, max = Number.MAX_SAFE_INTEGER) {
|
||||||
|
if (value < min) {
|
||||||
|
this.toastService.warn({
|
||||||
|
text: `مقدار ${this.label} باید بیشتر از ${this.getRangeLabel(min, isPercentageType)} باشد.`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (value > max) {
|
||||||
|
this.toastService.warn({
|
||||||
|
text: `مقدار ${this.label} باید کمتر از ${this.getRangeLabel(max, isPercentageType)} باشد.`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private getAmountRange() {
|
||||||
|
const min = this.minAmount ?? 0;
|
||||||
|
const maxFromInput = this.maxAmount;
|
||||||
|
const max = maxFromInput ?? (this.baseAmount > 0 ? this.baseAmount : Number.MAX_SAFE_INTEGER);
|
||||||
|
return { min, max };
|
||||||
|
}
|
||||||
|
|
||||||
|
private getPercentageRange() {
|
||||||
|
const min = this.minPercentage ?? 0;
|
||||||
|
const max = this.maxPercentage ?? 100;
|
||||||
|
return { min, max };
|
||||||
|
}
|
||||||
|
|
||||||
|
private syncFromPercentage(rawValue: Maybe<any>) {
|
||||||
|
const { min, max } = this.getPercentageRange();
|
||||||
|
const percentageValue = this.parseValue(rawValue);
|
||||||
|
if (!this.isInRange(percentageValue, min, max)) {
|
||||||
|
this.showOutOfRangeToast(percentageValue, true, min, max);
|
||||||
|
this.percentageControl.setValue(this.lastValidPercentage, { emitEvent: false });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPriceType) {
|
this.lastValidPercentage = percentageValue;
|
||||||
value = value.replace(/,/g, '');
|
const amountValue = (this.baseAmount * percentageValue) / 100;
|
||||||
}
|
this.lastValidAmount = Number.isFinite(amountValue) ? amountValue : 0;
|
||||||
|
|
||||||
const newValueToSet = this.modifyControlsData(value);
|
this.percentageControl.setValue(this.lastValidPercentage, { emitEvent: false });
|
||||||
|
this.amountControl.setValue(this.lastValidAmount, { emitEvent: false });
|
||||||
if (newValueToSet !== null) {
|
this.preparedLabel.set(this.prepareLabel(true));
|
||||||
// @ts-ignore
|
|
||||||
$event.target.value = newValueToSet;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private modifyControlsData(value: string) {
|
private syncFromAmount(rawValue: Maybe<any>) {
|
||||||
let newValueToSet: Maybe<string> = null;
|
const { min, max } = this.getAmountRange();
|
||||||
let newValue = parseFloat(value);
|
const amountValue = this.parseValue(rawValue);
|
||||||
const isPercentageType = this.selectedType.value === 'percentage';
|
if (!this.isInRange(amountValue, min, max)) {
|
||||||
|
this.showOutOfRangeToast(amountValue, false, min, max);
|
||||||
const min = (isPercentageType ? this.minPercentage : this.minAmount) || 0;
|
this.amountControl.setValue(this.lastValidAmount, { emitEvent: false });
|
||||||
const max = (isPercentageType ? this.maxPercentage : this.maxAmount) || Number.MAX_SAFE_INTEGER;
|
return;
|
||||||
|
|
||||||
const maxValidator = max < newValue;
|
|
||||||
const minValidator = min > newValue;
|
|
||||||
|
|
||||||
const notValid = minValidator || maxValidator;
|
|
||||||
|
|
||||||
if (notValid) {
|
|
||||||
if (minValidator) {
|
|
||||||
this.toastService.warn({
|
|
||||||
text: `مقدار ${this.label} باید بیشتر از ${formatWithCurrency(min)} باشد.`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (maxValidator) {
|
|
||||||
this.toastService.warn({
|
|
||||||
text: `مقدار ${this.label} باید کمتر از ${formatWithCurrency(max)} باشد.`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
newValue = parseFloat(value.slice(0, value.length - 1));
|
|
||||||
if (newValue < 0 || isNaN(newValue)) {
|
|
||||||
newValue = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPercentageType) {
|
this.lastValidAmount = amountValue;
|
||||||
const amountValue = (this.baseAmount * newValue) / 100;
|
const percentageValue = this.baseAmount
|
||||||
newValueToSet = newValue + '';
|
? ((amountValue / this.baseAmount) * 100).toFixed(2)
|
||||||
this.amountControl.setValue(isNaN(amountValue) ? 0 : amountValue, { emitEvent: false });
|
: '0';
|
||||||
if (notValid) {
|
this.lastValidPercentage = this.parseValue(percentageValue);
|
||||||
this.percentageControl.setValue(newValue, { emitEvent: false });
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const percentageValue = ((newValue / this.baseAmount) * 100).toFixed(2);
|
|
||||||
newValueToSet = newValue + '';
|
|
||||||
this.percentageControl.setValue(percentageValue, { emitEvent: false });
|
|
||||||
this.preparedLabel.set(`${this.label} (${percentageValue} درصد)`);
|
|
||||||
if (notValid) {
|
|
||||||
this.amountControl.setValue(newValue, { emitEvent: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.preparedLabel.set(this.prepareLabel(isPercentageType));
|
|
||||||
|
|
||||||
return newValue;
|
this.amountControl.setValue(this.lastValidAmount, { emitEvent: false });
|
||||||
|
this.percentageControl.setValue(percentageValue, { emitEvent: false });
|
||||||
|
this.preparedLabel.set(this.prepareLabel(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private prepareLabel(isPercentageType: boolean) {
|
private prepareLabel(isPercentageType: boolean) {
|
||||||
@@ -177,25 +179,44 @@ export class AmountPercentageInputComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
const amountValue = Number(this.amountControl.value || 0);
|
const isPercentageType = this.defaultType === 'percentage';
|
||||||
const percentageValue = Number(this.percentageControl.value || 0);
|
|
||||||
const isPercentageType = percentageValue > 0 && amountValue <= 0;
|
|
||||||
|
|
||||||
console.log(amountValue, percentageValue, isPercentageType);
|
|
||||||
|
|
||||||
this.preparedLabel.set(this.prepareLabel(isPercentageType));
|
|
||||||
|
|
||||||
this.selectedType.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
|
this.selectedType.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
|
||||||
this.preparedLabel.set(this.prepareLabel(value === 'percentage'));
|
this.preparedLabel.set(this.prepareLabel(value === 'percentage'));
|
||||||
});
|
});
|
||||||
|
|
||||||
this.selectedType.setValue(isPercentageType ? 'percentage' : 'amount');
|
this.percentageControl.valueChanges
|
||||||
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
||||||
|
.subscribe((value) => {
|
||||||
|
if (this.selectedType.value === 'percentage') {
|
||||||
|
this.syncFromPercentage(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.amountControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
|
||||||
|
if (this.selectedType.value === 'amount') {
|
||||||
|
this.syncFromAmount(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.selectedType.setValue(isPercentageType ? 'percentage' : 'amount', { emitEvent: false });
|
||||||
|
this.lastValidAmount = this.parseValue(this.amountControl.value);
|
||||||
|
this.lastValidPercentage = this.parseValue(this.percentageControl.value);
|
||||||
|
if (isPercentageType) {
|
||||||
|
this.syncFromPercentage(this.percentageControl.value);
|
||||||
|
} else {
|
||||||
|
this.syncFromAmount(this.amountControl.value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnChanges() {
|
ngOnChanges() {
|
||||||
const amountValue = Number(this.amountControl.value || 0);
|
const isPercentageType = this.selectedType.value === 'percentage';
|
||||||
const percentageValue = Number(this.percentageControl.value || 0);
|
if (isPercentageType) {
|
||||||
const isPercentageType = percentageValue > 0 && amountValue <= 0;
|
this.syncFromPercentage(this.percentageControl.value);
|
||||||
|
} else {
|
||||||
|
this.syncFromAmount(this.amountControl.value);
|
||||||
|
}
|
||||||
|
|
||||||
this.preparedLabel.set(this.prepareLabel(isPercentageType));
|
this.preparedLabel.set(this.prepareLabel(isPercentageType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
}
|
}
|
||||||
@if (showIndex) {
|
@if (showIndex) {
|
||||||
<td>
|
<td>
|
||||||
{{ i * (currentPage || 1) + 1 }}
|
{{ i + 1 + (currentPage && perPage ? (currentPage - 1) * perPage : 0) }}
|
||||||
</td>
|
</td>
|
||||||
}
|
}
|
||||||
@for (col of columns; track col.field) {
|
@for (col of columns; track col.field) {
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ import { SkeletonModule } from 'primeng/skeleton';
|
|||||||
import { TableModule } from 'primeng/table';
|
import { TableModule } from 'primeng/table';
|
||||||
import { KeyValueComponent } from '../key-value.component/key-value.component';
|
import { KeyValueComponent } from '../key-value.component/key-value.component';
|
||||||
import { TableActionRowComponent } from '../table-action-row.component';
|
import { TableActionRowComponent } from '../table-action-row.component';
|
||||||
import { PageDataValueComponent } from './page-data-value.component';
|
|
||||||
import { IColumn } from './page-data-list.component';
|
import { IColumn } from './page-data-list.component';
|
||||||
|
import { PageDataValueComponent } from './page-data-value.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-page-data-list-table-view',
|
selector: 'app-page-data-list-table-view',
|
||||||
@@ -50,6 +50,7 @@ export class AppPageDataListTableView<I = any> {
|
|||||||
@Input() emptyPlaceholderDescription?: string = '';
|
@Input() emptyPlaceholderDescription?: string = '';
|
||||||
@Input() emptyPlaceholderCtaLabel?: string;
|
@Input() emptyPlaceholderCtaLabel?: string;
|
||||||
@Input() currentPage?: number = 1;
|
@Input() currentPage?: number = 1;
|
||||||
|
@Input() perPage?: number = 1;
|
||||||
@Input() showEdit: boolean = false;
|
@Input() showEdit: boolean = false;
|
||||||
@Input() showDelete: boolean = false;
|
@Input() showDelete: boolean = false;
|
||||||
@Input() showDetails: boolean = false;
|
@Input() showDetails: boolean = false;
|
||||||
|
|||||||
@@ -76,6 +76,7 @@
|
|||||||
[emptyPlaceholderCtaLabel]="emptyPlaceholderCtaLabel || addNewCtaLabel"
|
[emptyPlaceholderCtaLabel]="emptyPlaceholderCtaLabel || addNewCtaLabel"
|
||||||
[addNewCtaLabel]="addNewCtaLabel"
|
[addNewCtaLabel]="addNewCtaLabel"
|
||||||
[currentPage]="currentPage"
|
[currentPage]="currentPage"
|
||||||
|
[perPage]="perPage"
|
||||||
[showEdit]="showEdit"
|
[showEdit]="showEdit"
|
||||||
[showDelete]="showDelete"
|
[showDelete]="showDelete"
|
||||||
[showDetails]="showDetails"
|
[showDetails]="showDetails"
|
||||||
@@ -84,9 +85,11 @@
|
|||||||
[expandable]="expandable"
|
[expandable]="expandable"
|
||||||
[expandableItemKey]="expandableItemKey"
|
[expandableItemKey]="expandableItemKey"
|
||||||
[expandColumns]="expandColumns"
|
[expandColumns]="expandColumns"
|
||||||
|
[showPaginator]="showPaginator"
|
||||||
(onEdit)="edit($event)"
|
(onEdit)="edit($event)"
|
||||||
(onDelete)="remove($event)"
|
(onDelete)="remove($event)"
|
||||||
(onDetails)="details($event)"
|
(onDetails)="details($event)"
|
||||||
|
(onChangePage)="onPage($event)"
|
||||||
>
|
>
|
||||||
@if (pageTitle || showAdd || filter || showRefresh || moreActions) {
|
@if (pageTitle || showAdd || filter || showRefresh || moreActions) {
|
||||||
<ng-template #captionBox>
|
<ng-template #captionBox>
|
||||||
|
|||||||
@@ -176,6 +176,8 @@ export class PageDataListComponent<I = any> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onPage = ($event: any) => {
|
onPage = ($event: any) => {
|
||||||
|
console.log('$event', $event);
|
||||||
|
|
||||||
this.onChangePage.emit($event);
|
this.onChangePage.emit($event);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
import { IListConfig } from './list-config.model';
|
import { IListConfig } from './list-config.model';
|
||||||
|
|
||||||
export const partnerConsumerAccountListConfig: IListConfig = {
|
export const consumerAccountListConfig: IListConfig = {
|
||||||
pageTitle: 'مدیریت حسابهای مشتری',
|
pageTitle: 'مدیریت حسابهای مشتری',
|
||||||
addNewCtaLabel: 'افزودن حساب',
|
addNewCtaLabel: 'افزودن حساب',
|
||||||
emptyPlaceholderTitle: 'حسابی یافت نشد',
|
emptyPlaceholderTitle: 'حسابی یافت نشد',
|
||||||
@@ -27,7 +27,7 @@ export const partnerConsumerAccountListConfig: IListConfig = {
|
|||||||
field: 'status',
|
field: 'status',
|
||||||
header: 'وضعیت',
|
header: 'وضعیت',
|
||||||
type: 'nested',
|
type: 'nested',
|
||||||
nestedOption: { path: 'account.status.translate' },
|
nestedOption: { path: 'status.translate' },
|
||||||
variant: 'tag',
|
variant: 'tag',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@@ -2,6 +2,7 @@ export * from './account-list.const';
|
|||||||
export * from './business-activity-list.const';
|
export * from './business-activity-list.const';
|
||||||
export * from './category-list.const';
|
export * from './category-list.const';
|
||||||
export * from './complex-list.const';
|
export * from './complex-list.const';
|
||||||
|
export * from './consumer-account-list.const';
|
||||||
export * from './consumer-list.const';
|
export * from './consumer-list.const';
|
||||||
export * from './device-brand-list.const';
|
export * from './device-brand-list.const';
|
||||||
export * from './device-list.const';
|
export * from './device-list.const';
|
||||||
@@ -9,12 +10,10 @@ export * from './good-list.const';
|
|||||||
export * from './license-list.const';
|
export * from './license-list.const';
|
||||||
export * from './list-config.model';
|
export * from './list-config.model';
|
||||||
export * from './partner-account-list.const';
|
export * from './partner-account-list.const';
|
||||||
export * from './partner-consumer-account-list.const';
|
|
||||||
export * from './partner-customer-list.const';
|
export * from './partner-customer-list.const';
|
||||||
export * from './partner-list.const';
|
export * from './partner-list.const';
|
||||||
export * from './pos-list.const';
|
export * from './pos-list.const';
|
||||||
export * from './provider-list.const';
|
export * from './provider-list.const';
|
||||||
export * from './sale-invoice-list.const';
|
export * from './sale-invoice-list.const';
|
||||||
export * from './sku-list.const';
|
export * from './sku-list.const';
|
||||||
export * from './superAdmin-consumer-account-list.const';
|
|
||||||
export * from './user-list.const';
|
export * from './user-list.const';
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
import { IListConfig } from './list-config.model';
|
|
||||||
|
|
||||||
export const superAdminConsumerAccountListConfig: IListConfig = {
|
|
||||||
pageTitle: 'مدیریت حسابهای مشتری',
|
|
||||||
addNewCtaLabel: 'افزودن حساب',
|
|
||||||
emptyPlaceholderTitle: 'حسابی یافت نشد',
|
|
||||||
emptyPlaceholderDescription: 'برای افزودن حساب، روی دکمهٔ بالا کلیک کنید.',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
field: 'account',
|
|
||||||
header: 'نام کاربری',
|
|
||||||
type: 'nested',
|
|
||||||
nestedOption: { path: 'account.username' },
|
|
||||||
},
|
|
||||||
{ field: 'role', header: 'نوع حساب', type: 'nested', nestedOption: { path: 'role.translate' } },
|
|
||||||
{
|
|
||||||
field: 'pos',
|
|
||||||
header: 'پایانه',
|
|
||||||
customDataModel(item: any) {
|
|
||||||
return `${item.pos.name} (${item.pos.complex.name} - ${item.pos.complex.business_activity.name})`;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: 'status',
|
|
||||||
header: 'وضعیت',
|
|
||||||
type: 'nested',
|
|
||||||
nestedOption: { path: 'account.status.translate' },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: 'created_at',
|
|
||||||
header: 'تاریخ ایجاد',
|
|
||||||
type: 'date',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
@@ -9,3 +9,10 @@
|
|||||||
.cardShadow {
|
.cardShadow {
|
||||||
box-shadow: var(--p-card-shadow) !important;
|
box-shadow: var(--p-card-shadow) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.summaryList {
|
||||||
|
@apply max-h-125 flex;
|
||||||
|
> * {
|
||||||
|
@apply w-full;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
// TIS tenant environment configuration
|
// TIS tenant environment configuration
|
||||||
export const environment = {
|
export const environment = {
|
||||||
production: true,
|
production: true,
|
||||||
apiBaseUrl: 'https://psp-api.shift-am.ir',
|
// apiBaseUrl: 'https://psp-api.shift-am.ir',
|
||||||
// apiBaseUrl: 'http://192.168.128.73:5002',
|
apiBaseUrl: 'http://192.168.128.73:5002',
|
||||||
host: 'localhost',
|
host: 'localhost',
|
||||||
port: 5000,
|
port: 5000,
|
||||||
enableLogging: false,
|
enableLogging: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user