linkmore-design
Version:
🌈 🚀lm组件库。🚀
128 lines (126 loc) • 3.95 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireWildcard(require("react"));
var _lodash = require("lodash");
var _expression = _interopRequireWildcard(require("../expression"));
var _select = _interopRequireDefault(require("../../select"));
const Option = _select.default.Option;
const dfs = function (dataSource, dataIndex, expression) {
const traverse = arr => {
let history = [];
arr?.forEach(item => {
if (item?.children) {
traverse(item?.children);
}
(0, _expression.default)(item, [[dataIndex, expression]], history);
});
if (history && history.length) {
let sum = 0;
history.forEach(h => {
sum += h.sum;
});
history.forEach(h => {
if (sum < 0.000001) {
sum = 0;
h.item[h.dataIndex] = '0%';
} else {
h.item[h.dataIndex] = (h.sum / sum * 100).toFixed(2) + '%';
}
h.item[`${h.dataIndex}_sum`] = sum;
});
}
};
traverse(dataSource);
};
const strategy = [{
value: '',
label: '不计算'
}, {
value: 'percent',
label: '百分比'
}, {
value: 'average',
label: '平均值'
}, {
value: 'max',
label: '最大值'
}, {
value: 'min',
label: '最小值'
}, {
value: 'sum',
label: '总计值'
}];
const CalcExpression = props => {
const {
record,
col,
columns,
children,
onChangeRecord,
onExpressionChange,
...rest
} = props;
// 鼠标移进移除不会重新渲染
const restParams = (0, _lodash.omit)(rest, ['onMouseEnter', 'onMouseLeave']);
// 列参数
let isShowSelect = false; // 下拉框是否展示
let currentStrategy = []; // 使用的计算策略
if (col?.expression) {
if (typeof col?.expression === 'boolean') {
isShowSelect = true;
currentStrategy = strategy;
} else if (Array.isArray(col.expression)) {
isShowSelect = true;
currentStrategy = strategy.filter(item => col.expression.includes(item.value));
}
}
const onChange = value => {
if (!col.dataIndex) {
throw Error('no parameter dataIndex');
}
if (value) {
onChangeRecord(dfs, col.dataIndex, value, true);
} else {
onChangeRecord(_expression.reset, col.dataIndex, value, true);
}
onExpressionChange && onExpressionChange(col, value);
};
(0, _react.useEffect)(() => {
// 使用默认值初始化
if (col?.defaultExpression) {
onChangeRecord(dfs, col.dataIndex, col?.defaultExpression, false);
}
}, [col?.defaultExpression]);
if (record && record._group && isShowSelect && col?.dataIndex) {
const select = Object.assign({
placeholder: '不计算',
allowClear: false,
size: "small",
bordered: false
}, col.expressionSelect ? col.expressionSelect : {});
return /*#__PURE__*/_react.default.createElement("td", restParams, /*#__PURE__*/_react.default.createElement("div", {
style: {
display: 'flex',
alignItems: 'center'
}
}, /*#__PURE__*/_react.default.createElement("span", null, record[col.dataIndex]), /*#__PURE__*/_react.default.createElement(_select.default, (0, _extends2.default)({
className: "calc-select",
value: record[`${col.dataIndex}_exp`],
onChange: onChange
}, select), currentStrategy.map(item => /*#__PURE__*/_react.default.createElement(Option, {
className: "calc-option",
value: item.value,
key: item.value
}, item.label)))));
}
return /*#__PURE__*/_react.default.createElement("td", restParams, children);
};
var _default = CalcExpression;
exports.default = _default;