amis-editor 4.1.0-beta.4 → 4.2.0-beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. package/dist/component/Breadcrumb.d.ts +23 -2
  2. package/dist/component/ClassNameControl.d.ts +1 -1
  3. package/dist/component/Control/APIControl.d.ts +2 -2
  4. package/dist/component/Control/OptionControl.d.ts +3 -3
  5. package/dist/component/Control/PopoverEdit.d.ts +4 -4
  6. package/dist/component/Control/ValidationControl.d.ts +1 -1
  7. package/dist/component/Editor.d.ts +20 -1
  8. package/dist/component/IFramePreview.d.ts +2 -1
  9. package/dist/component/NodeWrapper.d.ts +1 -1
  10. package/dist/component/Panel/RenderersPanel.d.ts +1 -2
  11. package/dist/component/Preview.d.ts +3 -1
  12. package/dist/component/RegionWrapper.d.ts +4 -0
  13. package/dist/component/VRenderer.d.ts +4 -0
  14. package/dist/component/base/InputComponentName.d.ts +1 -1
  15. package/dist/component/base/SearchCustomRendererPanel.d.ts +15 -0
  16. package/dist/component/base/SearchPanel.d.ts +83 -0
  17. package/dist/component/base/SearchRendererPanel.d.ts +2 -42
  18. package/dist/env.d.ts +1 -1
  19. package/dist/exports.min.js +1 -1
  20. package/dist/index.d.ts +4 -1
  21. package/dist/index.min.js +1 -1
  22. package/dist/manager.d.ts +16 -4
  23. package/dist/plugin/Alert.d.ts +1 -1
  24. package/dist/plugin/Button.d.ts +1 -1
  25. package/dist/plugin/Card.d.ts +1 -0
  26. package/dist/plugin/Cards.d.ts +2 -1
  27. package/dist/plugin/Carousel.d.ts +1 -0
  28. package/dist/plugin/Chart.d.ts +1 -0
  29. package/dist/plugin/Collapse.d.ts +1 -0
  30. package/dist/plugin/Custom.d.ts +3 -0
  31. package/dist/plugin/CustomRegion.d.ts +40 -0
  32. package/dist/plugin/Dialog.d.ts +1 -1
  33. package/dist/plugin/Drawer.d.ts +1 -1
  34. package/dist/plugin/DropDownButton.d.ts +1 -1
  35. package/dist/plugin/Each.d.ts +1 -1
  36. package/dist/plugin/Flex.d.ts +1 -0
  37. package/dist/plugin/Form/Control.d.ts +1 -0
  38. package/dist/plugin/Form/Form.d.ts +19 -3
  39. package/dist/plugin/Form/Formula.d.ts +3 -3
  40. package/dist/plugin/Form/InputURL.d.ts +1 -0
  41. package/dist/plugin/Form/Switch.d.ts +2 -0
  42. package/dist/plugin/Grid.d.ts +1 -0
  43. package/dist/plugin/HBox.d.ts +1 -0
  44. package/dist/plugin/IFrame.d.ts +3 -3
  45. package/dist/plugin/Json.d.ts +1 -0
  46. package/dist/plugin/List.d.ts +2 -1
  47. package/dist/plugin/Mapping.d.ts +1 -0
  48. package/dist/plugin/Markdown.d.ts +1 -0
  49. package/dist/plugin/Nav.d.ts +1 -0
  50. package/dist/plugin/Page.d.ts +1 -1
  51. package/dist/plugin/Panel/Outline.d.ts +8 -0
  52. package/dist/plugin/Progress.d.ts +1 -0
  53. package/dist/plugin/QRCode.d.ts +1 -0
  54. package/dist/plugin/Reset.d.ts +0 -1
  55. package/dist/plugin/Service.d.ts +1 -0
  56. package/dist/plugin/Sparkline.d.ts +1 -0
  57. package/dist/plugin/Status.d.ts +1 -0
  58. package/dist/plugin/Steps.d.ts +1 -0
  59. package/dist/plugin/Submit.d.ts +0 -1
  60. package/dist/plugin/Table.d.ts +1 -1
  61. package/dist/plugin/TableView.d.ts +1 -0
  62. package/dist/plugin/Tasks.d.ts +1 -0
  63. package/dist/plugin/TooltipWrapper.d.ts +1 -0
  64. package/dist/plugin/Video.d.ts +1 -0
  65. package/dist/plugin/WebComponent.d.ts +1 -0
  66. package/dist/plugin/Wizard.d.ts +11 -2
  67. package/dist/plugin/Wrapper.d.ts +1 -0
  68. package/dist/plugin.d.ts +8 -7
  69. package/dist/store/editor.d.ts +47 -11
  70. package/dist/store/node.d.ts +6 -0
  71. package/dist/style.css +1 -1
  72. package/dist/util.d.ts +1 -1
  73. package/package.json +10 -3
  74. package/src/component/schemaTpl.tsx +2157 -0
  75. package/src/plugin/Alert.tsx +87 -0
  76. package/src/plugin/AnchorNav.tsx +233 -0
  77. package/src/plugin/Audio.tsx +154 -0
  78. package/src/plugin/Avatar.tsx +77 -0
  79. package/src/plugin/Breadcrumb.tsx +107 -0
  80. package/src/plugin/Button.tsx +281 -0
  81. package/src/plugin/ButtonGroup.tsx +85 -0
  82. package/src/plugin/ButtonToolbar.tsx +87 -0
  83. package/src/plugin/CRUD.tsx +1835 -0
  84. package/src/plugin/Card.tsx +290 -0
  85. package/src/plugin/Cards.tsx +318 -0
  86. package/src/plugin/Carousel.tsx +377 -0
  87. package/src/plugin/Chart.tsx +218 -0
  88. package/src/plugin/CodeView.tsx +60 -0
  89. package/src/plugin/Collapse.tsx +136 -0
  90. package/src/plugin/CollapseGroup.tsx +167 -0
  91. package/src/plugin/Container.tsx +40 -0
  92. package/src/plugin/Custom.tsx +128 -0
  93. package/src/plugin/CustomRegion.tsx +156 -0
  94. package/src/plugin/Date.tsx +74 -0
  95. package/src/plugin/Datetime.tsx +68 -0
  96. package/src/plugin/Dialog.tsx +176 -0
  97. package/src/plugin/Divider.tsx +36 -0
  98. package/src/plugin/Drawer.tsx +214 -0
  99. package/src/plugin/DropDownButton.tsx +235 -0
  100. package/src/plugin/Each.tsx +150 -0
  101. package/src/plugin/ErrorRenderer.tsx +15 -0
  102. package/src/plugin/Flex.tsx +151 -0
  103. package/src/plugin/Form/ButtonGroupSelect.tsx +75 -0
  104. package/src/plugin/Form/ButtonToolbar.tsx +110 -0
  105. package/src/plugin/Form/ChainedSelect.tsx +70 -0
  106. package/src/plugin/Form/Checkbox.tsx +87 -0
  107. package/src/plugin/Form/Checkboxes.tsx +167 -0
  108. package/src/plugin/Form/CodeEditor.tsx +81 -0
  109. package/src/plugin/Form/Combo.tsx +582 -0
  110. package/src/plugin/Form/ConditionBuilder.tsx +315 -0
  111. package/src/plugin/Form/Control.tsx +139 -0
  112. package/src/plugin/Form/DiffEditor.tsx +111 -0
  113. package/src/plugin/Form/FieldSet.tsx +163 -0
  114. package/src/plugin/Form/Form.tsx +687 -0
  115. package/src/plugin/Form/Formula.tsx +79 -0
  116. package/src/plugin/Form/Group.tsx +295 -0
  117. package/src/plugin/Form/Hidden.tsx +44 -0
  118. package/src/plugin/Form/InputArray.tsx +228 -0
  119. package/src/plugin/Form/InputCity.tsx +93 -0
  120. package/src/plugin/Form/InputColor.tsx +123 -0
  121. package/src/plugin/Form/InputDate.tsx +175 -0
  122. package/src/plugin/Form/InputDateRange.tsx +225 -0
  123. package/src/plugin/Form/InputDateTime.tsx +183 -0
  124. package/src/plugin/Form/InputDateTimeRange.tsx +221 -0
  125. package/src/plugin/Form/InputEmail.tsx +33 -0
  126. package/src/plugin/Form/InputExcel.tsx +85 -0
  127. package/src/plugin/Form/InputFile.tsx +221 -0
  128. package/src/plugin/Form/InputGroup.tsx +96 -0
  129. package/src/plugin/Form/InputImage.tsx +266 -0
  130. package/src/plugin/Form/InputKV.tsx +72 -0
  131. package/src/plugin/Form/InputMonth.tsx +35 -0
  132. package/src/plugin/Form/InputMonthRange.tsx +195 -0
  133. package/src/plugin/Form/InputNumber.tsx +89 -0
  134. package/src/plugin/Form/InputPassword.tsx +33 -0
  135. package/src/plugin/Form/InputQuarter.tsx +35 -0
  136. package/src/plugin/Form/InputQuarterRange.tsx +195 -0
  137. package/src/plugin/Form/InputRange.tsx +121 -0
  138. package/src/plugin/Form/InputRating.tsx +78 -0
  139. package/src/plugin/Form/InputRepeat.tsx +57 -0
  140. package/src/plugin/Form/InputRichText.tsx +186 -0
  141. package/src/plugin/Form/InputSubForm.tsx +189 -0
  142. package/src/plugin/Form/InputTable.tsx +434 -0
  143. package/src/plugin/Form/InputTag.tsx +70 -0
  144. package/src/plugin/Form/InputText.tsx +186 -0
  145. package/src/plugin/Form/InputTime.tsx +85 -0
  146. package/src/plugin/Form/InputTree.tsx +229 -0
  147. package/src/plugin/Form/InputURL.tsx +34 -0
  148. package/src/plugin/Form/InputYear.tsx +35 -0
  149. package/src/plugin/Form/Item.tsx +327 -0
  150. package/src/plugin/Form/ListSelect.tsx +73 -0
  151. package/src/plugin/Form/LocationPicker.tsx +62 -0
  152. package/src/plugin/Form/MatrixCheckboxes.tsx +136 -0
  153. package/src/plugin/Form/NestedSelect.tsx +211 -0
  154. package/src/plugin/Form/Picker.tsx +209 -0
  155. package/src/plugin/Form/Radios.tsx +119 -0
  156. package/src/plugin/Form/Select.tsx +233 -0
  157. package/src/plugin/Form/Static.tsx +322 -0
  158. package/src/plugin/Form/Switch.tsx +107 -0
  159. package/src/plugin/Form/TabsTransfer.tsx +259 -0
  160. package/src/plugin/Form/Textarea.tsx +83 -0
  161. package/src/plugin/Form/Transfer.tsx +368 -0
  162. package/src/plugin/Form/TreeSelect.tsx +263 -0
  163. package/src/plugin/Form/UUID.tsx +48 -0
  164. package/src/plugin/Grid.tsx +798 -0
  165. package/src/plugin/HBox.tsx +727 -0
  166. package/src/plugin/IFrame.tsx +70 -0
  167. package/src/plugin/Image.tsx +314 -0
  168. package/src/plugin/Images.tsx +231 -0
  169. package/src/plugin/Json.tsx +69 -0
  170. package/src/plugin/Link.tsx +93 -0
  171. package/src/plugin/List.tsx +278 -0
  172. package/src/plugin/ListItem.tsx +229 -0
  173. package/src/plugin/Log.tsx +52 -0
  174. package/src/plugin/Mapping.tsx +149 -0
  175. package/src/plugin/Markdown.tsx +47 -0
  176. package/src/plugin/Nav.tsx +184 -0
  177. package/src/plugin/Operation.tsx +95 -0
  178. package/src/plugin/Others/Action.tsx +426 -0
  179. package/src/plugin/Others/BasicToolbar.tsx +585 -0
  180. package/src/plugin/Others/DataDebug.tsx +134 -0
  181. package/src/plugin/Others/TableCell.tsx +480 -0
  182. package/src/plugin/Others/Unknown.tsx +37 -0
  183. package/src/plugin/Page.tsx +306 -0
  184. package/src/plugin/Panel/AvailableRenderers.tsx +41 -0
  185. package/src/plugin/Panel/Code.tsx +44 -0
  186. package/src/plugin/Panel/Name.tsx +26 -0
  187. package/src/plugin/Panel/Outline.tsx +40 -0
  188. package/src/plugin/Panel.tsx +243 -0
  189. package/src/plugin/Plain.tsx +84 -0
  190. package/src/plugin/Progress.tsx +125 -0
  191. package/src/plugin/Property.tsx +139 -0
  192. package/src/plugin/QRCode.tsx +96 -0
  193. package/src/plugin/Reset.tsx +23 -0
  194. package/src/plugin/Service.tsx +162 -0
  195. package/src/plugin/Sparkline.tsx +40 -0
  196. package/src/plugin/Status.tsx +76 -0
  197. package/src/plugin/Steps.tsx +128 -0
  198. package/src/plugin/Submit.tsx +23 -0
  199. package/src/plugin/Table.tsx +428 -0
  200. package/src/plugin/TableView.tsx +709 -0
  201. package/src/plugin/Tabs.tsx +362 -0
  202. package/src/plugin/Tasks.tsx +274 -0
  203. package/src/plugin/Time.tsx +68 -0
  204. package/src/plugin/TooltipWrapper.tsx +193 -0
  205. package/src/plugin/Tpl.tsx +158 -0
  206. package/src/plugin/Video.tsx +158 -0
  207. package/src/plugin/WebComponent.tsx +53 -0
  208. package/src/plugin/Wizard.tsx +740 -0
  209. package/src/plugin/Wrapper.tsx +107 -0
  210. package/src/plugin.ts +1050 -0
  211. package/dist/150a58f3318ca7541ed9.png +0 -0
  212. package/dist/471adb97c322b226e589.png +0 -0
  213. package/dist/4de5f42360bc5946c3c2.png +0 -0
  214. package/dist/4e9968bba3855f088fed.png +0 -0
  215. package/dist/7f09c38ebc687fea847a.png +0 -0
  216. package/dist/c94073576487510314ea.png +0 -0
@@ -0,0 +1,687 @@
1
+ import {registerEditorPlugin} from '../../manager';
2
+ import {
3
+ BasePlugin,
4
+ ChangeEventContext,
5
+ BaseEventContext,
6
+ PluginEvent,
7
+ RegionConfig,
8
+ ScaffoldForm
9
+ } from '../../plugin';
10
+ import {defaultValue, getSchemaTpl} from '../../component/schemaTpl';
11
+ import {setVariable} from 'amis-core';
12
+
13
+ // 用于脚手架的常用表单控件
14
+ const formItemOptions = [
15
+ {
16
+ name: 'type',
17
+ label: '控件类型',
18
+ type: 'select',
19
+ required: true,
20
+ options: [
21
+ {
22
+ label: '单行文本框',
23
+ value: 'input-text'
24
+ },
25
+ {
26
+ label: '多行文本',
27
+ value: 'textarea'
28
+ },
29
+ {
30
+ label: '分组',
31
+ value: 'group'
32
+ },
33
+ {
34
+ label: '数字输入',
35
+ value: 'input-number'
36
+ },
37
+ {
38
+ label: '单选框',
39
+ value: 'radios'
40
+ },
41
+ {
42
+ label: '勾选框',
43
+ value: 'checkbox'
44
+ },
45
+ {
46
+ label: '复选框',
47
+ value: 'checkboxes'
48
+ },
49
+ {
50
+ label: '下拉框',
51
+ value: 'select'
52
+ },
53
+ {
54
+ label: '开关',
55
+ value: 'switch'
56
+ },
57
+ {
58
+ label: '日期',
59
+ value: 'input-date'
60
+ },
61
+ {
62
+ label: '表格',
63
+ value: 'input-table'
64
+ },
65
+ {
66
+ label: '文件上传',
67
+ value: 'input-file'
68
+ },
69
+ {
70
+ label: '图片上传',
71
+ value: 'input-image'
72
+ },
73
+ {
74
+ label: '富文本编辑器',
75
+ value: 'input-rich-text'
76
+ }
77
+ ]
78
+ },
79
+ {
80
+ name: 'label',
81
+ label: '显示名称',
82
+ type: 'input-text',
83
+ hiddenOn: 'data.type === "group"'
84
+ },
85
+ {
86
+ name: 'name',
87
+ label: '提交字段名',
88
+ required: true,
89
+ type: 'input-text',
90
+ hiddenOn: 'data.type === "group"'
91
+ }
92
+ ];
93
+
94
+ export class FormPlugin extends BasePlugin {
95
+ // 关联渲染器名字
96
+ rendererName = 'form';
97
+ $schema = '/schemas/FormSchema.json';
98
+
99
+ order = -999;
100
+
101
+ // 组件名称
102
+ name = '表单';
103
+ isBaseComponent = true;
104
+ description =
105
+ '可用于新建、编辑或者展示数据,配置初始化接口可从远端加载数据,配置提交接口可将数据发送远端。另外也可以将数据提交给其他组件,与其他组件通信。';
106
+ docLink = '/amis/zh-CN/components/form/index';
107
+ tags = ['功能'];
108
+ icon = 'fa fa-list-alt';
109
+ scaffold = {
110
+ type: 'form',
111
+ title: '表单',
112
+ body: [
113
+ {
114
+ label: '文本框',
115
+ type: 'input-text',
116
+ name: 'text'
117
+ }
118
+ ]
119
+ };
120
+ previewSchema = {
121
+ type: 'form',
122
+ panelClassName: 'Panel--default text-left m-b-none',
123
+ mode: 'horizontal',
124
+ body: [
125
+ {
126
+ label: '文本',
127
+ name: 'a',
128
+ type: 'input-text'
129
+ }
130
+ ]
131
+ };
132
+
133
+ scaffoldForm: ScaffoldForm = {
134
+ title: '快速创建表单',
135
+ body: [
136
+ getSchemaTpl('api', {
137
+ label: '提交地址'
138
+ }),
139
+ {
140
+ name: 'mode',
141
+ label: '文字与输入框展示模式',
142
+ type: 'button-group-select',
143
+ pipeIn: defaultValue('normal', false),
144
+ options: [
145
+ {
146
+ label: '上下',
147
+ value: 'normal'
148
+ },
149
+ {
150
+ label: '左右摆放',
151
+ value: 'horizontal'
152
+ },
153
+ {
154
+ label: '内联',
155
+ value: 'inline'
156
+ }
157
+ ]
158
+ },
159
+ {
160
+ label: '表单控件',
161
+ type: 'combo',
162
+ name: 'body',
163
+ multiple: true,
164
+ draggable: true,
165
+ multiLine: false,
166
+ items: [
167
+ ...formItemOptions,
168
+ {
169
+ visibleOn: 'data.type === "group"',
170
+ type: 'combo',
171
+ name: 'body',
172
+ label: '分组内的控件',
173
+ multiple: true,
174
+ draggable: true,
175
+ multiLine: true,
176
+ items: [...formItemOptions]
177
+ }
178
+ ]
179
+ }
180
+ ]
181
+ };
182
+
183
+ // scaffoldForm: ScaffoldForm = {
184
+ // title: '配置表单信息',
185
+ // body: [getSchemaTpl('api')],
186
+ // canRebuild: true
187
+ // };
188
+
189
+ // 容器配置
190
+ regions: Array<RegionConfig> = [
191
+ {
192
+ key: 'body',
193
+ label: '表单集合',
194
+ matchRegion: (elem: JSX.Element) => !!elem?.props.noValidate,
195
+ renderMethod: 'renderBody',
196
+ preferTag: '表单项'
197
+ },
198
+
199
+ {
200
+ label: '按钮组',
201
+ key: 'actions',
202
+ preferTag: '按钮'
203
+ }
204
+ ];
205
+
206
+ panelTitle = '表单';
207
+ panelBodyCreator = (context: BaseEventContext) => {
208
+ const isCRUDFilter: boolean = /\/crud\/filter\/form$/.test(context.path);
209
+ const isInDialog: boolean = /(?:\/|^)dialog\/.+$/.test(context.path);
210
+
211
+ return [
212
+ getSchemaTpl('tabs', [
213
+ {
214
+ title: '常规',
215
+ body: [
216
+ {
217
+ name: 'title',
218
+ type: 'input-text',
219
+ label: '标题',
220
+ visibleOn: `this.wrapWithPanel !== false`
221
+ },
222
+ {
223
+ name: 'submitText',
224
+ type: 'input-text',
225
+ label: '提交按钮名称',
226
+ pipeIn: defaultValue('提交'),
227
+ visibleOn: `this.wrapWithPanel !== false && !this.actions && (!Array.isArray(this.body) || !this.body.some(function(item) {return !!~['submit','button','reset','button-group'].indexOf(item.type);}))`,
228
+ description: '当没有自定义按钮时有效。'
229
+ },
230
+
231
+ {
232
+ name: 'autoFocus',
233
+ type: 'switch',
234
+ label: '自动聚焦',
235
+ mode: 'inline',
236
+ className: 'block',
237
+ labelRemark: {
238
+ className: 'm-l-xs',
239
+ trigger: 'click',
240
+ rootClose: true,
241
+ content: '设置后将让表单的第一个可输入的表单项获得焦点',
242
+ placement: 'left'
243
+ }
244
+ },
245
+
246
+ getSchemaTpl('submitOnChange'),
247
+
248
+ {
249
+ label: '提交完后重置表单',
250
+ type: 'switch',
251
+ name: 'resetAfterSubmit',
252
+ mode: 'inline',
253
+ className: 'block',
254
+ labelRemark: {
255
+ className: 'm-l-xs',
256
+ trigger: 'click',
257
+ rootClose: true,
258
+ content: '即表单提交完后,让所有表单项的值还原成初始值',
259
+ placement: 'left'
260
+ }
261
+ },
262
+
263
+ isCRUDFilter
264
+ ? null
265
+ : {
266
+ label: '初始化后提交一次',
267
+ type: 'switch',
268
+ name: 'submitOnInit',
269
+ mode: 'inline',
270
+ className: 'block',
271
+ labelRemark: {
272
+ className: 'm-l-xs',
273
+ trigger: 'click',
274
+ rootClose: true,
275
+ content: '开启后,表单初始完成便会触发一次提交。',
276
+ placement: 'left'
277
+ }
278
+ },
279
+
280
+ isInDialog
281
+ ? {
282
+ label: '提交后是否关闭对话框',
283
+ type: 'switch',
284
+ name: 'closeDialogOnSubmit',
285
+ mode: 'inline',
286
+ className: 'block',
287
+ pipeIn: (value: any) => value !== false
288
+ }
289
+ : null,
290
+
291
+ isCRUDFilter
292
+ ? null
293
+ : {
294
+ label: '提交给其他组件',
295
+ name: 'target',
296
+ type: 'input-text',
297
+ description:
298
+ '可以通过设置此属性,把当前表单的值提交给目标组件,而不是自己来通过接口保存,请填写目标组件的 <code>name</code> 属性,多个组件请用逗号隔开。当 <code>target</code> 为 <code>window</code> 时,则把表单数据附属到地址栏。'
299
+ },
300
+
301
+ getSchemaTpl('reload', {
302
+ test: !isCRUDFilter
303
+ }),
304
+
305
+ isCRUDFilter
306
+ ? null
307
+ : {
308
+ label: '跳转',
309
+ name: 'redirect',
310
+ type: 'input-text',
311
+ description: '当设置此值后,表单提交完后跳转到目标地址。'
312
+ },
313
+
314
+ {
315
+ name: 'canAccessSuperData',
316
+ label: '是否自动填充父级同名变量',
317
+ type: 'switch',
318
+ pipeIn: defaultValue(true),
319
+ mode: 'inline',
320
+ className: 'block'
321
+ },
322
+
323
+ {
324
+ name: 'persistData',
325
+ label: '是否开启本地缓存',
326
+ type: 'switch',
327
+ pipeIn: defaultValue(false),
328
+ mode: 'inline',
329
+ className: 'block',
330
+ labelRemark: {
331
+ className: 'm-l-xs',
332
+ trigger: 'click',
333
+ rootClose: true,
334
+ content:
335
+ '开启后,表单的数据会缓存在浏览器中,切换页面或关闭弹框不会清空当前表单内的数据',
336
+ placement: 'left'
337
+ }
338
+ },
339
+
340
+ {
341
+ name: 'clearPersistDataAfterSubmit',
342
+ label: '提交成功后清空本地缓存',
343
+ type: 'switch',
344
+ pipeIn: defaultValue(false),
345
+ mode: 'inline',
346
+ className: 'block',
347
+ visibleOn: 'data.persistData',
348
+ labelRemark: {
349
+ className: 'm-l-xs',
350
+ trigger: 'click',
351
+ rootClose: true,
352
+ content:
353
+ '开启本地缓存并开启本配置项后,表单提交成功后,会自动清除浏览器中当前表单的缓存数据',
354
+ placement: 'left'
355
+ }
356
+ },
357
+
358
+ {
359
+ name: 'rules',
360
+ label: '表单组合校验',
361
+ type: 'combo',
362
+ multiple: true,
363
+ multiLine: true,
364
+ items: [
365
+ {
366
+ name: 'rule',
367
+ label: '校验规则',
368
+ type: 'input-text'
369
+ },
370
+ {
371
+ name: 'message',
372
+ label: '报错提示',
373
+ type: 'input-text'
374
+ }
375
+ ]
376
+ }
377
+ ]
378
+ },
379
+
380
+ isCRUDFilter
381
+ ? null
382
+ : {
383
+ title: '接口',
384
+ body: [
385
+ getSchemaTpl('api', {
386
+ label: '保存接口',
387
+ description: '用来保存表单数据',
388
+ sampleBuilder: (schema: any) => `{
389
+ "status": 0,
390
+ "msg": "",
391
+
392
+ // 可以不返回,如果返回了数据将被 merge 进来。
393
+ data: {}
394
+ }`
395
+ // test: !this.isCRUDFilter
396
+ }),
397
+
398
+ {
399
+ label: '采用异步方式?',
400
+ remark: {
401
+ trigger: 'click',
402
+ rootClose: true,
403
+ title: '什么是异步方式?',
404
+ content:
405
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
406
+ placement: 'left'
407
+ },
408
+ type: 'switch',
409
+ name: 'asyncApi',
410
+ visibleOn: 'data.api',
411
+ pipeIn: (value: any) => value != null,
412
+ pipeOut: (value: any) => (value ? '' : undefined),
413
+ mode: 'inline',
414
+ className: 'block'
415
+ },
416
+
417
+ getSchemaTpl('api', {
418
+ name: 'asyncApi',
419
+ label: '异步检测接口',
420
+ visibleOn: 'data.asyncApi != null',
421
+ description:
422
+ '设置此属性后,表单提交发送保存接口后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
423
+ }),
424
+
425
+ {
426
+ type: 'divider'
427
+ },
428
+
429
+ getSchemaTpl('api', {
430
+ name: 'initApi',
431
+ label: '初始化接口',
432
+ description: '用来初始化表单数据',
433
+ sampleBuilder: (schema: any) => {
434
+ const data = {};
435
+
436
+ if (Array.isArray(schema.body)) {
437
+ schema.body.forEach((control: any) => {
438
+ if (
439
+ control.name &&
440
+ !~['combo', 'input-array', 'form'].indexOf(
441
+ control.type
442
+ )
443
+ ) {
444
+ setVariable(data, control.name, 'sample');
445
+ }
446
+ });
447
+ }
448
+
449
+ return JSON.stringify(
450
+ {
451
+ status: 0,
452
+ msg: '',
453
+ data: data
454
+ },
455
+ null,
456
+ 2
457
+ );
458
+ }
459
+ }),
460
+
461
+ {
462
+ label: '开启定时刷新',
463
+ type: 'switch',
464
+ name: 'interval',
465
+ visibleOn: 'data.initApi',
466
+ pipeIn: (value: any) => !!value,
467
+ pipeOut: (value: any) => (value ? 3000 : undefined),
468
+ mode: 'inline'
469
+ },
470
+
471
+ {
472
+ name: 'interval',
473
+ type: 'input-number',
474
+ visibleOn: 'data.interval',
475
+ step: 500,
476
+ className: 'm-t-n-sm',
477
+ description: '设置后将自动定时刷新,单位 ms'
478
+ },
479
+
480
+ {
481
+ name: 'silentPolling',
482
+ label: '静默刷新',
483
+ type: 'switch',
484
+ mode: 'inline',
485
+ visibleOn: '!!data.interval',
486
+ description: '设置自动定时刷新时是否显示loading'
487
+ },
488
+
489
+ {
490
+ name: 'stopAutoRefreshWhen',
491
+ label: '停止定时刷新检测表达式',
492
+ type: 'input-text',
493
+ visibleOn: '!!data.interval',
494
+ description:
495
+ '定时刷新一旦设置会一直刷新,除非给出表达式,条件满足后则不刷新了。'
496
+ },
497
+
498
+ {
499
+ label: '采用异步方式?',
500
+ remark: {
501
+ trigger: 'click',
502
+ rootClose: true,
503
+ title: '什么是异步方式?',
504
+ content:
505
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
506
+ placement: 'left'
507
+ },
508
+ type: 'switch',
509
+ name: 'initAsyncApi',
510
+ visibleOn: 'data.initApi',
511
+ pipeIn: (value: any) => value != null,
512
+ pipeOut: (value: any) => (value ? '' : undefined),
513
+ mode: 'inline'
514
+ },
515
+
516
+ getSchemaTpl('api', {
517
+ name: 'initAsyncApi',
518
+ label: '异步检测接口',
519
+ visibleOn: 'data.initAsyncApi != null',
520
+ description:
521
+ '设置此属性后,表单请求 initApi 后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
522
+ }),
523
+
524
+ {
525
+ type: 'divider'
526
+ },
527
+
528
+ isCRUDFilter
529
+ ? {
530
+ name: 'messages',
531
+ pipeIn: defaultValue({
532
+ fetchFailed: '初始化失败'
533
+ }),
534
+ label: '默认消息信息',
535
+ type: 'combo',
536
+ multiLine: true,
537
+ description:
538
+ '可以不设置,接口返回的 msg 字段,优先级更高',
539
+ items: [
540
+ {
541
+ label: '获取成功提示',
542
+ name: 'fetchSuccess',
543
+ type: 'input-text'
544
+ },
545
+ {
546
+ label: '获取失败提示',
547
+ name: 'fetchFailed',
548
+ type: 'input-text'
549
+ }
550
+ ]
551
+ }
552
+ : {
553
+ name: 'messages',
554
+ pipeIn: defaultValue({
555
+ fetchFailed: '初始化失败',
556
+ saveSuccess: '保存成功',
557
+ saveFailed: '保存失败'
558
+ }),
559
+ label: '默认消息提示',
560
+ type: 'combo',
561
+ multiLine: true,
562
+ description:
563
+ '可以不设置,接口返回的 msg 字段,优先级更高',
564
+ items: [
565
+ {
566
+ label: '获取成功提示',
567
+ name: 'fetchSuccess',
568
+ type: 'input-text'
569
+ },
570
+ {
571
+ label: '获取失败提示',
572
+ name: 'fetchFailed',
573
+ type: 'input-text'
574
+ },
575
+ {
576
+ label: '保存成功提示',
577
+ name: 'saveSuccess',
578
+ type: 'input-text'
579
+ },
580
+ {
581
+ label: '保存失败提示',
582
+ name: 'saveFailed',
583
+ type: 'input-text'
584
+ },
585
+ {
586
+ label: '验证失败提示',
587
+ name: 'validateFailed',
588
+ type: 'input-text'
589
+ }
590
+ ]
591
+ }
592
+ ]
593
+ },
594
+
595
+ {
596
+ title: '外观',
597
+ body: [
598
+ {
599
+ name: 'wrapWithPanel',
600
+ type: 'switch',
601
+ mode: 'inline',
602
+ className: 'block',
603
+ label: '用 Panel 包裹',
604
+ pipeIn: defaultValue(true),
605
+ labelRemark: {
606
+ className: 'm-l-xs',
607
+ trigger: 'click',
608
+ rootClose: true,
609
+ content: '关闭后,表单只会展示表单项,标题和操作栏将不会显示。',
610
+ placement: 'left'
611
+ }
612
+ },
613
+
614
+ {
615
+ name: 'mode',
616
+ label: '展示模式',
617
+ type: 'button-group-select',
618
+ size: 'sm',
619
+ // mode: 'inline',
620
+ // className: 'block',
621
+ pipeIn: defaultValue('normal', false),
622
+ options: [
623
+ {
624
+ label: '默认',
625
+ value: 'normal'
626
+ },
627
+ {
628
+ label: '左右摆放',
629
+ value: 'horizontal'
630
+ },
631
+ {
632
+ label: '内联',
633
+ value: 'inline'
634
+ }
635
+ ]
636
+ },
637
+
638
+ getSchemaTpl('horizontal', {
639
+ visibleOn: 'this.mode == "horizontal"'
640
+ }),
641
+
642
+ getSchemaTpl('className'),
643
+
644
+ getSchemaTpl('className', {
645
+ name: 'panelClassName',
646
+ visibleOn: 'this.wrapWithPanel !== false',
647
+ label: 'Panel 的 CSS 类名',
648
+ description: '可以设置 Panel--info 之类的'
649
+ })
650
+ ]
651
+ },
652
+
653
+ {
654
+ title: '其他',
655
+ body: [
656
+ getSchemaTpl('ref'),
657
+ getSchemaTpl('name', {
658
+ test: !isCRUDFilter
659
+ }),
660
+ {
661
+ name: 'debug',
662
+ label: '开启调试',
663
+ type: 'switch',
664
+ mode: 'inline',
665
+ labelRemark: '显示当前表单的数据在表单顶部'
666
+ },
667
+ getSchemaTpl('disabled'),
668
+ getSchemaTpl('visible')
669
+ ]
670
+ }
671
+ ])
672
+ ];
673
+ };
674
+
675
+ afterUpdate(event: PluginEvent<ChangeEventContext>) {
676
+ const context = event.context;
677
+
678
+ if (
679
+ context.info.renderer.name === 'form' &&
680
+ context.diff?.some(change => change.path?.join('.') === 'wrapWithPanel')
681
+ ) {
682
+ this.manager.buildPanels();
683
+ }
684
+ }
685
+ }
686
+
687
+ registerEditorPlugin(FormPlugin);