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