import {
calculateRequestExecute,
calculateTextExprValue,
condition,
executeObjectExpr,
getArrayTableCurrentIndex,
getArrayTableCurrentRowByField,
getRealRequestUrl,
handleDesignMokelayUrl,
handleFormUrlencodedContentType,
handleRequestExtraConfig,
handleSelectRequestConfig,
isValueObjectExpr,
setAdvancedConfigToProps,
} from '../../util/util';
import {
CnAsyncSelect,
componentMap as formComponentMap,
CnTooltip,
formilyReact,
} from '@cainiaofe/cn-ui';
import { DisplayPosition } from '../position/display-position';
import { getRealResponse, handleRequestParams } from '../../util/request';
import { getJSExpressionPrototype } from '../common-style';
import isPlainObject from 'lodash/isPlainObject';
import cloneDeep from 'lodash/cloneDeep';
import {
__arrayTableCurrentRow__,
__dataSource__,
__extraParam__,
__filterValue__,
__formValue__,
__tableCurrentRow__,
componentRefSplit,
currentPageLabel,
pageSizeLabel,
} from '@/common/util/expr-const';
import {
getArrayTableCurrentRowFieldSnippet,
getExprSetterSnippet,
getRequestExecuteSetter,
getRequestWhenFocusSetterSnippet,
getStaticDataSourceSnippet,
} from '@/common/manager/setter-snippet';
import {
__advancedConfig__,
dataOriginRequest,
formComponentRefStorage,
formUrlencoded,
} from '@/common/util/const';
import { ParamSelectSetter } from '@/common/setter/param-select-setter';
import qs from 'query-string';
import { forwardRef, useRef } from 'react';
import {
getBizExtendPrototype,
handleBizExtendComponentProps,
} from '@/common/manager/plugin';
const { useField } = formilyReact || {};
function visibleRun(extraProps, visible, type, run) {
const {
requestConfig,
state,
recordDataSource,
arrayTableCurrentRow,
getFormInstance,
} = extraProps || {};
const realFormValue = getFormInstance?.()?.values || recordDataSource;
const execute = calculateRequestExecute(
requestConfig,
{
[__formValue__]: realFormValue,
[__filterValue__]: realFormValue,
[__arrayTableCurrentRow__]: arrayTableCurrentRow || {},
[__dataSource__]: state,
},
realFormValue || {},
state,
{ [__arrayTableCurrentRow__]: arrayTableCurrentRow || {} },
);
if (visible && execute !== false) {
run?.();
}
}
function tempFormBeforeHandler(
props,
{
isDesign,
urlParamsDataSource,
recordDataSource,
state,
componentRequestFinish,
filterItemConfig,
isInForm,
formInstance,
_context,
getFormInstance,
formItemConfig,
formProps,
parentPosition,
},
) {
const { _dataSourceName } = formProps || {};
const realName = filterItemConfig?.name || formItemConfig?.name;
const newProps = cloneDeep(props);
const {
dataOrigin,
requestConfig,
dataSource,
multipleExtraProps,
manual,
requestWhenFocus,
} = newProps || {};
const { serviceType, mockData, method } = requestConfig || {};
const { initRequestConfig, hideMaxTag, maxTagCount } =
multipleExtraProps || {};
if (dataOrigin === 'static') {
if (typeof dataSource === 'function') {
if ([DisplayPosition.cnArraySubAreaCard].includes(parentPosition)) {
newProps.getRequestParams = () => {
return {
state: _context?.state,
recordDataSource,
};
};
} else {
try {
const temp = dataSource(state, {});
if (Array.isArray(temp)) {
newProps.dataSource = temp;
}
} catch (e) {
const tempTitle = formItemConfig?.label || formItemConfig?.name;
console.error(`${tempTitle} 的数据源表达式执行错误`);
}
}
} else if (isValueObjectExpr(dataSource)) {
const tempDs = calculateTextExprValue(dataSource, { state });
if (Array.isArray(tempDs)) {
newProps.dataSource = tempDs;
} else {
newProps.dataSource = [];
}
}
if (!Array.isArray(newProps.dataSource)) {
if ([DisplayPosition.cnArraySubAreaCard].includes(parentPosition)) {
} else {
newProps.dataSource = [];
}
}
if (newProps?.mode === 'multiple' || newProps?.mode === 'tag') {
if (hideMaxTag === true) {
newProps.maxTagPlaceholder = () => {
return null;
};
}
}
if (typeof maxTagCount === 'number') {
newProps.maxTagCount = maxTagCount;
newProps.tagInline = false;
}
delete newProps.requestConfig;
} else {
if (isInForm) {
newProps.getRequestParams = () => {
return {
state: _context?.state,
recordDataSource,
getFormInstance,
};
};
} else {
const realUrl = getRealRequestUrl({
requestConfig: newProps?.requestConfig,
state,
extraParam: {},
});
if (realUrl) {
newProps.requestConfig.url = realUrl;
delete newProps.requestConfig.dynamicUrl;
}
const execute = calculateRequestExecute(
requestConfig,
{
[__dataSource__]: state,
},
recordDataSource || {},
state,
);
if (execute === false) {
if (newProps?.requestConfig) {
newProps.requestConfig.manual = true;
}
}
if (requestWhenFocus === false) {
} else {
newProps.onVisibleChange = visibleRun.bind(this, {
requestConfig,
state,
recordDataSource,
});
}
}
if (dataOrigin === 'request') {
delete newProps.dataSource;
}
if (newProps?.requestConfig?.serviceType === 'mokelay') {
newProps.requestConfig.method = 'post';
if (isDesign && newProps?.requestConfig?.url) {
newProps.requestConfig.url = handleDesignMokelayUrl(
newProps.requestConfig?.url,
);
}
} else if (newProps?.requestConfig) {
newProps.requestConfig.withCredentials = true;
}
if (
Array.isArray(newProps?.requestConfig?.params) &&
newProps?.requestConfig?.params.length > 0
) {
const { params } = newProps.requestConfig;
newProps.requestConfig.searchFormat = (
originalParam,
extraRequestParams,
) => {
let realRecord = recordDataSource;
let realState = state;
if (isInForm) {
if (typeof getFormInstance === 'function') {
realRecord = getFormInstance()?.values;
} else if (formInstance?.values) {
realRecord = formInstance.values;
}
if (_context?.state) {
realState = _context.state;
}
}
const paramConfig = {
urlParamsDataSource,
recordDataSource: realRecord,
state: realState,
...extraRequestParams,
extraParamList: [{}],
};
if (extraRequestParams?.__arrayTableCurrentRow__) {
paramConfig.getExtraParam = () => {
return {
[__arrayTableCurrentRow__]:
extraRequestParams?.__arrayTableCurrentRow__,
};
};
paramConfig.extraParamList = [
{
[__arrayTableCurrentRow__]:
extraRequestParams?.__arrayTableCurrentRow__,
},
];
}
const realParams = handleRequestParams(params, paramConfig);
const tempResult = { ...realParams, ...originalParam };
if (
serviceType === 'http' &&
method === 'post' &&
requestConfig?.contentType === formUrlencoded
) {
return qs.stringify(tempResult);
}
return tempResult;
};
delete newProps.requestConfig.params;
}
// if(isInForm === true) {
// newProps.getRequestParams = ()=>{
// let temp1 = recordDataSource;
// let temp2 = state;
// if(formInstance?.values) {
// temp1 = formInstance.values;
// }
// if(_context?.state) {
// temp2 = _context?.state;
// }
// return {
// urlParamsDataSource,
// recordDataSource: temp1,
// state: temp2,
// }
// }
// }else{
// if (Array.isArray(newProps?.requestConfig?.params) && newProps?.requestConfig?.params.length > 0) {
// const realParams = handleRequestParams(newProps?.requestConfig?.params, {
// urlParamsDataSource,
// recordDataSource,
// state,
// });
// if (realParams) {
// if (newProps?.requestConfig?.method === 'post') {
// newProps.requestConfig.data = realParams;
// delete newProps.requestConfig.params;
// } else {
// newProps.requestConfig.params = realParams;
// }
// }
// }
// }
if (typeof newProps?.requestConfig?.resultProcessFunc === 'function') {
newProps.requestConfig.formatResult = (res) => {
let newRes = getRealResponse(res);
try {
newRes = newProps?.requestConfig?.resultProcessFunc(newRes);
} catch (e) {
console.error('请求结果回调执行失败', e);
}
if (Array.isArray(newRes?.data)) {
newRes = newRes.data;
} else if (Array.isArray(newRes?.data?.dataSource)) {
newRes = newRes?.data?.dataSource;
}
componentRequestFinish?.({ name: realName, dataSource: newRes });
return newRes;
};
} else if (serviceType === 'mock' && isPlainObject(mockData)) {
newProps.requestConfig.formatResult = () => {
componentRequestFinish?.({
name: realName,
dataSource: mockData?.data,
});
return mockData?.data;
};
} else if (newProps?.requestConfig) {
newProps.requestConfig.formatResult = (res) => {
let newRes = getRealResponse(res);
if (Array.isArray(newRes?.data)) {
newRes = newRes.data;
} else if (Array.isArray(newRes?.data?.dataSource)) {
newRes = newRes?.data?.dataSource;
}
componentRequestFinish?.({ name: realName, dataSource: newRes });
return newRes;
};
}
if (newProps?.searchRemote) {
newProps.filterLocal = false;
if (newProps?.searchKey && newProps?.requestConfig) {
newProps.requestConfig.searchKey = newProps.searchKey;
}
}
if (newProps?.requestConfig) {
newProps.requestConfig.throttleWait = 800;
}
if (newProps?.mode === 'multiple' || newProps?.mode === 'tag') {
if (hideMaxTag === true) {
newProps.maxTagPlaceholder = () => {
return null;
};
}
if (typeof maxTagCount === 'number') {
newProps.maxTagCount = maxTagCount;
newProps.tagInline = false;
}
if (initRequestConfig) {
const realInitUrl = getRealRequestUrl({
requestConfig: initRequestConfig,
state,
});
if (realInitUrl) {
initRequestConfig.url = realInitUrl;
}
const tempProps = {
dataOrigin: 'request',
requestConfig: initRequestConfig,
};
handleSelectRequestConfig({
componentProps: tempProps,
isDesign,
urlParamsDataSource,
recordDataSource,
state,
});
if (tempProps?.requestConfig) {
newProps.initRequestConfig = {
...tempProps.requestConfig,
};
if (multipleExtraProps?.searchKey) {
newProps.initRequestConfig.searchKey = multipleExtraProps.searchKey;
}
}
}
} else {
delete newProps?.initRequestConfig;
}
if (manual === true && newProps?.requestConfig) {
newProps.requestConfig.manual = true;
}
}
delete newProps.searchRemote;
delete newProps.searchKey;
delete newProps.manual;
newProps.showSearch = true;
newProps.autoWidth = false;
if (newProps.mode === 'single') {
delete newProps.hasSelectAll;
}
delete newProps.multipleExtraProps;
handleBizExtendComponentProps(newProps, 'CnAsyncSelect');
setAdvancedConfigToProps(newProps);
handleFormUrlencodedContentType(newProps?.requestConfig);
handleRequestExtraConfig(newProps?.requestConfig, state);
newProps._dataSourceName = _dataSourceName;
return newProps;
}
export function getSelectParamSelectSetter(config) {
const { position } = config || {};
let paramSelectSetter = {
componentName: 'ParamSelectSetter',
props: {
ParamSelectSetterComponent: ParamSelectSetter,
dataKey: 'config',
labelKey: 'label',
valueKey: 'name',
groupName: '参数列表',
},
title: '选择参数',
};
if (position === DisplayPosition.cnArrayTable) {
paramSelectSetter = {
componentName: 'ParamSelectSetter',
props: {
dataKey: 'arrayTable',
labelKey: 'label',
valueKey: 'name',
groupName: '表格当前行数据',
groupExprName: __tableCurrentRow__,
},
title: '选择参数',
};
} else if (position === DisplayPosition.cnArraySubAreaCard) {
paramSelectSetter = {
componentName: 'ParamSelectSetter',
props: {
ParamSelectSetterComponent: ParamSelectSetter,
configList: [
{
dataKey: 'config',
labelKey: 'label',
valueKey: 'name',
groupName: '当前表单',
},
getArrayTableCurrentRowFieldSnippet(),
{
groupName: '其他数据',
groupExprName: __dataSource__,
needSecondParam: true,
},
],
},
title: '选择参数',
};
}
return paramSelectSetter;
}
const Select = {
position: [
DisplayPosition.form,
DisplayPosition.formDialog,
DisplayPosition.filter,
DisplayPosition.cnArrayTable,
DisplayPosition.cnArraySubAreaCard,
],
thumbUrl:
'https://img.alicdn.com/imgextra/i4/O1CN01adXHIL1kRURqxjeyg_!!6000000004680-2-tps-240-144.png',
title: '下拉选择',
componentName: 'Select',
component: CnAsyncSelect,
tempFormBeforeHandler,
formComponent: forwardRef((props, ref) => {
let realRef;
let tempRef;
const field = useField?.();
const fieldEntire = field?.path?.entire;
const { _dataSourceName } = props || {};
if (typeof ref === 'function') {
tempRef = (target) => {
ref?.(target);
if (fieldEntire && _dataSourceName && target) {
formComponentRefStorage[
`${_dataSourceName}${componentRefSplit}${fieldEntire}`
] = {
current: target,
};
}
};
} else {
realRef = useRef(null);
}
const extraProps = {
getRequestParams: undefined,
requestWhenFocus: undefined,
};
if (
props?.dataOrigin === dataOriginRequest &&
isPlainObject(props.requestConfig)
) {
const { getRequestParams } = props;
let _params;
const extraParam = {};
if (typeof getRequestParams === 'function') {
_params = getRequestParams();
}
extraParam[__arrayTableCurrentRow__] =
getArrayTableCurrentRowByField(useField?.()) || {};
if (
typeof props.requestConfig.dynamicUrl === 'function' &&
props.requestConfig.useDynamicUrl === true
) {
const realUrl = getRealRequestUrl({
requestConfig: props.requestConfig,
..._params,
extraParam,
});
if (realUrl && typeof realUrl === 'string') {
props.requestConfig.url = realUrl;
}
}
const { getFormInstance } = _params || {};
const execute = calculateRequestExecute(
props?.requestConfig,
{
[__formValue__]: _params?.recordDataSource,
[__filterValue__]: _params?.recordDataSource,
[__dataSource__]: _params?.state,
...extraParam,
},
_params?.recordDataSource || {},
_params?.state,
extraParam || {},
);
if (execute === false) {
props.requestConfig.manual = true;
}
if (props?.requestWhenFocus === false) {
} else {
extraProps.onVisibleChange = visibleRun.bind(this, {
requestConfig: props?.requestConfig,
state: _params?.state,
recordDataSource: _params?.recordDataSource,
arrayTableCurrentRow: extraParam[__arrayTableCurrentRow__],
getFormInstance,
});
}
}
if (typeof props?.requestConfig?.searchFormat === 'function') {
const currentRow = getArrayTableCurrentRowByField(useField?.());
if (isPlainObject(currentRow)) {
const oldSearchFormat = props.requestConfig.searchFormat;
props.requestConfig.searchFormat = (originalParam) => {
const copyCurrentRow = { ...currentRow };
return oldSearchFormat(originalParam, {
tableCurrentRow: copyCurrentRow,
__arrayTableCurrentRow__: copyCurrentRow,
});
};
}
}
// const params = props?.requestConfig?.params;
// if (Array.isArray(params) && params?.length > 0) {
// const field = useField?.();
// let _params = {};
// const { getRequestParams } = props;
// if(typeof getRequestParams === 'function') {
// _params = getRequestParams();
// }
// if(typeof field?.index === 'number'){
// const temp = field.query('..').value();
// const currentRow = temp?.[field.index];
// if(isPlainObject(currentRow)) {
// _params.tableCurrentRow = currentRow;
// }
// }
// const realParams = handleRequestParams(params, { ..._params });
// if (realParams) {
// if (props?.requestConfig?.method === 'post') {
// props.requestConfig.data = realParams;
// delete props.requestConfig.params;
// } else {
// props.requestConfig.params = realParams;
// }
// }else {
// delete props.requestConfig.params;
// }
// }
if (_dataSourceName && fieldEntire && realRef) {
formComponentRefStorage[
`${_dataSourceName}${componentRefSplit}${fieldEntire}`
] = realRef;
}
if (typeof props?.dataSource === 'function') {
extraProps.dataSource = [];
try {
let _params;
const { getRequestParams } = props;
if (typeof getRequestParams === 'function') {
_params = getRequestParams();
}
const record = getArrayTableCurrentRowByField(field) || {};
const index = getArrayTableCurrentIndex(field);
const temp = props.dataSource(_params?.state || {}, {
record,
index,
});
if (Array.isArray(temp)) {
extraProps.dataSource = temp;
}
} catch (e) {}
}
return (