From a5127f3c1bbc7b340f2799ef4bd953da509440c9 Mon Sep 17 00:00:00 2001 From: EditorWang Date: Sat, 16 Oct 2021 13:35:42 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix(panel):=20=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E6=97=A0=E6=B3=95=E5=8A=A8=E6=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devui/panel/__tests__/panel.spec.ts | 207 ++++++++++++++++++++++++++++ devui/panel/src/body/panel-body.tsx | 9 +- devui/panel/src/panel.tsx | 17 +-- docs/components/panel/index.md | 10 +- 4 files changed, 221 insertions(+), 22 deletions(-) create mode 100644 devui/panel/__tests__/panel.spec.ts diff --git a/devui/panel/__tests__/panel.spec.ts b/devui/panel/__tests__/panel.spec.ts new file mode 100644 index 00000000..e98aad80 --- /dev/null +++ b/devui/panel/__tests__/panel.spec.ts @@ -0,0 +1,207 @@ +import { shallowMount,mount } from "@vue/test-utils"; +import {ref,nextTick,Transition } from 'vue'; +import DButton from '../../button/index'; +import DPanel from '../src/panel' +import DPanelHeader from '../src/header/panel-header'; +import DPanelBody from '../src/body/panel-body'; +import DPanelFooter from '../src/foot/panel-footer'; + + +describe('DPanel',()=>{ + + // 渲染测试 + it('Render',()=>{ + // except(wrapper.html()) + let wrapper = mount({ + components:{ + DPanel, + DPanelBody, + DPanelHeader, + DPanelFooter, + DButton + }, + template: ` + + + Panel with foldable + + + This is body + + +

+ + {{ panelToggle ? '阻止折叠' : '允许折叠' }} + + `, + setup(){ + let isCollapsed = ref(true); + let panelToggle = ref(false); + let toggle = ref(true); + let leftPadding = ref(true); + let showAnimation = ref(true); + let state; + const handleToggle = (e) => toggle.value = e; + const beforeToggle = () => panelToggle.value; + return { + state, + toggle, + panelToggle, + beforeToggle, + isCollapsed, + handleToggle, + leftPadding, + showAnimation + } + } + }); + expect(wrapper.html()).toContain('
This is body
'); + }) + + it('isCollapsed', async ()=>{ + let wrapper = mount({ + components:{ + DPanel, + DPanelBody, + DPanelHeader, + DPanelFooter, + DButton + }, + template: ` + + + Panel with foldable + + + This is body + + +

+ + 切换LeftPadding + + `, + setup(){ + let isCollapsed = ref(false); + let panelToggle = ref(false); + let toggle = ref(true); + let leftPadding = ref(false); + let showAnimation = ref(true); + let state; + const handleToggle = (e) => toggle.value = e; + const beforeToggle = () => panelToggle.value; + return { + state, + toggle, + panelToggle, + beforeToggle, + isCollapsed, + handleToggle, + leftPadding, + showAnimation + } + } + }); + expect(wrapper.find(`.devui-panel-default`).element.children[0].innerHTML).toBe('') + }) + // 动态hasLeftPadding 测试 + it('padding-dynamic', async ()=>{ + let wrapper = mount({ + components:{ + DPanel, + DPanelBody, + DPanelHeader, + DPanelFooter, + DButton + }, + template: ` + + + Panel with foldable + + + This is body + + +

+ + 切换LeftPadding + + `, + setup(){ + let isCollapsed = ref(true); + let panelToggle = ref(false); + let toggle = ref(true); + let leftPadding = ref(false); + let showAnimation = ref(true); + let state; + const handleToggle = (e) => toggle.value = e; + const beforeToggle = () => panelToggle.value; + return { + state, + toggle, + panelToggle, + beforeToggle, + isCollapsed, + handleToggle, + leftPadding, + showAnimation + } + } + }); + expect(wrapper.find('.devui-panel-body-collapse').classes().length).toBe(3); + await wrapper.find('button').trigger('click'); + expect(wrapper.find('.devui-panel-body-collapse').classes().length).toBe(2); + }) + + // 动态beforeToggle 测试 + it('beforeToggle-dynamic',async ()=>{ + let wrapper = mount({ + components:{ + DPanel, + DPanelBody, + DPanelHeader, + DPanelFooter, + DButton + }, + template: ` + + + Panel with foldable + + + This is body + + +

+ + {{ panelToggle ? '阻止折叠' : '允许折叠' }} + + `, + setup(){ + let isCollapsed = ref(true); + let panelToggle = ref(false); + let toggle = ref(true); + let leftPadding = ref(false); + let showAnimation = ref(true); + let state; + const handleToggle = (e) => toggle.value = e; + const beforeToggle = () => panelToggle.value; + return { + state, + toggle, + panelToggle, + beforeToggle, + isCollapsed, + handleToggle, + leftPadding, + showAnimation + } + } + }); + await wrapper.find('button').trigger('click'); + expect(wrapper.vm.panelToggle).toBe(true); + await wrapper.find('button').trigger('click'); + expect(wrapper.vm.panelToggle).toBe(false); + }) +}); \ No newline at end of file diff --git a/devui/panel/src/body/panel-body.tsx b/devui/panel/src/body/panel-body.tsx index 84a64108..e9cbabd8 100644 --- a/devui/panel/src/body/panel-body.tsx +++ b/devui/panel/src/body/panel-body.tsx @@ -6,8 +6,8 @@ export default defineComponent({ name: 'DPanelBody', props:PanelProps, setup(props,ctx){ - const animationName = inject('showAnimation') ? 'devui-panel' : ''; - const hasLeftPadding = !inject('hasLeftPadding') ? 'no-left-padding' : ''; + let animationName = inject('showAnimation'); + let hasLeftPadding = inject('hasLeftPadding') const keys = Object.keys(Store.state()); const key = keys.pop(); @@ -34,13 +34,12 @@ export default defineComponent({ const el = (element as HTMLElement); el.style.height = '0px'; } - return () => { return (
- + {isCollapsed[key] === undefined || isCollapsed[key] ? -
+
{ctx.slots.default?.()}
diff --git a/devui/panel/src/panel.tsx b/devui/panel/src/panel.tsx index 741ebcf5..56460bb4 100644 --- a/devui/panel/src/panel.tsx +++ b/devui/panel/src/panel.tsx @@ -1,4 +1,4 @@ -import { defineComponent, ref, Transition, onMounted, provide } from 'vue'; +import { defineComponent, ref, provide, computed} from 'vue'; import './panel.scss'; import { PanelProps } from './panel.type'; import Store from './store/store'; @@ -8,29 +8,20 @@ export default defineComponent({ props: PanelProps, setup(props, ctx) { provide('beforeToggle', props.beforeToggle); - provide('showAnimation', props.showAnimation); - provide('hasLeftPadding', props.hasLeftPadding); + provide('showAnimation', computed(()=>props.showAnimation)); + provide('hasLeftPadding', computed(()=>props.hasLeftPadding)); const isCollapsed = ref(props.isCollapsed); - const bodyEl = ref(); const onToggle = ()=> { props.toggle?.(Store.getByKey(`isCollapsed[${timeStamp}]`)) }; - onMounted(() => { - if(bodyEl.value) { - const dom = bodyEl.value; - if(isCollapsed.value) - dom.style.height = `${dom.offsetHeight}px`; - } - }) - const timeStamp = new Date().getTime().toString(); Store.setData(`isCollapsed[${timeStamp}]`, isCollapsed.value); return () => { return (
- {ctx.slots.default()} + {ctx.slots.default?.()}
) } diff --git a/docs/components/panel/index.md b/docs/components/panel/index.md index aeae65aa..0f7b2162 100644 --- a/docs/components/panel/index.md +++ b/docs/components/panel/index.md @@ -87,7 +87,7 @@ export default defineComponent({ :::demo ```vue