diff --git a/src/app/domains/partner/constants/menuItems.const.ts b/src/app/domains/partner/constants/menuItems.const.ts index f5d17f0..4f3da20 100644 --- a/src/app/domains/partner/constants/menuItems.const.ts +++ b/src/app/domains/partner/constants/menuItems.const.ts @@ -17,6 +17,11 @@ export const PARTNER_MENU_ITEMS = [ icon: 'pi pi-fw pi-home', routerLink: ['/partner/consumers'], }, + { + label: 'لایسنس‌ها', + icon: 'pi pi-fw pi-home', + routerLink: ['/partner/licenses'], + }, ], }, ] as MenuItem[]; diff --git a/src/app/domains/partner/modules/consumers/components/businessActivities/form-dialog.component.html b/src/app/domains/partner/modules/consumers/components/businessActivities/form-dialog.component.html new file mode 100644 index 0000000..966c95e --- /dev/null +++ b/src/app/domains/partner/modules/consumers/components/businessActivities/form-dialog.component.html @@ -0,0 +1,17 @@ + + + diff --git a/src/app/domains/partner/modules/consumers/components/businessActivities/form-dialog.component.ts b/src/app/domains/partner/modules/consumers/components/businessActivities/form-dialog.component.ts new file mode 100644 index 0000000..b1325a5 --- /dev/null +++ b/src/app/domains/partner/modules/consumers/components/businessActivities/form-dialog.component.ts @@ -0,0 +1,28 @@ +import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Dialog } from 'primeng/dialog'; +import { IBusinessActivityResponse } from '../../models'; +import { ConsumerBusinessActivitiesFormComponent } from './form.component'; + +@Component({ + selector: 'partner-consumer-businessActivities-form', + templateUrl: './form-dialog.component.html', + imports: [Dialog, ConsumerBusinessActivitiesFormComponent], +}) +export class ConsumerBusinessActivitiesFormDialogComponent extends AbstractDialog { + @Output() onSubmit = new EventEmitter(); + @Input() initialValues?: IBusinessActivityResponse; + @Input() editMode?: boolean; + + @Input({ required: true }) consumerId!: string; + @Input() businessActivityId!: string; + + get preparedTitle() { + return `${this.editMode ? 'ویرایش' : 'ایجاد'} فعالیت اقتصادی`; + } + + onFormSubmit(response: IBusinessActivityResponse) { + this.onSubmit.emit(response); + this.close(); + } +} diff --git a/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.html b/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.html index ab11ea8..1ea2ecd 100644 --- a/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.html +++ b/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.html @@ -1,26 +1,17 @@ - -
- - - + + + + - @if (!editMode) { - اطلاعات لایسنس - - } + @if (!editMode) { + اطلاعات لایسنس + + } - - -
+ + diff --git a/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.ts b/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.ts index 544dc99..e20c2e6 100644 --- a/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.ts +++ b/src/app/domains/partner/modules/consumers/components/businessActivities/form.component.ts @@ -1,23 +1,19 @@ -// import { CatalogRolesComponent } from '@/shared/catalog/roles'; -import { MustMatch } from '@/core/validators'; -import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { AbstractForm } from '@/shared/abstractClasses'; import { CatalogGuildSelectComponent } from '@/shared/catalog/guild/components/select.component'; import { InputComponent } from '@/shared/components'; import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; import { UikitFlatpickrJalaliComponent } from '@/uikit'; import { Component, inject, Input } from '@angular/core'; import { ReactiveFormsModule, Validators } from '@angular/forms'; -import { Dialog } from 'primeng/dialog'; import { Divider } from 'primeng/divider'; import { IBusinessActivityRequest, IBusinessActivityResponse } from '../../models'; import { PartnerConsumerBusinessActivitiesService } from '../../services/businessActivities.service'; @Component({ - selector: 'partner-consumer-businessActivities-form', + selector: 'partner-consumer-businessActivities-form-content', templateUrl: './form.component.html', imports: [ ReactiveFormsModule, - Dialog, InputComponent, FormFooterActionsComponent, CatalogGuildSelectComponent, @@ -25,7 +21,7 @@ import { PartnerConsumerBusinessActivitiesService } from '../../services/busines UikitFlatpickrJalaliComponent, ], }) -export class ConsumerBusinessActivitiesFormComponent extends AbstractFormDialog< +export class ConsumerBusinessActivitiesFormComponent extends AbstractForm< IBusinessActivityRequest, IBusinessActivityResponse > { @@ -53,7 +49,6 @@ export class ConsumerBusinessActivitiesFormComponent extends AbstractFormDialog< validators: [Validators.required], }), ); - form.addValidators([MustMatch('password', 'confirmPassword')]); } return form; @@ -61,20 +56,15 @@ export class ConsumerBusinessActivitiesFormComponent extends AbstractFormDialog< form = this.initForm(); - get preparedTitle() { - return `${this.editMode ? 'ویرایش' : 'ایجاد'} فعالیت اقتصادی`; - } - override ngOnChanges(): void { this.form = this.initForm(); } submitForm() { - const formValue = this.form.value as IBusinessActivityRequest & { confirmPassword?: string }; - const { confirmPassword, ...rest } = formValue; + const formValue = this.form.value as IBusinessActivityRequest; if (this.editMode) { - return this.service.update(this.consumerId, this.businessActivityId, rest); + return this.service.update(this.consumerId, this.businessActivityId, formValue); } - return this.service.create(this.consumerId, rest); + return this.service.create(this.consumerId, formValue); } } diff --git a/src/app/domains/partner/modules/consumers/components/businessActivities/list.component.ts b/src/app/domains/partner/modules/consumers/components/businessActivities/list.component.ts index d77d68c..b922778 100644 --- a/src/app/domains/partner/modules/consumers/components/businessActivities/list.component.ts +++ b/src/app/domains/partner/modules/consumers/components/businessActivities/list.component.ts @@ -9,12 +9,12 @@ import { Router } from '@angular/router'; import { partnerConsumerBusinessActivitiesNamedRoutes } from '../../constants/routes/businessActivities'; import { IBusinessActivityResponse } from '../../models'; import { PartnerConsumerBusinessActivitiesService } from '../../services/businessActivities.service'; -import { ConsumerBusinessActivitiesFormComponent } from './form.component'; +import { ConsumerBusinessActivitiesFormDialogComponent } from './form-dialog.component'; @Component({ selector: 'partner-consumer-businessActivities-list', templateUrl: './list.component.html', - imports: [PageDataListComponent, ConsumerBusinessActivitiesFormComponent], + imports: [PageDataListComponent, ConsumerBusinessActivitiesFormDialogComponent], }) export class ConsumerBusinessActivitiesComponent extends AbstractList { @Input({ required: true }) consumerId!: string; @@ -23,6 +23,7 @@ export class ConsumerBusinessActivitiesComponent extends AbstractList + + diff --git a/src/app/domains/partner/modules/consumers/components/complexes/form-dialog.component.ts b/src/app/domains/partner/modules/consumers/components/complexes/form-dialog.component.ts new file mode 100644 index 0000000..c3251a0 --- /dev/null +++ b/src/app/domains/partner/modules/consumers/components/complexes/form-dialog.component.ts @@ -0,0 +1,29 @@ +import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Dialog } from 'primeng/dialog'; +import { IComplexResponse } from '../../models'; +import { ConsumerComplexFormContentComponent } from './form.component'; + +@Component({ + selector: 'partner-consumer-complex-form', + templateUrl: './form-dialog.component.html', + imports: [Dialog, ConsumerComplexFormContentComponent], +}) +export class ConsumerComplexFormDialogComponent extends AbstractDialog { + @Output() onSubmit = new EventEmitter(); + @Input() initialValues?: IComplexResponse; + @Input() editMode?: boolean; + + @Input({ required: true }) consumerId!: string; + @Input() businessActivityId!: string; + @Input() complexId!: string; + + get preparedTitle() { + return `${this.editMode ? 'ویرایش' : 'ایجاد'} شعبه`; + } + + onFormSubmit(response: IComplexResponse) { + this.onSubmit.emit(response); + this.close(); + } +} diff --git a/src/app/domains/partner/modules/consumers/components/complexes/form.component.html b/src/app/domains/partner/modules/consumers/components/complexes/form.component.html index 248f2ba..34fb8d7 100644 --- a/src/app/domains/partner/modules/consumers/components/complexes/form.component.html +++ b/src/app/domains/partner/modules/consumers/components/complexes/form.component.html @@ -1,15 +1,6 @@ - -
- - - - - -
+
+ + + + + diff --git a/src/app/domains/partner/modules/consumers/components/complexes/form.component.ts b/src/app/domains/partner/modules/consumers/components/complexes/form.component.ts index ab17160..175d8b6 100644 --- a/src/app/domains/partner/modules/consumers/components/complexes/form.component.ts +++ b/src/app/domains/partner/modules/consumers/components/complexes/form.component.ts @@ -1,19 +1,18 @@ // import { CatalogRolesComponent } from '@/shared/catalog/roles'; -import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { AbstractForm } from '@/shared/abstractClasses'; import { InputComponent } from '@/shared/components'; import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; import { Component, inject, Input } from '@angular/core'; import { ReactiveFormsModule, Validators } from '@angular/forms'; -import { Dialog } from 'primeng/dialog'; import { IComplexRequest, IComplexResponse } from '../../models'; import { PartnerComplexesService } from '../../services/complexes.service'; @Component({ - selector: 'partner-consumer-complex-form', + selector: 'partner-consumer-complex-form-content', templateUrl: './form.component.html', - imports: [ReactiveFormsModule, Dialog, InputComponent, FormFooterActionsComponent], + imports: [ReactiveFormsModule, InputComponent, FormFooterActionsComponent], }) -export class ConsumerComplexFormComponent extends AbstractFormDialog< +export class ConsumerComplexFormContentComponent extends AbstractForm< IComplexRequest, IComplexResponse > { diff --git a/src/app/domains/partner/modules/consumers/components/complexes/list.component.ts b/src/app/domains/partner/modules/consumers/components/complexes/list.component.ts index 2dabd7b..6fab63b 100644 --- a/src/app/domains/partner/modules/consumers/components/complexes/list.component.ts +++ b/src/app/domains/partner/modules/consumers/components/complexes/list.component.ts @@ -9,12 +9,12 @@ import { Router } from '@angular/router'; import { partnerConsumerComplexesNamedRoutes } from '../../constants/routes/complexes'; import { IComplexResponse } from '../../models'; import { PartnerComplexesService } from '../../services/complexes.service'; -import { ConsumerComplexFormComponent } from './form.component'; +import { ConsumerComplexFormDialogComponent } from './form-dialog.component'; @Component({ selector: 'partner-consumer-complexes-list', templateUrl: './list.component.html', - imports: [PageDataListComponent, ConsumerComplexFormComponent], + imports: [PageDataListComponent, ConsumerComplexFormDialogComponent], }) export class ConsumerComplexesComponent extends AbstractList { @Input() consumerId!: string; diff --git a/src/app/domains/partner/modules/consumers/components/poses/form-dialog.component.html b/src/app/domains/partner/modules/consumers/components/poses/form-dialog.component.html new file mode 100644 index 0000000..48b9e16 --- /dev/null +++ b/src/app/domains/partner/modules/consumers/components/poses/form-dialog.component.html @@ -0,0 +1,19 @@ + + + diff --git a/src/app/domains/partner/modules/consumers/components/poses/form-dialog.component.ts b/src/app/domains/partner/modules/consumers/components/poses/form-dialog.component.ts new file mode 100644 index 0000000..f3319a4 --- /dev/null +++ b/src/app/domains/partner/modules/consumers/components/poses/form-dialog.component.ts @@ -0,0 +1,30 @@ +import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Dialog } from 'primeng/dialog'; +import { IPosResponse } from '../../models'; +import { ConsumerPosFormContentComponent } from './form.component'; + +@Component({ + selector: 'partner-consumer-pos-form', + templateUrl: './form-dialog.component.html', + imports: [Dialog, ConsumerPosFormContentComponent], +}) +export class ConsumerPosFormDialogComponent extends AbstractDialog { + @Output() onSubmit = new EventEmitter(); + @Input() initialValues?: IPosResponse; + @Input() editMode?: boolean; + + @Input({ required: true }) consumerId!: string; + @Input({ required: true }) businessActivityId!: string; + @Input({ required: true }) complexId!: string; + @Input() posId!: string; + + get preparedTitle() { + return `${this.editMode ? 'ویرایش' : 'ایجاد'} پایانه فروش`; + } + + onFormSubmit(response: IPosResponse) { + this.onSubmit.emit(response); + this.close(); + } +} diff --git a/src/app/domains/partner/modules/consumers/components/poses/form.component.html b/src/app/domains/partner/modules/consumers/components/poses/form.component.html index fd2b010..d64b09d 100644 --- a/src/app/domains/partner/modules/consumers/components/poses/form.component.html +++ b/src/app/domains/partner/modules/consumers/components/poses/form.component.html @@ -1,51 +1,42 @@ - -
- - + + + - @if (form.controls.pos_type.value === "PSP") { - - - - } + @if (form.controls.pos_type.value === "PSP") { + + + + } - @if (!editMode) { - اطلاعات ورود - - - - + @if (!editMode) { + اطلاعات ورود + + + + - - - - } + + + + } - - -
+ + diff --git a/src/app/domains/partner/modules/consumers/components/poses/form.component.ts b/src/app/domains/partner/modules/consumers/components/poses/form.component.ts index 3fba465..507958b 100644 --- a/src/app/domains/partner/modules/consumers/components/poses/form.component.ts +++ b/src/app/domains/partner/modules/consumers/components/poses/form.component.ts @@ -1,6 +1,6 @@ // import { CatalogRolesComponent } from '@/shared/catalog/roles'; import { MustMatch } from '@/core/validators'; -import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { AbstractForm } from '@/shared/abstractClasses'; import { EnumSelectComponent } from '@/shared/apiEnum/select.component'; import { CatalogProviderSelectComponent } from '@/shared/catalog'; import { CatalogDeviceSelectComponent } from '@/shared/catalog/devices'; @@ -9,18 +9,16 @@ import { FormFooterActionsComponent } from '@/shared/components/formFooterAction import { UikitFieldComponent } from '@/uikit'; import { Component, inject, Input } from '@angular/core'; import { ReactiveFormsModule, Validators } from '@angular/forms'; -import { Dialog } from 'primeng/dialog'; import { Divider } from 'primeng/divider'; import { Password } from 'primeng/password'; import { IPosRequest, IPosResponse } from '../../models'; import { PartnerPosesService } from '../../services/poses.service'; @Component({ - selector: 'partner-consumer-pos-form', + selector: 'partner-consumer-pos-form-content', templateUrl: './form.component.html', imports: [ ReactiveFormsModule, - Dialog, InputComponent, FormFooterActionsComponent, CatalogDeviceSelectComponent, @@ -31,7 +29,7 @@ import { PartnerPosesService } from '../../services/poses.service'; Divider, ], }) -export class ConsumerPosFormComponent extends AbstractFormDialog { +export class ConsumerPosFormContentComponent extends AbstractForm { private readonly service = inject(PartnerPosesService); @Input({ required: true }) consumerId!: string; diff --git a/src/app/domains/partner/modules/consumers/components/poses/list.component.ts b/src/app/domains/partner/modules/consumers/components/poses/list.component.ts index 4add593..13d90de 100644 --- a/src/app/domains/partner/modules/consumers/components/poses/list.component.ts +++ b/src/app/domains/partner/modules/consumers/components/poses/list.component.ts @@ -9,12 +9,12 @@ import { Router } from '@angular/router'; import { partnerConsumerPosesNamedRoutes } from '../../constants/routes/poses'; import { IPosResponse } from '../../models'; import { PartnerPosesService } from '../../services/poses.service'; -import { ConsumerPosFormComponent } from './form.component'; +import { ConsumerPosFormDialogComponent } from './form-dialog.component'; @Component({ selector: 'partner-consumer-poses-list', templateUrl: './list.component.html', - imports: [PageDataListComponent, ConsumerPosFormComponent], + imports: [PageDataListComponent, ConsumerPosFormDialogComponent], }) export class ConsumerPosesComponent extends AbstractList { @Input({ required: true }) consumerId!: string; diff --git a/src/app/domains/partner/modules/consumers/views/businessActivities/single.component.ts b/src/app/domains/partner/modules/consumers/views/businessActivities/single.component.ts index 7bff5a7..db06546 100644 --- a/src/app/domains/partner/modules/consumers/views/businessActivities/single.component.ts +++ b/src/app/domains/partner/modules/consumers/views/businessActivities/single.component.ts @@ -5,7 +5,7 @@ import { Component, computed, effect, inject, signal } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { ButtonDirective } from 'primeng/button'; -import { ConsumerBusinessActivitiesFormComponent } from '../../components/businessActivities/form.component'; +import { ConsumerBusinessActivitiesFormDialogComponent } from '../../components/businessActivities/form-dialog.component'; import { PartnerChargeAccountFormDialogComponent } from '../../components/chargeAccount/charge-account-form-dialog.component'; import { ConsumerComplexesComponent } from '../../components/complexes/list.component'; import { BusinessActivityStore } from '../../store/businessActivity.store'; @@ -17,7 +17,7 @@ import { ConsumerStore } from '../../store/consumer.store'; imports: [ AppCardComponent, KeyValueComponent, - ConsumerBusinessActivitiesFormComponent, + ConsumerBusinessActivitiesFormDialogComponent, ConsumerComplexesComponent, ButtonDirective, PartnerChargeAccountFormDialogComponent, diff --git a/src/app/domains/partner/modules/consumers/views/complexes/single.component.ts b/src/app/domains/partner/modules/consumers/views/complexes/single.component.ts index 819ddcd..5394a36 100644 --- a/src/app/domains/partner/modules/consumers/views/complexes/single.component.ts +++ b/src/app/domains/partner/modules/consumers/views/complexes/single.component.ts @@ -3,7 +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 { ConsumerComplexFormComponent } from '../../components/complexes/form.component'; +import { ConsumerComplexFormDialogComponent } from '../../components/complexes/form-dialog.component'; import { ConsumerPosesComponent } from '../../components/poses/list.component'; import { BusinessActivityStore } from '../../store/businessActivity.store'; import { ComplexStore } from '../../store/complex.store'; @@ -15,7 +15,7 @@ import { ConsumerStore } from '../../store/consumer.store'; imports: [ AppCardComponent, KeyValueComponent, - ConsumerComplexFormComponent, + ConsumerComplexFormDialogComponent, ConsumerPosesComponent, ], }) diff --git a/src/app/domains/partner/modules/consumers/views/poses/single.component.ts b/src/app/domains/partner/modules/consumers/views/poses/single.component.ts index 2bbdc71..793cffe 100644 --- a/src/app/domains/partner/modules/consumers/views/poses/single.component.ts +++ b/src/app/domains/partner/modules/consumers/views/poses/single.component.ts @@ -3,7 +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 { ConsumerPosFormComponent } from '../../components/poses/form.component'; +import { ConsumerPosFormDialogComponent } from '../../components/poses/form-dialog.component'; import { BusinessActivityStore } from '../../store/businessActivity.store'; import { ComplexStore } from '../../store/complex.store'; import { ConsumerStore } from '../../store/consumer.store'; @@ -12,7 +12,7 @@ import { PosStore } from '../../store/pos.store'; @Component({ selector: 'partner-user-pos', templateUrl: './single.component.html', - imports: [AppCardComponent, KeyValueComponent, ConsumerPosFormComponent], + imports: [AppCardComponent, KeyValueComponent, ConsumerPosFormDialogComponent], }) export class PartnerUserPosComponent { private readonly consumerStore = inject(ConsumerStore); diff --git a/src/app/domains/partner/modules/licenses/components/filter-form.component.html b/src/app/domains/partner/modules/licenses/components/filter-form.component.html new file mode 100644 index 0000000..bfb813a --- /dev/null +++ b/src/app/domains/partner/modules/licenses/components/filter-form.component.html @@ -0,0 +1,10 @@ +
+ + + + + + + + +
diff --git a/src/app/domains/partner/modules/licenses/components/filter-form.component.ts b/src/app/domains/partner/modules/licenses/components/filter-form.component.ts new file mode 100644 index 0000000..a9a4be1 --- /dev/null +++ b/src/app/domains/partner/modules/licenses/components/filter-form.component.ts @@ -0,0 +1,49 @@ +import { UikitFieldComponent } from '@/uikit/uikit-field.component'; +import { Component, EventEmitter, Output, signal } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Button } from 'primeng/button'; +import { InputGroupModule } from 'primeng/inputgroup'; +import { InputGroupAddonModule } from 'primeng/inputgroupaddon'; +import { InputText, InputTextModule } from 'primeng/inputtext'; +import { MessageModule } from 'primeng/message'; + +@Component({ + selector: 'partner-licenses-filter', + templateUrl: './filter-form.component.html', + imports: [ + InputText, + FormsModule, + InputTextModule, + InputGroupModule, + InputGroupAddonModule, + Button, + UikitFieldComponent, + MessageModule, + ], +}) +export class AdminAgentsFilterComponent { + @Output() onSearch = new EventEmitter(); + + search = signal(''); + private debounceTimer: any; + + onFilterChange = (search: string) => { + if (this.debounceTimer) { + clearTimeout(this.debounceTimer); + } + + this.debounceTimer = setTimeout(() => { + this.onSearch.emit(search); + }, 300); + }; + + clearSearch = () => { + clearTimeout(this.debounceTimer); + this.search.update(() => ''); + this.onSearch.emit(''); + }; + + resetFilters = () => { + this.search.set(''); + }; +} diff --git a/src/app/domains/partner/modules/licenses/components/list.component.html b/src/app/domains/partner/modules/licenses/components/list.component.html new file mode 100644 index 0000000..9e8b390 --- /dev/null +++ b/src/app/domains/partner/modules/licenses/components/list.component.html @@ -0,0 +1,16 @@ + + + + + diff --git a/src/app/domains/partner/modules/licenses/components/list.component.ts b/src/app/domains/partner/modules/licenses/components/list.component.ts new file mode 100644 index 0000000..3bd0910 --- /dev/null +++ b/src/app/domains/partner/modules/licenses/components/list.component.ts @@ -0,0 +1,44 @@ +import { AbstractList } from '@/shared/abstractClasses/abstract-list'; +import { PageDataListComponent } from '@/shared/components/pageDataList/page-data-list.component'; +import { Component, inject } from '@angular/core'; +import { ILicenseRawResponse, ILicenseResponse } from '../models'; +import { PartnerLicensesService } from '../services/main.service'; +import { AdminAgentsFilterComponent } from './filter-form.component'; + +@Component({ + selector: 'partner-license-list', + templateUrl: './list.component.html', + imports: [PageDataListComponent, AdminAgentsFilterComponent], +}) +export class PartnerLicenseListComponent extends AbstractList { + private readonly service = inject(PartnerLicensesService); + + override setColumns(): void { + this.columns = [ + { field: 'id', header: 'شناسه', type: 'id' }, + { + field: 'consumer', + header: 'مشتری', + customDataModel(item: ILicenseRawResponse) { + return `${item.consumer.first_name} ${item.consumer.last_name}`; + }, + }, + { + field: 'accounts_limit', + header: 'تعداد کاربر قابل تعریف', + customDataModel(item: ILicenseRawResponse) { + return item.license.accounts_limit || '-'; + }, + }, + { field: 'expires_at', header: 'تاریخ انقضا', type: 'date' }, + { field: 'created_at', header: 'تاریخ ایجاد', type: 'date' }, + ]; + } + + override getDataRequest() { + return this.service.getAll({ + page: this.responseMetaData()?.page || 1, + pageSize: this.responseMetaData()?.perPage || 1, + }); + } +} diff --git a/src/app/domains/partner/modules/licenses/constants/apiRoutes/index.ts b/src/app/domains/partner/modules/licenses/constants/apiRoutes/index.ts new file mode 100644 index 0000000..1bfb652 --- /dev/null +++ b/src/app/domains/partner/modules/licenses/constants/apiRoutes/index.ts @@ -0,0 +1,6 @@ +const baseUrl = '/api/v1/partner/licenses'; + +export const PARTNER_LICENSES_API_ROUTES = { + list: () => `${baseUrl}`, + single: (id: string) => `${baseUrl}/${id}`, +}; diff --git a/src/app/domains/partner/modules/licenses/constants/index.ts b/src/app/domains/partner/modules/licenses/constants/index.ts new file mode 100644 index 0000000..ee61bd7 --- /dev/null +++ b/src/app/domains/partner/modules/licenses/constants/index.ts @@ -0,0 +1,2 @@ +export * from './apiRoutes'; +export * from './routes'; diff --git a/src/app/domains/partner/modules/licenses/constants/routes/index.ts b/src/app/domains/partner/modules/licenses/constants/routes/index.ts new file mode 100644 index 0000000..0c0059a --- /dev/null +++ b/src/app/domains/partner/modules/licenses/constants/routes/index.ts @@ -0,0 +1,18 @@ +import { NamedRoutes } from '@/core'; +import { Routes } from '@angular/router'; + +export type TPartnerLicensesRouteNames = 'licenses'; + +export const partnerLicensesNamedRoutes: NamedRoutes = { + licenses: { + path: 'licenses', + loadComponent: () => + import('../../views/list.component').then((m) => m.PartnerLicensesComponent), + meta: { + title: 'لایسنس‌ها', + pagePath: () => '/partner/licenses', + }, + }, +}; + +export const PARTNER_LICENSES_ROUTES: Routes = Object.values(partnerLicensesNamedRoutes); diff --git a/src/app/domains/partner/modules/licenses/models/index.ts b/src/app/domains/partner/modules/licenses/models/index.ts new file mode 100644 index 0000000..61a518a --- /dev/null +++ b/src/app/domains/partner/modules/licenses/models/index.ts @@ -0,0 +1 @@ +export * from './io'; diff --git a/src/app/domains/partner/modules/licenses/models/io.d.ts b/src/app/domains/partner/modules/licenses/models/io.d.ts new file mode 100644 index 0000000..2b9af00 --- /dev/null +++ b/src/app/domains/partner/modules/licenses/models/io.d.ts @@ -0,0 +1,21 @@ +export interface ILicenseRawResponse { + id: string; + starts_at: string; + expires_at: string; + created_at: string; + consumer: Consumer; + license: License; +} +export interface ILicenseResponse extends ILicenseRawResponse {} + +interface License { + id: string; + accounts_limit?: number; +} + +interface Consumer { + first_name: string; + last_name: string; + mobile_number: string; + status: string; +} diff --git a/src/app/domains/partner/modules/licenses/services/main.service.ts b/src/app/domains/partner/modules/licenses/services/main.service.ts new file mode 100644 index 0000000..7f32b99 --- /dev/null +++ b/src/app/domains/partner/modules/licenses/services/main.service.ts @@ -0,0 +1,26 @@ +import { IPaginatedQuery, IPaginatedResponse } from '@/core/models/service.model'; +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { PARTNER_LICENSES_API_ROUTES } from '../constants'; +import { ILicenseRawResponse, ILicenseResponse } from '../models'; + +@Injectable({ providedIn: 'root' }) +export class PartnerLicensesService { + constructor(private http: HttpClient) {} + + private apiRoutes = PARTNER_LICENSES_API_ROUTES; + + getAll(paginationQuery?: IPaginatedQuery): Observable> { + return this.http.get>(this.apiRoutes.list(), { + params: { + page: paginationQuery?.page || '1', + pageSize: paginationQuery?.pageSize || '50', + }, + }); + } + + getSingle(licenseId: string): Observable { + return this.http.get(this.apiRoutes.single(licenseId)); + } +} diff --git a/src/app/domains/partner/modules/licenses/views/index.ts b/src/app/domains/partner/modules/licenses/views/index.ts new file mode 100644 index 0000000..576a89e --- /dev/null +++ b/src/app/domains/partner/modules/licenses/views/index.ts @@ -0,0 +1 @@ +export * from './list.component'; diff --git a/src/app/domains/partner/modules/licenses/views/list.component.html b/src/app/domains/partner/modules/licenses/views/list.component.html new file mode 100644 index 0000000..759d36a --- /dev/null +++ b/src/app/domains/partner/modules/licenses/views/list.component.html @@ -0,0 +1 @@ + diff --git a/src/app/domains/partner/modules/licenses/views/list.component.ts b/src/app/domains/partner/modules/licenses/views/list.component.ts new file mode 100644 index 0000000..a70076d --- /dev/null +++ b/src/app/domains/partner/modules/licenses/views/list.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; +import { PartnerLicenseListComponent } from '../components/list.component'; + +@Component({ + selector: 'partner-licenses', + templateUrl: './list.component.html', + imports: [PartnerLicenseListComponent], +}) +export class PartnerLicensesComponent {} diff --git a/src/app/domains/partner/routes.ts b/src/app/domains/partner/routes.ts index 0da7cf7..ac46eb7 100644 --- a/src/app/domains/partner/routes.ts +++ b/src/app/domains/partner/routes.ts @@ -1,6 +1,7 @@ import { Route } from '@angular/router'; import { PARTNER_ACCOUNTS_ROUTES } from './modules/accounts/constants'; import { PARTNER_CONSUMERS_ROUTES } from './modules/consumers/constants'; +import { PARTNER_LICENSES_ROUTES } from './modules/licenses/constants'; export const PARTNER_ROUTES = { path: 'partner', @@ -13,5 +14,6 @@ export const PARTNER_ROUTES = { }, ...PARTNER_ACCOUNTS_ROUTES, ...PARTNER_CONSUMERS_ROUTES, + ...PARTNER_LICENSES_ROUTES, ], } as Route; diff --git a/src/app/shared/abstractClasses/abstract-list.ts b/src/app/shared/abstractClasses/abstract-list.ts index 5abd1d7..ed067f7 100644 --- a/src/app/shared/abstractClasses/abstract-list.ts +++ b/src/app/shared/abstractClasses/abstract-list.ts @@ -1,5 +1,9 @@ import { Maybe } from '@/core'; -import { IListingResponse, IPaginatedResponse } from '@/core/models/service.model'; +import { + IListingResponse, + IPaginatedResponse, + IResponseMetadata, +} from '@/core/models/service.model'; import { Component, signal } from '@angular/core'; import { catchError, finalize, Observable } from 'rxjs'; import { IColumn } from '../components/pageDataList/page-data-list.component'; @@ -16,6 +20,8 @@ export abstract class AbstractList { requestPayload = signal>(null); selectedItemForEdit = signal>(null); editMode = signal(false); + withPagination = signal(false); + responseMetaData = signal>(null); ngOnInit() { this.setColumns(); @@ -39,6 +45,9 @@ export abstract class AbstractList { }), ) .subscribe((res) => { + if ('meta' in res) { + this.responseMetaData.set(res.meta); + } this.items.set(res.data ?? []); }); } @@ -71,4 +80,8 @@ export abstract class AbstractList { onCloseEdit() { this.visibleForm.set(false); } + + changePage(page: number) { + // this. + } } diff --git a/src/app/shared/components/pageDataList/page-data-list.component.html b/src/app/shared/components/pageDataList/page-data-list.component.html index 7065ad1..0772f11 100644 --- a/src/app/shared/components/pageDataList/page-data-list.component.html +++ b/src/app/shared/components/pageDataList/page-data-list.component.html @@ -271,6 +271,7 @@ class="contnet" styleClass="!w-[80vw] md:!w-96 md:!max-w-96 !max-w-sm" > +
diff --git a/src/app/shared/components/pageDataList/page-data-list.component.ts b/src/app/shared/components/pageDataList/page-data-list.component.ts index bc9d799..f9b1424 100644 --- a/src/app/shared/components/pageDataList/page-data-list.component.ts +++ b/src/app/shared/components/pageDataList/page-data-list.component.ts @@ -107,7 +107,7 @@ export class PageDataListComponent { @Output() onDelete = new EventEmitter(); @Output() onDetails = new EventEmitter(); @Output() onAdd = new EventEmitter(); - @Output() pageChange = new EventEmitter(); + @Output() onChangePage = new EventEmitter(); @Output() onThumbnailClick = new EventEmitter(); @Output() onRefresh = new EventEmitter(); @@ -150,7 +150,7 @@ export class PageDataListComponent { }; onPage = ($event: any) => { - this.pageChange.emit($event); + this.onChangePage.emit($event); }; openThumbnailModal = (item: I) => {