Browse Source

Refactor view modes to use enum in permission management

Replaced string literals for view modes with the new eResourcePermissionViewModes enum across components and services. This improves type safety and maintainability. Added the enum definition in a new file.
pull/24459/head
Fahri Gedik 9 months ago
parent
commit
ae6ca7a38e
  1. 7
      npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.ts
  2. 5
      npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.ts
  3. 2
      npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.html
  4. 6
      npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.ts
  5. 10
      npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.html
  6. 6
      npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.ts
  7. 5
      npm/ng-packs/packages/permission-management/src/lib/enums/view-modes.ts
  8. 19
      npm/ng-packs/packages/permission-management/src/lib/services/resource-permission-state.service.ts

7
npm/ng-packs/packages/components/lookup/src/lib/lookup-search.component.ts

@ -30,7 +30,7 @@ export type LookupSearchFn<T = LookupItem> = (filter: string) => Observable<T[]>
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class LookupSearchComponent<T extends LookupItem = LookupItem> implements OnInit, OnDestroy { export class LookupSearchComponent<T extends LookupItem = LookupItem> implements OnInit, OnDestroy {
// Inputs
readonly label = input<string>(); readonly label = input<string>();
readonly placeholder = input<string>(''); readonly placeholder = input<string>('');
readonly debounceTime = input<number>(300); readonly debounceTime = input<number>(300);
@ -39,22 +39,17 @@ export class LookupSearchComponent<T extends LookupItem = LookupItem> implements
readonly valueKey = input<keyof T>('key' as keyof T); readonly valueKey = input<keyof T>('key' as keyof T);
readonly disabled = input<boolean>(false); readonly disabled = input<boolean>(false);
// Search function - should be provided by parent
readonly searchFn = input<LookupSearchFn<T>>(() => of([])); readonly searchFn = input<LookupSearchFn<T>>(() => of([]));
// Two-way binding for selected value
readonly selectedValue = model<string>(''); readonly selectedValue = model<string>('');
readonly displayValue = model<string>(''); readonly displayValue = model<string>('');
// Outputs
readonly itemSelected = output<T>(); readonly itemSelected = output<T>();
readonly searchChanged = output<string>(); readonly searchChanged = output<string>();
// Custom templates
readonly itemTemplate = contentChild<TemplateRef<{ $implicit: T }>>('itemTemplate'); readonly itemTemplate = contentChild<TemplateRef<{ $implicit: T }>>('itemTemplate');
readonly noResultsTemplate = contentChild<TemplateRef<void>>('noResultsTemplate'); readonly noResultsTemplate = contentChild<TemplateRef<void>>('noResultsTemplate');
// Internal state
readonly searchResults = signal<T[]>([]); readonly searchResults = signal<T[]>([]);
readonly showDropdown = signal(false); readonly showDropdown = signal(false);
readonly isLoading = signal(false); readonly isLoading = signal(false);

5
npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/provider-key-search/provider-key-search.component.ts

@ -1,6 +1,5 @@
import { Component, input, inject, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; import { Component, input, inject, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';
import { LocalizationPipe } from '@abp/ng.core'; import { PermissionsService } from '@abp/ng.permission-management/proxy';
import { PermissionsService, SearchProviderKeyInfo } from '@abp/ng.permission-management/proxy';
import { LookupSearchComponent, LookupItem } from '@abp/ng.components/lookup'; import { LookupSearchComponent, LookupItem } from '@abp/ng.components/lookup';
import { Observable, map, Subject, takeUntil } from 'rxjs'; import { Observable, map, Subject, takeUntil } from 'rxjs';
import { ResourcePermissionStateService } from '../../../services/resource-permission-state.service'; import { ResourcePermissionStateService } from '../../../services/resource-permission-state.service';
@ -13,7 +12,7 @@ interface ProviderKeyLookupItem extends LookupItem {
@Component({ @Component({
selector: 'abp-provider-key-search', selector: 'abp-provider-key-search',
templateUrl: './provider-key-search.component.html', templateUrl: './provider-key-search.component.html',
imports: [LocalizationPipe, LookupSearchComponent], imports: [LookupSearchComponent],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class ProviderKeySearchComponent implements OnInit, OnDestroy { export class ProviderKeySearchComponent implements OnInit, OnDestroy {

2
npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.html

@ -1,4 +1,4 @@
@if (mode() === 'add') { @if (mode() === eResourcePermissionViewModes.Add) {
<div class="mb-3"> <div class="mb-3">
<label class="form-label fw-bold"> <label class="form-label fw-bold">
{{ 'AbpPermissionManagement::SelectProvider' | abpLocalization }} {{ 'AbpPermissionManagement::SelectProvider' | abpLocalization }}

6
npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-form/resource-permission-form.component.ts

@ -5,7 +5,7 @@ import { ResourcePermissionStateService } from '../../../services/resource-permi
import { ProviderKeySearchComponent } from '../provider-key-search/provider-key-search.component'; import { ProviderKeySearchComponent } from '../provider-key-search/provider-key-search.component';
import { PermissionCheckboxListComponent } from '../permission-checkbox-list/permission-checkbox-list.component'; import { PermissionCheckboxListComponent } from '../permission-checkbox-list/permission-checkbox-list.component';
export type FormMode = 'add' | 'edit'; import { eResourcePermissionViewModes } from '../../../enums/view-modes';
@Component({ @Component({
selector: 'abp-resource-permission-form', selector: 'abp-resource-permission-form',
@ -20,10 +20,12 @@ export type FormMode = 'add' | 'edit';
}) })
export class ResourcePermissionFormComponent { export class ResourcePermissionFormComponent {
readonly state = inject(ResourcePermissionStateService); readonly state = inject(ResourcePermissionStateService);
readonly eResourcePermissionViewModes = eResourcePermissionViewModes;
readonly mode = input.required<FormMode>(); readonly mode = input.required<eResourcePermissionViewModes>();
readonly resourceName = input.required<string>(); readonly resourceName = input.required<string>();
readonly save = output<void>(); readonly save = output<void>();
readonly cancel = output<void>(); readonly cancel = output<void>();
} }

10
npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.html

@ -2,10 +2,10 @@
<ng-template #abpHeader> <ng-template #abpHeader>
<h5 class="modal-title"> <h5 class="modal-title">
@switch (state.viewMode()) { @switch (state.viewMode()) {
@case ('edit') { @case (eResourcePermissionViewModes.Edit) {
{{ 'AbpPermissionManagement::UpdatePermission' | abpLocalization }} {{ 'AbpPermissionManagement::UpdatePermission' | abpLocalization }}
} }
@case ('add') { @case (eResourcePermissionViewModes.Add) {
{{ 'AbpPermissionManagement::AddResourcePermission' | abpLocalization }} {{ 'AbpPermissionManagement::AddResourcePermission' | abpLocalization }}
} }
@default { @default {
@ -29,14 +29,14 @@
</div> </div>
} @else { } @else {
@switch (state.viewMode()) { @switch (state.viewMode()) {
@case ('list') { @case (eResourcePermissionViewModes.List) {
<abp-resource-permission-list (addClicked)="onAddClicked()" (editClicked)="onEditClicked($event)" <abp-resource-permission-list (addClicked)="onAddClicked()" (editClicked)="onEditClicked($event)"
(deleteClicked)="onDeleteClicked($event)" /> (deleteClicked)="onDeleteClicked($event)" />
} }
@case ('add') { @case (eResourcePermissionViewModes.Add) {
<abp-resource-permission-form mode="add" [resourceName]="resourceName()" /> <abp-resource-permission-form mode="add" [resourceName]="resourceName()" />
} }
@case ('edit') { @case (eResourcePermissionViewModes.Edit) {
<abp-resource-permission-form mode="edit" [resourceName]="resourceName()" /> <abp-resource-permission-form mode="edit" [resourceName]="resourceName()" />
} }
} }

6
npm/ng-packs/packages/permission-management/src/lib/components/resource-permission-management/resource-permission-management.component.ts

@ -24,6 +24,8 @@ import { ResourcePermissionStateService } from '../../services/resource-permissi
import { ResourcePermissionListComponent } from './resource-permission-list/resource-permission-list.component'; import { ResourcePermissionListComponent } from './resource-permission-list/resource-permission-list.component';
import { ResourcePermissionFormComponent } from './resource-permission-form/resource-permission-form.component'; import { ResourcePermissionFormComponent } from './resource-permission-form/resource-permission-form.component';
import { eResourcePermissionViewModes } from '../../enums/view-modes';
@Component({ @Component({
selector: 'abp-resource-permission-management', selector: 'abp-resource-permission-management',
templateUrl: './resource-permission-management.component.html', templateUrl: './resource-permission-management.component.html',
@ -39,6 +41,8 @@ import { ResourcePermissionFormComponent } from './resource-permission-form/reso
], ],
}) })
export class ResourcePermissionManagementComponent implements OnInit { export class ResourcePermissionManagementComponent implements OnInit {
readonly eResourcePermissionViewModes = eResourcePermissionViewModes;
protected readonly service = inject(PermissionsService); protected readonly service = inject(PermissionsService);
protected readonly toasterService = inject(ToasterService); protected readonly toasterService = inject(ToasterService);
protected readonly confirmationService = inject(ConfirmationService); protected readonly confirmationService = inject(ConfirmationService);
@ -54,14 +58,12 @@ export class ResourcePermissionManagementComponent implements OnInit {
private previousVisible = false; private previousVisible = false;
constructor() { constructor() {
// Sync input values to state
effect(() => { effect(() => {
this.state.resourceName.set(this.resourceName()); this.state.resourceName.set(this.resourceName());
this.state.resourceKey.set(this.resourceKey()); this.state.resourceKey.set(this.resourceKey());
this.state.resourceDisplayName.set(this.resourceDisplayName()); this.state.resourceDisplayName.set(this.resourceDisplayName());
}); });
// Handle visibility changes
effect(() => { effect(() => {
const isVisible = this.visible(); const isVisible = this.visible();
if (isVisible && !this.previousVisible) { if (isVisible && !this.previousVisible) {

5
npm/ng-packs/packages/permission-management/src/lib/enums/view-modes.ts

@ -0,0 +1,5 @@
export enum eResourcePermissionViewModes {
List = 'list',
Add = 'add',
Edit = 'edit',
}

19
npm/ng-packs/packages/permission-management/src/lib/services/resource-permission-state.service.ts

@ -6,13 +6,12 @@ import {
SearchProviderKeyInfo, SearchProviderKeyInfo,
ResourcePermissionWithProdiverGrantInfoDto, ResourcePermissionWithProdiverGrantInfoDto,
} from '@abp/ng.permission-management/proxy'; } from '@abp/ng.permission-management/proxy';
import { eResourcePermissionViewModes } from '../enums/view-modes';
export type ViewMode = 'list' | 'add' | 'edit';
@Injectable() @Injectable()
export class ResourcePermissionStateService { export class ResourcePermissionStateService {
// View state // View state
readonly viewMode = signal<ViewMode>('list'); readonly viewMode = signal<eResourcePermissionViewModes>(eResourcePermissionViewModes.List);
readonly modalBusy = signal(false); readonly modalBusy = signal(false);
readonly hasResourcePermission = signal(false); readonly hasResourcePermission = signal(false);
readonly hasProviderKeyLookupService = signal(false); readonly hasProviderKeyLookupService = signal(false);
@ -45,9 +44,9 @@ export class ResourcePermissionStateService {
readonly showDropdown = signal(false); readonly showDropdown = signal(false);
// Computed properties // Computed properties
readonly isAddMode = computed(() => this.viewMode() === 'add'); readonly isAddMode = computed(() => this.viewMode() === eResourcePermissionViewModes.Add);
readonly isEditMode = computed(() => this.viewMode() === 'edit'); readonly isEditMode = computed(() => this.viewMode() === eResourcePermissionViewModes.Edit);
readonly isListMode = computed(() => this.viewMode() === 'list'); readonly isListMode = computed(() => this.viewMode() === eResourcePermissionViewModes.List);
readonly currentPermissionsList = computed(() => readonly currentPermissionsList = computed(() =>
this.isAddMode() ? this.permissionDefinitions() : this.permissionsWithProvider() this.isAddMode() ? this.permissionDefinitions() : this.permissionsWithProvider()
@ -68,12 +67,12 @@ export class ResourcePermissionStateService {
// State transition methods // State transition methods
goToListMode() { goToListMode() {
this.viewMode.set('list'); this.viewMode.set(eResourcePermissionViewModes.List);
this.selectedPermissions.set([]); this.selectedPermissions.set([]);
} }
goToAddMode() { goToAddMode() {
this.viewMode.set('add'); this.viewMode.set(eResourcePermissionViewModes.Add);
this.selectedPermissions.set([]); this.selectedPermissions.set([]);
this.selectedProviderKey.set(''); this.selectedProviderKey.set('');
this.searchResults.set([]); this.searchResults.set([]);
@ -90,7 +89,7 @@ export class ResourcePermissionStateService {
this.selectedPermissions.set( this.selectedPermissions.set(
permissions.filter(p => p.isGranted).map(p => p.name || '') permissions.filter(p => p.isGranted).map(p => p.name || '')
); );
this.viewMode.set('edit'); this.viewMode.set(eResourcePermissionViewModes.Edit);
} }
// Permission selection methods // Permission selection methods
@ -131,7 +130,7 @@ export class ResourcePermissionStateService {
// Reset all state // Reset all state
reset() { reset() {
this.viewMode.set('list'); this.viewMode.set(eResourcePermissionViewModes.List);
this.allResourcePermissions.set([]); this.allResourcePermissions.set([]);
this.resourcePermissions.set([]); this.resourcePermissions.set([]);
this.totalCount.set(0); this.totalCount.set(0);

Loading…
Cancel
Save