n20-common-lib 2.5.5-beta.2 → 2.5.5-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/components/AdvancedFilter/form-item-input.vue +13 -9
- package/src/components/AdvancedFilter/index.vue +116 -40
- package/src/components/ApprovalRecord/index.vue +4 -0
- package/src/components/DatePicker/por.vue +58 -2
- package/src/components/Pagination/index.vue +7 -0
- package/src/components/TablePro/index.vue +1 -1
- package/src/components/Upload/uploadMsg.vue +4 -1
- package/src/i18n.json +3 -0
- package/src/utils/amountInWords.js +69 -34
- package/src/components/AdvancedFilter/filterList.vue +0 -163
package/package.json
CHANGED
|
@@ -50,7 +50,16 @@
|
|
|
50
50
|
:style="{
|
|
51
51
|
width:
|
|
52
52
|
form[item.value] && form[item.value].length > 0
|
|
53
|
-
?
|
|
53
|
+
? context.measureText(
|
|
54
|
+
item.options.find(
|
|
55
|
+
(r) =>
|
|
56
|
+
r.value === form[item.value] ||
|
|
57
|
+
(item.props && item.props.valueKey && r[item.props.valueKey] === form[item.value])
|
|
58
|
+
).label
|
|
59
|
+
).width *
|
|
60
|
+
1.4 +
|
|
61
|
+
48 +
|
|
62
|
+
'px'
|
|
54
63
|
: 120 - 18 - context.measureText(item.label).width * 1.4 + 'px'
|
|
55
64
|
}"
|
|
56
65
|
v-bind="item.props"
|
|
@@ -150,10 +159,6 @@ export default {
|
|
|
150
159
|
type: Object,
|
|
151
160
|
default: undefined
|
|
152
161
|
},
|
|
153
|
-
data: {
|
|
154
|
-
type: Array,
|
|
155
|
-
default: undefined
|
|
156
|
-
},
|
|
157
162
|
item: {
|
|
158
163
|
type: Object,
|
|
159
164
|
default: undefined
|
|
@@ -165,16 +170,15 @@ export default {
|
|
|
165
170
|
}
|
|
166
171
|
},
|
|
167
172
|
created() {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
173
|
+
if (this.item.reqOptions) {
|
|
174
|
+
this.getOptions()
|
|
175
|
+
}
|
|
171
176
|
},
|
|
172
177
|
methods: {
|
|
173
178
|
getOptions() {
|
|
174
179
|
let reqOptions = this.item.reqOptions
|
|
175
180
|
let url = reqOptions.url || ''
|
|
176
181
|
url = url.includes('?') ? `${url}r=${Math.random()}` : `${url}?r=${Math.random()}`
|
|
177
|
-
|
|
178
182
|
axios({
|
|
179
183
|
...reqOptions,
|
|
180
184
|
url: url,
|
|
@@ -1,57 +1,54 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div :class="prefixCls">
|
|
3
|
-
<
|
|
3
|
+
<el-form v-if="visible" :class="prefixCls + '-body'">
|
|
4
4
|
<slot name="prefix"></slot>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
v-if="visible"
|
|
11
|
-
:width="width"
|
|
12
|
-
:form="model"
|
|
13
|
-
class="custom-advance-filter"
|
|
14
|
-
:prefix-cls="prefixCls"
|
|
15
|
-
:filter-id="filterId"
|
|
16
|
-
:filter-list="filterList"
|
|
17
|
-
@change="$emit('change', model)"
|
|
18
|
-
@clear="$emit('clear')"
|
|
19
|
-
>
|
|
20
|
-
<div
|
|
21
|
-
v-if="$slots.prefix"
|
|
22
|
-
slot="prefix"
|
|
23
|
-
class="el-form-item el-form-item--small n20-advanced-filter-item"
|
|
24
|
-
style="margin-bottom: 11px"
|
|
25
|
-
>
|
|
26
|
-
<slot name="prefix"></slot>
|
|
27
|
-
</div>
|
|
28
|
-
<template v-for="(item, i) in GroupData">
|
|
29
|
-
<template v-if="item && item.slotName" :slot="item.slotName">
|
|
30
|
-
<slot :name="item.slotName"></slot>
|
|
31
|
-
</template>
|
|
32
|
-
</template>
|
|
33
|
-
<div
|
|
34
|
-
v-if="$slots.suffix"
|
|
35
|
-
slot="suffix"
|
|
36
|
-
class="el-form-item el-form-item--small n20-advanced-filter-item"
|
|
37
|
-
style="border: none; margin-bottom: 11px"
|
|
5
|
+
<el-form-item
|
|
6
|
+
v-for="(item, i) in dataC"
|
|
7
|
+
:key="i"
|
|
8
|
+
:class="[prefixCls + '-item', activeClass(item)]"
|
|
9
|
+
:label="item.label"
|
|
38
10
|
>
|
|
39
|
-
<
|
|
40
|
-
|
|
41
|
-
|
|
11
|
+
<div :class="prefixCls + '-content'">
|
|
12
|
+
<slot v-if="item.slotName" :name="item.slotName"></slot>
|
|
13
|
+
<formItemInput v-else :form="model" :item="item" @change="$emit('change')" />
|
|
14
|
+
</div>
|
|
15
|
+
<i :key="i" :class="[prefixCls + '-item-close', 'n20-icon-yichu']" @click="handleClose(item)"></i>
|
|
16
|
+
</el-form-item>
|
|
17
|
+
<slot name="suffix"></slot>
|
|
18
|
+
<el-form-item :class="prefixCls + '-add'">
|
|
19
|
+
<el-button v-popover:advanced_popover onlyicon plain icon="el-icon-plus" />
|
|
20
|
+
<el-popover ref="advanced_popover" placement="bottom-start" trigger="click">
|
|
21
|
+
<el-form>
|
|
22
|
+
<InputSearch
|
|
23
|
+
v-model="search"
|
|
24
|
+
clearable
|
|
25
|
+
class="input-w m-b-s"
|
|
26
|
+
:placeholder="$l('搜索筛选条件')"
|
|
27
|
+
@change="searchFn"
|
|
28
|
+
/>
|
|
29
|
+
<filterItem :filter-list="filterListC" :check-array.sync="checkList" @checked="check" />
|
|
30
|
+
</el-form>
|
|
31
|
+
</el-popover>
|
|
32
|
+
<el-link class="m-l-s f-s-s" :underline="false" icon="n20-icon-qingchu" @click="cleared"> 清除条件</el-link>
|
|
33
|
+
</el-form-item>
|
|
34
|
+
</el-form>
|
|
42
35
|
<div v-else :width="width"></div>
|
|
43
36
|
</div>
|
|
44
37
|
</template>
|
|
45
38
|
|
|
46
39
|
<script>
|
|
47
|
-
import
|
|
40
|
+
import formItemInput from './form-item-input.vue'
|
|
41
|
+
import InputSearch from '../InputSearch/index.vue'
|
|
42
|
+
import filterItem from './filterItem.vue'
|
|
48
43
|
|
|
49
44
|
import mixins from './mixins/index.js'
|
|
50
45
|
const prefixCls = 'n20-advanced-filter'
|
|
51
46
|
export default {
|
|
52
47
|
name: 'AdvancedFilter',
|
|
53
48
|
components: {
|
|
54
|
-
|
|
49
|
+
formItemInput,
|
|
50
|
+
InputSearch,
|
|
51
|
+
filterItem
|
|
55
52
|
},
|
|
56
53
|
mixins: [mixins],
|
|
57
54
|
props: {
|
|
@@ -94,17 +91,96 @@ export default {
|
|
|
94
91
|
showPop: false,
|
|
95
92
|
showPopC: false,
|
|
96
93
|
prefixCls,
|
|
94
|
+
dataC: [],
|
|
95
|
+
filterListC: [],
|
|
97
96
|
remoteList: [],
|
|
98
97
|
checkList: []
|
|
99
98
|
}
|
|
100
99
|
},
|
|
101
|
-
|
|
100
|
+
watch: {
|
|
101
|
+
GroupData: {
|
|
102
|
+
handler(value) {
|
|
103
|
+
this.dataC = value
|
|
104
|
+
},
|
|
105
|
+
immediate: true
|
|
106
|
+
},
|
|
107
|
+
filterList: {
|
|
108
|
+
handler(value) {
|
|
109
|
+
this.filterListC = value
|
|
110
|
+
},
|
|
111
|
+
deep: true,
|
|
112
|
+
immediate: true
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
mounted() {
|
|
116
|
+
this.getFilterList()
|
|
117
|
+
},
|
|
102
118
|
methods: {
|
|
103
119
|
setOptions(key, opts) {
|
|
104
120
|
let item = this.filterList.find((f) => f.value === key)
|
|
105
121
|
if (item) {
|
|
106
122
|
item.options = opts || []
|
|
107
123
|
}
|
|
124
|
+
},
|
|
125
|
+
activeClass(item) {
|
|
126
|
+
console.log(item)
|
|
127
|
+
let flag = ''
|
|
128
|
+
switch (item.type) {
|
|
129
|
+
case 'text':
|
|
130
|
+
case 'search':
|
|
131
|
+
case 'select':
|
|
132
|
+
case 'number':
|
|
133
|
+
case 'date':
|
|
134
|
+
case 'datetime':
|
|
135
|
+
case 'year':
|
|
136
|
+
case 'month':
|
|
137
|
+
case 'week':
|
|
138
|
+
case 'checkbox':
|
|
139
|
+
case 'radio':
|
|
140
|
+
flag = this.model[item.value] ? this.prefixCls + '-active' : ''
|
|
141
|
+
break
|
|
142
|
+
case 'numberrange':
|
|
143
|
+
flag = this.model[item.startValue] && this.model[item.endValue] ? this.prefixCls + '-active' : ''
|
|
144
|
+
break
|
|
145
|
+
case 'daterange':
|
|
146
|
+
case 'datetimerange':
|
|
147
|
+
case ' monthrange':
|
|
148
|
+
flag = this.model[item.startDate] && this.model[item.endDate] ? this.prefixCls + '-active' : ''
|
|
149
|
+
break
|
|
150
|
+
}
|
|
151
|
+
return flag
|
|
152
|
+
},
|
|
153
|
+
handleClose(item) {
|
|
154
|
+
let data = this.GroupData.filter((s) => {
|
|
155
|
+
return s.label !== item.label || s.value !== item.value
|
|
156
|
+
})
|
|
157
|
+
this.saveFilter(data).then(({ code }) => {
|
|
158
|
+
if (code === 200) {
|
|
159
|
+
this.getFilterList()
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
},
|
|
163
|
+
searchFn() {
|
|
164
|
+
this.filterListC = this.cloneDeepFList.filter((r) => {
|
|
165
|
+
return r.label.includes(this.search)
|
|
166
|
+
})
|
|
167
|
+
},
|
|
168
|
+
cleared() {
|
|
169
|
+
this.$emit('clear')
|
|
170
|
+
},
|
|
171
|
+
check(keys) {
|
|
172
|
+
this.checkList = keys
|
|
173
|
+
let groupFilter = []
|
|
174
|
+
if (keys.length > 0) {
|
|
175
|
+
keys.forEach((k) => {
|
|
176
|
+
groupFilter.push(this.filterList.find((s) => s.label === k))
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
this.saveFilter(groupFilter).then(({ code }) => {
|
|
180
|
+
if (code === 200) {
|
|
181
|
+
this.getFilterList()
|
|
182
|
+
}
|
|
183
|
+
})
|
|
108
184
|
}
|
|
109
185
|
}
|
|
110
186
|
}
|
|
@@ -51,6 +51,53 @@ let disabledDate_2 = (t) => {
|
|
|
51
51
|
return t > now
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
let shortcuts_1 = [
|
|
55
|
+
{
|
|
56
|
+
text: $lc('最近一月'),
|
|
57
|
+
onClick(picker) {
|
|
58
|
+
const start = new Date()
|
|
59
|
+
const end = new Date()
|
|
60
|
+
start.setMonth(start.getMonth() - 1)
|
|
61
|
+
start.setHours(0, 0, 0)
|
|
62
|
+
end.setHours(23, 59, 59)
|
|
63
|
+
picker.$emit('pick', [start, end])
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
text: $lc('最近三月'),
|
|
68
|
+
onClick(picker) {
|
|
69
|
+
const start = new Date()
|
|
70
|
+
const end = new Date()
|
|
71
|
+
start.setMonth(start.getMonth() - 3)
|
|
72
|
+
start.setHours(0, 0, 0)
|
|
73
|
+
end.setHours(23, 59, 59)
|
|
74
|
+
picker.$emit('pick', [start, end])
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
text: $lc('最近六月'),
|
|
79
|
+
onClick(picker) {
|
|
80
|
+
const start = new Date()
|
|
81
|
+
const end = new Date()
|
|
82
|
+
start.setMonth(start.getMonth() - 6)
|
|
83
|
+
start.setHours(0, 0, 0)
|
|
84
|
+
end.setHours(23, 59, 59)
|
|
85
|
+
picker.$emit('pick', [start, end])
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
text: $lc('最近一年'),
|
|
90
|
+
onClick(picker) {
|
|
91
|
+
const start = new Date()
|
|
92
|
+
const end = new Date()
|
|
93
|
+
start.setFullYear(start.getFullYear() - 1)
|
|
94
|
+
start.setHours(0, 0, 0)
|
|
95
|
+
end.setHours(23, 59, 59)
|
|
96
|
+
picker.$emit('pick', [start, end])
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
|
|
54
101
|
let shortcuts_2 = [
|
|
55
102
|
{
|
|
56
103
|
text: $lc('最近一月'),
|
|
@@ -149,6 +196,10 @@ export default {
|
|
|
149
196
|
type: Boolean,
|
|
150
197
|
default: true
|
|
151
198
|
},
|
|
199
|
+
startStop: {
|
|
200
|
+
type: Boolean,
|
|
201
|
+
default: false
|
|
202
|
+
},
|
|
152
203
|
clearable: {
|
|
153
204
|
type: Boolean,
|
|
154
205
|
default: true
|
|
@@ -160,7 +211,8 @@ export default {
|
|
|
160
211
|
},
|
|
161
212
|
data() {
|
|
162
213
|
let shortcuts = undefined
|
|
163
|
-
if (this.shortcuts && ['daterange', 'datetimerange'].includes(this.type))
|
|
214
|
+
if (this.shortcuts && ['daterange', 'datetimerange'].includes(this.type))
|
|
215
|
+
shortcuts = this.startStop ? shortcuts_2 : shortcuts_1
|
|
164
216
|
|
|
165
217
|
this.pickerOptionsAs = Object.assign(
|
|
166
218
|
{
|
|
@@ -171,7 +223,11 @@ export default {
|
|
|
171
223
|
this.pickerOptions
|
|
172
224
|
)
|
|
173
225
|
|
|
174
|
-
this.listeners = Object.assign({}, this.$listeners, {
|
|
226
|
+
this.listeners = Object.assign({}, this.$listeners, {
|
|
227
|
+
input: () => {},
|
|
228
|
+
change: () => {},
|
|
229
|
+
blur: this.HandleBlur
|
|
230
|
+
})
|
|
175
231
|
return {}
|
|
176
232
|
},
|
|
177
233
|
computed: {
|
|
@@ -156,6 +156,13 @@ export default {
|
|
|
156
156
|
this.pageObj[this.pageKey.size] = this.pageObjC[this.pageKey.size]
|
|
157
157
|
this.pageObjC[this.pageKey.total] = this.pageObj[this.pageKey.total]
|
|
158
158
|
this.$emit('change', this.pageObjC)
|
|
159
|
+
},
|
|
160
|
+
pageObj: {
|
|
161
|
+
immediate: true,
|
|
162
|
+
deep: true,
|
|
163
|
+
handler(newValue, oldValue) {
|
|
164
|
+
this.pageObjC = this.pageObj
|
|
165
|
+
}
|
|
159
166
|
}
|
|
160
167
|
},
|
|
161
168
|
methods: {
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
:height="height"
|
|
9
9
|
:class="{ 'cell-default-set--': cellDefault }"
|
|
10
10
|
:checkbox-config="{ checkField: 'checked', checkMethod: forbidSelect }"
|
|
11
|
-
v-bind="Object.assign({ size: size }, $attrs, sizeBind)"
|
|
12
11
|
show-overflow
|
|
13
12
|
show-header-overflow
|
|
14
13
|
:row-config="{ isHover: true, useKey: true, ...$attrs.rowConfig }"
|
|
@@ -23,6 +22,7 @@
|
|
|
23
22
|
...$attrs.sortConfig
|
|
24
23
|
}"
|
|
25
24
|
:filter-config="{ remote: true, iconNone: 'n20-icon-xiala-moren', iconMatch: 'n20-icon-xiala-moren' }"
|
|
25
|
+
v-bind="Object.assign({ size: size }, $attrs, sizeBind)"
|
|
26
26
|
v-on="$listeners"
|
|
27
27
|
@sort-change="(val) => customSortMethod(val)"
|
|
28
28
|
@filter-change="filterChange"
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
<template v-if="!hidePercent">
|
|
14
14
|
<p v-if="!percentType">{{ '系统处理中,请稍等......' | $lc }}</p>
|
|
15
15
|
<div v-else>
|
|
16
|
-
<div v-if="validateResult" class="m-b"
|
|
16
|
+
<div v-if="validateResult" class="m-b">
|
|
17
|
+
<span class="m-r-m">{{ '导入文件' | $lc }}</span
|
|
18
|
+
>{{ validateResult.name }}
|
|
19
|
+
</div>
|
|
17
20
|
<div class="flex-box">
|
|
18
21
|
<div class="m-r-m">{{ '导入进度' | $lc }}</div>
|
|
19
22
|
<div class="flex-item">
|
package/src/i18n.json
CHANGED
|
@@ -2,45 +2,80 @@ const CHINESE_NUMERALS = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒'
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
*
|
|
5
|
-
* @param {number|string}
|
|
5
|
+
* @param {number|string} amount 需转换的金额
|
|
6
6
|
*/
|
|
7
|
-
export const convert = (
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
result = '整'
|
|
7
|
+
export const convert = (money) => {
|
|
8
|
+
var cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] //汉字的数字
|
|
9
|
+
var cnIntRadice = ['', '拾', '佰', '仟'] //基本单位
|
|
10
|
+
var cnIntUnits = ['', '万', '亿', '兆'] //对应整数部分扩展单位
|
|
11
|
+
var cnDecUnits = ['角', '分', '毫', '厘'] //对应小数部分单位
|
|
12
|
+
var cnInteger = '整' //整数金额时后面跟的字符
|
|
13
|
+
var cnIntLast = '元' //整数完以后的单位
|
|
14
|
+
//最大处理的数字
|
|
15
|
+
var maxNum = 999999999999999.9999
|
|
16
|
+
var integerNum //金额整数部分
|
|
17
|
+
var decimalNum //金额小数部分
|
|
18
|
+
//输出的中文金额字符串
|
|
19
|
+
var chineseStr = ''
|
|
20
|
+
var parts //分离金额后用的数组,预定义
|
|
21
|
+
if (money == '') {
|
|
22
|
+
return ''
|
|
24
23
|
}
|
|
25
|
-
num = Math.floor(num)
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
money = parseFloat(money)
|
|
26
|
+
if (money >= maxNum) {
|
|
27
|
+
//超出最大处理数字
|
|
28
|
+
return '超出最大处理数字'
|
|
29
|
+
}
|
|
30
|
+
if (money == 0) {
|
|
31
|
+
chineseStr = cnNums[0] + cnIntLast + cnInteger
|
|
32
|
+
return chineseStr
|
|
33
|
+
}
|
|
34
|
+
//四舍五入保留两位小数,转换为字符串
|
|
35
|
+
money = Math.round(money * 100).toString()
|
|
36
|
+
integerNum = money.substr(0, money.length - 2)
|
|
37
|
+
decimalNum = money.substr(money.length - 2)
|
|
38
|
+
//获取整型部分转换
|
|
39
|
+
if (parseInt(integerNum, 10) > 0) {
|
|
40
|
+
var zeroCount = 0
|
|
41
|
+
var IntLen = integerNum.length
|
|
42
|
+
for (var i = 0; i < IntLen; i++) {
|
|
43
|
+
var n = integerNum.substr(i, 1)
|
|
44
|
+
var p = IntLen - i - 1
|
|
45
|
+
var q = p / 4
|
|
46
|
+
var m = p % 4
|
|
47
|
+
if (n == '0') {
|
|
48
|
+
zeroCount++
|
|
49
|
+
} else {
|
|
50
|
+
if (zeroCount > 0) {
|
|
51
|
+
chineseStr += cnNums[0]
|
|
52
|
+
}
|
|
53
|
+
//归零
|
|
54
|
+
zeroCount = 0
|
|
55
|
+
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
|
|
56
|
+
}
|
|
57
|
+
if (m == 0 && zeroCount < 4) {
|
|
58
|
+
chineseStr += cnIntUnits[q]
|
|
59
|
+
}
|
|
33
60
|
}
|
|
34
|
-
|
|
61
|
+
chineseStr += cnIntLast
|
|
62
|
+
}
|
|
63
|
+
//小数部分
|
|
64
|
+
if (decimalNum != '') {
|
|
65
|
+
var decLen = decimalNum.length
|
|
66
|
+
for (var i = 0; i < decLen; i++) {
|
|
67
|
+
var n = decimalNum.substr(i, 1)
|
|
68
|
+
if (n != '0') {
|
|
69
|
+
chineseStr += cnNums[Number(n)] + cnDecUnits[i]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (chineseStr == '') {
|
|
74
|
+
chineseStr += cnNums[0] + cnIntLast + cnInteger
|
|
75
|
+
} else if (decimalNum == '' || /^0*$/.test(decimalNum)) {
|
|
76
|
+
chineseStr += cnInteger
|
|
35
77
|
}
|
|
36
|
-
return
|
|
37
|
-
negativeSign +
|
|
38
|
-
result
|
|
39
|
-
.replace(/(零.)+/g, '零')
|
|
40
|
-
.replace(/零+$/, '')
|
|
41
|
-
.replace(/(零元)$/, '元')
|
|
42
|
-
.replace(/^整$/, '零元整')
|
|
43
|
-
)
|
|
78
|
+
return chineseStr
|
|
44
79
|
}
|
|
45
80
|
/**
|
|
46
81
|
* 单个数字转换
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<el-form :class="prefixCls + '-body'">
|
|
3
|
-
<slot name="prefix"></slot>
|
|
4
|
-
<el-form-item
|
|
5
|
-
v-for="(item, i) in dataC"
|
|
6
|
-
:key="i"
|
|
7
|
-
:class="[prefixCls + '-item', activeClass(item)]"
|
|
8
|
-
:label="item.label"
|
|
9
|
-
>
|
|
10
|
-
<div :class="prefixCls + '-content'">
|
|
11
|
-
<slot v-if="item.slotName" :name="item.slotName"></slot>
|
|
12
|
-
<formItemInput v-else :form="form" :item="item" @change="$emit('change')" />
|
|
13
|
-
</div>
|
|
14
|
-
<i :key="i" :class="[prefixCls + '-item-close', 'n20-icon-yichu']" @click="handleClose(item)"></i>
|
|
15
|
-
</el-form-item>
|
|
16
|
-
<slot name="suffix"></slot>
|
|
17
|
-
<el-form-item :class="prefixCls + '-add'">
|
|
18
|
-
<el-button v-popover:advanced_popover onlyicon plain icon="el-icon-plus" />
|
|
19
|
-
<el-popover ref="advanced_popover" placement="bottom-start" trigger="click">
|
|
20
|
-
<el-form>
|
|
21
|
-
<InputSearch
|
|
22
|
-
v-model="search"
|
|
23
|
-
clearable
|
|
24
|
-
class="input-w m-b-s"
|
|
25
|
-
:placeholder="$l('搜索筛选条件')"
|
|
26
|
-
@change="searchFn"
|
|
27
|
-
/>
|
|
28
|
-
<filterItem :filter-list="filterListC" :check-array.sync="checkList" @checked="check" />
|
|
29
|
-
</el-form>
|
|
30
|
-
</el-popover>
|
|
31
|
-
<el-link class="m-l-s f-s-s" :underline="false" icon="n20-icon-qingchu" @click="cleared"> 清除条件</el-link>
|
|
32
|
-
</el-form-item>
|
|
33
|
-
</el-form>
|
|
34
|
-
</template>
|
|
35
|
-
|
|
36
|
-
<script>
|
|
37
|
-
import formItemInput from './form-item-input.vue'
|
|
38
|
-
import InputSearch from '../InputSearch/index.vue'
|
|
39
|
-
import filterItem from './filterItem.vue'
|
|
40
|
-
import mixins from './mixins/index.js'
|
|
41
|
-
|
|
42
|
-
export default {
|
|
43
|
-
name: 'FilterList',
|
|
44
|
-
components: {
|
|
45
|
-
filterItem,
|
|
46
|
-
InputSearch,
|
|
47
|
-
formItemInput
|
|
48
|
-
},
|
|
49
|
-
mixins: [mixins],
|
|
50
|
-
props: {
|
|
51
|
-
data: {
|
|
52
|
-
type: Array,
|
|
53
|
-
default: () => []
|
|
54
|
-
},
|
|
55
|
-
form: {
|
|
56
|
-
type: Object,
|
|
57
|
-
default: () => ({})
|
|
58
|
-
},
|
|
59
|
-
width: {
|
|
60
|
-
type: String,
|
|
61
|
-
default: '90%'
|
|
62
|
-
},
|
|
63
|
-
filterList: {
|
|
64
|
-
type: Array,
|
|
65
|
-
default: () => []
|
|
66
|
-
},
|
|
67
|
-
filterId: {
|
|
68
|
-
type: String,
|
|
69
|
-
default: ''
|
|
70
|
-
},
|
|
71
|
-
prefixCls: {
|
|
72
|
-
type: String,
|
|
73
|
-
default: ''
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
|
-
data() {
|
|
77
|
-
return {
|
|
78
|
-
search: '',
|
|
79
|
-
dataC: [],
|
|
80
|
-
filterListC: []
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
watch: {
|
|
84
|
-
GroupData: {
|
|
85
|
-
handler(value) {
|
|
86
|
-
this.dataC = value
|
|
87
|
-
},
|
|
88
|
-
immediate: true
|
|
89
|
-
},
|
|
90
|
-
filterList: {
|
|
91
|
-
handler(value) {
|
|
92
|
-
this.filterListC = value
|
|
93
|
-
},
|
|
94
|
-
deep: true,
|
|
95
|
-
immediate: true
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
mounted() {
|
|
99
|
-
this.getFilterList()
|
|
100
|
-
},
|
|
101
|
-
methods: {
|
|
102
|
-
handleClose(item) {
|
|
103
|
-
let data = this.GroupData.filter((s) => {
|
|
104
|
-
return s.label !== item.label || s.value !== item.value
|
|
105
|
-
})
|
|
106
|
-
this.saveFilter(data).then(({ code }) => {
|
|
107
|
-
if (code === 200) {
|
|
108
|
-
this.getFilterList()
|
|
109
|
-
}
|
|
110
|
-
})
|
|
111
|
-
},
|
|
112
|
-
searchFn() {
|
|
113
|
-
this.filterListC = this.cloneDeepFList.filter((r) => {
|
|
114
|
-
return r.label.includes(this.search)
|
|
115
|
-
})
|
|
116
|
-
},
|
|
117
|
-
check(keys) {
|
|
118
|
-
this.checkList = keys
|
|
119
|
-
let groupFilter = []
|
|
120
|
-
if (keys.length > 0) {
|
|
121
|
-
keys.forEach((k) => {
|
|
122
|
-
groupFilter.push(this.filterList.find((s) => s.label === k))
|
|
123
|
-
})
|
|
124
|
-
}
|
|
125
|
-
this.saveFilter(groupFilter).then(({ code }) => {
|
|
126
|
-
if (code === 200) {
|
|
127
|
-
this.getFilterList()
|
|
128
|
-
}
|
|
129
|
-
})
|
|
130
|
-
},
|
|
131
|
-
activeClass(item) {
|
|
132
|
-
let flag = ''
|
|
133
|
-
switch (item.type) {
|
|
134
|
-
case 'text':
|
|
135
|
-
case 'search':
|
|
136
|
-
case 'select':
|
|
137
|
-
case 'number':
|
|
138
|
-
case 'date':
|
|
139
|
-
case 'datetime':
|
|
140
|
-
case 'year':
|
|
141
|
-
case 'month':
|
|
142
|
-
case 'week':
|
|
143
|
-
case 'checkbox':
|
|
144
|
-
case 'radio':
|
|
145
|
-
flag = this.form[item.value] && this.form[item.value].length > 0 ? this.prefixCls + '-active' : ''
|
|
146
|
-
break
|
|
147
|
-
case 'numberrange':
|
|
148
|
-
flag = this.form[item.startValue] && this.form[item.endValue] ? this.prefixCls + '-active' : ''
|
|
149
|
-
break
|
|
150
|
-
case 'daterange':
|
|
151
|
-
case 'datetimerange':
|
|
152
|
-
case ' monthrange':
|
|
153
|
-
flag = this.form[item.startDate] && this.form[item.endDate] ? this.prefixCls + '-active' : ''
|
|
154
|
-
break
|
|
155
|
-
}
|
|
156
|
-
return flag
|
|
157
|
-
},
|
|
158
|
-
cleared() {
|
|
159
|
-
this.$emit('clear')
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
</script>
|