import {
condition,
handleSelectDataSource,
handleSelectRequestConfig,
setAdvancedConfigToProps,
} from '../../util/util';
import {
componentMap as formComponentMap,
CnCascaderSelect,
CnTooltip,
formilyReact,
} from '@cainiaofe/cn-ui';
import { DisplayPosition } from '../position/display-position';
import { getJSExpressionPrototype } from '../common-style';
import { getSelectParamSelectSetter } from '@/common/manager/filter-item/select';
import { handleRequestParams } from '@/common/util/request';
import isPlainObject from 'lodash/isPlainObject';
import {
getExprSetterSnippet,
getRequestExecuteSetter,
getRequestWhenFocusSetterSnippet,
getStaticDataSourceSnippet,
} from '@/common/manager/setter-snippet';
import { useRef } from 'react';
import {
formComponentRefStorage,
__advancedConfig__,
} from '@/common/util/const';
import { componentRefSplit } from '@/common/util/expr-const';
const { useField } = formilyReact;
const CascaderSelect = {
position: [
DisplayPosition.form,
DisplayPosition.formDialog,
DisplayPosition.filter,
DisplayPosition.cnArrayTable,
DisplayPosition.cnArraySubAreaCard,
],
thumbUrl:
'https://img.alicdn.com/imgextra/i1/O1CN01svCpLF1OCuI6pqa9g_!!6000000001670-2-tps-240-144.png',
title: '级联选择',
componentName: 'CascaderSelect',
component: CnCascaderSelect,
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;
}
}
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;
}
}
const extraProps = {
getRequestParams: undefined,
};
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 } = config;
handleSelectRequestConfig({
componentProps: formItem?.['x-component-props'],
isDesign,
urlParamsDataSource: urlParams,
recordDataSource: formValue,
state,
ignoreHandleParam: true,
});
if (formItem?.['x-component-props']) {
formItem['x-component-props'].getRequestParams = () => {
return {
urlParamsDataSource: urlParams,
recordDataSource: formValue,
state,
};
};
formItem['x-component-props']._dataSourceName =
formProps?._dataSourceName;
}
handleSelectDataSource({
componentProps: formItem?.['x-component-props'],
state,
});
setAdvancedConfigToProps(formItem?.['x-component-props']);
},
filterItemBeforeHandler: (filterItemProps, config) => {
handleSelectRequestConfig(config);
handleSelectDataSource(config);
},
// select的prototype列表
getPrototypeList: (position) => {
const paramSelectSetter = getSelectParamSelectSetter({ position });
let extraConfigSetter;
const requestExecuteSetter = getRequestExecuteSetter({
exprSetter: getExprSetterSnippet({
position,
ignoreArrayTableCurrentRow: true,
}),
});
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: '字符串',
},
getJSExpressionPrototype({ type: 'formRequest' }),
],
},
},
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:'选择参数',
// },
},
},
// hidden:hidden('Select'),
condition(prop) {
return (
condition(prop, 'CascaderSelect', 'componentName') &&
prop?.parent?.getPropValue?.('dataOrigin') === 'request'
);
},
},
{
name: 'dataSource',
title: '编辑静态数据',
display: 'plain',
tip: '编辑静态展示数据',
// initialValue: [],
setter: getStaticDataSourceSnippet(),
condition(prop) {
return (
condition(prop, 'CascaderSelect', 'componentName') &&
prop?.parent?.getPropValue?.('dataOrigin') === 'static'
);
},
},
getRequestWhenFocusSetterSnippet(),
{
name: 'changeOnSelect',
title: '允许选中父节点',
display: 'inline',
setter: 'BoolSetter',
condition(prop) {
return (
condition(prop, 'CascaderSelect', 'componentName') &&
prop?.parent?.getPropValue?.('multiple') === false
);
},
},
{
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, 'CascaderSelect', 'componentName') &&
prop?.parent?.getPropValue?.('searchRemote') === true
);
},
},
{
title: '异步加载数据的配置',
name: 'extraProps',
display: 'accordion',
collapsed: true,
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [
{
name: 'enableRemoteLazyLoad',
title: '开启异步加载',
display: 'inline',
setter: 'BoolSetter',
// condition(prop) {
// return condition(prop, 'Select', 'componentName') && prop?.parent?.getPropValue?.('mode') === 'multiple';
// },
},
{
name: 'remoteLazyLoadKey',
title: '异步请求数据时的key',
display: 'inline',
setter: {
componentName: 'StringSetter',
props: {},
},
defaultValue: 'key',
},
],
},
},
},
},
{
title: '高级配置',
name: __advancedConfig__,
display: 'accordion',
extraProps: {
defaultCollapsed: true,
},
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [
{
name: 'canOnlyCheckLeaf',
title: '只允许勾选叶子项',
display: 'inline',
setter: 'BoolSetter',
},
{
name: 'showSearch',
title: '允许搜索',
display: 'inline',
setter: 'BoolSetter',
},
],
},
},
},
},
];
},
};
export default CascaderSelect;