diff --git a/src/abstract/ModuleCategory.ts b/src/abstract/ModuleCategory.ts index f6ed9ccd6..509a868c5 100644 --- a/src/abstract/ModuleCategory.ts +++ b/src/abstract/ModuleCategory.ts @@ -31,6 +31,10 @@ export interface ItemsByCategory { items: T[]; } +export interface ModelWithCategory { + category?: Category; +} + export default class Category extends Model { view?: CategoryView; @@ -51,3 +55,33 @@ export default class Category extends Model { return this.get('label')!; } } + +export function getItemsByCategory(allItems: T[]) { + const categorySet = new Set(); + const categoryMap = new Map(); + const emptyItem: ItemsByCategory = { items: [] }; + + allItems.forEach(item => { + const { category } = item; + + if (category) { + categorySet.add(category); + const categoryItems = categoryMap.get(category); + + if (categoryItems) { + categoryItems.push(item); + } else { + categoryMap.set(category, [item]); + } + } else { + emptyItem.items.push(item); + } + }); + + const categoryWithItems = Array.from(categorySet).map(category => ({ + category, + items: categoryMap.get(category) || [], + })); + + return [...categoryWithItems, emptyItem]; +} diff --git a/src/trait_manager/index.ts b/src/trait_manager/index.ts index d2caf4060..f6c2d8fe2 100644 --- a/src/trait_manager/index.ts +++ b/src/trait_manager/index.ts @@ -20,7 +20,7 @@ import TraitNumberView from './view/TraitNumberView'; import TraitSelectView from './view/TraitSelectView'; import TraitView from './view/TraitView'; import TraitsView from './view/TraitsView'; -import Category from '../abstract/ModuleCategory'; +import { getItemsByCategory } from '../abstract/ModuleCategory'; import Trait from './model/Trait'; export default class TraitManager extends Module { @@ -86,35 +86,15 @@ export default class TraitManager extends Module { /** * Get traits by category from the currently selected component. + * @example + * traitManager.getTraitsByCategory(); + * // Returns an array of items of this type + * // > { category?: Category; items: Trait[] } + * + * // NOTE: The item without category is the one containing traits without category. */ getTraitsByCategory(): TraitsByCategory[] { - const traits = this.getTraits(); - const categorySet = new Set(); - const categoryMap = new Map(); - const emptyItem: TraitsByCategory = { items: [] }; - - traits.forEach(trait => { - const { category } = trait; - if (category) { - categorySet.add(category); - let categoryItems = categoryMap.get(category); - - if (categoryItems) { - categoryItems.push(trait); - } else { - categoryMap.set(category, [trait]); - } - } else { - emptyItem.items.push(trait); - } - }); - - const categoryWithItems = Array.from(categorySet).map(category => ({ - category, - items: categoryMap.get(category) || [], - })); - - return [...categoryWithItems, emptyItem]; + return getItemsByCategory(this.getTraits()); } /**