You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

220 lines
5.1 KiB

5 years ago
import flatten from 'lodash/flatten';
import flattenDeep from 'lodash/flattenDeep';
import themeConfig from '../../themeConfig';
5 years ago
interface Meta {
skip?: boolean;
category?: any;
type?: any;
title?: any;
order?: number;
children?: Meta[];
}
interface ModuleDataItem {
meta: Meta;
}
interface Orders {
[key: string]: number;
}
export function getMenuItems(
moduleData: ModuleDataItem[],
locale: string,
categoryOrder: Orders,
typeOrder: Orders,
) {
const menuMeta = moduleData.map(item => item.meta).filter(meta => !meta.skip);
const menuItems: Meta[] = [];
const sortFn = (a: Meta, b: Meta) => (a.order || 0) - (b.order || 0);
6 years ago
menuMeta.sort(sortFn).forEach(meta => {
5 years ago
// Format
if (meta.category) {
meta.category = meta.category[locale] || meta.category;
}
if (meta.type) {
meta.type = meta.type[locale] || meta.type;
}
if (meta.title) {
meta.title = meta.title[locale] || meta.title;
}
7 years ago
if (!meta.category) {
menuItems.push(meta);
return;
}
5 years ago
// Component
if (meta.category === 'Components' && meta.type) {
let type = menuItems.find(i => i.title === meta.type);
if (!type) {
type = {
type: 'type',
title: meta.type,
7 years ago
children: [],
order: typeOrder[meta.type],
7 years ago
};
menuItems.push(type);
7 years ago
}
type.children = type.children || [];
type.children.push(meta);
return;
}
5 years ago
let group = menuItems.find(i => i.title === meta.category);
if (!group) {
group = {
type: 'category',
5 years ago
title: meta.category,
children: [],
5 years ago
order: categoryOrder[meta.category],
};
menuItems.push(group);
}
5 years ago
group.children = group.children || [];
5 years ago
if (meta.type) {
let type = group.children.filter(i => i.title === meta.type)[0];
if (!type) {
type = {
type: 'type',
title: meta.type,
children: [],
order: typeOrder[meta.type],
};
group.children.push(type);
}
type.children = type.children || [];
5 years ago
type.children.push(meta);
} else {
group.children.push(meta);
}
});
5 years ago
function nestSort(list: Meta[]): Meta[] {
5 years ago
return list.sort(sortFn).map(item => {
if (item.children) {
return {
...item,