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 @@
-
-
-
+
+
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 @@
-
-
-
+
+
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) => {