UNPKG

ant-design-vue

Version:

An enterprise-class UI design language and Vue-based implementation

213 lines (197 loc) 5.43 kB
import _extends from 'babel-runtime/helpers/extends'; import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties'; import VcDrawer from '../vc-drawer/src'; import PropTypes from '../_util/vue-types'; import BaseMixin from '../_util/BaseMixin'; import { getComponentFromProp, getOptionProps } from '../_util/props-util'; var Drawer = { name: 'ADrawer', props: { closable: PropTypes.bool.def(true), destroyOnClose: PropTypes.bool, getContainer: PropTypes.any, maskClosable: PropTypes.bool.def(true), mask: PropTypes.bool, maskStyle: PropTypes.object, title: PropTypes.any, visible: PropTypes.bool, width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).def(256), zIndex: PropTypes.number, prefixCls: PropTypes.string.def('ant-drawer'), placement: PropTypes.string.def('right'), level: PropTypes.any.def(null), wrapClassName: PropTypes.string }, mixins: [BaseMixin], data: function data() { this.destoryClose = false; this.preVisible = this.$props.visible; return { _push: false }; }, inject: { parentDrawer: { 'default': null } }, provide: function provide() { return { parentDrawer: this }; }, updated: function updated() { var _this = this; this.$nextTick(function () { if (_this.preVisible !== _this.visible && _this.parentDrawer) { if (_this.visible) { _this.parentDrawer.push(); } else { _this.parentDrawer.pull(); } } _this.preVisible = _this.visible; }); }, methods: { close: function close(e) { if (this.visible !== undefined) { this.$emit('close', e); return; } }, onMaskClick: function onMaskClick(e) { if (!this.maskClosable) { return; } this.close(e); }, push: function push() { this.setState({ _push: true }); }, pull: function pull() { this.setState({ _push: false }); }, onDestoryTransitionEnd: function onDestoryTransitionEnd() { var isDestroyOnClose = this.getDestoryOnClose(); if (!isDestroyOnClose) { return; } if (!this.visible) { this.destoryClose = true; this.$forceUpdate(); } }, getDestoryOnClose: function getDestoryOnClose() { return this.destroyOnClose && !this.visible; }, renderBody: function renderBody() { var h = this.$createElement; if (this.destoryClose && !this.visible) { return null; } this.destoryClose = false; var _$props = this.$props, placement = _$props.placement, bodyStyle = _$props.bodyStyle; var containerStyle = placement === 'left' || placement === 'right' ? { overflow: 'auto', height: '100%' } : {}; var isDestroyOnClose = this.getDestoryOnClose(); if (isDestroyOnClose) { // Increase the opacity transition, delete children after closing. containerStyle.opacity = 0; containerStyle.transition = 'opacity .3s'; } var _$props2 = this.$props, prefixCls = _$props2.prefixCls, closable = _$props2.closable; var title = getComponentFromProp(this, 'title'); var header = void 0; if (title) { header = h( 'div', { 'class': prefixCls + '-header' }, [h( 'div', { 'class': prefixCls + '-title' }, [title] )] ); } var closer = void 0; if (closable) { closer = h( 'button', { on: { 'click': this.close }, attrs: { 'aria-label': 'Close' }, 'class': prefixCls + '-close' }, [h('span', { 'class': prefixCls + '-close-x' })] ); } return h( 'div', { 'class': prefixCls + '-wrapper-body', style: containerStyle, on: { 'transitionend': this.onDestoryTransitionEnd } }, [header, closer, h( 'div', { 'class': prefixCls + '-body', style: bodyStyle }, [this.$slots['default']] )] ); } }, render: function render() { var h = arguments[0]; var props = getOptionProps(this); var zIndex = props.zIndex, visible = props.visible, placement = props.placement, mask = props.mask, wrapClassName = props.wrapClassName, rest = _objectWithoutProperties(props, ['zIndex', 'visible', 'placement', 'mask', 'wrapClassName']); var vcDrawerStyle = this.$data._push ? { zIndex: zIndex, transform: 'translateX(' + (placement === 'left' ? 180 : -180) + 'px)' } : { zIndex: zIndex }; var vcDrawerProps = { props: _extends({ handler: false, open: visible, showMask: mask, placement: placement, wrapClassName: wrapClassName }, rest), on: _extends({ maskClick: this.onMaskClick }, this.$listeners), style: vcDrawerStyle }; return h( VcDrawer, vcDrawerProps, [this.renderBody()] ); } }; /* istanbul ignore next */ Drawer.install = function (Vue) { Vue.component(Drawer.name, Drawer); }; export default Drawer;