Dialog.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _contains = _interopRequireDefault(require("../vc-util/Dom/contains"));
  10. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  11. var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
  12. var _omit = _interopRequireDefault(require("../_util/omit"));
  13. var _pickAttrs = _interopRequireDefault(require("../_util/pickAttrs"));
  14. var _propsUtil = require("../_util/props-util");
  15. var _Content = _interopRequireDefault(require("./Content"));
  16. var _IDialogPropTypes = _interopRequireDefault(require("./IDialogPropTypes"));
  17. var _Mask = _interopRequireDefault(require("./Mask"));
  18. var _util = require("./util");
  19. var _default = (0, _vue.defineComponent)({
  20. compatConfig: {
  21. MODE: 3
  22. },
  23. name: 'Dialog',
  24. inheritAttrs: false,
  25. props: (0, _propsUtil.initDefaultProps)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _IDialogPropTypes.default)()), {}, {
  26. getOpenCount: Function,
  27. scrollLocker: Object
  28. }), {
  29. mask: true,
  30. visible: false,
  31. keyboard: true,
  32. closable: true,
  33. maskClosable: true,
  34. destroyOnClose: false,
  35. prefixCls: 'rc-dialog',
  36. getOpenCount: function getOpenCount() {
  37. return null;
  38. },
  39. focusTriggerAfterClose: true
  40. }),
  41. setup: function setup(props, _ref) {
  42. var attrs = _ref.attrs,
  43. slots = _ref.slots;
  44. var lastOutSideActiveElementRef = (0, _vue.ref)();
  45. var wrapperRef = (0, _vue.ref)();
  46. var contentRef = (0, _vue.ref)();
  47. var animatedVisible = (0, _vue.ref)(props.visible);
  48. var ariaIdRef = (0, _vue.ref)("vcDialogTitle".concat((0, _util.getUUID)()));
  49. // ========================= Events =========================
  50. var onDialogVisibleChanged = function onDialogVisibleChanged(newVisible) {
  51. if (newVisible) {
  52. // Try to focus
  53. if (!(0, _contains.default)(wrapperRef.value, document.activeElement)) {
  54. var _contentRef$value;
  55. lastOutSideActiveElementRef.value = document.activeElement;
  56. (_contentRef$value = contentRef.value) === null || _contentRef$value === void 0 ? void 0 : _contentRef$value.focus();
  57. }
  58. } else {
  59. var preAnimatedVisible = animatedVisible.value;
  60. // Clean up scroll bar & focus back
  61. animatedVisible.value = false;
  62. if (props.mask && lastOutSideActiveElementRef.value && props.focusTriggerAfterClose) {
  63. try {
  64. lastOutSideActiveElementRef.value.focus({
  65. preventScroll: true
  66. });
  67. } catch (e) {
  68. // Do nothing
  69. }
  70. lastOutSideActiveElementRef.value = null;
  71. }
  72. // Trigger afterClose only when change visible from true to false
  73. if (preAnimatedVisible) {
  74. var _props$afterClose;
  75. (_props$afterClose = props.afterClose) === null || _props$afterClose === void 0 ? void 0 : _props$afterClose.call(props);
  76. }
  77. }
  78. };
  79. var onInternalClose = function onInternalClose(e) {
  80. var _props$onClose;
  81. (_props$onClose = props.onClose) === null || _props$onClose === void 0 ? void 0 : _props$onClose.call(props, e);
  82. };
  83. // >>> Content
  84. var contentClickRef = (0, _vue.ref)(false);
  85. var contentTimeoutRef = (0, _vue.ref)();
  86. // We need record content click incase content popup out of dialog
  87. var onContentMouseDown = function onContentMouseDown() {
  88. clearTimeout(contentTimeoutRef.value);
  89. contentClickRef.value = true;
  90. };
  91. var onContentMouseUp = function onContentMouseUp() {
  92. contentTimeoutRef.value = setTimeout(function () {
  93. contentClickRef.value = false;
  94. });
  95. };
  96. var onWrapperClick = function onWrapperClick(e) {
  97. if (!props.maskClosable) return null;
  98. if (contentClickRef.value) {
  99. contentClickRef.value = false;
  100. } else if (wrapperRef.value === e.target) {
  101. onInternalClose(e);
  102. }
  103. };
  104. var onWrapperKeyDown = function onWrapperKeyDown(e) {
  105. if (props.keyboard && e.keyCode === _KeyCode.default.ESC) {
  106. e.stopPropagation();
  107. onInternalClose(e);
  108. return;
  109. }
  110. // keep focus inside dialog
  111. if (props.visible) {
  112. if (e.keyCode === _KeyCode.default.TAB) {
  113. contentRef.value.changeActive(!e.shiftKey);
  114. }
  115. }
  116. };
  117. (0, _vue.watch)(function () {
  118. return props.visible;
  119. }, function () {
  120. if (props.visible) {
  121. animatedVisible.value = true;
  122. }
  123. }, {
  124. flush: 'post'
  125. });
  126. (0, _vue.onBeforeUnmount)(function () {
  127. var _props$scrollLocker;
  128. clearTimeout(contentTimeoutRef.value);
  129. (_props$scrollLocker = props.scrollLocker) === null || _props$scrollLocker === void 0 ? void 0 : _props$scrollLocker.unLock();
  130. });
  131. (0, _vue.watchEffect)(function () {
  132. var _props$scrollLocker2;
  133. (_props$scrollLocker2 = props.scrollLocker) === null || _props$scrollLocker2 === void 0 ? void 0 : _props$scrollLocker2.unLock();
  134. if (animatedVisible.value) {
  135. var _props$scrollLocker3;
  136. (_props$scrollLocker3 = props.scrollLocker) === null || _props$scrollLocker3 === void 0 ? void 0 : _props$scrollLocker3.lock();
  137. }
  138. });
  139. return function () {
  140. var prefixCls = props.prefixCls,
  141. mask = props.mask,
  142. visible = props.visible,
  143. maskTransitionName = props.maskTransitionName,
  144. maskAnimation = props.maskAnimation,
  145. zIndex = props.zIndex,
  146. wrapClassName = props.wrapClassName,
  147. rootClassName = props.rootClassName,
  148. wrapStyle = props.wrapStyle,
  149. closable = props.closable,
  150. maskProps = props.maskProps,
  151. maskStyle = props.maskStyle,
  152. transitionName = props.transitionName,
  153. animation = props.animation,
  154. wrapProps = props.wrapProps,
  155. _props$title = props.title,
  156. title = _props$title === void 0 ? slots.title : _props$title;
  157. var style = attrs.style,
  158. className = attrs.class;
  159. return (0, _vue.createVNode)("div", (0, _objectSpread2.default)({
  160. "class": ["".concat(prefixCls, "-root"), rootClassName]
  161. }, (0, _pickAttrs.default)(props, {
  162. data: true
  163. })), [(0, _vue.createVNode)(_Mask.default, {
  164. "prefixCls": prefixCls,
  165. "visible": mask && visible,
  166. "motionName": (0, _util.getMotionName)(prefixCls, maskTransitionName, maskAnimation),
  167. "style": (0, _objectSpread2.default)({
  168. zIndex: zIndex
  169. }, maskStyle),
  170. "maskProps": maskProps
  171. }, null), (0, _vue.createVNode)("div", (0, _objectSpread2.default)({
  172. "tabIndex": -1,
  173. "onKeydown": onWrapperKeyDown,
  174. "class": (0, _classNames.default)("".concat(prefixCls, "-wrap"), wrapClassName),
  175. "ref": wrapperRef,
  176. "onClick": onWrapperClick,
  177. "role": "dialog",
  178. "aria-labelledby": title ? ariaIdRef.value : null,
  179. "style": (0, _objectSpread2.default)((0, _objectSpread2.default)({
  180. zIndex: zIndex
  181. }, wrapStyle), {}, {
  182. display: !animatedVisible.value ? 'none' : null
  183. })
  184. }, wrapProps), [(0, _vue.createVNode)(_Content.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _omit.default)(props, ['scrollLocker'])), {}, {
  185. "style": style,
  186. "class": className,
  187. "onMousedown": onContentMouseDown,
  188. "onMouseup": onContentMouseUp,
  189. "ref": contentRef,
  190. "closable": closable,
  191. "ariaId": ariaIdRef.value,
  192. "prefixCls": prefixCls,
  193. "visible": visible,
  194. "onClose": onInternalClose,
  195. "onVisibleChanged": onDialogVisibleChanged,
  196. "motionName": (0, _util.getMotionName)(prefixCls, transitionName, animation)
  197. }), slots)])]);
  198. };
  199. }
  200. });
  201. exports.default = _default;