@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/XklForm.vue CHANGED
@@ -1,57 +1,101 @@
1
1
  <template>
2
- <el-form ref="XklFormRef" :model="form" :label-width="opts.labelWidth" @keyup.enter.native="enterSubmit()">
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 type="text" />
5
- <input type="password" />
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.labelWidth" :prop="item.prop"
43
+ <el-form-item :label="item.label" :label-width="labelWidth(item)" :prop="item.prop"
11
44
  :rules="item.refRules">
12
- <el-input v-if="item.type === 'input'" v-model="form[item.prop]" v-bind="item.element"
13
- v-on="item.events" :disabled="item.disabled()"></el-input>
14
- <el-input-number v-else-if="item.type === 'input-number'" v-model="form[item.prop]"
15
- v-bind="item.element" v-on="item.events" :disabled="item.disabled()"
16
- style="width: 100%;"></el-input-number>
17
- <el-input v-else-if="item.type === 'textarea'" v-model="form[item.prop]" v-bind="item.element"
18
- :disabled="item.disabled()" v-on="item.events" type="textarea"></el-input>
19
- <XklSelect v-else-if="item.type === 'select'" v-model="form[item.prop]"
20
- v-model:label="form[item.prop + 'Label']" :list="item.list" :config="{}" v-bind="item.element"
21
- v-on="item.events" :disabled="item.disabled()">
22
- </XklSelect>
23
- <XklDict v-else-if="item.type === 'dict-select'" v-model="form[item.prop]"
24
- v-model:label="form[item.prop + 'Label']" :config="item.config" v-bind="item.element"
25
- v-on="item.events" :disabled="item.disabled()"></XklDict>
26
- <XklSelect v-else-if="item.type === 'url-select'" v-model="form[item.prop]" :key="item.key()"
27
- v-model:label="form[item.prop + 'Label']" :config="item.config" v-bind="item.element"
28
- v-on="item.events" :disabled="item.disabled()">
29
- </XklSelect>
30
- <XklTreeSelect v-else-if="item.type === 'tree-select'" v-model="form[item.prop]"
31
- :config="item.config" v-bind="item.element" v-on="item.events" :disabled="item.disabled()">
32
- </XklTreeSelect>
33
- <el-radio-group v-else-if="item.type === 'radio'" v-model="form[item.prop]" v-bind="item.element"
34
- v-on="item.events" :disabled="item.disabled()">
35
- <el-radio v-for="ra in item.list" :label="ra.value" :key="ra.value">{{ ra.label }}</el-radio>
36
- </el-radio-group>
37
- <el-checkbox-group v-else-if="item.type === 'checkbox'" v-model="form[item.prop]"
38
- v-bind="item.element" v-on="item.events" :disabled="item.disabled()">
39
- <el-checkbox v-for="ch in item.list" :label="ch.value" :key="ch.value">{{ ch.label
40
- }}</el-checkbox>
41
- </el-checkbox-group>
42
- <XklDatePicker v-else-if="item.type === 'date-picker'" v-model="form[item.prop]"
43
- v-bind="item.element" v-on="item.events" style="width: 100%;"></XklDatePicker>
44
- <XklUpload v-else-if="item.type === 'upload'" :key="form[item.prop].length > 0"
45
- v-model="form[item.prop]" :config="item.config" v-bind="item.element" v-on="item.events">
46
- </XklUpload>
47
- <slot v-else :name="item.prop"></slot>
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
- <slot name="_action"></slot>
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 { componentGlobal } from '@xuekl/cli-base/global'
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
- const modeFields: any = {}
97
- Object.keys(form).forEach(prop => {
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: placeholderStart + field.label, trigger: 'blur' })
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: placeholderStart + field.label, trigger: 'blur' })
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: placeholderStart + field.label.replace(':', '').replace(':', ''),
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 || placeholderStart + field.label.replace(':', '').replace(':', '')
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 - 1; i++) {
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 - 1)
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 - 1)
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
- sourceFormList.forEach(field => {
271
- modeFields[field.prop] = (form as any)[field.prop]
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>