From a1555074a7f2712a4aeaa22d5c163a3957212190 Mon Sep 17 00:00:00 2001 From: MichalKinas <113341662+MichalKinas@users.noreply.github.com> Date: Mon, 27 May 2024 12:45:27 +0200 Subject: [PATCH] [ACS-7430] Make name optional in SortableByCategoryItem interface (#9735) --- .../services/sort-by-category.service.ts | 134 +++++++++--------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/lib/core/src/lib/common/services/sort-by-category.service.ts b/lib/core/src/lib/common/services/sort-by-category.service.ts index db4d3c0323..7009166ea8 100644 --- a/lib/core/src/lib/common/services/sort-by-category.service.ts +++ b/lib/core/src/lib/common/services/sort-by-category.service.ts @@ -18,86 +18,84 @@ import { Injectable } from '@angular/core'; export interface SortableByCategoryItem { - name: string; - category?: string; + name?: string; + category?: string; } export interface ItemsByCategory { - category: string; - items: T[]; + category: string; + items: T[]; } @Injectable({ - providedIn: 'root' + providedIn: 'root' }) export class SortByCategoryMapperService { + private defaultCategories: string[] = []; - private defaultCategories: string[] = []; + mapItems(items: T[], defaultCategories: string[]): ItemsByCategory[] { + this.defaultCategories = defaultCategories; - mapItems(items: T[], defaultCategories: string[]): ItemsByCategory[] { - this.defaultCategories = defaultCategories; + const sortedItems = this.sortItems(items); + const itemsByCategory = this.mapItemsByCategory(sortedItems); + const itemsSortedByCategory = this.sortCategories(itemsByCategory); - const sortedItems = this.sortItems(items); - const itemsByCategory = this.mapItemsByCategory(sortedItems); - const itemsSortedByCategory = this.sortCategories(itemsByCategory); - - return itemsSortedByCategory; - } - - private mapItemsByCategory(items: T[]): ItemsByCategory[] { - const itemsByCategoryObject: { [category: string]: T[] } = {}; - - items.forEach((item) => { - const category = this.mapItemDefaultCategory(item); - if (!itemsByCategoryObject[category]) { - itemsByCategoryObject[category] = []; - } - - itemsByCategoryObject[category].push(item); - }); - - const itemsByCategory: ItemsByCategory[] = Object.keys(itemsByCategoryObject).map((key) => { - const category = key; - return { category, items: itemsByCategoryObject[category] }; - }); - - return itemsByCategory; - } - - private sortItems(items: T[]): T[] { - return items.sort((itemA, itemB) => itemA.name.localeCompare(itemB.name)); - } - - private sortCategories(itemsByCategory: ItemsByCategory[]): ItemsByCategory[] { - return itemsByCategory.sort((itemA, itemB) => { - if (itemB.category === '' && itemA.category === '') { - return 0; - } - - if (itemA.category === '') { - return 1; - } - - if (itemB.category === '') { - return -1; - } - - return itemA.category.localeCompare(itemB.category); - } - ); - } - - private mapItemDefaultCategory(listItem: SortableByCategoryItem): string { - const itemCategory = listItem.category; - - if (!this.isDefaultCategory(itemCategory)) { - return (itemCategory ?? ''); + return itemsSortedByCategory; } - return ''; - } + private mapItemsByCategory(items: T[]): ItemsByCategory[] { + const itemsByCategoryObject: { [category: string]: T[] } = {}; - private isDefaultCategory(category?: string): boolean { - return category ? this.defaultCategories.includes(category) : false; - } + items.forEach((item) => { + const category = this.mapItemDefaultCategory(item); + if (!itemsByCategoryObject[category]) { + itemsByCategoryObject[category] = []; + } + + itemsByCategoryObject[category].push(item); + }); + + const itemsByCategory: ItemsByCategory[] = Object.keys(itemsByCategoryObject).map((key) => { + const category = key; + return { category, items: itemsByCategoryObject[category] }; + }); + + return itemsByCategory; + } + + private sortItems(items: T[]): T[] { + return items.sort((itemA, itemB) => itemA.name.localeCompare(itemB.name)); + } + + private sortCategories(itemsByCategory: ItemsByCategory[]): ItemsByCategory[] { + return itemsByCategory.sort((itemA, itemB) => { + if (itemB.category === '' && itemA.category === '') { + return 0; + } + + if (itemA.category === '') { + return 1; + } + + if (itemB.category === '') { + return -1; + } + + return itemA.category.localeCompare(itemB.category); + }); + } + + private mapItemDefaultCategory(listItem: SortableByCategoryItem): string { + const itemCategory = listItem.category; + + if (!this.isDefaultCategory(itemCategory)) { + return itemCategory ?? ''; + } + + return ''; + } + + private isDefaultCategory(category?: string): boolean { + return category ? this.defaultCategories.includes(category) : false; + } }