linkmore-design
Version:
🌈 🚀lm组件库。🚀
123 lines (122 loc) • 4.22 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
var _excluded = ["record", "col", "columns", "children", "onChangeRecord", "onExpressionChange"];
import React, { useEffect } from 'react';
import { omit } from 'lodash';
import calc, { reset } from "../expression";
import Select from "../../select";
var Option = Select.Option;
var dfs = function dfs(dataSource, dataIndex, expression) {
var traverse = function traverse(arr) {
var history = [];
arr === null || arr === void 0 ? void 0 : arr.forEach(function (item) {
if (item !== null && item !== void 0 && item.children) {
traverse(item === null || item === void 0 ? void 0 : item.children);
}
calc(item, [[dataIndex, expression]], history);
});
if (history && history.length) {
var sum = 0;
history.forEach(function (h) {
sum += h.sum;
});
history.forEach(function (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["".concat(h.dataIndex, "_sum")] = sum;
});
}
};
traverse(dataSource);
};
var strategy = [{
value: '',
label: '不计算'
}, {
value: 'percent',
label: '百分比'
}, {
value: 'average',
label: '平均值'
}, {
value: 'max',
label: '最大值'
}, {
value: 'min',
label: '最小值'
}, {
value: 'sum',
label: '总计值'
}];
var CalcExpression = function CalcExpression(props) {
var record = props.record,
col = props.col,
columns = props.columns,
children = props.children,
onChangeRecord = props.onChangeRecord,
onExpressionChange = props.onExpressionChange,
rest = _objectWithoutProperties(props, _excluded);
// 鼠标移进移除不会重新渲染
var restParams = omit(rest, ['onMouseEnter', 'onMouseLeave']);
// 列参数
var isShowSelect = false; // 下拉框是否展示
var currentStrategy = []; // 使用的计算策略
if (col !== null && col !== void 0 && col.expression) {
if (typeof (col === null || col === void 0 ? void 0 : col.expression) === 'boolean') {
isShowSelect = true;
currentStrategy = strategy;
} else if (Array.isArray(col.expression)) {
isShowSelect = true;
currentStrategy = strategy.filter(function (item) {
return col.expression.includes(item.value);
});
}
}
var onChange = function onChange(value) {
if (!col.dataIndex) {
throw Error('no parameter dataIndex');
}
if (value) {
onChangeRecord(dfs, col.dataIndex, value, true);
} else {
onChangeRecord(reset, col.dataIndex, value, true);
}
onExpressionChange && onExpressionChange(col, value);
};
useEffect(function () {
// 使用默认值初始化
if (col !== null && col !== void 0 && col.defaultExpression) {
onChangeRecord(dfs, col.dataIndex, col === null || col === void 0 ? void 0 : col.defaultExpression, false);
}
}, [col === null || col === void 0 ? void 0 : col.defaultExpression]);
if (record && record._group && isShowSelect && col !== null && col !== void 0 && col.dataIndex) {
var select = Object.assign({
placeholder: '不计算',
allowClear: false,
size: "small",
bordered: false
}, col.expressionSelect ? col.expressionSelect : {});
return /*#__PURE__*/React.createElement("td", restParams, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center'
}
}, /*#__PURE__*/React.createElement("span", null, record[col.dataIndex]), /*#__PURE__*/React.createElement(Select, _extends({
className: "calc-select",
value: record["".concat(col.dataIndex, "_exp")],
onChange: onChange
}, select), currentStrategy.map(function (item) {
return /*#__PURE__*/React.createElement(Option, {
className: "calc-option",
value: item.value,
key: item.value
}, item.label);
}))));
}
return /*#__PURE__*/React.createElement("td", restParams, children);
};
export default CalcExpression;