index.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
  2. import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
  3. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  4. var _excluded = ["width", "height", "visible", "placement", "mask", "wrapClassName", "class"];
  5. import { resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue";
  6. import { inject, nextTick, defineComponent, ref, onMounted, provide, onUnmounted, watch, computed } from 'vue';
  7. import { getPropsSlot, initDefaultProps } from '../_util/props-util';
  8. import classnames from '../_util/classNames';
  9. import VcDrawer from '../vc-drawer';
  10. import PropTypes from '../_util/vue-types';
  11. import CloseOutlined from "@ant-design/icons-vue/es/icons/CloseOutlined";
  12. import useConfigInject from '../_util/hooks/useConfigInject';
  13. import { tuple, withInstall } from '../_util/type';
  14. import omit from '../_util/omit';
  15. import devWarning from '../vc-util/devWarning';
  16. var PlacementTypes = tuple('top', 'right', 'bottom', 'left');
  17. var SizeTypes = tuple('default', 'large');
  18. var defaultPushState = {
  19. distance: 180
  20. };
  21. export var drawerProps = function drawerProps() {
  22. return {
  23. autofocus: {
  24. type: Boolean,
  25. default: undefined
  26. },
  27. closable: {
  28. type: Boolean,
  29. default: undefined
  30. },
  31. closeIcon: PropTypes.any,
  32. destroyOnClose: {
  33. type: Boolean,
  34. default: undefined
  35. },
  36. forceRender: {
  37. type: Boolean,
  38. default: undefined
  39. },
  40. getContainer: PropTypes.any,
  41. maskClosable: {
  42. type: Boolean,
  43. default: undefined
  44. },
  45. mask: {
  46. type: Boolean,
  47. default: undefined
  48. },
  49. maskStyle: {
  50. type: Object,
  51. default: undefined
  52. },
  53. /** @deprecated Use `style` instead */
  54. wrapStyle: {
  55. type: Object,
  56. default: undefined
  57. },
  58. style: {
  59. type: Object,
  60. default: undefined
  61. },
  62. class: PropTypes.any,
  63. /** @deprecated Use `class` instead */
  64. wrapClassName: String,
  65. size: {
  66. type: String
  67. },
  68. drawerStyle: {
  69. type: Object,
  70. default: undefined
  71. },
  72. headerStyle: {
  73. type: Object,
  74. default: undefined
  75. },
  76. bodyStyle: {
  77. type: Object,
  78. default: undefined
  79. },
  80. contentWrapperStyle: {
  81. type: Object,
  82. default: undefined
  83. },
  84. title: PropTypes.any,
  85. visible: {
  86. type: Boolean,
  87. default: undefined
  88. },
  89. width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
  90. height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
  91. zIndex: Number,
  92. prefixCls: String,
  93. push: PropTypes.oneOfType([PropTypes.looseBool, {
  94. type: Object
  95. }]),
  96. placement: PropTypes.oneOf(PlacementTypes),
  97. keyboard: {
  98. type: Boolean,
  99. default: undefined
  100. },
  101. extra: PropTypes.any,
  102. footer: PropTypes.any,
  103. footerStyle: {
  104. type: Object,
  105. default: undefined
  106. },
  107. level: PropTypes.any,
  108. levelMove: {
  109. type: [Number, Array, Function]
  110. },
  111. handle: PropTypes.any,
  112. /** @deprecated Use `@afterVisibleChange` instead */
  113. afterVisibleChange: Function,
  114. onAfterVisibleChange: Function,
  115. 'onUpdate:visible': Function,
  116. onClose: Function
  117. };
  118. };
  119. var Drawer = defineComponent({
  120. compatConfig: {
  121. MODE: 3
  122. },
  123. name: 'ADrawer',
  124. inheritAttrs: false,
  125. props: initDefaultProps(drawerProps(), {
  126. closable: true,
  127. placement: 'right',
  128. maskClosable: true,
  129. mask: true,
  130. level: null,
  131. keyboard: true,
  132. push: defaultPushState
  133. }),
  134. slots: ['closeIcon', 'title', 'extra', 'footer', 'handle'],
  135. // emits: ['update:visible', 'close', 'afterVisibleChange'],
  136. setup: function setup(props, _ref) {
  137. var emit = _ref.emit,
  138. slots = _ref.slots,
  139. attrs = _ref.attrs;
  140. var sPush = ref(false);
  141. var destroyClose = ref(false);
  142. var vcDrawer = ref(null);
  143. var parentDrawerOpts = inject('parentDrawerOpts', null);
  144. var _useConfigInject = useConfigInject('drawer', props),
  145. prefixCls = _useConfigInject.prefixCls;
  146. devWarning(!props.afterVisibleChange, 'Drawer', '`afterVisibleChange` prop is deprecated, please use `@afterVisibleChange` event instead');
  147. devWarning(props.wrapStyle === undefined, 'Drawer', '`wrapStyle` prop is deprecated, please use `style` instead');
  148. devWarning(props.wrapClassName === undefined, 'Drawer', '`wrapClassName` prop is deprecated, please use `class` instead');
  149. var setPush = function setPush() {
  150. sPush.value = true;
  151. };
  152. var setPull = function setPull() {
  153. sPush.value = false;
  154. nextTick(function () {
  155. domFocus();
  156. });
  157. };
  158. provide('parentDrawerOpts', {
  159. setPush: setPush,
  160. setPull: setPull
  161. });
  162. onMounted(function () {
  163. var visible = props.visible;
  164. if (visible && parentDrawerOpts) {
  165. parentDrawerOpts.setPush();
  166. }
  167. });
  168. onUnmounted(function () {
  169. if (parentDrawerOpts) {
  170. parentDrawerOpts.setPull();
  171. }
  172. });
  173. watch(function () {
  174. return props.visible;
  175. }, function (visible) {
  176. if (parentDrawerOpts) {
  177. if (visible) {
  178. parentDrawerOpts.setPush();
  179. } else {
  180. parentDrawerOpts.setPull();
  181. }
  182. }
  183. }, {
  184. flush: 'post'
  185. });
  186. var domFocus = function domFocus() {
  187. var _vcDrawer$value, _vcDrawer$value$domFo;
  188. (_vcDrawer$value = vcDrawer.value) === null || _vcDrawer$value === void 0 ? void 0 : (_vcDrawer$value$domFo = _vcDrawer$value.domFocus) === null || _vcDrawer$value$domFo === void 0 ? void 0 : _vcDrawer$value$domFo.call(_vcDrawer$value);
  189. };
  190. var close = function close(e) {
  191. emit('update:visible', false);
  192. emit('close', e);
  193. };
  194. var afterVisibleChange = function afterVisibleChange(visible) {
  195. var _props$afterVisibleCh;
  196. (_props$afterVisibleCh = props.afterVisibleChange) === null || _props$afterVisibleCh === void 0 ? void 0 : _props$afterVisibleCh.call(props, visible);
  197. emit('afterVisibleChange', visible);
  198. };
  199. var destroyOnClose = computed(function () {
  200. return props.destroyOnClose && !props.visible;
  201. });
  202. var onDestroyTransitionEnd = function onDestroyTransitionEnd() {
  203. var isDestroyOnClose = destroyOnClose.value;
  204. if (!isDestroyOnClose) {
  205. return;
  206. }
  207. if (!props.visible) {
  208. destroyClose.value = true;
  209. }
  210. };
  211. var pushTransform = computed(function () {
  212. var push = props.push,
  213. placement = props.placement;
  214. var distance;
  215. if (typeof push === 'boolean') {
  216. distance = push ? defaultPushState.distance : 0;
  217. } else {
  218. distance = push.distance;
  219. }
  220. distance = parseFloat(String(distance || 0));
  221. if (placement === 'left' || placement === 'right') {
  222. return "translateX(".concat(placement === 'left' ? distance : -distance, "px)");
  223. }
  224. if (placement === 'top' || placement === 'bottom') {
  225. return "translateY(".concat(placement === 'top' ? distance : -distance, "px)");
  226. }
  227. return null;
  228. });
  229. var offsetStyle = computed(function () {
  230. // https://github.com/ant-design/ant-design/issues/24287
  231. var visible = props.visible,
  232. mask = props.mask,
  233. placement = props.placement,
  234. _props$size = props.size,
  235. size = _props$size === void 0 ? 'default' : _props$size,
  236. width = props.width,
  237. height = props.height;
  238. if (!visible && !mask) {
  239. return {};
  240. }
  241. var val = {};
  242. if (placement === 'left' || placement === 'right') {
  243. var defaultWidth = size === 'large' ? 736 : 378;
  244. val.width = typeof width === 'undefined' ? defaultWidth : width;
  245. val.width = typeof val.width === 'string' ? val.width : "".concat(val.width, "px");
  246. } else {
  247. var defaultHeight = size === 'large' ? 736 : 378;
  248. val.height = typeof height === 'undefined' ? defaultHeight : height;
  249. val.height = typeof val.height === 'string' ? val.height : "".concat(val.height, "px");
  250. }
  251. return val;
  252. });
  253. var drawerStyle = computed(function () {
  254. var zIndex = props.zIndex,
  255. wrapStyle = props.wrapStyle,
  256. mask = props.mask,
  257. style = props.style;
  258. var val = mask ? {} : offsetStyle.value;
  259. return _objectSpread(_objectSpread(_objectSpread({
  260. zIndex: zIndex,
  261. transform: sPush.value ? pushTransform.value : undefined
  262. }, val), wrapStyle), style);
  263. });
  264. var renderHeader = function renderHeader(prefixCls) {
  265. var closable = props.closable,
  266. headerStyle = props.headerStyle;
  267. var extra = getPropsSlot(slots, props, 'extra');
  268. var title = getPropsSlot(slots, props, 'title');
  269. if (!title && !closable) {
  270. return null;
  271. }
  272. return _createVNode("div", {
  273. "class": classnames("".concat(prefixCls, "-header"), _defineProperty({}, "".concat(prefixCls, "-header-close-only"), closable && !title && !extra)),
  274. "style": headerStyle
  275. }, [_createVNode("div", {
  276. "class": "".concat(prefixCls, "-header-title")
  277. }, [renderCloseIcon(prefixCls), title && _createVNode("div", {
  278. "class": "".concat(prefixCls, "-title")
  279. }, [title])]), extra && _createVNode("div", {
  280. "class": "".concat(prefixCls, "-extra")
  281. }, [extra])]);
  282. };
  283. var renderCloseIcon = function renderCloseIcon(prefixCls) {
  284. var _slots$closeIcon;
  285. var closable = props.closable;
  286. var $closeIcon = slots.closeIcon ? (_slots$closeIcon = slots.closeIcon) === null || _slots$closeIcon === void 0 ? void 0 : _slots$closeIcon.call(slots) : props.closeIcon;
  287. return closable && _createVNode("button", {
  288. "key": "closer",
  289. "onClick": close,
  290. "aria-label": "Close",
  291. "class": "".concat(prefixCls, "-close")
  292. }, [$closeIcon === undefined ? _createVNode(CloseOutlined, null, null) : $closeIcon]);
  293. };
  294. var renderBody = function renderBody(prefixCls) {
  295. var _slots$default;
  296. if (destroyClose.value && !props.visible) {
  297. return null;
  298. }
  299. destroyClose.value = false;
  300. var bodyStyle = props.bodyStyle,
  301. drawerStyle = props.drawerStyle;
  302. var containerStyle = {};
  303. var isDestroyOnClose = destroyOnClose.value;
  304. if (isDestroyOnClose) {
  305. // Increase the opacity transition, delete children after closing.
  306. containerStyle.opacity = 0;
  307. containerStyle.transition = 'opacity .3s';
  308. }
  309. return _createVNode("div", {
  310. "class": "".concat(prefixCls, "-wrapper-body"),
  311. "style": _objectSpread(_objectSpread({}, containerStyle), drawerStyle),
  312. "onTransitionend": onDestroyTransitionEnd
  313. }, [renderHeader(prefixCls), _createVNode("div", {
  314. "key": "body",
  315. "class": "".concat(prefixCls, "-body"),
  316. "style": bodyStyle
  317. }, [(_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots)]), renderFooter(prefixCls)]);
  318. };
  319. var renderFooter = function renderFooter(prefixCls) {
  320. var footer = getPropsSlot(slots, props, 'footer');
  321. if (!footer) {
  322. return null;
  323. }
  324. var footerClassName = "".concat(prefixCls, "-footer");
  325. return _createVNode("div", {
  326. "class": footerClassName,
  327. "style": props.footerStyle
  328. }, [footer]);
  329. };
  330. return function () {
  331. var _classnames2;
  332. var width = props.width,
  333. height = props.height,
  334. visible = props.visible,
  335. placement = props.placement,
  336. mask = props.mask,
  337. wrapClassName = props.wrapClassName,
  338. className = props.class,
  339. rest = _objectWithoutProperties(props, _excluded);
  340. var val = mask ? offsetStyle.value : {};
  341. var haveMask = mask ? '' : 'no-mask';
  342. var vcDrawerProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, attrs), omit(rest, ['size', 'closeIcon', 'closable', 'destroyOnClose', 'drawerStyle', 'headerStyle', 'bodyStyle', 'title', 'push', 'wrapStyle', 'onAfterVisibleChange', 'onClose', 'onUpdate:visible'])), val), {}, {
  343. onClose: close,
  344. afterVisibleChange: afterVisibleChange,
  345. handler: false,
  346. prefixCls: prefixCls.value,
  347. open: visible,
  348. showMask: mask,
  349. placement: placement,
  350. class: classnames((_classnames2 = {}, _defineProperty(_classnames2, className, className), _defineProperty(_classnames2, wrapClassName, !!wrapClassName), _defineProperty(_classnames2, haveMask, !!haveMask), _classnames2)),
  351. style: drawerStyle.value,
  352. ref: vcDrawer
  353. });
  354. return _createVNode(VcDrawer, vcDrawerProps, {
  355. handler: props.handle ? function () {
  356. return props.handle;
  357. } : slots.handle,
  358. default: function _default() {
  359. return renderBody(prefixCls.value);
  360. }
  361. });
  362. };
  363. }
  364. });
  365. export default withInstall(Drawer);