|
|
|
@ -180,14 +180,14 @@ |
|
|
|
:menu-items="menuItems" |
|
|
|
:active-menu="activeMenu" |
|
|
|
:is-edit-mode="isIconEditMode" |
|
|
|
:available-icons="topNavItems" |
|
|
|
:available-icons="iconPickerCatalog" |
|
|
|
:default-menu-items="defaultMenuItems" |
|
|
|
:position="menuPosition" |
|
|
|
@hide="hideMenu" |
|
|
|
@select="selectMenu" |
|
|
|
@menu-action="handleMenuAction" |
|
|
|
@update:menu-items="updateMenuItems" |
|
|
|
@drag-end="handleMenuDragEnd" |
|
|
|
@add-items="handleAddMenuItems" |
|
|
|
@delete="handleDeleteMenuItem" |
|
|
|
@save-menu-items="handleSaveMenuItems" |
|
|
|
@exit-icon-edit="exitIconEdit" |
|
|
|
@ -1071,6 +1071,13 @@ export default { |
|
|
|
if (editor && Number(editor.userId) !== Number(myId)) ids.push(Number(rid)); |
|
|
|
}); |
|
|
|
return ids; |
|
|
|
}, |
|
|
|
/** 左侧「选择图标」:全部默认菜单样式 + 不与默认 id 重复的扩展项 */ |
|
|
|
iconPickerCatalog() { |
|
|
|
const defs = this.defaultMenuItems || []; |
|
|
|
const seen = new Set(defs.map(d => d.id)); |
|
|
|
const extras = (this.topNavItems || []).filter(t => !seen.has(t.id)); |
|
|
|
return [...defs, ...extras]; |
|
|
|
} |
|
|
|
}, |
|
|
|
mounted() { |
|
|
|
@ -3789,19 +3796,6 @@ export default { |
|
|
|
this.menuItems = newItems |
|
|
|
}, |
|
|
|
|
|
|
|
handleAddMenuItems(selectedItems) { |
|
|
|
selectedItems.forEach(item => { |
|
|
|
const newId = Date.now().toString() + Math.random().toString(36).substr(2, 9) |
|
|
|
const newMenuItem = { |
|
|
|
id: newId, |
|
|
|
name: item.name, |
|
|
|
icon: item.icon, |
|
|
|
action: item.id |
|
|
|
} |
|
|
|
this.menuItems.push(newMenuItem) |
|
|
|
}) |
|
|
|
}, |
|
|
|
|
|
|
|
handleMenuAction(actionId) { |
|
|
|
const actionMap = { |
|
|
|
'savePlan': () => this.savePlan(), |
|
|
|
@ -4495,43 +4489,32 @@ export default { |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** 加载当前用户的左侧菜单配置(登录且有过保存时生效) */ |
|
|
|
/** 加载当前用户的左侧菜单配置(以数据库为准,不自动补回已删除的默认项) */ |
|
|
|
async loadUserMenuConfig() { |
|
|
|
try { |
|
|
|
const res = await getMenuConfig() |
|
|
|
const data = res && res.data |
|
|
|
if (!data) return |
|
|
|
if (data.menuItems) { |
|
|
|
if (data.menuItems != null && data.menuItems !== '') { |
|
|
|
let arr = [] |
|
|
|
try { |
|
|
|
arr = typeof data.menuItems === 'string' ? JSON.parse(data.menuItems) : data.menuItems |
|
|
|
} catch (e) { /* 解析失败保留默认 */ } |
|
|
|
if (Array.isArray(arr) && arr.length > 0) { |
|
|
|
const defaultMap = (this.defaultMenuItems || []).reduce((m, it) => { m[it.id] = it; return m }, {}) |
|
|
|
const savedIds = new Set(arr.map(i => i.id)) |
|
|
|
// 合并缺失的默认项(如新增的4T),按 defaultMenuItems 顺序插入 |
|
|
|
const defaultOrder = (this.defaultMenuItems || []).map(d => d.id) |
|
|
|
defaultOrder.forEach(defId => { |
|
|
|
if (!savedIds.has(defId) && defaultMap[defId]) { |
|
|
|
const insertAfterId = defaultOrder[defaultOrder.indexOf(defId) - 1] |
|
|
|
const refIdx = insertAfterId ? arr.findIndex(i => i.id === insertAfterId) : -1 |
|
|
|
const insertIdx = refIdx >= 0 ? refIdx + 1 : 0 |
|
|
|
arr.splice(insertIdx, 0, { ...defaultMap[defId] }) |
|
|
|
savedIds.add(defId) |
|
|
|
} |
|
|
|
}) |
|
|
|
this.menuItems = arr.map(item => { |
|
|
|
const def = defaultMap[item.id] |
|
|
|
if (def) return { ...item, name: def.name, icon: def.icon, action: def.action } |
|
|
|
return item |
|
|
|
}) |
|
|
|
} catch (e) { |
|
|
|
return |
|
|
|
} |
|
|
|
if (!Array.isArray(arr)) return |
|
|
|
const defaultMap = (this.defaultMenuItems || []).reduce((m, it) => { m[it.id] = it; return m }, {}) |
|
|
|
this.menuItems = arr.map(item => { |
|
|
|
const def = defaultMap[item.id] |
|
|
|
if (def) return { ...item, name: def.name, icon: def.icon, action: def.action } |
|
|
|
return item |
|
|
|
}) |
|
|
|
} |
|
|
|
if (data.position && ['left', 'top', 'bottom'].includes(data.position)) { |
|
|
|
this.menuPosition = data.position |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
// 未登录或接口失败则使用默认菜单,不提示 |
|
|
|
// 未登录或接口失败则使用 mounted 中的默认菜单,不提示 |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
|