Tour.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.tourProps = exports.default = void 0;
  7. var _vue = require("vue");
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _vcTrigger = _interopRequireWildcard(require("../vc-trigger"));
  11. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  12. var _useMergedState = _interopRequireDefault(require("../_util/hooks/useMergedState"));
  13. var _useTarget = _interopRequireDefault(require("./hooks/useTarget"));
  14. var _TourStep = _interopRequireDefault(require("./TourStep"));
  15. var _Mask = _interopRequireDefault(require("./Mask"));
  16. var _placements = require("./placements");
  17. var _propsUtil = require("../_util/props-util");
  18. var _type = require("../_util/type");
  19. var _PortalWrapper = _interopRequireDefault(require("../_util/PortalWrapper"));
  20. function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
  21. function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
  22. var __rest = void 0 && (void 0).__rest || function (s, e) {
  23. var t = {};
  24. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  25. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  26. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  27. }
  28. return t;
  29. };
  30. const CENTER_PLACEHOLDER = {
  31. left: '50%',
  32. top: '50%',
  33. width: '1px',
  34. height: '1px'
  35. };
  36. const tourProps = () => {
  37. const {
  38. builtinPlacements,
  39. popupAlign
  40. } = (0, _vcTrigger.triggerProps)();
  41. return {
  42. builtinPlacements,
  43. popupAlign,
  44. steps: (0, _type.arrayType)(),
  45. open: (0, _type.booleanType)(),
  46. defaultCurrent: {
  47. type: Number
  48. },
  49. current: {
  50. type: Number
  51. },
  52. onChange: (0, _type.functionType)(),
  53. onClose: (0, _type.functionType)(),
  54. onFinish: (0, _type.functionType)(),
  55. mask: (0, _type.someType)([Boolean, Object], true),
  56. arrow: (0, _type.someType)([Boolean, Object], true),
  57. rootClassName: {
  58. type: String
  59. },
  60. placement: (0, _type.stringType)('bottom'),
  61. prefixCls: {
  62. type: String,
  63. default: 'rc-tour'
  64. },
  65. renderPanel: (0, _type.functionType)(),
  66. gap: (0, _type.objectType)(),
  67. animated: (0, _type.someType)([Boolean, Object]),
  68. scrollIntoViewOptions: (0, _type.someType)([Boolean, Object], true),
  69. zIndex: {
  70. type: Number,
  71. default: 1001
  72. }
  73. };
  74. };
  75. exports.tourProps = tourProps;
  76. const Tour = (0, _vue.defineComponent)({
  77. name: 'Tour',
  78. inheritAttrs: false,
  79. props: (0, _propsUtil.initDefaultProps)(tourProps(), {}),
  80. setup(props) {
  81. const {
  82. defaultCurrent,
  83. placement,
  84. mask,
  85. scrollIntoViewOptions,
  86. open,
  87. gap,
  88. arrow
  89. } = (0, _vue.toRefs)(props);
  90. const triggerRef = (0, _vue.ref)();
  91. const [mergedCurrent, setMergedCurrent] = (0, _useMergedState.default)(0, {
  92. value: (0, _vue.computed)(() => props.current),
  93. defaultValue: defaultCurrent.value
  94. });
  95. const [mergedOpen, setMergedOpen] = (0, _useMergedState.default)(undefined, {
  96. value: (0, _vue.computed)(() => props.open),
  97. postState: origin => mergedCurrent.value < 0 || mergedCurrent.value >= props.steps.length ? false : origin !== null && origin !== void 0 ? origin : true
  98. });
  99. const openRef = (0, _vue.shallowRef)(mergedOpen.value);
  100. (0, _vue.watchEffect)(() => {
  101. if (mergedOpen.value && !openRef.value) {
  102. setMergedCurrent(0);
  103. }
  104. openRef.value = mergedOpen.value;
  105. });
  106. const curStep = (0, _vue.computed)(() => props.steps[mergedCurrent.value] || {});
  107. const mergedPlacement = (0, _vue.computed)(() => {
  108. var _a;
  109. return (_a = curStep.value.placement) !== null && _a !== void 0 ? _a : placement.value;
  110. });
  111. const mergedMask = (0, _vue.computed)(() => {
  112. var _a;
  113. return mergedOpen.value && ((_a = curStep.value.mask) !== null && _a !== void 0 ? _a : mask.value);
  114. });
  115. const mergedScrollIntoViewOptions = (0, _vue.computed)(() => {
  116. var _a;
  117. return (_a = curStep.value.scrollIntoViewOptions) !== null && _a !== void 0 ? _a : scrollIntoViewOptions.value;
  118. });
  119. const [posInfo, targetElement] = (0, _useTarget.default)((0, _vue.computed)(() => curStep.value.target), open, gap, mergedScrollIntoViewOptions);
  120. // ========================= arrow =========================
  121. const mergedArrow = (0, _vue.computed)(() => targetElement.value ? typeof curStep.value.arrow === 'undefined' ? arrow.value : curStep.value.arrow : false);
  122. const arrowPointAtCenter = (0, _vue.computed)(() => typeof mergedArrow.value === 'object' ? mergedArrow.value.pointAtCenter : false);
  123. (0, _vue.watch)(arrowPointAtCenter, () => {
  124. var _a;
  125. (_a = triggerRef.value) === null || _a === void 0 ? void 0 : _a.forcePopupAlign();
  126. });
  127. (0, _vue.watch)(mergedCurrent, () => {
  128. var _a;
  129. (_a = triggerRef.value) === null || _a === void 0 ? void 0 : _a.forcePopupAlign();
  130. });
  131. // ========================= Change =========================
  132. const onInternalChange = nextCurrent => {
  133. var _a;
  134. setMergedCurrent(nextCurrent);
  135. (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, nextCurrent);
  136. };
  137. return () => {
  138. var _a;
  139. const {
  140. prefixCls,
  141. steps,
  142. onClose,
  143. onFinish,
  144. rootClassName,
  145. renderPanel,
  146. animated,
  147. zIndex
  148. } = props,
  149. restProps = __rest(props, ["prefixCls", "steps", "onClose", "onFinish", "rootClassName", "renderPanel", "animated", "zIndex"]);
  150. // ========================= Render =========================
  151. // Skip if not init yet
  152. if (targetElement.value === undefined) {
  153. return null;
  154. }
  155. const handleClose = () => {
  156. setMergedOpen(false);
  157. onClose === null || onClose === void 0 ? void 0 : onClose(mergedCurrent.value);
  158. };
  159. const mergedShowMask = typeof mergedMask.value === 'boolean' ? mergedMask.value : !!mergedMask.value;
  160. const mergedMaskStyle = typeof mergedMask.value === 'boolean' ? undefined : mergedMask.value;
  161. // when targetElement is not exist, use body as triggerDOMNode
  162. const getTriggerDOMNode = () => {
  163. return targetElement.value || document.body;
  164. };
  165. const getPopupElement = () => (0, _vue.createVNode)(_TourStep.default, (0, _objectSpread2.default)({
  166. "arrow": mergedArrow.value,
  167. "key": "content",
  168. "prefixCls": prefixCls,
  169. "total": steps.length,
  170. "renderPanel": renderPanel,
  171. "onPrev": () => {
  172. onInternalChange(mergedCurrent.value - 1);
  173. },
  174. "onNext": () => {
  175. onInternalChange(mergedCurrent.value + 1);
  176. },
  177. "onClose": handleClose,
  178. "current": mergedCurrent.value,
  179. "onFinish": () => {
  180. handleClose();
  181. onFinish === null || onFinish === void 0 ? void 0 : onFinish();
  182. }
  183. }, curStep.value), null);
  184. const posInfoStyle = (0, _vue.computed)(() => {
  185. const info = posInfo.value || CENTER_PLACEHOLDER;
  186. // 如果info[key] 是number,添加 px
  187. const style = {};
  188. Object.keys(info).forEach(key => {
  189. if (typeof info[key] === 'number') {
  190. style[key] = `${info[key]}px`;
  191. } else {
  192. style[key] = info[key];
  193. }
  194. });
  195. return style;
  196. });
  197. return mergedOpen.value ? (0, _vue.createVNode)(_vue.Fragment, null, [(0, _vue.createVNode)(_Mask.default, {
  198. "zIndex": zIndex,
  199. "prefixCls": prefixCls,
  200. "pos": posInfo.value,
  201. "showMask": mergedShowMask,
  202. "style": mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.style,
  203. "fill": mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.color,
  204. "open": mergedOpen.value,
  205. "animated": animated,
  206. "rootClassName": rootClassName
  207. }, null), (0, _vue.createVNode)(_vcTrigger.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, restProps), {}, {
  208. "arrow": !!restProps.arrow,
  209. "builtinPlacements": !curStep.value.target ? undefined : (_a = restProps.builtinPlacements) !== null && _a !== void 0 ? _a : (0, _placements.getPlacements)(arrowPointAtCenter.value),
  210. "ref": triggerRef,
  211. "popupStyle": !curStep.value.target ? (0, _extends2.default)((0, _extends2.default)({}, curStep.value.style), {
  212. position: 'fixed',
  213. left: CENTER_PLACEHOLDER.left,
  214. top: CENTER_PLACEHOLDER.top,
  215. transform: 'translate(-50%, -50%)'
  216. }) : curStep.value.style,
  217. "popupPlacement": mergedPlacement.value,
  218. "popupVisible": mergedOpen.value,
  219. "popupClassName": (0, _classNames.default)(rootClassName, curStep.value.className),
  220. "prefixCls": prefixCls,
  221. "popup": getPopupElement,
  222. "forceRender": false,
  223. "destroyPopupOnHide": true,
  224. "zIndex": zIndex,
  225. "mask": false,
  226. "getTriggerDOMNode": getTriggerDOMNode
  227. }), {
  228. default: () => [(0, _vue.createVNode)(_PortalWrapper.default, {
  229. "visible": mergedOpen.value,
  230. "autoLock": true
  231. }, {
  232. default: () => [(0, _vue.createVNode)("div", {
  233. "class": (0, _classNames.default)(rootClassName, `${prefixCls}-target-placeholder`),
  234. "style": (0, _extends2.default)((0, _extends2.default)({}, posInfoStyle.value), {
  235. position: 'fixed',
  236. pointerEvents: 'none'
  237. })
  238. }, null)]
  239. })]
  240. })]) : null;
  241. };
  242. }
  243. });
  244. var _default = exports.default = Tour;