salary-management-front/pc4mobx/hrmSalary/pages/reportView/components/chartsRangeSettingsModal.js

406 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Author: 黎永顺
* name: 分析图标范围数据设置弹框
* Description:
* Date: 2023/5/11
*/
import React, { Component } from "react";
import { Button, Col, message, Row } from "antd";
import {
WeaDialog,
WeaError,
WeaFormItem,
WeaHelpfulTip,
WeaInputNumber,
WeaLocaleProvider,
WeaReqTop,
WeaSearchGroup,
WeaSelect
} from "ecCom";
import { saveRangeSetting } from "../../../apis/statistics";
import "./index.less";
const { getLabel } = WeaLocaleProvider;
class ChartsRangeSettingsModal extends Component {
constructor(props) {
super(props);
this.state = {
loading: false,
selectedKey: "1",
rangeSetting: {
itemValues: "",
itemColValue: "",
dimensionRange: "0"
},
rangeSettingExtra: {
itemSortValue: "",
itemColSortValue: "",
sortType: "0",
sortNum: ""
},
statisticalItemsOptions: [],
statisticalColsOptions: [],
rangeSettingExtraOptions: {
sortStatisticsOptions: [],
sortColumnsOptions: []
}
};
}
componentWillReceiveProps(nextProps, nextContext) {
if (nextProps.visible !== this.props.visible && nextProps.visible) {
const { columns } = nextProps;
this.setState({
statisticalItemsOptions: _.map(_.filter(columns, item => !_.isEmpty(item.children)), it => ({
key: it.column, showname: it.text,
children: _.map(it.children, child => ({ key: child.column, showname: child.text }))
}))
});
}
if (nextProps.rangeVal !== this.props.rangeVal && nextProps.rangeVal) {
const { rangeVal } = nextProps;
const { rangeSetting, rangeSettingExtra } = this.state;
this.setState({
rangeSetting: {
...rangeSetting,
..._.reduce(Object.keys(rangeSetting), (pre, cur) => {
return {
...pre,
[cur]: Array.isArray(rangeVal[cur]) ? rangeVal[cur].join(",") :
!_.isNil(rangeVal[cur]) ? rangeVal[cur].toString() : cur === "dimensionRange" ? "0" : ""
};
}, {})
},
rangeSettingExtra: {
...rangeSettingExtra,
..._.reduce(Object.keys(rangeSettingExtra), (pre, cur) => {
return {
...pre,
[cur]: !_.isNil(rangeVal[cur]) ? rangeVal[cur].toString() : cur === "sortType" ? "0" : ""
};
}, {})
}
}, () => {
const { statisticalItemsOptions } = this.state;
const { itemValues, itemSortValue } = rangeVal;
let statisticalColsOptions = [], sortStatisticsOptions = [];
_.forEach(itemValues, item => {
_.forEach(statisticalItemsOptions, child => {
if (item === child.key) {
statisticalColsOptions = [...statisticalColsOptions, ...child.children];
sortStatisticsOptions = [...sortStatisticsOptions, child];
}
});
});
this.setState({
statisticalColsOptions,
rangeSettingExtraOptions: {
sortStatisticsOptions
}
}, () => {
const { rangeSettingExtraOptions } = this.state;
const { sortStatisticsOptions } = rangeSettingExtraOptions;
this.setState({
rangeSettingExtraOptions: {
...rangeSettingExtraOptions,
sortColumnsOptions: !_.isEmpty(_.find(sortStatisticsOptions, it => it.key === itemSortValue)) ? _.find(sortStatisticsOptions, it => it.key === itemSortValue).children : []
}
});
});
});
}
}
handleSaveChartsRangeSettings = () => {
const { reportId, rangeVal } = this.props;
const { rangeSetting, rangeSettingExtra, selectedKey: chartsType } = this.state;
const { itemValues, itemColValue, dimensionRange } = rangeSetting;
if (!itemColValue && !itemValues) {
this.refs.itemValues.showError();
this.refs.itemColValue.showError();
return;
}
if (!itemValues) {
this.refs.itemValues.showError();
return;
}
if (!itemColValue) {
this.refs.itemColValue.showError();
return;
}
const payload = {
reportId, chartsType, id: rangeVal.id,
...rangeSetting,
itemValues: itemValues.split(",")
};
this.setState({ loading: true });
saveRangeSetting(
dimensionRange === "0" ? payload : { ...payload, ...rangeSettingExtra }
).then(({ status, errormsg }) => {
this.setState({ loading: false });
if (status) {
message.success(getLabel(111, "保存成功"));
this.props.onGetData();
this.handleCancel();
} else {
message.error(errormsg || getLabel(111, "保存失败"));
}
}).catch(() => this.setState({ loading: false }));
};
handleCancel = () => {
this.setState({
rangeSetting: {
itemValues: "",
itemColValue: "",
dimensionRange: "0"
},
rangeSettingExtra: {
itemSortValue: "",
itemColSortValue: "",
sortType: "0",
sortNum: ""
},
selectedKey: "1",
statisticalItemsOptions: [],
statisticalColsOptions: []
}, () => this.props.onCancel());
};
handleResetFormVal = () => {
const { selectedKey: chartsType } = this.state;
const { reportId } = this.props;
this.props.onChange({ reportId, chartsType });
};
handleChange = ({ key, val }) => {
const { rangeSetting } = this.state;
this.setState({
rangeSetting: {
...rangeSetting,
[key]: val
}
}, () => {
if (key === "itemValues") {
const { statisticalItemsOptions } = this.state;
let statisticalColsOptions = [], sortStatisticsOptions = [];
_.forEach(val.split(","), item => {
_.forEach(statisticalItemsOptions, child => {
if (item === child.key) {
statisticalColsOptions = [...statisticalColsOptions, ...child.children];
sortStatisticsOptions = [...sortStatisticsOptions, child];
}
});
});
this.setState({
statisticalColsOptions,
rangeSettingExtra: {
itemSortValue: "",
itemColSortValue: "",
sortType: "0",
sortNum: ""
},
rangeSettingExtraOptions: {
sortStatisticsOptions
}
});
}
});
};
handleChangeRange = ({ key, val }) => {
const { rangeSettingExtra } = this.state;
this.setState({
rangeSettingExtra: {
...rangeSettingExtra,
[key]: val
}
}, () => {
if (key === "itemSortValue") {
const { rangeSettingExtraOptions } = this.state;
const { sortStatisticsOptions } = rangeSettingExtraOptions;
this.setState({
rangeSettingExtraOptions: {
...rangeSettingExtraOptions,
sortColumnsOptions: _.find(sortStatisticsOptions, it => it.key === val).children
}
});
}
});
};
render() {
const {
selectedKey,
rangeSetting,
statisticalItemsOptions,
statisticalColsOptions,
rangeSettingExtra,
rangeSettingExtraOptions,
loading
} = this.state;
const dataShowItems = [
{
com: RangSelect({
name: "itemValues",
label: getLabel(111, "统计项"),
onChange: this.handleChange,
value: rangeSetting.itemValues,
options: statisticalItemsOptions,
multiple: selectedKey !== "0"
})
},
{
com: RangSelect({
name: "itemColValue",
label: getLabel(111, "统计列"),
onChange: this.handleChange,
value: rangeSetting.itemColValue,
options: statisticalColsOptions
})
}
];
const rangValItems = [
{
com: RangSelect({
name: "dimensionRange",
label: getLabel(111, "统计维度查看范围"),
onChange: this.handleChange,
value: rangeSetting.dimensionRange,
options: [
{ key: "0", showname: getLabel(111, "全部") },
{ key: "1", showname: getLabel(111, "设置范围") }
],
detailtype: 3,
helpfulTip: getLabel(111, "通过某个统计项统计值的排序,确定统计维度的查看范围。 例查看统计项【薪资成本】的统计值降序为前10的部门的分析图情况")
})
}
];
const rangValExtraItems = [
{
com: RangMultiItem({
label: getLabel(111, "设置范围"),
onChange: this.handleChangeRange,
value: rangeSettingExtra,
options: rangeSettingExtraOptions
})
}
];
const { dimensionRange } = rangeSetting;
return (
<WeaDialog
{...this.props} hasScroll style={{ width: 600 }}
buttons={[]} onCancel={this.handleCancel}
initLoadCss className="rangSettingWrapper"
title={<RangSetingTitle
loading={loading}
selectedKey={selectedKey}
onChange={selectedKey => this.setState({ selectedKey }, () => this.handleResetFormVal())}
onSaveChartsRangeSettings={this.handleSaveChartsRangeSettings}
/>}
>
<WeaSearchGroup
title={
<div className="rangSettingItemTitle">
<span>{getLabel(111, "统计项数据展示范围设置")}</span>
<WeaHelpfulTip
title={getLabel(111, "选择分析图要展示的统计项的统计列\n" +
"例:分析图想查看社保福利成本的合计和税前薪酬成本的合计\n" +
"则:统计项选择【社保福利成本】和【税前薪酬成本】查看列选择【本期合计】")}
placement="bottomLeft"
width={260}
/>
</div>
}
showGroup items={dataShowItems} needTigger col={1}
/>
{/*<WeaSearchGroup*/}
{/* title={getLabel(111, "统计维度值范围设置")}*/}
{/* showGroup items={dimensionRange === "0" ? rangValItems : [...rangValItems, ...rangValExtraItems]}*/}
{/* needTigger col={1}*/}
{/*/>*/}
</WeaDialog>
);
}
}
export default ChartsRangeSettingsModal;
const RangSetingTitle = (props) => {
const { selectedKey, onChange, onSaveChartsRangeSettings, loading } = props;
const btns = [<Button type="primary" loading={loading}
onClick={onSaveChartsRangeSettings}>{getLabel(111, "保存")}</Button>];
return <WeaReqTop
title={getLabel(111, "分析图数据展示范围设置")} icon={<i className="icon-coms-fa"/>}
iconBgcolor="#F14A2D" buttons={btns} showDropIcon={false}
tabDatas={[
{ key: "1", title: "柱状图" },
{ key: "2", title: "折线图" },
{ key: "0", title: "饼图" }
]} selectedKey={selectedKey} onChange={onChange}
/>;
};
const RangSelect = payload => {
const {
label, onChange, value, options = [],
viewAttr = 3, multiple = false, name,
detailtype = 1, helpfulTip
} = payload;
return (
<WeaFormItem label={
<React.Fragment>
<span style={{ marginRight: 8 }}>{label}</span>
{
helpfulTip &&
<WeaHelpfulTip
title={helpfulTip}
placement="bottomLeft"
width={260}
/>
}
</React.Fragment>
} labelCol={{ span: 8 }} wrapperCol={{ span: 12 }}>
<WeaError
tipPosition="bottom" ref={name}
error={getLabel(111, "此项必填")}>
<WeaSelect options={multiple ? options : [{ key: "", showname: "" }, ...options]} viewAttr={viewAttr}
value={value} multiple={multiple} detailtype={detailtype}
onChange={val => onChange({ key: name, val })}/>
</WeaError>
</WeaFormItem>
);
};
const RangMultiItem = payload => {
const { label, onChange, value, options } = payload;
const { itemSortValue, itemColSortValue, sortType, sortNum } = value;
const { sortStatisticsOptions, sortColumnsOptions } = options;
return (
<WeaFormItem label={label} labelCol={{ span: 8 }} wrapperCol={{ span: 12 }}>
<Row style={{ marginBottom: 16 }}>
<Col span={8}>{getLabel(111, "排序统计项:")}</Col>
<Col span={16}><WeaSelect options={sortStatisticsOptions} value={itemSortValue}
onChange={val => onChange({ key: "itemSortValue", val })}/></Col>
</Row>
<Row style={{ marginBottom: 16 }}>
<Col span={8}>{getLabel(111, "排序列:")}</Col>
<Col span={16}><WeaSelect options={sortColumnsOptions} value={itemColSortValue}
onChange={val => onChange({ key: "itemColSortValue", val })}/></Col>
</Row>
<Row style={{ marginBottom: 16 }}>
<Col span={12}>
<WeaSelect
options={
[
{ key: "0", showname: "升序" },
{ key: "1", showname: "降序" }
]
}
detailtype={3} value={sortType} onChange={val => onChange({ key: "sortType", val })}
/>
</Col>
<Col span={12} className="extraCol">
<span style={{ marginRight: 8 }}>{getLabel(111, "前")}</span>
<WeaInputNumber value={sortNum} precision={2} onChange={val => onChange({ key: "sortNum", val })}/>
</Col>
</Row>
</WeaFormItem>
);
};