function autoOpenMenuParents(menu, path) { let opened = false; for (let x of menu) { //x.parent = menu let openedFromChildren if (x.children) { openedFromChildren = autoOpenMenuParents(x.children, path) opened ||= openedFromChildren } if (x.url == path) menuItemActive = x if (x.path == path || openedFromChildren) { data.menuOpenIDS.push(x.id); opened = true; } } return opened } function findMenuItem(menu, id) { for (let i = 0; i < menu.length; i++) { let item = menu[i] if (item.id == id) return item if (item.children) { let res = findMenuItem(item.children, id) if (res) return res } } } function updateMenu(menu) { for (let i = 0; i < menu.length; i++) { let item = menu[i] if (item.i18n) { item.text = translate(item.i18n) } if (item.guard && !item.guard()) { menu.splice(i, 1) i-- } if (item.children) updateMenu(item.children) } } function rebuildMenuFromPages() { let menuItemFromPage = (page, hiddenByGuard) => { let url = page.menuURL || page.url return { name: page.id, text: page.menuText, path: url, id: page.menuID, icon: page.menuIcon, params: {}, hidden: !page.showInMenu, hiddenByGuard: hiddenByGuard || page.hiddenByGuard, order: page.menuOrder || 0, } } let fetchLevel = (parentID, hiddenByGuard) => { let menu = [] for (let page of pages) { if (!page.showInMenu && !data.editmode) { continue } if (page.menuParentID != parentID) { continue } let menuItem = menuItemFromPage(page, hiddenByGuard) let children = fetchLevel(page.menuID, page.hiddenByGuard) if (children.length) { menuItem.children = children } menu.push(menuItem) } return menu.sort((a, b) => a.order - b.order) } data.menu = fetchLevel(null) updateMenu(data.menu) }