产品-系统多语言·
This commit is contained in:
parent
c2b659681b
commit
2194640fce
|
|
@ -5,11 +5,12 @@
|
|||
* Date: 2022-09-27 18:17:02
|
||||
*/
|
||||
import React, { Component } from "react";
|
||||
import { WeaCheckbox, WeaDatePicker, WeaFormItem, WeaInput, WeaSearchGroup, WeaTop } from "ecCom";
|
||||
import { WeaCheckbox, WeaDatePicker, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup, WeaTop } from "ecCom";
|
||||
import * as API from "../../apis/ruleconfig";
|
||||
import { Button, message } from "antd";
|
||||
import "./index.less";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
const Input = (props) => {
|
||||
const { label, value } = props;
|
||||
return (
|
||||
|
|
@ -55,10 +56,10 @@ class AppConfig extends Component {
|
|||
API.appSettingSave({ openAcctResultSum, displayEmpInfoReport }).then(({ status, errormsg }) => {
|
||||
this.setState({ loading: false });
|
||||
if (status) {
|
||||
message.success("设置成功!");
|
||||
message.success(getLabel(111, "设置成功"));
|
||||
this.queryAppsetting();
|
||||
} else {
|
||||
message.error(errormsg || "设置失败!");
|
||||
message.error(errormsg || getLabel(111, "设置失败"));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
@ -69,13 +70,13 @@ class AppConfig extends Component {
|
|||
const items = [
|
||||
{
|
||||
com: Input({
|
||||
label: "版本号",
|
||||
label: getLabel(111, "版本号"),
|
||||
value: version
|
||||
})
|
||||
},
|
||||
{
|
||||
com: CheckBox({
|
||||
label: "显示薪资核算结果合计列",
|
||||
label: getLabel(111, "显示薪资核算结果合计列"),
|
||||
value: openAcctResultSum,
|
||||
onChange: (openAcctResultSum) => {
|
||||
this.setState({ openAcctResultSum });
|
||||
|
|
@ -84,7 +85,7 @@ class AppConfig extends Component {
|
|||
},
|
||||
{
|
||||
com: CheckBox({
|
||||
label: "是否显示脱敏表人员信息",
|
||||
label: getLabel(111, "是否显示脱敏表人员信息"),
|
||||
value: displayEmpInfoReport,
|
||||
onChange: (displayEmpInfoReport) => {
|
||||
this.setState({ displayEmpInfoReport });
|
||||
|
|
@ -93,14 +94,14 @@ class AppConfig extends Component {
|
|||
},
|
||||
{
|
||||
com: CheckBox({
|
||||
label: "是否输出日志",
|
||||
label: getLabel(111, "是否输出日志"),
|
||||
disabled: true,
|
||||
value: isLog
|
||||
})
|
||||
},
|
||||
{
|
||||
com: CheckBox({
|
||||
label: "是否可编辑系统公式",
|
||||
label: getLabel(111, "是否可编辑系统公式"),
|
||||
disabled: true,
|
||||
value: openFormulaForcedEditing
|
||||
})
|
||||
|
|
@ -109,7 +110,7 @@ class AppConfig extends Component {
|
|||
return (
|
||||
<div className="appConfigWrapper">
|
||||
<WeaTop
|
||||
title={<span>应用设置</span>}
|
||||
title={<span>{getLabel(111, "应用设置")}</span>}
|
||||
icon={<i className="icon-coms-Flow-setting"/>}
|
||||
iconBgcolor="#F14A2D"
|
||||
buttons={btns}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,14 @@
|
|||
import React, { Component } from "react";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import { WeaDatePicker, WeaFormItem, WeaHelpfulTip, WeaInput, WeaSearchGroup, WeaSelect } from "ecCom";
|
||||
import {
|
||||
WeaDatePicker,
|
||||
WeaFormItem,
|
||||
WeaHelpfulTip,
|
||||
WeaInput,
|
||||
WeaLocaleProvider,
|
||||
WeaSearchGroup,
|
||||
WeaSelect
|
||||
} from "ecCom";
|
||||
import { Button, Dropdown, Menu, message, Modal } from "antd";
|
||||
import {
|
||||
autoAddAll,
|
||||
|
|
@ -23,6 +31,8 @@ import { convertToUrlString } from "../../../util/url";
|
|||
import Layout from "../layout";
|
||||
import moment from "moment";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
|
||||
@inject("taxAgentStore", "cumDeductStore")
|
||||
@observer
|
||||
class Index extends Component {
|
||||
|
|
@ -77,10 +87,10 @@ class Index extends Component {
|
|||
autoAddAll({ yearMonth: declareMonth }).then(({ status, data, errormsg }) => {
|
||||
this.setState({ addAllLoading: false });
|
||||
if (status) {
|
||||
message.success(data || "操作成功");
|
||||
message.success(data || getLabel(111, "操作成功"));
|
||||
this.tableRef.getTableDate();
|
||||
} else {
|
||||
message.error(errormsg || "操作失败");
|
||||
message.error(errormsg || getLabel(111, "操作失败"));
|
||||
}
|
||||
}).catch(() => this.setState({ addAllLoading: false }));
|
||||
};
|
||||
|
|
@ -109,15 +119,15 @@ class Index extends Component {
|
|||
const { declareMonth, taxAgentId } = this.state;
|
||||
const payload = { declareMonth, taxAgentId };
|
||||
Modal.confirm({
|
||||
title: "信息确认",
|
||||
content: `确定清空税款所属期为${declareMonth}的所有累计专项附加扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
|
||||
title: getLabel(111, "信息确认"),
|
||||
content: `${getLabel(111, "确定清空税款所属期为")}${declareMonth}${getLabel(111, "的所有累计专项附加扣除数据吗")}?${getLabel(111, "若数据已参与核算")},${getLabel(111, "已参与核算的数据不会受影响")},${getLabel(111, "点击核算将会按当前列表最新数据重新核算")}。`,
|
||||
onOk: () => {
|
||||
deleteAllAddUpDeduction(payload).then(({ status, errormsg }) => {
|
||||
if (status) {
|
||||
message.success("删除成功");
|
||||
message.success(getLabel(111, "删除成功"));
|
||||
this.tableRef.getTableDate();
|
||||
} else {
|
||||
message.error(errormsg || "删除失败");
|
||||
message.error(errormsg || getLabel(111, "删除失败"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -134,22 +144,22 @@ class Index extends Component {
|
|||
const { selectedRowKeys: ids } = this.tableRef.state;
|
||||
const { id, departmentName, username } = record;
|
||||
if (ids.length === 0 && !id) {
|
||||
message.warning("请选择表格数据");
|
||||
message.warning(getLabel(111, "请选择表格数据"));
|
||||
return;
|
||||
}
|
||||
const payload = { declareMonth, ids: !id ? ids : [id] };
|
||||
Modal.confirm({
|
||||
title: "信息确认",
|
||||
content: !id ? "确定删除所选数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。" :
|
||||
`确定删除${departmentName}${username}(税款所属期:${declareMonth})的累计专项附加扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
|
||||
title: getLabel(111, "信息确认"),
|
||||
content: !id ? getLabel(111, "确定删除所选数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。") :
|
||||
`${getLabel(111, "确定删除")}${departmentName}${username}(${getLabel(111, "税款所属期")}:${declareMonth})${getLabel(111, "的累计专项附加扣除数据吗")}?${getLabel(111, "若数据已参与核算")},${getLabel(111, "已参与核算的数据不会受影响")},${getLabel(111, "点击核算将会按当前列表最新数据重新核算")}。`,
|
||||
onOk: () => {
|
||||
deleteSelectAddUpDeduction(payload).then(({ status, errormsg }) => {
|
||||
if (status) {
|
||||
message.success("删除成功");
|
||||
message.success(getLabel(111, "删除成功"));
|
||||
this.tableRef.getTableDate();
|
||||
this.tableRef.handleClearRows();
|
||||
} else {
|
||||
message.error(errormsg || "删除失败");
|
||||
message.error(errormsg || getLabel(111, "删除失败"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -179,7 +189,7 @@ class Index extends Component {
|
|||
const { selectedRowKeys: ids } = this.tableRef.state;
|
||||
const { declareMonth, taxAgentId, exportPayloadType } = this.state;
|
||||
if (ids.length === 0) {
|
||||
message.warning("请选择需要导出的数据");
|
||||
message.warning(getLabel(111, "请选择需要导出的数据"));
|
||||
return;
|
||||
}
|
||||
this.setState({
|
||||
|
|
@ -218,7 +228,7 @@ class Index extends Component {
|
|||
importPayload: { ...importPayload, slideDataSource: preview }
|
||||
});
|
||||
} else {
|
||||
message.error(errormsg || "预览失败");
|
||||
message.error(errormsg || getLabel(111, "预览失败"));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
@ -237,22 +247,22 @@ class Index extends Component {
|
|||
editAddUpDeduction({ ...payload, id }).then(({ status, errormsg }) => {
|
||||
this.setState({ saveLoading: false });
|
||||
if (status) {
|
||||
message.success("编辑成功");
|
||||
message.success(getLabel(111, "编辑成功"));
|
||||
this.handleCloseSlide();
|
||||
this.tableRef.getTableDate();
|
||||
} else {
|
||||
message.error(errormsg || "编辑失败");
|
||||
message.error(errormsg || getLabel(111, "编辑失败"));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
createAddUpDeduction(payload).then(({ status, errormsg }) => {
|
||||
this.setState({ saveLoading: false });
|
||||
if (status) {
|
||||
message.success("新增成功");
|
||||
message.success(getLabel(111, "新增成功"));
|
||||
this.handleCloseSlide();
|
||||
this.tableRef.getTableDate();
|
||||
} else {
|
||||
message.error(errormsg || "新增失败");
|
||||
message.error(errormsg || getLabel(111, "新增失败"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -263,8 +273,8 @@ class Index extends Component {
|
|||
const bool = _.every(_.pick(baseInfo, ["declareMonth", "taxAgentId", "employeeId"]), v => !!v);
|
||||
if (!bool) {
|
||||
Modal.warning({
|
||||
title: "信息确认",
|
||||
content: "必要信息不完整,红色*为必填项!"
|
||||
title: getLabel(111, "信息确认"),
|
||||
content: getLabel(111, "必要信息不完整,红色*为必填项!")
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
|
@ -281,7 +291,7 @@ class Index extends Component {
|
|||
* Params: screenParams规则:日期必须放在数组最后一位,人员信息必须第一位
|
||||
* Date: 2023/2/20
|
||||
*/
|
||||
handleAddData = (title = "新建", editId = {}) => {
|
||||
handleAddData = (title = getLabel(111, "新建"), editId = {}) => {
|
||||
const { taxAgentStore, cumDeductStore: { addForm } } = this.props;
|
||||
const { slidePayload } = this.state;
|
||||
const { taxAgentOption } = taxAgentStore;
|
||||
|
|
@ -320,7 +330,7 @@ class Index extends Component {
|
|||
handleTableOperate = ({ key }, record) => {
|
||||
const { id } = record;
|
||||
key === "handleAddData" ? getAddUpDeduction({ id }).then(({ status, data }) => {
|
||||
if (status) this[key]("编辑", data);
|
||||
if (status) this[key](getLabel(111, "编辑"), data);
|
||||
}) : this[key](record);
|
||||
};
|
||||
handleCloseSlide = () => {
|
||||
|
|
@ -349,7 +359,7 @@ class Index extends Component {
|
|||
const items = [
|
||||
{
|
||||
com: DataCollectionDatePicker({
|
||||
label: "税款所属期",
|
||||
label: getLabel(111, "税款所属期"),
|
||||
value: declareMonth,
|
||||
onChange: this.screenChange,
|
||||
key: "declareMonth"
|
||||
|
|
@ -357,10 +367,10 @@ class Index extends Component {
|
|||
},
|
||||
{
|
||||
com: DataCollectionSelect({
|
||||
label: "个税扣缴义务人",
|
||||
label: getLabel(111, "个税扣缴义务人"),
|
||||
value: taxAgentId,
|
||||
onChange: this.screenChange,
|
||||
options: [{ key: "", showname: "全部" }, ...taxAgentOption],
|
||||
options: [{ key: "", showname: getLabel(111, "全部") }, ...taxAgentOption],
|
||||
key: "taxAgentId"
|
||||
})
|
||||
}
|
||||
|
|
@ -385,20 +395,20 @@ class Index extends Component {
|
|||
getTopBtns = () => {
|
||||
const { addAllLoading } = this.state;
|
||||
return [
|
||||
<Button type="primary" onClick={this.handleOpenImport}>导入</Button>,
|
||||
<Button type="ghost" onClick={() => this.handleAddData()}>新建</Button>,
|
||||
<Button type="ghost" loading={addAllLoading} onClick={this.autoAddAll}>一键累计</Button>,
|
||||
<Button type="primary" onClick={this.handleOpenImport}>{getLabel(111, "导入")}</Button>,
|
||||
<Button type="ghost" onClick={() => this.handleAddData()}>{getLabel(111, "新建")}</Button>,
|
||||
<Button type="ghost" loading={addAllLoading} onClick={this.autoAddAll}>{getLabel(111, "一键累计")}</Button>,
|
||||
<Dropdown
|
||||
overlay={
|
||||
<Menu className="dropdownMenuWrapper" onClick={this.handleDataMenuClick}>
|
||||
<Menu.Item key="deleteSelectAddUpDeduction">批量删除</Menu.Item>
|
||||
<Menu.Item key="deleteAllAddUpDeduction">一键清空</Menu.Item>
|
||||
<Menu.Item key="handleExportSelect">导出选中</Menu.Item>
|
||||
<Menu.Item key="handleExportAll">导出全部</Menu.Item>
|
||||
<Menu.Item key="deleteSelectAddUpDeduction">{getLabel(111, "批量删除")}</Menu.Item>
|
||||
<Menu.Item key="deleteAllAddUpDeduction">{getLabel(111, "一键清空")}</Menu.Item>
|
||||
<Menu.Item key="handleExportSelect">{getLabel(111, "导出选中")}</Menu.Item>
|
||||
<Menu.Item key="handleExportAll">{getLabel(111, "导出全部")}</Menu.Item>
|
||||
</Menu>
|
||||
}
|
||||
>
|
||||
<Button type="ghost">更多</Button>
|
||||
<Button type="ghost">{getLabel(111, "更多")}</Button>
|
||||
</Dropdown>
|
||||
];
|
||||
};
|
||||
|
|
@ -414,10 +424,10 @@ class Index extends Component {
|
|||
<Dropdown.Button onClick={this.handleExportAllDetail}
|
||||
overlay={<Menu
|
||||
onClick={this.handleExportSelectDetail}>
|
||||
<Menu.Item key="1">导出选中</Menu.Item>
|
||||
<Menu.Item key="1">{getLabel(111, "导出选中")}</Menu.Item>
|
||||
</Menu>}
|
||||
type="primary">
|
||||
导出全部
|
||||
{getLabel(111, "导出全部")}
|
||||
</Dropdown.Button>
|
||||
];
|
||||
};
|
||||
|
|
@ -439,7 +449,7 @@ class Index extends Component {
|
|||
handleExportSelectDetail = () => {
|
||||
const { selectedRowKeys: ids, recordPayload } = this.tableRecordRef.state;
|
||||
if (ids.length === 0) {
|
||||
message.warning("请选择需要导出的数据");
|
||||
message.warning(getLabel(111, "请选择需要导出的数据"));
|
||||
return;
|
||||
}
|
||||
const exportParams = _.reduce(_.keys(_.omitBy(recordPayload, it => !it)), (pre, cur) => pre + `${pre && "&"}${cur}=${recordPayload[cur]}`, "");
|
||||
|
|
@ -506,7 +516,7 @@ class Index extends Component {
|
|||
} = this.state;
|
||||
const tablePayload = { declareMonth: [declareMonth], taxAgentId };
|
||||
return (
|
||||
<Layout title="累计专项附加扣除" btns={this.getTopBtns()} leftComp={this.getScreen()}
|
||||
<Layout title={getLabel(111, "累计专项附加扣除")} btns={this.getTopBtns()} leftComp={this.getScreen()}
|
||||
onResizeWindowInnerWidth={this.handleResize} slidePayload={slidePayload}
|
||||
onClose={this.handleCloseSlide} onSave={this.handleSaveData}
|
||||
slideLoading={saveLoading} exportPayloadUrl={exportPayloadUrl}
|
||||
|
|
@ -523,7 +533,7 @@ class Index extends Component {
|
|||
payload={tablePayload}
|
||||
showOperateBtn={showOperateBtn}
|
||||
onTableOperate={this.handleTableOperate}
|
||||
onViewDetails={(record) => this.handleAddData("累计专项附加扣除记录", record)}
|
||||
onViewDetails={(record) => this.handleAddData(getLabel(111, "累计专项附加扣除记录"), record)}
|
||||
form={form}
|
||||
/>
|
||||
</Layout>
|
||||
|
|
@ -536,7 +546,7 @@ export default Index;
|
|||
export const DataCollectionDatePicker = (props) => {
|
||||
const {
|
||||
value, label, onChange, format = "YYYY-MM", key, screen = true,
|
||||
tip = "提示:默认显示本年截至当前月所有员工申报的累计专项附加及其他扣除额",
|
||||
tip = getLabel(111, "提示:默认显示本年截至当前月所有员工申报的累计专项附加及其他扣除额"),
|
||||
labelCol = 8, wrapperCol = 16
|
||||
} = props;
|
||||
return <WeaFormItem label={label} labelCol={{ span: labelCol }} wrapperCol={{ span: wrapperCol }}>
|
||||
|
|
@ -568,7 +578,7 @@ export const DataCollectionDateRangePick = (props) => {
|
|||
return current && value2 && current.getTime() > new Date(value2).getTime();
|
||||
}}
|
||||
/>
|
||||
<span className="to">至</span>
|
||||
<span className="to">{getLabel(111, "至")}</span>
|
||||
<WeaDatePicker
|
||||
value={value2} onChange={(val) => onChange({ key, value: [value1, val] })} format={format}
|
||||
disabledDate={(current) => {
|
||||
|
|
|
|||
|
|
@ -8,6 +8,9 @@ import React, { Component } from "react";
|
|||
import UnifiedTable from "../../components/UnifiedTable";
|
||||
import { getTableDate } from "../../apis/cumDeduct";
|
||||
import { Menu, Popover } from "antd";
|
||||
import { WeaLocaleProvider } from "ecCom";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
|
||||
class DataTables extends Component {
|
||||
constructor(props) {
|
||||
|
|
@ -63,7 +66,7 @@ class DataTables extends Component {
|
|||
};
|
||||
const pagination = {
|
||||
...pageInfo,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
showTotal: total => `${getLabel(83698, "共")} ${total} ${getLabel(18256, "条")}`,
|
||||
pageSizeOptions: ["10", "20", "50", "100"],
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
|
|
@ -106,15 +109,15 @@ class DataTables extends Component {
|
|||
{
|
||||
!isSpecial &&
|
||||
<React.Fragment>
|
||||
<a href="javaScript:void(0);" onClick={() => onViewDetails(record)}>查看明细</a>
|
||||
<a href="javaScript:void(0);" onClick={() => onViewDetails(record)}>{getLabel(111, "查看明细")}</a>
|
||||
{
|
||||
showOperateBtn &&
|
||||
<Popover
|
||||
overlayClassName="moreIconWrapper"
|
||||
placement="bottomRight"
|
||||
content={<Menu onClick={(e) => onTableOperate(e, record)}>
|
||||
<Menu.Item key="handleAddData">编辑</Menu.Item>
|
||||
<Menu.Item key="deleteSelectAddUpDeduction">删除</Menu.Item>
|
||||
<Menu.Item key="handleAddData">{getLabel(111, "编辑")}</Menu.Item>
|
||||
<Menu.Item key="deleteSelectAddUpDeduction">{getLabel(111, "删除")}</Menu.Item>
|
||||
</Menu>} title="">
|
||||
<i className="icon-coms-more"/>
|
||||
</Popover>
|
||||
|
|
@ -128,9 +131,9 @@ class DataTables extends Component {
|
|||
showOperateBtn &&
|
||||
<React.Fragment>
|
||||
<a href="javaScript:void(0);"
|
||||
onClick={() => onTableOperate({ key: "handleAddData" }, record)}>编辑</a>
|
||||
onClick={() => onTableOperate({ key: "handleAddData" }, record)}>{getLabel(111, "编辑")}</a>
|
||||
<a href="javaScript:void(0);"
|
||||
onClick={() => onTableOperate({ key: "deleteSelectAddUpDeduction" }, record)}>删除</a>
|
||||
onClick={() => onTableOperate({ key: "deleteSelectAddUpDeduction" }, record)}>{getLabel(111, "删除")}</a>
|
||||
</React.Fragment>
|
||||
}
|
||||
</React.Fragment>
|
||||
|
|
|
|||
|
|
@ -1,41 +1,44 @@
|
|||
import React, { Component } from "react";
|
||||
import { WeaLocaleProvider } from "ecCom";
|
||||
import * as API from "../../../apis/payrollFiles";
|
||||
import { Menu, message, Modal } from "antd";
|
||||
import "../index.less";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
|
||||
class AllWithoutPay extends Component {
|
||||
handleClick = ({ key }) => {
|
||||
const { selectedRowKeys = [], refreshList } = this.props;
|
||||
if (key === "batchWithoutpay") {
|
||||
if (selectedRowKeys.length === 0) {
|
||||
message.warning("未选择条目");
|
||||
message.warning(getLabel(111, "未选择条目"));
|
||||
return;
|
||||
}
|
||||
API.gotoStop(selectedRowKeys).then(({ status, errormsg }) => {
|
||||
if (status) {
|
||||
message.success("操作成功!");
|
||||
message.success(getLabel(111, "操作成功"));
|
||||
refreshList();
|
||||
} else {
|
||||
message.error(errormsg || "操作失败!");
|
||||
message.error(errormsg || getLabel(111, "操作失败"));
|
||||
}
|
||||
});
|
||||
}else{
|
||||
} else {
|
||||
const { pageInfo } = this.props;
|
||||
if (pageInfo.total === 0) {
|
||||
message.warning("您没有需要处理的待停薪人员!");
|
||||
message.warning(getLabel(111, "您没有需要处理的待停薪人员!"));
|
||||
return;
|
||||
}
|
||||
Modal.warning({
|
||||
title: "信息确认",
|
||||
content: `确定要将所有待停薪人员(共${pageInfo.total}条数据)设为停薪人员吗?`,
|
||||
title: getLabel(111, "信息确认"),
|
||||
content: `${getLabel(111, "确定要将所有待停薪人员")}(${getLabel(111, "共")}${pageInfo.total}${getLabel(111, "条数据")})${getLabel(111, "设为停薪人员吗")}?`,
|
||||
onOk: () => {
|
||||
API.allGotoStop({}).then(({ status, data, errormsg }) => {
|
||||
if (status) {
|
||||
const { msg }= data;
|
||||
message.info(msg || "操作成功!");
|
||||
const { msg } = data;
|
||||
message.info(msg || getLabel(111, "操作成功"));
|
||||
refreshList();
|
||||
} else {
|
||||
message.error(errormsg || "操作失败!");
|
||||
message.error(errormsg || getLabel(111, "操作失败"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -46,8 +49,8 @@ class AllWithoutPay extends Component {
|
|||
render() {
|
||||
return (
|
||||
<Menu className="dropdownMenuWrapper" onClick={this.handleClick}>
|
||||
<Menu.Item key="allWithoutpay">全部停薪</Menu.Item>
|
||||
<Menu.Item key="batchWithoutpay">批量停薪</Menu.Item>
|
||||
<Menu.Item key="allWithoutpay">{getLabel(111, "全部停薪")}</Menu.Item>
|
||||
<Menu.Item key="batchWithoutpay">{getLabel(111, "批量停薪")}</Menu.Item>
|
||||
</Menu>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,21 +1,24 @@
|
|||
import React, { Component } from "react";
|
||||
import { Menu, message } from "antd";
|
||||
import { WeaLocaleProvider } from "ecCom";
|
||||
import * as API from "../../../apis/payrollFiles";
|
||||
import "../index.less";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
|
||||
class BatchSuspendpay extends Component {
|
||||
handleClick = ({ key }) => {
|
||||
const { selectedRowKeys, refreshList } = this.props;
|
||||
if (selectedRowKeys.length === 0) {
|
||||
message.warning("未选择条目");
|
||||
message.warning(getLabel(111, "未选择条目"));
|
||||
return;
|
||||
}
|
||||
API.cancelStop(selectedRowKeys).then(({ status, errormsg }) => {
|
||||
if (status) {
|
||||
message.success("操作成功!");
|
||||
message.success(getLabel(111, "操作成功"));
|
||||
refreshList();
|
||||
} else {
|
||||
message.error(errormsg || "操作失败!");
|
||||
message.error(errormsg || getLabel(111, "操作失败"));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
@ -23,7 +26,7 @@ class BatchSuspendpay extends Component {
|
|||
render() {
|
||||
return (
|
||||
<Menu className="dropdownMenuWrapper" onClick={this.handleClick}>
|
||||
<Menu.Item key="batchSuspendpay">批量取消停薪</Menu.Item>
|
||||
<Menu.Item key="batchSuspendpay">{getLabel(111, "批量取消停薪")}</Menu.Item>
|
||||
</Menu>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
import React, { Component } from "react";
|
||||
import { Menu, message } from "antd";
|
||||
import { WeaLocaleProvider } from "ecCom";
|
||||
import "../index.less";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
|
||||
class ExportMenu extends Component {
|
||||
componentDidMount() {
|
||||
}
|
||||
|
|
@ -21,7 +24,7 @@ class ExportMenu extends Component {
|
|||
runStatusList = _.upperCase(selectedKey);
|
||||
break;
|
||||
case "stop":
|
||||
runStatusList = 'STOP_FROM_PENDING,STOP_FROM_SUSPEND';
|
||||
runStatusList = "STOP_FROM_PENDING,STOP_FROM_SUSPEND";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -37,7 +40,7 @@ class ExportMenu extends Component {
|
|||
handleExportSelect = () => {
|
||||
const { selectedRowKeys } = this.props;
|
||||
if (selectedRowKeys.length === 0) {
|
||||
message.warning("未选择条目");
|
||||
message.warning(getLabel(111, "未选择条目"));
|
||||
return;
|
||||
}
|
||||
const url = `${window.location.origin}/api/bs/hrmsalary/salaryArchive/exportList?ids=${selectedRowKeys.join(",")}`;
|
||||
|
|
@ -47,8 +50,8 @@ class ExportMenu extends Component {
|
|||
render() {
|
||||
return (
|
||||
<Menu className="dropdownMenuWrapper" onClick={this.handleClick}>
|
||||
<Menu.Item key="handleExportAll">导出全部</Menu.Item>
|
||||
<Menu.Item key="handleExportSelect">导出选中</Menu.Item>
|
||||
<Menu.Item key="handleExportAll">{getLabel(111, "导出全部")}</Menu.Item>
|
||||
<Menu.Item key="handleExportSelect">{getLabel(111, "导出选中")}</Menu.Item>
|
||||
</Menu>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
import React from "react";
|
||||
import { Button, Col, message, Row } from "antd";
|
||||
import { WeaDatePicker, WeaDialog, WeaInput, WeaSelect, WeaTable } from "ecCom";
|
||||
import { WeaDatePicker, WeaDialog, WeaInput, WeaLocaleProvider, WeaSelect, WeaTable } from "ecCom";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import moment from "moment";
|
||||
import "./index.less";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
@inject("salaryFileStore")
|
||||
@observer
|
||||
export default class ChangeSalaryModal extends React.Component {
|
||||
|
|
@ -165,11 +166,14 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
|
||||
// 保存
|
||||
handleSave() {
|
||||
const { salaryFileStore: { saveSalaryItem, editSingleSalaryItem, fetchSingleSalaryItemList, getArchiveForm }, recordId } = this.props;
|
||||
const {
|
||||
salaryFileStore: { saveSalaryItem, editSingleSalaryItem, fetchSingleSalaryItemList, getArchiveForm },
|
||||
recordId
|
||||
} = this.props;
|
||||
let saveRequest = { ...this.state.request };
|
||||
const { salaryArchiveItems, canOperator } = this.state;
|
||||
if (salaryArchiveItems.length === 0) {
|
||||
message.warning("请添加调薪明细");
|
||||
message.warning(getLabel(111, "请添加调薪明细"));
|
||||
return;
|
||||
}
|
||||
saveRequest.salaryArchiveItems = salaryArchiveItems.map(item => {
|
||||
|
|
@ -202,7 +206,7 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
const { selectedRowKeys, salaryArchiveItems } = this.state;
|
||||
let result = [...salaryArchiveItems];
|
||||
if (selectedRowKeys.length === 0) {
|
||||
message.warning("未选择条目");
|
||||
message.warning(getLabel(111, "未选择条目"));
|
||||
}
|
||||
|
||||
this.setState({
|
||||
|
|
@ -221,7 +225,7 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
};
|
||||
return (
|
||||
<WeaDialog
|
||||
title="调薪"
|
||||
title={getLabel(111, "调薪")}
|
||||
style={{ width: 800 }}
|
||||
initLoadCss
|
||||
visible={this.props.visible}
|
||||
|
|
@ -230,12 +234,12 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
}}
|
||||
buttons={[<Button type="primary" onClick={() => {
|
||||
this.handleSave();
|
||||
}}>保存</Button>]}
|
||||
}}>{getLabel(111, "保存")}</Button>]}
|
||||
>
|
||||
<div className="changeSalaryWrapper">
|
||||
<div className="changeSalaryModal">
|
||||
<Row className="itemWrapper" style={{ lineHeight: "47px" }}>
|
||||
<Col span={6}>生效日期</Col>
|
||||
<Col span={6}>{getLabel(111, "生效日期")}</Col>
|
||||
<Col span={18}>
|
||||
<WeaDatePicker
|
||||
viewAttr={((recordId && canOperator) || !recordId) ? 3 : 1}
|
||||
|
|
@ -249,7 +253,7 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
</Col>
|
||||
</Row>
|
||||
<Row className="itemWrapper" style={{ lineHeight: "47px" }}>
|
||||
<Col span={6}>调整原因</Col>
|
||||
<Col span={6}>{getLabel(111, "调整原因")}</Col>
|
||||
<Col span={18}>
|
||||
<WeaSelect
|
||||
value={adjustReason}
|
||||
|
|
@ -268,7 +272,7 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
</Row>
|
||||
<Row className="itemWrapper" style={{ lineHeight: "47px" }}>
|
||||
<Col span={6}>
|
||||
说明
|
||||
{getLabel(111, "说明")}
|
||||
</Col>
|
||||
<Col span={18}>
|
||||
<WeaInput
|
||||
|
|
@ -284,7 +288,7 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
</div>
|
||||
<div className="contentWrapper">
|
||||
<div className="contentTitleWrapper" style={{ height: "40px", lineHeight: "40px" }}>
|
||||
<span className="contentTitle" style={{ fontSize: "14px", color: "#666" }}>调薪明细</span>
|
||||
<span className="contentTitle" style={{ fontSize: "14px", color: "#666" }}>{getLabel(111, "调薪明细")}</span>
|
||||
{
|
||||
!recordId &&
|
||||
<div className="rightIconWrapper" style={{ display: "inline-block", float: "right" }}>
|
||||
|
|
@ -295,14 +299,14 @@ export default class ChangeSalaryModal extends React.Component {
|
|||
onClick={() => {
|
||||
this.handleRemoveClick();
|
||||
}}
|
||||
><span className="icon-coms-form-delete-hot" title="删除"></span></Button>
|
||||
><span className="icon-coms-form-delete-hot" title={getLabel(111, "删除")}></span></Button>
|
||||
<Button
|
||||
type="primary"
|
||||
size="small"
|
||||
onClick={() => {
|
||||
this.handleAddItemClick();
|
||||
}}
|
||||
><span className="icon-coms-Add-to-hot" title="添加"></span></Button>
|
||||
><span className="icon-coms-Add-to-hot" title={getLabel(111, "添加")}></span></Button>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
import React from "react";
|
||||
import { Menu, message, Modal, Popover } from "antd";
|
||||
import { WeaLocaleProvider } from "ecCom";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import ChangeSalaryModal from "./changeSalaryModal";
|
||||
import { deleteSalaryItem } from "../../apis/archive";
|
||||
import UnifiedTable from "../../components/UnifiedTable";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
@inject("salaryFileStore")
|
||||
@observer
|
||||
export default class SalaryItemChangeList extends React.Component {
|
||||
|
|
@ -34,17 +36,17 @@ export default class SalaryItemChangeList extends React.Component {
|
|||
};
|
||||
deleteSalaryItem = (salaryArchiveItemId) => {
|
||||
Modal.confirm({
|
||||
title: "信息确认",
|
||||
content: "是否删除该调整数据",
|
||||
title: getLabel(111, "信息确认"),
|
||||
content: getLabel(111, "是否删除该调整数据"),
|
||||
onOk: () => {
|
||||
const { salaryFileStore: { fetchSingleSalaryItemList } } = this.props;
|
||||
deleteSalaryItem({ salaryArchiveItemId }).then(({ status, errormsg }) => {
|
||||
if (status) {
|
||||
message.success("删除成功");
|
||||
message.success(getLabel(111, "删除成功"));
|
||||
this.searchParams = { salaryArchiveId: this.props.id, current: 1 };
|
||||
fetchSingleSalaryItemList(this.searchParams);
|
||||
} else {
|
||||
message.error(errormsg || "删除失败");
|
||||
message.error(errormsg || getLabel(111, "删除失败"));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
|
@ -62,15 +64,15 @@ export default class SalaryItemChangeList extends React.Component {
|
|||
if (selectedKey === "fixed") {
|
||||
columns = [...columns, {
|
||||
dataIndex: "operate",
|
||||
title: "操作",
|
||||
title: getLabel(111, "操作"),
|
||||
render: (text, record) => {
|
||||
return <div className="optWrapper">
|
||||
<a href="javascript:void(0);" className="mr10" onClick={() => this.handleEdit(record)}>编辑</a>
|
||||
<a href="javascript:void(0);" className="mr10" onClick={() => this.handleEdit(record)}>{getLabel(111, "编辑")}</a>
|
||||
<Popover
|
||||
overlayClassName="moreIconWrapper"
|
||||
placement="bottomRight"
|
||||
content={<Menu onClick={(e) => this.deleteSalaryItem(record.id)}>
|
||||
<Menu.Item key="delete">删除</Menu.Item>
|
||||
<Menu.Item key="delete">{getLabel(111, "删除")}</Menu.Item>
|
||||
</Menu>} title="">
|
||||
<i className="icon-coms-more"/>
|
||||
</Popover>
|
||||
|
|
@ -114,7 +116,7 @@ export default class SalaryItemChangeList extends React.Component {
|
|||
this.handlePageChange(value);
|
||||
},
|
||||
total: singleSalaryItemList.total,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
showTotal: total => `${getLabel(83698, "共")} ${total} ${getLabel(18256, "条")}`,
|
||||
current: singleSalaryItemList.pageNum
|
||||
}}
|
||||
xWidth={this.getColumns().length * 100}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import React from "react";
|
||||
import { WeaFormItem, WeaHelpfulTip, WeaInput, WeaInputNumber, WeaSearchGroup } from "ecCom";
|
||||
import { WeaFormItem, WeaHelpfulTip, WeaInput, WeaInputNumber, WeaLocaleProvider, WeaSearchGroup } from "ecCom";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import SelectedTab from "../../components/selectedTab";
|
||||
import SalaryItemChangeList from "./salaryItemChangeList";
|
||||
|
|
@ -7,10 +7,11 @@ import TaxAgentChangeList from "./taxAgentChangeList";
|
|||
import { PickDate } from "../appConfig";
|
||||
import "./index.less";
|
||||
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
const selectedTabItems = [
|
||||
{
|
||||
key: "0",
|
||||
name: "薪资调整记录"
|
||||
name: getLabel(111, "薪资调整记录")
|
||||
}
|
||||
];
|
||||
const baseInfolist = [
|
||||
|
|
@ -18,15 +19,15 @@ const baseInfolist = [
|
|||
id: 1,
|
||||
items: [
|
||||
{
|
||||
label: "姓名",
|
||||
label: getLabel(111, "姓名"),
|
||||
value: "username"
|
||||
},
|
||||
{
|
||||
label: "部门",
|
||||
label: getLabel(111, "部门"),
|
||||
value: "department"
|
||||
},
|
||||
{
|
||||
label: "岗位",
|
||||
label: getLabel(111, "岗位"),
|
||||
value: "position"
|
||||
}
|
||||
]
|
||||
|
|
@ -35,15 +36,15 @@ const baseInfolist = [
|
|||
id: 2,
|
||||
items: [
|
||||
{
|
||||
label: "入职时间",
|
||||
label: getLabel(111, "入职时间"),
|
||||
value: "hiredate"
|
||||
},
|
||||
{
|
||||
label: "手机号",
|
||||
label: getLabel(111, "手机号"),
|
||||
value: "mobile"
|
||||
},
|
||||
{
|
||||
label: "个税扣缴义务人",
|
||||
label: getLabel(111, "个税扣缴义务人"),
|
||||
value: "taxAgent"
|
||||
}
|
||||
]
|
||||
|
|
@ -86,7 +87,7 @@ export default class SalaryFileViewSlide extends React.Component {
|
|||
const items = [
|
||||
{
|
||||
com: PickDate({
|
||||
label: "起始发薪日期",
|
||||
label: getLabel(111, "起始发薪日期"),
|
||||
viewAttr: selectedKey === "pending" ? 3 : 1,
|
||||
value: paysetParams.payStartDate,
|
||||
onChange: handleSetpay
|
||||
|
|
@ -94,7 +95,7 @@ export default class SalaryFileViewSlide extends React.Component {
|
|||
},
|
||||
{
|
||||
com: PickDate({
|
||||
label: "最后发薪日期",
|
||||
label: getLabel(111, "最后发薪日期"),
|
||||
viewAttr: (selectedKey === "pending" || selectedKey === "fixed") ? 2 : selectedKey === "stop" ? 1 : 3,
|
||||
value: paysetParams.payEndDate,
|
||||
onChange: handleSetpay
|
||||
|
|
@ -103,7 +104,7 @@ export default class SalaryFileViewSlide extends React.Component {
|
|||
];
|
||||
return (
|
||||
<div className="salaryFileViewSlide">
|
||||
<WeaSearchGroup title="基本信息" items={[]} needTigger showGroup center>
|
||||
<WeaSearchGroup title={getLabel(111, "基本信息")} items={[]} needTigger showGroup center>
|
||||
<table className="baseInfoWrapper">
|
||||
<tbody>
|
||||
{
|
||||
|
|
@ -125,15 +126,15 @@ export default class SalaryFileViewSlide extends React.Component {
|
|||
</tbody>
|
||||
</table>
|
||||
</WeaSearchGroup>
|
||||
<WeaSearchGroup title="发薪设置" items={items} needTigger showGroup center/>
|
||||
<WeaSearchGroup title={getLabel(111, "发薪设置")} items={items} needTigger showGroup center/>
|
||||
|
||||
<WeaSearchGroup
|
||||
title={
|
||||
<span>
|
||||
<span>薪资档案</span>
|
||||
<span>{getLabel(111, "薪资档案")}</span>
|
||||
<WeaHelpfulTip
|
||||
width={200}
|
||||
title="提示:显示已生效的最新数据"
|
||||
title={getLabel(111, "提示:显示已生效的最新数据")}
|
||||
placement="topLeft"
|
||||
style={{ marginLeft: 8 }}
|
||||
/>
|
||||
|
|
@ -169,7 +170,7 @@ export default class SalaryFileViewSlide extends React.Component {
|
|||
/>
|
||||
}
|
||||
</WeaFormItem>
|
||||
)) : <div>暂无数据</div>
|
||||
)) : <div>{getLabel(111, "暂无数据")}</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,81 +1,81 @@
|
|||
import React from 'react';
|
||||
import { Table } from 'antd'
|
||||
import { WeaTable } from 'ecCom'
|
||||
import { inject, observer } from 'mobx-react';
|
||||
import EditAgentModal from './editAgentModal'
|
||||
import React from "react";
|
||||
import { WeaLocaleProvider, WeaTable } from "ecCom";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import EditAgentModal from "./editAgentModal";
|
||||
|
||||
@inject('salaryFileStore')
|
||||
const getLabel = WeaLocaleProvider.getLabel;
|
||||
@inject("salaryFileStore")
|
||||
@observer
|
||||
export default class TaxAgentChangeList extends React.Component {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
this.state = {
|
||||
recordId: '',
|
||||
editAgentVisible: false
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
recordId: "",
|
||||
editAgentVisible: false
|
||||
};
|
||||
this.searchParams = {};
|
||||
}
|
||||
|
||||
componentWillMount() {
|
||||
const { salaryFileStore: { fetchSingleTaxAgentList } } = this.props;
|
||||
this.searchParams = { salaryArchiveId: this.props.id, current: 1 };
|
||||
fetchSingleTaxAgentList(this.searchParams);
|
||||
}
|
||||
|
||||
// 编辑回调
|
||||
handleEdit(record) {
|
||||
const { salaryFileStore: { setEditAgentVisible } } = this.props;
|
||||
this.setState({
|
||||
recordId: record.id,
|
||||
editAgentVisible: true
|
||||
});
|
||||
}
|
||||
|
||||
// 获取Columns
|
||||
getColumns() {
|
||||
const { salaryFileStore: { singleTaxAgentList } } = this.props;
|
||||
let columns = [];
|
||||
if (singleTaxAgentList.columns) {
|
||||
columns = [...singleTaxAgentList.columns];
|
||||
}
|
||||
return columns;
|
||||
}
|
||||
|
||||
// 页面跳转
|
||||
handlePageChange(value) {
|
||||
this.searchParams.current = value;
|
||||
const { salaryFileStore: { fetchSingleTaxAgentList } } = this.props;
|
||||
fetchSingleTaxAgentList(this.searchParams);
|
||||
}
|
||||
|
||||
render() {
|
||||
const { salaryFileStore } = this.props;
|
||||
const { singleTaxAgentList } = salaryFileStore;
|
||||
return (
|
||||
<div>
|
||||
<WeaTable
|
||||
dataSource={singleTaxAgentList.list ? singleTaxAgentList.list : []}
|
||||
columns={this.getColumns()}
|
||||
pagination={{
|
||||
onChange: (value) => {
|
||||
this.handlePageChange(value);
|
||||
},
|
||||
total: singleTaxAgentList.total,
|
||||
showTotal: total => `${getLabel(83698, "共")} ${total} ${getLabel(18256, "条")}`,
|
||||
current: singleTaxAgentList.pageNum
|
||||
}}
|
||||
/>
|
||||
{
|
||||
this.state.editAgentVisible && <EditAgentModal
|
||||
currentId={this.props.id}
|
||||
recordId={this.state.recordId}
|
||||
visible={this.state.editAgentVisible}
|
||||
onCancel={() => {
|
||||
this.setState({ editAgentVisible: false });
|
||||
}}
|
||||
/>
|
||||
}
|
||||
this.searchParams = {}
|
||||
}
|
||||
|
||||
componentWillMount() {
|
||||
const { salaryFileStore: { fetchSingleTaxAgentList }} = this.props;
|
||||
this.searchParams = {salaryArchiveId: this.props.id, current: 1}
|
||||
fetchSingleTaxAgentList(this.searchParams)
|
||||
}
|
||||
|
||||
// 编辑回调
|
||||
handleEdit(record) {
|
||||
const { salaryFileStore: {setEditAgentVisible} } = this.props;
|
||||
this.setState({
|
||||
recordId: record.id,
|
||||
editAgentVisible: true
|
||||
})
|
||||
}
|
||||
|
||||
// 获取Columns
|
||||
getColumns() {
|
||||
const { salaryFileStore: {singleTaxAgentList} } = this.props;
|
||||
let columns = []
|
||||
if(singleTaxAgentList.columns) {
|
||||
columns = [...singleTaxAgentList.columns]
|
||||
}
|
||||
return columns
|
||||
}
|
||||
|
||||
// 页面跳转
|
||||
handlePageChange(value) {
|
||||
this.searchParams.current = value
|
||||
const { salaryFileStore: { fetchSingleTaxAgentList }} = this.props;
|
||||
fetchSingleTaxAgentList(this.searchParams)
|
||||
}
|
||||
|
||||
render() {
|
||||
const { salaryFileStore } = this.props;
|
||||
const { singleTaxAgentList } = salaryFileStore
|
||||
return (
|
||||
<div>
|
||||
<WeaTable
|
||||
dataSource={singleTaxAgentList.list ? singleTaxAgentList.list: []}
|
||||
columns={this.getColumns()}
|
||||
pagination={{
|
||||
onChange: (value) => {
|
||||
this.handlePageChange(value)
|
||||
},
|
||||
total: singleTaxAgentList.total,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
current: singleTaxAgentList.pageNum
|
||||
}}
|
||||
/>
|
||||
{
|
||||
this.state.editAgentVisible && <EditAgentModal
|
||||
currentId={this.props.id}
|
||||
recordId={this.state.recordId}
|
||||
visible={this.state.editAgentVisible}
|
||||
onCancel={() => {
|
||||
this.setState({editAgentVisible: false})
|
||||
}}
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue