vue2-client 1.15.13 → 1.15.15

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 (34) hide show
  1. package/jest.config.js +22 -22
  2. package/package.json +2 -2
  3. package/src/ReportView.js +0 -6
  4. package/src/base-client/components/common/XForm/XForm.vue +419 -419
  5. package/src/base-client/components/common/XForm/demo.vue +105 -105
  6. package/src/base-client/components/common/XFormTable/demo.vue +0 -1
  7. package/src/base-client/components/common/XPrint/PrintBill.vue +3 -1
  8. package/src/base-client/components/common/XRate/demo.vue +102 -102
  9. package/src/base-client/components/common/XTable/XTableWrapper.vue +166 -1
  10. package/src/base-client/components/common/XUploadFilesView/index.vue +485 -485
  11. package/src/base-client/components/layout/XPageView/RenderRow.vue +88 -88
  12. package/src/base-client/components/layout/XPageView/XPageView.vue +223 -223
  13. package/src/base-client/components/layout/XPageView/XTab/XTab.vue +96 -96
  14. package/src/base-client/components/layout/XPageView/componentTypes.js +22 -22
  15. package/src/main.js +3 -4
  16. package/src/pages/WorkflowDetail/WorkFlowDemo2.vue +2 -1
  17. package/src/pages/WorkflowDetail/WorkflowDetail.vue +20 -4
  18. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +388 -388
  19. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +475 -148
  20. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +677 -188
  21. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +1 -1
  22. package/src/pages/WorkflowDetail/WorkflowPageDetail/components/WorkflowPersonSelector.vue +25 -23
  23. package/src/pages/XPageViewExample/index.vue +149 -149
  24. package/src/router/async/router.map.js +3 -5
  25. package/src/router/index.js +27 -27
  26. package/src/router.js +0 -2
  27. package/src/services/api/workFlow.js +0 -4
  28. package/test/request.test.js +17 -17
  29. package/vue.config.js +2 -5
  30. package/src/base-client/components/common/AMisRender/index.js +0 -3
  31. package/src/base-client/components/common/AMisRender/index.vue +0 -263
  32. package/src/pages/AMisDemo/AMisDemo.vue +0 -325
  33. package/src/pages/AMisDemo/AMisDemo2.vue +0 -74
  34. package/test/Amis.spec.js +0 -164
@@ -1,419 +1,419 @@
1
- <template>
2
- <div :style="{marginBottom: !visible ? '12px':''}">
3
- <div v-if="visible && realJsonData.length > 0" class="table-page-search-wrapper">
4
- <a-form-model
5
- v-if="loaded"
6
- ref="form"
7
- :model="form"
8
- :rules="rules"
9
- layout="inline">
10
- <a-row :gutter="24" type="flex">
11
- <x-form-item
12
- v-for="(item, index) in visibleItems"
13
- :showLabel="!simpleMode"
14
- :key="`${queryParamsName}-item-${index}`"
15
- :attr="item.formItem"
16
- :form="form"
17
- :service-name="serviceName"
18
- :get-data-params="getDataParams"
19
- :env="env"
20
- :setForm="setForm"
21
- @mounted="onItemMounted"
22
- />
23
- <x-form-item
24
- v-show="advanced"
25
- v-for="(item, index) in hiddenItems"
26
- :showLabel="!simpleMode"
27
- :key="`advanced-${queryParamsName}-item-${index}`"
28
- :attr="item.formItem"
29
- :form="form"
30
- :service-name="serviceName"
31
- :get-data-params="getDataParams"
32
- :env="env"
33
- :setForm="setForm"
34
- @mounted="onItemMounted"
35
- />
36
- <a-col style="margin-left: auto">
37
- <span
38
- :style="advanced ? { float: 'right', overflow: 'hidden' } : {}"
39
- class="table-page-search-submitButtons">
40
- <template v-if="hiddenItems.length > 0">
41
- <a @click="toggleAdvanced">
42
- <span v-if="!advanced" style="display: inline-flex; align-items: center;">
43
- <a-icon type="eye" :style="iconStyle"></a-icon>&nbsp;更多条件
44
- </span>
45
- <span v-else style="display: inline-flex; align-items: center;">
46
- <a-icon type="eye-invisible" :style="iconStyle"></a-icon>&nbsp;收起更多
47
- </span>
48
- </a>
49
- <a-divider type="vertical"/>
50
- </template>
51
- <a-button
52
- v-if="!simpleMode"
53
- htmlType="submit"
54
- type="primary"
55
- @click="onSubmit">
56
- <a-icon :style="iconStyle" type="search"></a-icon>查询
57
- </a-button>
58
- <a-button v-if="!simpleMode" style="margin-left: 8px" @click="resetForm">重置</a-button>
59
- <slot></slot>
60
- </span>
61
- </a-col>
62
- </a-row>
63
- </a-form-model>
64
- <div class="next-divider-dashed" role="separator"></div>
65
- </div>
66
- </div>
67
- </template>
68
- <script>
69
- import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
70
- import { mapState } from 'vuex'
71
- import moment from 'moment'
72
- import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
73
- import { getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
74
- import * as util from '@vue2-client/utils/util'
75
- import formValidationMixin from '@vue2-client/mixins/formValidationMixin'
76
-
77
- export default {
78
- name: 'XForm',
79
- components: {
80
- XFormItem
81
- },
82
- mixins: [formValidationMixin],
83
- data () {
84
- return {
85
- // 内容加载是否完成
86
- loaded: false,
87
- // 服务名称
88
- serviceName: undefined,
89
- // 是否展开条件
90
- advanced: false,
91
- // 表单Model
92
- form: undefined,
93
- // 校验
94
- rules: {},
95
- // 图标样式
96
- iconStyle: {
97
- position: 'relative',
98
- top: '1px'
99
- },
100
- // 表单项集合
101
- formItems: [],
102
- // 是否显示
103
- visible: true,
104
- // 调用logic获取数据源的追加参数
105
- getDataParams: {},
106
- // 当前环境
107
- env: 'prod',
108
- // 暂存 form 的默认值
109
- defaultMap: {},
110
- // 已经渲染得 x-from-item 为了让所有节点init执行完在调用 table 查询
111
- mountedCount: 0,
112
- // 是否简易模式
113
- simpleMode: false,
114
- queryParamsName: '',
115
- // 默认显示的表单项数量
116
- visibleItemCount: 7
117
- }
118
- },
119
- computed: {
120
- ...mapState('account', { currUser: 'user' }),
121
- // 过滤掉仅用于新增/修改场景的表单项
122
- realJsonData: function () {
123
- return this.formItems.filter(item => (!item.isOnlyAddOrEdit && item.type !== 'group') || (item.type === 'group' && item.groupItems.some(groupItem => !groupItem.isOnlyAddOrEdit)))
124
- },
125
- // 过滤出用于新增/修改场景的表单项
126
- groupJsonData: function () {
127
- return this.formItems.filter((item) => {
128
- return item.type === 'group'
129
- }).map((item) => {
130
- item.groupItems = item.groupItems.filter(item => !item.isOnlyAddOrEdit).map((groupItem) => {
131
- // 只保留第一个下划线后面的内容
132
- // groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
133
- return groupItem
134
- })
135
- return item
136
- }
137
- )
138
- },
139
- // 合并所有来源的表单项
140
- allFormItems: function () {
141
- const normalItems = this.realJsonData.map(item => ({
142
- type: 'normal',
143
- formItem: item
144
- }))
145
-
146
- const groupItems = this.groupJsonData.flatMap(group =>
147
- group.groupItems.map(item => ({
148
- type: 'group',
149
- formItem: item,
150
- groupName: group.name || '分组'
151
- }))
152
- )
153
-
154
- return [...normalItems, ...groupItems]
155
- },
156
- // 显示的表单项
157
- visibleItems: function () {
158
- return this.allFormItems.slice(0, this.visibleItemCount)
159
- },
160
- // 隐藏的表单项(需要点击展开才显示)
161
- hiddenItems: function () {
162
- return this.allFormItems.slice(this.visibleItemCount)
163
- },
164
- },
165
- provide () {
166
- return {
167
- XFormContext: this,
168
- // 移除必填项
169
- removeRequired: this.removeRequired,
170
- // 设置必填项
171
- setRequired: this.setRequired,
172
- }
173
- },
174
- methods: {
175
- init (params) {
176
- const {
177
- formItems, serviceName, getDataParams = {}, env = 'prod', simpleMode = false, funcData = {},
178
- queryParamsName = 'localConfig', visibleItemCount = 7
179
- } = params
180
- this.mountedCount = 0
181
- this.queryParamsName = queryParamsName
182
- this.loaded = false
183
- this.formItems = JSON.parse(JSON.stringify(formItems))
184
- this.serviceName = serviceName
185
- this.env = env
186
- this.simpleMode = simpleMode
187
- this.visibleItemCount = visibleItemCount
188
- const formData = {}
189
- for (let i = 0; i < this.realJsonData.length; i++) {
190
- const item = this.realJsonData[i]
191
- this.setFormProps(formData, item)
192
- }
193
- if (this.realJsonData.length === 0) {
194
- this.$nextTick(() => {
195
- this.$emit('itemsMounted')
196
- })
197
- }
198
- // 处理分组数据表单
199
- for (let i = 0; i < this.groupJsonData.length; i++) {
200
- const groupItem = this.groupJsonData[i]
201
- for (let j = 0; j < groupItem.groupItems.length; j++) {
202
- const item = groupItem.groupItems[j]
203
- this.setFormProps(formData, item)
204
- }
205
- }
206
- this.form = formData
207
- try {
208
- if (funcData.queryFormInit) {
209
- if (!funcData.queryFormInit.startsWith('async')) {
210
- funcData.queryFormInit = `async ${funcData.queryFormInit}`
211
- }
212
- executeStrFunctionByContext(this, funcData.queryFormInit, [util, runLogic, getConfigByNameAsync]).then(res => {
213
- this.form = Object.assign({}, this.form, res)
214
- })
215
- }
216
- } catch (e) {
217
- console.error('queryFormInit error', e)
218
- }
219
- this.getDataParams = getDataParams
220
- this.loaded = true
221
- },
222
- onItemMounted (_h) {
223
- this.mountedCount += 1
224
- if (this.mountedCount === this.allFormItems.length) {
225
- // 所有 x-from-item 挂载完成,触发父组件中的 xTable.init
226
- this.$emit('itemsMounted')
227
- }
228
- },
229
- // 时间组件赋默认值
230
- getDateRange ({ type, queryFormDefault: defaultValue, queryType, queryValueFormat: defaultFormat, name }) {
231
- const formatMap = {
232
- yearPicker: 'YYYY',
233
- yearRangePicker: 'YYYY',
234
- monthPicker: 'YYYY-MM',
235
- monthRangePicker: 'YYYY-MM',
236
- datePicker: 'YYYY-MM-DD',
237
- rangePicker: 'YYYY-MM-DD HH:mm:ss',
238
- }
239
- let format = formatMap[type]
240
-
241
- if (defaultFormat) {
242
- format = defaultFormat
243
- }
244
-
245
- let start, end
246
-
247
- switch (defaultValue) {
248
- case 'curYear':
249
- start = moment().startOf('year').format(format)
250
- end = moment().endOf('year').format(format)
251
- break
252
- case 'curMonth':
253
- start = moment().startOf('month').format(format)
254
- end = moment().endOf('month').format(format)
255
- break
256
- case 'curDay':
257
- start = moment().startOf('day').format(format)
258
- end = moment().endOf('day').format(format)
259
- break
260
- case 'curTime':
261
- start = moment().format(format)
262
- end = moment().format(format)
263
- break
264
- default:
265
- return undefined
266
- }
267
- if (['monthPicker', 'yearPicker', 'datePicker'].includes(type)) {
268
- if (queryType === 'BETWEEN') {
269
- return [start, end]
270
- }
271
- if (name.indexOf('开始') > -1 || name.indexOf('起始') > -1) {
272
- return start
273
- } else {
274
- return end
275
- }
276
- } else if (['rangePicker', 'yearRangePicker', 'monthRangePicker'].includes(type)) {
277
- return [start, end]
278
- }
279
- return [start, end]
280
- },
281
- setFormProps (formData, item) {
282
- formData[item.model] = undefined
283
- if (item.queryFormDefault) {
284
- if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(item.type)) {
285
- formData[item.model] = this.getDateRange(item)
286
- } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.queryFormDefault)) {
287
- if (item.queryFormDefault === 'curOrgId') {
288
- formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
289
- }
290
- if (item.queryFormDefault === 'curDepId') {
291
- formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
292
- }
293
- if (item.queryFormDefault === 'curUserId') {
294
- formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
295
- }
296
- } else {
297
- formData[item.model] = item.queryFormDefault
298
- }
299
- if (item.forceQueryDefault) {
300
- this.defaultMap[item.model] = formData[item.model]
301
- }
302
- } else {
303
- if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(item.type)) {
304
- if (item.queryType === 'BETWEEN') {
305
- formData[item.model] = []
306
- }
307
- }
308
- }
309
- if (item.rule) {
310
- this.rules[item.model] = []
311
- const required = item.rule.queryRequired ? item.rule.queryRequired === true || item.rule.queryRequired === 'true' : false
312
- let trigger
313
- let message
314
- if (required) {
315
- switch (item.type) {
316
- case 'select':
317
- case 'checkbox':
318
- case 'radio':
319
- case 'treeSelect':
320
- case 'rangePicker':
321
- case 'monthPicker':
322
- case 'yearPicker':
323
- case 'datePicker':
324
- case 'file':
325
- case 'image':
326
- case 'citySelect':
327
- case 'addressSearch':
328
- case 'personSetting':
329
- message = '请选择' + item.name
330
- trigger = 'change'
331
- break
332
- default:
333
- message = '请输入' + item.name
334
- trigger = 'blur'
335
- }
336
- this.rules[item.model].push({
337
- required: true,
338
- message: message,
339
- trigger: trigger
340
- })
341
- }
342
-
343
- switch (item.rule.queryType) {
344
- case 'customJs': {
345
- this.rules[item.model].push({
346
- validator: (rule, value, callback) => {
347
- this.customJsValidate(rule, value, callback, item)
348
- },
349
- trigger: 'blur'
350
- })
351
- break
352
- }
353
- }
354
- }
355
- },
356
- customJsValidate (rule, value, callback, item) {
357
- if (item.rule.customQueryValidatorFunc) {
358
- executeStrFunctionByContext(this, item.rule.customQueryValidatorFunc, [rule, value, callback, this.form, item, util, runLogic, getConfigByNameAsync])
359
- } else {
360
- callback()
361
- }
362
- },
363
- toggleAdvanced () {
364
- this.advanced = !this.advanced
365
- this.$emit('toggleAdvanced')
366
- },
367
- toggleVisible () {
368
- this.visible = !this.visible
369
- return this.visible
370
- },
371
- resetForm () {
372
- this.$refs.form.resetFields()
373
- },
374
- onSubmit () {
375
- this.$refs.form.validate(valid => {
376
- for (const key of Object.keys(this.form)) {
377
- if (this.form[key] === null || this.form[key] === '') {
378
- this.form[key] = undefined
379
- }
380
- if (Array.isArray(this.form[key]) && this.form[key].length === 0) {
381
- this.form[key] = undefined
382
- }
383
- // 如果 form 中没有值,但是有默认值
384
- if (this.form[key] === undefined && this.defaultMap[key] !== undefined) {
385
- this.form = Object.assign({}, this.form, this.defaultMap)
386
- }
387
- }
388
- const requestParameters = Object.assign({}, this.form)
389
- const data = {
390
- valid: valid,
391
- form: requestParameters
392
- }
393
- this.$emit('onSubmit', data)
394
- })
395
- },
396
- exports () {
397
- this.$emit('exports', this.form)
398
- },
399
- setForm (obj) {
400
- this.form = Object.assign(this.form, obj)
401
- },
402
- }
403
- }
404
- </script>
405
- <style lang="less" scoped>
406
- :deep(.ant-form-inline .ant-form-item) {
407
- margin-right: 0;
408
- margin-top: 0;
409
- margin-bottom: 12px;
410
-
411
- .ant-form-item-control-wrapper {
412
- min-width: 0;
413
- }
414
- }
415
-
416
- :deep(.table-page-search-wrapper .table-page-search-submitButtons) {
417
- margin-top: 0;
418
- }
419
- </style>
1
+ <template>
2
+ <div :style="{marginBottom: !visible ? '12px':''}">
3
+ <div v-if="visible && realJsonData.length > 0" class="table-page-search-wrapper">
4
+ <a-form-model
5
+ v-if="loaded"
6
+ ref="form"
7
+ :model="form"
8
+ :rules="rules"
9
+ layout="inline">
10
+ <a-row :gutter="24" type="flex">
11
+ <x-form-item
12
+ v-for="(item, index) in visibleItems"
13
+ :showLabel="!simpleMode"
14
+ :key="`${queryParamsName}-item-${index}`"
15
+ :attr="item.formItem"
16
+ :form="form"
17
+ :service-name="serviceName"
18
+ :get-data-params="getDataParams"
19
+ :env="env"
20
+ :setForm="setForm"
21
+ @mounted="onItemMounted"
22
+ />
23
+ <x-form-item
24
+ v-show="advanced"
25
+ v-for="(item, index) in hiddenItems"
26
+ :showLabel="!simpleMode"
27
+ :key="`advanced-${queryParamsName}-item-${index}`"
28
+ :attr="item.formItem"
29
+ :form="form"
30
+ :service-name="serviceName"
31
+ :get-data-params="getDataParams"
32
+ :env="env"
33
+ :setForm="setForm"
34
+ @mounted="onItemMounted"
35
+ />
36
+ <a-col style="margin-left: auto">
37
+ <span
38
+ :style="advanced ? { float: 'right', overflow: 'hidden' } : {}"
39
+ class="table-page-search-submitButtons">
40
+ <template v-if="hiddenItems.length > 0">
41
+ <a @click="toggleAdvanced">
42
+ <span v-if="!advanced" style="display: inline-flex; align-items: center;">
43
+ <a-icon type="eye" :style="iconStyle"></a-icon>&nbsp;更多条件
44
+ </span>
45
+ <span v-else style="display: inline-flex; align-items: center;">
46
+ <a-icon type="eye-invisible" :style="iconStyle"></a-icon>&nbsp;收起更多
47
+ </span>
48
+ </a>
49
+ <a-divider type="vertical"/>
50
+ </template>
51
+ <a-button
52
+ v-if="!simpleMode"
53
+ htmlType="submit"
54
+ type="primary"
55
+ @click="onSubmit">
56
+ <a-icon :style="iconStyle" type="search"></a-icon>查询
57
+ </a-button>
58
+ <a-button v-if="!simpleMode" style="margin-left: 8px" @click="resetForm">重置</a-button>
59
+ <slot></slot>
60
+ </span>
61
+ </a-col>
62
+ </a-row>
63
+ </a-form-model>
64
+ <div class="next-divider-dashed" role="separator"></div>
65
+ </div>
66
+ </div>
67
+ </template>
68
+ <script>
69
+ import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
70
+ import { mapState } from 'vuex'
71
+ import moment from 'moment'
72
+ import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
73
+ import { getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
74
+ import * as util from '@vue2-client/utils/util'
75
+ import formValidationMixin from '@vue2-client/mixins/formValidationMixin'
76
+
77
+ export default {
78
+ name: 'XForm',
79
+ components: {
80
+ XFormItem
81
+ },
82
+ mixins: [formValidationMixin],
83
+ data () {
84
+ return {
85
+ // 内容加载是否完成
86
+ loaded: false,
87
+ // 服务名称
88
+ serviceName: undefined,
89
+ // 是否展开条件
90
+ advanced: false,
91
+ // 表单Model
92
+ form: undefined,
93
+ // 校验
94
+ rules: {},
95
+ // 图标样式
96
+ iconStyle: {
97
+ position: 'relative',
98
+ top: '1px'
99
+ },
100
+ // 表单项集合
101
+ formItems: [],
102
+ // 是否显示
103
+ visible: true,
104
+ // 调用logic获取数据源的追加参数
105
+ getDataParams: {},
106
+ // 当前环境
107
+ env: 'prod',
108
+ // 暂存 form 的默认值
109
+ defaultMap: {},
110
+ // 已经渲染得 x-from-item 为了让所有节点init执行完在调用 table 查询
111
+ mountedCount: 0,
112
+ // 是否简易模式
113
+ simpleMode: false,
114
+ queryParamsName: '',
115
+ // 默认显示的表单项数量
116
+ visibleItemCount: 7
117
+ }
118
+ },
119
+ computed: {
120
+ ...mapState('account', { currUser: 'user' }),
121
+ // 过滤掉仅用于新增/修改场景的表单项
122
+ realJsonData: function () {
123
+ return this.formItems.filter(item => (!item.isOnlyAddOrEdit && item.type !== 'group') || (item.type === 'group' && item.groupItems.some(groupItem => !groupItem.isOnlyAddOrEdit)))
124
+ },
125
+ // 过滤出用于新增/修改场景的表单项
126
+ groupJsonData: function () {
127
+ return this.formItems.filter((item) => {
128
+ return item.type === 'group'
129
+ }).map((item) => {
130
+ item.groupItems = item.groupItems.filter(item => !item.isOnlyAddOrEdit).map((groupItem) => {
131
+ // 只保留第一个下划线后面的内容
132
+ // groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
133
+ return groupItem
134
+ })
135
+ return item
136
+ }
137
+ )
138
+ },
139
+ // 合并所有来源的表单项
140
+ allFormItems: function () {
141
+ const normalItems = this.realJsonData.map(item => ({
142
+ type: 'normal',
143
+ formItem: item
144
+ }))
145
+
146
+ const groupItems = this.groupJsonData.flatMap(group =>
147
+ group.groupItems.map(item => ({
148
+ type: 'group',
149
+ formItem: item,
150
+ groupName: group.name || '分组'
151
+ }))
152
+ )
153
+
154
+ return [...normalItems, ...groupItems]
155
+ },
156
+ // 显示的表单项
157
+ visibleItems: function () {
158
+ return this.allFormItems.slice(0, this.visibleItemCount)
159
+ },
160
+ // 隐藏的表单项(需要点击展开才显示)
161
+ hiddenItems: function () {
162
+ return this.allFormItems.slice(this.visibleItemCount)
163
+ },
164
+ },
165
+ provide () {
166
+ return {
167
+ XFormContext: this,
168
+ // 移除必填项
169
+ removeRequired: this.removeRequired,
170
+ // 设置必填项
171
+ setRequired: this.setRequired,
172
+ }
173
+ },
174
+ methods: {
175
+ init (params) {
176
+ const {
177
+ formItems, serviceName, getDataParams = {}, env = 'prod', simpleMode = false, funcData = {},
178
+ queryParamsName = 'localConfig', visibleItemCount = 7
179
+ } = params
180
+ this.mountedCount = 0
181
+ this.queryParamsName = queryParamsName
182
+ this.loaded = false
183
+ this.formItems = JSON.parse(JSON.stringify(formItems))
184
+ this.serviceName = serviceName
185
+ this.env = env
186
+ this.simpleMode = simpleMode
187
+ this.visibleItemCount = visibleItemCount
188
+ const formData = {}
189
+ for (let i = 0; i < this.realJsonData.length; i++) {
190
+ const item = this.realJsonData[i]
191
+ this.setFormProps(formData, item)
192
+ }
193
+ if (this.realJsonData.length === 0) {
194
+ this.$nextTick(() => {
195
+ this.$emit('itemsMounted')
196
+ })
197
+ }
198
+ // 处理分组数据表单
199
+ for (let i = 0; i < this.groupJsonData.length; i++) {
200
+ const groupItem = this.groupJsonData[i]
201
+ for (let j = 0; j < groupItem.groupItems.length; j++) {
202
+ const item = groupItem.groupItems[j]
203
+ this.setFormProps(formData, item)
204
+ }
205
+ }
206
+ this.form = formData
207
+ try {
208
+ if (funcData.queryFormInit) {
209
+ if (!funcData.queryFormInit.startsWith('async')) {
210
+ funcData.queryFormInit = `async ${funcData.queryFormInit}`
211
+ }
212
+ executeStrFunctionByContext(this, funcData.queryFormInit, [util, runLogic, getConfigByNameAsync]).then(res => {
213
+ this.form = Object.assign({}, this.form, res)
214
+ })
215
+ }
216
+ } catch (e) {
217
+ console.error('queryFormInit error', e)
218
+ }
219
+ this.getDataParams = getDataParams
220
+ this.loaded = true
221
+ },
222
+ onItemMounted (_h) {
223
+ this.mountedCount += 1
224
+ if (this.mountedCount === this.allFormItems.length) {
225
+ // 所有 x-from-item 挂载完成,触发父组件中的 xTable.init
226
+ this.$emit('itemsMounted')
227
+ }
228
+ },
229
+ // 时间组件赋默认值
230
+ getDateRange ({ type, queryFormDefault: defaultValue, queryType, queryValueFormat: defaultFormat, name }) {
231
+ const formatMap = {
232
+ yearPicker: 'YYYY',
233
+ yearRangePicker: 'YYYY',
234
+ monthPicker: 'YYYY-MM',
235
+ monthRangePicker: 'YYYY-MM',
236
+ datePicker: 'YYYY-MM-DD',
237
+ rangePicker: 'YYYY-MM-DD HH:mm:ss',
238
+ }
239
+ let format = formatMap[type]
240
+
241
+ if (defaultFormat) {
242
+ format = defaultFormat
243
+ }
244
+
245
+ let start, end
246
+
247
+ switch (defaultValue) {
248
+ case 'curYear':
249
+ start = moment().startOf('year').format(format)
250
+ end = moment().endOf('year').format(format)
251
+ break
252
+ case 'curMonth':
253
+ start = moment().startOf('month').format(format)
254
+ end = moment().endOf('month').format(format)
255
+ break
256
+ case 'curDay':
257
+ start = moment().startOf('day').format(format)
258
+ end = moment().endOf('day').format(format)
259
+ break
260
+ case 'curTime':
261
+ start = moment().format(format)
262
+ end = moment().format(format)
263
+ break
264
+ default:
265
+ return undefined
266
+ }
267
+ if (['monthPicker', 'yearPicker', 'datePicker'].includes(type)) {
268
+ if (queryType === 'BETWEEN') {
269
+ return [start, end]
270
+ }
271
+ if (name.indexOf('开始') > -1 || name.indexOf('起始') > -1) {
272
+ return start
273
+ } else {
274
+ return end
275
+ }
276
+ } else if (['rangePicker', 'yearRangePicker', 'monthRangePicker'].includes(type)) {
277
+ return [start, end]
278
+ }
279
+ return [start, end]
280
+ },
281
+ setFormProps (formData, item) {
282
+ formData[item.model] = undefined
283
+ if (item.queryFormDefault) {
284
+ if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(item.type)) {
285
+ formData[item.model] = this.getDateRange(item)
286
+ } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.queryFormDefault)) {
287
+ if (item.queryFormDefault === 'curOrgId') {
288
+ formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
289
+ }
290
+ if (item.queryFormDefault === 'curDepId') {
291
+ formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
292
+ }
293
+ if (item.queryFormDefault === 'curUserId') {
294
+ formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
295
+ }
296
+ } else {
297
+ formData[item.model] = item.queryFormDefault
298
+ }
299
+ if (item.forceQueryDefault) {
300
+ this.defaultMap[item.model] = formData[item.model]
301
+ }
302
+ } else {
303
+ if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(item.type)) {
304
+ if (item.queryType === 'BETWEEN') {
305
+ formData[item.model] = []
306
+ }
307
+ }
308
+ }
309
+ if (item.rule) {
310
+ this.rules[item.model] = []
311
+ const required = item.rule.queryRequired ? item.rule.queryRequired === true || item.rule.queryRequired === 'true' : false
312
+ let trigger
313
+ let message
314
+ if (required) {
315
+ switch (item.type) {
316
+ case 'select':
317
+ case 'checkbox':
318
+ case 'radio':
319
+ case 'treeSelect':
320
+ case 'rangePicker':
321
+ case 'monthPicker':
322
+ case 'yearPicker':
323
+ case 'datePicker':
324
+ case 'file':
325
+ case 'image':
326
+ case 'citySelect':
327
+ case 'addressSearch':
328
+ case 'personSetting':
329
+ message = '请选择' + item.name
330
+ trigger = 'change'
331
+ break
332
+ default:
333
+ message = '请输入' + item.name
334
+ trigger = 'blur'
335
+ }
336
+ this.rules[item.model].push({
337
+ required: true,
338
+ message: message,
339
+ trigger: trigger
340
+ })
341
+ }
342
+
343
+ switch (item.rule.queryType) {
344
+ case 'customJs': {
345
+ this.rules[item.model].push({
346
+ validator: (rule, value, callback) => {
347
+ this.customJsValidate(rule, value, callback, item)
348
+ },
349
+ trigger: 'blur'
350
+ })
351
+ break
352
+ }
353
+ }
354
+ }
355
+ },
356
+ customJsValidate (rule, value, callback, item) {
357
+ if (item.rule.customQueryValidatorFunc) {
358
+ executeStrFunctionByContext(this, item.rule.customQueryValidatorFunc, [rule, value, callback, this.form, item, util, runLogic, getConfigByNameAsync])
359
+ } else {
360
+ callback()
361
+ }
362
+ },
363
+ toggleAdvanced () {
364
+ this.advanced = !this.advanced
365
+ this.$emit('toggleAdvanced')
366
+ },
367
+ toggleVisible () {
368
+ this.visible = !this.visible
369
+ return this.visible
370
+ },
371
+ resetForm () {
372
+ this.$refs.form.resetFields()
373
+ },
374
+ onSubmit () {
375
+ this.$refs.form.validate(valid => {
376
+ for (const key of Object.keys(this.form)) {
377
+ if (this.form[key] === null || this.form[key] === '') {
378
+ this.form[key] = undefined
379
+ }
380
+ if (Array.isArray(this.form[key]) && this.form[key].length === 0) {
381
+ this.form[key] = undefined
382
+ }
383
+ // 如果 form 中没有值,但是有默认值
384
+ if (this.form[key] === undefined && this.defaultMap[key] !== undefined) {
385
+ this.form = Object.assign({}, this.form, this.defaultMap)
386
+ }
387
+ }
388
+ const requestParameters = Object.assign({}, this.form)
389
+ const data = {
390
+ valid: valid,
391
+ form: requestParameters
392
+ }
393
+ this.$emit('onSubmit', data)
394
+ })
395
+ },
396
+ exports () {
397
+ this.$emit('exports', this.form)
398
+ },
399
+ setForm (obj) {
400
+ this.form = Object.assign(this.form, obj)
401
+ },
402
+ }
403
+ }
404
+ </script>
405
+ <style lang="less" scoped>
406
+ :deep(.ant-form-inline .ant-form-item) {
407
+ margin-right: 0;
408
+ margin-top: 0;
409
+ margin-bottom: 12px;
410
+
411
+ .ant-form-item-control-wrapper {
412
+ min-width: 0;
413
+ }
414
+ }
415
+
416
+ :deep(.table-page-search-wrapper .table-page-search-submitButtons) {
417
+ margin-top: 0;
418
+ }
419
+ </style>