355 lines
9.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { TransformedComponentMetadata, FieldConfig, SettingTarget } from '@alilc/lowcode-types';
import { IconSlot } from '../icons/slot';
import { getConvertedExtraKey } from '@alilc/lowcode-designer';
export default function (metadata: TransformedComponentMetadata): TransformedComponentMetadata {
const { componentName, configure = {} } = metadata;
// 如果已经处理过,不再重新执行一遍
if (configure.combined) {
return metadata;
}
if (componentName === 'Leaf') {
return {
...metadata,
configure: {
...configure,
combined: [
{
name: 'children',
title: { type: 'i18n', 'zh-CN': '内容设置', 'en-US': 'Content' },
setter: {
componentName: 'MixedSetter',
props: {
// TODO:
setters: [
{
componentName: 'StringSetter',
props: {
// TODO: textarea mode
multiline: true,
},
initialValue: '',
},
{
componentName: 'ExpressionSetter',
initialValue: {
type: 'JSExpression',
value: '',
},
},
],
},
},
},
],
},
};
}
const { props, supports = {} } = configure as any;
const isRoot: boolean = componentName === 'Page' || componentName === 'Component';
const eventsDefinition: any[] = [];
const supportedLifecycles =
supports.lifecycles ||
(isRoot
? /* [
{
description: '初始化时',
name: 'constructor',
},
{
description: '装载后',
name: 'componentDidMount',
},
{
description: '更新时',
name: 'componentDidUpdate',
},
{
description: '卸载时',
name: 'componentWillUnmount',
},
] */ null
: null);
if (supportedLifecycles) {
eventsDefinition.push({
type: 'lifeCycleEvent',
title: '生命周期',
list: supportedLifecycles.map((event: any) => (typeof event === 'string' ? { name: event } : event)),
});
}
if (supports.events) {
eventsDefinition.push({
type: 'events',
title: '事件',
list: (supports.events || []).map((event: any) => (typeof event === 'string' ? { name: event } : event)),
});
}
// 通用设置
let propsGroup = props ? [...props] : [];
const basicInfo: any = {};
if (componentName === 'Slot') {
if (!configure.component) {
configure.component = {
isContainer: true,
};
} else if (typeof configure.component === 'object') {
configure.component.isContainer = true;
}
basicInfo.icon = IconSlot;
propsGroup = [
{
name: getConvertedExtraKey('title'),
title: {
type: 'i18n',
'en-US': 'Slot Title',
'zh-CN': '插槽标题',
},
setter: 'StringSetter',
defaultValue: '插槽容器',
},
];
}
/*
propsGroup.push({
name: '#generals',
title: { type: 'i18n', 'zh-CN': '通用', 'en-US': 'General' },
items: [
{
name: 'id',
title: 'ID',
setter: 'StringSetter',
},
{
name: 'key',
title: 'Key',
// todo: use Mixin
setter: 'StringSetter',
},
{
name: 'ref',
title: 'Ref',
setter: 'StringSetter',
},
{
name: '!more',
title: '更多',
setter: 'PropertiesSetter',
},
],
});
*/
const stylesGroup: FieldConfig[] = [];
const advanceGroup: FieldConfig[] = [];
if (propsGroup) {
let l = propsGroup.length;
while (l-- > 0) {
const item = propsGroup[l];
// if (item.type === 'group' && (item.title === '高级' || item.title?.label === '高级')) {
// advanceGroup = item.items || [];
// propsGroup.splice(l, 1);
// }
if (
item.name === '__style__' ||
item.name === 'style' ||
item.name === 'containerStyle' ||
item.name === 'pageStyle'
) {
propsGroup.splice(l, 1);
stylesGroup.push(item);
if (item.extraProps?.defaultCollapsed && item.name !== 'containerStyle') {
item.extraProps.defaultCollapsed = false;
}
}
}
}
const combined: FieldConfig[] = [
{
title: { type: 'i18n', 'zh-CN': '属性', 'en-US': 'Props' },
name: '#props',
items: propsGroup,
},
];
if (supports.className) {
stylesGroup.push({
name: 'className',
title: { type: 'i18n', 'zh-CN': '类名绑定', 'en-US': 'ClassName' },
setter: 'ClassNameSetter',
});
}
if (supports.style) {
stylesGroup.push({
name: 'style',
title: { type: 'i18n', 'zh-CN': '行内样式', 'en-US': 'Style' },
setter: 'StyleSetter',
extraProps: {
display: 'block',
},
});
}
if (stylesGroup.length > 0) {
combined.push({
name: '#styles',
title: { type: 'i18n', 'zh-CN': '样式', 'en-US': 'Styles' },
items: stylesGroup,
});
}
if (eventsDefinition.length > 0) {
combined.push({
name: '#events',
title: { type: 'i18n', 'zh-CN': '事件', 'en-US': 'Events' },
items: [
{
name: '__events',
title: { type: 'i18n', 'zh-CN': '事件设置', 'en-US': 'Events' },
setter: {
componentName: 'EventsSetter',
props: {
definition: eventsDefinition,
},
},
getValue(field: SettingTarget, val?: any[]) {
return val;
},
setValue(field: SettingTarget, eventData) {
const { eventDataList, eventList } = eventData;
Array.isArray(eventList) && eventList.map((item) => {
field.parent.clearPropValue(item.name);
return item;
});
Array.isArray(eventDataList) && eventDataList.map((item) => {
field.parent.setPropValue(item.name, {
type: 'JSFunction',
// 需要传下入参
value: `function(){this.${item.relatedEventName}.apply(this,Array.prototype.slice.call(arguments).concat([${item.paramStr ? item.paramStr : ''}])) }`,
});
return item;
});
},
},
],
});
}
if (!isRoot) {
if (supports.condition !== false) {
advanceGroup.push({
name: getConvertedExtraKey('condition'),
title: { type: 'i18n', 'zh-CN': '是否渲染', 'en-US': 'Condition' },
defaultValue: true,
setter: [
{
componentName: 'BoolSetter',
},
{
componentName: 'VariableSetter',
},
],
extraProps: {
display: 'block',
},
});
}
if (supports.loop !== false) {
advanceGroup.push({
name: '#loop',
title: { type: 'i18n', 'zh-CN': '循环', 'en-US': 'Loop' },
items: [
{
name: getConvertedExtraKey('loop'),
title: { type: 'i18n', 'zh-CN': '循环数据', 'en-US': 'Loop Data' },
setter: [
{
componentName: 'JsonSetter',
props: {
label: { type: 'i18n', 'zh-CN': '编辑数据', 'en-US': 'Edit Data' },
defaultValue: '[]',
},
},
{
componentName: 'VariableSetter',
},
],
},
{
name: getConvertedExtraKey('loopArgs.0'),
title: { type: 'i18n', 'zh-CN': '迭代变量名', 'en-US': 'Loop Item' },
setter: {
componentName: 'StringSetter',
props: {
placeholder: { type: 'i18n', 'zh-CN': '默认为: item', 'en-US': 'Defaults: item' },
},
},
},
{
name: getConvertedExtraKey('loopArgs.1'),
title: { type: 'i18n', 'zh-CN': '索引变量名', 'en-US': 'Loop Index' },
setter: {
componentName: 'StringSetter',
props: {
placeholder: { type: 'i18n', 'zh-CN': '默认为: index', 'en-US': 'Defaults: index' },
},
},
},
{
name: 'key',
title: '循环 Key',
setter: [
{
componentName: 'StringSetter',
},
{
componentName: 'VariableSetter',
},
],
},
],
extraProps: {
display: 'accordion',
},
});
}
if (supports.condition !== false || supports.loop !== false) {
advanceGroup.push({
name: 'key',
title: {
label: '渲染唯一标识key',
tip: '搭配「条件渲染」或「循环渲染」时使用,和 react 组件中的 key 原理相同,点击查看帮助',
docUrl: 'https://yuque.antfin-inc.com/legao/help3.0/ca5in7',
},
setter: [
{
componentName: 'StringSetter',
},
{
componentName: 'VariableSetter',
},
],
extraProps: {
display: 'block',
},
});
}
}
if (advanceGroup.length > 0) {
combined.push({
name: '#advanced',
title: { type: 'i18n', 'zh-CN': '高级', 'en-US': 'Advanced' },
items: advanceGroup,
});
}
return {
...metadata,
...basicInfo,
configure: {
...configure,
combined,
},
};
}