Skip to content

Commit ea96872

Browse files
authored
fix: renderSetter with template (#202)
* fix: renderSetter with template * fix: update types
1 parent a86e0e0 commit ea96872

File tree

9 files changed

+95
-110
lines changed

9 files changed

+95
-110
lines changed

apps/playground/src/helpers/prototypes.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ const Snippet3ColumnLayout: IComponentPrototype = {
4848
icon: 'icon-column-3',
4949
type: 'snippet',
5050
package: '@music163/antd',
51-
// FIXME: Column 组件 需要更新为 defineComponent
5251
initChildren: `
5352
<Columns columns={12}>
5453
<Column colSpan={4}>
@@ -169,6 +168,32 @@ const prototypes: Dict<IComponentPrototype> = {
169168
Snippet2ColumnLayout,
170169
Snippet3ColumnLayout,
171170
SnippetButtonGroup,
171+
Section: {
172+
...basePrototypes['Section'],
173+
props: [
174+
// ...(basePrototypes['Section'].props as any),
175+
{
176+
name: 'title',
177+
title: '标题',
178+
setter: 'textSetter',
179+
},
180+
{
181+
name: 'extra',
182+
title: '额外内容',
183+
setter: 'renderSetter',
184+
options: [
185+
{
186+
label: '按钮组',
187+
value: 'ButtonGroup',
188+
renderBody:
189+
'<ButtonGroup><Button>button1</Button><Button>button2</Button></ButtonGroup>',
190+
relatedImports: ['ButtonGroup', 'Button'],
191+
},
192+
],
193+
template: '(v) => {\n return {{content}};\n}',
194+
},
195+
],
196+
},
172197
Box: {
173198
name: 'Box',
174199
title: '盒子',
@@ -207,6 +232,25 @@ const prototypes: Dict<IComponentPrototype> = {
207232
template: '(e) => {\n {{content}}\n}',
208233
tip: '回调参数说明:e 为事件对象',
209234
},
235+
{
236+
name: 'renderFoo',
237+
title: 'foo自定义渲染',
238+
setter: 'renderSetter',
239+
options: [
240+
{
241+
label: '占位空间',
242+
value: 'Box',
243+
render: '() => <Box>test</Box>',
244+
relatedImports: ['Box'],
245+
},
246+
{
247+
label: '占位文本',
248+
value: 'Text',
249+
render: '() => <Text>text</Text>',
250+
relatedImports: ['Text'],
251+
},
252+
],
253+
},
210254
],
211255
},
212256
Columns: {

packages/designer/src/setters/choice-setter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import React, { useCallback } from 'react';
22
import { Radio, RadioProps, Tooltip } from 'antd';
3-
import type { OptionType } from '@music163/tango-helpers';
3+
import type { IOptionItem } from '@music163/tango-helpers';
44
import { FormItemComponentProps } from '@music163/tango-setting-form';
55
import { IconFont } from '@music163/tango-ui';
66

77
interface ChoiceSetterProps {
8-
options?: OptionType[];
8+
options?: IOptionItem[];
99
}
1010

1111
export function ChoiceSetter({

packages/designer/src/setters/expression-setter.tsx renamed to packages/designer/src/setters/code-setter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const suffixStyle = css`
5858
}
5959
`;
6060

61-
export interface ExpressionSetterProps extends FormItemComponentProps<string> {
61+
export interface CodeSetterProps extends FormItemComponentProps<string> {
6262
modalTitle?: string;
6363
modalTip?: string;
6464
autoCompleteOptions?: string[];
@@ -70,7 +70,7 @@ export interface ExpressionSetterProps extends FormItemComponentProps<string> {
7070
expressionType?: 'cssObject';
7171
}
7272

73-
export function ExpressionSetter(props: ExpressionSetterProps) {
73+
export function CodeSetter(props: CodeSetterProps) {
7474
const {
7575
onChange,
7676
modalTitle,

packages/designer/src/setters/event-setter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { ActionSelect } from '@music163/tango-ui';
55
import { FormItemComponentProps } from '@music163/tango-setting-form';
66
import { useWorkspace, useWorkspaceData } from '@music163/tango-context';
77
import { Dict, wrapCode } from '@music163/tango-helpers';
8-
import { ExpressionPopover, getCallbackValue } from './expression-setter';
8+
import { ExpressionPopover, getCallbackValue } from './code-setter';
99
import { value2code } from '@music163/tango-core';
1010

1111
enum EventAction {

packages/designer/src/setters/index.ts

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import { CssSetter } from './css-setter';
55
import { DateRangeSetter, DateSetter, TimeRangeSetter } from './date-setter';
66
import { EnumSetter } from './enum-setter';
77
import { EventSetter } from './event-setter';
8-
import { ExpressionSetter } from './expression-setter';
8+
import { CodeSetter } from './code-setter';
99
import { JSONSetter } from './json-setter';
1010
import { JsxSetter } from './jsx-setter';
1111
import { ListSetter } from './list-setter';
1212
import { ModelSetter } from './model-setter';
1313
import { OptionSetter } from './option-setter';
1414
import { PickerSetter } from './picker-setter';
15-
import { RenderSetter, TableCellSetter, TableExpandableSetter } from './render-setter';
15+
import { RenderSetter } from './render-setter';
1616
import { RouterSetter } from './router-setter';
1717
import {
1818
SpacingSetter,
@@ -49,7 +49,7 @@ export const BUILT_IN_SETTERS: IFormItemCreateOptions[] = [
4949
{
5050
name: 'codeSetter',
5151
alias: ['expSetter', 'expressionSetter'],
52-
component: ExpressionSetter,
52+
component: CodeSetter,
5353
type: 'code',
5454
validate: codeValidate,
5555
},
@@ -126,22 +126,12 @@ export const BUILT_IN_SETTERS: IFormItemCreateOptions[] = [
126126
component: PickerSetter,
127127
},
128128
{
129-
name: 'renderPropsSetter',
129+
name: 'renderSetter',
130+
alias: ['renderPropsSetter'],
130131
component: RenderSetter,
131132
type: 'code',
132133
validate: codeValidate,
133134
},
134-
{
135-
name: 'tableCellSetter',
136-
component: TableCellSetter,
137-
type: 'code',
138-
},
139-
{
140-
name: 'tableExpandableSetter',
141-
component: TableExpandableSetter,
142-
type: 'code',
143-
validate: codeValidate,
144-
},
145135
{
146136
name: 'routerSetter',
147137
component: RouterSetter,

packages/designer/src/setters/render-setter.tsx

Lines changed: 10 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,16 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
22
import { ActionSelect, InputCode } from '@music163/tango-ui';
33
import { FormItemComponentProps } from '@music163/tango-setting-form';
44
import { Box } from 'coral-system';
5-
import { Dict } from '@music163/tango-helpers';
6-
7-
interface IRenderOption {
8-
label: string;
9-
value: string;
10-
render?: string;
11-
relatedImports?: string[];
12-
}
5+
import { Dict, IOptionItem } from '@music163/tango-helpers';
6+
import { getCallbackValue } from './code-setter';
137

148
export interface RenderSetterProps {
159
text?: string;
16-
options?: IRenderOption[];
17-
fallbackOption?: IRenderOption;
10+
options?: IOptionItem[];
11+
fallbackOption?: IOptionItem;
1812
}
1913

20-
const defaultOptions: IRenderOption[] = [
14+
const defaultOptions: IOptionItem[] = [
2115
{ label: '取消自定义', value: '' },
2216
{ label: '自定义渲染', value: 'Box', render: '() => <Box></Box>' },
2317
];
@@ -30,6 +24,7 @@ export function RenderSetter({
3024
onChange,
3125
text = '自定义渲染为',
3226
options = defaultOptions,
27+
template = `() => {{content}}`,
3328
fallbackOption,
3429
}: FormItemComponentProps & RenderSetterProps) {
3530
const [inputValue, setInputValue] = useState(value || '');
@@ -47,13 +42,14 @@ export function RenderSetter({
4742
const onSelect = useCallback(
4843
(key: string) => {
4944
const option = optionsMap[key] || fallbackOption;
50-
if (option?.render) {
51-
onChange(option.render, { relatedImports: option.relatedImports });
45+
const next = option?.render || getCallbackValue(option.renderBody, template);
46+
if (next) {
47+
onChange(next, { relatedImports: option.relatedImports });
5248
} else {
5349
onChange(undefined);
5450
}
5551
},
56-
[optionsMap, fallbackOption, onChange],
52+
[optionsMap, fallbackOption, onChange, template],
5753
);
5854
return (
5955
<Box>
@@ -68,69 +64,3 @@ export function RenderSetter({
6864
</Box>
6965
);
7066
}
71-
72-
const getRender = (content: string, type?: 'tableCell' | 'tableExpandable') => {
73-
let code;
74-
switch (type) {
75-
case 'tableCell':
76-
code = `(value, record, index) => ${content}`;
77-
break;
78-
case 'tableExpandable':
79-
code = `{
80-
expandedRowRender: (record) => ${content},
81-
rowExpandable: (record) => true
82-
}`;
83-
break;
84-
default:
85-
code = `() => ${content}`;
86-
break;
87-
}
88-
return code;
89-
};
90-
91-
const tableCellOptions: RenderSetterProps['options'] = [
92-
{ label: '取消自定义', value: '' },
93-
{
94-
label: '自定义区域',
95-
value: 'Box',
96-
render: getRender('<Box></Box>', 'tableCell'),
97-
relatedImports: ['Box'],
98-
},
99-
{
100-
label: '标签',
101-
value: 'Tag',
102-
render: getRender('<Tag>tag</Tag>', 'tableCell'),
103-
relatedImports: ['Tag'],
104-
},
105-
{
106-
label: '按钮',
107-
value: 'Button',
108-
render: getRender('<Button>button</Button>', 'tableCell'),
109-
relatedImports: ['Button'],
110-
},
111-
{
112-
label: '图片',
113-
value: 'Image',
114-
render: getRender('<Image width={150} src="https://picsum.photos/100" />', 'tableCell'),
115-
relatedImports: ['Image'],
116-
},
117-
];
118-
119-
const tableExpandableOptions: RenderSetterProps['options'] = [
120-
{
121-
label: '设置可展开行',
122-
value: 'Box',
123-
render: getRender('<Box></Box>', 'tableExpandable'),
124-
relatedImports: ['Box'],
125-
},
126-
{ label: '取消可展开行', value: '' },
127-
];
128-
129-
export function TableCellSetter(props: FormItemComponentProps) {
130-
return <RenderSetter options={tableCellOptions} {...props} />;
131-
}
132-
133-
// FIXME: 应该直接用 props 嵌套的模式
134-
export function TableExpandableSetter(props: FormItemComponentProps) {
135-
return <RenderSetter options={tableExpandableOptions} text="配置表格可展开行" {...props} />;
136-
}

packages/helpers/src/types/advanced.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,19 @@ export type MousePoint = {
1010
y: number;
1111
};
1212

13-
export type OptionType = {
13+
/**
14+
* @deprecated 使用 IOptionItem 代替
15+
*/
16+
export type OptionType = IOptionItem<any>;
17+
18+
/**
19+
* 列表项
20+
*/
21+
export interface IOptionItem<T = string> {
1422
/**
1523
* 值
1624
*/
17-
value: any;
25+
value: T;
1826
/**
1927
* 显示的文本
2028
*/
@@ -28,10 +36,18 @@ export type OptionType = {
2836
*/
2937
tip?: string;
3038
/**
31-
* 关联的导入
39+
* 自定义渲染函数,仅用于 renderSetter
40+
*/
41+
render?: string;
42+
/**
43+
* 自定义渲染函数的 body(可以用来和 template 配合),仅用于 renderSetter
44+
*/
45+
renderBody?: string;
46+
/**
47+
* 关联的导入,仅用于 renderSetter
3248
*/
3349
relatedImports?: string[];
34-
};
50+
}
3551

3652
/**
3753
* 变量树节点类型

packages/helpers/src/types/prototype.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* 物料描述类型
33
*/
44

5-
import { OptionType } from './advanced';
5+
import { IOptionItem } from './advanced';
66
import { PartialRecord } from './base';
77

88
/**
@@ -113,7 +113,7 @@ export interface IComponentProp<T = any> {
113113
/**
114114
* 配置项的可选值,setterProps.options 的简写
115115
*/
116-
options?: OptionType[];
116+
options?: IOptionItem[];
117117
/**
118118
* 是否禁用变量绑定
119119
*/

packages/setting-form/src/form-item.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,14 @@ export function createFormItem(options: IFormItemCreateOptions) {
231231

232232
// FIXME: 重新考虑这段代码的位置,外置这个逻辑
233233
if (
234-
['codeSetter', 'expressionSetter', 'expSetter', 'actionSetter', 'eventSetter'].includes(
235-
setter,
236-
)
234+
[
235+
'codeSetter',
236+
'expressionSetter',
237+
'expSetter',
238+
'actionSetter',
239+
'eventSetter',
240+
'renderSetter',
241+
].includes(setter)
237242
) {
238243
expProps = {
239244
modalTitle: title,

0 commit comments

Comments
 (0)