import React from 'react';
import { CnCardItems, CnBox, CnButton, CnIcon } from '@cainiaofe/cn-ui-m';
import {
calculateTextExprValue,
calculateWaitComponentList,
executeFunction,
executeObjectExpr,
getRealizeValue,
getRealRequestUrl,
getRealResponse,
getRunTimeItem,
handleDesignMokelayUrl,
handleI18nLabel,
handleListI18nLabel,
isArrayNotEmpty,
isDesignMode,
isEmptyButNotZero,
isRequestConfig,
makeButtons,
renderIcon,
setDataToDs,
transDataSourceToMap,
transProxyToObject,
} from '@/common/util/util';
import {
CnPageRequestFinish,
CnTableRequestFinish,
emitEvent,
onEvent,
} from '@/common/util/event-name';
import {
handleRequestParams,
makeRequest,
transRequestConfigToRemote,
} from '@/common/manager/request';
import { allCellMap, getRunTimeCell } from '@/common/manager/cell';
import {
_bindFilterData,
_columnInfo,
_getBindFilterData,
_getContext,
_selectedRowKeys,
_selectedRowRecords,
_state,
_tableRef,
_tableResponse,
} from '@/common/util/biz-component-prop-name';
import { getButtonAction, getItem } from '@/common/manager/button';
import { ButtonPosition } from '@/type/button-position';
import $i18n from 'panda-i18n';
import {
__dataSource__,
__filterValue__,
__formValue__,
__paging__,
__selectedRowKeys__,
__selectedRowRecords__,
__tableColumns__,
__tableCurrentRow__,
__tableData__,
__tableExtra__,
__totalCount__,
} from '@/common/util/expr-const';
import isPlainObject from 'lodash/isPlainObject';
import cloneDeep from 'lodash/cloneDeep';
import { formUrlencoded } from '@/common/util/const';
import qs from 'query-string';
import set from 'lodash/set';
import isEmpty from 'lodash/isEmpty';
const CnDownload = () => {
return null;
};
const CnOSSImport = () => {
return null;
};
const CnExport = () => {
return null;
};
const CnBalloon = () => {
return null;
};
class CnTable extends React.Component {
constructor(props) {
super(props);
this.remoteInstance = CnCardItems?.createRemoteInstance?.();
const tempState = {
allEnumMap: {},
tableDataSource: undefined,
};
if (isArrayNotEmpty(props?.openKeys)) {
tempState.openKeys = [...props.openKeys];
}
this.state = tempState;
}
setTableProps = (config) => {
const { dataSource } = config || {};
if (Array.isArray(dataSource)) {
this.setState({
tableDataSource: dataSource,
});
}
};
componentDidMount() {
this.setEnumMap();
onEvent(CnPageRequestFinish, () => {
this.setEnumMap();
});
}
setEnumMap = () => {
const isDesign = isDesignMode(this.props);
const { _context, columns } = this.props;
const enumPromiseList = [];
const allEnumMap = {};
if (Array.isArray(columns) && columns.length > 0) {
for (const item of columns) {
const { dataIndex, format, options = {} } = item || {};
if (dataIndex && format === 'enumeration') {
const { enumDataOrigin, enumRequestConfig, enumDataSource } = options;
if (enumDataOrigin === 'request' && enumRequestConfig?.url) {
enumPromiseList.push(
makeRequest({
buttonConfig: {
options: {
requestConfig: enumRequestConfig,
},
},
state: _context?.state,
needSuccessToast: false,
isDesign,
urlParamsDataSource: this.getUrlParams(),
}).then((res) => {
return {
dataIndex,
data: getRealResponse(res)?.data,
};
}),
);
} else if (enumDataOrigin === 'static') {
if (Array.isArray(enumDataSource) && enumDataSource?.length > 0) {
allEnumMap[dataIndex] = transDataSourceToMap(enumDataSource);
} else if (typeof enumDataSource === 'function') {
const temp = executeFunction(enumDataSource, _context?.state);
if (Array.isArray(temp) && temp?.length > 0) {
allEnumMap[dataIndex] = transDataSourceToMap(temp);
}
} else {
const temp = calculateTextExprValue(enumDataSource, {
state: _context?.state,
});
if (Array.isArray(temp) && temp?.length > 0) {
allEnumMap[dataIndex] = transDataSourceToMap(temp);
}
}
}
}
}
if (enumPromiseList.length > 0) {
Promise.allSettled(enumPromiseList).then((res) => {
if (res.length > 0) {
res.forEach((item3) => {
if (item3?.value?.dataIndex && item3?.value?.data?.length > 0) {
allEnumMap[item3?.value?.dataIndex] = transDataSourceToMap(
item3?.value?.data,
);
}
});
}
this.setState({
allEnumMap,
});
});
} else if (Object.keys(allEnumMap).length > 0) {
this.setState({
allEnumMap,
});
}
}
};
load = () => {
this.setState({
tableDataSource: undefined,
});
this.remoteInstance?.refresh?.();
};
tableLoad = () => {
this.remoteInstance?.load?.();
};
getRemoteOperation = () => {
return this.remoteInstance?.remoteOperation;
};
dynamicRegisterFormat = (data) => {
if (data) {
const { tableColumns = [] } = data;
if (tableColumns?.length > 0) {
const formatMap = {};
tableColumns.forEach((item) => {
const { format, dataIndex } = item || {};
if (format && !allCellMap[format]) {
const componentDefine = getRunTimeCell(format);
if (componentDefine) {
let { component } = componentDefine;
component = getRealizeValue(component);
if (component && typeof component === 'function') {
formatMap[format] = (column) => {
return {
cell: (value, index, record) => {
const com = React.createElement(component, {
[_columnInfo]: column,
cellConfig: column,
value,
record,
index,
enumMap: this.state.allEnumMap[column?.dataIndex],
[_tableRef]: this,
// _context,
});
if (com) {
return com;
}
return '-';
},
enableAutoWidth: false,
};
};
}
}
}
});
if (Object.keys(formatMap).length > 0) {
// UICnTable?.registerFormat(formatMap)
}
}
}
};
// 处理数据源
handleDesignMode = (tableProps = {}, isDesign) => {
if (isDesign) {
const { remote, requestConfig, columns } = tableProps;
// const newData = {}
// if(dataSource.length === 0 && columns.length > 0){
// columns.forEach(item=>{
// const {dataIndex,format} = item;
// newData[dataIndex] = 'mock数据'
// })
// tableProps.dataSource = [newData]
// }
// tableProps.remote = {}
// 如果table配置了remote,那么强制将dataSource设置为空,并且设置remote.url的域名为预发mokelay的域名
if (remote && remote.url && remote.serviceType === 'mokelay') {
tableProps.remote = {
...tableProps.remote,
url: handleDesignMokelayUrl(remote.url),
};
// tableProps.dataSource = undefined
}
handleListI18nLabel(tableProps?.columns, 'title');
handleListI18nLabel(tableProps?.operateColumn?.buttons, 'children');
handleListI18nLabel(tableProps?.toolbar?.batchArea, 'children');
handleListI18nLabel(tableProps?.toolbar?.toolArea, 'children');
if (tableProps?.emptyContent) {
tableProps.emptyContent = handleI18nLabel(tableProps.emptyContent);
}
if (!requestConfig?.url && isArrayNotEmpty(columns)) {
const tempData = {};
columns.forEach((item) => {
const { dataIndex } = item;
if (dataIndex) {
tempData[dataIndex] = 'mock数据';
}
});
tableProps.dataSource = [tempData];
}
}
};
/**
* 处理操作列
*/
handleColumns = (columns = []) => {
const newColumnMap = {};
const result = [];
columns.forEach((item) => {
const { parent } = item || {};
const newColumn = this.makeColumnItem(item);
if (newColumn) {
if (newColumn?.dataIndex) {
newColumnMap[newColumn.dataIndex] = newColumn;
}
if (parent && newColumnMap[parent]) {
if (Array.isArray(newColumnMap[parent].children)) {
newColumnMap[parent].children.push(newColumn);
} else {
newColumnMap[parent].children = [newColumn];
}
} else {
result.push(newColumn);
}
}
});
return result;
};
makeColumnItem = (item) => {
if (item) {
const { _context } = this.props;
const isDesign = isDesignMode(this.props);
const {
dataIndex,
format,
optType,
options = {},
cellRender,
} = item || {};
const result = {
...item,
cellRender: undefined,
};
if (format === 'date-time') {
result.dateHasSecond = true;
}
if (typeof result.hidden === 'boolean') {
return () => {
return result.hidden;
};
} else if (typeof result.hidden === 'function') {
return (record, index) => {
return executeFunction(
result?.hidden,
record,
_context?.state,
index,
);
};
}
if (format) {
const componentDefine = getRunTimeCell(format);
if (componentDefine) {
let { component } = componentDefine;
component = getRealizeValue(component);
if (component && typeof component === 'function') {
result.cell = (value, index, record) => {
const com = React.createElement(component, {
...options,
cellConfig: item,
value,
record,
index,
_context,
enumMap: this.state.allEnumMap[dataIndex],
[_tableRef]: this,
});
if (com) {
return com;
}
return '-';
};
result.enableAutoWidth = false;
}
}
}
if (optType) {
const action = getButtonAction({
...item,
position: ButtonPosition.tableCell,
});
if (action && !isDesign) {
result.getCellProps = (value, rawData, rawIndex) => {
const temp = {};
if (isEmptyButNotZero(value)) {
} else {
temp.onClick = () => {
if (optType === 'dialog' || optType === 'flowAction') {
if (isPlainObject(rawData)) {
this.setDataSource({
[__tableCurrentRow__]: rawData,
});
}
}
action({
buttonConfig: item,
record: rawData,
index: rawIndex,
value,
state: _context?.state,
urlParamsDataSource: this.getUrlParams(),
recordDataSource: rawData,
extraParamList: [rawIndex],
_context,
position: ButtonPosition.tableCell,
});
};
}
if (optType) {
temp.className = 'cn-table-link-cell';
}
return temp;
};
}
}
if (typeof cellRender === 'function') {
result.cell = cellRender;
}
return result;
}
};
handleOperateButtonExpr = (expr, state) => {
if (typeof expr === 'boolean') {
return () => {
return expr;
};
} else if (typeof expr === 'function') {
return (record, index) => {
return expr?.(record, state, index);
};
} else if (typeof expr === 'string' && expr.length > 0) {
} else if (isPlainObject(expr)) {
return (record, index) => {
return executeObjectExpr(expr, {
[__tableCurrentRow__]: record || {},
[__dataSource__]: state || {},
});
};
}
return expr;
};
//
// handleToolbarButtonExpr = (expr, state) => {
// if (typeof expr === 'boolean') {
// return () => {
// return expr;
// };
// } else if (typeof expr === 'function') {
// return () => {
// return expr?.(this.getFilterParams(), state);
// };
// } else if ((typeof expr === 'string' && expr.length > 0) || isPlainObject(expr)) {
// return ()=>{
// const filterParams = this.getFilterParams();
// return executeObjectExpr(expr, {
// [__formValue__]: filterParams,
// [__filterValue__]: filterParams,
// [__dataSource__]: state || {},
// }, filterParams, state || {})
// }
// }
// return expr;
// };
handleOperateButtons = (buttons = []) => {
const isDesign = isDesignMode(this.props);
const { _context } = this.props;
return buttons.map((item, index) => {
const {
primaryKey,
optType,
options = {},
children,
hidden,
disabled,
...rest
} = item;
const isHidden = this.handleOperateButtonExpr(hidden, _context?.state);
const isDisabled = this.handleOperateButtonExpr(
disabled,
_context?.state,
);
const temp = {
...rest,
hidden: isHidden,
disabled: isDisabled,
children,
};
const action = getButtonAction({
...item,
position: ButtonPosition.tableOperate,
});
const componentDefine = getRunTimeItem(optType);
if (action) {
if (!isDesign) {
const tempButtonConfig = cloneDeep(item);
temp.onClick = (e, record, index) => {
if (isPlainObject(record)) {
this.setDataSource({
[__tableCurrentRow__]: record,
});
}
action({
position: ButtonPosition.tableOperate,
componentProps: this.props,
buttonConfig: tempButtonConfig,
e,
record,
index,
_context,
tableRef: this,
state: _context?.state,
urlParamsDataSource: this.getUrlParams(),
recordDataSource: record,
extraParamList: [index],
[_getContext]: () => {
return _context;
},
});
};
const { needConfirm, confirmInfo } = options || {};
if (
optType === 'request' &&
needConfirm &&
confirmInfo?.confirmShowType === 'balloon'
) {
// const commonParams = this.getCommonParams();
// const oldClick = temp.onClick;
// temp.children = (record,index)=>{
// return
// }
// tempButtonConfig.options.needConfirm = false
// temp.onClick = undefined
}
}
} else if (componentDefine?.component) {
const component = getRealizeValue(componentDefine.component);
if (component) {
temp.children = (record, index) => {
return React.createElement(component, {
...options,
record,
index,
buttonConfig: item,
children,
_context,
[_tableRef]: this,
[_getBindFilterData]: this.getFilterParams,
[_getContext]: () => {
return _context;
},
});
};
}
}
return temp;
});
};
handleRowSelection = (rowSelection) => {
const { selectType } = rowSelection || {};
const { _context, value, useDetailValue } = this.props;
const result = { ...rowSelection, useDetailValue };
if (typeof result?.isDisabled === 'function') {
const originIsDisabledFunc = result.isDisabled;
result.isDisabled = (
row,
rowIndex,
selectedRowKeys,
selectedRowRecords,
) => {
return originIsDisabledFunc(
row,
rowIndex,
selectedRowKeys,
selectedRowRecords,
_context?.state,
);
};
} else {
delete result?.isDisabled;
}
result.type = selectType;
if (isArrayNotEmpty(value)) {
result.selectedRowKeys = value;
}
return result;
};
// 处理工具栏按钮
handleToolbar = (toolbar) => {
const result = {};
if (toolbar) {
const { batchArea = [], toolArea = [], settings = [] } = toolbar;
if (batchArea.length > 0) {
result.batchArea = batchArea
.map((item) => {
return this.makeButton(item, ButtonPosition.tableBatchArea);
})
.filter((item) => item);
}
if (toolArea.length > 0) {
result.toolArea = toolArea
.map((item) => {
return this.makeButton(item, ButtonPosition.tableToolArea);
})
.filter((item) => item);
}
if (settings.length > 0) {
result.settings = settings;
}
}
return result;
};
getDownloadProps = (data, extraConfig) => {
const { getExtraParam } = extraConfig || {};
let downloadProps;
if (typeof data === 'string') {
downloadProps = {
url: data,
};
} else if (isRequestConfig(data)) {
downloadProps = {
service: transRequestConfigToRemote({
requestConfig: data,
isDesign: isDesignMode(this.props),
...this.getCommonParams(),
getExtraParam,
}),
};
}
return downloadProps;
};
getCommonParams = () => {
const { _context } = this.props;
return {
state: _context?.state,
recordDataSource: this.getFilterParams(),
urlParamsDataSource: this.getUrlParams(),
isDesign: isDesignMode(this.props),
};
};
makeButton = (item, area, extraConfig) => {
const { buttonProps } = extraConfig || {};
const isDesign = isDesignMode(this.props);
const filterParams = this.getFilterParams();
const { _context, _dataSource } = this.props;
const {
iconType,
primaryKey,
optType,
options = {},
children,
disabled,
hidden,
buttonHoverInfo,
...rest
} = item;
const remoteOperation = this.getRemoteOperation();
const innerInfo = remoteOperation?.current?.innerInfo;
let result = {
...rest,
children,
};
const action = getButtonAction({ ...item, position: area });
const getRenderDom = getItem(area, optType, 'getRenderDom');
const componentDefine = getRunTimeItem(optType);
const isHidden = executeObjectExpr(
hidden,
{
[__formValue__]: filterParams,
[__filterValue__]: filterParams,
[__dataSource__]: _context?.state,
},
filterParams,
_context?.state,
);
let isDisabled;
if (action) {
} else {
isDisabled = executeObjectExpr(
disabled,
{
[__formValue__]: filterParams,
[__filterValue__]: filterParams,
[__dataSource__]: _context?.state,
},
filterParams,
_context?.state,
_dataSource?.[__selectedRowKeys__] || [],
_dataSource?.[__selectedRowRecords__] || [],
);
}
if (isHidden) {
return null;
}
if (optType === 'download') {
const { url } = options;
return (selectedRowKeys, selectedRowRecords) => {
let downloadProps;
if (typeof url === 'function') {
downloadProps = {
url: executeFunction(url, filterParams, _context?.state),
};
} else {
downloadProps = this.getDownloadProps(url, {
getExtraParam: () => {
const { currentPage, pageSize } = innerInfo?.pageInfo || {};
return {
currentPage,
pageSize,
};
},
});
}
return (
);
};
} else if (optType === 'ossImport') {
const {
createService,
pollingService,
uploadService,
templateUrl,
hideLoop,
dialogDescription,
} = options;
return (selectedRowKeys, selectedRowRecords) => {
const extraProps = {
autoImport: true,
hideLoop,
};
const uploadMsgSlot = [];
let realDes = dialogDescription;
if (typeof dialogDescription === 'function') {
realDes = executeFunction(
dialogDescription,
this.getFilterParams(),
_context?.state,
selectedRowKeys,
selectedRowRecords,
);
}
const downloadProps = this.getDownloadProps(templateUrl);
if (downloadProps) {
uploadMsgSlot.push(
{$i18n.get({ id: 'PleaseDownload', dm: '请下载' })}
,
);
}
if (realDes) {
uploadMsgSlot.push(
{realDes}
,
);
}
if (isArrayNotEmpty(uploadMsgSlot)) {
extraProps.uploadMsgSlot = uploadMsgSlot;
}
return (
{
if (res?.status !== 'EXECUTING') {
this.load();
}
}}
uploadProps={{
service: transRequestConfigToRemote({
requestConfig: uploadService,
handleParams: () => {
return {
selectedRowKeys,
selectedRowRecords,
};
},
...this.getCommonParams(),
}),
description: '',
}}
createService={(res) => {
return makeRequest({
handleParams: () => {
return {
key: res,
};
},
buttonConfig: {
options: {
requestConfig: createService,
},
},
...this.getCommonParams(),
needSuccessToast: false,
isDesign,
}).then((res) => {
return getRealResponse(res)?.data;
});
}}
pollingService={transRequestConfigToRemote({
requestConfig: pollingService,
...this.getCommonParams(),
})}
/>
);
};
} else if (optType === 'export') {
const {
createService,
pollingService,
hideLoop,
needRename,
defaultJobName,
} = options;
const extraProps = {};
if (
needRename === true &&
typeof defaultJobName === 'string' &&
defaultJobName.length > 0
) {
extraProps.renameDialogProps = {
defaultJobName,
};
}
return (selectedRowKeys, selectedRowRecords) => {
return (
{
let jobName = fileName || {};
if (typeof fileName === 'string') {
jobName = {
jobName: fileName,
};
}
return makeRequest({
handleParams: () => {
const filterParams = this.getFilterParams();
let temp = {
selectedRowKeys,
selectedRowRecords,
...jobName,
};
if (isPlainObject(filterParams)) {
temp = {
...filterParams,
...temp,
};
}
return temp;
},
buttonConfig: {
options: {
requestConfig: createService,
},
},
...this.getCommonParams(),
needSuccessToast: false,
isDesign,
}).then((res) => {
return getRealResponse(res)?.data;
});
}}
pollingService={transRequestConfigToRemote({
requestConfig: pollingService,
})}
/>
);
};
} else if (typeof getRenderDom === 'function') {
result = (selectedRowKeys, selectedRowRecords) => {
return getRenderDom({
...item,
state: _context?.state,
position: area,
selectedRowKeys,
selectedRowRecords,
tableRef: this,
isDesign,
makeButton: this.makeButton,
buttonConfig: item,
recordDataSource: filterParams,
});
};
}
if (action) {
if (result.children && iconType && typeof iconType === 'string') {
result.children = [
{renderIcon(iconType)},
result.children,
];
}
result.onClick = (e, selectedRowKeys, selectedRowRecords) => {
action({
buttonConfig: item,
_context,
selectedRowKeys,
selectedRowRecords,
tableRef: this,
componentProps: this.props,
position: area,
...this.getCommonParams(),
});
};
result.disabled = (selectedRowKeys, selectedRowRecords) => {
// if(area === ButtonPosition.tableBatchArea && !(selectedRowKeys?.length > 0)) {
// return true;
// }
return executeObjectExpr(
disabled,
{
[__formValue__]: filterParams,
[__filterValue__]: filterParams,
[__dataSource__]: _context?.state,
},
filterParams,
_context?.state,
selectedRowKeys || [],
selectedRowRecords || [],
);
};
let needHover;
let hoverInfo;
if (options?.needHover && options?.hoverInfo) {
needHover = options?.needHover;
hoverInfo = options?.hoverInfo;
} else {
needHover = buttonHoverInfo?.needHover;
hoverInfo = buttonHoverInfo?.hoverInfo;
}
if (needHover && (hoverInfo?.title || hoverInfo?.content)) {
const originalResult = { ...result };
result = (selectedRowKeys, selectedRowRecords) => {
const commonParams = this.getCommonParams();
const title = calculateTextExprValue(hoverInfo?.title, {
...commonParams,
extraParamList: [selectedRowKeys, selectedRowRecords],
});
const content = calculateTextExprValue(hoverInfo?.content, {
...commonParams,
extraParamList: [selectedRowKeys, selectedRowRecords],
});
let tempDom = (
{
originalResult?.onClick?.(
e,
selectedRowKeys,
selectedRowRecords,
);
}}
/>
);
if (title || content) {
const oldDom = (
{tempDom}
);
tempDom = (
{content}
);
}
return tempDom;
};
}
return result;
} else if (componentDefine?.component) {
const component = getRealizeValue(componentDefine.component);
if (component) {
result = (selectedRowKeys, selectedRowRecords) => {
return React.createElement(component, {
...options,
selectedRowKeys,
selectedRowRecords,
[_selectedRowKeys]: selectedRowKeys,
[_selectedRowRecords]: selectedRowRecords,
[_state]: _context?.state,
buttonConfig: item,
children,
_context,
[_bindFilterData]: this.getFilterParams(),
[_getBindFilterData]: this.getFilterParams,
tableRef: this,
disabled: isDisabled,
hidden: isHidden,
[_getContext]: () => {
return _context;
},
});
};
}
return result;
}
return result;
};
getFilterParams = () => {
let filterParams = {};
const { _context, _bindFilterDataSourceName } = this.props;
if (_context && _bindFilterDataSourceName) {
filterParams = transProxyToObject(
_context?.state?.[_bindFilterDataSourceName],
);
}
return filterParams;
};
getUrlParams = () => {
const { _context } = this.props;
return _context?.state?.urlParams || {};
};
handleRowDetail = (rowDetail) => {
if (typeof rowDetail?.renderDetail === 'string') {
const componentDefine = getRunTimeItem(rowDetail.renderDetail);
if (componentDefine?.component) {
const component = getRealizeValue(componentDefine.component);
if (component) {
const { _context } = this.props;
return {
rowDetail: {
renderDetail: (record, index) => {
return React.createElement(component, {
record,
index,
[_state]: _context?.state,
[_tableRef]: this,
_context,
});
},
},
};
}
}
}
return {};
};
handleSelectChange = (selectType, selectedRowKeys, selectedRowRecords) => {
const { onChange } = this.props;
let realSelectedRowKeys = selectedRowKeys;
let realSelectedRowRecords = selectedRowRecords;
if (selectType === 'single') {
realSelectedRowKeys = [selectedRowKeys];
realSelectedRowRecords = [selectedRowRecords];
}
this.setDataSource({
[__selectedRowKeys__]: realSelectedRowKeys || [],
[__selectedRowRecords__]: realSelectedRowRecords || [],
});
if (typeof onChange === 'function') {
onChange(realSelectedRowKeys);
}
};
setDataSource = (data) => {
const { _context, _dataSource, _dataSourceName } = this.props;
setDataToDs({
_context,
_dataSource,
_dataSourceName,
data,
});
};
sendRequestFinishEvent = (newRes) => {
const { _context } = this.props;
emitEvent(CnTableRequestFinish, {
[_getContext]: () => {
return _context;
},
[_tableRef]: this,
[_getBindFilterData]: this.getFilterParams,
[_tableResponse]: newRes,
});
};
setTableInfo = (data) => {
const remoteOperation = this.getRemoteOperation();
const newData = {};
if (isPlainObject(data)) {
const { paging, tableData, extra } = data;
const { totalCount } = data.paging || {};
if (typeof totalCount === 'number') {
newData[__totalCount__] = totalCount;
}
if (isPlainObject(paging)) {
newData[__paging__] = paging;
}
if (Array.isArray(tableData)) {
newData[__tableData__] = tableData;
}
if (isPlainObject(extra)) {
newData[__tableExtra__] = extra;
}
const innerInfo = remoteOperation?.current?.innerInfo;
if (innerInfo) {
const { columns } = innerInfo;
if (Array.isArray(columns)) {
newData[__tableColumns__] = columns;
}
}
}
if (Object.keys(newData).length > 0) {
this.setDataSource(newData);
}
// if(isPlainObject(data?.paging)) {
// const { _dataSourceName, _context } = this.props;
// const oldTotalCount = _context?.state?.[_dataSourceName]?.[__totalCount__]
// const { totalCount } = data.paging;
// if(typeof totalCount === 'number' && totalCount !== oldTotalCount) {
// this.setDataSource({
// [__totalCount__]: totalCount
// })
// }
// }
};
makeTableSlot = (slot) => {
if (isPlainObject(slot) && Object.keys(slot).length > 0) {
const { _context } = this.props;
const result = {};
for (const key in slot) {
const temp = slot[key];
if (key?.includes('unsafe')) {
} else if (typeof temp === 'function') {
result[key] = (
selectedRowKeys,
selectedRowRecords,
dataSource,
tableInfo,
) => {
return executeFunction(
temp,
selectedRowKeys,
selectedRowRecords,
dataSource,
tableInfo,
_context?.state,
);
};
} else if (typeof temp === 'string') {
const componentDefine = getRunTimeItem(temp);
if (componentDefine?.component) {
const component = getRealizeValue(componentDefine.component);
if (component) {
const extraProps = slot[`${key}Options`];
result[key] = (
selectedRowKeys,
selectedRowRecords,
dataSource,
tableInfo,
) => {
return React.createElement(component, {
selectedRowKeys,
selectedRowRecords,
dataSource,
tableInfo,
[_state]: _context?.state,
[_getContext]: () => {
return _context;
},
[_getBindFilterData]: this.getFilterParams,
...extraProps,
});
};
}
}
}
}
if (Object.keys(result).length > 0) {
return result;
}
}
};
getFilterWaitComponentList = () => {
let result;
const { _context, _bindFilterDataSourceName } = this.props;
if (isPlainObject(_context?._views) && _bindFilterDataSourceName) {
for (const nodeId in _context?._views) {
const tempView = _context?._views[nodeId];
if (tempView?._props?._dataSourceName === _bindFilterDataSourceName) {
const tempResult = calculateWaitComponentList(
tempView?._props?.config,
tempView?._props?.defaultParams,
);
result = tempResult?.waitComponentList;
break;
}
}
}
return result;
};
getTreeConfig = () => {
const { tree } = this.props;
const { openKeys } = this.state;
if (tree === true && isArrayNotEmpty(openKeys)) {
return {
openKeys,
onChangeOpenKeys: (list) => {
this.setState({
openKeys: list,
});
},
};
}
};
makeRemote = (originRemote, extraConfig, originProps) => {
const { manual, record, isInChildTable } = extraConfig || {};
const { _context, asciiSort, treeTableAsyncRequestConfig, primaryKey } =
originProps;
let remote;
if (originRemote) {
const realUrl = getRealRequestUrl({
requestConfig: originRemote,
state: _context?.state,
});
if (realUrl) {
const {
params = [],
resultProcessFunc,
serviceType,
mockData,
timeout,
contentType,
method,
} = originRemote;
remote = {
...originRemote,
asciiSort,
params: undefined,
formatParam: (param) => {
const { currentPage, pageSize } = param || {};
const filterParams = this.getFilterParams();
const realParams = handleRequestParams(params, {
urlParamsDataSource: this.getUrlParams(),
recordDataSource: filterParams,
state: _context?.state,
extraParam: {
currentPage,
pageSize,
record,
},
extraParamList: [
{
currentPage,
pageSize,
record,
},
],
flexibleParams: true,
});
let finalResult = { ...filterParams, ...param };
if (typeof realParams === 'function') {
finalResult = realParams()
} else if (Object.keys(realParams).length > 0) {
finalResult = { ...filterParams, ...param, ...realParams };
}
return finalResult;
},
useDynamicUrl: undefined,
dynamicUrl: undefined,
contentType: undefined,
url: realUrl,
};
if (isInChildTable) {
} else {
remote.instance = this.remoteInstance;
}
if (manual === true) {
remote.manual = true;
} else {
const filterParams = this.getFilterParams();
if (isEmpty(filterParams)) {
const filterWaitComponentList = this.getFilterWaitComponentList();
if (filterWaitComponentList?.length > 0) {
remote.manual = true;
}
}
}
if (serviceType === 'http') {
// 增加 cookie
remote.withCredentials = true;
// remote.requestOptions = {
// withCredentials:true,
// };
if (typeof timeout === 'number') {
remote.requestOptions.timeout = timeout;
}
if (contentType === formUrlencoded) {
remote.requestOptions.headers = {
'content-type': contentType,
};
}
} else if (serviceType === 'mokelay') {
if (typeof timeout === 'number') {
set(remote, 'requestOptions.timeout', timeout);
}
}
if (typeof resultProcessFunc === 'function') {
remote.formatResult = (res) => {
let newRes = getRealResponse(res);
try {
const temp = resultProcessFunc(newRes);
if (temp && temp.data && temp.success !== undefined) {
newRes = temp.data;
} else {
newRes = temp;
}
if (isInChildTable) {
} else {
this.dynamicRegisterFormat(newRes);
this.setTableInfo(newRes);
this.sendRequestFinishEvent(newRes);
}
} catch (e) {
console.error('请求结果回调执行失败', e);
}
return newRes;
};
} else if (serviceType === 'mock' && isPlainObject(mockData)) {
remote.formatResult = () => {
return mockData?.data;
};
} else {
remote.formatResult = (res) => {
let newRes = getRealResponse(res);
if (newRes && newRes.data && newRes.success !== undefined) {
newRes = newRes.data;
if (isInChildTable) {
} else {
this.dynamicRegisterFormat(newRes);
this.setTableInfo(newRes);
this.sendRequestFinishEvent(newRes);
}
}
return newRes;
};
}
const asyncRealUrl = getRealRequestUrl({
requestConfig: treeTableAsyncRequestConfig?.requestConfig,
state: _context?.state,
});
if (asyncRealUrl) {
remote.treeCache = true;
remote.getChildrenInTree = (key, row, setLoading) => {
setLoading?.(true);
return makeRequest({
needSuccessToast: false,
buttonConfig: {
options: {
requestConfig: treeTableAsyncRequestConfig.requestConfig,
},
},
handleParams: (tempParam) => {
const newParams = {
...tempParam,
};
if (primaryKey) {
newParams[primaryKey] = key;
} else {
newParams.id = key;
}
return newParams;
},
...this.getCommonParams(),
})
.then((res) => {
return res?.data?.tableData || [];
})
.finally(() => {
setLoading(false);
});
};
}
}
}
return remote;
};
makeChildTable = (childTable) => {
if (childTable) {
const { _context } = this.props;
const { remote, columns, primaryKey, buttons, dataSource } = childTable;
if (remote?.url || isArrayNotEmpty(columns)) {
const tableProps = {
columns: this.handleColumns(columns),
};
if (isArrayNotEmpty(dataSource)) {
tableProps.dataSource = dataSource;
}
return {
renderDetail: (record, index) => {
if (typeof dataSource === 'function') {
tableProps.dataSource = executeFunction(
dataSource,
record,
_context?.state,
index,
);
}
if (remote?.url) {
tableProps.remote = this.makeRemote(
remote,
{
record,
isInChildTable: true,
},
{
_context,
primaryKey,
},
);
}
// 处理操作栏按钮
if (isArrayNotEmpty(buttons)) {
tableProps.operateColumn = {
buttons: this.handleOperateButtons(buttons),
};
}
return (
);
},
};
}
}
};
makeSubTitle = (subTitle) => {
const { _context } = this.props;
if (typeof subTitle === 'string' && subTitle) {
return () => {
return subTitle;
};
} else if (typeof subTitle === 'function') {
return (record) => {
return executeFunction(subTitle, record, _context?.state);
};
}
};
makeTags = (tags) => {
const { _context } = this.props;
if (isArrayNotEmpty(tags)) {
return (record) => {
const result = [];
tags.forEach((item) => {
const { text, status, type } = item || {};
const realText = calculateTextExprValue(text, {
recordDataSource: record,
state: _context?.state,
});
if (realText && status) {
result.push({
text: realText,
status,
type,
});
}
});
if (isArrayNotEmpty(result)) {
return result;
}
};
} else if (typeof tags === 'function') {
return (record, index) => {
return executeFunction(tags, record, _context?.state, index);
};
}
};
makeSubAction = (actions) => {
const { _context } = this.props;
if (isArrayNotEmpty(actions)) {
return (record) => {
return (
{makeButtons({
buttons: actions.map((item) => {
return {
...item,
position: ButtonPosition.cnCardItemsSubAction,
text: true,
type: 'primary',
};
}),
_context,
state: _context?.state,
urlParamsDataSource: this.getUrlParams(),
recordDataSource: record || {},
extraParamList: {
recordDataSource: record || {},
},
})}
);
};
}
};
render() {
const {
columns,
_context,
// 筛选栏的数据源名称
_bindFilterDataSourceName,
// 操作列
buttons = [],
_bindTable,
showToolbar,
showSelect,
rowSelection,
toolbar,
remote: originRemote,
__designMode,
tableStyle,
asciiSort,
rowDetail,
manual: originalManual,
operateColumn,
treeTableAsyncRequestConfig,
rowProps,
openKeys,
columnCopyEnable,
slot,
useDetailValue,
childTable,
...otherProps
} = this.props;
const isDesign = isDesignMode(this.props);
const { tableDataSource } = this.state;
const manual = calculateTextExprValue(originalManual, {
recordDataSource: {},
state: _context?.state,
});
const { disableDetail } = tableStyle || {};
// 处理remote参数
const remote = this.makeRemote(originRemote, { manual }, this.props);
const tableProps = {
filter: true,
showSelect,
rowSelection: showSelect ? this.handleRowSelection(rowSelection) : null,
toolbar: showToolbar ? this.handleToolbar(toolbar) : null,
requestConfig: remote,
...otherProps,
...this.handleRowDetail(rowDetail),
onSelectChange: this.handleSelectChange.bind(
this,
rowSelection?.selectType,
),
subTitle: this.makeSubTitle(tableStyle?.subTitle),
tags: this.makeTags(tableStyle?.tags),
subAction: this.makeSubAction(tableStyle?.subAction),
disableDetail,
};
if (tableStyle?.columnResize === true) {
tableProps.columnResize = {
async: true,
};
}
if (typeof tableProps.dataSource === 'function') {
tableProps.dataSource = executeFunction(
tableProps.dataSource,
{},
_context?.state,
);
}
const tempSlot = this.makeTableSlot(slot);
if (tempSlot) {
tableProps.slot = tempSlot;
}
if (columnCopyEnable === true) {
tableProps.colAttach = {
copy: {
primaryKey: otherProps?.primaryKey || 'id',
},
};
}
if (typeof rowProps === 'function') {
tableProps.rowProps = (record, index) => {
return executeFunction(rowProps, record, index, _context?.state);
};
}
if (remote?.url) {
delete tableProps.dataSource;
if (Array.isArray(tableDataSource)) {
tableProps.dataSource = tableDataSource;
}
}
if (Array.isArray(columns) && columns.length > 0) {
tableProps.columns = this.handleColumns(columns);
}
// 处理操作栏按钮
if (Array.isArray(buttons) && buttons.length > 0) {
tableProps.operateColumn = {
buttons: this.handleOperateButtons(buttons),
};
if (typeof operateColumn?.width === 'number') {
tableProps.operateColumn.width = operateColumn.width;
}
}
if (tableProps.emptyContent) {
if (typeof tableProps.emptyContent === 'function') {
tableProps.emptyContent = tableProps.emptyContent(_context?.state);
}
}
const treeConfig = this.getTreeConfig();
if (isPlainObject(treeConfig)) {
tableProps.treeConfig = treeConfig;
}
if (tableProps?.nodeId) {
tableProps.storageKey = tableProps.nodeId;
}
if (isPlainObject(childTable)) {
const tempChildTable = this.makeChildTable(childTable);
if (tempChildTable) {
tableProps.rowDetail = tempChildTable;
}
}
this.handleDesignMode(tableProps, isDesign);
// console.log(tableProps, 'table props');
return ;
}
}
export default CnTable;
export { CnTable };
CnTable.displayName = 'CnTable';