blob: 675bc5b5f5ede4a963136fba28e196898fc00c23 [file] [log] [blame]
/*
* 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 { RouterMeta } from '@/router/RouterMeta'
import type { RouteRecordRaw } from 'vue-router'
import LayoutTab from '../layout/tab/layout_tab.vue'
import _ from 'lodash'
import AppTabHeaderSlot from '@/views/resources/applications/slots/AppTabHeaderSlot.vue'
import ServiceTabHeaderSlot from '@/views/resources/services/slots/ServiceTabHeaderSlot.vue'
import InstanceTabHeaderSlot from '@/views/resources/instances/slots/InstanceTabHeaderSlot.vue'
import AddConditionRuleTabHeaderSlot from '@/views/traffic/routingRule/slots/addConditionRuleTabHeaderSlot.vue'
import ConditionRuleDetailTabHeaderSlot from '@/views/traffic/routingRule/slots/conditionRuleDetailTabHeaderSlot.vue'
import UpdateConditionRuleTabHeaderSlot from '@/views/traffic/routingRule/slots/updateConditionRuleTabHeaderSlot.vue'
import AddTagRuleTabHeaderSlot from '@/views/traffic/tagRule/slots/addTagRuleTabHeaderSlot.vue'
import TagRuleDetailTabHeaderSlot from '@/views/traffic/tagRule/slots/tagRuleDetailTabHeaderSlot.vue'
import UpdateTagRuleTabHeaderSlot from '@/views/traffic/tagRule/slots/updateTagRuleTabHeaderSlot.vue'
import AddDCTabHeaderSlot from '@/views/traffic/dynamicConfig/slots/addDCTabHeaderSlot.vue'
import UpdateDCTabHeaderSlot from '@/views/traffic/dynamicConfig/slots/updateDCTabHeaderSlot.vue'
export declare type RouteRecordType = RouteRecordRaw & {
key?: string
name: string
children?: RouteRecordType[]
meta?: RouterMeta
}
export const routes: Readonly<RouteRecordType[]> = [
{
path: '/login',
name: 'Login',
component: () => import('@/Login.vue'),
meta: {
skip: true
},
children: []
},
{
path: '/',
name: 'Root',
redirect: '/home',
component: () => import('../layout/index.vue'),
meta: {
skip: true
},
children: [
{
path: '/home',
name: 'homePage',
component: () => import('../views/home/index.vue'),
meta: {
icon: 'carbon:web-services-cluster'
}
},
{
path: '/resources',
name: 'resources',
meta: {
icon: 'carbon:web-services-cluster'
},
children: [
{
path: '/applications',
name: 'applications',
component: LayoutTab,
redirect: 'list',
meta: {
tab_parent: true,
slots: {
header: AppTabHeaderSlot
}
},
children: [
{
path: '/list',
name: 'router.resource.app.list',
component: () => import('../views/resources/applications/index.vue'),
meta: {
hidden: true
}
},
{
path: '/detail/:pathId',
name: 'applicationDomain.detail',
component: () => import('../views/resources/applications/tabs/detail.vue'),
meta: {
tab: true,
icon: 'tabler:list-details',
back: '/resources/applications/list'
}
},
{
path: '/instance/:pathId',
name: 'applicationDomain.instance',
component: () => import('../views/resources/applications/tabs/instance.vue'),
meta: {
tab: true,
icon: 'ooui:instance-ltr',
back: '/resources/applications/list'
}
},
{
path: '/service/:pathId',
name: 'applicationDomain.service',
component: () => import('../views/resources/applications/tabs/service.vue'),
meta: {
tab: true,
icon: 'carbon:web-services-definition',
back: '/resources/applications/list'
}
},
{
path: '/monitor/:pathId',
name: 'applicationDomain.monitor',
component: () => import('../views/resources/applications/tabs/monitor.vue'),
meta: {
tab: true,
icon: 'material-symbols-light:monitor-heart-outline',
back: '/resources/applications/list'
}
},
{
path: '/tracing/:pathId',
name: 'applicationDomain.tracing',
component: () => import('../views/resources/applications/tabs/tracing.vue'),
meta: {
tab: true,
icon: 'game-icons:digital-trace',
back: '/resources/applications/list'
}
},
{
path: '/config/:pathId',
name: 'applicationDomain.config',
component: () => import('../views/resources/applications/tabs/config.vue'),
meta: {
tab: true,
icon: 'material-symbols:settings',
back: '/resources/applications/list'
}
},
{
path: '/event/:pathId',
name: 'applicationDomain.event',
component: () => import('../views/resources/applications/tabs/event.vue'),
meta: {
tab: true,
hidden: true,
icon: 'material-symbols:date-range',
back: '/resources/applications/list'
}
}
]
},
{
path: '/instances',
name: 'instances',
component: LayoutTab,
redirect: 'list',
meta: {
tab_parent: true,
slots: {
header: InstanceTabHeaderSlot
}
},
children: [
{
path: '/list',
name: 'router.resource.ins.list',
component: () => import('../views/resources/instances/index.vue'),
meta: {
hidden: true
}
},
{
path: '/detail/:appName/:pathId?',
name: 'instanceDomain.details',
component: () => import('../views/resources/instances/tabs/detail.vue'),
meta: {
tab: true,
icon: 'tabler:list-details',
back: '/resources/instances/list'
}
},
{
path: '/monitor/:pathId/:appName',
name: 'instanceDomain.monitor',
component: () => import('../views/resources/instances/tabs/monitor.vue'),
meta: {
tab: true,
icon: 'ooui:instance-ltr',
back: '/resources/instances/list'
}
},
{
path: '/linktracking/:pathId/:appName',
name: 'instanceDomain.linkTracking',
component: () => import('../views/resources/instances/tabs/linkTracking.vue'),
meta: {
tab: true,
icon: 'material-symbols-light:monitor-heart-outline',
back: '/resources/instances/list'
}
},
{
path: '/configuration/:pathId/:appName',
name: 'instanceDomain.configuration',
component: () => import('../views/resources/instances/tabs/configuration.vue'),
meta: {
tab: true,
icon: 'material-symbols:settings',
back: '/resources/instances/list'
}
},
{
path: '/event/:pathId/:appName',
name: 'instanceDomain.event',
component: () => import('../views/resources/instances/tabs/event.vue'),
meta: {
tab: true,
hidden: true,
icon: 'material-symbols:date-range',
back: '/resources/instances/list'
}
}
]
},
{
path: '/services',
name: 'services',
redirect: 'list',
component: LayoutTab,
meta: {
tab_parent: true,
slots: {
header: ServiceTabHeaderSlot
}
},
children: [
{
path: '/list',
name: 'router.resource.svc.list',
component: () => import('../views/resources/services/search.vue'),
meta: {
hidden: true
}
},
{
path: '/distribution/:pathId/:group?/:version?',
name: 'distribution',
component: () => import('../views/resources/services/tabs/distribution.vue'),
meta: {
tab: true,
back: '/resources/services/list'
}
},
// Temporarily hidden
// {
// path: '/detail/:pathId',
// name: 'detail',
// component: () => import('../views/resources/services/tabs/detail.vue'),
// meta: {
// tab: true
// }
// },
// {
// path: '/debug/:pathId/:group?/:version?',
// name: 'debug',
// component: () => import('../views/resources/services/tabs/debug.vue'),
// meta: {
// tab: true,
// back: '/resources/services/list'
// }
// },
{
path: '/monitor/:pathId/:group?/:version?',
name: 'monitor',
component: () => import('../views/resources/services/tabs/monitor.vue'),
meta: {
tab: true,
back: '/resources/services/list'
}
},
{
path: '/tracing/:pathId/:group?/:version?',
name: 'tracing',
component: () => import('../views/resources/services/tabs/tracing.vue'),
meta: {
tab: true,
back: '/resources/services/list'
}
},
{
path: '/sceneConfig/:pathId/:group?/:version?',
name: 'sceneConfig',
component: () => import('../views/resources/services/tabs/sceneConfig.vue'),
meta: {
tab: true,
back: '/resources/services/list'
}
},
{
path: '/event/:pathId/:group?/:version?',
name: 'event',
component: () => import('../views/resources/services/tabs/event.vue'),
meta: {
tab: true,
hidden: true,
back: '/resources/services/list'
}
}
]
}
]
},
{
path: '/traffic',
name: 'trafficManagement',
meta: {
icon: 'eos-icons:cluster-management'
},
children: [
{
path: '/routingRule',
name: 'routingRule',
redirect: 'index',
component: LayoutTab,
meta: {
tab_parent: true,
slots: {
header: ConditionRuleDetailTabHeaderSlot
}
},
children: [
{
path: '/index',
name: 'routingRuleIndex',
component: () => import('../views/traffic/routingRule/index.vue'),
meta: {
hidden: true
}
},
{
path: '/formview/:ruleName',
name: 'routingRuleDomain.formView',
component: () => import('../views/traffic/routingRule/tabs/formView.vue'),
meta: {
tab: true,
icon: 'oui:apm-trace'
}
},
{
path: '/yamlview/:ruleName',
name: 'routingRuleDomain.YAMLView',
component: () => import('../views/traffic/routingRule/tabs/YAMLView.vue'),
meta: {
tab: true,
icon: 'oui:app-console'
}
}
]
},
{
path: '/addRoutingRule',
name: 'addRoutingRule',
component: LayoutTab,
redirect: 'addByFormView',
meta: {
tab_parent: true,
hidden: true,
slots: {
header: AddConditionRuleTabHeaderSlot
}
},
children: [
{
path: '/addByFormView',
name: 'addRoutingRuleDomain.formView',
component: () => import('../views/traffic/routingRule/tabs/addByFormView.vue'),
meta: {
tab: true,
icon: 'oui:apm-trace'
}
},
{
path: '/addByYamlView',
name: 'addRoutingRuleDomain.YAMLView',
component: () => import('../views/traffic/routingRule/tabs/addByYAMLView.vue'),
meta: {
tab: true,
icon: 'oui:app-console'
}
}
]
},
{
path: '/updateRoutingRule',
name: 'updateRoutingRule',
component: LayoutTab,
meta: {
tab_parent: true,
hidden: true,
slots: {
header: UpdateConditionRuleTabHeaderSlot
}
},
children: [
{
path: '/updateByFormView/:ruleName',
name: 'updateRoutingRuleDomain.formView',
component: () => import('../views/traffic/routingRule/tabs/updateByFormView.vue'),
meta: {
tab: true
}
},
{
path: '/updateByYAMLView/:ruleName',
name: 'updateRoutingRuleDomain.YAMLView',
component: () => import('../views/traffic/routingRule/tabs/updateByYAMLView.vue'),
meta: {
tab: true
}
}
]
},
{
path: '/tagRule',
name: 'tagRule',
redirect: 'index',
component: LayoutTab,
meta: {
tab_parent: true,
slots: {
header: TagRuleDetailTabHeaderSlot
}
},
children: [
{
path: '/index',
name: 'tagRuleIndex',
component: () => import('../views/traffic/tagRule/index.vue'),
meta: {
hidden: true
}
},
{
path: '/formview/:ruleName',
name: 'tagRuleDomain.formView',
component: () => import('../views/traffic/tagRule/tabs/formView.vue'),
meta: {
tab: true,
icon: 'oui:apm-trace',
back: '/traffic/tagRule'
}
},
{
path: '/yamlview/:ruleName',
name: 'tagRuleDomain.YAMLView',
component: () => import('../views/traffic/tagRule/tabs/YAMLView.vue'),
meta: {
tab: true,
icon: 'oui:app-console'
}
}
]
},
{
path: '/addTagRule',
name: 'addTagRule',
component: LayoutTab,
meta: {
tab_parent: true,
hidden: true,
slots: {
header: AddTagRuleTabHeaderSlot
}
},
children: [
{
path: '/addByFormView',
name: 'addTagRuleDomain.formView',
component: () => import('../views/traffic/tagRule/tabs/addByFormView.vue'),
meta: {
tab: true,
icon: 'oui:apm-trace'
}
},
{
path: '/addByYAMLView',
name: 'addTagRuleDomain.YAMLView',
component: () => import('../views/traffic/tagRule/tabs/addByYAMLView.vue'),
meta: {
tab: true,
icon: 'oui:app-console'
}
}
]
},
{
path: '/updateTagRule',
name: 'updateTagRule',
component: LayoutTab,
meta: {
tab_parent: true,
hidden: true,
slots: {
header: UpdateTagRuleTabHeaderSlot
}
},
children: [
{
path: '/updateByFormView/:ruleName',
name: 'updateTagRuleDomain.formView',
component: () => import('../views/traffic/tagRule/tabs/updateByFormView.vue'),
meta: {
// hidden: true,
tab: true
}
},
{
path: '/updateByYAMLView/:ruleName',
name: 'updateTagRuleDomain.YAMLView',
component: () => import('../views/traffic/tagRule/tabs/updateByYAMLView.vue'),
meta: {
// hidden: true,
tab: true
}
}
]
},
{
path: '/dynamicConfig',
name: 'dynamicConfig',
redirect: 'index',
component: LayoutTab,
meta: {
tab_parent: true
},
children: [
{
path: '/index',
name: 'dynamicConfigIndex',
component: () => import('../views/traffic/dynamicConfig/index.vue'),
meta: {
hidden: true
}
},
{
path: '/formview/:pathId/:isEdit',
name: 'dynamicConfigDomain.formView',
component: () => import('../views/traffic/dynamicConfig/tabs/formView.vue'),
meta: {
tab: true,
icon: 'oui:apm-trace',
back: '/traffic/dynamicConfig',
slots: {
header: UpdateDCTabHeaderSlot
}
}
},
{
path: '/yamlview/:pathId/:isEdit',
name: 'dynamicConfigDomain.YAMLView',
component: () => import('../views/traffic/dynamicConfig/tabs/YAMLView.vue'),
meta: {
tab: true,
icon: 'oui:app-console',
back: '/traffic/dynamicConfig',
slots: {
header: UpdateDCTabHeaderSlot
}
}
}
]
}
// {
// path: '/meshRule',
// name: 'meshRule',
// children: [
// {
// path: '/virtualService',
// name: 'virtualService',
// redirect: 'index',
// component: LayoutTab,
// meta: {
// tab_parent: true
// },
// children: [
// {
// path: '/index',
// name: 'virtualServiceIndex',
// component: () => import('../views/traffic/virtualService/index.vue'),
// meta: {
// hidden: true
// }
// },
// {
// path: '/formview/:ruleName',
// name: 'virtualServiceDomain.formView',
// component: () => import('../views/traffic/virtualService/tabs/formView.vue'),
// meta: {
// tab: true,
// icon: 'oui:apm-trace'
// }
// },
// {
// path: '/yamlview/:ruleName',
// name: 'virtualServiceDomain.YAMLView',
// component: () => import('../views/traffic/virtualService/tabs/YAMLView.vue'),
// meta: {
// tab: true,
// icon: 'oui:app-console'
// }
// }
// ]
// },
// {
// path: '/destinationRule',
// name: 'destinationRule',
// redirect: 'index',
// component: LayoutTab,
// meta: {
// tab_parent: true
// },
// children: [
// {
// path: '/index',
// name: 'destinationRuleIndex',
// component: () => import('../views/traffic/destinationRule/index.vue'),
// meta: {
// hidden: true
// }
// },
// {
// path: '/formview/:ruleName',
// name: 'destinationRuleDomain.formView',
// component: () => import('../views/traffic/destinationRule/tabs/formView.vue'),
// meta: {
// tab: true,
// icon: 'oui:apm-trace'
// }
// },
// {
// path: '/yamlview/:ruleName',
// name: 'destinationRuleDomain.YAMLView',
// component: () => import('../views/traffic/destinationRule/tabs/YAMLView.vue'),
// meta: {
// tab: true,
// icon: 'oui:app-console'
// }
// }
// ]
// }
// ]
// }
]
},
{
path: '/common',
name: 'commonDemo',
redirect: 'tab',
meta: {
hidden: true,
icon: 'tdesign:play-demo'
},
children: [
{
path: '/tab',
name: 'tabDemo',
component: LayoutTab,
redirect: 'index',
meta: {
tab_parent: true
},
children: [
{
path: '/index',
name: 'tab_demo_index',
component: () => import('../views/common/tab_demo/index.vue'),
meta: {
hidden: true
}
},
{
path: '/tab1/:pathId',
name: 'tab1',
component: () => import('../views/common/tab_demo/tab1.vue'),
meta: {
icon: 'simple-icons:podman',
tab: true
}
},
{
path: '/tab2/:pathId',
name: 'tab2',
component: () => import('../views/common/tab_demo/tab2.vue'),
meta: {
icon: 'fontisto:docker',
tab: true
}
}
]
},
{
path: '/placeholder',
name: 'placeholder_demo',
component: () => import('../views/common/placeholder_demo/index.vue'),
meta: {}
}
]
}
]
},
{
path: '/:catchAll(.*)',
name: 'notFound',
component: () => import('../views/error/notFound.vue'),
meta: {
skip: true
}
}
]
function handlePath(...paths: any[]) {
return paths.join('/').replace(/\/+/g, '/')
}
function handleRoutes(
routes: readonly RouteRecordType[] | undefined,
parent: RouteRecordType | undefined
) {
if (!routes) return
for (const route of routes) {
if (parent) {
route.path = handlePath(parent?.path, route.path)
}
if (route.redirect) {
route.redirect = handlePath(route.path, route.redirect || '')
}
if (route.meta) {
route.meta._router_key = _.uniqueId('__router_key')
route.meta.parent = parent
// fixme, its really useful for tab_router judging how to show tab
route.meta.skip = route.meta.skip === true ? true : false
} else {
route.meta = {
_router_key: _.uniqueId('__router_key'),
skip: false
}
}
handleRoutes(route.children, route)
}
}
handleRoutes(routes, undefined)