Commit adff788de54a46fd035b569892135be377dd4f92
Committed by
GitHub
1 parent
d34467d3
perf(tree): improve the beforeRightClick callback to support more configuration of the menu (#608)
Showing
3 changed files
with
21 additions
and
11 deletions
src/components/Tree/src/index.vue
... | ... | @@ -23,11 +23,12 @@ |
23 | 23 | import { filter } from '/@/utils/helper/treeHelper'; |
24 | 24 | |
25 | 25 | import { useTree } from './useTree'; |
26 | - import { useContextMenu, ContextMenuItem } from '/@/hooks/web/useContextMenu'; | |
26 | + import { useContextMenu } from '/@/hooks/web/useContextMenu'; | |
27 | 27 | import { useExpose } from '/@/hooks/core/useExpose'; |
28 | 28 | import { useDesign } from '/@/hooks/web/useDesign'; |
29 | 29 | |
30 | 30 | import { basicProps } from './props'; |
31 | + import { CreateContextOptions } from '/@/components/ContextMenu'; | |
31 | 32 | |
32 | 33 | interface State { |
33 | 34 | expandedKeys: Keys; |
... | ... | @@ -128,18 +129,20 @@ |
128 | 129 | |
129 | 130 | async function handleRightClick({ event, node }: Recordable) { |
130 | 131 | const { rightMenuList: menuList = [], beforeRightClick } = props; |
131 | - let rightMenuList: ContextMenuItem[] = []; | |
132 | + let contextMenuOptions: CreateContextOptions = { event, items: [] }; | |
132 | 133 | |
133 | 134 | if (beforeRightClick && isFunction(beforeRightClick)) { |
134 | - rightMenuList = await beforeRightClick(node); | |
135 | + let result = await beforeRightClick(node, event); | |
136 | + if (Array.isArray(result)) { | |
137 | + contextMenuOptions.items = result; | |
138 | + } else { | |
139 | + Object.assign(contextMenuOptions, result); | |
140 | + } | |
135 | 141 | } else { |
136 | - rightMenuList = menuList; | |
142 | + contextMenuOptions.items = menuList; | |
137 | 143 | } |
138 | - if (!rightMenuList.length) return; | |
139 | - createContextMenu({ | |
140 | - event, | |
141 | - items: rightMenuList, | |
142 | - }); | |
144 | + if (!contextMenuOptions.items?.length) return; | |
145 | + createContextMenu(contextMenuOptions); | |
143 | 146 | } |
144 | 147 | |
145 | 148 | function setExpandedKeys(keys: Keys) { | ... | ... |
src/components/Tree/src/props.ts
1 | 1 | import type { PropType } from 'vue'; |
2 | -import type { ReplaceFields, ActionItem, Keys, CheckKeys } from './types'; | |
2 | +import type { ReplaceFields, ActionItem, Keys, CheckKeys, ContextMenuOptions } from './types'; | |
3 | 3 | import type { ContextMenuItem } from '/@/hooks/web/useContextMenu'; |
4 | 4 | import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; |
5 | 5 | import { propTypes } from '/@/utils/propTypes'; |
... | ... | @@ -53,7 +53,7 @@ export const basicProps = { |
53 | 53 | }, |
54 | 54 | |
55 | 55 | beforeRightClick: { |
56 | - type: Function as PropType<(...arg: any) => ContextMenuItem[]>, | |
56 | + type: Function as PropType<(...arg: any) => ContextMenuItem[] | ContextMenuOptions>, | |
57 | 57 | default: null, |
58 | 58 | }, |
59 | 59 | ... | ... |
src/components/Tree/src/types.ts
1 | 1 | import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; |
2 | +import { ContextMenuItem } from '/@/hooks/web/useContextMenu'; | |
2 | 3 | export interface ActionItem { |
3 | 4 | render: (record: Recordable) => any; |
4 | 5 | show?: boolean | ((record: Recordable) => boolean); |
... | ... | @@ -40,3 +41,9 @@ export interface InsertNodeParams { |
40 | 41 | list?: TreeDataItem[]; |
41 | 42 | push?: 'push' | 'unshift'; |
42 | 43 | } |
44 | + | |
45 | +export interface ContextMenuOptions { | |
46 | + icon?: string; | |
47 | + styles?: any; | |
48 | + items?: ContextMenuItem[]; | |
49 | +} | ... | ... |