Browse Source

Add getItemsByCategory

pull/5642/head
Artur Arseniev 3 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[]; items: T[];
} }
export interface ModelWithCategory {
category?: Category;
}
export default class Category extends Model<CategoryProperties> { export default class Category extends Model<CategoryProperties> {
view?: CategoryView; view?: CategoryView;
@ -51,3 +55,33 @@ export default class Category extends Model<CategoryProperties> {
return this.get('label')!; 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 TraitSelectView from './view/TraitSelectView';
import TraitView from './view/TraitView'; import TraitView from './view/TraitView';
import TraitsView from './view/TraitsView'; import TraitsView from './view/TraitsView';
import Category from '../abstract/ModuleCategory'; import { getItemsByCategory } from '../abstract/ModuleCategory';
import Trait from './model/Trait'; import Trait from './model/Trait';
export default class TraitManager extends Module<TraitManagerConfigModule> { 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. * 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[] { getTraitsByCategory(): TraitsByCategory[] {
const traits = this.getTraits(); return getItemsByCategory<Trait>(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];
} }
/** /**

Loading…
Cancel
Save