UNPKG

wetrade-design

Version:

一款多语言支持Vue3的UI框架

235 lines (234 loc) 9.47 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.XAxisProps = void 0; var _vue = require("vue"); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectDestructuringEmpty2 = _interopRequireDefault(require("@babel/runtime/helpers/objectDestructuringEmpty")); var _useConfigInject2 = _interopRequireDefault(require("../../_util/hooks/useConfigInject")); var _classNames3 = _interopRequireDefault(require("../../_util/classNames")); var _wetradeTools = require("wetrade-tools"); var XAxisProps = function XAxisProps() { return { left: { type: [String, Number], default: '28px' }, right: { type: [String, Number], default: '4px' }, xLabelList: { type: Array, default: function _default() { return []; } }, // 对齐方式,shadow 居中对齐,line 两端对齐 isShowTooltipAxis: { type: String, default: 'shadow' }, // 是否显示全部x轴label showCustomXAll: { type: Boolean, default: false }, // X轴文字是否溢出隐藏 xLabelOverflow: { type: Boolean, default: false } }; }; exports.XAxisProps = XAxisProps; var XAxis = (0, _vue.defineComponent)({ name: 'WdXAxis', props: XAxisProps(), setup: function setup(props, _ref) { (0, _objectDestructuringEmpty2.default)(_ref); var _useConfigInject = (0, _useConfigInject2.default)('xAxis', props), prefixCls = _useConfigInject.prefixCls; var mainRef = (0, _vue.ref)(); var labelList = (0, _vue.ref)([]); // 更新X轴 var updateXLabel = function updateXLabel(xLabel) { labelList.value = []; var labelLen = xLabel.length; for (var i = 0; i < labelLen; i++) { // label少于4个 全部显示 // 是第一个,或最后一个,或处于中间值,显示 var isFirst = !i, isEnd = i === labelLen - 1; var isShow = false; if ((0, _typeof2.default)(xLabel[i]) === 'object') { var _xLabel$i; isShow = !!((_xLabel$i = xLabel[i]) !== null && _xLabel$i !== void 0 && _xLabel$i.isShow); } else { isShow = props.showCustomXAll || isFirst || isEnd || i === Math.ceil((labelLen - 1) / 2) || labelLen <= 4; } var text = xLabel[i]; if ((0, _typeof2.default)(xLabel[i]) === 'object') { var _xLabel$i2; text = ((_xLabel$i2 = xLabel[i]) === null || _xLabel$i2 === void 0 ? void 0 : _xLabel$i2.text) || text; } labelList.value.push({ isShow: isShow, text: text }); // 如果指示器类型是shadow 阴影,每个模块所占比例都一致,居中对齐 labelList.value[i].textAlign = props.isShowTooltipAxis === 'shadow' ? 'center' : getTextAlign(isFirst, labelLen, isEnd).textAlign; labelList.value[i].flex = props.isShowTooltipAxis === 'shadow' ? 1 : isFirst || isEnd ? 1 : 2; } }; // 对齐方式 function getTextAlign(isFirst, labelLen, isEnd) { var textAlignMap = [[function () { return isFirst; }, function () { return { textAlign: labelLen === 1 ? 'center' : 'left' }; } // 执行函数 ], [function () { return isEnd; }, function () { return { textAlign: 'right' }; }], [function () { return !isFirst && !isEnd; }, function () { return { textAlign: 'center' }; }]]; // 获取符合条件的子数组 var getDescribe = textAlignMap.find(function (item) { return item[0](); }); // 子数组存在则运行子数组中的第二个元素(执行函数) return getDescribe ? getDescribe[1]() : ''; } (0, _vue.watch)(function () { return props.xLabelList; }, function (val) { return updateXLabel(val); }, { immediate: true }); return function () { var _classNames, _mainRef$value, _classNames2; var list = labelList.value || []; var wrapperStyle = { paddingLeft: typeof props.left === 'string' ? props.left : props.left + 'px', paddingRight: typeof props.right === 'string' ? props.right : props.right + 'px' }; var itemClassName = (0, _classNames3.default)((_classNames = {}, (0, _defineProperty2.default)(_classNames, prefixCls.value + '__item', true), (0, _defineProperty2.default)(_classNames, prefixCls.value + '__ellipsis', props.xLabelOverflow), _classNames)); var paddingLeft = parseFloat(wrapperStyle.paddingLeft); var paddingRight = parseFloat(wrapperStyle.paddingRight); var wrapperWidth = ((_mainRef$value = mainRef.value) === null || _mainRef$value === void 0 ? void 0 : _mainRef$value.offsetWidth) - paddingLeft - paddingRight; var unitPixel = props.isShowTooltipAxis === 'shadow' ? wrapperWidth / list.length : wrapperWidth / (list.length - 1); var unitPixelPercent = unitPixel / wrapperWidth * 100; var renderWidth = 0; // 处理渲染列表 var renderList = list.reduce(function (prev, cur, index) { if (cur.isShow) { var textWidth = (0, _wetradeTools.getTextWidth)({ text: cur.text }); renderWidth += Math.max(unitPixel, textWidth); var translateX = '0px'; if (props.isShowTooltipAxis !== 'shadow') { if (cur.textAlign === 'center') { translateX = '-50%'; } else if (cur.textAlign === 'right') { translateX = '-100%'; } } var textPercent = Math.max(unitPixelPercent, textWidth / wrapperWidth * 100); var totalPercent = prev.length ? prev[prev.length - 1].totalPercent : 0; var item = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, cur), {}, { index: index, translateX: translateX, textPercent: textPercent, textWidth: textWidth, left: unitPixelPercent * index, totalPercent: totalPercent + textPercent, unitPixel: unitPixel }); return [].concat((0, _toConsumableArray2.default)(prev), [item]); } return prev; }, []); var otherLen = list.length - renderList.length; if (props.isShowTooltipAxis === 'shadow' && otherLen > 0) { var otherWrapperWidth = wrapperWidth - renderWidth; var otherUnitPixel = otherWrapperWidth / (list.length - renderList.length); var otherUnitPixelPercent = otherUnitPixel / wrapperWidth * 100; // 这个需要重新计算 renderList.forEach(function (item, index) { var otherPixelPercent = (item.index - index) * otherUnitPixelPercent; item.left = item.totalPercent - item.textPercent + otherPixelPercent; }); } var labelWidth = wrapperWidth / renderList.length / wrapperWidth * 100; var className = (0, _classNames3.default)((_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, prefixCls.value, true), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls.value, "__flex"), otherLen === 0), _classNames2)); var vNode; if (otherLen === 0) { // 显示全部的时候用flex布局 vNode = (0, _vue.createVNode)(_vue.Fragment, null, [list.map(function (arr, index) { var style = { textAlign: arr.textAlign, overflow: arr.isShow ? 'visible' : 'hidden', flex: arr.flex }; var textStyle = { display: arr.isShow ? 'block' : 'none' }; return (0, _vue.createVNode)("span", { "class": itemClassName, "key": index, "style": style }, [(0, _vue.createVNode)("span", { "style": textStyle }, [(0, _vue.createTextVNode)(" "), arr.text])]); })]); } else { vNode = (0, _vue.createVNode)("div", { "class": "".concat(prefixCls.value, "__box") }, [renderList.map(function (arr) { var w; if (props.isShowTooltipAxis !== 'shadow') { w = labelWidth; } else { w = arr.textPercent; } // 宽度和平移必须用百分比,否则在图表宽度变化时x轴label定位不会发生变化 var style = { width: w + '%', textAlign: arr.textAlign, left: arr.left + '%', transform: "translateX(".concat(arr.translateX, ")") }; return (0, _vue.createVNode)("span", { "class": itemClassName, "key": arr.index, "style": style }, [(0, _vue.createVNode)("span", null, [(0, _vue.createTextVNode)(" "), arr.text])]); })]); } return (0, _vue.createVNode)("div", { "class": className, "ref": mainRef, "style": wrapperStyle }, [vNode]); }; } }); var _default2 = XAxis; exports.default = _default2;