@xuekl/cli-components 1.6.1 → 1.9.145
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/PageContainer.vue +67 -32
- package/XklButton.vue +76 -18
- package/XklDatePicker.vue +115 -7
- package/XklDict.vue +109 -24
- package/XklDropdownItem.vue +111 -0
- package/XklForm.vue +427 -73
- package/XklFormInfo.vue +41 -17
- package/XklLink.vue +96 -16
- package/XklSelect.vue +349 -26
- package/XklTable.vue +104 -29
- package/XklTableV2.vue +54 -0
- package/XklUpload.vue +2 -1
- package/XklVirtualScroll.vue +332 -0
- package/XklVirtualTable.vue +161 -0
- package/package.json +2 -2
package/XklForm.vue
CHANGED
|
@@ -1,57 +1,101 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<el-form ref="XklFormRef" :model="form" :label-width="
|
|
2
|
+
<el-form ref="XklFormRef" :model="form" :label-width="labelWidth()" v-bind="formProps"
|
|
3
|
+
@keyup.enter.native="enterSubmit()">
|
|
3
4
|
<div class="hide-input">
|
|
4
|
-
<input
|
|
5
|
-
|
|
5
|
+
<el-input></el-input>
|
|
6
|
+
</div>
|
|
7
|
+
<div v-if="table" class="history-link">
|
|
8
|
+
|
|
9
|
+
<div class="save-handle">
|
|
10
|
+
<div class="save-tip" v-if="!isDoSave && !isDoHistory">
|
|
11
|
+
<div>
|
|
12
|
+
您可以<el-link type="primary" class="ml-4 mr-4 " @click="toSave()">保存</el-link>当前查询条件,并可以在 <el-link
|
|
13
|
+
type="success" class="ml-4 mr-4" @click="toHistory()">历史记录</el-link>中查看以便于快捷查询。
|
|
14
|
+
</div>
|
|
15
|
+
<div v-if="attrs.onAdvanced">
|
|
16
|
+
<span>或者在 <el-link class="ml-4 mr-4" type="danger"
|
|
17
|
+
@click="advancedQuery()">高级查询</el-link>中定制查询条件。</span>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div v-if="isDoSave" class="do_save">
|
|
21
|
+
<el-link class="mr-10 fs-18" @click="back()"><icon-svg name="back"></icon-svg></el-link>
|
|
22
|
+
<el-input class="w-200" v-model="queryName" :maxlength="20" placeholder="命名当前查询条件" size="small"
|
|
23
|
+
clearable></el-input>
|
|
24
|
+
<el-link type="primary" class="ml-10" @click="doSave()">保存</el-link>
|
|
25
|
+
</div>
|
|
26
|
+
<div v-if="isDoHistory" class="do_save">
|
|
27
|
+
<el-link class="mr-10 fs-18" @click="back()"><icon-svg name="back"></icon-svg></el-link>
|
|
28
|
+
<div v-if="isToDelete" class="history-list">
|
|
29
|
+
<span class="delete-item" :title="item.label" v-for="item in histories"
|
|
30
|
+
@click="deleteHistory(item)">{{ item.label }}</span>
|
|
31
|
+
</div>
|
|
32
|
+
<xkl-select style="width: 2rem!important;" v-else v-model="historyId" placeholder="选择一条历史记录"
|
|
33
|
+
:config="historySelectConfig" :cache="false" size="small" @item-change="doHistory"
|
|
34
|
+
@loaded="historyLoaded"></xkl-select>
|
|
35
|
+
<el-link v-if="!isToDelete" class="ml-10 fs-14" @click="toDelete()"><icon-svg
|
|
36
|
+
name="delete"></icon-svg></el-link>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
6
39
|
</div>
|
|
7
40
|
<el-row>
|
|
8
41
|
<template v-for="item in formList" :key="item.prop">
|
|
9
42
|
<el-col :span="item.span" v-if="item.show()">
|
|
10
|
-
<el-form-item :label="item.label" :label-width="item
|
|
43
|
+
<el-form-item :label="item.label" :label-width="labelWidth(item)" :prop="item.prop"
|
|
11
44
|
:rules="item.refRules">
|
|
12
|
-
<
|
|
13
|
-
v-
|
|
14
|
-
|
|
15
|
-
v-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
v-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
v-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
v-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
<div class="xkl-item-inner">
|
|
46
|
+
<el-input v-if="item.type === 'input'" v-model="form[item.prop]" v-bind="item.element"
|
|
47
|
+
v-on="item.events" :disabled="item.disabled()"></el-input>
|
|
48
|
+
<el-input-number v-else-if="item.type === 'input-number'" v-model="form[item.prop]"
|
|
49
|
+
v-bind="item.element" v-on="item.events" :disabled="item.disabled()"
|
|
50
|
+
style="width: 100%;"></el-input-number>
|
|
51
|
+
<el-input v-else-if="item.type === 'textarea'" v-model="form[item.prop]"
|
|
52
|
+
v-bind="item.element" :disabled="item.disabled()" v-on="item.events"
|
|
53
|
+
type="textarea"></el-input>
|
|
54
|
+
<XklSelect v-else-if="item.type === 'select'" v-model="form[item.prop]"
|
|
55
|
+
v-model:label="form[item.prop + 'Label']" :list="item.list" :config="{}"
|
|
56
|
+
v-bind="item.element" v-on="item.events" :disabled="item.disabled()">
|
|
57
|
+
</XklSelect>
|
|
58
|
+
<XklDict v-else-if="item.type === 'dict-select'" v-model="form[item.prop]"
|
|
59
|
+
v-model:label="form[item.prop + 'Label']" :config="item.config" v-bind="item.element"
|
|
60
|
+
v-on="item.events" :disabled="item.disabled()"></XklDict>
|
|
61
|
+
<XklSelect v-else-if="item.type === 'url-select'" v-model="form[item.prop]"
|
|
62
|
+
:key="item.key()" v-model:label="form[item.prop + 'Label']" :config="item.config"
|
|
63
|
+
v-bind="item.element" v-on="item.events" :disabled="item.disabled()">
|
|
64
|
+
</XklSelect>
|
|
65
|
+
<XklTreeSelect v-else-if="item.type === 'tree-select'" v-model="form[item.prop]"
|
|
66
|
+
:config="item.config" v-bind="item.element" v-on="item.events"
|
|
67
|
+
:disabled="item.disabled()">
|
|
68
|
+
</XklTreeSelect>
|
|
69
|
+
<el-radio-group v-else-if="item.type === 'radio'" v-model="form[item.prop]"
|
|
70
|
+
v-bind="item.element" v-on="item.events" :disabled="item.disabled()">
|
|
71
|
+
<el-radio v-for="ra in item.list" :label="ra.value" :key="ra.value">{{ ra.label
|
|
72
|
+
}}</el-radio>
|
|
73
|
+
</el-radio-group>
|
|
74
|
+
<el-checkbox-group v-else-if="item.type === 'checkbox'" v-model="form[item.prop]"
|
|
75
|
+
v-bind="item.element" v-on="item.events" :disabled="item.disabled()">
|
|
76
|
+
<el-checkbox v-for="ch in item.list" :label="ch.value" :key="ch.value">{{ ch.label
|
|
77
|
+
}}</el-checkbox>
|
|
78
|
+
</el-checkbox-group>
|
|
79
|
+
<XklDatePicker v-else-if="item.type === 'date-picker'" v-model="form[item.prop]"
|
|
80
|
+
v-bind="item.element" v-on="item.events" style="width: 100%;"
|
|
81
|
+
:disabled="item.disabled()">
|
|
82
|
+
</XklDatePicker>
|
|
83
|
+
<XklUpload v-else-if="item.type === 'upload'" :key="form[item.prop].length > 0"
|
|
84
|
+
v-model="form[item.prop]" :config="item.config" v-bind="item.element"
|
|
85
|
+
v-on="item.events">
|
|
86
|
+
</XklUpload>
|
|
87
|
+
<slot v-else :name="item.prop"></slot>
|
|
88
|
+
<slot :name="item.prop + 'Suffix'"></slot>
|
|
89
|
+
</div>
|
|
48
90
|
</el-form-item>
|
|
49
91
|
</el-col>
|
|
50
92
|
</template>
|
|
51
|
-
<el-col :span="searchSpan">
|
|
93
|
+
<el-col v-if="opts.queryVisible !== false" :span="searchSpan">
|
|
52
94
|
<el-form-item label-width="0">
|
|
53
95
|
<div class="query-action">
|
|
54
|
-
<
|
|
96
|
+
<div @click.capture="actionClick()">
|
|
97
|
+
<slot name="_action"></slot>
|
|
98
|
+
</div>
|
|
55
99
|
<span class="collapsible" v-if="opts.collapsible" @click="doCollapse()">
|
|
56
100
|
{{ isCollapse ? '展开' : '收起' }}
|
|
57
101
|
<icon-svg name="down" :class="[isCollapse ? '' : 'rotate']"></icon-svg>
|
|
@@ -60,6 +104,9 @@
|
|
|
60
104
|
</el-form-item>
|
|
61
105
|
</el-col>
|
|
62
106
|
</el-row>
|
|
107
|
+
<AdvancedQuery ref="advancedQueryRef" v-if="advanceQueryShow" :form="form" :table="table"
|
|
108
|
+
@advanced="advancedHandle" @reset="resetHandle">
|
|
109
|
+
</AdvancedQuery>
|
|
63
110
|
</el-form>
|
|
64
111
|
</template>
|
|
65
112
|
<script lang="ts">
|
|
@@ -70,31 +117,60 @@ export default {
|
|
|
70
117
|
<script setup lang="ts">
|
|
71
118
|
import { setUpperFirst } from '@xuekl/cli-utils'
|
|
72
119
|
import { FormItem } from '@xuekl/cli-base/type.d'
|
|
73
|
-
import { ref, watch, onMounted, Ref } from 'vue'
|
|
120
|
+
import { ref, watch, onMounted, Ref, computed, shallowRef, DefineComponent, defineComponent, h, nextTick, useAttrs, onBeforeUnmount, onUnmounted } from 'vue'
|
|
121
|
+
import { useRoute } from 'vue-router'
|
|
74
122
|
import XklSelect from './XklSelect.vue'
|
|
75
123
|
import XklTreeSelect from './XklTreeSelect.vue'
|
|
76
124
|
import XklDict from './XklDict.vue'
|
|
77
125
|
import XklDatePicker from './XklDatePicker.vue'
|
|
78
|
-
import {
|
|
126
|
+
import { formConf } from './index'
|
|
127
|
+
import http from '@/utils/httpRequest'
|
|
128
|
+
import { ElMessage } from 'element-plus'
|
|
129
|
+
const startLoading = window.startLoading
|
|
130
|
+
const finishLoading = window.finishLoading
|
|
79
131
|
|
|
80
|
-
const props = defineProps(['form'])
|
|
132
|
+
const props = defineProps(['form', 'table'])
|
|
81
133
|
const emit = defineEmits(['enter'])
|
|
134
|
+
const attrs: any = useAttrs()
|
|
135
|
+
const route = useRoute()
|
|
82
136
|
const XklFormRef = ref(null)
|
|
83
|
-
const { form } = props
|
|
137
|
+
const { form, table } = props
|
|
84
138
|
const sourceFormList: FormItem[] = []
|
|
85
139
|
const formList: Ref<FormItem[]> = ref([])
|
|
86
140
|
const opts = form._opts || {}
|
|
87
141
|
const isCollapse = ref(true)
|
|
142
|
+
let isByAdvanced = false // 通过高级查询
|
|
143
|
+
let conditionItemList: any[] = [] // 通过高级查询
|
|
88
144
|
if (typeof opts.defaultCollapse !== 'undefined') {
|
|
89
145
|
isCollapse.value = opts.defaultCollapse
|
|
90
146
|
}
|
|
147
|
+
const formConfig = formConf || {} as any
|
|
148
|
+
const formProps = Object.assign({}, formConfig.element, opts.element)
|
|
149
|
+
|
|
150
|
+
form._isAlive = true
|
|
151
|
+
|
|
152
|
+
const labelWidth = computed(() => {
|
|
153
|
+
const docEl = document.documentElement
|
|
154
|
+
const width = docEl.getBoundingClientRect().width;
|
|
155
|
+
const rem = width / 10;
|
|
156
|
+
return (item?) => {
|
|
157
|
+
if (item && item.labelWidth) {
|
|
158
|
+
return ((item.labelWidth / rem) * (rem / 100)) + 'rem'
|
|
159
|
+
}
|
|
160
|
+
return ((opts.labelWidth / rem) * (rem / 100)) + 'rem'
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
|
|
91
164
|
|
|
92
165
|
const enterSubmit = () => {
|
|
93
166
|
emit('enter')
|
|
94
167
|
}
|
|
95
168
|
// 获取符合mode的字段
|
|
96
|
-
|
|
97
|
-
|
|
169
|
+
let modeFields: any = {}
|
|
170
|
+
form._sort = form._sort || []
|
|
171
|
+
let formKeys = Object.keys(form)
|
|
172
|
+
formKeys = [...form._sort, ...formKeys.filter(key => !form._sort.includes(key))]
|
|
173
|
+
formKeys.forEach(prop => {
|
|
98
174
|
if (form['get' + setUpperFirst(prop)]) {
|
|
99
175
|
let field: FormItem = form['get' + setUpperFirst(prop)]()
|
|
100
176
|
if (['query', 'search'].includes(opts.mode)) {
|
|
@@ -110,12 +186,13 @@ Object.keys(form).forEach(prop => {
|
|
|
110
186
|
field.key = field.key || (() => prop)
|
|
111
187
|
field.disabled = field.disabled || (() => false)
|
|
112
188
|
const placeholderStart = ['input', 'textarea'].includes(field.type) ? '请输入' : '请选择'
|
|
189
|
+
const placeholder = placeholderStart + field.label.replace(':', '').replace(':', '')
|
|
113
190
|
if (!['query', 'search'].includes(opts.mode)) {
|
|
114
191
|
if (field.required) {
|
|
115
192
|
// 如果穿了required函数监听required的变化
|
|
116
193
|
watch(field.required, (val) => {
|
|
117
194
|
if (val) {
|
|
118
|
-
field.refRules.value.push({ required: true, message:
|
|
195
|
+
field.refRules.value.push({ required: true, message: placeholder, trigger: 'blur' })
|
|
119
196
|
} else {
|
|
120
197
|
field.refRules.value = field.refRules.value.filter(res => !res.required)
|
|
121
198
|
}
|
|
@@ -123,21 +200,21 @@ Object.keys(form).forEach(prop => {
|
|
|
123
200
|
}
|
|
124
201
|
field.required = field.required || (() => false)
|
|
125
202
|
if (field.required()) {
|
|
126
|
-
field.refRules.value.push({ required: true, message:
|
|
203
|
+
field.refRules.value.push({ required: true, message: placeholder, trigger: 'blur' })
|
|
127
204
|
}
|
|
128
205
|
} else {
|
|
129
206
|
field.refRules.value = field.refRules.value.filter(res => !res.required)
|
|
130
207
|
}
|
|
131
208
|
if (!field.element) {
|
|
132
209
|
field.element = {
|
|
133
|
-
placeholder:
|
|
210
|
+
placeholder: placeholder,
|
|
134
211
|
clearable: true
|
|
135
212
|
}
|
|
136
213
|
if (opts.placeholder === false) {
|
|
137
214
|
field.element.placeholder = ''
|
|
138
215
|
}
|
|
139
216
|
} else {
|
|
140
|
-
field.element.placeholder = field.element.placeholder ||
|
|
217
|
+
field.element.placeholder = field.element.placeholder || placeholder
|
|
141
218
|
field.element.clearable = typeof field.element.clearable === 'undefined' ? true : field.element.clearable
|
|
142
219
|
if (opts.placeholder === false) {
|
|
143
220
|
field.element.placeholder = ''
|
|
@@ -190,21 +267,22 @@ formList.value.forEach(res => {
|
|
|
190
267
|
|
|
191
268
|
let stepLength = 0
|
|
192
269
|
let collapseTotalSpan = 0
|
|
270
|
+
|
|
193
271
|
if (opts.collapsible) {
|
|
194
272
|
let step = 0
|
|
195
273
|
for (let i = 0; i < spans.length; i++) {
|
|
196
|
-
if (step >= 24) {
|
|
197
|
-
stepLength = i
|
|
198
|
-
break
|
|
199
|
-
}
|
|
200
274
|
if (spans[i] === 24) {
|
|
201
275
|
step = step + 0
|
|
202
276
|
} else {
|
|
203
277
|
step = step + spans[i]
|
|
204
278
|
}
|
|
279
|
+
if (step >= 24) {
|
|
280
|
+
stepLength = i
|
|
281
|
+
break
|
|
282
|
+
}
|
|
205
283
|
}
|
|
206
284
|
|
|
207
|
-
for (let i = 0; i < stepLength
|
|
285
|
+
for (let i = 0; i < stepLength; i++) {
|
|
208
286
|
collapseTotalSpan = collapseTotalSpan + spans[i]
|
|
209
287
|
}
|
|
210
288
|
|
|
@@ -212,19 +290,22 @@ if (opts.collapsible) {
|
|
|
212
290
|
|
|
213
291
|
if (opts.collapsible) {
|
|
214
292
|
searchSpan.value = 24 - collapseTotalSpan % 24
|
|
215
|
-
formList.value = sourceFormList.slice(0, stepLength
|
|
293
|
+
formList.value = sourceFormList.slice(0, stepLength)
|
|
216
294
|
} else {
|
|
217
295
|
searchSpan.value = 24 - toalSpan % 24
|
|
218
296
|
formList.value = sourceFormList
|
|
219
297
|
}
|
|
220
298
|
|
|
221
299
|
|
|
300
|
+
const actionClick = () => {
|
|
301
|
+
isByAdvanced = false
|
|
302
|
+
}
|
|
222
303
|
|
|
223
304
|
const doCollapse = () => {
|
|
224
305
|
isCollapse.value = !isCollapse.value
|
|
225
306
|
if (isCollapse.value) {
|
|
226
307
|
searchSpan.value = 24 - collapseTotalSpan % 24
|
|
227
|
-
formList.value = sourceFormList.slice(0, stepLength
|
|
308
|
+
formList.value = sourceFormList.slice(0, stepLength)
|
|
228
309
|
} else {
|
|
229
310
|
searchSpan.value = 24 - toalSpan % 24
|
|
230
311
|
formList.value = sourceFormList
|
|
@@ -237,25 +318,22 @@ const regProto = () => {
|
|
|
237
318
|
let enableSubmit = true;
|
|
238
319
|
let submitTimer: NodeJS.Timeout
|
|
239
320
|
form.submit = (callback: (call: () => void, feils: any) => void) => {
|
|
240
|
-
if (componentGlobal.enableFormSubmit) {
|
|
241
|
-
enableSubmit = true
|
|
242
|
-
}
|
|
243
|
-
componentGlobal.enableFormSubmit = false
|
|
244
321
|
if (enableSubmit) {
|
|
245
322
|
enableSubmit = false;
|
|
246
|
-
clearTimeout(submitTimer)
|
|
247
|
-
submitTimer = setTimeout(() => {
|
|
248
|
-
componentGlobal.enableFormSubmit = true
|
|
249
|
-
enableSubmit = true
|
|
250
|
-
}, 3000)
|
|
251
323
|
sourceFormList.forEach(field => {
|
|
252
324
|
modeFields[field.prop] = (form as any)[field.prop]
|
|
253
325
|
});
|
|
254
326
|
(XklFormRef.value as any).validate((valid: boolean) => {
|
|
255
327
|
if (valid) {
|
|
328
|
+
if (form.enableLoading && startLoading) {
|
|
329
|
+
startLoading()
|
|
330
|
+
}
|
|
256
331
|
callback(() => {
|
|
257
332
|
setTimeout(() => {
|
|
258
333
|
enableSubmit = true
|
|
334
|
+
if (finishLoading) {
|
|
335
|
+
finishLoading()
|
|
336
|
+
}
|
|
259
337
|
}, 300)
|
|
260
338
|
}, modeFields)
|
|
261
339
|
} else {
|
|
@@ -266,21 +344,219 @@ const regProto = () => {
|
|
|
266
344
|
}
|
|
267
345
|
}
|
|
268
346
|
|
|
269
|
-
form.getBinds = () => {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
347
|
+
form.getBinds = (extraForBinds: Object = {}, forAdvanced: string[] = []) => {
|
|
348
|
+
modeFields = {}
|
|
349
|
+
let forBinds: any = {}
|
|
350
|
+
if (isByAdvanced) {
|
|
351
|
+
if (forAdvanced.length) {
|
|
352
|
+
forAdvanced.forEach(key => {
|
|
353
|
+
// 如果高级查询列表中,不存在对应需要补充的键值,才可进行补充
|
|
354
|
+
const conditionItem: any = conditionItemList.find(res => res.field
|
|
355
|
+
&& ((res.field.includes(key) || key.includes(res.field))
|
|
356
|
+
|| (res.field.includes('logOperationOrg') && key.includes('logOperationOrg')))
|
|
357
|
+
&& ['in', 'eq'].includes(res.regulation))
|
|
358
|
+
if (!conditionItem) {
|
|
359
|
+
if (extraForBinds.hasOwnProperty(key)) {
|
|
360
|
+
forBinds[key] = extraForBinds[key]
|
|
361
|
+
} else {
|
|
362
|
+
forBinds[key] = (form as any)[key]
|
|
363
|
+
}
|
|
364
|
+
} else {
|
|
365
|
+
if (Array.isArray((form as any)[key])) {
|
|
366
|
+
if (conditionItem.multipleValue.length) {
|
|
367
|
+
forBinds[key] = conditionItem.multipleValue
|
|
368
|
+
} else {
|
|
369
|
+
forBinds[key] = [conditionItem.fieldValue1]
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
} else {
|
|
373
|
+
if (conditionItem.multipleValue.length) {
|
|
374
|
+
forBinds[key] = conditionItem.multipleValue[0]
|
|
375
|
+
} else {
|
|
376
|
+
forBinds[key] = conditionItem.fieldValue1
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
})
|
|
381
|
+
} else {
|
|
382
|
+
forBinds = extraForBinds
|
|
383
|
+
}
|
|
384
|
+
modeFields.conditionItemList = conditionItemList
|
|
385
|
+
} else {
|
|
386
|
+
forBinds = extraForBinds
|
|
387
|
+
sourceFormList.forEach(field => {
|
|
388
|
+
modeFields[field.prop] = (form as any)[field.prop]
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
Object.assign(modeFields, forBinds)
|
|
273
392
|
return modeFields
|
|
274
393
|
}
|
|
275
394
|
|
|
276
395
|
form.getRef = () => XklFormRef.value
|
|
277
396
|
}
|
|
278
397
|
|
|
398
|
+
const queryName = ref('')
|
|
399
|
+
const historyId = ref('')
|
|
400
|
+
const histories: any = ref([])
|
|
401
|
+
const isDoSave = ref(false)
|
|
402
|
+
const isDoHistory = ref(false)
|
|
403
|
+
const isToDelete = ref(false)
|
|
404
|
+
const queryCondition = ref({})
|
|
405
|
+
|
|
406
|
+
const historySelectConfig = ref({
|
|
407
|
+
url: formConfig.historyApi.query || '/base/mgt/queryMemory/queryMemorySelector',
|
|
408
|
+
// valueTarget: 'expandField1',
|
|
409
|
+
params: () => ({
|
|
410
|
+
pageId: route.name,
|
|
411
|
+
tableId: table.id
|
|
412
|
+
})
|
|
413
|
+
})
|
|
414
|
+
|
|
415
|
+
const toSave = () => {
|
|
416
|
+
isDoSave.value = true
|
|
417
|
+
}
|
|
418
|
+
const doSave = () => {
|
|
419
|
+
if (!props.table) {
|
|
420
|
+
ElMessage.warning("请绑定一个被查询的表格")
|
|
421
|
+
return
|
|
422
|
+
}
|
|
423
|
+
if (!queryName.value) {
|
|
424
|
+
ElMessage.warning("请输入名称")
|
|
425
|
+
return
|
|
426
|
+
}
|
|
427
|
+
http({
|
|
428
|
+
url: http.adornUrl(formConfig.historyApi.add || '/base/mgt/queryMemory/add'),
|
|
429
|
+
method: 'post',
|
|
430
|
+
data: http.adornData({
|
|
431
|
+
pageId: route.name,
|
|
432
|
+
tableId: table.id,
|
|
433
|
+
queryName: queryName.value,
|
|
434
|
+
queryCondition: JSON.stringify(form.getBinds())
|
|
435
|
+
})
|
|
436
|
+
}).then(({ data }) => {
|
|
437
|
+
if (data.code === '0') {
|
|
438
|
+
isDoSave.value = false
|
|
439
|
+
queryName.value = ''
|
|
440
|
+
ElMessage.success("保存成功")
|
|
441
|
+
} else {
|
|
442
|
+
ElMessage.error(data.message)
|
|
443
|
+
}
|
|
444
|
+
})
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const historyLoaded = (list) => {
|
|
448
|
+
histories.value = list
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
const toHistory = () => {
|
|
452
|
+
isDoHistory.value = true
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
const doHistory = (item) => {
|
|
456
|
+
if (item) {
|
|
457
|
+
queryCondition.value = JSON.parse(item.expandField1)
|
|
458
|
+
form.setForm(queryCondition.value)
|
|
459
|
+
} else {
|
|
460
|
+
form.clear()
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
const toDelete = () => {
|
|
465
|
+
if (!histories.value.length) {
|
|
466
|
+
ElMessage.warning("暂无历史记录")
|
|
467
|
+
return
|
|
468
|
+
}
|
|
469
|
+
isToDelete.value = true
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const deleteHistory = (item) => {
|
|
473
|
+
http({
|
|
474
|
+
url: http.adornUrl(`${formConfig.historyApi.delete || '/base/mgt/queryMemory/deleteByIds'}/${item.value}`),
|
|
475
|
+
method: 'get',
|
|
476
|
+
params: http.adornParams({
|
|
477
|
+
})
|
|
478
|
+
}).then(({ data }) => {
|
|
479
|
+
if (data.code === '0') {
|
|
480
|
+
histories.value = histories.value.filter(res => res.value !== item.value)
|
|
481
|
+
if (historyId.value === item.value) {
|
|
482
|
+
historyId.value = ''
|
|
483
|
+
}
|
|
484
|
+
if (!histories.value.length) {
|
|
485
|
+
back()
|
|
486
|
+
}
|
|
487
|
+
ElMessage.success("删除成功")
|
|
488
|
+
} else {
|
|
489
|
+
ElMessage.error(data.message)
|
|
490
|
+
}
|
|
491
|
+
})
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
const back = () => {
|
|
495
|
+
if (isToDelete.value) {
|
|
496
|
+
isToDelete.value = false
|
|
497
|
+
return
|
|
498
|
+
}
|
|
499
|
+
isDoSave.value = false
|
|
500
|
+
isDoHistory.value = false
|
|
501
|
+
historyId.value = ''
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
let clear = form.clear.bind(form)
|
|
505
|
+
|
|
506
|
+
form.clear = () => {
|
|
507
|
+
// if (!isByAdvanced) {
|
|
508
|
+
|
|
509
|
+
clear()
|
|
510
|
+
historyId.value = ''
|
|
511
|
+
// }
|
|
512
|
+
// modeFields.conditionItemList = []
|
|
513
|
+
// advancedQueryRef.value?.resetData()
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const advanceQueryShow = ref(false)
|
|
517
|
+
const advancedQueryRef = ref()
|
|
518
|
+
|
|
519
|
+
const advancedQuery = () => {
|
|
520
|
+
advanceQueryShow.value = true
|
|
521
|
+
nextTick(() => {
|
|
522
|
+
advancedQueryRef.value.init(form, table)
|
|
523
|
+
})
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
const advancedHandle = (conditions) => {
|
|
527
|
+
// modeFields.conditionItemList = conditions
|
|
528
|
+
// emit('advanced', conditions)
|
|
529
|
+
isByAdvanced = true
|
|
530
|
+
conditionItemList = conditions
|
|
531
|
+
attrs.onAdvanced(conditions)
|
|
532
|
+
//modeFields.conditionItemList = []
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
const resetHandle = (conditions) => {
|
|
536
|
+
// modeFields.conditionItemList = conditions
|
|
537
|
+
isByAdvanced = true
|
|
538
|
+
conditionItemList = conditions
|
|
539
|
+
attrs.onReset(conditions)
|
|
540
|
+
}
|
|
541
|
+
|
|
279
542
|
onMounted(() => {
|
|
280
543
|
regProto()
|
|
544
|
+
if (form.defaultAdvance) {
|
|
545
|
+
advanceQueryShow.value = true
|
|
546
|
+
nextTick(() => {
|
|
547
|
+
advancedQueryRef.value.useDefaultValues(form, table)
|
|
548
|
+
})
|
|
549
|
+
}
|
|
281
550
|
})
|
|
282
551
|
|
|
283
|
-
|
|
552
|
+
onBeforeUnmount(() => {
|
|
553
|
+
form.clear = clear
|
|
554
|
+
form.submit = null
|
|
555
|
+
form.getRef = null
|
|
556
|
+
form._isAlive = false
|
|
557
|
+
// form.getBinds = null
|
|
558
|
+
// sourceFormList.length = 0
|
|
559
|
+
})
|
|
284
560
|
|
|
285
561
|
</script>
|
|
286
562
|
<style lang="scss" scoped>
|
|
@@ -306,4 +582,82 @@ onMounted(() => {
|
|
|
306
582
|
position: absolute;
|
|
307
583
|
left: -5000px;
|
|
308
584
|
}
|
|
585
|
+
|
|
586
|
+
.xkl-item-inner {
|
|
587
|
+
width: 100%;
|
|
588
|
+
display: flex;
|
|
589
|
+
align-items: center;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
.history-link {
|
|
593
|
+
display: flex;
|
|
594
|
+
justify-content: flex-end;
|
|
595
|
+
align-items: center;
|
|
596
|
+
// padding-bottom: 18px;
|
|
597
|
+
font-size: 14px;
|
|
598
|
+
color: #666;
|
|
599
|
+
min-height: 26px;
|
|
600
|
+
margin-bottom: 18px;
|
|
601
|
+
|
|
602
|
+
.do_save {
|
|
603
|
+
// width: 300px;
|
|
604
|
+
display: flex;
|
|
605
|
+
align-items: center;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
.save-handle {
|
|
609
|
+
display: flex;
|
|
610
|
+
align-items: center;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
.save-tip {
|
|
614
|
+
display: flex;
|
|
615
|
+
align-items: center;
|
|
616
|
+
flex-wrap: wrap;
|
|
617
|
+
justify-content: flex-end;
|
|
618
|
+
gap: 6px;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.history-list {
|
|
623
|
+
border: 1px solid #f0f2f5;
|
|
624
|
+
max-height: 100px;
|
|
625
|
+
overflow-y: auto;
|
|
626
|
+
padding: 5px;
|
|
627
|
+
// width: 300px;
|
|
628
|
+
|
|
629
|
+
.delete-item {
|
|
630
|
+
display: inline-block;
|
|
631
|
+
padding: 2px 5px;
|
|
632
|
+
background-color: #f0f2f5;
|
|
633
|
+
margin-right: 5px;
|
|
634
|
+
margin-bottom: 5px;
|
|
635
|
+
border-radius: 4px;
|
|
636
|
+
font-size: 12px;
|
|
637
|
+
cursor: pointer;
|
|
638
|
+
max-width: 200px;
|
|
639
|
+
text-overflow: ellipsis;
|
|
640
|
+
overflow: hidden;
|
|
641
|
+
white-space: nowrap;
|
|
642
|
+
position: relative;
|
|
643
|
+
padding-right: 22px;
|
|
644
|
+
|
|
645
|
+
&::after {
|
|
646
|
+
content: 'x';
|
|
647
|
+
display: inline-flex;
|
|
648
|
+
color: #909399;
|
|
649
|
+
height: 16px;
|
|
650
|
+
width: 16px;
|
|
651
|
+
border-radius: 8px;
|
|
652
|
+
font-size: 12px;
|
|
653
|
+
align-items: center;
|
|
654
|
+
justify-content: center;
|
|
655
|
+
margin-left: 5px;
|
|
656
|
+
position: absolute;
|
|
657
|
+
right: 0;
|
|
658
|
+
top: 50%;
|
|
659
|
+
transform: translateY(-50%);
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
309
663
|
</style>
|