jobsys-explore 4.6.21 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.eslintignore +3 -3
  2. package/CHANGELOG.md +542 -542
  3. package/README.md +41 -41
  4. package/TODOs.md +8 -8
  5. package/business-components/survey/ExSurvey.jsx +193 -193
  6. package/business-components/survey/index.js +5 -5
  7. package/business-components/survey/index.less +36 -36
  8. package/components/button/ExButton.jsx +120 -120
  9. package/components/button/index.js +4 -4
  10. package/components/button/index.less +7 -7
  11. package/components/decorator/ExDecorator.jsx +31 -31
  12. package/components/decorator/index.js +5 -5
  13. package/components/decorator/index.less +76 -76
  14. package/components/form/ExAddress.jsx +195 -195
  15. package/components/form/ExCascader.jsx +171 -171
  16. package/components/form/ExCheckbox.jsx +59 -59
  17. package/components/form/ExDate.jsx +143 -143
  18. package/components/form/ExDatetime.jsx +166 -166
  19. package/components/form/ExField.jsx +138 -138
  20. package/components/form/ExFieldUploader.jsx +50 -50
  21. package/components/form/ExForm.jsx +544 -544
  22. package/components/form/ExMatrixCheckbox.jsx +99 -99
  23. package/components/form/ExMatrixRadio.jsx +86 -86
  24. package/components/form/ExMatrixScale.jsx +97 -97
  25. package/components/form/ExNumber.jsx +51 -51
  26. package/components/form/ExRadio.jsx +58 -58
  27. package/components/form/ExRate.jsx +51 -51
  28. package/components/form/ExSelect.jsx +251 -251
  29. package/components/form/ExSlider.jsx +55 -55
  30. package/components/form/ExSwitch.jsx +51 -51
  31. package/components/form/ExTime.jsx +99 -99
  32. package/components/form/FormItem.jsx +307 -307
  33. package/components/form/PickerWrapper.jsx +120 -120
  34. package/components/form/index.js +46 -46
  35. package/components/form/index.less +178 -178
  36. package/components/form/utils.js +62 -62
  37. package/components/grid/ExGrid.jsx +53 -53
  38. package/components/grid/index.js +4 -4
  39. package/components/grid/index.less +2 -2
  40. package/components/index.js +12 -12
  41. package/components/pagination/ExPagination.jsx +457 -440
  42. package/components/pagination/index.js +5 -5
  43. package/components/pagination/index.less +3 -3
  44. package/components/provider/ExProvider.jsx +173 -173
  45. package/components/qrcode/ExQrcode.jsx +86 -86
  46. package/components/qrcode/index.js +5 -5
  47. package/components/qrcode/index.less +8 -8
  48. package/components/result/ExResult.jsx +122 -122
  49. package/components/result/index.js +5 -5
  50. package/components/result/index.less +59 -59
  51. package/components/search/ExSearch.jsx +370 -326
  52. package/components/search/components/Expand.jsx +77 -77
  53. package/components/search/components/Field.jsx +27 -27
  54. package/components/search/components/Quick.jsx +57 -57
  55. package/components/search/components/index.js +5 -5
  56. package/components/search/index.js +5 -5
  57. package/components/search/index.less +118 -118
  58. package/components/search/utils.js +30 -30
  59. package/components/sector/ExSector.jsx +52 -52
  60. package/components/sector/README.md +26 -26
  61. package/components/sector/index.js +5 -5
  62. package/components/sector/index.less +122 -122
  63. package/components/theme/ExTheme.jsx +10 -10
  64. package/components/theme/index.js +4 -4
  65. package/components/theme/index.less +98 -98
  66. package/components/uploader/ExUploader.jsx +293 -293
  67. package/components/uploader/index.js +5 -5
  68. package/components/utils.js +187 -187
  69. package/directives/auth.js +113 -113
  70. package/directives/index.js +4 -4
  71. package/dist/cipher-98df1050.cjs.map +1 -1
  72. package/dist/cipher-f2ed5ee6.js.map +1 -1
  73. package/dist/directives.cjs.map +1 -1
  74. package/dist/directives.js.map +1 -1
  75. package/dist/hooks.cjs.map +1 -1
  76. package/dist/hooks.js.map +1 -1
  77. package/dist/jobsys-explore.cjs +6 -6
  78. package/dist/jobsys-explore.cjs.map +1 -1
  79. package/dist/jobsys-explore.js +464 -407
  80. package/dist/jobsys-explore.js.map +1 -1
  81. package/docgen.config.js +15 -15
  82. package/docs/.vuepress/.cache/deps/_metadata.json +52 -52
  83. package/docs/.vuepress/.cache/deps/lodash-es.js +8442 -8442
  84. package/docs/.vuepress/.cache/deps/lodash-es.js.map +7 -7
  85. package/docs/.vuepress/.temp/internal/clientConfigs.js +17 -17
  86. package/docs/.vuepress/.temp/internal/pagesComponents.js +24 -24
  87. package/docs/.vuepress/.temp/internal/pagesData.js +22 -22
  88. package/docs/.vuepress/.temp/internal/pagesRoutes.js +12 -12
  89. package/docs/.vuepress/.temp/internal/themeData.js +1 -1
  90. package/docs/.vuepress/.temp/pages/components/decorator/ExDecorator.html.js +1 -1
  91. package/docs/.vuepress/.temp/pages/components/decorator/ExDecorator.html.vue +37 -37
  92. package/docs/.vuepress/.temp/pages/components/sector/ExSector.html.js +1 -1
  93. package/docs/.vuepress/.temp/pages/components/sector/ExSector.html.vue +71 -71
  94. package/docs/.vuepress/.temp/styles/index.scss +1 -1
  95. package/docs/.vuepress/config.js +61 -61
  96. package/docs/.vuepress/dist/404.html +33 -33
  97. package/docs/.vuepress/dist/assets/404.html-a0ce2184.js +1 -1
  98. package/docs/.vuepress/dist/assets/ExButton.html-ad283101.js +1 -1
  99. package/docs/.vuepress/dist/assets/ExDecorator.html-42d09114.js +1 -1
  100. package/docs/.vuepress/dist/assets/ExDecorator.html-c82c5fe8.js +1 -1
  101. package/docs/.vuepress/dist/assets/ExForm.html-9e3f8000.js +1 -1
  102. package/docs/.vuepress/dist/assets/ExProvider.html-78fdc6cd.js +1 -1
  103. package/docs/.vuepress/dist/assets/ExSearch.html-103f6f34.js +1 -1
  104. package/docs/.vuepress/dist/assets/ExSector.html-a1e24c3a.js +7 -7
  105. package/docs/.vuepress/dist/assets/ExSector.html-cff3fefd.js +1 -1
  106. package/docs/.vuepress/dist/assets/ExUploader.html-8310e424.js +1 -1
  107. package/docs/.vuepress/dist/assets/app-29fe8d1e.js +10 -10
  108. package/docs/.vuepress/dist/assets/hooks.html-90ccbc1a.js +1 -1
  109. package/docs/.vuepress/dist/assets/index.html-85b79c97.js +43 -43
  110. package/docs/.vuepress/dist/assets/style-46d7e227.css +1 -1
  111. package/docs/.vuepress/dist/components/button/ExButton.html +33 -33
  112. package/docs/.vuepress/dist/components/decorator/ExDecorator.html +33 -33
  113. package/docs/.vuepress/dist/components/form/ExForm.html +33 -33
  114. package/docs/.vuepress/dist/components/provider/ExProvider.html +33 -33
  115. package/docs/.vuepress/dist/components/search/ExSearch.html +33 -33
  116. package/docs/.vuepress/dist/components/sector/ExSector.html +39 -39
  117. package/docs/.vuepress/dist/components/uploader/ExUploader.html +33 -33
  118. package/docs/.vuepress/dist/hooks.html +33 -33
  119. package/docs/.vuepress/dist/index.html +75 -75
  120. package/docs/.vuepress/styles/index.scss +7 -7
  121. package/docs/components/decorator/ExDecorator.md +14 -14
  122. package/docs/components/sector/ExSector.md +43 -43
  123. package/docs/index.md +82 -82
  124. package/hooks/cipher.js +44 -44
  125. package/hooks/datetime.js +69 -69
  126. package/hooks/form.js +188 -188
  127. package/hooks/utils.js +282 -282
  128. package/index.html +17 -17
  129. package/package.json +1 -1
  130. package/playground/App.vue +191 -191
  131. package/playground/TestButton.vue +61 -61
  132. package/playground/TestCascader.vue +2442 -2442
  133. package/playground/TestDecorator.vue +14 -14
  134. package/playground/TestForm.vue +429 -429
  135. package/playground/TestFormItem.vue +110 -110
  136. package/playground/TestGrid.vue +22 -22
  137. package/playground/TestPagination.vue +1250 -1248
  138. package/playground/TestQrcode.vue +7 -7
  139. package/playground/TestResult.vue +12 -12
  140. package/playground/TestSearch.vue +115 -115
  141. package/playground/TestSector.vue +15 -15
  142. package/playground/TestSurvey.vue +27 -27
  143. package/playground/TestUploader.vue +14 -14
  144. package/playground/main.js +22 -22
  145. package/utils/style.js +13 -13
  146. package/vite.config.js +54 -54
  147. package/.changeset/blue-spiders-roll.md +0 -5
  148. package/.changeset/cyan-monkeys-draw.md +0 -5
  149. package/.changeset/dry-feet-float.md +0 -5
  150. package/.changeset/empty-mice-share.md +0 -5
  151. package/.changeset/famous-yaks-doubt.md +0 -5
  152. package/.changeset/five-fans-type.md +0 -5
  153. package/.changeset/funny-hats-drop.md +0 -5
  154. package/.changeset/khaki-cobras-bathe.md +0 -5
  155. package/.changeset/khaki-forks-shave.md +0 -5
  156. package/.changeset/lazy-yaks-crash.md +0 -5
  157. package/.changeset/light-cycles-flow.md +0 -5
  158. package/.changeset/loud-mirrors-explain.md +0 -5
  159. package/.changeset/lovely-balloons-protect.md +0 -5
  160. package/.changeset/mean-pens-travel.md +0 -5
  161. package/.changeset/moody-doors-grow.md +0 -5
  162. package/.changeset/moody-laws-change.md +0 -5
  163. package/.changeset/nasty-goats-joke.md +0 -5
  164. package/.changeset/odd-forks-drop.md +0 -5
  165. package/.changeset/olive-windows-suffer.md +0 -5
  166. package/.changeset/popular-carpets-jog.md +0 -5
  167. package/.changeset/popular-planets-play.md +0 -5
  168. package/.changeset/rare-gorillas-boil.md +0 -5
  169. package/.changeset/rare-moose-teach.md +0 -5
  170. package/.changeset/sharp-tools-hope.md +0 -5
  171. package/.changeset/slimy-sloths-refuse.md +0 -5
  172. package/.changeset/slow-boats-search.md +0 -5
  173. package/.changeset/small-experts-bake.md +0 -5
  174. package/.changeset/smooth-horses-tie.md +0 -5
  175. package/.changeset/tame-feet-reply.md +0 -5
  176. package/.changeset/tidy-items-reflect.md +0 -5
  177. package/.changeset/weak-chicken-admire.md +0 -5
  178. package/.changeset/weak-rockets-compare.md +0 -5
  179. package/.changeset/wild-glasses-bathe.md +0 -5
  180. package/.changeset/wise-ears-turn.md +0 -5
@@ -1,307 +1,307 @@
1
- import { inject } from "vue"
2
- import { EX_UPLOADER } from "../provider/ExProvider.jsx"
3
- import { isBoolean, isFunction, isString, merge, pick } from "lodash-es"
4
- import ExField from "./ExField.jsx"
5
- import ExSelect from "./ExSelect.jsx"
6
- import ExDate from "./ExDate.jsx"
7
- import ExSwitch from "./ExSwitch.jsx"
8
- import ExCheckbox from "./ExCheckbox.jsx"
9
- import ExRadio from "./ExRadio.jsx"
10
- import ExDatetime from "./ExDatetime.jsx"
11
- import ExNumber from "./ExNumber.jsx"
12
- import ExRate from "./ExRate.jsx"
13
- import ExSlider from "./ExSlider.jsx"
14
- import ExAddress from "./ExAddress.jsx"
15
- import ExCascader from "./ExCascader.jsx"
16
- import ExTime from "./ExTime.jsx"
17
- import ExFieldUploader from "./ExFieldUploader.jsx"
18
- import ExMatrixRadio from "./ExMatrixRadio.jsx"
19
- import ExMatrixScale from "./ExMatrixScale.jsx"
20
- import ExMatrixCheckbox from "./ExMatrixCheckbox.jsx"
21
- import { Divider } from "vant"
22
-
23
- /**
24
- *
25
- * @param {FormItemConfig} item
26
- * @param {Object} submitForm
27
- * @param {Object} [props]
28
- * @param {Object} [slots]
29
- * @return {*|JSX.Element}
30
- */
31
- const render = (item, submitForm, { props, slots }) => {
32
- const uploaderProvider = inject(EX_UPLOADER, () => ({}))
33
-
34
- const pickerTypes = ["select", "date", "datetime", "time", "address", "cascade"]
35
- const isPicker = pickerTypes.includes(item.type)
36
-
37
- // ExField 的 props
38
- const fieldPropsList = ["placeholder", "help", "append", "required", "disabled", "rules", "readonly", "isLink", "fieldProps"]
39
- let fieldProps = pick(item, fieldPropsList)
40
-
41
- fieldProps.required = isFunction(fieldProps.required) ? fieldProps.required(submitForm) : fieldProps.required
42
- fieldProps.disabled = isFunction(fieldProps.disabled) ? fieldProps.disabled(submitForm) : fieldProps.disabled
43
-
44
- fieldProps = { readonly: props.readonly, disabled: props.disabled, ...fieldProps }
45
-
46
- if (fieldProps.readonly || fieldProps.disabled) {
47
- fieldProps.required = false
48
- }
49
-
50
- fieldProps.label = item.title
51
- fieldProps.name = item.key
52
- fieldProps.placeholder = fieldProps.placeholder || (isPicker ? `请选择${item.title}` : `请填写${item.title}`)
53
- fieldProps.rules = fieldProps.rules?.length
54
- ? fieldProps.rules.map((rule) =>
55
- rule.pattern
56
- ? {
57
- ...rule,
58
- pattern: new RegExp(rule.pattern),
59
- }
60
- : { ...rule },
61
- )
62
- : []
63
-
64
- // 具体组件的 props
65
- const componentProps = merge(pick(item, ["options", "defaultProps", "rows"]), item.exProps || {})
66
-
67
- //混合了Field和input slot组件的slots组合
68
- const componentSlots = item.defaultSlots || {}
69
-
70
- item.type = item.type ? item.type.toLowerCase() : item.type
71
-
72
- //特殊:readonly 的情况下不显示 required
73
- if (fieldProps.required) {
74
- fieldProps.rules.push({
75
- required: true,
76
- message: isPicker ? `请选择${item.title}` : `请填写${item.title}`,
77
- trigger: isPicker ? "onChange" : "onBlur", //特意
78
- })
79
- }
80
-
81
- //特殊:readonly 情况下不显示 placeholder
82
- if (fieldProps.readonly || fieldProps.disabled) {
83
- fieldProps.placeholder = "--"
84
- }
85
-
86
- let renderItem = null
87
-
88
- // 处理 hidden
89
- if ((isFunction(item.hidden) && item.hidden(submitForm)) || (isBoolean(item.hidden) && item.hidden)) {
90
- return null
91
- } else if (item.type === "slot" && slots[item.key]) {
92
- return slots[item.key]({ submitForm })
93
- } else if (item.customRender) {
94
- renderItem = item.customRender({ submitForm, item })
95
- if (!renderItem) {
96
- return null
97
- }
98
- } else if (item.match) {
99
- // 匹配模式, 合并选项后需要移除 match
100
- const matchItem = { ...item, ...item.match(submitForm), match: null }
101
- return render(matchItem, submitForm, { props, slots })
102
- } else {
103
- switch (item.type) {
104
- case "select":
105
- renderItem = (
106
- <ExSelect v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
107
- {componentSlots}
108
- </ExSelect>
109
- )
110
- break
111
- case "date":
112
- renderItem = (
113
- <ExDate v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
114
- {componentSlots}
115
- </ExDate>
116
- )
117
- break
118
- case "datetime":
119
- renderItem = (
120
- <ExDatetime v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
121
- {componentSlots}
122
- </ExDatetime>
123
- )
124
- break
125
- case "time":
126
- renderItem = (
127
- <ExTime v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
128
- {componentSlots}
129
- </ExTime>
130
- )
131
- break
132
- case "switch":
133
- renderItem = (
134
- <ExSwitch v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
135
- {componentSlots}
136
- </ExSwitch>
137
- )
138
- break
139
- case "radio":
140
- renderItem = (
141
- <ExRadio v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
142
- {componentSlots}
143
- </ExRadio>
144
- )
145
- break
146
- case "checkbox":
147
- renderItem = (
148
- <ExCheckbox v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
149
- {componentSlots}
150
- </ExCheckbox>
151
- )
152
- break
153
- case "address":
154
- renderItem = (
155
- <ExAddress v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
156
- {componentSlots}
157
- </ExAddress>
158
- )
159
- break
160
- case "cascade":
161
- renderItem = (
162
- <ExCascader v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
163
- {componentSlots}
164
- </ExCascader>
165
- )
166
- break
167
- case "number":
168
- renderItem = (
169
- <ExNumber v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
170
- {componentSlots}
171
- </ExNumber>
172
- )
173
- break
174
- case "rate":
175
- renderItem = (
176
- <ExRate v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
177
- {componentSlots}
178
- </ExRate>
179
- )
180
- break
181
- case "slider":
182
- renderItem = (
183
- <ExSlider v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
184
- {componentSlots}
185
- </ExSlider>
186
- )
187
- break
188
- case "uploader":
189
- renderItem = (
190
- <ExFieldUploader v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
191
- {componentSlots}
192
- </ExFieldUploader>
193
- )
194
- if (item.required) {
195
- if (!Object.keys(uploaderProvider).length) {
196
- console.error("请在根组件中注入 NEWBIE_UPLOADER 配置项")
197
- renderItem = null
198
- break
199
- }
200
-
201
- /*if (item.defaultProps?.maxNum && item.defaultProps?.maxNum > 1) {
202
- rules.type = "array"
203
- rules.message = `请上传${item.title}`
204
- } else {
205
- rules = {
206
- type: "object",
207
- required: true,
208
- message: `请上传${item.title}`,
209
- fields: {
210
- [uploaderProvider.path]: {
211
- type: "string",
212
- required: true,
213
- message: `请上传${item.title}`,
214
- },
215
- },
216
- }
217
- }*/
218
- }
219
- break
220
- /* case "html":
221
- renderItem = Fields.createHtml(item, submitForm)
222
- break
223
-
224
- case "text":
225
- renderItem = Fields.createText(item, submitForm)
226
- break
227
- case "group":
228
- renderItem = Fields.createGroup(item, submitForm, { provider: { uploaderProvider } })
229
- break*/
230
- case "textarea":
231
- fieldProps.type = "textarea"
232
- renderItem = (
233
- <ExField v-model={submitForm[item.key]} {...fieldProps}>
234
- {componentSlots}
235
- </ExField>
236
- )
237
- break
238
- case "password":
239
- fieldProps.type = "password"
240
- renderItem = (
241
- <ExField v-model={submitForm[item.key]} {...fieldProps}>
242
- {componentSlots}
243
- </ExField>
244
- )
245
- break
246
- case "matrix-radio": {
247
- if (item.required) {
248
- fieldProps.rules[fieldProps.rules.length - 1].validator = () => {
249
- for (let i = 0; i < item.rows.length; i++) {
250
- if (!submitForm[item.key][item.rows[i]]) {
251
- return `请选择${item.rows[i]}`
252
- }
253
- }
254
- return true
255
- }
256
- }
257
- renderItem = <ExMatrixRadio v-model={submitForm[item.key]} {...componentProps} {...fieldProps} />
258
- break
259
- }
260
- case "matrix-scale": {
261
- if (item.required) {
262
- fieldProps.rules[fieldProps.rules.length - 1].validator = () => {
263
- for (let i = 0; i < item.rows.length; i++) {
264
- if (!submitForm[item.key][item.rows[i]]) {
265
- return `请选择${item.rows[i]}`
266
- }
267
- }
268
- return true
269
- }
270
- }
271
- renderItem = <ExMatrixScale v-model={submitForm[item.key]} {...componentProps} {...fieldProps} />
272
- break
273
- }
274
- case "matrix-checkbox": {
275
- if (item.required) {
276
- fieldProps.rules[fieldProps.rules.length - 1].validator = () => {
277
- for (let i = 0; i < item.rows.length; i++) {
278
- if (!submitForm[item.key][item.rows[i]]) {
279
- return `请选择${item.rows[i]}`
280
- }
281
- }
282
- return true
283
- }
284
- }
285
- renderItem = <ExMatrixCheckbox v-model={submitForm[item.key]} {...componentProps} {...fieldProps} />
286
- break
287
- }
288
- default:
289
- renderItem = (
290
- <ExField v-model={submitForm[item.key]} {...fieldProps}>
291
- {componentSlots}
292
- </ExField>
293
- )
294
- break
295
- }
296
- }
297
-
298
- const formItem = [renderItem]
299
-
300
- if (item.break) {
301
- formItem.unshift(<Divider {...props.dividerProps}>{{ default: () => (isString(item.break) ? item.break : null) }}</Divider>)
302
- }
303
-
304
- return formItem
305
- }
306
-
307
- export default render
1
+ import { inject } from "vue"
2
+ import { EX_UPLOADER } from "../provider/ExProvider.jsx"
3
+ import { isBoolean, isFunction, isString, merge, pick } from "lodash-es"
4
+ import ExField from "./ExField.jsx"
5
+ import ExSelect from "./ExSelect.jsx"
6
+ import ExDate from "./ExDate.jsx"
7
+ import ExSwitch from "./ExSwitch.jsx"
8
+ import ExCheckbox from "./ExCheckbox.jsx"
9
+ import ExRadio from "./ExRadio.jsx"
10
+ import ExDatetime from "./ExDatetime.jsx"
11
+ import ExNumber from "./ExNumber.jsx"
12
+ import ExRate from "./ExRate.jsx"
13
+ import ExSlider from "./ExSlider.jsx"
14
+ import ExAddress from "./ExAddress.jsx"
15
+ import ExCascader from "./ExCascader.jsx"
16
+ import ExTime from "./ExTime.jsx"
17
+ import ExFieldUploader from "./ExFieldUploader.jsx"
18
+ import ExMatrixRadio from "./ExMatrixRadio.jsx"
19
+ import ExMatrixScale from "./ExMatrixScale.jsx"
20
+ import ExMatrixCheckbox from "./ExMatrixCheckbox.jsx"
21
+ import { Divider } from "vant"
22
+
23
+ /**
24
+ *
25
+ * @param {FormItemConfig} item
26
+ * @param {Object} submitForm
27
+ * @param {Object} [props]
28
+ * @param {Object} [slots]
29
+ * @return {*|JSX.Element}
30
+ */
31
+ const render = (item, submitForm, { props, slots }) => {
32
+ const uploaderProvider = inject(EX_UPLOADER, () => ({}))
33
+
34
+ const pickerTypes = ["select", "date", "datetime", "time", "address", "cascade"]
35
+ const isPicker = pickerTypes.includes(item.type)
36
+
37
+ // ExField 的 props
38
+ const fieldPropsList = ["placeholder", "help", "append", "required", "disabled", "rules", "readonly", "isLink", "fieldProps"]
39
+ let fieldProps = pick(item, fieldPropsList)
40
+
41
+ fieldProps.required = isFunction(fieldProps.required) ? fieldProps.required(submitForm) : fieldProps.required
42
+ fieldProps.disabled = isFunction(fieldProps.disabled) ? fieldProps.disabled(submitForm) : fieldProps.disabled
43
+
44
+ fieldProps = { readonly: props.readonly, disabled: props.disabled, ...fieldProps }
45
+
46
+ if (fieldProps.readonly || fieldProps.disabled) {
47
+ fieldProps.required = false
48
+ }
49
+
50
+ fieldProps.label = item.title
51
+ fieldProps.name = item.key
52
+ fieldProps.placeholder = fieldProps.placeholder || (isPicker ? `请选择${item.title}` : `请填写${item.title}`)
53
+ fieldProps.rules = fieldProps.rules?.length
54
+ ? fieldProps.rules.map((rule) =>
55
+ rule.pattern
56
+ ? {
57
+ ...rule,
58
+ pattern: new RegExp(rule.pattern),
59
+ }
60
+ : { ...rule },
61
+ )
62
+ : []
63
+
64
+ // 具体组件的 props
65
+ const componentProps = merge(pick(item, ["options", "defaultProps", "rows"]), item.exProps || {})
66
+
67
+ //混合了Field和input slot组件的slots组合
68
+ const componentSlots = item.defaultSlots || {}
69
+
70
+ item.type = item.type ? item.type.toLowerCase() : item.type
71
+
72
+ //特殊:readonly 的情况下不显示 required
73
+ if (fieldProps.required) {
74
+ fieldProps.rules.push({
75
+ required: true,
76
+ message: isPicker ? `请选择${item.title}` : `请填写${item.title}`,
77
+ trigger: isPicker ? "onChange" : "onBlur", //特意
78
+ })
79
+ }
80
+
81
+ //特殊:readonly 情况下不显示 placeholder
82
+ if (fieldProps.readonly || fieldProps.disabled) {
83
+ fieldProps.placeholder = "--"
84
+ }
85
+
86
+ let renderItem = null
87
+
88
+ // 处理 hidden
89
+ if ((isFunction(item.hidden) && item.hidden(submitForm)) || (isBoolean(item.hidden) && item.hidden)) {
90
+ return null
91
+ } else if (item.type === "slot" && slots[item.key]) {
92
+ return slots[item.key]({ submitForm })
93
+ } else if (item.customRender) {
94
+ renderItem = item.customRender({ submitForm, item })
95
+ if (!renderItem) {
96
+ return null
97
+ }
98
+ } else if (item.match) {
99
+ // 匹配模式, 合并选项后需要移除 match
100
+ const matchItem = { ...item, ...item.match(submitForm), match: null }
101
+ return render(matchItem, submitForm, { props, slots })
102
+ } else {
103
+ switch (item.type) {
104
+ case "select":
105
+ renderItem = (
106
+ <ExSelect v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
107
+ {componentSlots}
108
+ </ExSelect>
109
+ )
110
+ break
111
+ case "date":
112
+ renderItem = (
113
+ <ExDate v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
114
+ {componentSlots}
115
+ </ExDate>
116
+ )
117
+ break
118
+ case "datetime":
119
+ renderItem = (
120
+ <ExDatetime v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
121
+ {componentSlots}
122
+ </ExDatetime>
123
+ )
124
+ break
125
+ case "time":
126
+ renderItem = (
127
+ <ExTime v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
128
+ {componentSlots}
129
+ </ExTime>
130
+ )
131
+ break
132
+ case "switch":
133
+ renderItem = (
134
+ <ExSwitch v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
135
+ {componentSlots}
136
+ </ExSwitch>
137
+ )
138
+ break
139
+ case "radio":
140
+ renderItem = (
141
+ <ExRadio v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
142
+ {componentSlots}
143
+ </ExRadio>
144
+ )
145
+ break
146
+ case "checkbox":
147
+ renderItem = (
148
+ <ExCheckbox v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
149
+ {componentSlots}
150
+ </ExCheckbox>
151
+ )
152
+ break
153
+ case "address":
154
+ renderItem = (
155
+ <ExAddress v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
156
+ {componentSlots}
157
+ </ExAddress>
158
+ )
159
+ break
160
+ case "cascade":
161
+ renderItem = (
162
+ <ExCascader v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
163
+ {componentSlots}
164
+ </ExCascader>
165
+ )
166
+ break
167
+ case "number":
168
+ renderItem = (
169
+ <ExNumber v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
170
+ {componentSlots}
171
+ </ExNumber>
172
+ )
173
+ break
174
+ case "rate":
175
+ renderItem = (
176
+ <ExRate v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
177
+ {componentSlots}
178
+ </ExRate>
179
+ )
180
+ break
181
+ case "slider":
182
+ renderItem = (
183
+ <ExSlider v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
184
+ {componentSlots}
185
+ </ExSlider>
186
+ )
187
+ break
188
+ case "uploader":
189
+ renderItem = (
190
+ <ExFieldUploader v-model={submitForm[item.key]} {...componentProps} {...fieldProps}>
191
+ {componentSlots}
192
+ </ExFieldUploader>
193
+ )
194
+ if (item.required) {
195
+ if (!Object.keys(uploaderProvider).length) {
196
+ console.error("请在根组件中注入 NEWBIE_UPLOADER 配置项")
197
+ renderItem = null
198
+ break
199
+ }
200
+
201
+ /*if (item.defaultProps?.maxNum && item.defaultProps?.maxNum > 1) {
202
+ rules.type = "array"
203
+ rules.message = `请上传${item.title}`
204
+ } else {
205
+ rules = {
206
+ type: "object",
207
+ required: true,
208
+ message: `请上传${item.title}`,
209
+ fields: {
210
+ [uploaderProvider.path]: {
211
+ type: "string",
212
+ required: true,
213
+ message: `请上传${item.title}`,
214
+ },
215
+ },
216
+ }
217
+ }*/
218
+ }
219
+ break
220
+ /* case "html":
221
+ renderItem = Fields.createHtml(item, submitForm)
222
+ break
223
+
224
+ case "text":
225
+ renderItem = Fields.createText(item, submitForm)
226
+ break
227
+ case "group":
228
+ renderItem = Fields.createGroup(item, submitForm, { provider: { uploaderProvider } })
229
+ break*/
230
+ case "textarea":
231
+ fieldProps.type = "textarea"
232
+ renderItem = (
233
+ <ExField v-model={submitForm[item.key]} {...fieldProps}>
234
+ {componentSlots}
235
+ </ExField>
236
+ )
237
+ break
238
+ case "password":
239
+ fieldProps.type = "password"
240
+ renderItem = (
241
+ <ExField v-model={submitForm[item.key]} {...fieldProps}>
242
+ {componentSlots}
243
+ </ExField>
244
+ )
245
+ break
246
+ case "matrix-radio": {
247
+ if (item.required) {
248
+ fieldProps.rules[fieldProps.rules.length - 1].validator = () => {
249
+ for (let i = 0; i < item.rows.length; i++) {
250
+ if (!submitForm[item.key][item.rows[i]]) {
251
+ return `请选择${item.rows[i]}`
252
+ }
253
+ }
254
+ return true
255
+ }
256
+ }
257
+ renderItem = <ExMatrixRadio v-model={submitForm[item.key]} {...componentProps} {...fieldProps} />
258
+ break
259
+ }
260
+ case "matrix-scale": {
261
+ if (item.required) {
262
+ fieldProps.rules[fieldProps.rules.length - 1].validator = () => {
263
+ for (let i = 0; i < item.rows.length; i++) {
264
+ if (!submitForm[item.key][item.rows[i]]) {
265
+ return `请选择${item.rows[i]}`
266
+ }
267
+ }
268
+ return true
269
+ }
270
+ }
271
+ renderItem = <ExMatrixScale v-model={submitForm[item.key]} {...componentProps} {...fieldProps} />
272
+ break
273
+ }
274
+ case "matrix-checkbox": {
275
+ if (item.required) {
276
+ fieldProps.rules[fieldProps.rules.length - 1].validator = () => {
277
+ for (let i = 0; i < item.rows.length; i++) {
278
+ if (!submitForm[item.key][item.rows[i]]) {
279
+ return `请选择${item.rows[i]}`
280
+ }
281
+ }
282
+ return true
283
+ }
284
+ }
285
+ renderItem = <ExMatrixCheckbox v-model={submitForm[item.key]} {...componentProps} {...fieldProps} />
286
+ break
287
+ }
288
+ default:
289
+ renderItem = (
290
+ <ExField v-model={submitForm[item.key]} {...fieldProps}>
291
+ {componentSlots}
292
+ </ExField>
293
+ )
294
+ break
295
+ }
296
+ }
297
+
298
+ const formItem = [renderItem]
299
+
300
+ if (item.break) {
301
+ formItem.unshift(<Divider {...props.dividerProps}>{{ default: () => (isString(item.break) ? item.break : null) }}</Divider>)
302
+ }
303
+
304
+ return formItem
305
+ }
306
+
307
+ export default render