Browse Source

Add getItemsByCategory

pull/5642/head
Artur Arseniev 2 years ago
parent
commit
c492a1a875
  1. 34
      src/abstract/ModuleCategory.ts
  2. 36
      src/trait_manager/index.ts

34
src/abstract/ModuleCategory.ts

@ -31,6 +31,10 @@ export interface ItemsByCategory<T> {
items: T[];
}
export interface ModelWithCategory {
category?: Category;
}
export default class Category extends Model<CategoryProperties> {
view?: CategoryView;
@ -51,3 +55,33 @@ export default class Category extends Model<CategoryProperties> {
return this.get('label')!;
}
}
export function getItemsByCategory<T extends ModelWithCategory>(allItems: T[]) {
const categorySet = new Set<Category>();
const categoryMap = new Map<Category, T[]>();
const emptyItem: ItemsByCategory<T> = { 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];
}

36
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<TraitManagerConfigModule> {
@ -86,35 +86,15 @@ export default class TraitManager extends Module<TraitManagerConfigModule> {
/**
* 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<Category>();
const categoryMap = new Map<Category, Trait[]>();
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<Trait>(this.getTraits());
}
/**

Loading…
Cancel
Save