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,743 @@
1
+ import {SchemaObject} from 'amis';
2
+ import {RendererConfig} from 'amis/lib/factory';
3
+ import {registerEditorPlugin} from '../manager';
4
+ import {
5
+ BaseEventContext,
6
+ BasePlugin,
7
+ BasicToolbarItem,
8
+ RegionConfig,
9
+ RendererInfo,
10
+ VRendererConfig
11
+ } from '../plugin';
12
+ import {defaultValue, getSchemaTpl} from '../component/schemaTpl';
13
+ import React from 'react';
14
+ import {VRenderer} from '../component/VRenderer';
15
+ import {mapReactElement} from '../component/factory';
16
+ import {RegionWrapper as Region} from '../component/RegionWrapper';
17
+
18
+ export class WizardPlugin extends BasePlugin {
19
+ // 关联渲染器名字
20
+ rendererName = 'wizard';
21
+ $schema = '/schemas/WizardSchema.json';
22
+
23
+ name = '向导';
24
+ isBaseComponent = true;
25
+ description =
26
+ '表单向导,可以将复杂的多个表单项拆分成多个步骤,一步一步指引用户完成填写。';
27
+ docLink = '/amis/zh-CN/components/form/wizard';
28
+ tags = ['功能'];
29
+ icon = 'fa fa-list-ol';
30
+
31
+ scaffold = {
32
+ type: 'wizard',
33
+ steps: [
34
+ {
35
+ title: '第一步',
36
+ body: [
37
+ {
38
+ type: 'input-text',
39
+ label: '文本',
40
+ name: 'var1',
41
+ }
42
+ ]
43
+ },
44
+
45
+ {
46
+ title: '第二步',
47
+ body: [
48
+ {
49
+ type: 'input-text',
50
+ label: '文本2',
51
+ name: 'var2'
52
+ }
53
+ ]
54
+ }
55
+ ]
56
+ };
57
+
58
+ previewSchema = {
59
+ type: 'wizard',
60
+ className: 'text-left m-b-none',
61
+ steps: [
62
+ {
63
+ title: '第一步',
64
+ body: [
65
+ {
66
+ type: 'input-text',
67
+ label: '文本',
68
+ name: 'var1'
69
+ }
70
+ ]
71
+ },
72
+
73
+ {
74
+ title: '第二步',
75
+ body: []
76
+ }
77
+ ]
78
+ };
79
+
80
+ panelTitle = '向导';
81
+ panelBody = [
82
+ getSchemaTpl('tabs', [
83
+ {
84
+ title: '常规',
85
+ body: [
86
+ {
87
+ name: 'steps',
88
+ label: '步骤设置',
89
+ type: 'combo',
90
+ multiple: true,
91
+ multiLine: true,
92
+ addButtonText: '新增一步',
93
+ scaffold: {
94
+ title: '标题',
95
+ items: [
96
+ {
97
+ type: 'input-text',
98
+ name: 'var1',
99
+ label: '文本'
100
+ }
101
+ ]
102
+ },
103
+ items: [
104
+ {
105
+ name: 'title',
106
+ type: 'input-text',
107
+ label: '标题',
108
+ pipeIn: (value: any, data: any) => value || data.label
109
+ },
110
+
111
+ {
112
+ type: 'fieldSet',
113
+ title: '其他设置',
114
+ collapsed: true,
115
+ collapsable: true,
116
+ className: 'fieldset m-b-none',
117
+ body: [
118
+ {
119
+ name: 'mode',
120
+ label: '展示模式',
121
+ type: 'button-group-select',
122
+ size: 'xs',
123
+ mode: 'inline',
124
+ className: 'w-full',
125
+ value: 'normal',
126
+ options: [
127
+ {
128
+ label: '默认',
129
+ value: 'normal'
130
+ },
131
+ {
132
+ label: '左右摆放',
133
+ value: 'horizontal'
134
+ },
135
+ {
136
+ label: '内联',
137
+ value: 'inline'
138
+ }
139
+ ]
140
+ },
141
+
142
+ getSchemaTpl('horizontal', {
143
+ visibleOn: 'data.mode == "horizontal"'
144
+ }),
145
+
146
+ getSchemaTpl('api', {
147
+ label: '保存接口',
148
+ description:
149
+ '如果接口返回了 <code>step</code> 变量,且数值是数字类型,比如 <code>3</code>,提交完后回跳到第 3 步'
150
+ }),
151
+
152
+ {
153
+ label: '采用异步方式?',
154
+ remark: {
155
+ trigger: 'click',
156
+ rootClose: true,
157
+ title: '什么是异步方式?',
158
+ content:
159
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
160
+ placement: 'left'
161
+ },
162
+ type: 'switch',
163
+ name: 'asyncApi',
164
+ visibleOn: 'data.api',
165
+ pipeIn: (value: any) => value != null,
166
+ pipeOut: (value: any) => (value ? '' : undefined),
167
+ mode: 'inline',
168
+ className: 'block'
169
+ },
170
+
171
+ getSchemaTpl('api', {
172
+ name: 'asyncApi',
173
+ label: '异步检测接口',
174
+ visibleOn: 'data.asyncApi != null',
175
+ description:
176
+ '设置此属性后,表单提交发送保存接口后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
177
+ }),
178
+
179
+ {
180
+ type: 'divider'
181
+ },
182
+
183
+ getSchemaTpl('api', {
184
+ name: 'initApi',
185
+ label: '初始化接口',
186
+ description: '用来初始化表单数据'
187
+ }),
188
+
189
+ {
190
+ label: '采用异步方式?',
191
+ remark: {
192
+ trigger: 'click',
193
+ rootClose: true,
194
+ title: '什么是异步方式?',
195
+ content:
196
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
197
+ placement: 'left'
198
+ },
199
+ type: 'switch',
200
+ name: 'initAsyncApi',
201
+ visibleOn: 'data.initApi',
202
+ pipeIn: (value: any) => value != null,
203
+ pipeOut: (value: any) => (value ? '' : undefined),
204
+ mode: 'inline',
205
+ className: 'block'
206
+ },
207
+
208
+ getSchemaTpl('api', {
209
+ name: 'initAsyncApi',
210
+ label: '异步检测接口',
211
+ visibleOn: 'data.initAsyncApi != null',
212
+ description:
213
+ '设置此属性后,表单请求 initApi 后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
214
+ }),
215
+
216
+ getSchemaTpl('initFetch'),
217
+
218
+ {
219
+ label: '是否可被点开',
220
+ type: 'input-text',
221
+ name: 'jumpableOn',
222
+ description:
223
+ '用表达式来决定,当前步骤是否可被点开。额外可用变量:currentStep 表示当前步骤。'
224
+ }
225
+ ]
226
+ }
227
+ ]
228
+ },
229
+ {
230
+ type: 'input-text',
231
+ name: 'startStep',
232
+ label: '起始默认值',
233
+ description:
234
+ '从第几步开始。可支持模版,但是只有在组件创建时渲染模版并设置当前步数,在之后组件被刷新时,当前step不会根据startStep改变'
235
+ }
236
+ ]
237
+ },
238
+
239
+ {
240
+ title: '接口',
241
+ body: [
242
+ getSchemaTpl('api', {
243
+ name: 'initApi',
244
+ label: '初始化接口',
245
+ description:
246
+ '用来初始化向导数据,当接口中返回 <code>step</code> 字段时,可以控制默认跳转到第几步,注意数值一定得是数字类型。当返回 <code>submiting</code> 并且当前步骤中存在异步保存接口时,可以让 wizard 初始进入异步提交状态。'
247
+ }),
248
+
249
+ {
250
+ label: '采用异步方式?',
251
+ remark: {
252
+ trigger: 'click',
253
+ rootClose: true,
254
+ title: '什么是异步方式?',
255
+ content:
256
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
257
+ placement: 'left'
258
+ },
259
+ type: 'switch',
260
+ name: 'initAsyncApi',
261
+ visibleOn: 'data.initApi',
262
+ pipeIn: (value: any) => value != null,
263
+ pipeOut: (value: any) => (value ? '' : undefined),
264
+ mode: 'inline'
265
+ },
266
+
267
+ getSchemaTpl('api', {
268
+ name: 'initAsyncApi',
269
+ label: '异步检测接口',
270
+ visibleOn: 'data.initAsyncApi != null',
271
+ description:
272
+ '设置此属性后,表单请求 initApi 后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
273
+ }),
274
+
275
+ {
276
+ name: 'initFetch',
277
+ type: 'radios',
278
+ label: '是否初始拉取',
279
+ inline: true,
280
+ onChange: () => {},
281
+ options: [
282
+ {
283
+ label: '是',
284
+ value: true
285
+ },
286
+
287
+ {
288
+ label: '否',
289
+ value: false
290
+ },
291
+
292
+ {
293
+ label: '表达式',
294
+ value: ''
295
+ }
296
+ ]
297
+ },
298
+
299
+ {
300
+ name: 'initFetch',
301
+ autoComplete: false,
302
+ visibleOn: 'typeof this.initFetch !== "boolean"',
303
+ type: 'input-text',
304
+ placeholder: '',
305
+ className: 'm-t-n-sm'
306
+ },
307
+
308
+ {
309
+ type: 'divider'
310
+ },
311
+
312
+ getSchemaTpl('api', {
313
+ label: '保存接口',
314
+ description:
315
+ '用来保存表单数据, 最后一步点击完成触发,<code>如果最后一步中已经设置保存接口,则此处设置无效。</code>'
316
+ }),
317
+
318
+ {
319
+ label: '采用异步方式?',
320
+ remark: {
321
+ trigger: 'click',
322
+ rootClose: true,
323
+ title: '什么是异步方式?',
324
+ content:
325
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
326
+ placement: 'left'
327
+ },
328
+ type: 'switch',
329
+ name: 'asyncApi',
330
+ visibleOn: 'data.api',
331
+ pipeIn: (value: any) => value != null,
332
+ pipeOut: (value: any) => (value ? '' : undefined),
333
+ mode: 'inline'
334
+ },
335
+
336
+ getSchemaTpl('api', {
337
+ name: 'asyncApi',
338
+ label: '异步检测接口',
339
+ visibleOn: 'data.asyncApi != null',
340
+ description:
341
+ '设置此属性后,表单提交发送保存接口后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
342
+ })
343
+ ]
344
+ },
345
+
346
+ {
347
+ title: '外观',
348
+ body: [
349
+ {
350
+ name: 'mode',
351
+ label: '展示模式',
352
+ type: 'button-group-select',
353
+ size: 'sm',
354
+ mode: 'inline',
355
+ className: 'w-full',
356
+ value: 'horizontal',
357
+ options: [
358
+ {
359
+ label: '水平',
360
+ value: 'horizontal'
361
+ },
362
+
363
+ {
364
+ label: '垂直',
365
+ value: 'vertical'
366
+ }
367
+ ]
368
+ },
369
+
370
+ {
371
+ name: 'actionPrevLabel',
372
+ label: '上一步按钮名称',
373
+ type: 'input-text',
374
+ pipeIn: defaultValue('上一步')
375
+ },
376
+
377
+ {
378
+ name: 'actionNextLabel',
379
+ label: '下一步按钮名称',
380
+ type: 'input-text',
381
+ pipeIn: defaultValue('下一步')
382
+ },
383
+
384
+ {
385
+ name: 'actionNextSaveLabel',
386
+ label: '保存并下一步按钮名称',
387
+ type: 'input-text',
388
+ pipeIn: defaultValue('保存并下一步')
389
+ },
390
+
391
+ {
392
+ name: 'actionFinishLabel',
393
+ label: '完成按钮名称',
394
+ type: 'input-text',
395
+ pipeIn: defaultValue('完成')
396
+ },
397
+
398
+ // {
399
+ // type: 'alert',
400
+ // level: 'info',
401
+ // body: `温馨提示:操作按钮每个步骤可以单独配置,请在右侧切换到需要单独配置的步骤后,点击下方的【自定义按钮】定制。`
402
+ // },
403
+
404
+ getSchemaTpl('className'),
405
+ getSchemaTpl('className', {
406
+ name: 'actionClassName',
407
+ label: '按钮 CSS 类名'
408
+ })
409
+ ]
410
+ },
411
+
412
+ {
413
+ title: '其他',
414
+ body: [
415
+ getSchemaTpl('ref'),
416
+ getSchemaTpl('name'),
417
+ getSchemaTpl('reload'),
418
+
419
+ {
420
+ label: '跳转',
421
+ name: 'redirect',
422
+ type: 'input-text',
423
+ description: '当设置此值后,表单提交完后跳转到目标地址。'
424
+ },
425
+
426
+ getSchemaTpl('visible')
427
+ ]
428
+ }
429
+ ])
430
+ ];
431
+
432
+ /**
433
+ * 补充切换的 toolbar
434
+ * @param context
435
+ * @param toolbars
436
+ */
437
+ buildEditorToolbar(
438
+ context: BaseEventContext,
439
+ toolbars: Array<BasicToolbarItem>
440
+ ) {
441
+ if (
442
+ context.info.plugin === this &&
443
+ context.info.renderer.name === this.rendererName &&
444
+ !context.info.hostId
445
+ ) {
446
+ const node = context.node;
447
+
448
+ toolbars.push({
449
+ level: 'secondary',
450
+ icon: 'fa fa-chevron-left',
451
+ tooltip: '上个步骤',
452
+ onClick: () => {
453
+ const control = node.getComponent();
454
+
455
+ if (control?.gotoStep) {
456
+ const currentIndex = control.state.currentStep;
457
+ control.gotoStep(currentIndex - 1);
458
+ }
459
+ }
460
+ });
461
+
462
+ toolbars.push({
463
+ level: 'secondary',
464
+ icon: 'fa fa-chevron-right',
465
+ tooltip: '下个步骤',
466
+ onClick: () => {
467
+ const control = node.getComponent();
468
+
469
+ if (control?.gotoStep) {
470
+ const currentIndex = control.state.currentStep;
471
+ control.gotoStep(currentIndex + 1);
472
+ }
473
+ }
474
+ });
475
+ }
476
+ }
477
+
478
+ filterProps(props: any) {
479
+ props.affixFooter = false;
480
+
481
+ return props;
482
+ }
483
+
484
+ patchContainers = ['steps.body'];
485
+ vRendererConfig: VRendererConfig = {
486
+ regions: {
487
+ body: {
488
+ key: 'body',
489
+ label: '表单集合',
490
+ wrapperResolve: (dom: HTMLElement) => dom
491
+ },
492
+ actions: {
493
+ label: '按钮组',
494
+ key: 'actions',
495
+ preferTag: '按钮',
496
+ wrapperResolve: (dom: HTMLElement) => dom
497
+ }
498
+ },
499
+ panelTitle: '步骤',
500
+ panelBodyCreator: (context: BaseEventContext) => {
501
+ return getSchemaTpl('tabs', [
502
+ {
503
+ title: '常规',
504
+ body: [
505
+ {
506
+ name: 'title',
507
+ type: 'input-text',
508
+ label: '标题',
509
+ pipeIn: (value: any, data: any) => value || data.label
510
+ },
511
+ getSchemaTpl('api', {
512
+ label: '保存接口',
513
+ description:
514
+ '如果接口返回了 <code>step</code> 变量,且数值是数字类型,比如 <code>3</code>,提交完后回跳到第 3 步'
515
+ }),
516
+ {
517
+ label: '采用异步方式?',
518
+ remark: {
519
+ trigger: 'click',
520
+ rootClose: true,
521
+ title: '什么是异步方式?',
522
+ content:
523
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
524
+ placement: 'left'
525
+ },
526
+ type: 'switch',
527
+ name: 'asyncApi',
528
+ visibleOn: 'data.api',
529
+ pipeIn: (value: any) => value != null,
530
+ pipeOut: (value: any) => (value ? '' : undefined),
531
+ mode: 'inline',
532
+ className: 'block'
533
+ },
534
+ getSchemaTpl('api', {
535
+ name: 'asyncApi',
536
+ label: '异步检测接口',
537
+ visibleOn: 'data.asyncApi != null',
538
+ description:
539
+ '设置此属性后,表单提交发送保存接口后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
540
+ }),
541
+ {
542
+ type: 'divider'
543
+ },
544
+ getSchemaTpl('api', {
545
+ name: 'initApi',
546
+ label: '初始化接口',
547
+ description: '用来初始化表单数据'
548
+ }),
549
+ {
550
+ label: '采用异步方式?',
551
+ remark: {
552
+ trigger: 'click',
553
+ rootClose: true,
554
+ title: '什么是异步方式?',
555
+ content:
556
+ '异步方式主要用来解决请求超时问题,启用异步方式后,程序会在请求完后,定时轮询请求额外的接口用来咨询操作是否完成。所以接口可以快速的返回,而不需要等待流程真正完成。',
557
+ placement: 'left'
558
+ },
559
+ type: 'switch',
560
+ name: 'initAsyncApi',
561
+ visibleOn: 'data.initApi',
562
+ pipeIn: (value: any) => value != null,
563
+ pipeOut: (value: any) => (value ? '' : undefined),
564
+ mode: 'inline',
565
+ className: 'block'
566
+ },
567
+ getSchemaTpl('api', {
568
+ name: 'initAsyncApi',
569
+ label: '异步检测接口',
570
+ visibleOn: 'data.initAsyncApi != null',
571
+ description:
572
+ '设置此属性后,表单请求 initApi 后,还会继续轮训请求该接口,直到返回 finished 属性为 true 才 结束'
573
+ }),
574
+ getSchemaTpl('initFetch')
575
+ ]
576
+ },
577
+ {
578
+ title: '外观',
579
+ body: [
580
+ {
581
+ name: 'mode',
582
+ label: '展示模式',
583
+ type: 'button-group-select',
584
+ size: 'xs',
585
+ mode: 'inline',
586
+ className: 'w-full',
587
+ value: 'normal',
588
+ options: [
589
+ {
590
+ label: '默认',
591
+ value: 'normal'
592
+ },
593
+ {
594
+ label: '左右摆放',
595
+ value: 'horizontal'
596
+ },
597
+ {
598
+ label: '内联',
599
+ value: 'inline'
600
+ }
601
+ ]
602
+ },
603
+ getSchemaTpl('horizontal', {
604
+ visibleOn: 'data.mode == "horizontal"'
605
+ })
606
+ // getSchemaTpl('className', {
607
+ // name: 'tabClassName',
608
+ // label: '选项卡成员 CSS 类名'
609
+ // })
610
+ ]
611
+ },
612
+ {
613
+ title: '其他',
614
+ body: [
615
+ {
616
+ label: '是否可被点开',
617
+ type: 'input-text',
618
+ name: 'jumpableOn',
619
+ description:
620
+ '用表达式来决定,当前步骤是否可被点开。额外可用变量:currentStep 表示当前步骤。'
621
+ }
622
+ ]
623
+ }
624
+ ]);
625
+ }
626
+ };
627
+
628
+ wizardWrapperResolve = (dom: HTMLElement) =>
629
+ [].slice.call(
630
+ dom.querySelectorAll('[role="wizard-body"],[role="wizard-footer"]')
631
+ );
632
+ overrides = {
633
+ renderWizard: function (this: any) {
634
+ const info: RendererInfo = this.props.$$editor;
635
+ const steps = this.props.steps;
636
+ const currentStep = this.state.currentStep;
637
+ const dom = this.super();
638
+
639
+ if (!info || !steps?.[currentStep - 1]) {
640
+ return dom;
641
+ }
642
+
643
+ const index = currentStep - 1;
644
+ const step = steps[index];
645
+ const id = step.$$id;
646
+ const plugin: WizardPlugin = info.plugin as any;
647
+
648
+ return mapReactElement(dom, (child: JSX.Element) => {
649
+ if (/Wizard-step\b/.test(child.props.className)) {
650
+ return (
651
+ <VRenderer
652
+ key={id}
653
+ plugin={info.plugin}
654
+ renderer={info.renderer}
655
+ $schema="/schemas/WizardStepSchema.json"
656
+ hostId={info.id}
657
+ memberIndex={index}
658
+ name={step.title || `步骤${index + 1}`}
659
+ id={id}
660
+ draggable={false}
661
+ wrapperResolve={plugin.wizardWrapperResolve}
662
+ schemaPath={`${info.schemaPath}/steps/${index}`}
663
+ path={`${this.props.$path}/${index}`} // 好像没啥用
664
+ data={this.props.data} // 好像没啥用
665
+ >
666
+ {mapReactElement(child, (child2: any, index: number) => {
667
+ if (child2.props.schema?.body && child2.props.schema.$$id) {
668
+ const region = plugin.vRendererConfig?.regions?.body;
669
+
670
+ if (!region) {
671
+ return child2;
672
+ }
673
+
674
+ const schema = {
675
+ ...child2.props.schema
676
+ };
677
+ delete schema.$$id;
678
+ return (
679
+ <Region
680
+ key={region.key}
681
+ preferTag={region.preferTag}
682
+ name={region.key}
683
+ label={region.label}
684
+ regionConfig={region}
685
+ placeholder={region.placeholder}
686
+ editorStore={plugin.manager.store}
687
+ manager={plugin.manager}
688
+ children={React.cloneElement(child2, {
689
+ schema: schema
690
+ })}
691
+ wrapperResolve={region.wrapperResolve}
692
+ rendererName={info.renderer.name}
693
+ />
694
+ );
695
+ }
696
+
697
+ return child2;
698
+ })}
699
+ </VRenderer>
700
+ );
701
+ }
702
+
703
+ return child;
704
+ });
705
+ },
706
+
707
+ renderFooter: function (this: any) {
708
+ const info: RendererInfo = this.props.$$editor;
709
+ const steps = this.props.steps;
710
+ const currentStep = this.state.currentStep;
711
+ const dom = this.super();
712
+
713
+ if (!info || !steps?.[currentStep - 1]) {
714
+ return dom;
715
+ }
716
+
717
+ const plugin: WizardPlugin = info.plugin as any;
718
+ const region = plugin.vRendererConfig?.regions?.actions;
719
+
720
+ if (!region) {
721
+ return dom;
722
+ }
723
+
724
+ return (
725
+ <Region
726
+ key={region.key}
727
+ preferTag={region.preferTag}
728
+ name={region.key}
729
+ label={region.label}
730
+ regionConfig={region}
731
+ placeholder={region.placeholder}
732
+ editorStore={plugin.manager.store}
733
+ manager={plugin.manager}
734
+ children={dom}
735
+ wrapperResolve={region.wrapperResolve}
736
+ rendererName={info.renderer.name}
737
+ />
738
+ );
739
+ }
740
+ };
741
+ }
742
+
743
+ registerEditorPlugin(WizardPlugin);