Skip to content

Commit

Permalink
feat: right-click menu supports multiple levels
Browse files Browse the repository at this point in the history
  • Loading branch information
anncwb committed Nov 1, 2020
1 parent c8021ef commit f645680
Show file tree
Hide file tree
Showing 15 changed files with 138 additions and 52 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.zh_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
### ✨ Features

- 全局 loading 添加文本
- 右键菜单支持多级

### 🎫 Chores

Expand All @@ -13,7 +14,7 @@
- Layout 界面布局样式调整
- 优化表格渲染性能
- 表单折叠搜索添图标添加动画
- routeModule 可以忽略 layou 配置不写。方便配置一级菜单
- routeModule 可以忽略 layout 配置不写。方便配置一级菜单

### 🐛 Bug Fixes

Expand Down
54 changes: 31 additions & 23 deletions src/components/ContextMenu/src/index.less
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
@import (reference) '../../../design/index.less';

.item-style() {
li {
display: inline-block;
width: 100%;
height: 46px !important;
margin: 0 !important;
line-height: 46px;

span {
line-height: 46px;
}

> div {
margin: 0 !important;
}

&:hover {
color: @text-color-base;
background: #eee;
}
}
}

.context-menu {
position: fixed;
top: 0;
Expand All @@ -18,32 +41,17 @@
background-clip: padding-box;
user-select: none;

&.hidden {
display: none !important;
}
.item-style();

&__item {
a {
display: inline-block;
width: 100%;
padding: 10px 14px;
.ant-divider {
margin: 0 0;
}

&:hover {
color: @text-color-base;
background: #eee;
}
&__popup {
.ant-divider {
margin: 0 0;
}

&.disabled {
a {
color: @disabled-color;
cursor: not-allowed;

&:hover {
color: @disabled-color;
background: unset;
}
}
}
.item-style();
}
}
49 changes: 35 additions & 14 deletions src/components/ContextMenu/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@ import {
unref,
onUnmounted,
} from 'vue';

import { props } from './props';
import Icon from '/@/components/Icon';
import { Menu, Divider } from 'ant-design-vue';

import type { ContextMenuItem } from './types';

import './index.less';
const prefixCls = 'context-menu';
export default defineComponent({
Expand Down Expand Up @@ -43,12 +47,13 @@ export default defineComponent({
top: (body.clientHeight < y + menuHeight ? y - menuHeight : y) + 'px',
};
});

function handleAction(item: ContextMenuItem, e: MouseEvent) {
state.show = false;
const { handler, disabled } = item;
if (disabled) {
return;
}
state.show = false;
if (e) {
e.stopPropagation();
e.preventDefault();
Expand All @@ -61,31 +66,47 @@ export default defineComponent({

const { showIcon } = props;
return (
<span style="display: inline-block; width: 100%;">
<span style="display: inline-block; width: 100%;" onClick={handleAction.bind(null, item)}>
{showIcon && icon && <Icon class="mr-2" icon={icon} />}
<span>{label}</span>
</span>
);
}
function renderMenuItem(items: ContextMenuItem[]) {
return items.map((item) => {
const { disabled, label } = item;
return items.map((item, index) => {
const { disabled, label, children, divider = false } = item;

return (
<li class={`${prefixCls}__item ${disabled ? 'disabled' : ''}`} key={label}>
<a onClick={handleAction.bind(null, item)} style="color:#333;">
{renderContent(item)}
</a>
</li>
const DividerComp = divider ? <Divider key={`d-${index}`} /> : null;
if (!children || children.length === 0) {
return [
<Menu.Item disabled={disabled} class={`${prefixCls}__item`} key={label}>
{() => [renderContent(item)]}
</Menu.Item>,
DividerComp,
];
}
return !state.show ? null : (
<Menu.SubMenu key={label} disabled={disabled} popupClassName={`${prefixCls}__popup `}>
{{
title: () => renderContent(item),
default: () => [renderMenuItem(children)],
}}
</Menu.SubMenu>
);
});
}
return () => {
const { items } = props;
return (
<ul class={[prefixCls, !state.show && 'hidden']} ref={wrapRef} style={unref(getStyle)}>
{renderMenuItem(items)}
</ul>
return !state.show ? null : (
<Menu
inlineIndent={12}
mode="vertical"
class={[prefixCls]}
ref={wrapRef}
style={unref(getStyle)}
>
{() => renderMenuItem(items)}
</Menu>
);
};
},
Expand Down
11 changes: 10 additions & 1 deletion src/components/Description/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export default defineComponent({
...unref(propsRef),
};
});

const getProps = computed(() => {
const opt = {
...props,
Expand All @@ -31,12 +32,14 @@ export default defineComponent({
};
return opt;
});

/**
* @description: 是否使用标题
*/
const useWrapper = computed(() => {
return !!unref(getMergeProps).title;
});

/**
* @description: 获取配置Collapse
*/
Expand All @@ -49,6 +52,7 @@ export default defineComponent({
};
}
);

/**
* @description:设置desc
*/
Expand All @@ -57,9 +61,11 @@ export default defineComponent({
const mergeProps = deepMerge(unref(propsRef) || {}, descProps);
propsRef.value = cloneDeep(mergeProps);
}

const methods: DescInstance = {
setDescProps,
};

emit('register', methods);

// 防止换行
Expand Down Expand Up @@ -95,6 +101,7 @@ export default defineComponent({

const width = contentMinWidth;
return (
// @ts-ignore
<Descriptions.Item label={renderLabel(item)} key={field} span={span}>
{() =>
contentMinWidth ? (
Expand All @@ -113,13 +120,15 @@ export default defineComponent({
);
});
}

const renderDesc = () => {
return (
<Descriptions class={`${prefixCls}`} {...{ ...attrs, ...unref(getProps) }}>
<Descriptions class={`${prefixCls}`} {...{ ...attrs, ...(unref(getProps) as any) }}>
{() => renderItem()}
</Descriptions>
);
};

const renderContainer = () => {
const content = props.useCollapse ? renderDesc() : <div>{renderDesc()}</div>;
// 减少dom层级
Expand Down
5 changes: 3 additions & 2 deletions src/components/Description/src/useDescription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,19 @@ export function useDescription(props?: Partial<DescOptions>): UseDescReturnType
const descRef = ref<DescInstance | null>(null);
const loadedRef = ref(false);

function getDescription(instance: DescInstance) {
function register(instance: DescInstance) {
if (unref(loadedRef) && isProdMode()) {
return;
}
descRef.value = instance;
props && instance.setDescProps(props);
loadedRef.value = true;
}

const methods: DescInstance = {
setDescProps: (descProps: Partial<DescOptions>): void => {
unref(descRef)!.setDescProps(descProps);
},
};
return [getDescription, methods];
return [register, methods];
}
2 changes: 2 additions & 0 deletions src/components/Icon/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export default defineComponent({
const { icon, prefix } = props;
return `${prefix ? prefix + ':' : ''}${icon}`;
});

const update = async () => {
const el = unref(elRef);
if (el) {
Expand Down Expand Up @@ -67,6 +68,7 @@ export default defineComponent({
});

watch(() => props.icon, update, { flush: 'post' });

onMounted(update);

return () => (
Expand Down
2 changes: 2 additions & 0 deletions src/components/Menu/src/BasicMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export default defineComponent({
}
return menuState.openKeys;
});

// menu外层样式
const getMenuWrapStyle = computed((): any => {
const { showLogo, search } = props;
Expand Down Expand Up @@ -130,6 +131,7 @@ export default defineComponent({
menuState.selectedKeys = [path];
emit('menuClick', menu);
}

function handleMenuChange() {
const { flatItems } = props;
if (!unref(flatItems) || flatItems.length === 0) {
Expand Down
2 changes: 2 additions & 0 deletions src/components/Menu/src/useSearchInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,11 @@ export function useSearchInput({
openKeys = es6Unique(openKeys);
menuState.openKeys = openKeys;
}

// 搜索框点击
function handleInputClick(e: any): void {
emit('clickSearchInput', e);
}

return { handleInputChange, handleInputClick };
}
1 change: 1 addition & 0 deletions src/components/Preview/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ export default defineComponent({
</div>
);
};

const renderIndex = () => {
if (!unref(getIsMultipleImage)) {
return null;
Expand Down
5 changes: 3 additions & 2 deletions src/hooks/web/useWatermark.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ import { getCurrentInstance, onBeforeUnmount, ref, Ref, unref } from 'vue';
const domSymbol = Symbol('watermark-dom');

export function useWatermark(appendEl: Ref<HTMLElement | null> = ref(document.body)) {
let func: Fn = () => {};
const id = domSymbol.toString();
const clear = () => {
const domId = document.getElementById(id);
if (domId) {
const el = unref(appendEl);
el && el.removeChild(domId);
}
window.addEventListener('resize', func);
};
const createWatermark = (str: string) => {
clear();
Expand Down Expand Up @@ -45,15 +47,14 @@ export function useWatermark(appendEl: Ref<HTMLElement | null> = ref(document.bo

function setWatermark(str: string) {
createWatermark(str);
const func = () => {
func = () => {
createWatermark(str);
};
window.addEventListener('resize', func);
const instance = getCurrentInstance();
if (instance) {
onBeforeUnmount(() => {
clear();
window.addEventListener('resize', func);
});
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/router/routes/modules/demo/feat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export default {
{
path: '/icon',
name: 'IconDemo',
component: () => import('/@/views/demo/comp/icon/index.vue'),
component: () => import('/@/views/demo/feat/icon/index.vue'),
meta: {
title: '图标',
},
Expand All @@ -43,7 +43,7 @@ export default {
{
path: '/click-out-side',
name: 'ClickOutSideDemo',
component: () => import('/@/views/demo/comp/click-out-side/index.vue'),
component: () => import('/@/views/demo/feat/click-out-side/index.vue'),
meta: {
title: 'ClickOutSide组件',
},
Expand Down
2 changes: 0 additions & 2 deletions src/views/demo/comp/button/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
show-icon
/>

<Alert message="按钮扩展" type="info" show-icon class="mt-4" />

<div class="my-2">
<h3>success</h3>
<a-button color="success">成功</a-button>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<div class="px-10">
<Alert message="点内外部触发事件" show-icon class="mt-4"></Alert>
<div class="p-10">
<Alert message="点内外部触发事件" show-icon></Alert>
<ClickOutSide @clickOutside="handleClickOutside" class="flex justify-center mt-10">
<div @click="innerClick" class="demo-box">
{{ text }}
Expand Down
Loading

0 comments on commit f645680

Please sign in to comment.