ci-plus 1.1.1 → 1.1.3
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/index.ts +6 -2
- package/package.json +4 -2
- package/src/components.d.ts +6 -0
- package/src/fileRelated/README.md +7 -0
- package/src/fileRelated/ciupload.vue +150 -0
- package/src/fileRelated/index/ciseeFile.ts +4 -0
- package/src/fileRelated/index/ciupload.ts +4 -0
- package/src/fileRelated/index/ciuploadV2.ts +4 -0
- package/src/fileRelated/seeFile.vue +161 -0
- package/src/fileRelated/uploadV2.vue +213 -0
- package/src/identificationCard/barCode.vue +63 -0
- package/src/identificationCard/identificationCard.vue +1469 -0
- package/src/identificationCard/index.ts +4 -0
- package/src/identificationCard/read.md +64 -0
- package/src/index.ts +8 -1
- package/src/sortableTable/headerInput.vue +603 -94
- package/src/sortableTable/index/headerInput.ts +4 -0
- package/src/sortableTable/utils/headerPopover.vue +88 -31
- package/src/utils/Dayjs.ts +27 -0
- package/src/utils/baseApi.ts +38 -0
- package/src/utils/cardPrint.ts +689 -0
- package/src/utils/index.ts +3 -0
|
@@ -3,24 +3,26 @@
|
|
|
3
3
|
<template>
|
|
4
4
|
<div style="display: flex; align-items: center; justify-content: center">
|
|
5
5
|
<span>{{ text }}</span>
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
6
|
+
|
|
7
|
+
<div class="myporpove" id="myinputs">
|
|
8
|
+
<!-- <el-button @click.stop="handleButtonClick"> </el-button> -->
|
|
9
|
+
|
|
10
|
+
<!-- <el-popover
|
|
11
|
+
ref="popover"
|
|
12
|
+
:title="text"
|
|
13
|
+
content="这是一段内容,这是一段内容。"
|
|
14
|
+
:visible="visible"
|
|
15
|
+
>
|
|
16
|
+
<template #reference>
|
|
17
|
+
<div style="width: 23px; height: 16px">
|
|
18
|
+
<svg-icon
|
|
19
|
+
name="mysearch"
|
|
20
|
+
size="15"
|
|
21
|
+
:color="value ? '#2C93FF' : ''"
|
|
22
|
+
@click="toggle"
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
25
|
+
</template>
|
|
24
26
|
<el-select
|
|
25
27
|
v-model="operator"
|
|
26
28
|
class="m-2 input-select"
|
|
@@ -35,114 +37,621 @@
|
|
|
35
37
|
:value="item.value"
|
|
36
38
|
/>
|
|
37
39
|
</el-select>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
40
|
+
</el-popover> -->
|
|
41
|
+
|
|
42
|
+
<header-popover
|
|
43
|
+
:popperStyle="PopperStyle"
|
|
44
|
+
:trigger="trigger"
|
|
45
|
+
:customAttribute="props.column"
|
|
46
|
+
@confirm="confirm"
|
|
47
|
+
@clear="clear"
|
|
48
|
+
@close="close"
|
|
49
|
+
@open="open"
|
|
50
|
+
>
|
|
51
|
+
<template #reference="{ toggle }">
|
|
52
|
+
<div style="width: 40px; height: 30px; line-height: 30px; display: flex">
|
|
53
|
+
<div
|
|
54
|
+
class="orders"
|
|
55
|
+
style="display: flex; flex-direction: column; width: 50%; height: 100%"
|
|
56
|
+
v-if="_ordersConfig.enableOrder"
|
|
57
|
+
>
|
|
58
|
+
<div style="cursor: pointer; height: 50%; line-height: 26px">
|
|
59
|
+
<svg-icon
|
|
60
|
+
name="ordertop"
|
|
61
|
+
size="15"
|
|
62
|
+
:color="hasordersValueAsc ? '#2C93FF' : ''"
|
|
63
|
+
:colorh="'#2C93FF'"
|
|
64
|
+
@click="orderChangtop('asc')"
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
<div style="cursor: pointer; height: 50%; line-height: 20px">
|
|
68
|
+
<svg-icon
|
|
69
|
+
name="orderbot"
|
|
70
|
+
size="15"
|
|
71
|
+
:color="hasordersValueDes ? '#2C93FF' : ''"
|
|
72
|
+
:colorh="'#2C93FF'"
|
|
73
|
+
@click="orderChangbot('des')"
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div
|
|
78
|
+
class="searchs"
|
|
79
|
+
style="cursor: pointer; width: 50%; height: 100%; line-height: 36px"
|
|
80
|
+
v-if="!props.disableFilter"
|
|
81
|
+
>
|
|
82
|
+
<svg-icon
|
|
83
|
+
name="mysearch"
|
|
84
|
+
size="15"
|
|
85
|
+
:color="hasValue ? '#2C93FF' : ''"
|
|
86
|
+
:colorh="'#2C93FF'"
|
|
87
|
+
@click="toggle"
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</template>
|
|
92
|
+
<template #default="{ closeF }">
|
|
93
|
+
<el-select
|
|
94
|
+
v-if="props.type !== 'select'"
|
|
95
|
+
v-model="operator"
|
|
96
|
+
class="m-2 input-select"
|
|
97
|
+
placeholder="请选择查询类型"
|
|
98
|
+
size="default"
|
|
99
|
+
>
|
|
100
|
+
<!-- clearable -->
|
|
101
|
+
<el-option
|
|
102
|
+
v-for="item in operatorOptions"
|
|
103
|
+
:key="item.value"
|
|
104
|
+
:label="item.label"
|
|
105
|
+
:value="item.value"
|
|
106
|
+
:disabled="item.disabled"
|
|
107
|
+
/>
|
|
108
|
+
</el-select>
|
|
109
|
+
|
|
110
|
+
<el-input
|
|
111
|
+
v-if="props.type === 'number'"
|
|
112
|
+
v-model.number="value"
|
|
113
|
+
:placeholder="placeholder"
|
|
114
|
+
@keydown.enter="confirm(closeF)"
|
|
115
|
+
clearable
|
|
116
|
+
/>
|
|
117
|
+
<el-input
|
|
118
|
+
v-else-if="!props.type || props.type === 'text'"
|
|
119
|
+
v-model.trim="value"
|
|
120
|
+
:placeholder="placeholder"
|
|
121
|
+
@keydown.enter="confirm(closeF)"
|
|
122
|
+
clearable
|
|
123
|
+
/>
|
|
124
|
+
<el-select-v2
|
|
125
|
+
v-else-if="props.type === 'select'"
|
|
126
|
+
v-model="selectValue"
|
|
127
|
+
:placeholder="placeholder || _selectConfig.placeholder"
|
|
128
|
+
:size="_selectConfig.selectSize || 'default'"
|
|
129
|
+
:options="_selectConfig.options"
|
|
130
|
+
:clearable="_selectConfig.clearable"
|
|
131
|
+
:filterable="_selectConfig.filterable"
|
|
132
|
+
:multiple="_selectConfig.selectMultiple"
|
|
133
|
+
:collapse-tags-tooltip="_selectConfig.collapseTagsTooltip"
|
|
134
|
+
:collapse-tags="_selectConfig.collapseTags"
|
|
135
|
+
:allow-create="_selectConfig.allowCreate"
|
|
136
|
+
:default-first-option="_selectConfig.defaultFirstOption"
|
|
137
|
+
:popper-class="_selectConfig.popperClass"
|
|
138
|
+
/>
|
|
139
|
+
<div class="date-picker" v-if="props.type === 'date'">
|
|
140
|
+
<el-date-picker
|
|
141
|
+
v-if="props.type === 'date' && operator === 'between'"
|
|
142
|
+
v-model="value"
|
|
143
|
+
type="daterange"
|
|
144
|
+
unlink-panels
|
|
145
|
+
range-separator="至"
|
|
146
|
+
start-placeholder="开始日期"
|
|
147
|
+
end-placeholder="结束日期"
|
|
148
|
+
:shortcuts="shortcuts"
|
|
149
|
+
size="default"
|
|
150
|
+
:style="{ width: '100%' }"
|
|
151
|
+
format="YYYY-MM-DD"
|
|
152
|
+
value-format="YYYY-MM-DD"
|
|
153
|
+
/>
|
|
154
|
+
<el-date-picker
|
|
155
|
+
v-else-if="props.type === 'date' && operator !== 'between'"
|
|
156
|
+
v-model="value"
|
|
157
|
+
type="date"
|
|
158
|
+
:placeholder="placeholder"
|
|
159
|
+
:shortcuts="shortcutsDay"
|
|
160
|
+
size="default"
|
|
161
|
+
:style="{ width: '100%' }"
|
|
162
|
+
format="YYYY-MM-DD"
|
|
163
|
+
value-format="YYYY-MM-DD"
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
166
|
+
</template>
|
|
167
|
+
</header-popover>
|
|
168
|
+
</div>
|
|
54
169
|
</div>
|
|
55
170
|
</template>
|
|
56
171
|
|
|
57
172
|
<script setup lang="ts">
|
|
173
|
+
defineOptions({ name: 'ci-headerInput' })
|
|
58
174
|
import SvgIcon from '@/components/SvgIcon.vue'
|
|
59
|
-
import { computed, ref } from 'vue'
|
|
175
|
+
import { computed, ref, watch, toRefs } from 'vue'
|
|
176
|
+
import lodash from 'lodash'
|
|
60
177
|
import headerPopover from './utils/headerPopover.vue'
|
|
61
|
-
import filterIconVue from './utils/filterIcon.vue'
|
|
62
178
|
import { TooltipTriggerType } from 'element-plus'
|
|
63
|
-
|
|
64
|
-
import { storeToRefs } from 'pinia'
|
|
65
|
-
import { removeParamsFilters } from './utils/removeParamsFilters'
|
|
66
|
-
const store = useWeighingStore()
|
|
179
|
+
const popover = ref()
|
|
67
180
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
text?: string
|
|
181
|
+
// 定义 props 的类型
|
|
182
|
+
interface SelectConfig {
|
|
183
|
+
options: any[]
|
|
72
184
|
placeholder?: string
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
185
|
+
selectSize?: string
|
|
186
|
+
selectDisabled?: boolean
|
|
187
|
+
clearable?: boolean
|
|
188
|
+
filterable?: boolean
|
|
189
|
+
collapseTags?: boolean
|
|
190
|
+
collapseTagsTooltip?: boolean
|
|
191
|
+
selectMultiple?: boolean
|
|
192
|
+
allowCreate?: boolean
|
|
193
|
+
defaultFirstOption?: boolean
|
|
194
|
+
popperClass?: string
|
|
195
|
+
selectStyle?: string
|
|
196
|
+
selectAll?: boolean
|
|
197
|
+
selectAllLabel?: string
|
|
198
|
+
selectAllPlaceholder?: string
|
|
199
|
+
optionValue?: string
|
|
200
|
+
optionLabel?: string
|
|
201
|
+
}
|
|
202
|
+
// 定义排序的类型
|
|
203
|
+
interface OrdersConfig {
|
|
204
|
+
enableOrder: boolean // 是否开启排序 默认false 关闭的
|
|
205
|
+
initOrder: 'true' | 'false' | '' // 默认是否升序排序 默认''
|
|
206
|
+
}
|
|
207
|
+
interface Props {
|
|
208
|
+
column: string // 当前列的key值
|
|
209
|
+
text: string // 表头列显示的文本
|
|
210
|
+
storePar: any // 缓存store中的params赛选参数
|
|
211
|
+
placeholder?: string // 提醒
|
|
212
|
+
initValue?: string | number // 初始值
|
|
213
|
+
disableFilter?: boolean // 是否禁用筛选功能 默认 false
|
|
214
|
+
type?: 'text' | 'number' | 'select' | 'date' // 输入框类型
|
|
215
|
+
popperStyle?: { width: string; height: string } // 弹出面板的自定义样式
|
|
216
|
+
trigger?: TooltipTriggerType // 触发方式
|
|
217
|
+
selectConfig?: SelectConfig // select下拉选项时的 配置项
|
|
218
|
+
ordersConfig?: OrdersConfig // 排序的配置项
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// 使用 defineProps 和 withDefaults 来声明 props 并设置默认值
|
|
222
|
+
|
|
223
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
224
|
+
type: 'text',
|
|
225
|
+
initValue: '',
|
|
226
|
+
disableFilter: false,
|
|
227
|
+
// storePar: () => {},
|
|
228
|
+
popperStyle: () => ({ width: '240px', height: '100px' }),
|
|
229
|
+
selectConfig: (): SelectConfig => ({
|
|
230
|
+
placeholder: '请选择', // 输入框的placeholder提示
|
|
231
|
+
selectSize: 'default', // 输入框的大小
|
|
232
|
+
selectDisabled: false, // 输入框的disabled属性
|
|
233
|
+
clearable: true, // 是否有清除按钮
|
|
234
|
+
filterable: true, // 是否可搜索
|
|
235
|
+
collapseTags: true, // 是否折叠tag
|
|
236
|
+
collapseTagsTooltip: true, // 是否显示tag的tooltip提示
|
|
237
|
+
selectMultiple: false, // 是否多选
|
|
238
|
+
allowCreate: false, // 是否允许创建新条目
|
|
239
|
+
defaultFirstOption: true, // 是否默认高亮第一个选项
|
|
240
|
+
popperClass: '', // popper的class类名
|
|
241
|
+
selectStyle: '', // 输入框的style样式
|
|
242
|
+
selectAll: false, // 是否显示全选按钮
|
|
243
|
+
selectAllLabel: '全选', // 全选按钮的文本
|
|
244
|
+
selectAllPlaceholder: '请选择', // 全选按钮的placeholder提示
|
|
245
|
+
options: [], //select下拉选项时的 列表数据
|
|
246
|
+
optionValue: 'value', // 选项的默认value值
|
|
247
|
+
optionLabel: 'label' // 选项的默认label值
|
|
248
|
+
})
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
// console.log('props表头', props)
|
|
252
|
+
// 根据传参重置下拉列配置参数的默认值
|
|
253
|
+
const _selectConfig = computed((): SelectConfig => {
|
|
254
|
+
let obj = {
|
|
255
|
+
placeholder: '请选择', // 输入框的placeholder提示
|
|
256
|
+
selectSize: 'default', // 输入框的大小
|
|
257
|
+
selectDisabled: false, // 输入框的disabled属性
|
|
258
|
+
clearable: true, // 是否有清除按钮
|
|
259
|
+
filterable: true, // 是否可搜索
|
|
260
|
+
collapseTags: true, // 是否折叠tag
|
|
261
|
+
collapseTagsTooltip: true, // 是否显示tag的tooltip提示
|
|
262
|
+
selectMultiple: false, // 是否多选
|
|
263
|
+
allowCreate: false, // 是否允许创建新条目
|
|
264
|
+
defaultFirstOption: true, // 是否默认高亮第一个选项
|
|
265
|
+
popperClass: '', // popper的class类名
|
|
266
|
+
selectStyle: '', // 输入框的style样式
|
|
267
|
+
selectAll: false, // 是否显示全选按钮
|
|
268
|
+
selectAllLabel: '全选', // 全选按钮的文本
|
|
269
|
+
selectAllPlaceholder: '请选择', // 全选按钮的placeholder提示
|
|
270
|
+
options: [], //select下拉选项时的 列表数据
|
|
271
|
+
optionValue: 'value', // 选项的默认value值
|
|
272
|
+
optionLabel: 'label' // 选项的默认label值
|
|
273
|
+
}
|
|
274
|
+
return lodash.assign(obj, props.selectConfig || {})
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
// 根据传参重置排序配置参数的默认值
|
|
278
|
+
const _ordersConfig = computed((): OrdersConfig => {
|
|
279
|
+
let obj = {
|
|
280
|
+
enableOrder: false, // 是否开启排序 默认 false 关闭的
|
|
281
|
+
initOrder: '' // 默认是否升序排序 默认不排序''
|
|
282
|
+
}
|
|
283
|
+
return lodash.assign(obj, props.ordersConfig)
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
// sql语句中的比较运算符号列表 operator
|
|
287
|
+
const operatorOptions = ref<
|
|
288
|
+
{
|
|
289
|
+
value: string
|
|
290
|
+
label: string
|
|
291
|
+
disabled?: boolean
|
|
292
|
+
}[]
|
|
293
|
+
>([
|
|
294
|
+
{
|
|
295
|
+
value: 'like',
|
|
296
|
+
label: '包含'
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
value: '=',
|
|
300
|
+
label: '等于'
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
value: '>',
|
|
304
|
+
label: '大于'
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
value: '>=',
|
|
308
|
+
label: '大于等于'
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
value: '<',
|
|
312
|
+
label: '小于'
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
value: '<=',
|
|
316
|
+
label: '小于等于'
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
value: '<>',
|
|
320
|
+
label: '不等于'
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
value: 'between',
|
|
324
|
+
label: '介于'
|
|
325
|
+
}
|
|
326
|
+
])
|
|
327
|
+
|
|
328
|
+
// 定义 emits
|
|
329
|
+
const emits = defineEmits(['change', 'open', 'getstore'])
|
|
330
|
+
|
|
80
331
|
const initValue = computed(() => {
|
|
81
332
|
if (props.type === 'text') return String(props.initValue) || void 0
|
|
82
333
|
return Number(props.initValue) || void 0
|
|
83
334
|
})
|
|
84
|
-
|
|
335
|
+
|
|
336
|
+
const internalPopperStyle = ref(props.popperStyle) // 创建一个响应式的样式对象
|
|
337
|
+
const PopperStyle = computed(() => internalPopperStyle.value) // 创建计算属性,返回响应式的样式对象
|
|
338
|
+
// 修改 PopperStyle 值的函数
|
|
339
|
+
const updatePopperStyle = (newStyle: Partial<typeof internalPopperStyle.value>) => {
|
|
340
|
+
// 使用 Object.assign 来合并新样式和旧样式
|
|
341
|
+
Object.assign(internalPopperStyle.value, newStyle)
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const hasValue = ref(false) // 判断store中对应列的value是否有值的参数
|
|
345
|
+
const hasordersValueAsc = ref(false) // 判断升序按钮是否有值
|
|
346
|
+
const hasordersValueDes = ref(false) // 判断降序按钮是否有值
|
|
347
|
+
|
|
348
|
+
const value = ref<any>(initValue.value) // 定义筛选输入框的值
|
|
349
|
+
const operator = ref('like') // 运算符默认值
|
|
350
|
+
// 定义排序的值
|
|
351
|
+
const ordersVal = ref<string | number | undefined>(_ordersConfig.value.initOrder || '')
|
|
352
|
+
const selectValue = ref<any>(initValue.value) // 定义select的值
|
|
353
|
+
|
|
354
|
+
// 1、判断:如果是select下拉列表,就隐藏比较运算符选项框,直接赋值'='
|
|
355
|
+
if (props.type === 'select') {
|
|
356
|
+
operator.value = '='
|
|
357
|
+
// 如果单选,给出默认值
|
|
358
|
+
if (!props.selectConfig.selectMultiple && props.selectConfig.optionValue) {
|
|
359
|
+
value.value = props.selectConfig.optionValue
|
|
360
|
+
}
|
|
361
|
+
// 如果为多选将运算符默认值改成'in',将多选的数组值转换成字符串
|
|
362
|
+
if (props.selectConfig.selectMultiple) {
|
|
363
|
+
operator.value = 'in'
|
|
364
|
+
}
|
|
365
|
+
// 将面板宽度调整宽一些
|
|
366
|
+
// 判断props.popperStyle的宽度是否为小于300px,如果是就修改为300px
|
|
367
|
+
if (props.popperStyle.width && parseInt(props.popperStyle.width.replace('px', '')) < 300) {
|
|
368
|
+
updatePopperStyle({ width: '300px' })
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// console.log('PopperStyle.value', PopperStyle.value, props.popperStyle)
|
|
373
|
+
|
|
374
|
+
// 2、 判断:如果是date日期,就隐藏比较运算符选项框,直接赋值'='
|
|
375
|
+
const shortcuts = ref<{ text: string; value: any }[]>([])
|
|
376
|
+
const shortcutsDay = ref<{ text: string; value: any }[]>([])
|
|
377
|
+
if (props.type === 'date') {
|
|
378
|
+
operator.value = 'between'
|
|
379
|
+
// 将包含禁用
|
|
380
|
+
operatorOptions.value[0].disabled = true
|
|
381
|
+
// 判断是否是日期范围
|
|
382
|
+
shortcuts.value = [
|
|
383
|
+
{
|
|
384
|
+
text: '前一周',
|
|
385
|
+
value: () => {
|
|
386
|
+
const end = new Date()
|
|
387
|
+
const start = new Date()
|
|
388
|
+
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
|
|
389
|
+
return [start, end]
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
text: '前一月',
|
|
394
|
+
value: () => {
|
|
395
|
+
const end = new Date()
|
|
396
|
+
const start = new Date()
|
|
397
|
+
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
|
|
398
|
+
return [start, end]
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
text: '最近3个月',
|
|
403
|
+
value: () => {
|
|
404
|
+
const end = new Date()
|
|
405
|
+
const start = new Date()
|
|
406
|
+
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
|
|
407
|
+
return [start, end]
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
]
|
|
411
|
+
shortcutsDay.value = [
|
|
412
|
+
{
|
|
413
|
+
text: '今天',
|
|
414
|
+
value: new Date()
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
text: '昨天',
|
|
418
|
+
value: () => {
|
|
419
|
+
const date = new Date()
|
|
420
|
+
date.setTime(date.getTime() - 3600 * 1000 * 24)
|
|
421
|
+
return date
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
text: '一周前',
|
|
426
|
+
value: () => {
|
|
427
|
+
const date = new Date()
|
|
428
|
+
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
|
|
429
|
+
return date
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
]
|
|
433
|
+
}
|
|
434
|
+
// 不是日期筛选的时候将介于禁用
|
|
435
|
+
if (props.type !== 'date') {
|
|
436
|
+
operatorOptions.value[7].disabled = true
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// 监听operator.value的变化重置value的值
|
|
440
|
+
watch(operator, (newVal, oldVal) => {
|
|
441
|
+
console.log('operator.value: ', newVal, oldVal)
|
|
442
|
+
if (newVal == 'between' || oldVal == 'between') {
|
|
443
|
+
value.value = ''
|
|
444
|
+
}
|
|
445
|
+
})
|
|
85
446
|
|
|
86
447
|
// 返回面板数据
|
|
87
448
|
const confirm = (closeF?: Function) => {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
449
|
+
if (props.selectConfig.selectMultiple) {
|
|
450
|
+
operator.value = 'in'
|
|
451
|
+
value.value = selectValue.value?.join(',') || ''
|
|
452
|
+
} else {
|
|
453
|
+
operator.value = '='
|
|
454
|
+
value.value = selectValue.value
|
|
455
|
+
}
|
|
456
|
+
// 将当前参数的值放到对象中
|
|
457
|
+
let obj = {
|
|
91
458
|
value: value.value,
|
|
92
459
|
operator: operator.value,
|
|
93
460
|
column: props.column,
|
|
94
|
-
|
|
461
|
+
type: 'filter'
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// 判断input输入框中的值是否为空
|
|
465
|
+
|
|
466
|
+
emits('change', obj)
|
|
95
467
|
closeF && closeF()
|
|
96
468
|
}
|
|
97
469
|
|
|
98
470
|
// 清除按钮:清空输入框和发送请求
|
|
99
471
|
const clear = () => {
|
|
100
|
-
console.log('执行清除')
|
|
101
|
-
const go =
|
|
102
|
-
initValue.value !== void 0 &&
|
|
103
|
-
initValue.value !== null &&
|
|
104
|
-
initValue.value !== ''
|
|
105
|
-
// 清除输入框数据
|
|
106
472
|
value.value = void 0
|
|
107
|
-
|
|
108
|
-
// 清除缓存的数据
|
|
109
|
-
removeParamsFilters(store.params.filters, props.column)
|
|
110
|
-
if (go) confirm()
|
|
473
|
+
confirm()
|
|
111
474
|
}
|
|
112
475
|
|
|
113
476
|
// 关闭面板
|
|
114
|
-
const close = () => {
|
|
115
|
-
console.log('关闭面板123', value.value, initValue.value, store.params.filters)
|
|
116
|
-
// if (value.value !== initValue.value) {
|
|
117
|
-
// value.value = initValue.value
|
|
118
|
-
// }
|
|
119
|
-
}
|
|
477
|
+
const close = () => {}
|
|
120
478
|
const open = () => {
|
|
121
479
|
emits('open')
|
|
122
480
|
}
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
481
|
+
/*
|
|
482
|
+
const handleShow = () => {
|
|
483
|
+
console.log('打开')
|
|
484
|
+
visible.value = true
|
|
485
|
+
document.addEventListener('mousedown', handleDocumentClick)
|
|
486
|
+
}
|
|
487
|
+
const handleHide = () => {
|
|
488
|
+
console.log('关闭')
|
|
489
|
+
visible.value = false
|
|
490
|
+
document.removeEventListener('mousedown', handleDocumentClick)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const handleDocumentClick = (e: any) => {
|
|
494
|
+
// 查找所有的class名称为 is-light 的元素
|
|
495
|
+
// const el1 = document.querySelector('.is-light')
|
|
496
|
+
// console.log('el1: ', el1)
|
|
497
|
+
|
|
498
|
+
const elements = document.querySelectorAll('[id^="el-popper-container-"]')
|
|
499
|
+
console.log('elements: ', elements)
|
|
500
|
+
|
|
501
|
+
if (elements && elements.length > 0) {
|
|
502
|
+
for (let i = 0; i < elements.length; i++) {
|
|
503
|
+
const element = elements[i]
|
|
504
|
+
console.log('element: ', element)
|
|
505
|
+
if (element?.contains(e.target)) {
|
|
506
|
+
return
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// 通过自定义属性 aria-label 查找元素
|
|
512
|
+
const el = document.querySelector(`[aria-label="${props.text}"]`)
|
|
513
|
+
console.dir('el: ', el)
|
|
514
|
+
// 获取 el 的class为.is-light的兄弟元素
|
|
515
|
+
const el2 = el?.parentElement?.querySelector('.el-select__popper')
|
|
516
|
+
console.dir('el2: ', el2)
|
|
517
|
+
console.log('是否包含: ', el?.contains(e.target))
|
|
518
|
+
// 获取class为 porpove的元素;
|
|
519
|
+
|
|
520
|
+
// 判断点击的元素是否是是e的子元素
|
|
521
|
+
if (el?.contains(e.target)) {
|
|
522
|
+
return
|
|
523
|
+
}
|
|
524
|
+
if (!popover.value.$el.contains(e.target)) {
|
|
525
|
+
console.log(22222)
|
|
526
|
+
handleHide()
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
const visible = ref(false)
|
|
531
|
+
// const toggle = () => {
|
|
532
|
+
// console.log('visible', visible.value)
|
|
533
|
+
// if (visible.value) {
|
|
534
|
+
// // visible.value = false
|
|
535
|
+
// } else {
|
|
536
|
+
// visible.value = true
|
|
537
|
+
// document.addEventListener('mousedown', handleDocumentClick)
|
|
538
|
+
// lodash.debounce(() => handleShow(), 500)
|
|
539
|
+
// }
|
|
540
|
+
// }
|
|
541
|
+
*/
|
|
542
|
+
// 排序
|
|
543
|
+
const orderChangtop = (val: string) => {
|
|
544
|
+
console.log('升序', ordersVal.value)
|
|
545
|
+
if (ordersVal.value == '' || ordersVal.value == 'false') {
|
|
546
|
+
ordersVal.value = 'true'
|
|
547
|
+
return emits('change', {
|
|
548
|
+
column: props.column,
|
|
549
|
+
asc: ordersVal.value,
|
|
550
|
+
type: 'order'
|
|
551
|
+
})
|
|
552
|
+
}
|
|
553
|
+
if (ordersVal.value == 'true') {
|
|
554
|
+
ordersVal.value = ''
|
|
555
|
+
return emits('change', {
|
|
556
|
+
column: props.column,
|
|
557
|
+
asc: ordersVal.value,
|
|
558
|
+
type: 'order'
|
|
559
|
+
})
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
const orderChangbot = (val: string) => {
|
|
563
|
+
console.log('降序', ordersVal.value)
|
|
564
|
+
if (ordersVal.value == 'false') {
|
|
565
|
+
ordersVal.value = ''
|
|
566
|
+
return emits('change', {
|
|
567
|
+
column: props.column,
|
|
568
|
+
asc: ordersVal.value,
|
|
569
|
+
type: 'order'
|
|
570
|
+
})
|
|
571
|
+
}
|
|
572
|
+
if (ordersVal.value == '' || ordersVal.value == 'true') {
|
|
573
|
+
ordersVal.value = 'false'
|
|
574
|
+
return emits('change', {
|
|
575
|
+
column: props.column,
|
|
576
|
+
asc: ordersVal.value,
|
|
577
|
+
type: 'order'
|
|
578
|
+
})
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// 监听 props.storePar 的filters 和 orders属性 然对应按钮颜色是否改变
|
|
583
|
+
watch(
|
|
584
|
+
() => props.storePar,
|
|
585
|
+
(newVal, oldVal) => {
|
|
586
|
+
// console.log('监听props.storePar', newVal, oldVal)
|
|
587
|
+
if (newVal.filters) {
|
|
588
|
+
// 判断是否是当前列的筛选条件
|
|
589
|
+
const filter = newVal.filters.find((item: any) => item.column == props.column)
|
|
590
|
+
if (filter) {
|
|
591
|
+
// console.log('filter: ', filter.value)
|
|
592
|
+
// 判断是否是当前列的筛选条件
|
|
593
|
+
if (filter.value) {
|
|
594
|
+
hasValue.value = true
|
|
595
|
+
} else {
|
|
596
|
+
hasValue.value = false
|
|
597
|
+
}
|
|
598
|
+
} else {
|
|
599
|
+
hasValue.value = false
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
if (newVal.orders) {
|
|
603
|
+
// 判断是否是当前列的筛选条件
|
|
604
|
+
const order = newVal.orders.find((item: any) => item.column == props.column)
|
|
605
|
+
if (order) {
|
|
606
|
+
// console.log('order: ', order.asc)
|
|
607
|
+
// 判断是否是当前列的筛选条件
|
|
608
|
+
if (order.asc == 'true') {
|
|
609
|
+
hasordersValueAsc.value = true
|
|
610
|
+
hasordersValueDes.value = false
|
|
611
|
+
} else if (order.asc == 'false') {
|
|
612
|
+
hasordersValueAsc.value = false
|
|
613
|
+
hasordersValueDes.value = true
|
|
614
|
+
}
|
|
615
|
+
} else {
|
|
616
|
+
hasordersValueAsc.value = false
|
|
617
|
+
hasordersValueDes.value = false
|
|
618
|
+
}
|
|
619
|
+
}
|
|
140
620
|
},
|
|
141
621
|
{
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
|
|
622
|
+
deep: true,
|
|
623
|
+
immediate: true
|
|
624
|
+
}
|
|
625
|
+
)
|
|
146
626
|
</script>
|
|
147
627
|
|
|
148
|
-
<style scoped lang="scss"
|
|
628
|
+
<style scoped lang="scss">
|
|
629
|
+
.porpove {
|
|
630
|
+
position: relative;
|
|
631
|
+
.header-input-popover {
|
|
632
|
+
position: absolute;
|
|
633
|
+
|
|
634
|
+
height: 100px;
|
|
635
|
+
background-color: #fff;
|
|
636
|
+
border: 1px solid #ccc;
|
|
637
|
+
padding: 10px;
|
|
638
|
+
|
|
639
|
+
top: 30px;
|
|
640
|
+
left: 50%;
|
|
641
|
+
transform: translateX(-50%);
|
|
642
|
+
z-index: 2081;
|
|
643
|
+
position: absolute;
|
|
644
|
+
inset: 159px auto auto 305px;
|
|
645
|
+
width: 230px;
|
|
646
|
+
// box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
|
|
647
|
+
// &::before {
|
|
648
|
+
// content: '';
|
|
649
|
+
// position: absolute;
|
|
650
|
+
// top: -10px;
|
|
651
|
+
// left: 50%;
|
|
652
|
+
// transform: translateX(-50%);
|
|
653
|
+
// border: 5px solid transparent;
|
|
654
|
+
// }
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
</style>
|