index.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.rateProps = exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _propsUtil = require("../_util/props-util");
  10. var _type = require("../_util/type");
  11. var _util = require("./util");
  12. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  13. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  14. var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
  15. var _StarFilled = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/StarFilled"));
  16. var _tooltip = _interopRequireDefault(require("../tooltip"));
  17. var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject"));
  18. var _Star = _interopRequireDefault(require("./Star"));
  19. var _useRefs = _interopRequireDefault(require("../_util/hooks/useRefs"));
  20. var _FormItemContext = require("../form/FormItemContext");
  21. var _style = _interopRequireDefault(require("./style"));
  22. const rateProps = () => ({
  23. prefixCls: String,
  24. count: Number,
  25. value: Number,
  26. allowHalf: {
  27. type: Boolean,
  28. default: undefined
  29. },
  30. allowClear: {
  31. type: Boolean,
  32. default: undefined
  33. },
  34. tooltips: Array,
  35. disabled: {
  36. type: Boolean,
  37. default: undefined
  38. },
  39. character: _vueTypes.default.any,
  40. autofocus: {
  41. type: Boolean,
  42. default: undefined
  43. },
  44. tabindex: _vueTypes.default.oneOfType([_vueTypes.default.number, _vueTypes.default.string]),
  45. direction: String,
  46. id: String,
  47. onChange: Function,
  48. onHoverChange: Function,
  49. 'onUpdate:value': Function,
  50. onFocus: Function,
  51. onBlur: Function,
  52. onKeydown: Function
  53. });
  54. exports.rateProps = rateProps;
  55. const Rate = (0, _vue.defineComponent)({
  56. compatConfig: {
  57. MODE: 3
  58. },
  59. name: 'ARate',
  60. inheritAttrs: false,
  61. props: (0, _propsUtil.initDefaultProps)(rateProps(), {
  62. value: 0,
  63. count: 5,
  64. allowHalf: false,
  65. allowClear: true,
  66. tabindex: 0,
  67. direction: 'ltr'
  68. }),
  69. // emits: ['hoverChange', 'update:value', 'change', 'focus', 'blur', 'keydown'],
  70. setup(props, _ref) {
  71. let {
  72. slots,
  73. attrs,
  74. emit,
  75. expose
  76. } = _ref;
  77. const {
  78. prefixCls,
  79. direction
  80. } = (0, _useConfigInject.default)('rate', props);
  81. const [wrapSSR, hashId] = (0, _style.default)(prefixCls);
  82. const formItemContext = (0, _FormItemContext.useInjectFormItemContext)();
  83. const rateRef = (0, _vue.ref)();
  84. const [setRef, starRefs] = (0, _useRefs.default)();
  85. const state = (0, _vue.reactive)({
  86. value: props.value,
  87. focused: false,
  88. cleanedValue: null,
  89. hoverValue: undefined
  90. });
  91. (0, _vue.watch)(() => props.value, () => {
  92. state.value = props.value;
  93. });
  94. const getStarDOM = index => {
  95. return (0, _propsUtil.findDOMNode)(starRefs.value.get(index));
  96. };
  97. const getStarValue = (index, x) => {
  98. const reverse = direction.value === 'rtl';
  99. let value = index + 1;
  100. if (props.allowHalf) {
  101. const starEle = getStarDOM(index);
  102. const leftDis = (0, _util.getOffsetLeft)(starEle);
  103. const width = starEle.clientWidth;
  104. if (reverse && x - leftDis > width / 2) {
  105. value -= 0.5;
  106. } else if (!reverse && x - leftDis < width / 2) {
  107. value -= 0.5;
  108. }
  109. }
  110. return value;
  111. };
  112. const changeValue = value => {
  113. if (props.value === undefined) {
  114. state.value = value;
  115. }
  116. emit('update:value', value);
  117. emit('change', value);
  118. formItemContext.onFieldChange();
  119. };
  120. const onHover = (e, index) => {
  121. const hoverValue = getStarValue(index, e.pageX);
  122. if (hoverValue !== state.cleanedValue) {
  123. state.hoverValue = hoverValue;
  124. state.cleanedValue = null;
  125. }
  126. emit('hoverChange', hoverValue);
  127. };
  128. const onMouseLeave = () => {
  129. state.hoverValue = undefined;
  130. state.cleanedValue = null;
  131. emit('hoverChange', undefined);
  132. };
  133. const onClick = (event, index) => {
  134. const {
  135. allowClear
  136. } = props;
  137. const newValue = getStarValue(index, event.pageX);
  138. let isReset = false;
  139. if (allowClear) {
  140. isReset = newValue === state.value;
  141. }
  142. onMouseLeave();
  143. changeValue(isReset ? 0 : newValue);
  144. state.cleanedValue = isReset ? newValue : null;
  145. };
  146. const onFocus = e => {
  147. state.focused = true;
  148. emit('focus', e);
  149. };
  150. const onBlur = e => {
  151. state.focused = false;
  152. emit('blur', e);
  153. formItemContext.onFieldBlur();
  154. };
  155. const onKeyDown = event => {
  156. const {
  157. keyCode
  158. } = event;
  159. const {
  160. count,
  161. allowHalf
  162. } = props;
  163. const reverse = direction.value === 'rtl';
  164. if (keyCode === _KeyCode.default.RIGHT && state.value < count && !reverse) {
  165. if (allowHalf) {
  166. state.value += 0.5;
  167. } else {
  168. state.value += 1;
  169. }
  170. changeValue(state.value);
  171. event.preventDefault();
  172. } else if (keyCode === _KeyCode.default.LEFT && state.value > 0 && !reverse) {
  173. if (allowHalf) {
  174. state.value -= 0.5;
  175. } else {
  176. state.value -= 1;
  177. }
  178. changeValue(state.value);
  179. event.preventDefault();
  180. } else if (keyCode === _KeyCode.default.RIGHT && state.value > 0 && reverse) {
  181. if (allowHalf) {
  182. state.value -= 0.5;
  183. } else {
  184. state.value -= 1;
  185. }
  186. changeValue(state.value);
  187. event.preventDefault();
  188. } else if (keyCode === _KeyCode.default.LEFT && state.value < count && reverse) {
  189. if (allowHalf) {
  190. state.value += 0.5;
  191. } else {
  192. state.value += 1;
  193. }
  194. changeValue(state.value);
  195. event.preventDefault();
  196. }
  197. emit('keydown', event);
  198. };
  199. const focus = () => {
  200. if (!props.disabled) {
  201. rateRef.value.focus();
  202. }
  203. };
  204. const blur = () => {
  205. if (!props.disabled) {
  206. rateRef.value.blur();
  207. }
  208. };
  209. expose({
  210. focus,
  211. blur
  212. });
  213. (0, _vue.onMounted)(() => {
  214. const {
  215. autofocus,
  216. disabled
  217. } = props;
  218. if (autofocus && !disabled) {
  219. focus();
  220. }
  221. });
  222. const characterRender = (node, _ref2) => {
  223. let {
  224. index
  225. } = _ref2;
  226. const {
  227. tooltips
  228. } = props;
  229. if (!tooltips) return node;
  230. return (0, _vue.createVNode)(_tooltip.default, {
  231. "title": tooltips[index]
  232. }, {
  233. default: () => [node]
  234. });
  235. };
  236. return () => {
  237. const {
  238. count,
  239. allowHalf,
  240. disabled,
  241. tabindex,
  242. id = formItemContext.id.value
  243. } = props;
  244. const {
  245. class: className,
  246. style
  247. } = attrs;
  248. const stars = [];
  249. const disabledClass = disabled ? `${prefixCls.value}-disabled` : '';
  250. const character = props.character || slots.character || (() => (0, _vue.createVNode)(_StarFilled.default, null, null));
  251. for (let index = 0; index < count; index++) {
  252. stars.push((0, _vue.createVNode)(_Star.default, {
  253. "ref": setRef(index),
  254. "key": index,
  255. "index": index,
  256. "count": count,
  257. "disabled": disabled,
  258. "prefixCls": `${prefixCls.value}-star`,
  259. "allowHalf": allowHalf,
  260. "value": state.hoverValue === undefined ? state.value : state.hoverValue,
  261. "onClick": onClick,
  262. "onHover": onHover,
  263. "character": character,
  264. "characterRender": characterRender,
  265. "focused": state.focused
  266. }, null));
  267. }
  268. const rateClassName = (0, _classNames.default)(prefixCls.value, disabledClass, className, {
  269. [hashId.value]: true,
  270. [`${prefixCls.value}-rtl`]: direction.value === 'rtl'
  271. });
  272. return wrapSSR((0, _vue.createVNode)("ul", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
  273. "id": id,
  274. "class": rateClassName,
  275. "style": style,
  276. "onMouseleave": disabled ? null : onMouseLeave,
  277. "tabindex": disabled ? -1 : tabindex,
  278. "onFocus": disabled ? null : onFocus,
  279. "onBlur": disabled ? null : onBlur,
  280. "onKeydown": disabled ? null : onKeyDown,
  281. "ref": rateRef,
  282. "role": "radiogroup"
  283. }), [stars]));
  284. };
  285. }
  286. });
  287. var _default = exports.default = (0, _type.withInstall)(Rate);