Files
skywalking-booster-ui/src/router/layer.ts

107 lines
3.5 KiB
TypeScript

/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import type { AppRouteRecordRaw } from "@/types/router";
import { META_KEYS } from "./constants";
import Layout from "@/layout/Index.vue";
import { useAppStoreWithOut } from "@/store/modules/app";
import type { MenuOptions } from "@/types/app";
import Layer from "@/views/Layer.vue";
/**
* Generate layer dashboard routes from app store menu configuration
*/
function generateLayerDashboards(): AppRouteRecordRaw[] {
const appStore = useAppStoreWithOut();
return appStore.allMenus.map((item: MenuOptions): AppRouteRecordRaw => {
const route: AppRouteRecordRaw = {
path: "",
name: item.name,
component: Layout,
meta: {
[META_KEYS.ICON]: item.icon || "cloud_queue",
[META_KEYS.TITLE]: item.title,
[META_KEYS.HAS_GROUP]: item.hasGroup,
[META_KEYS.ACTIVATE]: item.activate,
[META_KEYS.DESC_KEY]: item.descKey,
[META_KEYS.I18N_KEY]: item.i18nKey,
[META_KEYS.BREADCRUMB]: true,
},
children: item.subItems && item.subItems.length ? [] : undefined,
};
// Handle grouped items
if (item.subItems && item.subItems.length) {
for (const child of item.subItems) {
const childRoute: AppRouteRecordRaw = {
name: child.name,
path: child.path || "",
meta: {
[META_KEYS.TITLE]: child.title,
[META_KEYS.LAYER]: child.layer,
[META_KEYS.ICON]: child.icon || "cloud_queue",
[META_KEYS.ACTIVATE]: child.activate,
[META_KEYS.DESC_KEY]: child.descKey,
[META_KEYS.I18N_KEY]: child.i18nKey,
[META_KEYS.BREADCRUMB]: true,
},
component: Layer,
};
route.children!.push(childRoute);
// Add tab route for active tab index
const tabRoute: AppRouteRecordRaw = {
name: `${child.name}ActiveTabIndex`,
path: `/${child.path}/tab/:activeTabIndex`,
component: Layer,
meta: {
[META_KEYS.NOT_SHOW]: true,
[META_KEYS.LAYER]: child.layer,
[META_KEYS.TITLE]: child.title,
[META_KEYS.BREADCRUMB]: false,
},
};
route.children!.push(tabRoute);
}
} else {
// Handle non-grouped items
route.children = [
{
name: item.name,
path: item.path || "",
meta: {
[META_KEYS.TITLE]: item.title,
[META_KEYS.LAYER]: item.layer,
[META_KEYS.ICON]: item.icon,
[META_KEYS.ACTIVATE]: item.activate,
[META_KEYS.DESC_KEY]: item.descKey,
[META_KEYS.I18N_KEY]: item.i18nKey,
[META_KEYS.BREADCRUMB]: true,
},
component: Layer,
},
];
}
return route;
});
}
export default generateLayerDashboards();