This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/main by this push:
     new 00ee5fd4298 Show menu section if user has access to at least one of 
its pages (#8978)
00ee5fd4298 is described below

commit 00ee5fd429829ba467d72d8b02b87a804dac2d6c
Author: Fabricio Duarte <[email protected]>
AuthorDate: Fri Apr 26 09:34:06 2024 -0300

    Show menu section if user has access to at least one of its pages (#8978)
---
 ui/src/config/router.js            |  5 ++---
 ui/src/store/modules/permission.js | 31 +++++++++++++++++++++++--------
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/ui/src/config/router.js b/ui/src/config/router.js
index c3b69bde23a..b4570dbcee8 100644
--- a/ui/src/config/router.js
+++ b/ui/src/config/router.js
@@ -51,14 +51,13 @@ function generateRouterMap (section) {
       icon: section.icon,
       docHelp: vueProps.$applyDocHelpMappings(section.docHelp),
       searchFilters: section.searchFilters,
-      related: section.related
+      related: section.related,
+      section: true
     },
     component: shallowRef(RouteView)
   }
 
   if (section.children && section.children.length > 0) {
-    map.redirect = '/' + section.children[0].name
-    map.meta.permission = section.children[0].permission
     map.children = []
     for (const child of section.children) {
       if ('show' in child && !child.show()) {
diff --git a/ui/src/store/modules/permission.js 
b/ui/src/store/modules/permission.js
index 3b080be5f63..ad11fe5a8d0 100644
--- a/ui/src/store/modules/permission.js
+++ b/ui/src/store/modules/permission.js
@@ -17,24 +17,39 @@
 
 import { asyncRouterMap, constantRouterMap } from '@/config/router'
 
-function hasApi (apis, route) {
-  if (route.meta && route.meta.permission) {
-    for (const permission of route.meta.permission) {
-      if (!apis.includes(permission)) {
-        return false
-      }
-    }
+function hasAccessToRoute (apis, route) {
+  if (!route.meta || !route.meta.permission) {
     return true
   }
+  for (const permission of route.meta.permission) {
+    if (!apis.includes(permission)) {
+      return false
+    }
+  }
+  return true
+}
+
+function hasAccessToSection (route) {
+  const visibleChildren = route.children.filter(child => !child.hidden)
+  if (visibleChildren.length === 0) {
+    return false
+  }
+  const redirect = '/' + visibleChildren[0].meta.name
+  if (redirect !== route.path) {
+    route.redirect = redirect
+  }
   return true
 }
 
 function filterAsyncRouter (routerMap, apis) {
   const accessedRouters = routerMap.filter(route => {
-    if (hasApi(apis, route)) {
+    if (hasAccessToRoute(apis, route)) {
       if (route.children && route.children.length > 0) {
         route.children = filterAsyncRouter(route.children, apis)
       }
+      if (route.meta && route.meta.section) {
+        return hasAccessToSection(route)
+      }
       return true
     }
     return false

Reply via email to