fix(design,editor,tdesign-vue-next-adapter): tMagicPopover在TDesign下异常

fix #574
This commit is contained in:
roymondchen 2024-03-01 16:30:40 +08:00
parent 1b3c598a66
commit ffc3e57aa1
9 changed files with 156 additions and 154 deletions

View File

@ -18,7 +18,7 @@ defineOptions({
name: 'TMPopover', name: 'TMPopover',
}); });
const props = defineProps<PopoverProps>(); const props = withDefaults(defineProps<PopoverProps>(), { visible: null });
const ui = getConfig('components')?.popover; const ui = getConfig('components')?.popover;

View File

@ -228,6 +228,7 @@ export interface PopoverProps {
content?: string; content?: string;
disabled?: boolean; disabled?: boolean;
popperClass?: string; popperClass?: string;
visible?: boolean | null;
} }
export interface RadioProps { export interface RadioProps {

View File

@ -1,88 +1,96 @@
.ui-component-panel.tmagic-design-collapse { .ui-component-panel {
height: 100%; &.tmagic-design-collapse {
border-top: 0 !important; height: 100%;
margin-top: 48px; border-top: 0 !important;
background-color: $--sidebar-content-background-color; margin-top: 48px;
background-color: $--sidebar-content-background-color;
.tmagic-design-collapse-item { .tmagic-design-collapse-item {
> div:first-of-type { > div:first-of-type {
border-bottom: 1px solid $--border-color; border-bottom: 1px solid $--border-color;
margin-bottom: 10px; margin-bottom: 10px;
} }
}
.el-collapse-item__header,
.t-collapse-panel__header {
background: $--sidebar-content-background-color;
color: $--font-color;
height: 25px;
line-height: 25px;
padding-left: 10px;
font-size: 12px;
i {
margin-right: 5px;
font-size: 14px;
}
}
.el-collapse-item__wrap,
.t-collapse-panel__body {
background: $--sidebar-content-background-color;
border-bottom: 0;
.el-collapse-item__content,
.t-collapse-panel__content {
padding: 10px;
display: flex;
flex-wrap: wrap;
} }
.component-item { .el-collapse-item__header,
display: flex; .t-collapse-panel__header {
overflow: hidden; background: $--sidebar-content-background-color;
text-overflow: ellipsis;
margin: 5px 10px;
box-sizing: border-box;
color: $--font-color; color: $--font-color;
flex-direction: column; height: 25px;
width: 42px; line-height: 25px;
cursor: pointer; padding-left: 10px;
font-size: 12px;
i { i {
font-size: 20px; margin-right: 5px;
background: #fff; font-size: 14px;
height: 40px; }
width: 40px; }
line-height: 40px;
border-radius: 5px; .el-collapse-item__wrap,
color: #909090; .t-collapse-panel__body {
border: 1px solid $--border-color; background: $--sidebar-content-background-color;
border-bottom: 0;
.el-collapse-item__content,
.t-collapse-panel__content {
padding: 10px;
display: flex; display: flex;
justify-content: space-evenly; flex-wrap: wrap;
align-items: center; }
margin-bottom: 5px;
&:hover { .component-item {
background: #2882e0; display: flex;
color: #fff; overflow: hidden;
border-color: #4e8be1; text-overflow: ellipsis;
margin: 5px 10px;
box-sizing: border-box;
color: $--font-color;
flex-direction: column;
width: 42px;
cursor: pointer;
i {
font-size: 20px;
background: #fff;
height: 40px;
width: 40px;
line-height: 40px;
border-radius: 5px;
color: #909090;
border: 1px solid $--border-color;
display: flex;
justify-content: space-evenly;
align-items: center;
margin-bottom: 5px;
&:hover {
background: #2882e0;
color: #fff;
border-color: #4e8be1;
}
} }
}
span { span {
font-size: 12px; font-size: 12px;
text-align: center; text-align: center;
} }
.el-tooltip { .el-tooltip {
width: 50px; width: 50px;
height: 30px; height: 30px;
line-height: 15px; line-height: 15px;
display: block; display: block;
white-space: normal; white-space: normal;
margin: 0; margin: 0;
}
} }
} }
} }
.t-collapse {
margin-top: 0;
padding-top: 48px;
position: relative;
}
} }

View File

@ -1,5 +1,6 @@
.m-editor-layer-panel { .m-editor-layer-panel {
background: $--sidebar-content-background-color; background: $--sidebar-content-background-color;
position: relative;
.m-editor-tree { .m-editor-tree {
padding-top: 48px; padding-top: 48px;

View File

@ -38,12 +38,12 @@
], ],
"dependencies": { "dependencies": {
"@tmagic/design": "1.3.15", "@tmagic/design": "1.3.15",
"tdesign-vue-next": "^1.3.4", "tdesign-vue-next": "^1.8.1",
"vue": "^3.3.8" "vue": "^3.3.8"
}, },
"peerDependencies": { "peerDependencies": {
"@tmagic/design": "1.3.15", "@tmagic/design": "1.3.15",
"tdesign-vue-next": "^1.3.4", "tdesign-vue-next": "^1.8.1",
"vue": "^3.3.8" "vue": "^3.3.8"
}, },
"devDependencies": { "devDependencies": {

View File

@ -0,0 +1,27 @@
<template>
<TPopup
:placement="placement"
:trigger="trigger"
:disabled="disabled"
:visible="visible"
:overlayClassName="popperClass"
>
<slot name="reference"></slot>
<template #content>
<slot></slot>
</template>
</TPopup>
</template>
<script setup lang="ts">
import { computed } from 'vue';
import { Popup as TPopup, type PopupPlacement } from 'tdesign-vue-next';
import type { PopoverProps } from '@tmagic/design';
const props = defineProps<PopoverProps>();
const placement = computed(() => props.placement as PopupPlacement);
const trigger = computed(() => props.trigger as 'click' | 'focus' | 'mousedown' | 'context-menu' | 'hover');
</script>

View File

@ -23,7 +23,6 @@ import {
Option as TOption, Option as TOption,
OptionGroup as TOptionGroup, OptionGroup as TOptionGroup,
Pagination as TPagination, Pagination as TPagination,
Popup as TPopup,
Radio as TRadio, Radio as TRadio,
RadioButton as TRadioButton, RadioButton as TRadioButton,
RadioGroup as TRadioGroup, RadioGroup as TRadioGroup,
@ -87,7 +86,7 @@ import type {
import DatePicker from './DatePicker.vue'; import DatePicker from './DatePicker.vue';
import Icon from './Icon.vue'; import Icon from './Icon.vue';
import Input from './Input.vue'; import Input from './Input.vue';
import { vLoading } from './loading'; import Popover from './Popover.vue';
import Scrollbar from './Scrollbar.vue'; import Scrollbar from './Scrollbar.vue';
import TableColumn from './TableColumn.vue'; import TableColumn from './TableColumn.vue';
import Tree from './Tree.vue'; import Tree from './Tree.vue';
@ -109,7 +108,6 @@ const adapter: any = {
console.log(msg); console.log(msg);
}, },
}, },
loading: vLoading,
components: { components: {
badge: { badge: {
component: TBadge, component: TBadge,
@ -240,7 +238,7 @@ const adapter: any = {
component: TDrawer, component: TDrawer,
props: (props: DrawerProps) => ({ props: (props: DrawerProps) => ({
visible: props.modelValue, visible: props.modelValue,
size: props.size, size: typeof props.size === 'number' ? `${props.size}px` : props.size,
closeOnEscKeydown: props.closeOnPressEscape, closeOnEscKeydown: props.closeOnPressEscape,
closeOnOverlayClick: props.closeOnClickModal, closeOnOverlayClick: props.closeOnClickModal,
attach: props.appendToBody ? 'body' : undefined, attach: props.appendToBody ? 'body' : undefined,
@ -352,14 +350,8 @@ const adapter: any = {
}, },
popover: { popover: {
component: TPopup, component: Popover,
props: (props: PopoverProps) => ({ props: (props: PopoverProps) => props,
placement: props.placement,
trigger: props.trigger,
content: props.content,
disabled: props.disabled,
overlayClassName: props.popperClass,
}),
}, },
radio: { radio: {
@ -486,6 +478,7 @@ const adapter: any = {
tooltip: { tooltip: {
component: TTooltip, component: TTooltip,
props: (props: TooltipProps) => ({ props: (props: TooltipProps) => ({
...props,
placement: props.placement, placement: props.placement,
content: props.content, content: props.content,
}), }),

View File

@ -1,45 +0,0 @@
import type { Directive } from 'vue';
import { LoadingInstance, LoadingPlugin } from 'tdesign-vue-next';
export type LoadingBinding = boolean;
const INSTANCE_KEY = Symbol('TdesignLoading');
export interface ElementLoading extends HTMLElement {
[INSTANCE_KEY]?: {
instance: LoadingInstance;
};
}
const createInstance = (el: ElementLoading) =>
(el[INSTANCE_KEY] = {
instance: LoadingPlugin({
attach: () => el,
showOverlay: true,
size: '20px',
}),
});
export const vLoading: Directive<ElementLoading, LoadingBinding> = {
mounted(el, binding) {
const { value } = binding;
if (value) {
createInstance(el);
}
},
updated(el, binding) {
const instance = el[INSTANCE_KEY];
if (binding.oldValue !== binding.value) {
if (binding.value && !binding.oldValue) {
createInstance(el);
} else {
instance?.instance.hide();
}
}
},
unmounted(el) {
el[INSTANCE_KEY]?.instance.hide();
},
};

59
pnpm-lock.yaml generated
View File

@ -595,8 +595,8 @@ importers:
specifier: 1.3.15 specifier: 1.3.15
version: link:../design version: link:../design
tdesign-vue-next: tdesign-vue-next:
specifier: ^1.3.4 specifier: ^1.8.1
version: 1.3.4(vue@3.3.8) version: 1.8.1(vue@3.3.8)
vue: vue:
specifier: ^3.3.8 specifier: ^3.3.8
version: 3.3.8(typescript@5.0.4) version: 3.3.8(typescript@5.0.4)
@ -3527,6 +3527,14 @@ packages:
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
regenerator-runtime: 0.13.11 regenerator-runtime: 0.13.11
dev: true
/@babel/runtime@7.24.0:
resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.0
dev: false
/@babel/template@7.20.7: /@babel/template@7.20.7:
resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
@ -4461,8 +4469,8 @@ packages:
fastq: 1.15.0 fastq: 1.15.0
dev: true dev: true
/@popperjs/core@2.11.7: /@popperjs/core@2.11.8:
resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==} resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
dev: false dev: false
/@rollup/pluginutils@4.2.1: /@rollup/pluginutils@4.2.1:
@ -4836,6 +4844,11 @@ packages:
/@types/sortablejs@1.10.7: /@types/sortablejs@1.10.7:
resolution: {integrity: sha512-lGCwwgpj8zW/ZmaueoPVSP7nnc9t8VqVWXS+ASX3eoUUENmiazv0rlXyTRludXzuX9ALjPsMqBu85TgJNWbTOg==} resolution: {integrity: sha512-lGCwwgpj8zW/ZmaueoPVSP7nnc9t8VqVWXS+ASX3eoUUENmiazv0rlXyTRludXzuX9ALjPsMqBu85TgJNWbTOg==}
dev: true
/@types/sortablejs@1.15.8:
resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==}
dev: false
/@types/tinycolor2@1.4.3: /@types/tinycolor2@1.4.3:
resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==} resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==}
@ -4845,8 +4858,8 @@ packages:
resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
dev: true dev: true
/@types/validator@13.7.14: /@types/validator@13.11.9:
resolution: {integrity: sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g==} resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==}
dev: false dev: false
/@types/web-bluetooth@0.0.16: /@types/web-bluetooth@0.0.16:
@ -6513,6 +6526,10 @@ packages:
whatwg-url: 11.0.0 whatwg-url: 11.0.0
dev: true dev: true
/dayjs@1.11.10:
resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
dev: false
/dayjs@1.11.4: /dayjs@1.11.4:
resolution: {integrity: sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==} resolution: {integrity: sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==}
@ -8861,8 +8878,8 @@ packages:
resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==}
dev: true dev: true
/mitt@3.0.0: /mitt@3.0.1:
resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
dev: false dev: false
/mlly@1.2.0: /mlly@1.2.0:
@ -9630,10 +9647,10 @@ packages:
/regenerator-runtime@0.13.11: /regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
dev: true
/regenerator-runtime@0.14.0: /regenerator-runtime@0.14.0:
resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
dev: true
/regenerator-transform@0.15.1: /regenerator-transform@0.15.1:
resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==}
@ -10242,31 +10259,31 @@ packages:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
dev: true dev: true
/tdesign-icons-vue-next@0.1.8(vue@3.3.8): /tdesign-icons-vue-next@0.2.2(vue@3.3.8):
resolution: {integrity: sha512-ssI/KJHlhUMYbf+dk+7Ab3LQbWc5wJBjWF9GaGZWPlMU0Yhui9oa2Dvm97Pbx8Ba6drTEDKwfmtJV2R4V6e84Q==} resolution: {integrity: sha512-ZKleBME7ZF1IVgnRXmIBPjfNa2Mef1nrK56f2xwn1Aa5mvXxB3fSxEzwhObR7bhzf/K42mz/Knnbll5Y7vCBjg==}
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
dependencies: dependencies:
'@babel/runtime': 7.21.0 '@babel/runtime': 7.24.0
vue: 3.3.8(typescript@5.0.4) vue: 3.3.8(typescript@5.0.4)
dev: false dev: false
/tdesign-vue-next@1.3.4(vue@3.3.8): /tdesign-vue-next@1.8.1(vue@3.3.8):
resolution: {integrity: sha512-6rCEvH4JQoKJZH7MWhF+i1cFBa+GybuulHI4/Wto4GWjeTNG+OnJwjYD3ZLcpGZHuVadP01/oYOFbMZoOQlllg==} resolution: {integrity: sha512-L8aP89pRV1nr3Tjedr6DqEtSGZghrzNx75En/owkUSjjiyU5oqeVIq/9JPvArNeJQCnmxcDwxYxBf+mRfjmrHg==}
peerDependencies: peerDependencies:
vue: '>=3.1.0' vue: '>=3.1.0'
dependencies: dependencies:
'@babel/runtime': 7.21.0 '@babel/runtime': 7.24.0
'@popperjs/core': 2.11.7 '@popperjs/core': 2.11.8
'@types/lodash': 4.14.182 '@types/lodash': 4.14.182
'@types/sortablejs': 1.10.7 '@types/sortablejs': 1.15.8
'@types/tinycolor2': 1.4.3 '@types/tinycolor2': 1.4.3
'@types/validator': 13.7.14 '@types/validator': 13.11.9
dayjs: 1.11.4 dayjs: 1.11.10
lodash: 4.17.21 lodash: 4.17.21
mitt: 3.0.0 mitt: 3.0.1
sortablejs: 1.15.0 sortablejs: 1.15.0
tdesign-icons-vue-next: 0.1.8(vue@3.3.8) tdesign-icons-vue-next: 0.2.2(vue@3.3.8)
tinycolor2: 1.6.0 tinycolor2: 1.6.0
validator: 13.9.0 validator: 13.9.0
vue: 3.3.8(typescript@5.0.4) vue: 3.3.8(typescript@5.0.4)