update ux writing

This commit is contained in:
2026-05-04 21:30:05 +03:30
parent ec452bca22
commit d130a83bd4
44 changed files with 66 additions and 73 deletions
@@ -6,7 +6,7 @@
</ng-template>
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
@for (field of visibleFields(); track field) {
@if (isFieldVisible(field)) {
<app-key-value [label]="fieldLabels[field]" [value]="getFieldValue(field)" />
@@ -23,7 +23,7 @@ export const CONSUMER_MENU_ITEMS = [
routerLink: ['/consumer/sale_invoices'],
},
{
label: 'مشتریان',
label: 'مشتریها',
icon: 'pi pi-fw pi-home',
routerLink: ['/consumer/customers'],
},
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات کاربری" [editable]="false" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="نام کاربری" [value]="account()?.account?.username" />
</div>
</div>
@@ -35,7 +35,7 @@ export class ConsumerBusinessActivityListComponent extends AbstractList<IBusines
},
{
field: 'license_info',
header: 'انقضای مجوز',
header: 'انقضا مجوز',
type: 'nested',
nestedOption: { path: 'license_info.expires_at', type: 'date' },
},
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات شعبه" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="complex()?.name" />
<app-key-value label="کد شعبه" [value]="complex()?.branch_code" />
<app-key-value label="آدرس" [value]="complex()?.address" />
@@ -4,13 +4,13 @@
<a routerLink pButton [routerLink]="goodsPageRoute()" outlined>مدیریت کالاها</a>
</ng-template>
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="business()?.name" />
<app-key-value label="کد اقتصادی" [value]="business()?.economic_code" />
<app-key-value label="صنف" [value]="business()?.guild?.name" />
</div>
<p-divider align="center">اطلاعات لایسنس</p-divider>
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="تاریخ پایان لایسنس" [value]="business()?.license_info?.expires_at" type="date" />
<app-key-value label="محدودیت کاربر" [value]="business()?.license_info?.accounts_limit" />
<app-key-value label="تعداد کاربران ایجاد شده" [value]="business()?.license_info?.allocated_account_count" />
@@ -1,5 +1,5 @@
<app-page-data-list
[pageTitle]="'لیست مشتریان'"
[pageTitle]="'لیست مشتریها'"
[columns]="columns"
emptyPlaceholderTitle="مشتری‌ای یافت نشد"
[items]="items()"
@@ -10,7 +10,7 @@ export const consumerCustomersNamedRoutes: NamedRoutes<TConsumerCustomersRouteNa
loadComponent: () =>
import('../../views/list.component').then((m) => m.ConsumerCustomersComponent),
meta: {
title: 'مشتریان',
title: 'مشتریها',
pagePath: () => 'consumer/customers',
},
},
@@ -6,14 +6,14 @@
>
<div class="flex flex-col gap-4">
@if (customer()?.type === "LEGAL") {
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="customer()?.legal?.company_name" />
<app-key-value label="کد اقتصادی" [value]="customer()?.legal?.economic_code" />
<app-key-value label="شماره ثبت" [value]="customer()?.legal?.registration_number" />
<app-key-value label="کد پستی" [value]="customer()?.legal?.postal_code" />
</div>
} @else if (customer()?.type === "INDIVIDUAL") {
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="نام" [value]="customer()?.individual?.first_name" />
<app-key-value label="نام خانوادگی" [value]="customer()?.individual?.last_name" />
<app-key-value label="عنوان" [value]="customer()?.individual?.national_id" />
@@ -13,7 +13,7 @@ export const PARTNER_MENU_ITEMS = [
routerLink: ['/partner/accounts'],
},
{
label: 'مشتریان',
label: 'مشتریها',
icon: 'pi pi-fw pi-home',
routerLink: ['/partner/consumers'],
},
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات کاربری" [editable]="false" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="نام کاربری" [value]="account()?.account?.username" />
<app-key-value label="نقش" [value]="account()?.role" />
<app-key-value label="وضعیت" [value]="account()?.account?.status" />
@@ -25,10 +25,10 @@ export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountR
type: 'nested',
nestedOption: { path: 'account.username' },
},
{ field: 'role', header: 'نوع حساب' },
{ field: 'role', header: 'نوع حساب', type: 'nested', nestedOption: { path: 'role.translate' } },
{
field: 'pos',
header: 'پایانه‌ی مرتبط',
header: 'پایانه‌',
customDataModel(item: IConsumerAccountResponse) {
if (item.pos) {
return `${item.pos.name} (${item.pos.complex.name} - ${item.pos.complex.business_activity.name})`;
@@ -40,7 +40,7 @@ export class ConsumerAccountListComponent extends AbstractList<IConsumerAccountR
field: 'status',
header: 'وضعیت',
type: 'nested',
nestedOption: { path: 'account.status' },
nestedOption: { path: 'account.status.translate' },
},
// {
// field: 'created_at',
@@ -25,7 +25,6 @@ export class ConsumerBusinessActivitiesComponent extends AbstractList<IBusinessA
@Input({ required: true }) consumerId!: string;
@Input() fullHeight?: boolean;
@Input() header: IColumn[] = [
{ field: 'id', header: 'شناسه', type: 'id' },
{ field: 'name', header: 'عنوان' },
{ field: 'guild', header: 'صنف', type: 'nested', nestedOption: { path: 'guild.name' } },
{ field: 'economic_code', header: 'کد اقتصادی' },
@@ -42,15 +41,10 @@ export class ConsumerBusinessActivitiesComponent extends AbstractList<IBusinessA
},
{
field: 'license_info',
header: 'انقضای مجوز',
header: 'انقضا مجوز',
type: 'nested',
nestedOption: { path: 'license_info.expires_at', type: 'date' },
},
{
field: 'created_at',
header: 'تاریخ ایجاد',
type: 'date',
},
];
private readonly service = inject(PartnerConsumerBusinessActivitiesService);
@@ -10,7 +10,7 @@ export const partnerConsumersNamedRoutes: NamedRoutes<TConsumersRouteNames> = {
path: 'consumers',
loadComponent: () => import('../../views/list.component').then((m) => m.ConsumersComponent),
meta: {
title: 'مشتریان',
title: 'مشتریها',
pagePath: () => '/partner/consumers',
},
},
@@ -1,10 +1,10 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات فعالیت اقتصادی" [editable]="true" [(editMode)]="editMode">
<ng-template #moreActions>
<button pButton outlined (click)="showAccountsChargeDialog()">افزایش محدودیت کاربر</button>
<button pButton outlined (click)="showAccountsChargeDialog()">شارژ کاربر</button>
</ng-template>
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="businessActivity()?.name" />
<app-key-value label="کد اقتصادی" [value]="businessActivity()?.economic_code" />
<app-key-value label="صنف" [value]="businessActivity()?.guild?.name" />
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات شعبه" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="complex()?.name" />
<app-key-value label="کد شعبه" [value]="complex()?.branch_code" />
<app-key-value label="آدرس" [value]="complex()?.address" />
@@ -1,5 +1,5 @@
<app-page-data-list
pageTitle="مدیریت مشتریان"
pageTitle="لیست مشتریها"
[addNewCtaLabel]="'افزودن مشتری جدید'"
[columns]="columns"
[showAdd]="true"
@@ -12,11 +12,7 @@ import { ConsumersService } from '../services/main.service';
@Component({
selector: 'partner-consumers',
templateUrl: './list.component.html',
imports: [
PageDataListComponent,
ConsumerUserFormDialogComponent,
CreateConsumerWrapperComponent,
],
imports: [PageDataListComponent, ConsumerUserFormDialogComponent, CreateConsumerWrapperComponent],
})
export class ConsumersComponent extends AbstractList<IPartnerConsumerResponse> {
private readonly service = inject(ConsumersService);
@@ -25,9 +21,9 @@ export class ConsumersComponent extends AbstractList<IPartnerConsumerResponse> {
override setColumns(): void {
this.columns = [
{ field: 'id', header: 'شناسه', type: 'id' },
{ field: 'name', header: 'نام' },
{ field: 'business_counts', header: 'تعداد فعالیت‌های اقتصادی فعال' },
{ field: 'type', header: 'نوع', type: 'nested', nestedOption: { path: 'type.translate' } },
{ field: 'business_counts', header: 'تعداد فعالیت‌ اقتصادی فعال' },
{
field: 'created_at',
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات پایانه‌ فروش" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="pos()?.name" />
</div>
</div>
@@ -2,23 +2,22 @@
<app-card-data cardTitle="اطلاعات مشتری" [editable]="true" [(editMode)]="editMode">
<ng-template #moreActions> </ng-template>
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="نام مشتری" [value]="consumer()?.name" />
<app-key-value label="وضعیت" [value]="consumer()?.status?.translate" />
<app-key-value label="نوع مشتری" [value]="consumer()?.type?.translate" />
@if (consumer()?.type?.value === "LEGAL") {
<app-key-value label="شناسه ملی" [value]="consumer()?.legal?.registration_code" />
} @else {
<app-key-value label="شماره موبایل" [value]="consumer()?.individual?.mobile_number" />
<app-key-value label="کد ملی" [value]="consumer()?.individual?.national_code" />
}
<app-key-value label="وضعیت" [value]="consumer()?.status?.translate" />
</div>
</div>
</app-card-data>
<partner-consumer-account-list [consumerId]="consumerId()" />
<partner-consumer-businessActivities-list [consumerId]="consumerId()" />
<partner-consumer-account-list [consumerId]="consumerId()" />
<partner-consumer-form
[(visible)]="editMode"
@@ -1,5 +1,5 @@
<app-page-data-list
[pageTitle]="'لیست مشتریان'"
[pageTitle]="'لیست مشتریها'"
[columns]="columns"
emptyPlaceholderTitle="مشتری‌ای یافت نشد"
[items]="items()"
@@ -9,7 +9,7 @@ export const partnerCustomersNamedRoutes: NamedRoutes<TPartnerCustomersRouteName
loadComponent: () =>
import('../../views/list.component').then((m) => m.PartnerCustomersComponent),
meta: {
title: 'مشتریان',
title: 'مشتریها',
pagePath: () => 'partner/customers',
},
},
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات مشتری" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="customer()?.first_name" />
</div>
</div>
@@ -1,6 +1,7 @@
<p-card class="border border-surface-border bg-surface-card rounded-2xl p-4 text-text-color">
<div class="text-center w-full flex items-center justify-center gap-1">
<div class="w-full flex items-center justify-between gap-1">
<span class="text-xl font-semibold">وضعیت {{ title }}</span>
<p-badge [value]="`تعداد کل: ${total}`" severity="secondary" size="large"></p-badge>
</div>
<hr class="mb-6!" />
<div class="grid grid-cols-3 gap-2">
@@ -1,10 +1,11 @@
import { Component, Input } from '@angular/core';
import { Badge } from 'primeng/badge';
import { Card } from 'primeng/card';
@Component({
selector: 'partner-license-info-template',
templateUrl: './license-info-template.component.html',
imports: [Card],
imports: [Card, Badge],
})
export class PartnerLicenseInfoTemplateComponent {
@Input({ required: true }) title!: string;
@@ -1,5 +1,5 @@
<app-page-data-list
[pageTitle]="'مدیریت لایسنس‌ها'"
[pageTitle]="'لیست لایسنس‌ها'"
[columns]="columns"
emptyPlaceholderTitle="تا به حال لایسنسی نفروخته‌اید."
[currentPage]="responseMetaData()?.page"
@@ -9,7 +9,7 @@ export const SUPER_ADMIN_MENU_ITEMS = [
routerLink: ['/'],
},
{
label: 'مشتریان',
label: 'مشتریها',
icon: 'pi pi-fw pi-user',
routerLink: ['/super_admin/consumers'],
},
@@ -10,7 +10,7 @@ export const superAdminConsumersNamedRoutes: NamedRoutes<TConsumersRouteNames> =
path: 'consumers',
loadComponent: () => import('../../views/list.component').then((m) => m.ConsumersComponent),
meta: {
title: 'مشتریان',
title: 'مشتریها',
pagePath: () => '/super_admin/consumers',
},
},
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات فعالیت اقتصادی" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="businessActivity()?.name" />
<app-key-value label="صنف" [value]="businessActivity()?.guild?.name" />
</div>
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات شعبه" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="complex()?.name" />
<app-key-value label="کد شعبه" [value]="complex()?.branch_code" />
<app-key-value label="آدرس" [value]="complex()?.address" />
@@ -1,5 +1,5 @@
<app-page-data-list
pageTitle="مدیریت مشتریان"
pageTitle="مدیریت مشتریها"
[columns]="columns"
emptyPlaceholderTitle="مشتری‌ای یافت نشد"
[items]="items()"
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات پایانه‌ فروش" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان" [value]="pos()?.name" />
</div>
</div>
@@ -2,7 +2,7 @@
<app-card-data cardTitle="اطلاعات مشتری" [editable]="true" [(editMode)]="editMode">
<ng-template #moreActions> </ng-template>
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="نام مشتری" [value]="consumer()?.name" />
<app-key-value label="وضعیت" [value]="consumer()?.status?.translate" />
<app-key-value label="نوع مشتری" [value]="consumer()?.type?.translate" />
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات صنف" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان صنف" [value]="guild()?.name" />
<app-key-value label="کد صنف" [value]="guild()?.code" />
</div>
@@ -1,5 +1,5 @@
<app-page-data-list
[pageTitle]="'مدیریت لایسنس‌ها'"
[pageTitle]="'لیست لایسنس‌ها'"
[columns]="columns"
emptyPlaceholderTitle="لایسنسی یافت نشد"
[items]="items()"
@@ -15,7 +15,6 @@ export class LicensesComponent extends AbstractList<ILicenseResponse> {
override setColumns(): void {
this.columns = [
{ field: 'id', header: 'شناسه', type: 'id' },
{
field: 'consumer',
header: 'مشتری',
@@ -5,7 +5,7 @@
<p-button outlined size="small" (onClick)="openChargeDialog()"> شارژ لایسنس‌ </p-button>
</ng-template>
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="عنوان شریک تجاری" [value]="partner()?.name" />
<app-key-value label="کد شریک تجاری" [value]="partner()?.code" />
@@ -1,7 +1,7 @@
<div class="flex flex-col gap-6">
<app-card-data cardTitle="اطلاعات کاربر" [editable]="true" [(editMode)]="editMode">
<div class="flex flex-col gap-4">
<div class="grid grid-cols-3 gap-4 items-center">
<div class="listKeyValue">
<app-key-value label="نام" [value]="user()?.fullname" />
<app-key-value label="شماره تماس" [value]="user()?.mobile_number" />
</div>
@@ -4,7 +4,7 @@
</div>
<div class="shrink-0 sticky bottom-0">
<div class="py-2 w-full text-center">
<span class="text-muted-color text-sm font-bold">ارایه شده توسط (برند نرم‌افزار)</span>
<span class="text-muted-color text-sm font-medium">ارایه شده توسط (برند نرم‌افزار)</span>
</div>
</div>
</div>
@@ -47,13 +47,13 @@
<hr />
<div class="flex justify-center gap-2 mt-2">
@if (showEdit) {
<p-button icon="pi pi-pencil" label="ویرایش" size="small" (click)="edit(item)"> </p-button>
<p-button icon="pi pi-pencil" label="ویرایش" size="small" outlined (click)="edit(item)"> </p-button>
}
@if (showDelete) {
<p-button icon="pi pi-trash" label="حذف" size="small" (click)="remove(item)"> </p-button>
<p-button icon="pi pi-trash" label="حذف" size="small" outlined (click)="remove(item)"> </p-button>
}
@if (showDetails) {
<p-button icon="pi pi-eye" label="مشاهده" size="small" (click)="details(item)"> </p-button>
<p-button icon="pi pi-eye" label="مشاهده" size="small" outlined (click)="details(item)"> </p-button>
}
</div>
}
@@ -13,7 +13,7 @@
[tableStyleClass]="!items.length && !loading ? 'h-full' : ''"
>
@if (captionBox) {
<ng-template pTemplate="caption">
<ng-template #caption>
<ng-container [ngTemplateOutlet]="captionBox"> </ng-container>
</ng-template>
}
@@ -17,8 +17,8 @@
(onDelete)="remove($event)"
(onDetails)="details($event)"
>
@if (pageTitle || showAdd || filter || caption || showRefresh || moreActions) {
<ng-template #captionBox>
<ng-template #captionBox>
@if (pageTitle || showAdd || filter || caption || showRefresh || moreActions) {
<ng-container [ngTemplateOutlet]="caption">
<div class="flex justify-between items-center gap-4">
<h5 class="font-bold">{{ pageTitle }}</h5>
@@ -51,8 +51,8 @@
}
</div>
</ng-container>
</ng-template>
}
}
</ng-template>
<ng-template #emptyMessageCard>
<uikit-empty-state
[title]="emptyPlaceholderTitle"
@@ -90,8 +90,8 @@
(onDelete)="remove($event)"
(onDetails)="details($event)"
>
@if (pageTitle || showAdd || filter || caption || showRefresh || moreActions) {
<ng-template #captionBox>
<ng-template #captionBox>
@if (pageTitle || showAdd || filter || caption || showRefresh || moreActions) {
<ng-container [ngTemplateOutlet]="caption">
<div class="flex justify-between items-center gap-4">
<h5 class="font-bold">{{ pageTitle }}</h5>
@@ -117,15 +117,17 @@
label="{{ addNewCtaLabel }}"
icon="pi pi-plus"
size="small"
class="max-sm:hidden"
(click)="openAddForm()"
></p-button>
<p-button icon="pi pi-plus" size="small" class="sm:hidden" (click)="openAddForm()"></p-button>
}
</div>
}
</div>
</ng-container>
</ng-template>
}
}
</ng-template>
<ng-template #emptyMessageCard>
<uikit-empty-state
[title]="emptyPlaceholderTitle"
@@ -20,6 +20,6 @@
/>
}
@if (showDetails) {
<p-button size="small" icon="pi pi-chevron-left" (click)="details.emit()" title="جزئیات" />
<p-button size="small" icon="pi pi-chevron-left" (click)="details.emit()" [title]="showDetailsText" />
}
</td>
@@ -1,5 +1,5 @@
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { Button } from 'primeng/button';
@Component({
@@ -12,6 +12,7 @@ export class TableActionRowComponent {
@Input() showEdit = false;
@Input() showDelete = false;
@Input() showDetails = false;
@Input() showDetailsText: string = 'جزییات';
@Output() edit = new EventEmitter<void>();
@Output() delete = new EventEmitter<void>();