amis-editor 4.1.0-beta.1 → 4.1.0-beta.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. package/dist/component/Breadcrumb.d.ts +23 -2
  2. package/dist/component/Editor.d.ts +19 -0
  3. package/dist/component/Panel/RenderersPanel.d.ts +1 -2
  4. package/dist/component/RegionWrapper.d.ts +14 -7
  5. package/dist/component/RendererThumb.d.ts +5 -5
  6. package/dist/component/VRenderer.d.ts +4 -0
  7. package/dist/component/base/SearchCustomRendererPanel.d.ts +15 -0
  8. package/dist/component/base/SearchPanel.d.ts +83 -0
  9. package/dist/component/base/SearchRendererPanel.d.ts +2 -42
  10. package/dist/exports.min.js +1 -1
  11. package/dist/index.d.ts +4 -1
  12. package/dist/index.min.js +1 -1
  13. package/dist/manager.d.ts +14 -3
  14. package/dist/plugin/Card.d.ts +1 -0
  15. package/dist/plugin/Cards.d.ts +1 -0
  16. package/dist/plugin/Carousel.d.ts +1 -0
  17. package/dist/plugin/Chart.d.ts +1 -0
  18. package/dist/plugin/Collapse.d.ts +1 -0
  19. package/dist/plugin/Custom.d.ts +3 -0
  20. package/dist/plugin/CustomRegion.d.ts +43 -0
  21. package/dist/plugin/Flex.d.ts +1 -0
  22. package/dist/plugin/Form/Control.d.ts +1 -0
  23. package/dist/plugin/Form/Form.d.ts +19 -3
  24. package/dist/plugin/Form/InputURL.d.ts +1 -0
  25. package/dist/plugin/Grid.d.ts +1 -0
  26. package/dist/plugin/HBox.d.ts +1 -0
  27. package/dist/plugin/Json.d.ts +1 -0
  28. package/dist/plugin/List.d.ts +1 -0
  29. package/dist/plugin/Mapping.d.ts +1 -0
  30. package/dist/plugin/Markdown.d.ts +1 -0
  31. package/dist/plugin/Nav.d.ts +1 -0
  32. package/dist/plugin/Panel/Outline.d.ts +8 -0
  33. package/dist/plugin/Progress.d.ts +1 -0
  34. package/dist/plugin/QRCode.d.ts +1 -0
  35. package/dist/plugin/Reset.d.ts +0 -1
  36. package/dist/plugin/Service.d.ts +1 -0
  37. package/dist/plugin/Sparkline.d.ts +1 -0
  38. package/dist/plugin/Status.d.ts +1 -0
  39. package/dist/plugin/Steps.d.ts +1 -0
  40. package/dist/plugin/Submit.d.ts +0 -1
  41. package/dist/plugin/TableView.d.ts +1 -0
  42. package/dist/plugin/Tasks.d.ts +1 -0
  43. package/dist/plugin/TooltipWrapper.d.ts +1 -0
  44. package/dist/plugin/Video.d.ts +1 -0
  45. package/dist/plugin/WebComponent.d.ts +1 -0
  46. package/dist/plugin/Wizard.d.ts +11 -2
  47. package/dist/plugin/Wrapper.d.ts +1 -0
  48. package/dist/plugin.d.ts +2 -2
  49. package/dist/store/editor.d.ts +20 -2
  50. package/dist/store/node.d.ts +6 -0
  51. package/dist/style.css +1 -1
  52. package/dist/util.d.ts +7 -2
  53. package/package.json +6 -3
  54. package/src/component/schemaTpl.tsx +2155 -0
  55. package/src/plugin/Alert.tsx +87 -0
  56. package/src/plugin/AnchorNav.tsx +233 -0
  57. package/src/plugin/Audio.tsx +161 -0
  58. package/src/plugin/Avatar.tsx +77 -0
  59. package/src/plugin/Breadcrumb.tsx +107 -0
  60. package/src/plugin/Button.tsx +283 -0
  61. package/src/plugin/ButtonGroup.tsx +88 -0
  62. package/src/plugin/ButtonToolbar.tsx +89 -0
  63. package/src/plugin/CRUD.tsx +1832 -0
  64. package/src/plugin/Card.tsx +290 -0
  65. package/src/plugin/Cards.tsx +315 -0
  66. package/src/plugin/Carousel.tsx +386 -0
  67. package/src/plugin/Chart.tsx +218 -0
  68. package/src/plugin/CodeView.tsx +60 -0
  69. package/src/plugin/Collapse.tsx +143 -0
  70. package/src/plugin/CollapseGroup.tsx +167 -0
  71. package/src/plugin/Container.tsx +44 -0
  72. package/src/plugin/Custom.tsx +128 -0
  73. package/src/plugin/CustomRegion.tsx +150 -0
  74. package/src/plugin/Date.tsx +81 -0
  75. package/src/plugin/Datetime.tsx +75 -0
  76. package/src/plugin/Dialog.tsx +178 -0
  77. package/src/plugin/Divider.tsx +36 -0
  78. package/src/plugin/Drawer.tsx +217 -0
  79. package/src/plugin/DropDownButton.tsx +234 -0
  80. package/src/plugin/Each.tsx +152 -0
  81. package/src/plugin/ErrorRenderer.tsx +15 -0
  82. package/src/plugin/Flex.tsx +156 -0
  83. package/src/plugin/Form/ButtonGroupSelect.tsx +86 -0
  84. package/src/plugin/Form/ButtonToolbar.tsx +121 -0
  85. package/src/plugin/Form/ChainedSelect.tsx +70 -0
  86. package/src/plugin/Form/Checkbox.tsx +87 -0
  87. package/src/plugin/Form/Checkboxes.tsx +167 -0
  88. package/src/plugin/Form/CodeEditor.tsx +91 -0
  89. package/src/plugin/Form/Combo.tsx +582 -0
  90. package/src/plugin/Form/ConditionBuilder.tsx +324 -0
  91. package/src/plugin/Form/Control.tsx +139 -0
  92. package/src/plugin/Form/DiffEditor.tsx +117 -0
  93. package/src/plugin/Form/FieldSet.tsx +175 -0
  94. package/src/plugin/Form/Form.tsx +692 -0
  95. package/src/plugin/Form/Formula.tsx +91 -0
  96. package/src/plugin/Form/Group.tsx +300 -0
  97. package/src/plugin/Form/Hidden.tsx +56 -0
  98. package/src/plugin/Form/InputArray.tsx +228 -0
  99. package/src/plugin/Form/InputCity.tsx +93 -0
  100. package/src/plugin/Form/InputColor.tsx +123 -0
  101. package/src/plugin/Form/InputDate.tsx +175 -0
  102. package/src/plugin/Form/InputDateRange.tsx +225 -0
  103. package/src/plugin/Form/InputDateTime.tsx +183 -0
  104. package/src/plugin/Form/InputDateTimeRange.tsx +221 -0
  105. package/src/plugin/Form/InputEmail.tsx +33 -0
  106. package/src/plugin/Form/InputExcel.tsx +85 -0
  107. package/src/plugin/Form/InputFile.tsx +228 -0
  108. package/src/plugin/Form/InputGroup.tsx +105 -0
  109. package/src/plugin/Form/InputImage.tsx +277 -0
  110. package/src/plugin/Form/InputKV.tsx +72 -0
  111. package/src/plugin/Form/InputMonth.tsx +35 -0
  112. package/src/plugin/Form/InputMonthRange.tsx +195 -0
  113. package/src/plugin/Form/InputNumber.tsx +97 -0
  114. package/src/plugin/Form/InputPassword.tsx +33 -0
  115. package/src/plugin/Form/InputQuarter.tsx +35 -0
  116. package/src/plugin/Form/InputQuarterRange.tsx +195 -0
  117. package/src/plugin/Form/InputRange.tsx +121 -0
  118. package/src/plugin/Form/InputRating.tsx +78 -0
  119. package/src/plugin/Form/InputRepeat.tsx +69 -0
  120. package/src/plugin/Form/InputRichText.tsx +197 -0
  121. package/src/plugin/Form/InputSubForm.tsx +198 -0
  122. package/src/plugin/Form/InputTable.tsx +434 -0
  123. package/src/plugin/Form/InputTag.tsx +81 -0
  124. package/src/plugin/Form/InputText.tsx +186 -0
  125. package/src/plugin/Form/InputTime.tsx +95 -0
  126. package/src/plugin/Form/InputTree.tsx +240 -0
  127. package/src/plugin/Form/InputURL.tsx +34 -0
  128. package/src/plugin/Form/InputYear.tsx +35 -0
  129. package/src/plugin/Form/Item.tsx +325 -0
  130. package/src/plugin/Form/ListSelect.tsx +84 -0
  131. package/src/plugin/Form/LocationPicker.tsx +75 -0
  132. package/src/plugin/Form/MatrixCheckboxes.tsx +147 -0
  133. package/src/plugin/Form/NestedSelect.tsx +222 -0
  134. package/src/plugin/Form/Picker.tsx +217 -0
  135. package/src/plugin/Form/Radios.tsx +130 -0
  136. package/src/plugin/Form/Select.tsx +216 -0
  137. package/src/plugin/Form/Static.tsx +335 -0
  138. package/src/plugin/Form/Switch.tsx +116 -0
  139. package/src/plugin/Form/TabsTransfer.tsx +270 -0
  140. package/src/plugin/Form/Textarea.tsx +94 -0
  141. package/src/plugin/Form/Transfer.tsx +379 -0
  142. package/src/plugin/Form/TreeSelect.tsx +263 -0
  143. package/src/plugin/Form/UUID.tsx +48 -0
  144. package/src/plugin/Grid.tsx +799 -0
  145. package/src/plugin/HBox.tsx +727 -0
  146. package/src/plugin/IFrame.tsx +72 -0
  147. package/src/plugin/Image.tsx +318 -0
  148. package/src/plugin/Images.tsx +238 -0
  149. package/src/plugin/Json.tsx +76 -0
  150. package/src/plugin/Link.tsx +95 -0
  151. package/src/plugin/List.tsx +278 -0
  152. package/src/plugin/ListItem.tsx +233 -0
  153. package/src/plugin/Log.tsx +52 -0
  154. package/src/plugin/Mapping.tsx +156 -0
  155. package/src/plugin/Markdown.tsx +47 -0
  156. package/src/plugin/Nav.tsx +186 -0
  157. package/src/plugin/Operation.tsx +97 -0
  158. package/src/plugin/Others/Action.tsx +428 -0
  159. package/src/plugin/Others/BasicToolbar.tsx +591 -0
  160. package/src/plugin/Others/DataDebug.tsx +134 -0
  161. package/src/plugin/Others/TableCell.tsx +480 -0
  162. package/src/plugin/Others/Unknown.tsx +37 -0
  163. package/src/plugin/Page.tsx +308 -0
  164. package/src/plugin/Panel/AvailableRenderers.tsx +41 -0
  165. package/src/plugin/Panel/Code.tsx +44 -0
  166. package/src/plugin/Panel/Name.tsx +26 -0
  167. package/src/plugin/Panel/Outline.tsx +40 -0
  168. package/src/plugin/Panel.tsx +243 -0
  169. package/src/plugin/Plain.tsx +91 -0
  170. package/src/plugin/Progress.tsx +132 -0
  171. package/src/plugin/Property.tsx +139 -0
  172. package/src/plugin/QRCode.tsx +98 -0
  173. package/src/plugin/Reset.tsx +23 -0
  174. package/src/plugin/Service.tsx +167 -0
  175. package/src/plugin/Sparkline.tsx +40 -0
  176. package/src/plugin/Status.tsx +78 -0
  177. package/src/plugin/Steps.tsx +140 -0
  178. package/src/plugin/Submit.tsx +23 -0
  179. package/src/plugin/Table.tsx +440 -0
  180. package/src/plugin/TableView.tsx +711 -0
  181. package/src/plugin/Tabs.tsx +364 -0
  182. package/src/plugin/Tasks.tsx +276 -0
  183. package/src/plugin/Time.tsx +75 -0
  184. package/src/plugin/TooltipWrapper.tsx +193 -0
  185. package/src/plugin/Tpl.tsx +162 -0
  186. package/src/plugin/Video.tsx +160 -0
  187. package/src/plugin/WebComponent.tsx +56 -0
  188. package/src/plugin/Wizard.tsx +743 -0
  189. package/src/plugin/Wrapper.tsx +107 -0
  190. package/src/plugin.ts +1046 -0
  191. package/dist/150a58f3318ca7541ed9.png +0 -0
  192. package/dist/471adb97c322b226e589.png +0 -0
  193. package/dist/4de5f42360bc5946c3c2.png +0 -0
  194. package/dist/4e9968bba3855f088fed.png +0 -0
  195. package/dist/7f09c38ebc687fea847a.png +0 -0
  196. package/dist/c94073576487510314ea.png +0 -0
@@ -0,0 +1,290 @@
1
+ import {Button, SchemaObject} from 'amis';
2
+ import React from 'react';
3
+ import {registerEditorPlugin} from '../manager';
4
+ import {
5
+ BaseEventContext,
6
+ BasePlugin,
7
+ InsertEventContext,
8
+ PluginEvent,
9
+ RegionConfig,
10
+ RendererInfo,
11
+ VRendererConfig
12
+ } from '../plugin';
13
+ import {defaultValue, getSchemaTpl} from '../component/schemaTpl';
14
+ import flatten from 'lodash/flatten';
15
+ import {VRenderer} from '../component/VRenderer';
16
+
17
+ export class CardPlugin extends BasePlugin {
18
+ // 关联渲染器名字
19
+ rendererName = 'card';
20
+ $schema = '/schemas/CardSchema.json';
21
+
22
+ // 组件名称
23
+ name = '卡片';
24
+ isBaseComponent = true;
25
+ description = '展示单个卡片。';
26
+ docLink = '/amis/zh-CN/components/card';
27
+ tags = ['展示'];
28
+ icon = '';
29
+ scaffold = {
30
+ type: 'card',
31
+ header: {
32
+ title: '标题',
33
+ subTitle: '副标题'
34
+ },
35
+ body: '内容',
36
+ actions: [
37
+ {
38
+ type: 'button',
39
+ label: '按钮',
40
+ actionType: 'dialog',
41
+ dialog: {
42
+ title: '标题',
43
+ body: '内容'
44
+ }
45
+ }
46
+ ]
47
+ };
48
+ previewSchema = {
49
+ ...this.scaffold
50
+ };
51
+
52
+ regions: Array<RegionConfig> = [
53
+ {
54
+ key: 'body',
55
+ label: '内容区',
56
+ renderMethod: 'renderBody',
57
+ preferTag: '展示'
58
+ },
59
+
60
+ {
61
+ key: 'actions',
62
+ label: '按钮组',
63
+ renderMethod: 'renderActions',
64
+ wrapperResolve: (dom: HTMLElement) => dom,
65
+ preferTag: '按钮'
66
+ }
67
+ ];
68
+
69
+ panelTitle = '卡片';
70
+ panelBodyCreator = (context: BaseEventContext) => {
71
+ return [
72
+ getSchemaTpl('tabs', [
73
+ {
74
+ title: '常规',
75
+ body: flatten([
76
+ {
77
+ children: (
78
+ <Button
79
+ size="sm"
80
+ className="m-b-sm"
81
+ level="info"
82
+ block
83
+ onClick={() =>
84
+ // this.manager.showInsertPanel('actions', context.id)
85
+ this.manager.showRendererPanel(
86
+ '按钮',
87
+ '请从左侧组件面板中点击添加按钮元素'
88
+ )
89
+ }
90
+ >
91
+ 新增按钮
92
+ </Button>
93
+ )
94
+ },
95
+ {
96
+ children: (
97
+ <div>
98
+ <Button
99
+ block
100
+ level="primary"
101
+ size="sm"
102
+ onClick={() =>
103
+ // this.manager.showInsertPanel('body', context.id)
104
+ this.manager.showRendererPanel(
105
+ '展示',
106
+ '请从左侧组件面板中点击添加内容元素'
107
+ )
108
+ }
109
+ >
110
+ 新增内容
111
+ </Button>
112
+ </div>
113
+ )
114
+ },
115
+ {
116
+ type: 'divider'
117
+ },
118
+ {
119
+ name: 'header.title',
120
+ type: 'input-text',
121
+ label: '标题',
122
+ description: '支持模板语法如: <code>\\${xxx}</code>'
123
+ },
124
+ {
125
+ name: 'header.subTitle',
126
+ type: 'input-text',
127
+ label: '副标题',
128
+ description: '支持模板语法如: <code>\\${xxx}</code>'
129
+ },
130
+ {
131
+ name: 'header.avatar',
132
+ type: 'input-text',
133
+ label: '图片地址',
134
+ description: '支持模板语法如: <code>\\${xxx}</code>'
135
+ },
136
+ {
137
+ name: 'header.desc',
138
+ type: 'textarea',
139
+ label: '描述',
140
+ description: '支持模板语法如: <code>\\${xxx}</code>'
141
+ },
142
+ {
143
+ name: 'header.highlight',
144
+ type: 'input-text',
145
+ label: '是否高亮表达式',
146
+ description: '如: <code>this.isOwner</code>'
147
+ }
148
+ ])
149
+ },
150
+ {
151
+ title: '外观',
152
+ body: [
153
+ {
154
+ type: 'input-range',
155
+ name: 'actionsCount',
156
+ pipeIn: defaultValue(4),
157
+ min: 1,
158
+ max: 10,
159
+ step: 1,
160
+ label: '卡片一行最多能放按钮个数'
161
+ },
162
+ getSchemaTpl('className', {
163
+ name: 'titleClassName',
164
+ label: '标题 CSS 类名'
165
+ }),
166
+ getSchemaTpl('className', {
167
+ name: 'highlightClassName',
168
+ label: '高亮 CSS 类名'
169
+ }),
170
+ getSchemaTpl('className', {
171
+ name: 'subTitleClassName',
172
+ label: '副标题 CSS 类名'
173
+ }),
174
+ getSchemaTpl('className', {
175
+ name: 'descClassName',
176
+ label: '描述 CSS 类名'
177
+ }),
178
+ getSchemaTpl('className', {
179
+ name: 'avatarClassName',
180
+ label: '图片外层 CSS 类名'
181
+ }),
182
+ getSchemaTpl('className', {
183
+ name: 'imageClassName',
184
+ label: '图片 CSS 类名'
185
+ }),
186
+ getSchemaTpl('className', {
187
+ name: 'bodyClassName',
188
+ label: '内容区 CSS 类名'
189
+ }),
190
+ getSchemaTpl('className')
191
+ ]
192
+ },
193
+ {
194
+ title: '显隐',
195
+ body: [getSchemaTpl('ref'), getSchemaTpl('visible')]
196
+ }
197
+ ])
198
+ ];
199
+ };
200
+
201
+ /*exchangeRenderer(id: string) {
202
+ this.manager.showReplacePanel(id, '展示');
203
+ }*/
204
+
205
+ fieldWrapperResolve = (dom: HTMLElement) => dom;
206
+ overrides = {
207
+ renderFeild: function (
208
+ this: any,
209
+ region: string,
210
+ field: any,
211
+ index: any,
212
+ props: any
213
+ ) {
214
+ const dom = this.super(region, field, index, props);
215
+ const info: RendererInfo = this.props.$$editor;
216
+
217
+ if (!info || !field.$$id) {
218
+ return dom;
219
+ }
220
+
221
+ const plugin = info.plugin as CardPlugin;
222
+ const id = field.$$id;
223
+ return (
224
+ <VRenderer
225
+ plugin={info.plugin}
226
+ renderer={info.renderer}
227
+ multifactor
228
+ key={id}
229
+ $schema="/schemas/CardBodyField.json"
230
+ hostId={info.id}
231
+ memberIndex={index}
232
+ name={`${`字段${index + 1}`}`}
233
+ id={id}
234
+ draggable={false}
235
+ wrapperResolve={plugin.fieldWrapperResolve}
236
+ schemaPath={`${info.schemaPath}/body/${index}`}
237
+ path={`${this.props.$path}/${index}`} // 好像没啥用
238
+ data={this.props.data} // 好像没啥用
239
+ >
240
+ {dom}
241
+ </VRenderer>
242
+ );
243
+ }
244
+ };
245
+
246
+ vRendererConfig: VRendererConfig = {
247
+ panelTitle: '字段',
248
+ panelBodyCreator: (context: BaseEventContext) => {
249
+ return [
250
+ getSchemaTpl('label'),
251
+ getSchemaTpl('className', {
252
+ name: 'labelClassName',
253
+ label: 'Label CSS 类名',
254
+ visibleOn: 'this.label'
255
+ })
256
+ /*{
257
+ children: (
258
+ <Button
259
+ size="sm"
260
+ level="info"
261
+ className="m-b"
262
+ block
263
+ onClick={this.exchangeRenderer.bind(this, context.id)}
264
+ >
265
+ 更改渲染器类型
266
+ </Button>
267
+ )
268
+ }*/
269
+ ];
270
+ }
271
+ };
272
+
273
+ // 自动插入 label
274
+ beforeInsert(event: PluginEvent<InsertEventContext>) {
275
+ const context = event.context;
276
+
277
+ if (
278
+ (context.info.plugin === this ||
279
+ context.node.sameIdChild?.info.plugin === this) &&
280
+ context.region === 'body'
281
+ ) {
282
+ context.data = {
283
+ ...context.data,
284
+ label: context.data.label ?? context.subRenderer?.name ?? '列名称'
285
+ };
286
+ }
287
+ }
288
+ }
289
+
290
+ registerEditorPlugin(CardPlugin);
@@ -0,0 +1,315 @@
1
+ import {Button, resolveVariable, SchemaObject} from 'amis';
2
+ import React from 'react';
3
+ import {registerEditorPlugin} from '../manager';
4
+ import {
5
+ BaseEventContext,
6
+ BasePlugin,
7
+ BasicPanelItem,
8
+ BasicRendererInfo,
9
+ BasicToolbarItem,
10
+ ContextMenuEventContext,
11
+ ContextMenuItem,
12
+ PluginInterface,
13
+ RegionConfig,
14
+ RendererInfo,
15
+ RendererInfoResolveEventContext
16
+ } from '../plugin';
17
+ import {defaultValue, getSchemaTpl} from '../component/schemaTpl';
18
+ import {diff, JSONPipeOut, repeatArray} from '../util';
19
+
20
+ export class CardsPlugin extends BasePlugin {
21
+ // 关联渲染器名字
22
+ rendererName = 'cards';
23
+ $schema = '/schemas/CardsSchema.json';
24
+
25
+ // 组件名称
26
+ name = '卡片列表';
27
+ isBaseComponent = true;
28
+ description =
29
+ '功能类似于表格,但是用一个个小卡片来展示数据。当前组件需要配置数据源,不自带数据拉取,请优先使用 「CRUD」 组件。';
30
+ docLink = '/amis/zh-CN/components/cards';
31
+ tags = ['展示'];
32
+ icon = 'fa fa-window-maximize';
33
+ scaffold = {
34
+ type: 'cards',
35
+ data: {
36
+ items: [
37
+ {a: 1, b: 2},
38
+ {a: 3, b: 4}
39
+ ]
40
+ },
41
+ columnsCount: 2,
42
+ card: {
43
+ type: 'card',
44
+ className: 'm-b-none',
45
+ header: {
46
+ title: '标题',
47
+ subTitle: '副标题'
48
+ },
49
+ body: [
50
+ {
51
+ name: 'a',
52
+ label: 'A'
53
+ },
54
+ {
55
+ name: 'b',
56
+ label: 'B'
57
+ }
58
+ ],
59
+ actions: [
60
+ {
61
+ label: '详情',
62
+ type: 'button'
63
+ }
64
+ ]
65
+ }
66
+ };
67
+ previewSchema = {
68
+ ...this.scaffold,
69
+ className: 'text-left '
70
+ };
71
+
72
+ panelTitle = '卡片集';
73
+ panelBodyCreator = (context: BaseEventContext) => {
74
+ const isCRUDBody = context.schema.type === 'crud';
75
+ return [
76
+ getSchemaTpl('tabs', [
77
+ {
78
+ title: '常规',
79
+ body: [
80
+ {
81
+ children: (
82
+ <div className="m-b">
83
+ <Button
84
+ level="success"
85
+ size="sm"
86
+ block
87
+ onClick={this.editDetail.bind(this, context.id)}
88
+ >
89
+ 配置单项信息
90
+ </Button>
91
+ </div>
92
+ )
93
+ },
94
+
95
+ {
96
+ type: 'divider'
97
+ },
98
+ {
99
+ name: 'title',
100
+ type: 'input-text',
101
+ label: '标题'
102
+ },
103
+ {
104
+ name: 'href',
105
+ type: 'input-text',
106
+ label: '打开外部链接'
107
+ },
108
+ isCRUDBody
109
+ ? null
110
+ : {
111
+ name: 'source',
112
+ type: 'input-text',
113
+ label: '数据源',
114
+ pipeIn: defaultValue('${items}'),
115
+ description: '绑定当前环境变量',
116
+ test: !isCRUDBody
117
+ },
118
+ {
119
+ name: 'placeholder',
120
+ value: '暂无数据',
121
+ type: 'input-text',
122
+ label: '无数据提示'
123
+ }
124
+ ]
125
+ },
126
+ {
127
+ title: '外观',
128
+ body: [
129
+ {
130
+ name: 'showHeader',
131
+ type: 'switch',
132
+ mode: 'inline',
133
+ className: 'block',
134
+ label: '是否显示头部',
135
+ pipeIn: defaultValue(true)
136
+ },
137
+ {
138
+ name: 'showFooter',
139
+ type: 'switch',
140
+ mode: 'inline',
141
+ className: 'block',
142
+ label: '是否显示底部',
143
+ pipeIn: defaultValue(true)
144
+ },
145
+ getSchemaTpl('className', {
146
+ label: 'CSS 类名'
147
+ }),
148
+ getSchemaTpl('className', {
149
+ name: 'headerClassName',
150
+ label: '头部 CSS 类名'
151
+ }),
152
+ getSchemaTpl('className', {
153
+ name: 'footerClassName',
154
+ label: '底部 CSS 类名'
155
+ }),
156
+ getSchemaTpl('className', {
157
+ name: 'itemsClassName',
158
+ label: '内容 CSS 类名'
159
+ }),
160
+ getSchemaTpl('className', {
161
+ pipeIn: defaultValue('Grid-col--sm6 Grid-col--md4 Grid-col--lg3'),
162
+ name: 'itemClassName',
163
+ label: '卡片 CSS 类名'
164
+ }),
165
+ {
166
+ name: 'columnsCount',
167
+ type: 'input-range',
168
+ visibleOn: '!this.leftFixed',
169
+ min: 0,
170
+ max: 12,
171
+ step: 1,
172
+ label: '每行显示个数',
173
+ description: '不设置时,由卡片 CSS 类名决定'
174
+ },
175
+ {
176
+ name: 'masonryLayout',
177
+ type: 'switch',
178
+ mode: 'inline',
179
+ label: '启用瀑布流'
180
+ }
181
+ ]
182
+ },
183
+ {
184
+ title: '显隐',
185
+ body: [getSchemaTpl('ref'), getSchemaTpl('visible')]
186
+ }
187
+ ])
188
+ ];
189
+ };
190
+
191
+ editDetail(id: string) {
192
+ const manager = this.manager;
193
+ const store = manager.store;
194
+ const node = store.getNodeById(id);
195
+ const value = store.getValueOf(id);
196
+
197
+ node &&
198
+ value &&
199
+ this.manager.openSubEditor({
200
+ title: '配置成员渲染器',
201
+ value: {
202
+ type: 'card',
203
+ ...value.card
204
+ },
205
+ slot: {
206
+ type: 'container',
207
+ body: '$$'
208
+ },
209
+ typeMutable: false,
210
+ onChange: newValue => {
211
+ newValue = {...value, card: newValue};
212
+ manager.panelChangeValue(newValue, diff(value, newValue));
213
+ },
214
+ data: {
215
+ item: 'mocked data',
216
+ index: 0
217
+ }
218
+ });
219
+ }
220
+
221
+ buildEditorToolbar(
222
+ {id, info, schema}: BaseEventContext,
223
+ toolbars: Array<BasicToolbarItem>
224
+ ) {
225
+ if (
226
+ info.renderer.name === 'cards' ||
227
+ (info.renderer.name === 'crud' && schema.mode === 'cards')
228
+ ) {
229
+ toolbars.push({
230
+ icon: 'fa fa-expand',
231
+ order: 100,
232
+ tooltip: '配置成员渲染器',
233
+ onClick: this.editDetail.bind(this, id)
234
+ });
235
+ }
236
+ }
237
+
238
+ buildEditorContextMenu(
239
+ {id, schema, region, info}: ContextMenuEventContext,
240
+ menus: Array<ContextMenuItem>
241
+ ) {
242
+ if (
243
+ info.renderer.name === 'cards' ||
244
+ (info.renderer.name === 'crud' && schema.mode === 'cards')
245
+ ) {
246
+ menus.push('|', {
247
+ label: '配置成员渲染器',
248
+ onSelect: this.editDetail.bind(this, id)
249
+ });
250
+ }
251
+ }
252
+
253
+ filterProps(props: any) {
254
+ const data = {
255
+ ...props.defaultData,
256
+ ...props.data
257
+ };
258
+ const arr = Array.isArray(props.value)
259
+ ? props.value
260
+ : typeof props.source === 'string'
261
+ ? resolveVariable(props.source, data)
262
+ : resolveVariable('items', data);
263
+
264
+ if (!Array.isArray(arr) || !arr.length) {
265
+ const mockedData: any = {
266
+ id: 666,
267
+ title: '假数据',
268
+ description: '假数据',
269
+ a: '假数据',
270
+ b: '假数据'
271
+ };
272
+
273
+ props.value = repeatArray(mockedData, 1).map((item, index) => ({
274
+ ...item,
275
+ id: index + 1
276
+ }));
277
+ }
278
+
279
+ const {$schema, ...rest} = props;
280
+
281
+ return {
282
+ ...JSONPipeOut(rest),
283
+ $schema
284
+ };
285
+ }
286
+
287
+ getRendererInfo(
288
+ context: RendererInfoResolveEventContext
289
+ ): BasicRendererInfo | void {
290
+ const plugin: PluginInterface = this;
291
+ const {renderer, schema} = context;
292
+ if (
293
+ !schema.$$id &&
294
+ schema.$$editor?.renderer.name === 'crud' &&
295
+ renderer.name === 'cards'
296
+ ) {
297
+ return {
298
+ ...({id: schema.$$editor.id} as any),
299
+ name: plugin.name!,
300
+ regions: plugin.regions,
301
+ patchContainers: plugin.patchContainers,
302
+ vRendererConfig: plugin.vRendererConfig,
303
+ wrapperProps: plugin.wrapperProps,
304
+ wrapperResolve: plugin.wrapperResolve,
305
+ filterProps: plugin.filterProps,
306
+ $schema: plugin.$schema,
307
+ renderRenderer: plugin.renderRenderer
308
+ };
309
+ }
310
+
311
+ return super.getRendererInfo(context);
312
+ }
313
+ }
314
+
315
+ registerEditorPlugin(CardsPlugin);