index.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.drawerProps = exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _propsUtil = require("../_util/props-util");
  11. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  12. var _vcDrawer = _interopRequireDefault(require("../vc-drawer"));
  13. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  14. var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/CloseOutlined"));
  15. var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject"));
  16. var _type = require("../_util/type");
  17. var _omit = _interopRequireDefault(require("../_util/omit"));
  18. var _devWarning = _interopRequireDefault(require("../vc-util/devWarning"));
  19. var _style = _interopRequireDefault(require("./style"));
  20. var _Compact = require("../space/Compact");
  21. var _isNumeric = _interopRequireDefault(require("../_util/isNumeric"));
  22. var _transition = require("../_util/transition");
  23. var __rest = void 0 && (void 0).__rest || function (s, e) {
  24. var t = {};
  25. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  26. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  27. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  28. }
  29. return t;
  30. };
  31. const PlacementTypes = ['top', 'right', 'bottom', 'left'];
  32. const SizeTypes = ['default', 'large'];
  33. const defaultPushState = {
  34. distance: 180
  35. };
  36. const drawerProps = () => ({
  37. autofocus: {
  38. type: Boolean,
  39. default: undefined
  40. },
  41. closable: {
  42. type: Boolean,
  43. default: undefined
  44. },
  45. closeIcon: _vueTypes.default.any,
  46. destroyOnClose: {
  47. type: Boolean,
  48. default: undefined
  49. },
  50. forceRender: {
  51. type: Boolean,
  52. default: undefined
  53. },
  54. getContainer: {
  55. type: [String, Function, Boolean, Object],
  56. default: undefined
  57. },
  58. maskClosable: {
  59. type: Boolean,
  60. default: undefined
  61. },
  62. mask: {
  63. type: Boolean,
  64. default: undefined
  65. },
  66. maskStyle: (0, _type.objectType)(),
  67. rootClassName: String,
  68. rootStyle: (0, _type.objectType)(),
  69. size: {
  70. type: String
  71. },
  72. drawerStyle: (0, _type.objectType)(),
  73. headerStyle: (0, _type.objectType)(),
  74. bodyStyle: (0, _type.objectType)(),
  75. contentWrapperStyle: {
  76. type: Object,
  77. default: undefined
  78. },
  79. title: _vueTypes.default.any,
  80. /** @deprecated Please use `open` instead */
  81. visible: {
  82. type: Boolean,
  83. default: undefined
  84. },
  85. open: {
  86. type: Boolean,
  87. default: undefined
  88. },
  89. width: _vueTypes.default.oneOfType([_vueTypes.default.string, _vueTypes.default.number]),
  90. height: _vueTypes.default.oneOfType([_vueTypes.default.string, _vueTypes.default.number]),
  91. zIndex: Number,
  92. prefixCls: String,
  93. push: _vueTypes.default.oneOfType([_vueTypes.default.looseBool, {
  94. type: Object
  95. }]),
  96. placement: _vueTypes.default.oneOf(PlacementTypes),
  97. keyboard: {
  98. type: Boolean,
  99. default: undefined
  100. },
  101. extra: _vueTypes.default.any,
  102. footer: _vueTypes.default.any,
  103. footerStyle: (0, _type.objectType)(),
  104. level: _vueTypes.default.any,
  105. levelMove: {
  106. type: [Number, Array, Function]
  107. },
  108. handle: _vueTypes.default.any,
  109. /** @deprecated Use `@afterVisibleChange` instead */
  110. afterVisibleChange: Function,
  111. /** @deprecated Please use `@afterOpenChange` instead */
  112. onAfterVisibleChange: Function,
  113. onAfterOpenChange: Function,
  114. /** @deprecated Please use `onUpdate:open` instead */
  115. 'onUpdate:visible': Function,
  116. 'onUpdate:open': Function,
  117. onClose: Function
  118. });
  119. exports.drawerProps = drawerProps;
  120. const Drawer = (0, _vue.defineComponent)({
  121. compatConfig: {
  122. MODE: 3
  123. },
  124. name: 'ADrawer',
  125. inheritAttrs: false,
  126. props: (0, _propsUtil.initDefaultProps)(drawerProps(), {
  127. closable: true,
  128. placement: 'right',
  129. maskClosable: true,
  130. mask: true,
  131. level: null,
  132. keyboard: true,
  133. push: defaultPushState
  134. }),
  135. slots: Object,
  136. // emits: ['update:visible', 'close', 'afterVisibleChange'],
  137. setup(props, _ref) {
  138. let {
  139. emit,
  140. slots,
  141. attrs
  142. } = _ref;
  143. const sPush = (0, _vue.shallowRef)(false);
  144. const destroyClose = (0, _vue.shallowRef)(false);
  145. const vcDrawer = (0, _vue.shallowRef)(null);
  146. const load = (0, _vue.shallowRef)(false);
  147. const visible = (0, _vue.shallowRef)(false);
  148. const mergedOpen = (0, _vue.computed)(() => {
  149. var _a;
  150. return (_a = props.open) !== null && _a !== void 0 ? _a : props.visible;
  151. });
  152. (0, _vue.watch)(mergedOpen, () => {
  153. if (mergedOpen.value) {
  154. load.value = true;
  155. } else {
  156. visible.value = false;
  157. }
  158. }, {
  159. immediate: true
  160. });
  161. (0, _vue.watch)([mergedOpen, load], () => {
  162. if (mergedOpen.value && load.value) {
  163. visible.value = true;
  164. }
  165. }, {
  166. immediate: true
  167. });
  168. const parentDrawerOpts = (0, _vue.inject)('parentDrawerOpts', null);
  169. const {
  170. prefixCls,
  171. getPopupContainer,
  172. direction
  173. } = (0, _useConfigInject.default)('drawer', props);
  174. const [wrapSSR, hashId] = (0, _style.default)(prefixCls);
  175. const getContainer = (0, _vue.computed)(() =>
  176. // 有可能为 false,所以不能直接判断
  177. props.getContainer === undefined && (getPopupContainer === null || getPopupContainer === void 0 ? void 0 : getPopupContainer.value) ? () => getPopupContainer.value(document.body) : props.getContainer);
  178. (0, _devWarning.default)(!props.afterVisibleChange, 'Drawer', '`afterVisibleChange` prop is deprecated, please use `@afterVisibleChange` event instead');
  179. // ========================== Warning ===========================
  180. if (process.env.NODE_ENV !== 'production') {
  181. [['visible', 'open'], ['onUpdate:visible', 'onUpdate:open'], ['onAfterVisibleChange', 'onAfterOpenChange']].forEach(_ref2 => {
  182. let [deprecatedName, newName] = _ref2;
  183. (0, _devWarning.default)(!props[deprecatedName], 'Drawer', `\`${deprecatedName}\` is deprecated, please use \`${newName}\` instead.`);
  184. });
  185. }
  186. const setPush = () => {
  187. sPush.value = true;
  188. };
  189. const setPull = () => {
  190. sPush.value = false;
  191. (0, _vue.nextTick)(() => {
  192. domFocus();
  193. });
  194. };
  195. (0, _vue.provide)('parentDrawerOpts', {
  196. setPush,
  197. setPull
  198. });
  199. (0, _vue.onMounted)(() => {
  200. if (mergedOpen.value && parentDrawerOpts) {
  201. parentDrawerOpts.setPush();
  202. }
  203. });
  204. (0, _vue.onUnmounted)(() => {
  205. if (parentDrawerOpts) {
  206. parentDrawerOpts.setPull();
  207. }
  208. });
  209. (0, _vue.watch)(visible, () => {
  210. if (parentDrawerOpts) {
  211. if (visible.value) {
  212. parentDrawerOpts.setPush();
  213. } else {
  214. parentDrawerOpts.setPull();
  215. }
  216. }
  217. }, {
  218. flush: 'post'
  219. });
  220. const domFocus = () => {
  221. var _a, _b;
  222. (_b = (_a = vcDrawer.value) === null || _a === void 0 ? void 0 : _a.domFocus) === null || _b === void 0 ? void 0 : _b.call(_a);
  223. };
  224. const close = e => {
  225. emit('update:visible', false);
  226. emit('update:open', false);
  227. emit('close', e);
  228. };
  229. const afterVisibleChange = open => {
  230. var _a;
  231. if (!open) {
  232. if (destroyClose.value === false) {
  233. // set true only once
  234. destroyClose.value = true;
  235. }
  236. if (props.destroyOnClose) {
  237. load.value = false;
  238. }
  239. }
  240. (_a = props.afterVisibleChange) === null || _a === void 0 ? void 0 : _a.call(props, open);
  241. emit('afterVisibleChange', open);
  242. emit('afterOpenChange', open);
  243. };
  244. const pushTransform = (0, _vue.computed)(() => {
  245. const {
  246. push,
  247. placement
  248. } = props;
  249. let distance;
  250. if (typeof push === 'boolean') {
  251. distance = push ? defaultPushState.distance : 0;
  252. } else {
  253. distance = push.distance;
  254. }
  255. distance = parseFloat(String(distance || 0));
  256. if (placement === 'left' || placement === 'right') {
  257. return `translateX(${placement === 'left' ? distance : -distance}px)`;
  258. }
  259. if (placement === 'top' || placement === 'bottom') {
  260. return `translateY(${placement === 'top' ? distance : -distance}px)`;
  261. }
  262. return null;
  263. });
  264. // ============================ Size ============================
  265. const mergedWidth = (0, _vue.computed)(() => {
  266. var _a;
  267. return (_a = props.width) !== null && _a !== void 0 ? _a : props.size === 'large' ? 736 : 378;
  268. });
  269. const mergedHeight = (0, _vue.computed)(() => {
  270. var _a;
  271. return (_a = props.height) !== null && _a !== void 0 ? _a : props.size === 'large' ? 736 : 378;
  272. });
  273. const offsetStyle = (0, _vue.computed)(() => {
  274. // https://github.com/ant-design/ant-design/issues/24287
  275. const {
  276. mask,
  277. placement
  278. } = props;
  279. if (!visible.value && !mask) {
  280. return {};
  281. }
  282. const val = {};
  283. if (placement === 'left' || placement === 'right') {
  284. val.width = (0, _isNumeric.default)(mergedWidth.value) ? `${mergedWidth.value}px` : mergedWidth.value;
  285. } else {
  286. val.height = (0, _isNumeric.default)(mergedHeight.value) ? `${mergedHeight.value}px` : mergedHeight.value;
  287. }
  288. return val;
  289. });
  290. const wrapperStyle = (0, _vue.computed)(() => {
  291. const {
  292. zIndex,
  293. contentWrapperStyle
  294. } = props;
  295. const val = offsetStyle.value;
  296. return [{
  297. zIndex,
  298. transform: sPush.value ? pushTransform.value : undefined
  299. }, (0, _extends2.default)({}, contentWrapperStyle), val];
  300. });
  301. const renderHeader = prefixCls => {
  302. const {
  303. closable,
  304. headerStyle
  305. } = props;
  306. const extra = (0, _propsUtil.getPropsSlot)(slots, props, 'extra');
  307. const title = (0, _propsUtil.getPropsSlot)(slots, props, 'title');
  308. if (!title && !closable) {
  309. return null;
  310. }
  311. return (0, _vue.createVNode)("div", {
  312. "class": (0, _classNames.default)(`${prefixCls}-header`, {
  313. [`${prefixCls}-header-close-only`]: closable && !title && !extra
  314. }),
  315. "style": headerStyle
  316. }, [(0, _vue.createVNode)("div", {
  317. "class": `${prefixCls}-header-title`
  318. }, [renderCloseIcon(prefixCls), title && (0, _vue.createVNode)("div", {
  319. "class": `${prefixCls}-title`
  320. }, [title])]), extra && (0, _vue.createVNode)("div", {
  321. "class": `${prefixCls}-extra`
  322. }, [extra])]);
  323. };
  324. const renderCloseIcon = prefixCls => {
  325. var _a;
  326. const {
  327. closable
  328. } = props;
  329. const $closeIcon = slots.closeIcon ? (_a = slots.closeIcon) === null || _a === void 0 ? void 0 : _a.call(slots) : props.closeIcon;
  330. return closable && (0, _vue.createVNode)("button", {
  331. "key": "closer",
  332. "onClick": close,
  333. "aria-label": "Close",
  334. "class": `${prefixCls}-close`
  335. }, [$closeIcon === undefined ? (0, _vue.createVNode)(_CloseOutlined.default, null, null) : $closeIcon]);
  336. };
  337. const renderBody = prefixCls => {
  338. var _a;
  339. if (destroyClose.value && !props.forceRender && !load.value) {
  340. return null;
  341. }
  342. const {
  343. bodyStyle,
  344. drawerStyle
  345. } = props;
  346. return (0, _vue.createVNode)("div", {
  347. "class": `${prefixCls}-wrapper-body`,
  348. "style": drawerStyle
  349. }, [renderHeader(prefixCls), (0, _vue.createVNode)("div", {
  350. "key": "body",
  351. "class": `${prefixCls}-body`,
  352. "style": bodyStyle
  353. }, [(_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots)]), renderFooter(prefixCls)]);
  354. };
  355. const renderFooter = prefixCls => {
  356. const footer = (0, _propsUtil.getPropsSlot)(slots, props, 'footer');
  357. if (!footer) {
  358. return null;
  359. }
  360. const footerClassName = `${prefixCls}-footer`;
  361. return (0, _vue.createVNode)("div", {
  362. "class": footerClassName,
  363. "style": props.footerStyle
  364. }, [footer]);
  365. };
  366. const drawerClassName = (0, _vue.computed)(() => (0, _classNames.default)({
  367. 'no-mask': !props.mask,
  368. [`${prefixCls.value}-rtl`]: direction.value === 'rtl'
  369. }, props.rootClassName, hashId.value));
  370. // =========================== Motion ===========================
  371. const maskMotion = (0, _vue.computed)(() => {
  372. return (0, _transition.getTransitionProps)((0, _transition.getTransitionName)(prefixCls.value, 'mask-motion'));
  373. });
  374. const panelMotion = motionPlacement => {
  375. return (0, _transition.getTransitionProps)((0, _transition.getTransitionName)(prefixCls.value, `panel-motion-${motionPlacement}`));
  376. };
  377. return () => {
  378. const {
  379. width,
  380. height,
  381. placement,
  382. mask,
  383. forceRender
  384. } = props,
  385. rest = __rest(props, ["width", "height", "placement", "mask", "forceRender"]);
  386. const vcDrawerProps = (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({}, attrs), (0, _omit.default)(rest, ['size', 'closeIcon', 'closable', 'destroyOnClose', 'drawerStyle', 'headerStyle', 'bodyStyle', 'title', 'push', 'onAfterVisibleChange', 'onClose', 'onUpdate:visible', 'onUpdate:open', 'visible'])), {
  387. forceRender,
  388. onClose: close,
  389. afterVisibleChange,
  390. handler: false,
  391. prefixCls: prefixCls.value,
  392. open: visible.value,
  393. showMask: mask,
  394. placement,
  395. ref: vcDrawer
  396. });
  397. return wrapSSR((0, _vue.createVNode)(_Compact.NoCompactStyle, null, {
  398. default: () => [(0, _vue.createVNode)(_vcDrawer.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, vcDrawerProps), {}, {
  399. "maskMotion": maskMotion.value,
  400. "motion": panelMotion,
  401. "width": mergedWidth.value,
  402. "height": mergedHeight.value,
  403. "getContainer": getContainer.value,
  404. "rootClassName": drawerClassName.value,
  405. "rootStyle": props.rootStyle,
  406. "contentWrapperStyle": wrapperStyle.value
  407. }), {
  408. handler: props.handle ? () => props.handle : slots.handle,
  409. default: () => renderBody(prefixCls.value)
  410. })]
  411. }));
  412. };
  413. }
  414. });
  415. var _default = exports.default = (0, _type.withInstall)(Drawer);