diff --git a/CHANGELOG.zh_CN.md b/CHANGELOG.zh_CN.md index 5c5f110379bfa6a76f4795f0dcb69ea1c165199d..ffd8df85320a9b7d832b0eb05a21efd8618cd54b 100644 --- a/CHANGELOG.zh_CN.md +++ b/CHANGELOG.zh_CN.md @@ -1,9 +1,21 @@ ## Wip +### ✨ Features + +- 面包屑支持显示图标 +- 新增 tinymce 富文本组件 + +### 🎫 Chores + +- 删除代码内的可选链语法 + ### 🐛 Bug Fixes - 修复抽屉组件自动高度及显示 footer 显示问题 - 修复表单查询后重置回默认值 +- 修复菜单没有子节点时显示折叠的问题 +- 修复面包屑显示样式问题 +- 修复 modal 在 destroyOnClose=true 时多次打开拖拽失效 # 2.0.0-rc.4 (2020-10-21) diff --git a/src/components/Authority/index.ts b/src/components/Authority/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..102b7af5b8bd7302bf32677be7f1d3622b97fc48 --- /dev/null +++ b/src/components/Authority/index.ts @@ -0,0 +1,2 @@ +import Authority from './src/index.vue'; +export default Authority; diff --git a/src/components/Authority/index.tsx b/src/components/Authority/index.tsx deleted file mode 100644 index 2c42f1e7422400f31caaa7cf89deb467f93ff1e8..0000000000000000000000000000000000000000 --- a/src/components/Authority/index.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { defineComponent, PropType, computed, unref } from 'vue'; - -import { PermissionModeEnum } from '/@/enums/appEnum'; -import { RoleEnum } from '/@/enums/roleEnum'; -import { usePermission } from '/@/hooks/web/usePermission'; -import { appStore } from '/@/store/modules/app'; -import { getSlot } from '/@/utils/helper/tsxHelper'; - -export default defineComponent({ - name: 'Authority', - props: { - // 指定角色可见 - value: { - type: [Number, Array, String] as PropType, - default: '', - }, - }, - setup(props, { slots }) { - const getModeRef = computed(() => { - return appStore.getProjectConfig.permissionMode; - }); - - /** - * 渲染角色按钮 - */ - function renderRoleAuth() { - const { value } = props; - if (!value) { - return getSlot(slots); - } - const { hasPermission } = usePermission(); - return hasPermission(value) ? getSlot(slots) : null; - } - - /** - * 渲染编码按钮 - * 这里只判断是否包含,具体实现可以根据项目自行写逻辑 - */ - function renderCodeAuth() { - const { value } = props; - if (!value) { - return getSlot(slots); - } - const { hasPermission } = usePermission(); - return hasPermission(value) ? getSlot(slots) : null; - } - - return () => { - const mode = unref(getModeRef); - // 基于角色渲染 - if (mode === PermissionModeEnum.ROLE) { - return renderRoleAuth(); - } - // 基于后台编码渲染 - if (mode === PermissionModeEnum.BACK) { - return renderCodeAuth(); - } - return getSlot(slots); - }; - }, -}); diff --git a/src/components/Authority/src/index.vue b/src/components/Authority/src/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..9a56a2c48dbacd08a41ed961ed76307876d9b84f --- /dev/null +++ b/src/components/Authority/src/index.vue @@ -0,0 +1,65 @@ + diff --git a/src/components/Basic/index.ts b/src/components/Basic/index.ts index 3e792fc4f44ef41368779098ad994869b178d325..3854adc3dcdd9967c27ebccc4febbcb0cfb3cbcb 100644 --- a/src/components/Basic/index.ts +++ b/src/components/Basic/index.ts @@ -1,3 +1,3 @@ export { default as BasicArrow } from './src/BasicArrow.vue'; -export { default as BasicHelp } from './src/BasicHelp'; +export { default as BasicHelp } from './src/BasicHelp.vue'; export { default as BasicTitle } from './src/BasicTitle.vue'; diff --git a/src/components/Basic/src/BasicHelp.less b/src/components/Basic/src/BasicHelp.less deleted file mode 100644 index 79a770692cc5722b08b031c23a0530a2f14fe0d6..0000000000000000000000000000000000000000 --- a/src/components/Basic/src/BasicHelp.less +++ /dev/null @@ -1,19 +0,0 @@ -@import (reference) '../../../design/index.less'; - -.base-help { - display: inline-block; - margin-left: 6px; - font-size: 14px; - color: @text-color-help-dark; - cursor: pointer; - - &:hover { - color: @primary-color; - } - - &__wrap { - p { - margin-bottom: 0; - } - } -} diff --git a/src/components/Basic/src/BasicHelp.tsx b/src/components/Basic/src/BasicHelp.tsx deleted file mode 100644 index 4a4cf8cfd0bac8c774d2b0d6f00468bdff2a02ed..0000000000000000000000000000000000000000 --- a/src/components/Basic/src/BasicHelp.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import type { PropType } from 'vue'; - -import { Tooltip } from 'ant-design-vue'; -import { InfoCircleOutlined } from '@ant-design/icons-vue'; -import { defineComponent, computed, unref } from 'vue'; - -import { getPopupContainer } from '/@/utils'; - -import { isString, isArray } from '/@/utils/is'; -import { getSlot } from '/@/utils/helper/tsxHelper'; -import './BasicHelp.less'; -export default defineComponent({ - name: 'BaseHelp', - props: { - // max-width - maxWidth: { - type: String as PropType, - default: '600px', - }, - // Whether to display the serial number - showIndex: { - type: Boolean as PropType, - default: false, - }, - // Text list - text: { - type: [Array, String] as PropType, - }, - // color - color: { - type: String as PropType, - default: '#ffffff', - }, - fontSize: { - type: String as PropType, - default: '14px', - }, - absolute: { - type: Boolean as PropType, - default: false, - }, - // 定位 - position: { - type: [Object] as PropType, - default: () => ({ - position: 'absolute', - left: 0, - bottom: 0, - }), - }, - }, - setup(props, { slots }) { - const getOverlayStyleRef = computed(() => { - return { - maxWidth: props.maxWidth, - }; - }); - const getWrapStyleRef = computed(() => { - return { - color: props.color, - fontSize: props.fontSize, - }; - }); - const getMainStyleRef = computed(() => { - return props.absolute ? props.position : {}; - }); - - /** - * @description: 渲染内容 - */ - const renderTitle = () => { - const list = props.text; - if (isString(list)) { - return

{list}

; - } - if (isArray(list)) { - return list.map((item, index) => { - return ( -

- {props.showIndex ? `${index + 1}. ` : ''} - {item} -

- ); - }); - } - return null; - }; - return () => ( - {renderTitle()}) as any} - placement="right" - overlayStyle={unref(getOverlayStyleRef)} - autoAdjustOverflow={true} - overlayClassName="base-help__wrap" - getPopupContainer={() => getPopupContainer()} - > - {{ - default: () => ( - - {getSlot(slots) || } - - ), - }} - - ); - }, -}); diff --git a/src/components/Basic/src/BasicHelp.vue b/src/components/Basic/src/BasicHelp.vue new file mode 100644 index 0000000000000000000000000000000000000000..15c527fd6cac41108c71745d5b629c15e013a3e8 --- /dev/null +++ b/src/components/Basic/src/BasicHelp.vue @@ -0,0 +1,137 @@ + + diff --git a/src/components/Button/types.ts b/src/components/Button/types.ts deleted file mode 100644 index b2cf3c472ab7425744649e2af97d9a3f5c296b77..0000000000000000000000000000000000000000 --- a/src/components/Button/types.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { VNodeChild } from 'vue'; - -export interface BasicButtonProps { - /** - * can be set to primary ghost dashed danger(added in 2.7) or omitted (meaning default) - * @default 'default' - * @type string - */ - type?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; - - /** - * set the original html type of button - * @default 'button' - * @type string - */ - htmlType?: 'button' | 'submit' | 'reset' | 'menu'; - - /** - * set the icon of button - * @type string - */ - icon?: VNodeChild | JSX.Element; - - /** - * can be set to circle or circle-outline or omitted - * @type string - */ - shape?: 'circle' | 'circle-outline'; - - /** - * can be set to small large or omitted - * @default 'default' - * @type string - */ - size?: 'small' | 'large' | 'default'; - - /** - * set the loading status of button - * @default false - * @type boolean | { delay: number } - */ - loading?: boolean | { delay: number }; - - /** - * disabled state of button - * @default false - * @type boolean - */ - disabled?: boolean; - - /** - * make background transparent and invert text and border colors, added in 2.7 - * @default false - * @type boolean - */ - ghost?: boolean; - - /** - * option to fit button width to its parent width - * @default false - * @type boolean - */ - block?: boolean; - - onClick?: (e?: Event) => void; -} diff --git a/src/components/Table/src/components/TableAction.tsx b/src/components/Table/src/components/TableAction.tsx index 0341acd043a47541689bbd99e279ba25995d61be..bd8279eebccf9b89fcf7045f9bb86720f7cbbdaa 100644 --- a/src/components/Table/src/components/TableAction.tsx +++ b/src/components/Table/src/components/TableAction.tsx @@ -84,10 +84,11 @@ export default defineComponent({ const { dropDownActions = [], actions } = props; return (
- {actions?.map((action, index) => { - return renderPopConfirm(action, index); - })} - {dropDownActions?.length && ( + {actions && + actions.map((action, index) => { + return renderPopConfirm(action, index); + })} + {dropDownActions && dropDownActions.length && ( {{ default: dropdownDefaultSLot, diff --git a/src/components/Table/src/components/renderEditableCell.tsx b/src/components/Table/src/components/renderEditableCell.tsx index ea0e1519072b7fe8acf065da6f34a103a8f3769c..ea62e2532dddb2f00e462c93e8d7c86cf3608c67 100644 --- a/src/components/Table/src/components/renderEditableCell.tsx +++ b/src/components/Table/src/components/renderEditableCell.tsx @@ -45,8 +45,8 @@ const EditableCell = defineComponent({ const isEditRef = ref(false); const currentValueRef = ref(props.value); - function handleChange(e: ChangeEvent | string | boolean) { - if (Reflect.has((e as ChangeEvent)?.target, 'value')) { + function handleChange(e: any) { + if (e && e.target && Reflect.has(e.target, 'value')) { currentValueRef.value = (e as ChangeEvent).target.value; } if (isString(e) || isBoolean(e)) { @@ -58,7 +58,7 @@ const EditableCell = defineComponent({ isEditRef.value = true; nextTick(() => { const el = unref(elRef); - el?.focus(); + el && el.focus(); }); } @@ -84,7 +84,7 @@ const EditableCell = defineComponent({ function onClickOutside() { const { component } = props; - if (component?.includes('Input')) { + if (component && component.includes('Input')) { handleCancel(); } } diff --git a/src/components/Table/src/hooks/useDataSource.ts b/src/components/Table/src/hooks/useDataSource.ts index 31e5275bf491b7612c22eebbdf21f5bebcd23ac5..2d86acf22181cd2a8d1435cd91f59b615f9e2f41 100644 --- a/src/components/Table/src/hooks/useDataSource.ts +++ b/src/components/Table/src/hooks/useDataSource.ts @@ -89,7 +89,7 @@ export function useDataSource( pageParams = {}; } else { const { current, pageSize } = unref(getPaginationRef) as PaginationProps; - pageParams[pageField] = opt?.page || current; + pageParams[pageField] = (opt && opt.page) || current; pageParams[sizeField] = pageSize; } diff --git a/src/components/Tinymce/src/Editor.vue b/src/components/Tinymce/src/Editor.vue index e0b9b5f01e10060bb7704cae15132c4fd37d4996..375872e1c639e4b81c1a171d8c64660e0cb6a2b3 100644 --- a/src/components/Tinymce/src/Editor.vue +++ b/src/components/Tinymce/src/Editor.vue @@ -53,13 +53,12 @@ }); const initOptions = computed(() => { - const { height, menubar } = props; + const { height, options } = props; return { selector: `#${unref(tinymceId)}`, height: height, toolbar: toolbar, - theme: 'silver', - menubar: menubar, + menubar: 'file edit insert view format table', plugins: plugins, // 语言包 language_url: 'resource/tinymce/langs/zh_CN.js', @@ -70,6 +69,7 @@ advlist_bullet_styles: 'square', advlist_number_styles: 'default', object_resizing: false, + ...options, setup: (editor: any) => { editorRef.value = editor; editor.on('init', (e: Event) => initSetup(e)); diff --git a/src/components/Tinymce/src/props.ts b/src/components/Tinymce/src/props.ts index 231ae19d7317a3d970f5e2411f52c915a174d1fb..ca07252997ba4b819db28fac7d2b7ab41e0a7f9e 100644 --- a/src/components/Tinymce/src/props.ts +++ b/src/components/Tinymce/src/props.ts @@ -1,9 +1,9 @@ import { PropType } from 'vue'; export const basicProps = { - menubar: { - type: String as PropType, - default: 'file edit insert view format table', + options: { + type: Object as PropType, + default: {}, }, value: { type: String as PropType, diff --git a/src/views/demo/editor/tinymce/index.vue b/src/views/demo/editor/tinymce/index.vue index b3c2e5e5ef85e925d555b2d6d4740b4d504ca6af..b6f131d3819422d4537ad9f48ffe37bb8fe85e69 100644 --- a/src/views/demo/editor/tinymce/index.vue +++ b/src/views/demo/editor/tinymce/index.vue @@ -1,6 +1,5 @@ @@ -15,9 +14,6 @@ function handleChange(value: string) { console.log(value); } - // setTimeout(() => { - // value.value = '1233'; - // }, 5000); return { handleChange, value }; }, }); diff --git a/vite.config.ts b/vite.config.ts index 516d18dae3cf7b814de3cc717a77d3002dca503d..09e012c8e0c57d719cfbffee8281581dbfc27862 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -8,7 +8,6 @@ import { // externals, cdnConf, } from './build/config/vite/cdn'; - import { createProxy } from './build/config/vite/proxy'; import { createMockServer } from 'vite-plugin-mock'; import PurgeIcons from 'vite-plugin-purge-icons';