diff --git a/npm/ng-packs/packages/core/src/lib/models/index.ts b/npm/ng-packs/packages/core/src/lib/models/index.ts index c343ee2440..0156b77bda 100644 --- a/npm/ng-packs/packages/core/src/lib/models/index.ts +++ b/npm/ng-packs/packages/core/src/lib/models/index.ts @@ -8,3 +8,4 @@ export * from './session'; export * from './utility'; export * from './auth'; export * from './auth-events'; +export * from './sort'; diff --git a/npm/ng-packs/packages/core/src/lib/models/sort.ts b/npm/ng-packs/packages/core/src/lib/models/sort.ts new file mode 100644 index 0000000000..eb51d18d22 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/models/sort.ts @@ -0,0 +1,5 @@ +export interface SortableItem { + id?: string | number; + name?: string; + order?: number; +} diff --git a/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts index bf66ec2b54..2c5185ce23 100644 --- a/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts +++ b/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts @@ -1,27 +1,33 @@ import { InjectionToken, inject } from '@angular/core'; +import { SortableItem } from '../models'; import { LocalizationService } from '../services'; -export const SORT_COMPARE_FUNC = new InjectionToken< 0 | 1 | -1 >('SORT_COMPARE_FUNC'); +export const SORT_COMPARE_FUNC = new InjectionToken<(a: SortableItem, b: SortableItem) => number>( + 'SORT_COMPARE_FUNC', +); export function compareFuncFactory() { - const localizationService = inject(LocalizationService) - const fn = (a,b) => { + const localizationService = inject(LocalizationService); + const fn = (a: SortableItem, b: SortableItem) => { const aName = localizationService.instant(a.name); const bName = localizationService.instant(b.name); const aNumber = a.order; const bNumber = b.order; - + if (!Number.isInteger(aNumber)) return 1; if (!Number.isInteger(bNumber)) return -1; - - if (aNumber > bNumber) return 1 - if (aNumber < bNumber) return -1 - - if ( aName > bName ) return 1; - if ( aName < bName ) return -1; - - return 0 - } - - return fn -} \ No newline at end of file + + if (aNumber > bNumber) return 1; + if (aNumber < bNumber) return -1; + + if (aName > bName) return 1; + if (aName < bName) return -1; + + if (a.id > b.id) return 1; + if (a.id < b.id) return -1; + + return 0; + }; + + return fn; +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts index e1048f907e..4c3137b332 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts @@ -1,10 +1,13 @@ import { BehaviorSubject, Observable } from 'rxjs'; import { NavItem } from '../models/nav-item'; -import { Type } from '@angular/core'; +import { inject, Type } from '@angular/core'; +import { SORT_COMPARE_FUNC } from '@abp/ng.core'; export abstract class AbstractMenuService { protected abstract baseClass: Type; + protected readonly sortFn = inject(SORT_COMPARE_FUNC); + protected _items$ = new BehaviorSubject([]); get items(): T[] { @@ -52,10 +55,7 @@ export abstract class AbstractMenuService { this._items$.next(items); } - private sortItems(a: T, b: T) { - if (!a.order) return 1; - if (!b.order) return -1; - - return a.order - b.order; - } + sortItems = (a: T, b: T) => { + return this.sortFn(a, b); + }; }