refactor(drawer): update
parent
0c31ada67a
commit
85ce6b6e24
|
@ -38,14 +38,14 @@ const MultiDrawer = {
|
||||||
width: 520,
|
width: 520,
|
||||||
visible: this.visible,
|
visible: this.visible,
|
||||||
getContainer: false,
|
getContainer: false,
|
||||||
wrapClassName: 'test_drawer',
|
className: 'test_drawer',
|
||||||
placement: this.placement,
|
placement: this.placement,
|
||||||
onClose: this.onClose,
|
onClose: this.onClose,
|
||||||
};
|
};
|
||||||
const childrenDrawerProps = {
|
const childrenDrawerProps = {
|
||||||
title: 'Two-level Drawer',
|
title: 'Two-level Drawer',
|
||||||
width: 320,
|
width: 320,
|
||||||
wrapClassName: 'Two-level',
|
className: 'Two-level',
|
||||||
visible: this.childrenDrawer,
|
visible: this.childrenDrawer,
|
||||||
getContainer: false,
|
getContainer: false,
|
||||||
placement: this.placement,
|
placement: this.placement,
|
||||||
|
@ -112,7 +112,7 @@ describe('Drawer', () => {
|
||||||
wrapper.find('#open_two_drawer').trigger('click');
|
wrapper.find('#open_two_drawer').trigger('click');
|
||||||
}, 0);
|
}, 0);
|
||||||
await asyncExpect(() => {
|
await asyncExpect(() => {
|
||||||
const translateX = wrapper.find('.ant-drawer.test_drawer').element.style.transform;
|
const translateX = wrapper.find('.test_drawer').find('.ant-drawer').element.style.transform;
|
||||||
expect(translateX).toEqual('translateX(-180px)');
|
expect(translateX).toEqual('translateX(-180px)');
|
||||||
expect(wrapper.find('#two_drawer_text').exists()).toBe(true);
|
expect(wrapper.find('#two_drawer_text').exists()).toBe(true);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
@ -133,7 +133,7 @@ describe('Drawer', () => {
|
||||||
wrapper.find('#open_two_drawer').trigger('click');
|
wrapper.find('#open_two_drawer').trigger('click');
|
||||||
}, 0);
|
}, 0);
|
||||||
await asyncExpect(() => {
|
await asyncExpect(() => {
|
||||||
const translateX = wrapper.find('.ant-drawer.test_drawer').element.style.transform;
|
const translateX = wrapper.find('.test_drawer').find('.ant-drawer').element.style.transform;
|
||||||
expect(translateX).toEqual('translateX(180px)');
|
expect(translateX).toEqual('translateX(180px)');
|
||||||
expect(wrapper.find('#two_drawer_text').exists()).toBe(true);
|
expect(wrapper.find('#two_drawer_text').exists()).toBe(true);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
@ -153,7 +153,7 @@ describe('Drawer', () => {
|
||||||
wrapper.find('#open_two_drawer').trigger('click');
|
wrapper.find('#open_two_drawer').trigger('click');
|
||||||
}, 0);
|
}, 0);
|
||||||
await asyncExpect(() => {
|
await asyncExpect(() => {
|
||||||
const translateY = wrapper.find('.ant-drawer.test_drawer').element.style.transform;
|
const translateY = wrapper.find('.test_drawer').find('.ant-drawer').element.style.transform;
|
||||||
expect(translateY).toEqual('translateY(180px)');
|
expect(translateY).toEqual('translateY(180px)');
|
||||||
expect(wrapper.find('#two_drawer_text').exists()).toBe(true);
|
expect(wrapper.find('#two_drawer_text').exists()).toBe(true);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
|
@ -1,111 +1,123 @@
|
||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
exports[`Drawer class is test_drawer 1`] = `
|
exports[`Drawer class is test_drawer 1`] = `
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-right test_drawer" tabindex="-1">
|
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 256px;">
|
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 378px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body">
|
<div class="ant-drawer-wrapper-body">
|
||||||
<div class="ant-drawer-header-no-title">
|
<div class="ant-drawer-header ant-drawer-header-close-only">
|
||||||
<!----><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
<div class="ant-drawer-header-title"><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
||||||
</div>
|
<!---->
|
||||||
<div class="ant-drawer-body">Here is content of Drawer</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ant-drawer-body">Here is content of Drawer</div>
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Drawer closable is false 1`] = `
|
exports[`Drawer closable is false 1`] = `
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
<div class="ant-drawer ant-drawer-right ant-drawer-open" tabindex="-1">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 256px;">
|
<div class="ant-drawer-content-wrapper" style="width: 378px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body">
|
<div class="ant-drawer-wrapper-body">
|
||||||
<!---->
|
<!---->
|
||||||
<div class="ant-drawer-body">Here is content of Drawer</div>
|
<div class="ant-drawer-body">Here is content of Drawer</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Drawer destroyOnClose is true 1`] = `
|
exports[`Drawer destroyOnClose is true 1`] = `
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 256px;">
|
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 378px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body" style="opacity: 0; transition: opacity .3s;">
|
<div class="ant-drawer-wrapper-body" style="opacity: 0; transition: opacity .3s;">
|
||||||
<!---->
|
<!---->
|
||||||
<div class="ant-drawer-body">Here is content of Drawer</div>
|
<div class="ant-drawer-body">Here is content of Drawer</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Drawer have a title 1`] = `
|
exports[`Drawer have a title 1`] = `
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
<div class="ant-drawer ant-drawer-right ant-drawer-open" tabindex="-1">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 256px;">
|
<div class="ant-drawer-content-wrapper" style="width: 378px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body">
|
<div class="ant-drawer-wrapper-body">
|
||||||
<div class="ant-drawer-header">
|
<div class="ant-drawer-header">
|
||||||
<div class="ant-drawer-title">Test Title</div><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
<div class="ant-drawer-header-title"><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
||||||
</div>
|
<div class="ant-drawer-title">Test Title</div>
|
||||||
<div class="ant-drawer-body">Here is content of Drawer</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ant-drawer-body">Here is content of Drawer</div>
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Drawer render correctly 1`] = `
|
exports[`Drawer render correctly 1`] = `
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
<div class="ant-drawer ant-drawer-right ant-drawer-open" tabindex="-1">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 400px;">
|
<div class="ant-drawer-content-wrapper" style="width: 400px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body">
|
<div class="ant-drawer-wrapper-body">
|
||||||
<div class="ant-drawer-header-no-title">
|
<div class="ant-drawer-header ant-drawer-header-close-only">
|
||||||
<!----><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
<div class="ant-drawer-header-title"><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
||||||
</div>
|
<!---->
|
||||||
<div class="ant-drawer-body">Here is content of Drawer</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ant-drawer-body">Here is content of Drawer</div>
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Drawer render top drawer 1`] = `
|
exports[`Drawer render top drawer 1`] = `
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-top" tabindex="-1">
|
<div class="ant-drawer ant-drawer-top ant-drawer-open" tabindex="-1">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateY(-100%); height: 400px;">
|
<div class="ant-drawer-content-wrapper" style="height: 400px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body">
|
<div class="ant-drawer-wrapper-body">
|
||||||
<div class="ant-drawer-header-no-title">
|
<div class="ant-drawer-header ant-drawer-header-close-only">
|
||||||
<!----><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
<div class="ant-drawer-header-title"><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
||||||
</div>
|
<!---->
|
||||||
<div class="ant-drawer-body">Here is content of Drawer</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ant-drawer-body">Here is content of Drawer</div>
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -4,20 +4,23 @@ exports[`Drawer render correctly 1`] = `
|
||||||
<div><button class="ant-btn" type="button" ant-click-animating-without-extra-node="false">
|
<div><button class="ant-btn" type="button" ant-click-animating-without-extra-node="false">
|
||||||
<!----><span>open</span>
|
<!----><span>open</span>
|
||||||
</button>
|
</button>
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
<div class="ant-drawer ant-drawer-right" tabindex="-1">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 256px;">
|
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 378px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body">
|
<div class="ant-drawer-wrapper-body">
|
||||||
<div class="ant-drawer-header-no-title">
|
<div class="ant-drawer-header ant-drawer-header-close-only">
|
||||||
<!----><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
<div class="ant-drawer-header-title"><button aria-label="Close" class="ant-drawer-close"><span role="img" aria-label="close" class="anticon anticon-close"><svg focusable="false" class="" data-icon="close" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><path d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"></path></svg></span></button>
|
||||||
</div>
|
<!---->
|
||||||
<div class="ant-drawer-body">Here is content of Drawer</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ant-drawer-body">Here is content of Drawer</div>
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -7,6 +7,13 @@ exports[`renders ./components/drawer/demo/basic.vue correctly 1`] = `
|
||||||
<!---->
|
<!---->
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`renders ./components/drawer/demo/extra.vue correctly 1`] = `
|
||||||
|
<div class="ant-radio-group ant-radio-group-outline ant-radio-group-default" style="margin-right: 8px;"><label class="ant-radio-wrapper"><span class="ant-radio"><input type="radio" class="ant-radio-input" value="top"><span class="ant-radio-inner"></span></span><span>top</span></label><label class="ant-radio-wrapper"><span class="ant-radio"><input type="radio" class="ant-radio-input" value="right"><span class="ant-radio-inner"></span></span><span>right</span></label><label class="ant-radio-wrapper"><span class="ant-radio"><input type="radio" class="ant-radio-input" value="bottom"><span class="ant-radio-inner"></span></span><span>bottom</span></label><label class="ant-radio-wrapper ant-radio-wrapper-checked"><span class="ant-radio ant-radio-checked"><input type="radio" class="ant-radio-input" value="left"><span class="ant-radio-inner"></span></span><span>left</span></label></div><button class="ant-btn ant-btn-primary" type="button">
|
||||||
|
<!----><span>Open</span>
|
||||||
|
</button>
|
||||||
|
<!---->
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`renders ./components/drawer/demo/form-in-drawer.vue correctly 1`] = `
|
exports[`renders ./components/drawer/demo/form-in-drawer.vue correctly 1`] = `
|
||||||
<button class="ant-btn ant-btn-primary" type="button">
|
<button class="ant-btn ant-btn-primary" type="button">
|
||||||
<!----><span role="img" aria-label="plus" class="anticon anticon-plus"><svg focusable="false" class="" data-icon="plus" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><defs><style></style></defs><path d="M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"></path><path d="M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z"></path></svg></span><span>New account</span>
|
<!----><span role="img" aria-label="plus" class="anticon anticon-plus"><svg focusable="false" class="" data-icon="plus" width="1em" height="1em" fill="currentColor" aria-hidden="true" viewBox="64 64 896 896"><defs><style></style></defs><path d="M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"></path><path d="M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z"></path></svg></span><span>New account</span>
|
||||||
|
@ -32,28 +39,40 @@ exports[`renders ./components/drawer/demo/render-in-current.vue correctly 1`] =
|
||||||
<div style="height: 200px; overflow: hidden; position: relative; border: 1px solid #ebedf0; border-radius: 2px; padding: 48px; text-align: center; background: rgb(250, 250, 250); width: 100%;"> Render in this <div style="margin-top: 16px;"><button class="ant-btn ant-btn-primary" type="button">
|
<div style="height: 200px; overflow: hidden; position: relative; border: 1px solid #ebedf0; border-radius: 2px; padding: 48px; text-align: center; background: rgb(250, 250, 250); width: 100%;"> Render in this <div style="margin-top: 16px;"><button class="ant-btn ant-btn-primary" type="button">
|
||||||
<!----><span>Open</span>
|
<!----><span>Open</span>
|
||||||
</button></div>
|
</button></div>
|
||||||
<div class="">
|
<div>
|
||||||
<div class="ant-drawer ant-drawer-right" style="position: absolute;" tabindex="-1">
|
<div class="ant-drawer ant-drawer-right" tabindex="-1" style="position: absolute;">
|
||||||
<div class="ant-drawer-mask"></div>
|
<div class="ant-drawer-mask"></div>
|
||||||
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 256px;">
|
<div class="ant-drawer-content-wrapper" style="transform: translateX(100%); width: 378px;">
|
||||||
<div class="ant-drawer-content">
|
<div class="ant-drawer-content">
|
||||||
<div class="ant-drawer-wrapper-body">
|
<div class="ant-drawer-wrapper-body">
|
||||||
<div class="ant-drawer-header">
|
<div class="ant-drawer-header">
|
||||||
|
<div class="ant-drawer-header-title">
|
||||||
|
<!---->
|
||||||
<div class="ant-drawer-title">Basic Drawer</div>
|
<div class="ant-drawer-title">Basic Drawer</div>
|
||||||
|
</div>
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
<div class="ant-drawer-body">
|
<div class="ant-drawer-body">
|
||||||
<p>Some contents...</p>
|
<p>Some contents...</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!---->
|
<!---->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`renders ./components/drawer/demo/size.vue correctly 1`] = `
|
||||||
|
<button class="ant-btn ant-btn-primary" type="button">
|
||||||
|
<!----><span>Open Default Size (378px)</span>
|
||||||
|
</button><button class="ant-btn ant-btn-primary" type="button">
|
||||||
|
<!----><span>Open Large Size (736px)</span>
|
||||||
|
</button>
|
||||||
|
<!---->
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`renders ./components/drawer/demo/user-profile.vue correctly 1`] = `
|
exports[`renders ./components/drawer/demo/user-profile.vue correctly 1`] = `
|
||||||
<div class="ant-list ant-list-split ant-list-bordered">
|
<div class="ant-list ant-list-split ant-list-bordered">
|
||||||
<!---->
|
<!---->
|
||||||
|
|
|
@ -37,19 +37,19 @@ Open a new drawer on top of an existing drawer to handle multi branch tasks.
|
||||||
<template>
|
<template>
|
||||||
<a-button type="primary" @click="showDrawer">Open</a-button>
|
<a-button type="primary" @click="showDrawer">Open</a-button>
|
||||||
<a-drawer
|
<a-drawer
|
||||||
|
v-model:visible="visible"
|
||||||
title="Multi-level drawer"
|
title="Multi-level drawer"
|
||||||
width="520"
|
width="520"
|
||||||
:closable="false"
|
:closable="false"
|
||||||
v-model:visible="visible"
|
|
||||||
:footer-style="{ textAlign: 'right' }"
|
:footer-style="{ textAlign: 'right' }"
|
||||||
@close="onClose"
|
@close="onClose"
|
||||||
>
|
>
|
||||||
<a-button type="primary" @click="showChildrenDrawer">Two-level drawer</a-button>
|
<a-button type="primary" @click="showChildrenDrawer">Two-level drawer</a-button>
|
||||||
<a-drawer
|
<a-drawer
|
||||||
|
v-model:visible="childrenDrawer"
|
||||||
title="Two-level Drawer"
|
title="Two-level Drawer"
|
||||||
width="320"
|
width="320"
|
||||||
:closable="false"
|
:closable="false"
|
||||||
v-model:visible="childrenDrawer"
|
|
||||||
>
|
>
|
||||||
<a-button type="primary" @click="showChildrenDrawer">This is two-level drawer</a-button>
|
<a-button type="primary" @click="showChildrenDrawer">This is two-level drawer</a-button>
|
||||||
</a-drawer>
|
</a-drawer>
|
||||||
|
|
|
@ -1,620 +0,0 @@
|
||||||
import classnames from '../../_util/classNames';
|
|
||||||
import { Teleport, nextTick, defineComponent } from 'vue';
|
|
||||||
import BaseMixin from '../../_util/BaseMixin';
|
|
||||||
import { initDefaultProps, getSlot } from '../../_util/props-util';
|
|
||||||
import getScrollBarSize from '../../_util/getScrollBarSize';
|
|
||||||
import { IDrawerProps } from './IDrawerPropTypes';
|
|
||||||
import KeyCode from '../../_util/KeyCode';
|
|
||||||
import {
|
|
||||||
dataToArray,
|
|
||||||
transitionEnd,
|
|
||||||
transitionStr,
|
|
||||||
addEventListener,
|
|
||||||
removeEventListener,
|
|
||||||
transformArguments,
|
|
||||||
isNumeric,
|
|
||||||
} from './utils';
|
|
||||||
import supportsPassive from '../../_util/supportsPassive';
|
|
||||||
import { cloneElement } from '../../_util/vnode';
|
|
||||||
|
|
||||||
function noop() {}
|
|
||||||
|
|
||||||
const currentDrawer = {};
|
|
||||||
const windowIsUndefined = !(
|
|
||||||
typeof window !== 'undefined' &&
|
|
||||||
window.document &&
|
|
||||||
window.document.createElement
|
|
||||||
);
|
|
||||||
|
|
||||||
const Drawer = defineComponent({
|
|
||||||
name: 'Drawer',
|
|
||||||
mixins: [BaseMixin],
|
|
||||||
inheritAttrs: false,
|
|
||||||
props: initDefaultProps(IDrawerProps, {
|
|
||||||
prefixCls: 'drawer',
|
|
||||||
placement: 'left',
|
|
||||||
getContainer: 'body',
|
|
||||||
level: 'all',
|
|
||||||
duration: '.3s',
|
|
||||||
ease: 'cubic-bezier(0.78, 0.14, 0.15, 0.86)',
|
|
||||||
firstEnter: false, // 记录首次进入.
|
|
||||||
showMask: true,
|
|
||||||
handler: true,
|
|
||||||
maskStyle: {},
|
|
||||||
wrapperClassName: '',
|
|
||||||
}),
|
|
||||||
data() {
|
|
||||||
this.levelDom = [];
|
|
||||||
this.contentDom = null;
|
|
||||||
this.maskDom = null;
|
|
||||||
this.handlerdom = null;
|
|
||||||
this.mousePos = null;
|
|
||||||
this.sFirstEnter = this.firstEnter;
|
|
||||||
this.timeout = null;
|
|
||||||
this.children = null;
|
|
||||||
this.dom = null;
|
|
||||||
this.drawerId = Number(
|
|
||||||
(Date.now() + Math.random()).toString().replace('.', Math.round(Math.random() * 9)),
|
|
||||||
).toString(16);
|
|
||||||
const open = this.open !== undefined ? this.open : !!this.defaultOpen;
|
|
||||||
currentDrawer[this.drawerId] = open;
|
|
||||||
this.orignalOpen = this.open;
|
|
||||||
this.preProps = { ...this.$props };
|
|
||||||
return {
|
|
||||||
sOpen: open,
|
|
||||||
isOpenChange: undefined,
|
|
||||||
passive: undefined,
|
|
||||||
container: undefined,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
open(val) {
|
|
||||||
if (val !== undefined && val !== this.preProps.open) {
|
|
||||||
this.isOpenChange = true;
|
|
||||||
// 没渲染 dom 时,获取默认数据;
|
|
||||||
if (!this.container) {
|
|
||||||
this.getDefault(this.$props);
|
|
||||||
}
|
|
||||||
this.setState({
|
|
||||||
sOpen: open,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.preProps.open = val;
|
|
||||||
if (val) {
|
|
||||||
setTimeout(() => {
|
|
||||||
this.domFocus();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
placement(val) {
|
|
||||||
if (val !== this.preProps.placement) {
|
|
||||||
// test 的 bug, 有动画过场,删除 dom
|
|
||||||
this.contentDom = null;
|
|
||||||
}
|
|
||||||
this.preProps.placement = val;
|
|
||||||
},
|
|
||||||
level(val) {
|
|
||||||
if (this.preProps.level !== val) {
|
|
||||||
this.getParentAndLevelDom(this.$props);
|
|
||||||
}
|
|
||||||
this.preProps.level = val;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
nextTick(() => {
|
|
||||||
if (!windowIsUndefined) {
|
|
||||||
this.passive = supportsPassive ? { passive: false } : false;
|
|
||||||
}
|
|
||||||
const open = this.getOpen();
|
|
||||||
if (this.handler || open || this.sFirstEnter) {
|
|
||||||
this.getDefault(this.$props);
|
|
||||||
if (open) {
|
|
||||||
this.isOpenChange = true;
|
|
||||||
nextTick(() => {
|
|
||||||
this.domFocus();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.$forceUpdate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
updated() {
|
|
||||||
nextTick(() => {
|
|
||||||
// dom 没渲染时,重走一遍。
|
|
||||||
if (!this.sFirstEnter && this.container) {
|
|
||||||
this.$forceUpdate();
|
|
||||||
this.sFirstEnter = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
beforeUnmount() {
|
|
||||||
delete currentDrawer[this.drawerId];
|
|
||||||
delete this.isOpenChange;
|
|
||||||
if (this.container) {
|
|
||||||
if (this.sOpen) {
|
|
||||||
this.setLevelDomTransform(false, true);
|
|
||||||
}
|
|
||||||
document.body.style.overflow = '';
|
|
||||||
}
|
|
||||||
this.sFirstEnter = false;
|
|
||||||
clearTimeout(this.timeout);
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
domFocus() {
|
|
||||||
if (this.dom) {
|
|
||||||
this.dom.focus();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onKeyDown(e) {
|
|
||||||
if (e.keyCode === KeyCode.ESC) {
|
|
||||||
e.stopPropagation();
|
|
||||||
this.__emit('close', e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onMaskTouchEnd(e) {
|
|
||||||
this.__emit('close', e);
|
|
||||||
this.onTouchEnd(e, true);
|
|
||||||
},
|
|
||||||
onIconTouchEnd(e) {
|
|
||||||
this.__emit('handleClick', e);
|
|
||||||
this.onTouchEnd(e);
|
|
||||||
},
|
|
||||||
onTouchEnd(e, close) {
|
|
||||||
if (this.open !== undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const open = close || this.sOpen;
|
|
||||||
this.isOpenChange = true;
|
|
||||||
this.setState({
|
|
||||||
sOpen: !open,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onWrapperTransitionEnd(e) {
|
|
||||||
if (e.target === this.contentWrapper && e.propertyName.match(/transform$/)) {
|
|
||||||
const open = this.getOpen();
|
|
||||||
this.dom.style.transition = '';
|
|
||||||
if (!open && this.getCurrentDrawerSome()) {
|
|
||||||
document.body.style.overflowX = '';
|
|
||||||
if (this.maskDom) {
|
|
||||||
this.maskDom.style.left = '';
|
|
||||||
this.maskDom.style.width = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.afterVisibleChange) {
|
|
||||||
this.afterVisibleChange(!!open);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getDefault(props) {
|
|
||||||
this.getParentAndLevelDom(props);
|
|
||||||
if (props.getContainer || props.parent) {
|
|
||||||
this.container = this.defaultGetContainer();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getCurrentDrawerSome() {
|
|
||||||
return !Object.keys(currentDrawer).some(key => currentDrawer[key]);
|
|
||||||
},
|
|
||||||
getSelfContainer() {
|
|
||||||
return this.container;
|
|
||||||
},
|
|
||||||
getParentAndLevelDom(props) {
|
|
||||||
if (windowIsUndefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const { level, getContainer } = props;
|
|
||||||
this.levelDom = [];
|
|
||||||
if (getContainer) {
|
|
||||||
if (typeof getContainer === 'string') {
|
|
||||||
const dom = document.querySelectorAll(getContainer)[0];
|
|
||||||
this.parent = dom;
|
|
||||||
}
|
|
||||||
if (typeof getContainer === 'function') {
|
|
||||||
this.parent = getContainer();
|
|
||||||
}
|
|
||||||
if (typeof getContainer === 'object' && getContainer instanceof window.HTMLElement) {
|
|
||||||
this.parent = getContainer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!getContainer && this.container) {
|
|
||||||
this.parent = this.container.parentNode;
|
|
||||||
}
|
|
||||||
if (level === 'all') {
|
|
||||||
const children = Array.prototype.slice.call(this.parent.children);
|
|
||||||
children.forEach(child => {
|
|
||||||
if (
|
|
||||||
child.nodeName !== 'SCRIPT' &&
|
|
||||||
child.nodeName !== 'STYLE' &&
|
|
||||||
child.nodeName !== 'LINK' &&
|
|
||||||
child !== this.container
|
|
||||||
) {
|
|
||||||
this.levelDom.push(child);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (level) {
|
|
||||||
dataToArray(level).forEach(key => {
|
|
||||||
document.querySelectorAll(key).forEach(item => {
|
|
||||||
this.levelDom.push(item);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setLevelDomTransform(open, openTransition, placementName, value) {
|
|
||||||
const { placement, levelMove, duration, ease, getContainer } = this.$props;
|
|
||||||
if (!windowIsUndefined) {
|
|
||||||
this.levelDom.forEach(dom => {
|
|
||||||
if (dom && (this.isOpenChange || openTransition)) {
|
|
||||||
/* eslint no-param-reassign: "error" */
|
|
||||||
dom.style.transition = `transform ${duration} ${ease}`;
|
|
||||||
addEventListener(dom, transitionEnd, this.trnasitionEnd);
|
|
||||||
let levelValue = open ? value : 0;
|
|
||||||
if (levelMove) {
|
|
||||||
const $levelMove = transformArguments(levelMove, { target: dom, open });
|
|
||||||
levelValue = open ? $levelMove[0] : $levelMove[1] || 0;
|
|
||||||
}
|
|
||||||
const $value = typeof levelValue === 'number' ? `${levelValue}px` : levelValue;
|
|
||||||
const placementPos =
|
|
||||||
placement === 'left' || placement === 'top' ? $value : `-${$value}`;
|
|
||||||
dom.style.transform = levelValue ? `${placementName}(${placementPos})` : '';
|
|
||||||
dom.style.msTransform = levelValue ? `${placementName}(${placementPos})` : '';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// 处理 body 滚动
|
|
||||||
if (getContainer === 'body') {
|
|
||||||
const eventArray = ['touchstart'];
|
|
||||||
const domArray = [document.body, this.maskDom, this.handlerdom, this.contentDom];
|
|
||||||
const right =
|
|
||||||
document.body.scrollHeight >
|
|
||||||
(window.innerHeight || document.documentElement.clientHeight) &&
|
|
||||||
window.innerWidth > document.body.offsetWidth
|
|
||||||
? getScrollBarSize(1)
|
|
||||||
: 0;
|
|
||||||
let widthTransition = `width ${duration} ${ease}`;
|
|
||||||
const trannsformTransition = `transform ${duration} ${ease}`;
|
|
||||||
if (open && document.body.style.overflow !== 'hidden') {
|
|
||||||
document.body.style.overflow = 'hidden';
|
|
||||||
if (right) {
|
|
||||||
document.body.style.position = 'relative';
|
|
||||||
document.body.style.width = `calc(100% - ${right}px)`;
|
|
||||||
clearTimeout(this.timeout);
|
|
||||||
if (this.dom) {
|
|
||||||
this.dom.style.transition = 'none';
|
|
||||||
switch (placement) {
|
|
||||||
case 'right':
|
|
||||||
this.dom.style.transform = `translateX(-${right}px)`;
|
|
||||||
this.dom.style.msTransform = `translateX(-${right}px)`;
|
|
||||||
break;
|
|
||||||
case 'top':
|
|
||||||
case 'bottom':
|
|
||||||
this.dom.style.width = `calc(100% - ${right}px)`;
|
|
||||||
this.dom.style.transform = 'translateZ(0)';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
this.timeout = setTimeout(() => {
|
|
||||||
this.dom.style.transition = `${trannsformTransition},${widthTransition}`;
|
|
||||||
this.dom.style.width = '';
|
|
||||||
this.dom.style.transform = '';
|
|
||||||
this.dom.style.msTransform = '';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 手机禁滚
|
|
||||||
domArray.forEach((item, i) => {
|
|
||||||
if (!item) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
addEventListener(
|
|
||||||
item,
|
|
||||||
eventArray[i] || 'touchmove',
|
|
||||||
i ? this.removeMoveHandler : this.removeStartHandler,
|
|
||||||
this.passive,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
} else if (this.getCurrentDrawerSome()) {
|
|
||||||
document.body.style.overflow = '';
|
|
||||||
if ((this.isOpenChange || openTransition) && right) {
|
|
||||||
document.body.style.position = '';
|
|
||||||
document.body.style.width = '';
|
|
||||||
if (transitionStr) {
|
|
||||||
document.body.style.overflowX = 'hidden';
|
|
||||||
}
|
|
||||||
if (placement === 'right' && this.maskDom) {
|
|
||||||
this.maskDom.style.left = `-${right}px`;
|
|
||||||
this.maskDom.style.width = `calc(100% + ${right}px)`;
|
|
||||||
}
|
|
||||||
clearTimeout(this.timeout);
|
|
||||||
if (this.dom) {
|
|
||||||
this.dom.style.transition = 'none';
|
|
||||||
let heightTransition;
|
|
||||||
switch (placement) {
|
|
||||||
case 'right': {
|
|
||||||
this.dom.style.transform = `translateX(${right}px)`;
|
|
||||||
this.dom.style.msTransform = `translateX(${right}px)`;
|
|
||||||
this.dom.style.width = '100%';
|
|
||||||
widthTransition = `width 0s ${ease} ${duration}`;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'top':
|
|
||||||
case 'bottom': {
|
|
||||||
this.dom.style.width = `calc(100% + ${right}px)`;
|
|
||||||
this.dom.style.height = '100%';
|
|
||||||
this.dom.style.transform = 'translateZ(0)';
|
|
||||||
heightTransition = `height 0s ${ease} ${duration}`;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
this.timeout = setTimeout(() => {
|
|
||||||
this.dom.style.transition = `${trannsformTransition},${
|
|
||||||
heightTransition ? `${heightTransition},` : ''
|
|
||||||
}${widthTransition}`;
|
|
||||||
this.dom.style.transform = '';
|
|
||||||
this.dom.style.msTransform = '';
|
|
||||||
this.dom.style.width = '';
|
|
||||||
this.dom.style.height = '';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
domArray.forEach((item, i) => {
|
|
||||||
if (!item) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
removeEventListener(
|
|
||||||
item,
|
|
||||||
eventArray[i] || 'touchmove',
|
|
||||||
i ? this.removeMoveHandler : this.removeStartHandler,
|
|
||||||
this.passive,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const { onChange } = this.$attrs;
|
|
||||||
if (onChange && this.isOpenChange && this.sFirstEnter) {
|
|
||||||
onChange(open);
|
|
||||||
this.isOpenChange = false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getChildToRender(open) {
|
|
||||||
const {
|
|
||||||
prefixCls,
|
|
||||||
placement,
|
|
||||||
handler,
|
|
||||||
showMask,
|
|
||||||
maskStyle,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
wrapStyle,
|
|
||||||
keyboard,
|
|
||||||
maskClosable,
|
|
||||||
} = this.$props;
|
|
||||||
const { class: cls, style, ...restAttrs } = this.$attrs;
|
|
||||||
const children = getSlot(this);
|
|
||||||
const wrapperClassname = classnames(prefixCls, {
|
|
||||||
[`${prefixCls}-${placement}`]: true,
|
|
||||||
[`${prefixCls}-open`]: open,
|
|
||||||
'no-mask': !showMask,
|
|
||||||
[cls]: cls,
|
|
||||||
});
|
|
||||||
const isOpenChange = this.isOpenChange;
|
|
||||||
const isHorizontal = placement === 'left' || placement === 'right';
|
|
||||||
const placementName = `translate${isHorizontal ? 'X' : 'Y'}`;
|
|
||||||
// 百分比与像素动画不同步,第一次打用后全用像素动画。
|
|
||||||
// const defaultValue = !this.contentDom || !level ? '100%' : `${value}px`;
|
|
||||||
const placementPos = placement === 'left' || placement === 'top' ? '-100%' : '100%';
|
|
||||||
const transform = open ? '' : `${placementName}(${placementPos})`;
|
|
||||||
if (isOpenChange === undefined || isOpenChange) {
|
|
||||||
const contentValue = this.contentDom
|
|
||||||
? this.contentDom.getBoundingClientRect()[isHorizontal ? 'width' : 'height']
|
|
||||||
: 0;
|
|
||||||
const value = (isHorizontal ? width : height) || contentValue;
|
|
||||||
this.setLevelDomTransform(open, false, placementName, value);
|
|
||||||
}
|
|
||||||
let handlerChildren;
|
|
||||||
if (handler !== false) {
|
|
||||||
const handlerDefalut = (
|
|
||||||
<div class="drawer-handle" onClick={() => {}}>
|
|
||||||
<i class="drawer-handle-icon" />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
const { handler: handlerSlot } = this;
|
|
||||||
const handlerSlotVnode = handlerSlot || handlerDefalut;
|
|
||||||
const handleIconClick = handlerSlotVnode.props && handlerSlotVnode.props.onClick;
|
|
||||||
handlerChildren = cloneElement(handlerSlotVnode, {
|
|
||||||
onClick: e => {
|
|
||||||
handleIconClick && handleIconClick(e);
|
|
||||||
this.onIconTouchEnd(e);
|
|
||||||
},
|
|
||||||
ref: c => {
|
|
||||||
this.handlerdom = c;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const domContProps = {
|
|
||||||
...restAttrs,
|
|
||||||
class: wrapperClassname,
|
|
||||||
onTransitionend: this.onWrapperTransitionEnd,
|
|
||||||
onKeydown: open && keyboard ? this.onKeyDown : noop,
|
|
||||||
style: { ...wrapStyle, ...style },
|
|
||||||
};
|
|
||||||
// 跑用例用
|
|
||||||
const touchEvents = {
|
|
||||||
[supportsPassive ? 'onTouchstartPassive' : 'onTouchstart']: open
|
|
||||||
? this.removeStartHandler
|
|
||||||
: noop,
|
|
||||||
[supportsPassive ? 'onTouchmovePassive' : 'onTouchmove']: open
|
|
||||||
? this.removeMoveHandler
|
|
||||||
: noop,
|
|
||||||
};
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
ref={c => {
|
|
||||||
this.dom = c;
|
|
||||||
}}
|
|
||||||
{...domContProps}
|
|
||||||
tabindex={-1}
|
|
||||||
>
|
|
||||||
{showMask && (
|
|
||||||
<div
|
|
||||||
key={open} // 第二次渲染时虚拟DOM没有改变,没有出发dom更新,使用key强制更新 https://github.com/vueComponent/ant-design-vue/issues/2407
|
|
||||||
class={`${prefixCls}-mask`}
|
|
||||||
onClick={maskClosable ? this.onMaskTouchEnd : noop}
|
|
||||||
style={maskStyle}
|
|
||||||
ref={c => {
|
|
||||||
this.maskDom = c;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<div
|
|
||||||
class={`${prefixCls}-content-wrapper`}
|
|
||||||
style={{
|
|
||||||
transform,
|
|
||||||
msTransform: transform,
|
|
||||||
width: isNumeric(width) ? `${width}px` : width,
|
|
||||||
height: isNumeric(height) ? `${height}px` : height,
|
|
||||||
}}
|
|
||||||
ref={c => {
|
|
||||||
this.contentWrapper = c;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class={`${prefixCls}-content`}
|
|
||||||
ref={c => {
|
|
||||||
this.contentDom = c;
|
|
||||||
}}
|
|
||||||
{...touchEvents}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</div>
|
|
||||||
{handlerChildren}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
getOpen() {
|
|
||||||
return this.open !== undefined ? this.open : this.sOpen;
|
|
||||||
},
|
|
||||||
getTouchParentScroll(root, currentTarget, differX, differY) {
|
|
||||||
if (!currentTarget || currentTarget === document) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// root 为 drawer-content 设定了 overflow, 判断为 root 的 parent 时结束滚动;
|
|
||||||
if (currentTarget === root.parentNode) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const isY = Math.max(Math.abs(differX), Math.abs(differY)) === Math.abs(differY);
|
|
||||||
const isX = Math.max(Math.abs(differX), Math.abs(differY)) === Math.abs(differX);
|
|
||||||
|
|
||||||
const scrollY = currentTarget.scrollHeight - currentTarget.clientHeight;
|
|
||||||
const scrollX = currentTarget.scrollWidth - currentTarget.clientWidth;
|
|
||||||
/**
|
|
||||||
* <div style="height: 300px">
|
|
||||||
* <div style="height: 900px"></div>
|
|
||||||
* </div>
|
|
||||||
* 在没设定 overflow: auto 或 scroll 时,currentTarget 里获取不到 scrollTop 或 scrollLeft,
|
|
||||||
* 预先用 scrollTo 来滚动,如果取出的值跟滚动前取出不同,则 currnetTarget 被设定了 overflow; 否则就是上面这种。
|
|
||||||
*/
|
|
||||||
const t = currentTarget.scrollTop;
|
|
||||||
const l = currentTarget.scrollLeft;
|
|
||||||
if (currentTarget.scrollTo) {
|
|
||||||
currentTarget.scrollTo(currentTarget.scrollLeft + 1, currentTarget.scrollTop + 1);
|
|
||||||
}
|
|
||||||
const currentT = currentTarget.scrollTop;
|
|
||||||
const currentL = currentTarget.scrollLeft;
|
|
||||||
if (currentTarget.scrollTo) {
|
|
||||||
currentTarget.scrollTo(currentTarget.scrollLeft - 1, currentTarget.scrollTop - 1);
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
(isY &&
|
|
||||||
(!scrollY ||
|
|
||||||
!(currentT - t) ||
|
|
||||||
(scrollY &&
|
|
||||||
((currentTarget.scrollTop >= scrollY && differY < 0) ||
|
|
||||||
(currentTarget.scrollTop <= 0 && differY > 0))))) ||
|
|
||||||
(isX &&
|
|
||||||
(!scrollX ||
|
|
||||||
!(currentL - l) ||
|
|
||||||
(scrollX &&
|
|
||||||
((currentTarget.scrollLeft >= scrollX && differX < 0) ||
|
|
||||||
(currentTarget.scrollLeft <= 0 && differX > 0)))))
|
|
||||||
) {
|
|
||||||
return this.getTouchParentScroll(root, currentTarget.parentNode, differX, differY);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
removeStartHandler(e) {
|
|
||||||
if (e.touches.length > 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.startPos = {
|
|
||||||
x: e.touches[0].clientX,
|
|
||||||
y: e.touches[0].clientY,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
removeMoveHandler(e) {
|
|
||||||
if (e.changedTouches.length > 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const currentTarget = e.currentTarget;
|
|
||||||
const differX = e.changedTouches[0].clientX - this.startPos.x;
|
|
||||||
const differY = e.changedTouches[0].clientY - this.startPos.y;
|
|
||||||
if (
|
|
||||||
currentTarget === this.maskDom ||
|
|
||||||
currentTarget === this.handlerdom ||
|
|
||||||
(currentTarget === this.contentDom &&
|
|
||||||
this.getTouchParentScroll(currentTarget, e.target, differX, differY))
|
|
||||||
) {
|
|
||||||
e.preventDefault();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
trnasitionEnd(e) {
|
|
||||||
removeEventListener(e.target, transitionEnd, this.trnasitionEnd);
|
|
||||||
e.target.style.transition = '';
|
|
||||||
},
|
|
||||||
defaultGetContainer() {
|
|
||||||
if (windowIsUndefined) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const container = document.createElement('div');
|
|
||||||
this.parent.appendChild(container);
|
|
||||||
if (this.wrapperClassName) {
|
|
||||||
container.className = this.wrapperClassName;
|
|
||||||
}
|
|
||||||
return container;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { getContainer, wrapperClassName, handler, forceRender } = this.$props;
|
|
||||||
const open = this.getOpen();
|
|
||||||
let portal = null;
|
|
||||||
currentDrawer[this.drawerId] = open ? this.container : open;
|
|
||||||
const children = this.getChildToRender(this.sFirstEnter ? open : false);
|
|
||||||
if (!getContainer) {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
class={wrapperClassName}
|
|
||||||
ref={c => {
|
|
||||||
this.container = c;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (!this.container || (!open && !this.sFirstEnter)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// 如果有 handler 为内置强制渲染;
|
|
||||||
const $forceRender = !!handler || forceRender;
|
|
||||||
if ($forceRender || open || this.dom) {
|
|
||||||
portal = <Teleport to={this.getSelfContainer()}>{children}</Teleport>;
|
|
||||||
}
|
|
||||||
return portal;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
export default Drawer;
|
|
|
@ -1,5 +1,5 @@
|
||||||
import PropTypes from '../../_util/vue-types';
|
import PropTypes from '../../_util/vue-types';
|
||||||
import { PropType, ExtractPropTypes } from 'vue';
|
import type { PropType, ExtractPropTypes } from 'vue';
|
||||||
|
|
||||||
export type IPlacement = 'left' | 'top' | 'right' | 'bottom';
|
export type IPlacement = 'left' | 'top' | 'right' | 'bottom';
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue