import {
condition,
getArrayTableCurrentRowByField,
handleSelectDataSource,
handleSelectRequestConfig,
} from '../../util/util';
import {
componentMap as formComponentMap,
CnTreeSelect,
CnTooltip,
formilyReact,
} from '@cainiaofe/cn-ui';
import { DisplayPosition } from '../position/display-position';
import { getJSExpressionPrototype } from '../common-style';
import isPlainObject from 'lodash/isPlainObject';
import { getSelectParamSelectSetter } from '@/common/manager/filter-item/select';
import { handleRequestParams } from '@/common/util/request';
import {
getExprSetterSnippet,
getRequestExecuteSetter,
getRequestWhenFocusSetterSnippet,
getStaticDataSourceSnippet,
} from '@/common/manager/setter-snippet';
import { useRef } from 'react';
import { formComponentRefStorage } from '@/common/util/const';
import {
__arrayTableCurrentRow__,
componentRefSplit,
} from '@/common/util/expr-const';
const { useField } = formilyReact;
const TreeSelect = {
position: [
DisplayPosition.form,
DisplayPosition.formDialog,
DisplayPosition.filter,
DisplayPosition.cnArrayTable,
DisplayPosition.cnArraySubAreaCard,
],
thumbUrl:
'https://img.alicdn.com/imgextra/i1/O1CN01ZuLYQR1b7x0jp0Lfo_!!6000000003419-2-tps-240-144.png',
title: '树选择',
componentName: 'TreeSelect',
component: CnTreeSelect,
formComponent: (props) => {
const realRef = useRef(null);
const { _dataSourceName } = props || {};
const params = props?.requestConfig?.params;
const field = useField?.();
if (Array.isArray(params) && params?.length > 0) {
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;
}
}
_params.getExtraParam = () => {
return {
[__arrayTableCurrentRow__]:
getArrayTableCurrentRowByField(useField?.()) || {},
};
};
_params.extraParamList = [
{
[__arrayTableCurrentRow__]:
getArrayTableCurrentRowByField(useField?.()) || {},
},
];
props.requestConfig.formatParam = (oldParams)=>{
if(typeof _params?.getFormInstance === 'function') {
const temp = _params.getFormInstance()?.values
if(isPlainObject(temp)) {
_params.recordDataSource = temp;
}
}
const realParams = handleRequestParams(params, { ..._params });
return {...oldParams,...realParams};
}
delete props.requestConfig.params;
}
const extraProps = {
getRequestParams: undefined,
};
// handleFormUrlencodedData(props?.requestConfig);
const fieldEntire = field?.path?.entire;
if (_dataSourceName && fieldEntire && realRef) {
formComponentRefStorage[
`${_dataSourceName}${componentRefSplit}${fieldEntire}`
] = realRef;
}
return (
);
},
getDefaultProps: () => {
return {
dataOrigin: 'request',
multiple: false,
};
},
formItemBeforeHandler: (formItem, config) => {
const { isDesign, urlParams, formValue, state, formProps, getFormInstance } = config;
handleSelectRequestConfig({
componentProps: formItem?.['x-component-props'],
isDesign,
urlParamsDataSource: urlParams,
recordDataSource: formValue,
state,
ignoreHandleParam: true,
handleDynamicUrl: true,
});
if (isPlainObject(formItem?.['x-component-props']?.multipleExtraProps)) {
const { treeCheckable, treeCheckedStrategy } =
formItem?.['x-component-props']?.multipleExtraProps;
if (treeCheckable === true) {
formItem['x-component-props'].treeCheckable = true;
if (treeCheckedStrategy) {
formItem['x-component-props'].treeCheckedStrategy =
treeCheckedStrategy;
}
}
}
if (formItem?.['x-component-props']) {
formItem['x-component-props'].getRequestParams = () => {
return {
urlParamsDataSource: urlParams,
recordDataSource: formValue,
state,
getFormInstance,
};
};
formItem['x-component-props']._dataSourceName =
formProps?._dataSourceName;
}
handleSelectDataSource({
componentProps: formItem?.['x-component-props'],
state,
});
},
filterItemBeforeHandler: (filterItemProps, config) => {
handleSelectRequestConfig(config);
if (isPlainObject(config?.componentProps?.multipleExtraProps)) {
const { treeCheckable, treeCheckedStrategy } =
config?.componentProps?.multipleExtraProps;
if (treeCheckable === true) {
config.componentProps.treeCheckable = true;
if (treeCheckedStrategy) {
config.componentProps.treeCheckedStrategy = treeCheckedStrategy;
}
}
}
handleSelectDataSource(config);
},
// select的prototype列表
getPrototypeList: (position) => {
const extraServiceProps = {};
let jsExpressionPrototype = getJSExpressionPrototype({
type: 'formRequest',
});
let executeProps = {
initialCode: `(formValues, state) => {
return formValues.xxxx === "xxxx";
}`,
tip: `当前函数需要返回 true/false。
formValues:当前筛选栏/表单的数据。
state:全部的数据,在左侧列表中选择使用。
`,
};
if (DisplayPosition.cnArrayTable === position) {
extraServiceProps.dynamicUrlTemplate = `function(state, { ${__arrayTableCurrentRow__} }) {
// __arrayTableCurrentRow__: 可编辑表格当前行的数据。
return '/xxx';
}`;
executeProps = {
initialCode: `(formValues, state, { ${__arrayTableCurrentRow__} }) => {
return formValues.xxxx === "xxxx";
}`,
tip: `当前函数需要返回 true/false。
formValues:当前筛选栏/表单的数据。
state:全部的数据,在左侧列表中选择使用。
__arrayTableCurrentRow__:可编辑表格当前行的数据。
`,
};
jsExpressionPrototype = getJSExpressionPrototype({
type: 'arrayTableCurrentRow',
});
}
const paramSelectSetter = getSelectParamSelectSetter({ position });
let extraConfigSetter;
const requestExecuteSetter = getRequestExecuteSetter({
exprSetter: getExprSetterSnippet({
position,
}),
});
if (requestExecuteSetter) {
extraConfigSetter = [requestExecuteSetter];
}
return [
{
name: 'multiple',
title: '选择模式',
display: 'inline',
setter: {
componentName: 'RadioGroupSetter',
props: {
options: [
{
title: '单选',
value: false,
},
{
title: '多选',
value: true,
},
],
},
},
},
{
name: 'dataOrigin',
title: '数据来源',
display: 'inline',
setter: {
componentName: 'RadioGroupSetter',
props: {
options: [
{ title: '远程请求', value: 'request' },
{ title: '静态数据', value: 'static' },
],
},
},
},
{
name: 'requestConfig',
title: '查询服务',
display: 'inline',
setter: {
componentName: 'ServiceChoiceSetter',
props: {
mockDataTemplate: {
success: true,
data: [
{
label: '选项一',
value: 'first',
children: [
{
label: '子选项一',
value: 'sub1',
},
],
},
{
label: '选项二',
value: 'second',
},
],
},
paramTitleDom:
请求参数配置:
,
responseDom: (
请求返回结果的数据结构:
接口文档
{' '}
接口预览}>
),
buttonText: '选择请求API',
params: {
env: 'pre',
pageSize: 999,
// serviceType: 'HSF',
},
extraConfigSetter,
paramSetter: {
componentName: 'MixedSetter',
props: {
setters: [
paramSelectSetter,
{
componentName: 'StringSetter',
title: '字符串',
},
jsExpressionPrototype,
],
},
},
resultProcessFuncTemplate: `function(res) {
// 需要返回的如下的数据结构
// return {
// success: true,
// data: [
// {
// label:"xx",
// value:"xx",
// }
// ]
// }
return res;
}`,
// paramSetter:{
// componentName: 'ParamSelectSetter',
// props:{
// dataKey: 'config',
// labelKey: 'label',
// valueKey: 'name',
// groupName: '参数列表',
// },
// title:'选择参数',
// },
executeProps,
...extraServiceProps,
},
},
// hidden:hidden('Select'),
condition(prop) {
return (
condition(prop, 'TreeSelect', 'componentName') &&
prop?.parent?.getPropValue?.('dataOrigin') === 'request'
);
},
},
{
name: 'dataSource',
title: '编辑静态数据',
display: 'plain',
tip: '编辑静态展示数据',
// initialValue: [],
setter: getStaticDataSourceSnippet(),
condition(prop) {
return (
condition(prop, 'TreeSelect', 'componentName') &&
prop?.parent?.getPropValue?.('dataOrigin') === 'static'
);
},
},
getRequestWhenFocusSetterSnippet(),
{
name: 'searchRemote',
title: '当新输入时 重新发请求',
display: 'inline',
tip: '开启时,每次输入都会重新发请求获取数据',
setter: {
componentName: 'BoolSetter',
props: {},
},
},
{
name: 'searchKey',
title: '远程搜索时的key',
display: 'inline',
setter: {
componentName: 'StringSetter',
props: {},
},
condition(prop) {
return (
condition(prop, 'TreeSelect', 'componentName') &&
prop?.parent?.getPropValue?.('searchRemote') === true
);
},
},
{
name: 'isOnlyLeafNodeSelectable',
title: '只允许选中子节点',
display: 'inline',
setter: {
componentName: 'BoolSetter',
props: {},
},
},
{
name: 'showCheckAll',
title: '支持全选',
display: 'inline',
setter: {
componentName: 'RadioGroupSetter',
props: {
options: [
{ title: '是', value: true },
{ title: '否', value: false },
{ title: '不设置' },
],
},
},
condition(prop) {
return (
condition(prop, 'TreeSelect', 'componentName') &&
prop?.parent?.getPropValue?.('multiple') === true
);
},
},
{
title: '多选时的额外配置项',
name: 'multipleExtraProps',
display: 'accordion',
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [
{
name: 'treeCheckable',
title: '使用复选框勾选数据',
display: 'inline',
setter: 'BoolSetter',
},
{
name: 'treeCheckedStrategy',
title: '选中后的回填策略',
display: 'inline',
setter: {
componentName: 'SelectSetter',
props: {
options: [
{
label: '子节点都选中时只提交父节点',
value: 'parent',
},
{
label: '父子节点都选中时只提交子节点',
value: 'child',
},
{
label: '提交所有选中的节点',
value: 'all',
},
],
},
},
condition(prop) {
return (
prop?.parent?.getPropValue?.('treeCheckable') === true
);
},
},
],
},
},
},
condition(prop) {
return (
condition(prop, 'TreeSelect', 'componentName') &&
prop?.parent?.getPropValue?.('multiple') === true
);
},
},
];
},
};
export default TreeSelect;