Browse Source

refactor: better breadcrumbs #258

Jacky 11 months ago
parent
commit
532d6e83c5

+ 24 - 12
app/src/components/Breadcrumb/Breadcrumb.vue

@@ -1,30 +1,41 @@
 <script setup lang="ts">
-import { useRoute } from 'vue-router'
-
 interface bread {
-  name: () => string
+  name: string
+  translatedName: () => string
   path: string
+  hasChildren?: boolean
 }
 
 const name = ref()
 const route = useRoute()
+const router = useRouter()
 
 const breadList = computed(() => {
-  const _breadList: bread[] = []
+  const result: bread[] = []
 
   name.value = route.meta.name
 
   route.matched.forEach(item => {
-    // item.name !== 'index' && this.breadList.push(item)
-    _breadList.push({
-      name: item.meta.name as never as () => string,
+    if (item.meta?.lastRouteName) {
+      const lastRoute = router.resolve({ name: item.meta.lastRouteName })
+
+      result.push({
+        name: lastRoute.name as string,
+        translatedName: lastRoute.meta.name as never as () => string,
+        path: lastRoute.path,
+      })
+    }
+
+    result.push({
+      name: item.name as string,
+      translatedName: item.meta.name as never as () => string,
       path: item.path,
+      hasChildren: item.children?.length > 0,
     })
   })
 
-  return _breadList
+  return result
 })
-
 </script>
 
 <template>
@@ -34,12 +45,13 @@ const breadList = computed(() => {
       :key="item.name"
     >
       <RouterLink
-        v-if="item.name !== name && index !== 1"
+        v-if="index === 0 || !item.hasChildren && index !== breadList.length - 1"
         :to="{ path: item.path === '' ? '/' : item.path }"
       >
-        {{ item.name() }}
+        {{ item.translatedName() }}
       </RouterLink>
-      <span v-else>{{ item.name() }}</span>
+      <span v-else-if="item.hasChildren">{{ item.translatedName() }}</span>
+      <span v-else>{{ item.translatedName() }}</span>
     </ABreadcrumbItem>
   </ABreadcrumb>
 </template>

+ 2 - 2
app/src/components/NodeSelector/NodeSelector.vue

@@ -4,7 +4,7 @@ import type { Environment } from '@/api/environment'
 import environment from '@/api/environment'
 
 const props = defineProps<{
-  target: number[]
+  target?: number[]
   map?: Record<number, string>
   hiddenLocal?: boolean
 }>()
@@ -37,7 +37,7 @@ const value = computed({
   },
   set(v) {
     if (typeof props.map === 'object') {
-      v.forEach(id => {
+      v?.forEach(id => {
         if (id !== 0)
           emit('update:map', { ...props.map, [id]: data_map.value[id].name })
       })

+ 1 - 2
app/src/components/PageHeader/PageHeader.vue

@@ -1,5 +1,4 @@
 <script setup lang="ts">
-import { useRoute } from 'vue-router'
 import Breadcrumb from '@/components/Breadcrumb/Breadcrumb.vue'
 
 const route = useRoute()
@@ -9,7 +8,7 @@ const display = computed(() => {
 })
 
 const name = computed(() => {
-  return (route.meta.name as never as () => string)()
+  return (route.meta.name as () => string)()
 })
 </script>
 

+ 5 - 0
app/src/routes/index.ts

@@ -62,6 +62,7 @@ export const routes: RouteRecordRaw[] = [
           component: () => import('@/views/domain/DomainAdd.vue'),
           meta: {
             name: () => $gettext('Add Site'),
+            lastRouteName: 'Sites List',
           },
         }, {
           path: ':name',
@@ -70,6 +71,7 @@ export const routes: RouteRecordRaw[] = [
           meta: {
             name: () => $gettext('Edit Site'),
             hiddenInSidebar: true,
+            lastRouteName: 'Sites List',
           },
         }],
       },
@@ -89,6 +91,7 @@ export const routes: RouteRecordRaw[] = [
         meta: {
           name: () => $gettext('Edit Stream'),
           hiddenInSidebar: true,
+          lastRouteName: 'Manage Streams',
         },
       },
       {
@@ -143,6 +146,7 @@ export const routes: RouteRecordRaw[] = [
             meta: {
               name: () => $gettext('Modify Certificate'),
               hiddenInSidebar: true,
+              lastRouteName: 'Certificates List',
             },
           },
           {
@@ -152,6 +156,7 @@ export const routes: RouteRecordRaw[] = [
             meta: {
               name: () => $gettext('Import Certificate'),
               hiddenInSidebar: true,
+              lastRouteName: 'Certificates List',
             },
           },
           {

+ 1 - 0
app/src/routes/type.d.ts

@@ -16,5 +16,6 @@ declare module 'vue-router' {
     noAuth?: boolean
     status_code?: number
     error?: () => string
+    lastRouteName?: string
   }
 }

+ 1 - 0
app/src/views/stream/StreamList.vue

@@ -181,6 +181,7 @@ function handleAddStream() {
     <AModal
       v-model:open="showAddStream"
       :title="$gettext('Add Stream')"
+      :mask="false"
       @ok="handleAddStream"
     >
       <AForm layout="vertical">

+ 1 - 0
app/src/views/user/userColumns.tsx

@@ -27,6 +27,7 @@ const columns: Column[] = [{
     },
   },
   hiddenInTable: true,
+  hiddenInDetail: true,
 }, {
   title: () => $gettext('2FA'),
   dataIndex: 'enabled_2fa',