fix(sidebar): 补全新增侧边栏项后的侧边栏位追加逻辑

This commit is contained in:
Oscar
2025-12-08 17:28:58 +08:00
parent 693f2988be
commit 6fd86eda13
2 changed files with 56 additions and 42 deletions
@@ -133,32 +133,49 @@ const draggedItem = ref(null);
function initializeItems() {
const customization = getSidebarCustomization();
const all = new Map();
const defaultMain = [];
const defaultMore = [];
sidebarItems.forEach(item => {
if (item.children) {
item.children.forEach(child => {
all.set(child.title, child);
defaultMore.push(child.title);
});
} else {
all.set(item.title, item);
defaultMain.push(item.title);
}
});
if (customization) {
// Load from customization
const allItemsMap = new Map();
sidebarItems.forEach(item => {
if (item.children) {
item.children.forEach(child => {
allItemsMap.set(child.title, child);
});
} else {
allItemsMap.set(item.title, item);
const used = new Set([...(customization.mainItems || []), ...(customization.moreItems || [])]);
mainItems.value = (customization.mainItems || [])
.map(title => all.get(title))
.filter(Boolean);
// 追加新增默认主区项
defaultMain.forEach(title => {
if (!used.has(title)) {
const item = all.get(title);
if (item) mainItems.value.push(item);
}
});
moreItems.value = (customization.moreItems || [])
.map(title => all.get(title))
.filter(Boolean);
// 追加新增默认更多区项
defaultMore.forEach(title => {
if (!used.has(title)) {
const item = all.get(title);
if (item) moreItems.value.push(item);
}
});
mainItems.value = customization.mainItems
.map(title => allItemsMap.get(title))
.filter(item => item);
moreItems.value = customization.moreItems
.map(title => allItemsMap.get(title))
.filter(item => item);
} else {
// Load default structure
mainItems.value = sidebarItems.filter(item => !item.children);
const moreGroup = sidebarItems.find(item => item.title === 'core.navigation.groups.more');
moreItems.value = moreGroup ? [...moreGroup.children] : [];
}
+19 -22
View File
@@ -51,46 +51,43 @@ export function applySidebarCustomization(defaultItems) {
return defaultItems;
}
const { mainItems, moreItems } = customization;
const { mainItems = [], moreItems = [] } = customization;
// Create a map of all items by title for quick lookup
// Deep clone items to avoid mutating originals
const allItemsMap = new Map();
const all = new Map();
const defaultMain = [];
const defaultMore = [];
defaultItems.forEach(item => {
if (item.children) {
// If it's the "More" group, add children to map
item.children.forEach(child => {
allItemsMap.set(child.title, { ...child });
all.set(child.title, { ...child });
defaultMore.push(child.title);
});
} else {
allItemsMap.set(item.title, { ...item });
all.set(item.title, { ...item });
defaultMain.push(item.title);
}
});
const customizedItems = [];
const used = new Set([...mainItems, ...moreItems]);
// Add main items in custom order
mainItems.forEach(title => {
const item = allItemsMap.get(title);
if (item) {
customizedItems.push(item);
}
});
// 按用户顺序还原主区
mainItems.forEach(title => all.get(title) && customizedItems.push(all.get(title)));
// 追加新增的默认主区项
defaultMain.forEach(title => !used.has(title) && customizedItems.push(all.get(title)));
// If there are items in moreItems, create the "More Features" group
if (moreItems && moreItems.length > 0) {
// 更多区:用户配置 + 新增默认
const mergedMore = [...moreItems];
defaultMore.forEach(title => { if (!used.has(title)) mergedMore.push(title); });
if (mergedMore.length > 0) {
const moreGroup = {
title: 'core.navigation.groups.more',
icon: 'mdi-dots-horizontal',
children: []
};
moreItems.forEach(title => {
const item = allItemsMap.get(title);
if (item) {
moreGroup.children.push(item);
}
});
mergedMore.forEach(title => all.get(title) && moreGroup.children.push(all.get(title)));
customizedItems.push(moreGroup);
}