import React from 'react';
import { Table, Button, message, notification, Icon, Checkbox, Pagination, Spin, Upload } from 'antd';
import {
empty,
extendInclude,
getDataFieldValue,
guid,
initFilter,
getCustomParams,
addRuleAndGroups,
setDataFieldValue,
extendOrder,
extend,
renderExportCell,
compare,
getParseValue,
} from '../../utils/common';
import ComponentBase from '../ComponentBase';
import styles from './index.css';
import EditModal from '../../components/Edit/EditModal';
import TableFooterByTotal from '../../components/Table/TableFooterByTotal';
import FormPage from '../../components/FormPage';
import ShowModal from '../../components/common/ShowModal';
import FormModal from '../../components/FormModal';
import { ConfirmButton, ExportToExcel, HttpPrint, PictureThumb, IFComponent } from '@woowalker/feui';
import DataLoading from '../../components/common/DataLoading';
import BDWordPreviewPage from '../../components/CustomPages/BD/BDWordPreviewPage';
import ColumnSetting from './TableColumnSetting';
import ColumnSort from '../../components/common/CustomFieldsManage';
import ImportModal from './ImportModal';
import TableResizableCell from '../../components/Table/TableResizableCell';
import { cloneDeep, get } from 'lodash';
import classNames from 'classnames';
import TableModal from '../../components/Table/TableModal';
import CombinationModal from '../../components/Combination/CombinationModal';
import { getDragableProps, DragDropCard } from '../../utils/withDragDropContext';
import update from 'immutability-helper';
import config from '../../config';
import storage from '../../utils/storage';
const { Column } = Table;
class TableBaseComponent extends ComponentBase {
constructor(props) {
super(props);
this.state = {
data: {},
tableConfig: {},
loadParam: {},
searchColumnText: '', // 列搜索文本
showColumnSetting: null, // 显示表头的设置图标
showFilterDropdown: false,
formLoading: false,
localSearch: {
// field: "",
// value: ""
},
};
this.defaultTableCode = 'table';
this.genDataSource = this.genDataSource.bind(this);
}
componentDidMount() {
super.componentDidMount();
this.onLoadData();
}
/*
加载数据 事件
*/
onLoadData() {
const tableConfigs = this.onGetTableConfig();
if (tableConfigs && tableConfigs.length) {
let tableConfig = this.state.tableConfig;
if (!tableConfig) {
tableConfig = {};
}
tableConfigs.forEach((t) => {
if (t.tableCode === undefined) {
t.tableCode = this.defaultTableCode;
}
if (t.originalColumns === undefined) {
t.originalColumns = t.columns;
}
if (t.originalBtns === undefined) {
t.originalBtns = t.btns;
}
if (t.originalRowBtns === undefined) {
t.originalRowBtns = t.rowBtns;
}
if (t.originalRightBtns === undefined) {
t.originalRightBtns = t.rightBtns;
}
if (!t.id) {
t.id = guid();
}
tableConfig[t.tableCode] = t;
});
this.setState(
{
tableConfig,
},
() => {
this.onAfterLoadData();
}
);
} else {
this.onAfterLoadData();
}
}
/*
加载数据之后
*/
onAfterLoadData() {
this.onAfterGetTableConfig();
let tableConfig = this.state.tableConfig;
if (tableConfig) {
Object.keys(tableConfig).forEach((n) => {
this.loadTableData({
tableCode: tableConfig[n].tableCode,
isResetLoad: true,
});
});
}
}
/*
获取表配置信息
{
tableCode://配置信息
columns:
btns:
rowBtns:
deleteApi:
batchDeleteApi:
rule:
id:
hasChildren
classField
footerSumType
checkType
checked,
api,
position,
isShowRowNo,是否显示序号
}
*/
onGetTableConfig() {}
/*
获取表配置信息 之后
*/
onAfterGetTableConfig() {}
/*
依搜索参数加载表数据
*/
loadDataTableBySearch = (tableCode, data) => {
const tableConfig = this.getTableConfig({ tableCode });
const customParams = getCustomParams(tableConfig.customParams);
let { param, extendParam = {} } = data ? data : {};
extendParam['PageIndex'] = 1;
extendParam['Start'] = 0;
extendParam['IsAllLoad'] = !!customParams.IsAllLoad;
const tempParamJson = this.getLoadParam({ tableCode });
if (param && extendParam) {
this.setSearchParam({
tableCode,
searchParam: param,
onComplete: () => {
if (!tempParamJson) {
const loadParamJson = this.initLoadParam({ tableCode });
extendParam = {
...loadParamJson,
...extendParam,
};
}
this.setLoadParam({
tableCode,
loadParam: extendParam,
onComplete: () => {
this.loadTableData({ tableCode });
},
});
},
});
} else if (param) {
this.setSearchParam({
tableCode,
searchParam: param,
onComplete: () => {
this.loadTableData({ tableCode });
},
});
} else if (extendParam) {
if (!tempParamJson) {
const loadParamJson = this.initLoadParam({ tableCode });
extendParam = {
...loadParamJson,
...extendParam,
};
}
this.setLoadParam({
tableCode,
loadParam: extendParam,
onComplete: () => {
this.loadTableData({ tableCode });
},
});
} else {
this.loadTableData({ tableCode });
}
};
/*
初始化加载参数
*/
initLoadParam = ({ tableCode, pageSize, pageIndex }) => {
const tableConfig = this.getTableConfig({ tableCode });
let { sort, order, defaultPageSize } = tableConfig ? tableConfig : {};
if (!sort) {
sort = 'CREATE_TIME';
order = 1;
}
const loadParamJson = initFilter(this.props.login.OrgId, '', sort, order);
if (defaultPageSize) {
loadParamJson.Limit = defaultPageSize;
loadParamJson.Start = (loadParamJson.PageIndex - 1) * defaultPageSize;
}
if (pageSize) {
loadParamJson.Limit = pageSize;
loadParamJson.Start = (loadParamJson.PageIndex - 1) * pageSize;
}
if (pageIndex) {
let pz = 10;
if (pageSize >= 0) {
pz = pageSize;
} else if (defaultPageSize) {
pz = defaultPageSize;
} else {
pz = 10;
}
loadParamJson.PageIndex = pageIndex;
loadParamJson.Start = (pageIndex - 1) * pz;
}
const selectFields = (tableConfig.navColumns || [])
.map((col) => {
return col.FIELD_NAME && col.FIELD_NAME !== 'null' ? col.FIELD_NAME : false;
})
.filter((field) => !!field);
if (selectFields.length && !tableConfig.isNoSelectField) {
if (selectFields.indexOf('ID') === -1) {
selectFields.push('ID');
}
if (selectFields.indexOf('ORG_ID') === -1) {
selectFields.push('ORG_ID');
}
loadParamJson.SelectField = selectFields;
}
if (tableConfig && tableConfig.rule) {
addRuleAndGroups(loadParamJson, tableConfig.rule);
}
return loadParamJson;
};
/*
加载表数据
*/
loadTableData(params) {
const { tableCode = this.defaultTableCode, isResetLoad, pageSize, onComplete, onLoadData } = params ? params : {};
const tempParamJson = this.getLoadParam({ tableCode });
if (isResetLoad || !tempParamJson) {
const loadParamJson = this.initLoadParam({ tableCode, pageSize });
this.setLoadParam({
tableCode,
loadParam: loadParamJson,
onComplete: () => {
const paramJson = this.getLoadParam({ tableCode });
const tempJson = paramJson ? JSON.parse(JSON.stringify(paramJson)) : {};
this.doLoadTableData({ ...tempJson }, tableCode, onComplete, onLoadData);
},
});
} else {
const paramJson = this.getLoadParam({ tableCode });
const tempJson = paramJson ? JSON.parse(JSON.stringify(paramJson)) : {};
this.doLoadTableData({ ...tempJson }, tableCode, onComplete, onLoadData);
}
}
/*
重置加载表数据参数
*/
onLoadTableDataParam(params) {}
/*
加载数据之后
*/
onAfterLoadTableData(params) {}
getRequestHeaders = () => {
// 请求参数
const addHeader = 'Bearer ' + storage('lacal').getItem('accessToken').val;
const userId = storage('lacal').getItem('userid').val;
const user = storage('lacal').getItem('loginUserVerify').val;
const RootOrgId = storage('lacal').getItem('RootOrgId').val;
const orgId = storage('lacal').getItem('webOrgId').val;
const Tenant = storage('lacal').getItem('Tenant').val;
const headers = {
// 'Content-Type': type === 'post' ? 'application/json' : 'application/x-www-form-urlencoded',
Authorization: addHeader,
userid: userId,
username: user ? user.username : '',
RootOrgId,
orgId,
Tenant: Tenant,
};
return headers;
};
/**
* 获取表格加载参数
* @param {*} loadParamJson
* @param {*} tableCode
*/
getLoadTableDataParams = (loadParamJson, tableCode) => {
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
const tableConfig = this.getTableConfig({ tableCode });
const { api, sorts, orgType, authOrgCodes, ignoreOrgRule } = tableConfig ? tableConfig : {};
if (api === null || api === undefined) return false;
if (sorts && sorts.length) {
sorts.forEach((t) => {
extendOrder(loadParamJson, t.sort, t.order);
});
}
//去重添加添加导航属性
const navFields = [];
if (tableConfig && tableConfig.includes && tableConfig.includes.length) {
tableConfig.includes.forEach((t) => {
navFields.push(t);
});
} else if (tableConfig) {
const cols =
tableConfig.originalColumns && tableConfig.originalColumns.length
? tableConfig.originalColumns
: tableConfig.columns;
if (cols && cols.length) {
const doGetInclude = (f) => {
if (f && f.indexOf('.') > 0) {
let pos = f.lastIndexOf('.');
let includeTable = f.substring(0, pos);
navFields.push(includeTable);
}
};
cols.forEach((t) => {
const field = t.field;
if (field) {
let opIndex = field.indexOf('+');
if (opIndex === -1) {
opIndex = field.indexOf('-');
if (opIndex === -1) {
opIndex = field.indexOf('*');
if (opIndex === -1) {
opIndex = field.indexOf('/');
}
}
}
if (opIndex !== -1) {
const leftField = field.substring(0, opIndex);
const rightField = field.substring(opIndex + 1);
doGetInclude(leftField);
doGetInclude(rightField);
} else {
doGetInclude(field);
}
}
});
}
}
if (navFields.length) {
const tmp = [...new Set(navFields)];
tmp.forEach((n, i) => {
extendInclude(loadParamJson, n);
});
}
if (orgType) {
loadParamJson.OrgType = orgType;
}
if (authOrgCodes) {
loadParamJson.AuthOrgCodes = authOrgCodes;
}
//查询参数
const searchParam = this.getSearchParam({ tableCode });
if (searchParam) {
if (searchParam) {
addRuleAndGroups(loadParamJson, searchParam);
}
}
// 菜单参数
const { currActivatedMenu } = this.props.app || {};
loadParamJson['MenuParameter'] =
currActivatedMenu && currActivatedMenu.MENU_FORM_PARAMS ? currActivatedMenu.MENU_FORM_PARAMS : '';
// 是否忽略组织权限
if (ignoreOrgRule) {
loadParamJson.IgnoreOrgRule = ignoreOrgRule;
}
const isError = this.onLoadTableDataParam({ tableCode, loadParam: loadParamJson, tableConfig });
if (isError) return false;
return loadParamJson;
};
/*
实际加载表数据
*/
doLoadTableData = (loadParamJson, tableCode, onComplete, onLoadData) => {
const payloadJson = this.getLoadTableDataParams(loadParamJson, tableCode);
if (!payloadJson) return;
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
const tableConfig = this.getTableConfig({ tableCode });
const { api } = tableConfig ? tableConfig : {};
this.props.dispatch({
type: 'listPage/getTableData',
payload: loadParamJson,
url: api,
onComplete: (ret) => {
if (ret && !ret.IsSuccessful) {
message.error(ret.ErrorMessage);
}
if (ret && ret.Data && ret.Data.length && tableConfig.isShowRowNo) {
ret.Data.forEach((n, i) => {
n.ROW_NO = i + 1;
});
}
if (typeof onLoadData === 'function') {
onLoadData(ret);
} else {
this.setTableData({
tableCode,
data: ret,
onComplete: () => {
if (ret && typeof tableConfig.onAfterGetData === 'function') {
tableConfig.onAfterGetData(
ret.Data,
tableConfig.pageTable ? tableConfig.pageTable.CODE : tableConfig.tableCode
);
}
if (ret) {
this.onAfterLoadTableData({ tableCode, data: ret.Data });
}
if (typeof onComplete === 'function') {
onComplete();
}
},
});
}
// 设置默认选中
const { rowSelectedKeys } = this.props;
if (Array.isArray(rowSelectedKeys) && rowSelectedKeys.length) {
this.setTableSelectedRowKeys({ tableCode, selectedKeys: rowSelectedKeys });
}
},
});
};
/*
获取配置
*/
getTableConfig(params) {
const { tableCode = this.defaultTableCode } = params || {};
let tableConfig = this.state.tableConfig;
if (tableConfig === undefined) {
tableConfig = {};
}
return tableConfig[tableCode];
}
/*
设置配置
*/
setTableConfig({ tableConfig, onComplete }) {
if (!tableConfig) return;
let tableCode = tableConfig.tableCode;
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
tableConfig.tableCode = tableCode;
}
let tempTableConfig = this.state.tableConfig;
if (tempTableConfig === undefined) {
tempTableConfig = {};
}
let oldConfig = tempTableConfig[tableCode];
if (oldConfig === undefined) {
oldConfig = {};
}
tableConfig = {
...oldConfig,
...tableConfig,
};
if (tableConfig.originalColumns === undefined) {
tableConfig.originalColumns = tableConfig.columns;
}
if (tableConfig.originalBtns === undefined) {
tableConfig.originalBtns = tableConfig.btns;
}
if (tableConfig.originalRightBtns === undefined) {
tableConfig.originalRightBtns = tableConfig.rightBtns;
}
if (tableConfig.originalRowBtns === undefined) {
tableConfig.originalRowBtns = tableConfig.rowBtns;
}
if (!tableConfig.id) {
tableConfig.id = guid();
}
tempTableConfig = {
...tempTableConfig,
[tableCode]: tableConfig,
};
this.setState(
{
tableConfig: tempTableConfig,
},
() => {
if (typeof onComplete === 'function') {
onComplete();
}
}
);
}
/*
获取加载参数
*/
getLoadParam(params) {
const { tableCode = this.defaultTableCode } = params ? params : {};
let loadParam = this.state.loadParam;
if (loadParam === undefined) {
loadParam = {};
}
return loadParam[tableCode];
}
/*
设置加载参数
*/
setLoadParam({ tableCode, loadParam, onComplete }) {
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
let tempLoadParam = this.state.loadParam;
if (tempLoadParam === undefined) {
tempLoadParam = {};
}
let oldParam = tempLoadParam[tableCode];
if (oldParam === undefined) {
oldParam = {};
}
loadParam = {
...oldParam,
...loadParam,
};
tempLoadParam = {
...tempLoadParam,
[tableCode]: loadParam,
};
this.setState(
{
loadParam: tempLoadParam,
},
() => {
if (typeof onComplete === 'function') {
onComplete();
}
}
);
}
/*
获取查询参数
*/
getSearchParam(params) {
const { tableCode = this.defaultTableCode } = params ? params : {};
let searchParam = this.state.searchParam;
if (searchParam === undefined) {
searchParam = {};
}
return searchParam[tableCode];
}
/*
设置查询参数
*/
setSearchParam({ tableCode, searchParam, onComplete }) {
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
let tempSearchParam = this.state.searchParam;
if (tempSearchParam === undefined) {
tempSearchParam = {};
}
let oldParam = tempSearchParam[tableCode];
if (oldParam === undefined) {
oldParam = {};
}
searchParam = {
...oldParam,
...searchParam,
};
tempSearchParam = {
...tempSearchParam,
[tableCode]: searchParam,
};
this.setState(
{
searchParam: tempSearchParam,
},
() => {
if (typeof onComplete === 'function') {
onComplete();
}
}
);
}
/*
获取表数据
*/
getTableData(params) {
const { tableCode = this.defaultTableCode } = params ? params : {};
let data = this.state.data;
if (data === undefined) {
data = {};
}
return data[tableCode];
}
/*
设置表数据
*/
setTableData({ tableCode, data, onComplete }) {
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
let tempData = this.state.data;
if (tempData === undefined) {
tempData = {};
}
tempData = {
...tempData,
[tableCode]: data,
};
this.setState(
{
data: tempData,
},
() => {
if (typeof onComplete === 'function') {
onComplete();
}
}
);
}
/*
获取选中
*/
getTableSelectedRowKeys(params) {
const { tableCode = this.defaultTableCode } = params ? params : {};
let selectedKeys = this.state.selectedKeys;
if (selectedKeys === undefined) {
selectedKeys = {};
}
const cuKeys = selectedKeys[tableCode];
if (cuKeys) {
return cuKeys;
}
return [];
}
/**
* add by qxiong 2020.06.11
* @param {*} param0
* 设置所有页面选中
* 在此日期前,有关 selectedKeys 的使用
* 并没有发现复制一份旧的 selectedKeys, 然后使用 tableCode 保存新一份 selectedKeys 有什么作用
* 所以此处不继续沿用这种逻辑,而是直接该保存保存,不绕弯路
* const { selectedRowsAll = [] } = this.state
* 上面这一行的 selectedRowsAll = [] 默认赋值,以及为什么会有很多 undefined 的判断,因为这个组件是被继承的,继承的组件中又重写了state
* 所以就相当于直接在这个组件中定义 state,基本都取不到
*/
setTableSelectedRowsAll = ({ selectedRowKeys, selectedRows = [] }) => {
const { selectedRowsAll = [] } = this.state;
selectedRowsAll.push(...selectedRows);
const tempSelected = [];
selectedRowKeys.forEach((key) => {
const find = selectedRowsAll.find((row) => row.ID === key);
find && tempSelected.push(find);
});
this.state.selectedRowsAll = tempSelected;
};
/*
设置选中
*/
setTableSelectedRowKeys({ tableCode, selectedKeys, onComplete }) {
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
let tempSelectedKeys = this.state.selectedKeys;
if (tempSelectedKeys === undefined) {
tempSelectedKeys = {};
}
tempSelectedKeys = {
...tempSelectedKeys,
[tableCode]: selectedKeys,
};
let isSelected = this.state[tableCode + '_isSelected'];
if (!selectedKeys || !selectedKeys.length) {
isSelected = false;
}
this.setState(
{
selectedKeys: tempSelectedKeys,
[tableCode + '_isSelected']: isSelected,
},
() => {
const tableConfig = this.getTableConfig({ tableCode });
if (tableConfig && typeof tableConfig.onSelectChange === 'function') {
tableConfig.onSelectChange(
this.getTableSelectedRowKeys({ tableCode }),
tableConfig.pageTable ? tableConfig.pageTable.CODE : tableCode
);
}
if (typeof onComplete === 'function') {
onComplete();
}
}
);
}
/*
表改变事件
*/
onTableChange = (tableCode, pagination, filters, sorter) => {
const { current, pageSize } = pagination;
const loadParam = this.getLoadParam({ tableCode });
let sort = {};
if (sorter && sorter.field) {
sort['Sort'] = sorter.field;
sort['Order'] = sorter.order === 'descend' ? '0' : '1';
}
let newParams = {
...loadParam,
OrgId: this.props.login.OrgId,
PageIndex: current,
Limit: pageSize,
Start: (current - 1) * pageSize,
};
const tempParam = { ...newParams, ...sort };
if (!loadParam.IsAllLoad) {
const tempJson = JSON.parse(JSON.stringify(tempParam));
this.doLoadTableData({ ...tempJson }, tableCode);
}
this.setLoadParam({
tableCode,
loadParam: tempParam,
onComplete: () => {
this.onAfterTableChange({ tableCode, pagination, filters, sorter, loadParam: tempParam });
},
});
};
/*
表改变之后
{
tableCode,
pagination,
filters,
sorter,
loadParam
}
*/
onAfterTableChange(params) {}
/*
选中表行项改变时
*/
onSelectTableChange = (tableCode, selectedRowKeys, selectedRows) => {
// 选择表格行
this.setTableSelectedRowsAll({ selectedRowKeys, selectedRows });
this.setTableSelectedRowKeys({ tableCode, selectedKeys: selectedRowKeys });
this.setState({
[tableCode + '_isSelected']: selectedRowKeys && selectedRowKeys.length,
});
};
/*
获取表选中记录
{
tableCode:表编号
}
*/
getTableSelectedRecord(params) {
const { tableCode = this.defaultTableCode } = params ? params : {};
const tableData = this.getTableData({ tableCode });
const selectKeys = this.getTableSelectedRowKeys({ tableCode });
const result = [];
if (selectKeys && tableData && tableData.Data) {
selectKeys.forEach((item) => {
tableData.Data.forEach((t) => {
if (item.toString().toUpperCase() == t.ID.toString().toUpperCase()) {
result.push(t);
}
});
});
}
return result;
}
/*
保存行记录
*/
saveRowRecord({ record, onComplete, tableCode }) {
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
const data = this.getTableData({ tableCode });
let list = data.Data;
if (!list) {
list = [];
data.Data = [];
}
const index = list.findIndex((item) => record.ID === item.ID);
const item = list[index];
if (item) {
list.splice(index, 1, {
...item,
...record,
});
}
this.setTableData({
tableCode,
data,
onComplete,
});
}
/*
{field,value,colConfig,record,thisRef,tableCode}
*/
onAfterRowControlChange(params) {}
/*
{field,value,colConfig,record,thisRef}
*/
onRowControlChange(params) {
const { field, value, record, thisRef, tableCode = thisRef.defaultTableCode } = params ? params : {};
if (record) {
setDataFieldValue(record, field, value);
thisRef.saveRowRecord({
record,
tableCode,
onComplete: () => {
thisRef.onAfterRowControlChange(params);
},
});
}
}
/*
{field,colConfig,record,thisRef,tableCode}
*/
onRowControlBlur(params) {
const { thisRef } = params ? params : {};
thisRef.onAfterRowControlBlur(params);
}
/*
{field,colConfig,record,thisRef,tableCode}
*/
onAfterRowControlBlur(params) {}
/*
{record,选中记录
data,当前数据行项
colConfig, 列配置信息
thisRef,当前组件
tableCode,
}
*/
onRowDropDownFillData(params) {}
/*
{record,complete,colConfig,data,columns,thisRef}
*/
onBeforeRowDropDownSelect(params) {}
/*
{record,complete,colConfig,data,columns,thisRef}
*/
onAfterRowDropDownSelect(params) {}
/*
{record,complete,colConfig,data,columns,thisRef}
*/
onRowDropDownSelect(params) {
const {
record,
complete,
colConfig,
data,
columns,
thisRef,
tableCode = thisRef.defaultTableCode,
} = params ? params : {};
if (thisRef.onBeforeRowDropDownSelect({ ...params })) return;
const configData = colConfig.data;
thisRef.fillDropDownSelectRecord({
record,
data,
saveField: configData.saveField,
labelField: configData.labelField,
navField: configData.navField,
field: colConfig.field,
idField: colConfig.idField,
});
thisRef.onRowDropDownFillData({ ...params, record, data, colConfig });
thisRef.saveRowRecord({
record: data,
tableCode,
onComplete: () => {
if (typeof complete === 'function') {
complete();
}
thisRef.onAfterRowDropDownSelect({ ...params });
const saveFields = configData.saveField ? configData.saveField.split(',') : [];
if (saveFields && saveFields.length && columns && columns.length) {
saveFields.forEach((n, i) => {
columns.forEach((item) => {
if (item.field == n) {
thisRef.onAfterRowControlChange({
field: n,
value: getDataFieldValue(data, n),
colConfig: item,
record: data,
tableCode,
});
}
});
});
}
},
});
}
/*
{record,colConfig,params,thisRef,tableCode}
*/
onRowDropDownFilter(params) {}
/*
{tableCode,record,isShow,isPermit,getHeadFieldValue}
*/
onRowEditFormData(params) {
const { record, tableCode = this.defaultTableCode } = params ? params : {};
const data = this.getTableData({ tableCode });
return {
record: record,
onSave: (row) => {
this.saveRowRecord({ ...params, record: row });
},
stateData: data ? [] : data.Data,
};
}
/*
重置行列配置信息
*/
setRowColumnConfig({ col, record, params }) {
col.value = getDataFieldValue(record, col.field);
if (col.field && col.field.indexOf('Nav_SysParams') > -1) {
col.value = this.getControlValue({
controlType: col.controlType,
value: col.value,
data: col.data,
});
}
col.showFormId = record && col.showIdField ? getDataFieldValue(record, col.showIdField) : null;
col.onChange = (changeParam) => {
this.onRowControlChange({ ...params, ...changeParam, record, colConfig: col });
};
col.onBlur = (blurParam) => {
this.onRowControlBlur({ ...params, ...blurParam, record, colConfig: col });
};
if (col.controlType === 9) {
//分页下拉
if (!col.data) {
col.data = {};
}
col.data.onSelect = (selectParam) => {
this.onRowDropDownSelect({
...params,
...selectParam,
complete: selectParam.complete,
record: selectParam.record,
data: record,
colConfig: col,
});
};
col.data.onFilter = (filterParams) => {
this.onRowDropDownFilter({ ...params, ...filterParams, record, colConfig: col });
};
}
if (col.editFormCode) {
if (!col.data) {
col.data = {};
}
col.data.editFormData = this.onRowEditFormData({ ...params, record });
}
}
/*
格式化行项列
*/
onTableRowFormatColumn({ tableCode, tableConfig, colConfig, record, text }) {
return text;
}
/**
* 可控的排序设置
*
*/
setSortData = (orderType, sortType, tc) => {
this.setLoadParam({
tableCode: tc,
loadParam: {
Order: orderType,
Sort: sortType,
},
onComplete: () => {
this.loadTableData({ tableCode: tc });
},
});
};
/**搜索单列 */
setSearchInfo = (value, fields) => {
this.setState({
localSearch: {
fields,
value,
},
});
};
/**单元格 */
renderCell = ({ isShowCol, col, tableCode, tableConfig, record, text, columns }) => {
if (isShowCol) {
if (col.formatFuncName) {
col.format = (params) => {
const formatValue = this.onTableRowFormatColumn({
record: params.record,
text: params.text,
tableCode,
tableConfig,
colConfig: params.col,
});
setDataFieldValue(record, (col.field ? col.field : col.formatFuncName) + '_formatValue', formatValue);
return formatValue;
};
}
return this.getTableCellText({ col, record, text });
}
this.setRowColumnConfig({ col, params: { columns, tableCode, tableConfig }, record });
return (
0 && col.width, wordWrap: 'break-word', wordBreak: 'break-all' }}
>
{this.getControl(col)}
);
};
/*
{
format,enumName,isBool,isDate,isPercent,isTwoPoint,isLimitText,isTime,showFormCode,showIdField,showFormId,visible,label,ID,width
data:{
enumName
}
}
*/
getColumnByColumnConfig(tableCode) {
const { showColumnSetting, showFilterDropdown } = this.state;
const tableConfig = this.getTableConfig({ tableCode });
if (!tableConfig) {
return [];
}
const columns = tableConfig.columns;
if (!columns) return [];
const cols = [];
const tmp = [];
if (tableConfig.isShowRowNo) {
tmp.push({ title: '序号', key: 'ROW_NO', dataIndex: 'ROW_NO', width: 60 });
}
columns.forEach((col) => {
if (col.visible || col.visible === undefined) {
const isShowCol =
col.controlType === null || col.controlType === undefined || col.controlType === 0 || col.controlType > 100;
const uniqueKey = col.id ? col.id : col.field ? col.field : col.formatFuncName;
const columnObj = {
title: {col.label}
,
key: uniqueKey,
dataIndex: col.field,
filterDropdown: (args) => {
return (
this.setSortData(type, col.field, tableCode)}
setSearchInfo={(val) => this.setSearchInfo(val, col.field, tableCode)}
tableConfig={tableConfig}
onMouseLeave={() => this.setState({ showFilterDropdown: false, showColumnSetting: null })}
stateTableConfig={this.state.tableConfig}
setTableConfig={(value) => this.setState({ tableConfig: value })}
colConfig={col}
/>
);
},
filterDropdownVisible: showFilterDropdown && showColumnSetting === uniqueKey,
filterIcon: (filtered) => (showColumnSetting === uniqueKey ? : ),
onFilterDropdownVisibleChange: (visible) => {
this.setState({
showFilterDropdown: visible,
});
},
render: (text, record) => {
const convertText = this.renderCell({ isShowCol, col, tableCode, tableConfig, record, text, columns });
const cellTitle = typeof convertText === 'string' || typeof convertText === 'number' ? convertText : '';
return {convertText};
},
};
col.width && (columnObj.width = col.width);
tmp.push(columnObj);
}
});
if (tmp && tmp.length) {
tmp.forEach((n, i) => {
cols.push(n);
});
}
return cols;
}
/*
获取渲染按钮
*/
getRenderBtns(tableCode, tableConfig, record, btns, type) {
console.log('1111111111');
const filterBtns = [];
if (btns && btns.length) {
btns.forEach((btn) => {
const { BTN_CONDITION } = btn.btn || {};
if (BTN_CONDITION) {
// 判断是 AND 还是 OR 逻辑
let isAndLogic = BTN_CONDITION.includes('&');
let separator = isAndLogic ? '&' : '|';
const conditionGroups = BTN_CONDITION.split(separator).map((item) => {
const conds = item.split(',');
return {
field: conds[0],
operate: conds[1],
//value: conds[2]
value: getParseValue(conds[2], this.props.login.user),
};
});
// 根据逻辑类型判断是否满足条件
let isConditionMatch = false;
if (isAndLogic) {
// AND 逻辑:所有条件都必须满足
isConditionMatch = conditionGroups.every((cond) => {
const { field, operate, value } = cond;
let fileValue = get(record, field);
switch (Number(operate)) {
case 1: // 等于
return fileValue == value;
case 2: // 不等于
return fileValue != value;
default:
return false;
}
});
} else {
// OR 逻辑:任意一个条件满足即可
isConditionMatch = conditionGroups.some((cond) => {
const { field, operate, value } = cond;
let fileValue = get(record, field);
switch (Number(operate)) {
case 1:
return fileValue == value;
case 2:
return fileValue != value;
default:
return false;
}
});
}
if (isConditionMatch) {
filterBtns.push(btn);
}
} else {
filterBtns.push(btn);
}
});
}
//排序
filterBtns.sort(compare);
return filterBtns.map((t) => {
return this.getRenderBtn({ tableCode, tableConfig, record, btnConfig: t, type });
});
}
/*
获取表行项样式类名称
*/
onTableRowClassName({ tableConfig, record }) {
if (this.props.SetRowClass && typeof this.props.SetRowClass === 'function') {
return this.props.SetRowClass(record);
} else if (tableConfig && tableConfig.classField) {
let className = null;
let classAry = tableConfig.classField.split(',');
classAry.forEach((n, i) => {
let splitClass = n.split(':');
if (splitClass.length === 2) {
let filed = splitClass[0];
let values = splitClass[1].split('|');
let r = record[filed];
if (r !== null && r !== undefined && values.length > 1) {
let index = 0;
let isGet = false;
for (index = 0; index < values.length; index = index + 2) {
if (values[index].toString() == r.toString()) {
//如果数组中某个元素和你想要测试的元素对象element相等,则证明数组中包含这个元素,返回true
isGet = true;
break;
}
}
if (isGet) {
className = values[index + 1];
return className;
}
}
}
});
return className;
}
return null;
}
/*
渲染表行项子表
*/
onRenderTableSubRow({ tableCode, tableConfig, record }) {}
/*
展开表行项时
*/
onTableExpandRow({ tableCode, tableConfig, record, expanded }) {}
/*
渲染表页脚
*/
onRenderTableFooter({ tableCode, tableConfig, data, columns, selectedRowKeys }) {
return (
);
}
/*
点击表行项
*/
onTableClickRow({ tableCode, tableConfig, record }) {}
/**
* 按钮点击日志埋点
* @param {*} BtnCode
* @param {*} BtnName
*/
btnOperateLog = (btnConfig) => {
const { btnType: BtnCode, label: BtnName } = btnConfig || {};
if (BtnCode !== undefined && BtnName !== undefined) {
this.props.dispatch({
type: 'app/operateLog',
payload: {
BtnCode,
BtnName,
FormCode: this.state.formData.CODE,
FormName: this.state.formData.NAME,
UserId: this.props.login.userId,
OrgId: this.props.login.OrgId,
},
});
}
};
/*
btn={
id:按钮ID
btnType:按钮类型
code:按钮编号
label:显示名称
icon:按钮图标
css:按钮样式
formCode:表单编号
api:API
isConfirm:是否需确认
checkSelected:检查选中
isAddLog:是否需添加日志
}
type:0-行按钮 1-按钮 2-右侧按钮
*/
getRenderBtn(params) {
const { tableCode, tableConfig, record, btnConfig } = params ? params : {};
const { formData } = this.state || {};
const isRow = record;
const isSelected = this.state[tableCode + '_isSelected'];
const loadKey = tableCode + '_' + (record ? record.ID + btnConfig.id : btnConfig.id);
const btnIsLoading = this.state[loadKey];
const btnLoading = (loading) => {
this.setState({
[loadKey]: loading,
});
};
const setformLoading = (loading) => {
this.setState({
formLoading: loading,
});
};
const close = (type) => {
if (type === undefined || type === 0) {
const tmpFunc = this.state['closeModelFunc' + (record ? record.ID + btnConfig.id : btnConfig.id)];
if (tmpFunc) {
tmpFunc();
}
}
if (type === undefined || type === 1) {
this.loadTableData({ tableCode });
}
};
let btnParam = this.onTableBtnParam({ ...params, close, btnLoading, setformLoading });
if (!btnParam) {
btnParam = {};
}
let { disabled, onBtnDisabled, content, click, json, onClick } = btnParam ? btnParam : {};
let disabledClick = disabled ? (e) => e.stopPropagation() : null;
let disabledStyle = disabled ? { color: '#c5c3c3', cursor: 'not-allowed' } : { cursor: 'pointer' };
if (btnConfig.btnType === 0) {
//自定义弹窗
const closeFunc = (fun) => {
const data = {};
data['closeModelFunc' + (record ? record.ID + btnConfig.id : btnConfig.id)] = fun;
this.setState(data);
};
const showData = {
regClose: closeFunc,
};
const getIds = () => {
if (btnConfig.btn.BTN_FUN_TYPE == 1) {
//行按鈕
if (record) {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(record);
}
if (d) return;
return record.ID;
}
} else {
const selectRecords = this.getTableSelectedRecord({ tableCode });
const tempSelectRecordIds = [];
selectRecords.forEach((t) => {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(t);
}
if (d) return;
tempSelectRecordIds.push(t.ID);
});
if (tempSelectRecordIds.length) {
return tempSelectRecordIds.join(',');
}
}
};
if (!content && btnParam) {
const that = this;
const clickKey = btnConfig.code ? btnConfig.code : btnConfig.id;
//
let tempData = {
id: record ? record.ID : '',
ORG_ID_HV: record ? record.ORG_ID : '', //wyw 集团查看 明细
parentRecord: record,
clickKey,
close,
getIds,
getTableSelectedRowKeys: () => that.getTableSelectedRowKeys({ tableCode }),
btnConfig,
...getCustomParams(btnConfig.customParams),
onSave: () => {
close();
this.loadTableData({ tableCode });
},
onCancel: () => {
close();
},
onRegDestroyCacheDataFunc: (ret) => {
if (!this.regDestroyCacheDataFunc) {
this.regDestroyCacheDataFunc = {};
}
this.regDestroyCacheDataFunc[clickKey + (record ? record.ID : '')] = ret;
},
};
const regClick = async function () {
let ids = '';
let isError = false;
if (btnConfig.btn.BTN_FUN_TYPE == 0) {
//按鈕 非行按鈕
ids = that.getTableSelectedRowKeys({ tableCode });
if (btnConfig.checkSelected && !ids) {
message.error('请选择记录');
isError = true;
}
}
if (!isError) {
await that.props.dispatch({
type: 'custom/save',
payload: {
[clickKey + (record ? record.ID : '')]: true,
},
});
}
that.btnOperateLog(btnConfig);
return {
isReturn: isError,
};
};
if (btnParam.data) {
tempData = {
...tempData,
...btnParam.data,
};
}
btnParam.content = ;
btnParam.click = () => {
return regClick();
};
showData.close = () => {
if (this.regDestroyCacheDataFunc && this.regDestroyCacheDataFunc[clickKey + (record ? record.ID : '')]) {
this.regDestroyCacheDataFunc[clickKey + (record ? record.ID : '')]();
}
};
}
if (btnParam) {
extend(showData, btnParam);
}
let disabledClick = disabled || !getIds() ? (e) => e.stopPropagation() : null;
let disabledStyle = disabled || !getIds() ? { color: 'c5c3c3', cursor: 'not-allowed' } : { cursor: 'pointer' };
return (
{isRow ? (
) : (
)}
);
} else if (btnConfig.btnType === 2) {
// 刷新
if (!isRow) {
return (
);
}
} else if (
btnConfig.btnType === 5 ||
btnConfig.btnType === 3 ||
btnConfig.btnType === 8 ||
btnConfig.btnType === 10
) {
//编辑 新增 查看 复制新增
const isShow = btnConfig.btnType === 8;
const getIds = () => {
if (record) {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(record);
}
if (d) return;
return record.ID;
}
const selectRecords = this.getTableSelectedRecord({ tableCode });
const tempSelectRecordIds = [];
selectRecords.forEach((t) => {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(t);
}
if (d) return;
tempSelectRecordIds.push(t.ID);
});
if (tempSelectRecordIds.length) {
return tempSelectRecordIds.join(',');
}
};
const isBatchEdit = btnConfig.btnType === 5 && !isRow;
const isEdit = !isBatchEdit;
const extKey = record ? record.ID + btnConfig.id : btnConfig.id;
const reloadKey = (isEdit ? '' : 'batchEdit_') + (btnConfig.formCode + '_' + extKey + '_reload');
const data = {
isShow: isShow,
record,
isBatchEdit: btnConfig.btnType === 5 && !isRow,
parentRecord: this.props.parentRecord,
getIds,
TreeSelected: this.props.data?.TreeSelected,
TreeSelectId: this.props.data?.TreeSelectId,
reloadKey,
};
if (data.isBatchEdit && !disabled) {
disabled = !isSelected;
}
if (record && !disabled) {
disabled = !getIds();
}
disabledClick = disabled ? (e) => e.stopPropagation() : null;
disabledStyle = disabled ? { color: '#c5c3c3', cursor: 'not-allowed' } : { cursor: 'pointer' };
const id = btnConfig.btnType !== 10 && record ? record.ID : '';
const copySrcId = btnConfig.btnType === 10 && record ? record.ID : '';
return (
{
this.loadTableData({ tableCode });
}}
formCode={btnConfig.formCode}
click={(visible) => {
visible && this.btnOperateLog(btnConfig);
if (typeof click === 'function') {
click(visible);
}
}}
>
{isRow ? (
) : (
)}
);
} else if (btnConfig.btnType === 4) {
//删除
const getIds = () => {
if (record) {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(record);
}
if (d) return;
return record.ID;
}
const selectRecords = this.getTableSelectedRecord({ tableCode });
const tempSelectRecordIds = [];
selectRecords.forEach((t) => {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(t);
}
if (d) return;
tempSelectRecordIds.push(t.ID);
});
if (tempSelectRecordIds.length) {
return tempSelectRecordIds.join(',');
}
};
if (isRow) {
return (
{
this.btnOperateLog(btnConfig);
this.onTableBtnDelete({ ...params, btnConfig, id: getIds(), btnLoading });
}}
type={btnConfig.css ? btnConfig.css : 'danger'}
icon={btnConfig.icon ? btnConfig.icon : 'delete'}
title="删除"
size="small"
confirmTitle={'是否确定删除?'}
disabled={disabled || !getIds()}
loading={btnIsLoading}
/>
);
} else {
return (
{
this.btnOperateLog(btnConfig);
this.onTableBtnBatchDelete({ ...params, btnConfig, ids: getIds(), btnLoading });
}}
type={btnConfig.css ? btnConfig.css : 'danger'}
icon={btnConfig.icon ? btnConfig.icon : 'delete'}
title="删除"
confirmTitle={'是否确定删除?'}
disabled={disabled || !isSelected}
loading={btnIsLoading}
/>
);
}
} else if (btnConfig.btnType === 6) {
//自定义按钮事件
const regClick = () => {
let tempBtnParam = null;
if (typeof click === 'function') {
tempBtnParam = click();
}
let { json, onBtnDisabled, onClick } = tempBtnParam ? tempBtnParam : {};
const getIds = () => {
if (record) {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(record);
}
if (d) return;
return record.ID;
}
const selectRecords = this.getTableSelectedRecord({ tableCode });
const tempSelectRecordIds = [];
selectRecords.forEach((t) => {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(t);
}
if (d) return;
tempSelectRecordIds.push(t.ID);
});
if (tempSelectRecordIds.length) {
return tempSelectRecordIds.join(',');
}
};
const ids = getIds();
if (!ids && (isRow || (!isRow && btnConfig.checkSelected))) {
message.error('请选择记录或者记录无效');
return;
}
if (btnConfig.api) {
const filter = initFilter(this.props.login.OrgId, ids);
const temJson = json ? { ...filter, ...json } : filter;
if (typeof onClick === 'function') {
if (onClick(temJson, ids)) {
return;
}
}
btnLoading(true);
this.props.dispatch({
type: 'app/getDataByPost',
payload: temJson,
url: btnConfig.api,
onComplete: (ret) => {
btnLoading(false);
if (ret) {
this.loadTableData({ tableCode });
message.success('执行成功');
//添加日志
if (btnConfig.isAddLog) {
const formId = tableConfig.formId
? tableConfig.formId
: tableConfig.formData
? tableConfig.formData.ID
: this.props.formId;
const formCode = tableConfig.formCode
? tableConfig.formCode
: tableConfig.formData
? tableConfig.formData.CODE
: this.props.formCode;
const title = '用户【' + this.props.login.user.NAME + '】:执行按钮' + btnConfig.title;
const data = 'ID:' + ids;
const extData = 'Json:' + JSON.stringify(temJson);
this.addOtherLog({ formCode, formId, title, data, extData });
}
}
},
});
}
this.btnOperateLog(btnConfig);
};
disabled = disabled
? disabled
: (isRow && false) || (!isRow && !isSelected && btnConfig.checkSelected)
? true
: false;
return (
);
} else if (btnConfig.btnType === 7) {
//自定义
const getIds = () => {
if (record) {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(record);
}
if (d) return;
return record.ID;
}
const selectRecords = this.getTableSelectedRecord({ tableCode });
const tempSelectRecordIds = [];
selectRecords.forEach((t) => {
let d = false;
if (typeof onBtnDisabled === 'function') {
d = onBtnDisabled(t);
}
if (d) return;
tempSelectRecordIds.push(t.ID);
});
if (tempSelectRecordIds.length) {
return tempSelectRecordIds.join(',');
}
};
if (content) {
return content;
}
if (btnConfig.api) {
const regClick = () => {
const ids = getIds();
if (!ids && !isRow && btnConfig.checkSelected) {
message.error('请选择记录');
return;
}
const filter = initFilter(this.props.login.OrgId, ids);
const temJson = json ? { ...filter, ...json } : filter;
if (typeof onClick === 'function') {
if (onClick(temJson, ids)) {
return;
}
}
btnLoading(true);
this.btnOperateLog(btnConfig);
this.props.dispatch({
type: 'app/getDataByPost',
payload: temJson,
url: btnConfig.api,
onComplete: (ret) => {
btnLoading(false);
if (ret) {
this.loadTableData({ tableCode });
message.success('执行成功');
//添加日志
if (btnConfig.isAddLog) {
const formId = tableConfig.formId
? tableConfig.formId
: tableConfig.formData
? tableConfig.formData.ID
: this.props.formId;
const formCode = tableConfig.formCode
? tableConfig.formCode
: tableConfig.formData
? tableConfig.formData.CODE
: this.props.formCode;
const title = '用户【' + this.props.login.user.NAME + '】:执行按钮' + btnConfig.title;
const data = 'ID:' + ids;
const extData = 'Json:' + JSON.stringify(temJson);
this.addOtherLog({ formCode, formId, title, data, extData });
}
}
},
});
};
disabled = disabled
? disabled
: (isRow && !getIds()) || (!isRow && !isSelected && btnConfig.checkSelected)
? true
: false;
return (
);
}
const customParams = getCustomParams(btnConfig.customParams);
if (customParams && customParams.print === 'true') {
return (
this.btnOperateLog(btnConfig)}>
);
}
} else if (btnConfig.btnType === 9) {
// 导出
let { tableCode = this.defaultTableCode, tableConfig } = params ? params : {};
tableConfig === undefined && (tableConfig = this.getTableConfig({ tableCode }));
const tableColumns = this.getColumnByColumnConfig(tableCode);
const tableDataSource = this.getTableData({ tableCode });
const tableSelectedKeys = this.getTableSelectedRowKeys({ tableCode });
const loadParamJson = this.getLoadTableDataParams(cloneDeep(this.initLoadParam({ tableCode })), tableCode);
// 计算导出的 excel 需要在第一行插入的标题
const formCode = tableConfig.formCode
? tableConfig.formCode
: tableConfig.formData
? tableConfig.formData.CODE
: this.props.formCode;
const searchModel = this.props.search || {
fieldConfigs: {},
relatedFieldConfigs: {},
};
const relatedFieldConfigs = searchModel.relatedFieldConfigs[formCode] || {};
const relatedFormCode = relatedFieldConfigs.relatedTo;
const relatedExtraRows = relatedFieldConfigs.extraRows;
const fieldConfigs = searchModel.fieldConfigs[relatedFormCode || formCode] || [];
const exportInserTitle = [tableConfig.exportTitle || formData.NAME];
if (relatedFormCode && Array.isArray(relatedExtraRows)) {
exportInserTitle.push(...relatedExtraRows);
}
fieldConfigs.forEach((fc) => {
const { isExportTitle, label, value, dataSource } = fc;
const cellText = renderExportCell(value, dataSource, fc, this.props.app.enums || {});
if (isExportTitle && cellText) {
exportInserTitle.push(`${label}:${cellText}`);
}
});
if (!isRow) {
return (
);
}
return null;
} else if (btnConfig.btnType === 11) {
// 导入
if (!isRow) {
return (
{
this.btnOperateLog(btnConfig);
}}
>
);
}
return null;
} else if (btnConfig.btnType === 12) {
// 列表弹窗
return (
{
visible && this.btnOperateLog(btnConfig);
if (typeof this.click === 'function') {
this.click(visible);
}
}}
>
);
} else if (btnConfig.btnType === 14) {
// 组合表单
return (
{
visible && this.btnOperateLog(btnConfig);
if (typeof this.click === 'function') {
this.click(visible);
}
}}
>
);
} else if (btnConfig.btnType === 15) {
// 自定义导入
const uploadProps = {
name: 'file',
showUploadList: false,
action: config.serviceHost(btnConfig.api),
data: { OrgId: this.props.login.OrgId },
headers: this.getRequestHeaders(),
onChange: (info) => {
const { name, status, response = {} } = info.file;
const { IsSuccessful, ErrorMessage } = response;
if (status === 'done') {
if (IsSuccessful) {
message.success(`${name} 导入并保存成功`);
this.forceUpdate();
} else {
message.error(`${name} 导入失败,${ErrorMessage}`);
}
} else if (status === 'error') {
if (response.ErrorMessage) {
message.error(`${name} 导入错误,${ErrorMessage}`);
} else {
message.error(`${name} 导入错误`);
}
}
},
};
return (
);
} else if (btnConfig.btnType === 16) {
// 带参数的自定义弹窗
return (
{
visible && this.btnOperateLog(btnConfig);
if (typeof this.click === 'function') {
return this.click(visible);
}
}}
>
);
} else if (btnConfig.btnType === 17) {
// 树弹窗
return (
{
visible && this.btnOperateLog(btnConfig);
if (typeof this.click === 'function') {
return this.click(visible);
}
}}
>
);
} else if (btnConfig.btnType === 18) {
// word打印模板
return (
,
}}
>
);
} else if (btnConfig.btnType === 20) {
// 复选框
return (
{
tableConfig.dragable = evt.target.checked;
this.forceUpdate();
}}
>
{btnConfig.label}
);
}
return isRow ? (
) : (
);
}
/*
参数:{
tableCode,tableConfig,record,btnConfig,
type:0-行按钮 1-按钮 2-右侧按钮
按钮类型:
0://自定义弹窗
close 关闭事件,selectRecords:选中行项函数
6://自定义点击事件
selectRecords:选中行项函数
7://自定义
selectRecords:选中行项函数
}
返回值:{
按钮类型:
0://自定义弹窗
disabled 按钮是否失效,click:点击事件,onBtnDisabled:按钮失效事件,content:弹窗中显示的文本DOM
3,5,8,10:// 新增 编辑 查看 复制新增
disabled:按钮是否失效,click:点击事件
4:删除
disabled:按钮是否失效
6:自定义点击事件
disabled 按钮是否失效,click:点击事件,onBtnDisabled:按钮失效事件,json:点击调用参数
7:自定义
disabled 按钮是否失效,content:弹窗中显示的文本DOM,onBtnDisabled:按钮失效事件,json:点击调用参数
}
*/
onTableBtnParam(params) {
// const { tableCode, tableConfig, record, btnConfig } = params ? params : {};
return {};
}
/*
删除记录
*/
onTableBtnDelete(params) {
let { tableCode = this.defaultTableCode, tableConfig, id, btnConfig, btnLoading } = params ? params : {};
if (tableConfig === undefined) {
tableConfig = this.getTableConfig({ tableCode });
}
const delApiUrl = tableConfig ? tableConfig.deleteApi : {};
if (empty(delApiUrl)) {
message.error('请配置删除API');
return;
}
if (empty(id)) {
return;
}
if (btnLoading) {
btnLoading(true);
}
this.props.dispatch({
type: 'app/deleteItem',
payload: { id },
url: delApiUrl,
onComplete: (ret) => {
if (btnLoading) {
btnLoading(false);
}
if (ret) {
const deleteData = [];
if (btnConfig.isAddLog) {
const tableData = this.getTableData({ tableCode });
const selectKeys = id.split(','); // this.getTableSelectedRowKeys({ tableCode });
if (selectKeys && tableData && tableData.Data) {
selectKeys.forEach((item) => {
tableData.Data.forEach((t) => {
if (item.toString().toUpperCase() === t.ID.toString().toUpperCase()) {
deleteData.push(t);
}
});
});
}
}
message.success('删除成功');
this.loadTableData({ tableCode });
if (btnConfig.isAddLog) {
const formId = tableConfig.formId
? tableConfig.formId
: tableConfig.formData
? tableConfig.formData.ID
: this.props.formId;
const formCode = tableConfig.formCode
? tableConfig.formCode
: tableConfig.formData
? tableConfig.formData.CODE
: this.props.formCode;
const extData = deleteData ? ('删除数据,详情:', JSON.stringify(deleteData)) : null;
this.addDeleteLog({ formCode, ids: id, formId, extData });
}
}
},
});
}
/*
批次删除记录
*/
onTableBtnBatchDelete(params) {
let { tableCode = this.defaultTableCode, tableConfig, ids, btnConfig, btnLoading } = params ? params : {};
if (tableConfig === undefined) {
tableConfig = this.getTableConfig({ tableCode });
}
const delApiUrl = tableConfig ? tableConfig.batchDeleteApi : {};
if (empty(delApiUrl)) {
message.error('请配置删除API');
return;
}
if (!ids) return;
if (btnLoading) {
btnLoading(true);
}
this.props.dispatch({
type: 'app/deleteItemBatch',
payload: {
ids: ids,
},
url: delApiUrl,
onComplete: (ret) => {
if (btnLoading) {
btnLoading(false);
}
if (ret) {
const deleteData = [];
if (btnConfig.isAddLog) {
const tableData = this.getTableData({ tableCode });
const selectKeys = ids.split(','); // this.getTableSelectedRowKeys({ tableCode });
if (selectKeys && tableData && tableData.Data) {
selectKeys.forEach((item) => {
tableData.Data.forEach((t) => {
if (item.toString().toUpperCase() === t.ID.toString().toUpperCase()) {
deleteData.push(t);
}
});
});
}
}
this.loadTableData({ tableCode });
message.success('删除成功');
this.setTableSelectedRowKeys({ tableCode, selectedKeys: [] });
if (btnConfig.isAddLog) {
const formId = tableConfig.formId
? tableConfig.formId
: tableConfig.formData
? tableConfig.formData.ID
: this.props.formId;
const formCode = tableConfig.formCode
? tableConfig.formCode
: tableConfig.formData
? tableConfig.formData.CODE
: this.props.formCode;
const extData = deleteData ? ('删除数据,详情:', JSON.stringify(deleteData)) : null;
this.addDeleteLog({ formCode, ids, formId: formId, extData });
}
}
},
});
}
genDataSource(tableCode, tableData) {
// 生产表格的dataSource
const { localSearch = {} } = this.state;
if (tableData.Data) {
if (Object.keys(localSearch).length) {
const tableConfig = this.getTableConfig({ tableCode });
return tableData.Data.filter((record) => {
const col = tableConfig.columns.filter((t) => t.field === localSearch.fields)[0]; // '';//localSearch.fields
let val = getDataFieldValue(record, col.field);
const isShowCol =
col.controlType === null || col.controlType === undefined || col.controlType === 0 || col.controlType > 100;
if (isShowCol) {
if (col.formatFuncName) {
col.format = (params) => {
const formatValue = this.onTableRowFormatColumn({
record,
text: val,
tableCode,
tableConfig,
colConfig: params.col,
});
setDataFieldValue(record, (col.field ? col.field : col.formatFuncName) + '_formatValue', formatValue);
val = formatValue;
};
}
val = this.getTableCellText({ col, record, text: val, isReturnString: true });
}
//val = getDataFieldValue(record, col.field);
if (col.field && col.field.indexOf('Nav_SysParams') > -1) {
val = this.getControlValue({
controlType: col.controlType,
value: col.value,
data: col.data,
});
}
if (val) {
// 值
if (typeof val === 'number') {
val = val.toString();
}
if (String(val) === 'null') {
return false;
}
return val.indexOf(localSearch.value) >= 0;
}
return false;
});
} else {
return tableData.Data;
}
} else {
return [];
}
}
/**
* 表格操作栏
*/
tableOperateColumn(tableCode) {
const tableConfig = this.getTableConfig({ tableCode });
const rowBtns = tableConfig.rowBtns;
const OperateTitle = () => {
return (
this.handleCustomFieldChange(tableConfig, field, value, t)}
clearCustomConfig={() => this.clearCustomConfig(tableConfig)}
saveCustomConfig={() => this.saveCustomConfig(tableConfig)}
/>
);
};
if (rowBtns && rowBtns.length) {
let currRecord = {};
// let obj = {
// render: (text, record, index) => {
// currRecord = record
// }
// };
//let l = this.getRenderBtns(tableCode, tableConfig, currRecord, rowBtns, 0).filter(value => typeof value !== "undefined").length;
//if (l === 0 || l == null) l = 1;
let width = 32 * rowBtns.length;
if (width < 80) {
width = 80;
}
return (
}
filterDropdown={}
render={(text, record, index) => {
// 此项宽度设置为 单个样式宽 * 按钮个数 - 左右边距
return (
{this.getRenderBtns(tableCode, tableConfig, record, rowBtns, 0)}
);
}}
/>
);
} else {
return (
}
filterDropdown={}
width={35}
render={() => }
/>
);
}
}
// 伸缩表格列操作
handleResize =
(tableCode, colu) =>
(e, { size }) => {
if (this.state.tableConfig === undefined || !this.state.tableConfig[tableCode]) {
message.error('表单配置错误!');
return;
}
let thisColumns = { ...this.state.tableConfig[tableCode] };
if (this.state.tableConfig === undefined) {
this.state.tableConfig = {};
}
thisColumns.columns.forEach((item) => {
if (item.field === colu.dataIndex) {
item.width = size.width;
}
});
this.setState({
tableConfig: {
...this.state.tableConfig,
[this.state.tableConfig[tableCode]]: thisColumns,
},
});
};
/**
* 批量新增保存
*/
handleBatchAddSave = (tableCode) => {
const { selectedRowsAll = [] } = this.state;
const { close } = this.props.data;
close instanceof Function && close(undefined, cloneDeep(selectedRowsAll));
this.state.selectedRowsAll = undefined;
this.onSelectTableChange(tableCode, [], []);
};
moveRow = (dragIndex, hoverIndex, tableCode, tableConfig) => {
const tableData = this.state.data[tableCode].Data;
const dragRow = tableData[dragIndex];
const hoverRow = tableData[hoverIndex];
const pageTable = tableConfig.pageTable || {};
if (!pageTable.SORT) {
message.error('未配置排序字段,操作取消');
return;
}
// 调用接口
this.props.dispatch({
type: 'listPage/listRowDragChange',
payload: {
Keyword: pageTable.DATA_TABLE,
Parameter1: dragRow.ID,
Parameter2: hoverRow.ID,
Parameter3: pageTable.SORT,
OrgId: this.props.login.OrgId,
},
onComplete: (res) => {
if (res) {
// 更新数据
const updateData = update(tableData, {
$splice: [
[dragIndex, 1],
[hoverIndex, 0, dragRow],
],
});
this.state.data[tableCode].Data = updateData;
this.setState({ data: this.state.data });
}
},
});
};
/*
渲染表
*/
getRenderTable(tableCode) {
if (tableCode === undefined) {
tableCode = this.defaultTableCode;
}
let tableConfig = this.getTableConfig({ tableCode });
if (!tableConfig) return ;
const tableHeight = tableConfig.pageTable ? tableConfig.pageTable.HEIGTH : 0;
const tableWidth = tableConfig.pageTable ? tableConfig.pageTable.WIDTH : 0;
const isFixed = tableConfig.checked || (tableConfig.rowBtns && tableConfig.rowBtns.length) || tableHeight; // 是否固定列
let newColumns = this.getColumnByColumnConfig(tableCode); // 表头字段
let loadParam = this.getLoadParam({ tableCode });
let tableData = this.getTableData({ tableCode });
const selectKeys = this.getTableSelectedRowKeys({ tableCode });
loadParam = loadParam || {};
tableData = tableData || {};
const tableDataSource = this.genDataSource(tableCode, tableData);
tableDataSource.forEach((tds) => {
!tds.hasOwnProperty('key') && (tds.key = tds.ID);
});
const defaultExpandedRowKeys = tableDataSource && tableDataSource.length ? [tableDataSource[0].key] : [];
const paginationConfig = loadParam?.IsAllLoad
? false
: {
pageSizeOptions: ['5', '10', '20', '100', '1000'],
current: loadParam ? loadParam.PageIndex : 1,
pageSize: loadParam ? loadParam.Limit : 10,
total: tableData ? tableData.TotalCount : 0,
showSizeChanger: true,
showQuickJumper: true,
size: 'small',
position: tableConfig.position ? tableConfig.position : 'bottom',
showTotal: () => `共 ${tableData ? tableData.TotalCount : 0} 条`,
};
// 配置最多可选个数
const customRowSelection = tableConfig.maxCheckCount
? {
hideDefaultSelections: true,
columnTitle: ' ',
getCheckboxProps: (record) => {
return {
disabled: selectKeys.length >= tableConfig.maxCheckCount && selectKeys.indexOf(record.ID) === -1,
};
},
}
: {};
const rowSelection = {
// 如果需要支持拖曳排序,则不允许fixed,否则会报错
fixed: !tableConfig.hasChildren && !tableConfig.dragable,
selectedRowKeys: selectKeys,
columnWidth: 32,
onChange: (selectedRowKeys, selectedRows) => {
this.onSelectTableChange(tableCode, selectedRowKeys, selectedRows);
},
type: tableConfig && tableConfig.checkType == 1 ? 'radio' : 'checkbox',
hideDefaultSelections: false,
...customRowSelection,
};
let hasFooter = () => {
// 是否显示底部
let footerSumType = tableConfig.footerSumType;
if (footerSumType === 1) {
return true;
} else if (footerSumType === 2) {
return selectKeys && selectKeys.length > 0;
} else {
return false;
}
};
/**
* 固定规则:
* 固定列要设置宽度(操作列除外)
* 留少数几列不设定宽度
*/
let isScrollX = () => {
if (isFixed) {
const totalWidth = newColumns.reduce((a, b) => {
if (b.width) {
return a + b.width;
} else {
return a + 0;
}
}, 0);
const scrollX = tableWidth > totalWidth + 200 ? tableWidth : totalWidth + 200;
return { scroll: { x: scrollX, y: tableHeight } };
} else {
return { scroll: { y: tableHeight } };
}
};
const openNotification = (h) => {
notification.destroy();
notification.open({
message: h.title,
key: h.key,
placement: 'bottomRight',
});
};
let isLoading = this.props.loading ? this.props.loading.effects['listPage/getTableData'] : false;
if (!isLoading) {
isLoading = this.state.formLoading;
}
const isBatchAddList = this.props.data && this.props.data.btnTypeBatchAdd;
const contentWidth = tableConfig.pageTable && tableConfig.pageTable.WIDTH ? tableConfig.pageTable.WIDTH : 'auto';
const TableHeadBtns = this.getRenderBtns(tableCode, tableConfig, null, tableConfig.btns, 1);
const { components } = getDragableProps();
const dragableProps = tableConfig.dragable
? {
components: {
...components,
...TableResizableCell,
},
onRow: (rowRecord, index) => ({
index,
moveRow: (dragIndex, hoverIndex) => this.moveRow(dragIndex, hoverIndex, tableCode, tableConfig),
onClick: () => {
this.onTableClickRow({ tableCode, tableConfig, rowRecord });
},
}),
}
: {
components: TableResizableCell,
onRow: (rowRecord, index) => ({
onClick: () => {
this.onTableClickRow({ tableCode, tableConfig, rowRecord });
},
}),
};
return (
{isBatchAddList ? (
) : TableHeadBtns && TableHeadBtns.length ? (
{TableHeadBtns}
) : null}
{
this.onTableChange(tableCode, pagination, filters, sorter);
}}
rowSelection={tableConfig.checked ? rowSelection : null}
rowClassName={(record, index) => {
const remoteClass = this.onTableRowClassName({ tableConfig, record });
const crossClass = index % 2 === 1 ? 'dark-row' : 'light-row';
if (remoteClass) {
return classNames(styles[remoteClass]);
}
return classNames(styles[crossClass]);
}}
expandedRowRender={
tableConfig.hasChildren
? (record) => {
return this.onRenderTableSubRow({ record, tableCode, tableConfig });
}
: null
}
expandIcon={(props) => {
if (!props.expandable) return null;
if (props.expanded) {
return props.onExpand(props.record, e)} />;
} else {
return props.onExpand(props.record, e)} />;
}
}}
expandedRowKeys={this.state.expandedRowKeysChanged ? this.state.expandedRowKeys : defaultExpandedRowKeys}
onExpand={(expanded, record) => {
this.onTableExpandRow({ tableCode, tableConfig, record, expanded });
}}
onExpandedRowsChange={(expandedRowKeys) => {
this.setState({
expandedRowKeysChanged: true,
expandedRowKeys,
});
}}
footer={
hasFooter()
? (data) => {
return this.onRenderTableFooter({
tableCode,
tableConfig,
selectedRowKeys: selectKeys,
data,
columns: tableConfig.columns,
});
}
: null
}
bordered
{...isScrollX()}
{...dragableProps}
>
{newColumns &&
newColumns.map((h, index) => {
return (
{
return {
onDoubleClick: (e) => {
e.preventDefault();
e.stopPropagation();
if (h.title) {
openNotification(h);
}
},
};
}}
onHeaderCell={(column) => {
return {
onMouseEnter: () => {
// 鼠标移入表头单元格
this.setState({
showColumnSetting: column.key,
});
},
width: column.width,
onResize: this.handleResize(tableCode, column),
};
}}
/>
);
})}
{!isBatchAddList ? this.tableOperateColumn(tableCode) : null}
);
}
handleTableCardSelect = (evt, item, tableCode) => {
const selectKeys = cloneDeep(this.getTableSelectedRowKeys({ tableCode }));
if (evt.target.checked) {
this.onSelectTableChange(tableCode, [item.ID].concat(selectKeys), [item]);
} else {
const findIndex = selectKeys.findIndex((sel) => sel === item.ID);
if (findIndex !== -1) {
selectKeys.splice(findIndex, 1);
this.onSelectTableChange(tableCode, selectKeys, []);
}
}
};
/*
* 渲染卡片式表格
*/
getRenderTableCard(tableCode) {
if (tableCode === undefined) tableCode = this.defaultTableCode;
let tableConfig = this.getTableConfig({ tableCode });
if (!tableConfig) return null;
let loadParam = this.getLoadParam({ tableCode });
let tableData = this.getTableData({ tableCode });
loadParam = loadParam || { PageIndex: 1, IsAllLoad: false, Limit: 10 };
tableData = tableData || { TotalCount: 0 };
const newColumns = this.getColumnByColumnConfig(tableCode); // 表头字段
const tableDataSource = this.genDataSource(tableCode, tableData);
const selectKeys = this.getTableSelectedRowKeys({ tableCode });
const paginationConfig = {
pageSizeOptions: ['5', '10', '20', '100', '100'],
current: loadParam ? loadParam.PageIndex : 1,
pageSize: loadParam ? (loadParam.IsAllLoad ? loadParam.ShowLimit : loadParam.Limit) : 10,
total: tableData ? tableData.TotalCount : 0,
showSizeChanger: true,
showQuickJumper: true,
size: 'small',
position: tableConfig.position ? tableConfig.position : 'bottom',
showTotal: () => `共 ${tableData ? tableData.TotalCount : 0} 条`,
};
let isLoading = this.props.loading ? this.props.loading.effects['listPage/getTableData'] : false;
if (!isLoading) {
isLoading = this.state.formLoading;
}
const isBatchAddList = this.props.data && this.props.data.btnTypeBatchAdd;
const TableHeadBtns = this.getRenderBtns(tableCode, tableConfig, null, tableConfig.btns, 1);
const WrapComponent = tableConfig.dragable ? DragDropCard : React.Fragment;
return (
{TableHeadBtns}
}
>
{tableDataSource.map((ds, dsIndex) => {
const actionBtns = this.getRenderBtns(tableCode, tableConfig, ds, tableConfig.rowBtns, 0);
const thumbCode = get(ds, tableConfig.cardPicField);
return (
this.moveRow(dragIndex, hoverIndex, tableCode, tableConfig)}
>
this.handleTableCardSelect(evt, ds, tableCode)}
className={styles.tableCardCheckbox}
/>
{newColumns.map((col) => {
return (
{col.title}
:
{col.render ? col.render(ds[col.dataIndex], ds) : ds[col.dataIndex]}
);
})}
);
})}
{
this.onTableChange(tableCode, { ...paginationConfig, current, pageSize });
}}
onShowSizeChange={(current, pageSize) => {
this.onTableChange(tableCode, { ...paginationConfig, current, pageSize });
}}
{...paginationConfig}
/>
);
}
}
export default TableBaseComponent;