import { DisplayPosition } from '../position/display-position';
import { createFormItemSetters } from '../../../lowcode/cn-form-alc/prototype/form-item';
import { CnArrayTable as UICnArrayTable } from '@cainiaofe/cn-ui';
import {
executeFunction,
executeObjectExpr,
getArrayTableCurrentRowByField2,
getRealizeValue,
getRunTimeItem,
makeFormItemSchema,
} from '../../util/util';
import { componentMap as filterItemComponentMap } from './index';
import {
createButtonListSetters,
getButtonAction,
} from '../button';
import { ButtonPosition } from '../position/button-position';
import { handleRequestParams } from '@/common/util/request';
import { columnSuffix } from '@/common/util/const';
import $i18n from 'panda-i18n';
import isEmpty from 'lodash/isEmpty';
import {
__arrayTableCurrentRow__,
__arrayTableCurrentRowIndex__,
__arrayTableCurrentRowByWhole__,
__arrayTableCurrentRowIndexByWhole__,
__dataSource__,
__formValue__,
} from '@/common/util/expr-const';
import set from 'lodash/set';
import isPlainObject from 'lodash/isPlainObject';
import { getJSXTemplate } from '@/common/manager/setter-snippet';
import { _getFormValues } from '@/common/util/biz-component-prop-name';
const add = 'add';
const remove = 'remove';
const getDefaultButtons = () => {
return [
{
children: '添加一行',
optType: 'arrayTableAdd',
primaryKey: add,
},
{
primaryKey: remove,
children: '删除',
optType: 'arrayTableRemove',
},
];
};
const CnArrayTable = {
position: [
DisplayPosition.form,
DisplayPosition.formDialog,
DisplayPosition.cnArraySubAreaCard,
],
thumbUrl:
'https://img.alicdn.com/imgextra/i2/O1CN01rmYBgM27O2d3S1SuZ_!!6000000007786-2-tps-240-144.png',
title: '可编辑表格',
componentName: 'CnArrayTable',
formItemBeforeHandler: (formItem, config) => {
const {
formInstance,
formItemConfig,
formProps,
isDesign,
usedComponentList,
urlParams,
formValue,
state,
_context,
} = config || {};
const { _dataSourceName } = formProps || {};
const { options } = formItemConfig || {};
const {
config: arrayTableFormConfig,
buttons,
style,
__advancedConfig__,
} = options || {};
if (formItem) {
let isReadOnly = false;
if (formItem?.readOnly === true) {
isReadOnly = true;
}
formItem.type = 'array';
let componentProps = {};
if (!formItem['x-component-props']) {
formItem['x-component-props'] = componentProps;
} else {
componentProps = formItem['x-component-props'];
}
if (componentProps) {
componentProps.scroll = {
x: 0,
};
componentProps.onRow = (record, index) => {
return {
onClick: () => {
// 保证点击行的时候有数据
set(
state,
`valueOf.${_dataSourceName}.${formItemConfig?.name}.${__arrayTableCurrentRowByWhole__}`,
record,
);
set(
state,
`valueOf.${_dataSourceName}.${formItemConfig?.name}.${__arrayTableCurrentRowIndexByWhole__}`,
index,
);
},
};
};
const { pagination } = componentProps;
if (typeof __advancedConfig__?.summary === 'function') {
componentProps.summary = (data) => {
return executeFunction(
__advancedConfig__.summary,
data,
UICnArrayTable?.Summary,
_context?.state,
);
};
}
formItem.items = {
type: 'object',
properties: {},
};
const { openSort } = style || {};
if (openSort) {
formItem.items.properties.__sortColumn__ = {
type: 'void',
'x-component': 'CnArrayTableColumn',
'x-component-props': {
width: 15,
title: '排序',
align: 'center',
},
properties: {
sort: {
type: 'void',
'x-component': 'CnArrayTableSortHandle',
},
},
};
}
if (
Array.isArray(arrayTableFormConfig) &&
arrayTableFormConfig.length > 0
) {
arrayTableFormConfig.forEach((item) => {
const {
label,
name,
componentName,
width = 70,
fixed,
} = item || {};
if (name && componentName) {
const columnName = name + columnSuffix;
if (columnName) {
const columnTitle = label;
const columnFormItem = makeFormItemSchema({
formItemConfig: item,
isDesign,
urlParams,
formValue,
state,
usedComponentList,
formProps,
_context,
formInstance,
});
const columnItem = {
type: 'void',
'x-component': 'CnArrayTableColumn',
'x-component-props': { title: columnTitle, width, fixed },
properties: {
[name]: columnFormItem || {},
},
};
if (item.hidden === true) {
columnItem['x-hidden'] = true;
} else if (item.hidden?.group === __formValue__) {
// const formValueJudgeHidden = executeObjectExpr(item.hidden, {
// [__dataSource__]: _context?.state,
// [__formValue__]: formValue,
// },formValue || {}, _context?.state, {})
// if(formValueJudgeHidden === true) {
// columnItem['x-hidden'] = true;
// }
}
// if(columnFormItem && columnFormItem['x-hidden']) {
// columnItem['x-hidden'] = true;
// }
// if(columnFormItem && columnFormItem['x-disabled']) {
// columnItem['x-disabled'] = true;
// }
const componentDefine = getRunTimeItem(
filterItemComponentMap,
componentName,
);
if (componentDefine) {
const tableColumnBeforeHandler =
componentDefine?.tableColumnBeforeHandler;
if (typeof tableColumnBeforeHandler === 'function') {
tableColumnBeforeHandler({
tableColumn: columnItem,
formItem: columnFormItem,
});
}
}
formItem.items.properties[columnName] = columnItem;
}
}
});
}
// 处理按钮
let realButtons = buttons;
if (!buttons) {
realButtons = getDefaultButtons();
}
const optButtons = [];
let addBtn;
realButtons?.forEach((item) => {
if (item.optType === 'arrayTableAdd') {
addBtn = item;
} else {
optButtons.push(item);
}
});
// 推断是否所有按钮都是隐藏的
// let judgeAllBtnHidden = true;
if (optButtons?.length > 0) {
// for(let item of optButtons) {
// const { hidden } = item || {}
// if(hidden?.group === __arrayTableCurrentRow__) {
// judgeAllBtnHidden = false;
// break;
// }
// const isHidden = executeObjectExpr(hidden, {
// [__dataSource__]: _context?.state,
// },{}, _context?.state, {})
// if(isHidden !== true) {
// judgeAllBtnHidden = false;
// break;
// }
// }
const optProperties = {};
const { operateColumnWidth } = style || {};
const tempProps = {
title: $i18n.get({ id: 'OperateColumn', dm: '操作列' }),
lock: 'right',
fixed: 'right',
};
if (typeof operateColumnWidth === 'number') {
tempProps.width = `${operateColumnWidth}px`;
} else {
tempProps.width = `100px`;
}
formItem.items.properties.operateColumn = {
type: 'void',
'x-component': 'CnArrayTableColumn',
'x-component-props': tempProps,
properties: optProperties,
};
optButtons?.forEach((item) => {
const { children, optType, primaryKey } = item || {};
if (optType && children && primaryKey) {
const action = getButtonAction({
...item,
position: ButtonPosition.arrayTableOperate,
});
const temp = {
type: 'void',
title: '',
};
if (
optType === 'arrayTableRemove' ||
optType === 'arrayTableMoveUp' ||
optType === 'arrayTableMoveDown'
) {
if (isReadOnly) {
return;
}
temp['x-component'] = `Cn${
optType.slice(0, 1).toUpperCase() + optType.slice(1)
}`;
} else {
temp['x-component'] = 'ArrayTableOptButton';
const componentDefine = getRunTimeItem({}, optType);
if (componentDefine?.component) {
const componentProps = {
text: true,
};
temp['x-component-props'] = componentProps;
const component = getRealizeValue(componentDefine.component);
if (component) {
componentProps.getChildren = () => {
return React.createElement(component, {
children,
buttonConfig: item,
position: ButtonPosition.arrayTableOperate,
_context,
[_getFormValues]: () => {
return formInstance?.values;
},
});
};
}
} else {
const componentProps = {
children: (
{children}
),
text: true,
type: 'primary',
style: { margin: '0 3px' },
};
temp['x-component-props'] = componentProps;
if (action) {
componentProps.onClick = (arg) => {
// 记录当前点击行数据
if (
arg?.field &&
_dataSourceName &&
_context?.state?.valueOf &&
formItemConfig?.name
) {
const tempCurrentRow = getArrayTableCurrentRowByField2(
arg?.field,
);
const segments = arg?.field?.path?.segments;
if (isPlainObject(tempCurrentRow)) {
set(
state,
`valueOf.${_dataSourceName}.${formItemConfig.name}.${__arrayTableCurrentRow__}`,
{ ...tempCurrentRow },
);
const currentIndex = segments?.[segments?.length - 2];
set(
state,
`valueOf.${_dataSourceName}.${formItemConfig.name}.${__arrayTableCurrentRowIndex__}`,
currentIndex,
);
} else {
let currentIndex = segments?.[1];
if (currentIndex !== 'number') {
currentIndex = segments?.[segments?.length - 2];
}
if (typeof currentIndex === 'number') {
const currentRow = arg?.field
?.query('..')
?.value?.()?.[currentIndex];
if (isPlainObject(currentRow)) {
set(
state,
`valueOf.${_dataSourceName}.${formItemConfig.name}.${__arrayTableCurrentRow__}`,
{ ...currentRow },
);
set(
state,
`valueOf.${_dataSourceName}.${formItemConfig.name}.${__arrayTableCurrentRowIndex__}`,
currentIndex,
);
}
}
}
}
action(
{
buttonConfig: item,
position: ButtonPosition.arrayTableOperate,
state,
urlParamsDataSource: urlParams,
_context,
arrayTableConfig: config,
field: arg?.field,
},
arg,
);
};
}
}
}
optProperties[primaryKey] = temp;
}
});
if (isEmpty(optProperties)) {
delete formItem.items.properties.operateColumn;
}
}
if (!isReadOnly && addBtn) {
const { children, primaryKey } = addBtn;
if (primaryKey) {
let addBtnComponentProps;
const addBtnDefaultValue = addBtn?.options?.defaultValue;
if (
Array.isArray(addBtnDefaultValue) &&
addBtnDefaultValue.length > 0
) {
const temp = handleRequestParams(addBtnDefaultValue, {
recordDataSource: formValue,
state: _context?.state,
});
if (temp && Object.keys(temp).length > 0) {
addBtnComponentProps = {
defaultValue: temp,
};
}
} else if (typeof addBtnDefaultValue === 'function') {
addBtnComponentProps = {
defaultValue: addBtnDefaultValue.bind(
this,
{},
_context?.state,
),
};
}
formItem.properties = {
[primaryKey]: {
type: 'void',
'x-component': 'CnArrayTableAddition',
title: children,
},
};
if (addBtnComponentProps) {
formItem.properties[primaryKey]['x-component-props'] =
addBtnComponentProps;
}
}
}
if (pagination && formItem['x-component-props']) {
formItem['x-component-props'].pagination = pagination;
}
delete formItem?.['x-component-props']?.title;
}
}
},
getDefaultProps: () => {
return {
config: [
{
label: '序号',
name: '_index',
componentName: 'CnArrayTableIndex',
options: {
width: 50,
},
},
],
pagination: {
pageSize: 10,
},
};
},
getPrototypeList: () => {
const position = DisplayPosition.cnArrayTable;
return [
{
name: 'config',
title: '表格列配置',
setter: createFormItemSetters({ position }),
},
{
name: 'buttons',
title: '操作列按钮',
defaultValue: getDefaultButtons(),
// supportVariable: true,
setter: createButtonListSetters({
position: ButtonPosition.arrayTableOperate,
}),
},
{
name: 'style',
title: '表格样式',
display: 'accordion',
collapsed: true,
extraProps: {
defaultCollapsed: true,
},
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [
{
name: 'operateColumnWidth',
title: '操作列宽度',
setter: 'NumberSetter',
},
{
name: 'openSort',
title: '开启排序',
setter: 'BoolSetter',
},
],
},
},
},
},
{
name: '__advancedConfig__',
title: '高级配置',
display: 'accordion',
collapsed: true,
extraProps: {
defaultCollapsed: true,
},
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [
{
name: 'summary',
title: '数据统计',
setter: getJSXTemplate({
position: DisplayPosition.arrayTableSummary,
}),
},
],
},
},
},
},
{
name: 'pagination',
title: '分页设置',
display: 'accordion',
collapsed: true,
extraProps: {
defaultCollapsed: true,
},
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [
{
name: 'pageSize',
title: '每页显示条数',
setter: 'NumberSetter',
},
],
},
},
},
},
];
// let configure = [
// {
// name: 'id',
// setter: 'StringSetter',
// condition() {
// return false;
// },
// },
// {
// name: 'label',
// title: '字段名称',
// display: 'inline',
// isRequired: true,
// setter: 'StringSetter',
// },
// {
// name: 'name',
// title: '字段编码',
// display: 'inline',
// isRequired: true,
// setter: 'StringSetter',
// },
// {
// name: 'componentName',
// title: '组件类型',
// display: 'inline',
// extraProps: {
// setValue(target, value) {
// const defaultProps = getItemDefaultProps(position, value);
// if (defaultProps) {
// target?.parent?.setPropValue?.('options', defaultProps);
// } else {
// target?.parent?.setPropValue?.('options', {});
// }
// const formItemDefaultProps = getFormItemDefaultProps(position, value);
// if (formItemDefaultProps) {
// const keys = Object.keys(formItemDefaultProps);
// keys.forEach((key) => {
// target?.parent?.setPropValue?.(key, formItemDefaultProps[key]);
// });
// }
// },
// },
// setter: {
// componentName: 'SelectSetter',
// props: ()=>{
// return {
// showSearch: true,
// options: getItemListByPosition({ position }),
// }
// }
// },
// },
// ]
// const formItemPrototypeList = getItemPrototypeListByPosition({ position });
// if (formItemPrototypeList?.length > 0) {
// configure.push({
// name: 'options',
// // display: 'accordion',
// display: 'block',
// title: '请完善组件的配置项',
// condition(prop) {
// const componentName = prop?.parent?.getPropValue?.('componentName');
// if (componentName) {
// const item = getItem(position, componentName) || {};
// const { getPrototypeList, configure = []} = item;
// if ((getPrototypeList && getPrototypeList()?.length > 0) || configure?.length > 0) {
// return true;
// }
// }
// return false;
// },
// extraProps: {
// defaultCollapsed: false,
// },
// setter: {
// componentName: 'ObjectSetter',
// props: {
// config: {
// items: [
// ...formItemPrototypeList,
// ],
// },
// },
// },
// });
// }
// if (position) {
// configure = [...configure, ...createValidatorSetters({ position: position.replace('display','validator') }), ...getItemStylePrototype({ position })];
// }
// return [
// {
// name: 'config',
// title: '表单项配置',
// // display: 'block',
// // initialValue: [
// //
// // ],
// setter: {
// componentName: 'ArraySetter',
// props: {
// mode: 'list',
// extraProps:{
// renderFooter(props) {
// return
// },
// },
// itemSetter: {
// componentName: 'ObjectSetter',
// // initialValue(prop) {
// //
// // },
// props: {
// config: {
// items: configure,
// },
// },
// },
// },
// },
// // supportVariable: true,
// },
// ];
},
};
export default CnArrayTable;