index.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
  6. var _defineProperty3 = _interopRequireDefault(_defineProperty2);
  7. var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
  8. var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
  9. var _extends2 = require('babel-runtime/helpers/extends');
  10. var _extends3 = _interopRequireDefault(_extends2);
  11. var _classnames2 = require('classnames');
  12. var _classnames3 = _interopRequireDefault(_classnames2);
  13. var _omit = require('omit.js');
  14. var _omit2 = _interopRequireDefault(_omit);
  15. var _src = require('../vc-drawer/src');
  16. var _src2 = _interopRequireDefault(_src);
  17. var _vueTypes = require('../_util/vue-types');
  18. var _vueTypes2 = _interopRequireDefault(_vueTypes);
  19. var _BaseMixin = require('../_util/BaseMixin');
  20. var _BaseMixin2 = _interopRequireDefault(_BaseMixin);
  21. var _icon = require('../icon');
  22. var _icon2 = _interopRequireDefault(_icon);
  23. var _propsUtil = require('../_util/props-util');
  24. var _configConsumerProps = require('../config-provider/configConsumerProps');
  25. var _base = require('../base');
  26. var _base2 = _interopRequireDefault(_base);
  27. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  28. var Drawer = {
  29. name: 'ADrawer',
  30. props: {
  31. closable: _vueTypes2['default'].bool.def(true),
  32. destroyOnClose: _vueTypes2['default'].bool,
  33. getContainer: _vueTypes2['default'].any,
  34. maskClosable: _vueTypes2['default'].bool.def(true),
  35. mask: _vueTypes2['default'].bool.def(true),
  36. maskStyle: _vueTypes2['default'].object,
  37. wrapStyle: _vueTypes2['default'].object,
  38. bodyStyle: _vueTypes2['default'].object,
  39. headerStyle: _vueTypes2['default'].object,
  40. drawerStyle: _vueTypes2['default'].object,
  41. title: _vueTypes2['default'].any,
  42. visible: _vueTypes2['default'].bool,
  43. width: _vueTypes2['default'].oneOfType([_vueTypes2['default'].string, _vueTypes2['default'].number]).def(256),
  44. height: _vueTypes2['default'].oneOfType([_vueTypes2['default'].string, _vueTypes2['default'].number]).def(256),
  45. zIndex: _vueTypes2['default'].number,
  46. prefixCls: _vueTypes2['default'].string,
  47. placement: _vueTypes2['default'].oneOf(['top', 'right', 'bottom', 'left']).def('right'),
  48. level: _vueTypes2['default'].any.def(null),
  49. wrapClassName: _vueTypes2['default'].string, // not use class like react, vue will add class to root dom
  50. handle: _vueTypes2['default'].any,
  51. afterVisibleChange: _vueTypes2['default'].func,
  52. keyboard: _vueTypes2['default'].bool.def(true)
  53. },
  54. mixins: [_BaseMixin2['default']],
  55. data: function data() {
  56. this.destroyClose = false;
  57. this.preVisible = this.$props.visible;
  58. return {
  59. _push: false
  60. };
  61. },
  62. inject: {
  63. parentDrawer: {
  64. 'default': function _default() {
  65. return null;
  66. }
  67. },
  68. configProvider: { 'default': function _default() {
  69. return _configConsumerProps.ConfigConsumerProps;
  70. } }
  71. },
  72. provide: function provide() {
  73. return {
  74. parentDrawer: this
  75. };
  76. },
  77. mounted: function mounted() {
  78. // fix: delete drawer in child and re-render, no push started.
  79. // <Drawer>{show && <Drawer />}</Drawer>
  80. var visible = this.visible;
  81. if (visible && this.parentDrawer) {
  82. this.parentDrawer.push();
  83. }
  84. },
  85. updated: function updated() {
  86. var _this = this;
  87. this.$nextTick(function () {
  88. if (_this.preVisible !== _this.visible && _this.parentDrawer) {
  89. if (_this.visible) {
  90. _this.parentDrawer.push();
  91. } else {
  92. _this.parentDrawer.pull();
  93. }
  94. }
  95. _this.preVisible = _this.visible;
  96. });
  97. },
  98. beforeDestroy: function beforeDestroy() {
  99. // unmount drawer in child, clear push.
  100. if (this.parentDrawer) {
  101. this.parentDrawer.pull();
  102. }
  103. },
  104. methods: {
  105. domFocus: function domFocus() {
  106. if (this.$refs.vcDrawer) {
  107. this.$refs.vcDrawer.domFocus();
  108. }
  109. },
  110. close: function close(e) {
  111. this.$emit('close', e);
  112. },
  113. // onMaskClick(e) {
  114. // if (!this.maskClosable) {
  115. // return;
  116. // }
  117. // this.close(e);
  118. // },
  119. push: function push() {
  120. this.setState({
  121. _push: true
  122. });
  123. },
  124. pull: function pull() {
  125. var _this2 = this;
  126. this.setState({
  127. _push: false
  128. }, function () {
  129. _this2.domFocus();
  130. });
  131. },
  132. onDestroyTransitionEnd: function onDestroyTransitionEnd() {
  133. var isDestroyOnClose = this.getDestroyOnClose();
  134. if (!isDestroyOnClose) {
  135. return;
  136. }
  137. if (!this.visible) {
  138. this.destroyClose = true;
  139. this.$forceUpdate();
  140. }
  141. },
  142. getDestroyOnClose: function getDestroyOnClose() {
  143. return this.destroyOnClose && !this.visible;
  144. },
  145. // get drawar push width or height
  146. getPushTransform: function getPushTransform(placement) {
  147. if (placement === 'left' || placement === 'right') {
  148. return 'translateX(' + (placement === 'left' ? 180 : -180) + 'px)';
  149. }
  150. if (placement === 'top' || placement === 'bottom') {
  151. return 'translateY(' + (placement === 'top' ? 180 : -180) + 'px)';
  152. }
  153. },
  154. getRcDrawerStyle: function getRcDrawerStyle() {
  155. var _$props = this.$props,
  156. zIndex = _$props.zIndex,
  157. placement = _$props.placement,
  158. wrapStyle = _$props.wrapStyle;
  159. var push = this.$data._push;
  160. return (0, _extends3['default'])({
  161. zIndex: zIndex,
  162. transform: push ? this.getPushTransform(placement) : undefined
  163. }, wrapStyle);
  164. },
  165. renderHeader: function renderHeader(prefixCls) {
  166. var h = this.$createElement;
  167. var _$props2 = this.$props,
  168. closable = _$props2.closable,
  169. headerStyle = _$props2.headerStyle;
  170. var title = (0, _propsUtil.getComponentFromProp)(this, 'title');
  171. if (!title && !closable) {
  172. return null;
  173. }
  174. var headerClassName = title ? prefixCls + '-header' : prefixCls + '-header-no-title';
  175. return h(
  176. 'div',
  177. { 'class': headerClassName, style: headerStyle },
  178. [title && h(
  179. 'div',
  180. { 'class': prefixCls + '-title' },
  181. [title]
  182. ), closable ? this.renderCloseIcon(prefixCls) : null]
  183. );
  184. },
  185. renderCloseIcon: function renderCloseIcon(prefixCls) {
  186. var h = this.$createElement;
  187. var closable = this.closable;
  188. return closable && h(
  189. 'button',
  190. { key: 'closer', on: {
  191. 'click': this.close
  192. },
  193. attrs: { 'aria-label': 'Close' },
  194. 'class': prefixCls + '-close' },
  195. [h(_icon2['default'], {
  196. attrs: { type: 'close' }
  197. })]
  198. );
  199. },
  200. // render drawer body dom
  201. renderBody: function renderBody(prefixCls) {
  202. var h = this.$createElement;
  203. if (this.destroyClose && !this.visible) {
  204. return null;
  205. }
  206. this.destroyClose = false;
  207. var _$props3 = this.$props,
  208. bodyStyle = _$props3.bodyStyle,
  209. drawerStyle = _$props3.drawerStyle;
  210. var containerStyle = {};
  211. var isDestroyOnClose = this.getDestroyOnClose();
  212. if (isDestroyOnClose) {
  213. // Increase the opacity transition, delete children after closing.
  214. containerStyle.opacity = 0;
  215. containerStyle.transition = 'opacity .3s';
  216. }
  217. return h(
  218. 'div',
  219. {
  220. 'class': prefixCls + '-wrapper-body',
  221. style: (0, _extends3['default'])({}, containerStyle, drawerStyle),
  222. on: {
  223. 'transitionend': this.onDestroyTransitionEnd
  224. }
  225. },
  226. [this.renderHeader(prefixCls), h(
  227. 'div',
  228. { key: 'body', 'class': prefixCls + '-body', style: bodyStyle },
  229. [this.$slots['default']]
  230. )]
  231. );
  232. }
  233. },
  234. render: function render() {
  235. var _classnames;
  236. var h = arguments[0];
  237. var props = (0, _propsUtil.getOptionProps)(this);
  238. var customizePrefixCls = props.prefixCls,
  239. width = props.width,
  240. height = props.height,
  241. visible = props.visible,
  242. placement = props.placement,
  243. wrapClassName = props.wrapClassName,
  244. mask = props.mask,
  245. rest = (0, _objectWithoutProperties3['default'])(props, ['prefixCls', 'width', 'height', 'visible', 'placement', 'wrapClassName', 'mask']);
  246. var haveMask = mask ? '' : 'no-mask';
  247. var offsetStyle = {};
  248. if (placement === 'left' || placement === 'right') {
  249. offsetStyle.width = typeof width === 'number' ? width + 'px' : width;
  250. } else {
  251. offsetStyle.height = typeof height === 'number' ? height + 'px' : height;
  252. }
  253. var handler = (0, _propsUtil.getComponentFromProp)(this, 'handle') || false;
  254. var getPrefixCls = this.configProvider.getPrefixCls;
  255. var prefixCls = getPrefixCls('drawer', customizePrefixCls);
  256. var vcDrawerProps = {
  257. ref: 'vcDrawer',
  258. props: (0, _extends3['default'])({}, (0, _omit2['default'])(rest, ['closable', 'destroyOnClose', 'drawerStyle', 'headerStyle', 'bodyStyle', 'title', 'push', 'visible', 'getPopupContainer', 'rootPrefixCls', 'getPrefixCls', 'renderEmpty', 'csp', 'pageHeader', 'autoInsertSpaceInButton']), {
  259. handler: handler
  260. }, offsetStyle, {
  261. prefixCls: prefixCls,
  262. open: visible,
  263. showMask: mask,
  264. placement: placement,
  265. className: (0, _classnames3['default'])((_classnames = {}, (0, _defineProperty3['default'])(_classnames, wrapClassName, !!wrapClassName), (0, _defineProperty3['default'])(_classnames, haveMask, !!haveMask), _classnames)),
  266. wrapStyle: this.getRcDrawerStyle()
  267. }),
  268. on: (0, _extends3['default'])({}, (0, _propsUtil.getListeners)(this))
  269. };
  270. return h(
  271. _src2['default'],
  272. vcDrawerProps,
  273. [this.renderBody(prefixCls)]
  274. );
  275. }
  276. };
  277. /* istanbul ignore next */
  278. Drawer.install = function (Vue) {
  279. Vue.use(_base2['default']);
  280. Vue.component(Drawer.name, Drawer);
  281. };
  282. exports['default'] = Drawer;