@idooel/components 0.0.2-beta.27 → 0.0.2-beta.29

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idooel/components",
3
- "version": "0.0.2-beta.27",
3
+ "version": "0.0.2-beta.29",
4
4
  "description": "",
5
5
  "private": false,
6
6
  "main": "dist/@idooel/components.umd.js",
@@ -135,8 +135,8 @@ export default {
135
135
  if (type.isStr(this.returnValues)) {
136
136
  this.emitValue = this.emitValue.filter(item => item !== props.value)
137
137
  } else if (type.isObject(this.returnValues)) {
138
- const reverseReturnValues = Object.fromEntries(Object.entries(this.returnValues).map(([key, value]) => [value, key]))
139
- const primaryKey = reverseReturnValues[this.replaceFields.value]
138
+ // const reverseReturnValues = Object.fromEntries(Object.entries(this.returnValues).map(([key, value]) => [value, key]))
139
+ const primaryKey = this.replaceFields.value
140
140
  this.emitValue = this.emitValue.filter(item => item[primaryKey] !== props.value)
141
141
  }
142
142
  } else {
@@ -3,37 +3,37 @@
3
3
  <a-form :form="form" layout="vertical" class="ant-advanced-search-form">
4
4
  <a-row :gutter="24">
5
5
  <template v-for="ele in elements">
6
- <a-col v-if="executeExpression(ele._show)" :span="ele.span" :key="ele.name">
6
+ <a-col v-if="ele._show" :span="ele.span" :key="`${ele.name}_${ele._rulesVersion || 0}`">
7
7
  <template v-if="ele.type == 'ele-input' || ele.type == 'Input'">
8
- <a-form-item :label="`${ele.label}:`">
8
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
9
9
  <ele-input
10
10
  @change="onChange($event, ele)"
11
- :disabled="executeExpression(ele._disabled)"
11
+ :disabled="ele._disabled"
12
12
  :max-length="ele.maxLength"
13
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
13
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
14
14
  style="width:100%;">
15
15
  </ele-input>
16
16
  </a-form-item>
17
17
  </template>
18
18
  <template v-else-if="ele.type == 'ele-textarea' || ele.type == 'Textarea'">
19
- <a-form-item :label="`${ele.label}:`">
19
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
20
20
  <ele-textarea
21
21
  @change="onChange($event, ele)"
22
22
  :max-length="ele.maxLength"
23
23
  :autosize="ele.autosize"
24
- :disabled="executeExpression(ele._disabled)"
24
+ :disabled="ele._disabled"
25
25
  :allow-clear="ele.allowClear"
26
26
  :placeholder="ele.placeholder"
27
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
27
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
28
28
  style="width:100%;">
29
29
  </ele-textarea>
30
30
  </a-form-item>
31
31
  </template>
32
32
  <template v-else-if="ele.type == 'ele-select' || ele.type == 'Select'">
33
- <a-form-item :label="`${ele.label}:`">
33
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
34
34
  <ele-select
35
35
  :data-source="ele.optionList"
36
- :disabled="executeExpression(ele._disabled)"
36
+ :disabled="ele._disabled"
37
37
  :multiple="ele.multiple"
38
38
  :mode="ele.mode"
39
39
  :code="ele.code"
@@ -41,14 +41,14 @@
41
41
  :url="ele.url"
42
42
  :params="ele.params"
43
43
  @change="onChange($event, ele)"
44
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
44
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
45
45
  style="width:100%;">
46
46
  </ele-select>
47
47
  </a-form-item>
48
48
  </template>
49
49
  <template v-else-if="ele.type == 'ele-upload'">
50
- <a-form-item :label="`${ele.label}:`">
51
- <ele-upload v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
50
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
51
+ <ele-upload v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
52
52
  :ext="ele.ext"
53
53
  :multiple="ele.multiple"
54
54
  :accept="ele.accept"
@@ -62,71 +62,71 @@
62
62
  </a-form-item>
63
63
  </template>
64
64
  <template v-else-if="ele.type == 'ele-date-range'">
65
- <a-form-item :label="`${ele.label}:`">
65
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
66
66
  <ele-date-range
67
- :disabled="executeExpression(ele._disabled)"
68
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
67
+ :disabled="ele._disabled"
68
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
69
69
  style="width:100%;">
70
70
  </ele-date-range>
71
71
  </a-form-item>
72
72
  </template>
73
73
  <template v-else-if="ele.type == 'ele-date'">
74
- <a-form-item :label="`${ele.label}:`">
74
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
75
75
  <ele-date
76
76
  :format="ele.format"
77
77
  :mode="ele.mode"
78
78
  :show-time="ele.showTime"
79
79
  :show-today="ele.showToday"
80
80
  :value-format="ele.valueFormat"
81
- :disabled="executeExpression(ele._disabled)"
82
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
81
+ :disabled="ele._disabled"
82
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
83
83
  style="width:100%;">
84
84
  </ele-date>
85
85
  </a-form-item>
86
86
  </template>
87
87
  <template v-else-if="ele.type == 'ele-select-entity' || ele.type == 'SelectEntity'">
88
- <a-form-item :label="`${ele.label}:`">
88
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
89
89
  <ele-select-entity
90
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
90
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
91
91
  style="width:100%;">
92
92
  </ele-select-entity>
93
93
  </a-form-item>
94
94
  </template>
95
95
  <template v-else-if="ele.type == 'InputNumber' || ele.type == 'ele-input-number'">
96
- <a-form-item :label="`${ele.label}:`">
96
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
97
97
  <ele-input-number
98
98
  @change="onChange($event, ele)"
99
99
  :precision="ele.precision"
100
- :disabled="executeExpression(ele._disabled)"
101
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
100
+ :disabled="ele._disabled"
101
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
102
102
  v-bind="ele.props"
103
103
  style="width:100%;">
104
104
  </ele-input-number>
105
105
  </a-form-item>
106
106
  </template>
107
107
  <template v-else-if="ele.type == 'ele-Checkbox' || ele.type == 'Checkbox'">
108
- <a-form-item :label="`${ele.label}:`">
108
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
109
109
  <ele-checkbox
110
110
  :data-source="ele.optionList"
111
- :disabled="executeExpression(ele._disabled)"
112
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
111
+ :disabled="ele._disabled"
112
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
113
113
  style="width:100%;">
114
114
  </ele-checkbox>
115
115
  </a-form-item>
116
116
  </template>
117
117
  <template v-else-if="ele.type == 'ele-radio' || ele.type == 'Radio'">
118
- <a-form-item :label="`${ele.label}:`">
118
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
119
119
  <ele-radio
120
120
  @change="onChange($event, ele)"
121
- :disabled="executeExpression(ele._disabled)"
121
+ :disabled="ele._disabled"
122
122
  :data-source="ele.optionList"
123
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
123
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
124
124
  style="width:100%;">
125
125
  </ele-radio>
126
126
  </a-form-item>
127
127
  </template>
128
128
  <template v-else-if="ele.type == 'ele-form-img-crop'">
129
- <a-form-item :label="`${ele.label}:`">
129
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
130
130
  <ele-form-img-crop
131
131
  @change="onChange($event, ele)"
132
132
  :width="ele.width"
@@ -135,30 +135,30 @@
135
135
  :cropper-config="ele.cropperConfig"
136
136
  :uploadFileConfig="ele.uploadFileConfig"
137
137
  :oper-text="ele.operText"
138
- :disabled="executeExpression(ele._disabled)"
139
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
138
+ :disabled="ele._disabled"
139
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
140
140
  style="width:100%;">
141
141
  </ele-form-img-crop>
142
142
  </a-form-item>
143
143
  </template>
144
144
  <template v-else-if="ele.type == 'ele-tree-select'">
145
- <a-form-item :label="`${ele.label}:`">
145
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
146
146
  <ele-tree-select
147
147
  @change="onChange($event, ele)"
148
- :disabled="executeExpression(ele._disabled)"
148
+ :disabled="ele._disabled"
149
149
  v-bind="ele.meta"
150
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
150
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
151
151
  style="width:100%;">
152
152
  </ele-tree-select>
153
153
  </a-form-item>
154
154
  </template>
155
155
  <template v-else-if="ele.type == 'ele-select-entity-modal-table'">
156
- <a-form-item :label="`${ele.label}:`">
156
+ <a-form-item :label="`${ele.label}:`" :required="ele._required">
157
157
  <ele-select-entity-modal-table
158
158
  @change="onChange($event, ele)"
159
- :disabled="executeExpression(ele._disabled)"
159
+ :disabled="ele._disabled"
160
160
  v-bind="ele.meta"
161
- v-decorator="[ele.name, { rules: rebuildRules(ele.rules) }]"
161
+ v-decorator="[ele.name, { rules: rebuildRules(ele) }]"
162
162
  style="width:100%;">
163
163
  </ele-select-entity-modal-table>
164
164
  </a-form-item>
@@ -228,6 +228,7 @@ export default {
228
228
  methods: {
229
229
  onFieldsChange () {
230
230
  this.executeOptionListExpression()
231
+ this.dispatchExpression()
231
232
  },
232
233
  executeOptionListExpression () {
233
234
  this.elements.forEach(ele => {
@@ -253,20 +254,69 @@ export default {
253
254
  this.formModel = props
254
255
  this.dispatchExpression()
255
256
  },
256
- rebuildRules (rules = []) {
257
- //TODO
258
- rules.map(rule => {
259
- const { validator } = rule
257
+ rebuildRules (ele) {
258
+ const { rules = [] } = ele
259
+ const nextRules = rules.map(rule => {
260
+ const nextRule = { ...rule }
261
+ const { validator, required } = nextRule
262
+ // 支持 validator 函数
260
263
  if (validator) {
261
- validator.formModel = this.getFieldsValue()
262
- validator.exposed = this.exposedMethods
264
+ nextRule.validator = (rule, value, cb) => {
265
+ validator.formModel = this.getFieldsValue()
266
+ validator.exposed = this.exposedMethods
267
+ return validator(rule, value, cb)
268
+ }
269
+ }
270
+ // 支持 rules 内部的 required 表达式
271
+ if (required !== undefined && type.isStr(required)) {
272
+ nextRule.required = this.executeExpression(required)
263
273
  }
274
+ return nextRule
264
275
  })
265
- return rules
276
+ // 支持顶层 required 表达式(优先级高于 rules 内部)
277
+ const { required } = ele
278
+ if (required !== undefined) {
279
+ const isRequired = this.executeExpression(required)
280
+ const hasRequiredRule = nextRules.some(r => Object.keys(r).includes('required'))
281
+ if (!hasRequiredRule) {
282
+ nextRules.unshift({ required: isRequired, message: `${ele.label}是必填项` })
283
+ } else {
284
+ nextRules.forEach(r => {
285
+ if (Object.keys(r).includes('required')) {
286
+ r.required = isRequired
287
+ }
288
+ })
289
+ }
290
+ }
291
+ return nextRules
266
292
  },
267
293
  dispatchExpression () {
268
294
  this.evalDisabledExpression()
269
295
  this.evalShowExpression()
296
+ this.evalRequiredExpression()
297
+ },
298
+ evalRequiredExpression () {
299
+ this.elements.forEach(ele => {
300
+ // 优先使用顶层 required 表达式
301
+ let requiredExpr = ele.required
302
+ // 如果顶层没有,则从 rules 中查找
303
+ if (requiredExpr === undefined && ele.rules) {
304
+ const requiredRule = ele.rules.find(r => r.required !== undefined)
305
+ if (requiredRule) {
306
+ requiredExpr = requiredRule.required
307
+ }
308
+ }
309
+ if (requiredExpr !== undefined) {
310
+ const ret = this.executeExpression(requiredExpr)
311
+ const oldRequired = ele._required
312
+ this.$set(ele, '_required', ret)
313
+ // 初始化或状态变化时更新版本号,强制组件重新渲染
314
+ if (oldRequired === undefined || oldRequired !== ret) {
315
+ const currentVersion = ele._rulesVersion || 0
316
+ this.$set(ele, '_rulesVersion', currentVersion + 1)
317
+ }
318
+ }
319
+ })
270
320
  },
271
321
  evalDisabledExpression () {
272
322
  this.elements.forEach(ele => {
@@ -286,7 +336,8 @@ export default {
286
336
  executeExpression (expression) {
287
337
  if (type.isBool(expression)) return expression
288
338
  if (type.isEmpty(expression)) return false
289
- return parse(expression, { ...this.getFieldsValue(), ...this.formModel, _route: this.$route.query, _routeMeta: this.$route.meta })
339
+ const scope = { ...this.formModel, ...this.getFieldsValue(), _route: this.$route.query, _routeMeta: this.$route.meta }
340
+ return parse(expression, scope)
290
341
  },
291
342
  onChange (value, props) {
292
343
  const { name } = props