Badge.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = exports.badgeProps = void 0;
  7. var _vue = require("vue");
  8. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  11. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  12. var _ScrollNumber = _interopRequireDefault(require("./ScrollNumber"));
  13. var _classNames2 = _interopRequireDefault(require("../_util/classNames"));
  14. var _propsUtil = require("../_util/props-util");
  15. var _vnode = require("../_util/vnode");
  16. var _transition = require("../_util/transition");
  17. var _Ribbon = _interopRequireDefault(require("./Ribbon"));
  18. var _utils = require("./utils");
  19. var _useConfigInject2 = _interopRequireDefault(require("../_util/hooks/useConfigInject"));
  20. var _isNumeric = _interopRequireDefault(require("../_util/isNumeric"));
  21. var badgeProps = function badgeProps() {
  22. return {
  23. /** Number to show in badge */
  24. count: _vueTypes.default.any,
  25. showZero: {
  26. type: Boolean,
  27. default: undefined
  28. },
  29. /** Max count to show */
  30. overflowCount: {
  31. type: Number,
  32. default: 99
  33. },
  34. /** whether to show red dot without number */
  35. dot: {
  36. type: Boolean,
  37. default: undefined
  38. },
  39. prefixCls: String,
  40. scrollNumberPrefixCls: String,
  41. status: {
  42. type: String
  43. },
  44. size: {
  45. type: String,
  46. default: 'default'
  47. },
  48. color: String,
  49. text: _vueTypes.default.any,
  50. offset: Array,
  51. numberStyle: {
  52. type: Object,
  53. default: undefined
  54. },
  55. title: String
  56. };
  57. };
  58. exports.badgeProps = badgeProps;
  59. var _default2 = (0, _vue.defineComponent)({
  60. compatConfig: {
  61. MODE: 3
  62. },
  63. name: 'ABadge',
  64. Ribbon: _Ribbon.default,
  65. inheritAttrs: false,
  66. props: badgeProps(),
  67. slots: ['text', 'count'],
  68. setup: function setup(props, _ref) {
  69. var slots = _ref.slots,
  70. attrs = _ref.attrs;
  71. var _useConfigInject = (0, _useConfigInject2.default)('badge', props),
  72. prefixCls = _useConfigInject.prefixCls,
  73. direction = _useConfigInject.direction;
  74. // ================================ Misc ================================
  75. var numberedDisplayCount = (0, _vue.computed)(function () {
  76. return props.count > props.overflowCount ? "".concat(props.overflowCount, "+") : props.count;
  77. });
  78. var hasStatus = (0, _vue.computed)(function () {
  79. return props.status !== null && props.status !== undefined || props.color !== null && props.color !== undefined;
  80. });
  81. var isZero = (0, _vue.computed)(function () {
  82. return numberedDisplayCount.value === '0' || numberedDisplayCount.value === 0;
  83. });
  84. var showAsDot = (0, _vue.computed)(function () {
  85. return props.dot && !isZero.value;
  86. });
  87. var mergedCount = (0, _vue.computed)(function () {
  88. return showAsDot.value ? '' : numberedDisplayCount.value;
  89. });
  90. var isHidden = (0, _vue.computed)(function () {
  91. var isEmpty = mergedCount.value === null || mergedCount.value === undefined || mergedCount.value === '';
  92. return (isEmpty || isZero.value && !props.showZero) && !showAsDot.value;
  93. });
  94. // Count should be cache in case hidden change it
  95. var livingCount = (0, _vue.ref)(props.count);
  96. // We need cache count since remove motion should not change count display
  97. var displayCount = (0, _vue.ref)(mergedCount.value);
  98. // We will cache the dot status to avoid shaking on leaved motion
  99. var isDotRef = (0, _vue.ref)(showAsDot.value);
  100. (0, _vue.watch)([function () {
  101. return props.count;
  102. }, mergedCount, showAsDot], function () {
  103. if (!isHidden.value) {
  104. livingCount.value = props.count;
  105. displayCount.value = mergedCount.value;
  106. isDotRef.value = showAsDot.value;
  107. }
  108. }, {
  109. immediate: true
  110. });
  111. // Shared styles
  112. var statusCls = (0, _vue.computed)(function () {
  113. var _ref2;
  114. return _ref2 = {}, (0, _defineProperty2.default)(_ref2, "".concat(prefixCls.value, "-status-dot"), hasStatus.value), (0, _defineProperty2.default)(_ref2, "".concat(prefixCls.value, "-status-").concat(props.status), !!props.status), (0, _defineProperty2.default)(_ref2, "".concat(prefixCls.value, "-status-").concat(props.color), (0, _utils.isPresetColor)(props.color)), _ref2;
  115. });
  116. var statusStyle = (0, _vue.computed)(function () {
  117. if (props.color && !(0, _utils.isPresetColor)(props.color)) {
  118. return {
  119. background: props.color
  120. };
  121. } else {
  122. return {};
  123. }
  124. });
  125. var scrollNumberCls = (0, _vue.computed)(function () {
  126. var _ref3;
  127. return _ref3 = {}, (0, _defineProperty2.default)(_ref3, "".concat(prefixCls.value, "-dot"), isDotRef.value), (0, _defineProperty2.default)(_ref3, "".concat(prefixCls.value, "-count"), !isDotRef.value), (0, _defineProperty2.default)(_ref3, "".concat(prefixCls.value, "-count-sm"), props.size === 'small'), (0, _defineProperty2.default)(_ref3, "".concat(prefixCls.value, "-multiple-words"), !isDotRef.value && displayCount.value && displayCount.value.toString().length > 1), (0, _defineProperty2.default)(_ref3, "".concat(prefixCls.value, "-status-").concat(props.status), !!props.status), (0, _defineProperty2.default)(_ref3, "".concat(prefixCls.value, "-status-").concat(props.color), (0, _utils.isPresetColor)(props.color)), _ref3;
  128. });
  129. return function () {
  130. var _slots$default, _slots$count, _classNames;
  131. var offset = props.offset,
  132. title = props.title,
  133. color = props.color;
  134. var style = attrs.style;
  135. var text = (0, _propsUtil.getPropsSlot)(slots, props, 'text');
  136. var pre = prefixCls.value;
  137. var count = livingCount.value;
  138. var children = (0, _propsUtil.flattenChildren)((_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots));
  139. children = children.length ? children : null;
  140. var visible = !!(!isHidden.value || slots.count);
  141. // =============================== Styles ===============================
  142. var mergedStyle = function () {
  143. if (!offset) {
  144. return (0, _objectSpread2.default)({}, style);
  145. }
  146. var offsetStyle = {
  147. marginTop: (0, _isNumeric.default)(offset[1]) ? "".concat(offset[1], "px") : offset[1]
  148. };
  149. if (direction.value === 'rtl') {
  150. offsetStyle.left = "".concat(parseInt(offset[0], 10), "px");
  151. } else {
  152. offsetStyle.right = "".concat(-parseInt(offset[0], 10), "px");
  153. }
  154. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, offsetStyle), style);
  155. }();
  156. // =============================== Render ===============================
  157. // >>> Title
  158. var titleNode = title !== null && title !== void 0 ? title : typeof count === 'string' || typeof count === 'number' ? count : undefined;
  159. // >>> Status Text
  160. var statusTextNode = visible || !text ? null : (0, _vue.createVNode)("span", {
  161. "class": "".concat(pre, "-status-text")
  162. }, [text]);
  163. // >>> Display Component
  164. var displayNode = (0, _typeof2.default)(count) === 'object' || count === undefined && slots.count ? (0, _vnode.cloneElement)(count !== null && count !== void 0 ? count : (_slots$count = slots.count) === null || _slots$count === void 0 ? void 0 : _slots$count.call(slots), {
  165. style: mergedStyle
  166. }, false) : null;
  167. var badgeClassName = (0, _classNames2.default)(pre, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(pre, "-status"), hasStatus.value), (0, _defineProperty2.default)(_classNames, "".concat(pre, "-not-a-wrapper"), !children), (0, _defineProperty2.default)(_classNames, "".concat(pre, "-rtl"), direction.value === 'rtl'), _classNames), attrs.class);
  168. // <Badge status="success" />
  169. if (!children && hasStatus.value) {
  170. var statusTextColor = mergedStyle.color;
  171. return (0, _vue.createVNode)("span", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
  172. "class": badgeClassName,
  173. "style": mergedStyle
  174. }), [(0, _vue.createVNode)("span", {
  175. "class": statusCls.value,
  176. "style": statusStyle.value
  177. }, null), (0, _vue.createVNode)("span", {
  178. "style": {
  179. color: statusTextColor
  180. },
  181. "class": "".concat(pre, "-status-text")
  182. }, [text])]);
  183. }
  184. var transitionProps = (0, _transition.getTransitionProps)(children ? "".concat(pre, "-zoom") : '', {
  185. appear: false
  186. });
  187. var scrollNumberStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, mergedStyle), props.numberStyle);
  188. if (color && !(0, _utils.isPresetColor)(color)) {
  189. scrollNumberStyle = scrollNumberStyle || {};
  190. scrollNumberStyle.background = color;
  191. }
  192. return (0, _vue.createVNode)("span", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
  193. "class": badgeClassName
  194. }), [children, (0, _vue.createVNode)(_transition.Transition, transitionProps, {
  195. default: function _default() {
  196. return [(0, _vue.withDirectives)((0, _vue.createVNode)(_ScrollNumber.default, {
  197. "prefixCls": props.scrollNumberPrefixCls,
  198. "show": visible,
  199. "class": scrollNumberCls.value,
  200. "count": displayCount.value,
  201. "title": titleNode,
  202. "style": scrollNumberStyle,
  203. "key": "scrollNumber"
  204. }, {
  205. default: function _default() {
  206. return [displayNode];
  207. }
  208. }), [[_vue.vShow, visible]])];
  209. }
  210. }), statusTextNode]);
  211. };
  212. }
  213. });
  214. exports.default = _default2;