@10yun/cv-mobile-ui 0.3.24 → 0.3.25
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 +5 -2
- package/plugins/request.js +14 -1
- package/ui-cv/cv-banner/cv-banner.vue +23 -14
- package/ui-cv/cv-banner-card/cv-banner-card.vue +24 -16
- package/ui-cv/cv-block/cv-block.vue +6 -6
- package/ui-cv/cv-box/cv-box.vue +6 -7
- package/ui-cv/cv-button/cv-button.vue +32 -13
- package/ui-cv/cv-cell/cv-cell.vue +21 -25
- package/ui-cv/cv-checkbox/cv-checkbox.vue +22 -22
- package/ui-cv/cv-checkbox-tag/cv-checkbox-tag.vue +30 -25
- package/ui-cv/cv-code-sms/cv-code-sms.vue +60 -38
- package/ui-cv/cv-dialog-bottom/cv-dialog-bottom.vue +14 -18
- package/ui-cv/cv-dialog-full/cv-dialog-full.vue +14 -18
- package/ui-cv/cv-dialog-loading/cv-dialog-loading.vue +10 -17
- package/ui-cv/cv-dialog-share/cv-dialog-share.vue +4 -5
- package/ui-cv/cv-draw-barcode/cv-draw-barcode.vue +54 -51
- package/ui-cv/cv-draw-posters/cv-draw-posters.vue +53 -71
- package/ui-cv/cv-draw-progress/cv-draw-progress.vue +44 -39
- package/ui-cv/cv-draw-qrcode/cv-draw-qrcode.vue +48 -45
- package/ui-cv/cv-editor/compressImage.vue +47 -40
- package/ui-cv/cv-editor/cv-editor.vue +234 -124
- package/ui-cv/cv-editor-parse/cv-editor-parse.vue +21 -30
- package/ui-cv/cv-editor-parse/u-parse.vue +21 -30
- package/ui-cv/cv-filter-hm/cv-filter-hm.vue +140 -74
- package/ui-cv/cv-form-group/cv-form-group.vue +11 -13
- package/ui-cv/cv-form-item/cv-form-item.vue +35 -20
- package/ui-cv/cv-form-merge/cv-form-merge.vue +5 -10
- package/ui-cv/cv-geo-local/cv-geo-local.vue +50 -27
- package/ui-cv/cv-icons/cv-icons.vue +24 -19
- package/ui-cv/cv-info/cv-info.vue +9 -11
- package/ui-cv/cv-input-btn/cv-input-btn.vue +34 -13
- package/ui-cv/cv-input-digit/cv-input-digit.vue +31 -18
- package/ui-cv/cv-input-idcard/cv-input-idcard.vue +31 -21
- package/ui-cv/cv-input-number/cv-input-number.vue +29 -14
- package/ui-cv/cv-input-password/cv-input-password.vue +31 -20
- package/ui-cv/cv-input-text/cv-input-text.vue +32 -17
- package/ui-cv/cv-link/cv-link.vue +7 -7
- package/ui-cv/cv-lists-base/cv-lists-base.vue +148 -114
- package/ui-cv/cv-lists-swiper/cv-lists-swipe2r.vue +24 -15
- package/ui-cv/cv-lists-swiper/cv-lists-swiper.vue +85 -63
- package/ui-cv/cv-load-more/cv-load-more.vue +60 -28
- package/ui-cv/cv-message/cv-message.vue +5 -6
- package/ui-cv/cv-nav-col/cv-nav-col.vue +9 -13
- package/ui-cv/cv-nav-group/cv-nav-group.vue +6 -8
- package/ui-cv/cv-nav-row/cv-nav-row.vue +21 -25
- package/ui-cv/cv-picker-date/cv-picker-date.vue +28 -12
- package/ui-cv/cv-picker-datetime/cv-picker-datetime.vue +43 -21
- package/ui-cv/cv-picker-datetime5/cv-picker-datetime5.vue +108 -60
- package/ui-cv/cv-picker-region/cv-picker-region.vue +46 -32
- package/ui-cv/cv-picker-time/cv-picker-time.vue +26 -11
- package/ui-cv/cv-picker1/cv-picker1.vue +32 -17
- package/ui-cv/cv-picker2/cv-picker2.vue +46 -28
- package/ui-cv/cv-picker3/cv-picker3.vue +77 -44
- package/ui-cv/cv-radio/cv-radio.vue +17 -10
- package/ui-cv/cv-radio-sex/cv-radio-sex.vue +20 -21
- package/ui-cv/cv-radio-tag/cv-radio-tag.vue +22 -11
- package/ui-cv/cv-rate/cv-rate.vue +17 -13
- package/ui-cv/cv-search/cv-search.vue +17 -12
- package/ui-cv/cv-skeleton/cv-skeleton.vue +32 -27
- package/ui-cv/cv-skeleton/cv-skeleton2.vue +56 -33
- package/ui-cv/cv-skeleton-group/cv-skeleton-group.vue +4 -6
- package/ui-cv/cv-specs/cv-specs.vue +31 -30
- package/ui-cv/cv-switch/cv-switch.vue +4 -5
- package/ui-cv/cv-tab-lists/cv-tab-lists.vue +189 -128
- package/ui-cv/cv-textarea/cv-textarea.vue +31 -13
- package/ui-cv/cv-treaty/cv-treaty.vue +8 -8
- package/ui-cv/cv-update-app/cv-update-app.vue +68 -53
- package/ui-cv/cv-upload-avatar/cv-upload-avatar.vue +33 -31
- package/ui-cv/cv-upload-img/cv-upload-img.vue +97 -70
- package/ui-cv/dict/area-city.js +612 -612
- package/ui-cv/dict/area-county.js +3392 -3392
- package/ui-cv/dict/area-province.js +35 -35
- package/ui-cv/mixins/mixins-checkbox.js +9 -15
- package/ui-cv/mixins/mixins-common.js +7 -7
- package/ui-cv/mixins/mixins-input.js +11 -12
- package/ui-cv/mixins/mixins-picker.js +9 -13
- package/ui-cv/mixins/mixins-radio.js +10 -14
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<template>
|
|
10
10
|
<!--基础元素-->
|
|
11
11
|
<div class="wxParse" :class="className" v-if="!loading">
|
|
12
|
-
<block v-for="(node,index) of nodes" :key="index">
|
|
12
|
+
<block v-for="(node, index) of nodes" :key="index">
|
|
13
13
|
<wxParseTemplate :node="node" />
|
|
14
14
|
</block>
|
|
15
15
|
</div>
|
|
@@ -24,19 +24,19 @@ export default {
|
|
|
24
24
|
props: {
|
|
25
25
|
loading: {
|
|
26
26
|
type: Boolean,
|
|
27
|
-
default: false
|
|
27
|
+
default: false
|
|
28
28
|
},
|
|
29
29
|
className: {
|
|
30
30
|
type: String,
|
|
31
|
-
default: ''
|
|
31
|
+
default: ''
|
|
32
32
|
},
|
|
33
33
|
content: {
|
|
34
34
|
type: String,
|
|
35
|
-
default: ''
|
|
35
|
+
default: ''
|
|
36
36
|
},
|
|
37
37
|
noData: {
|
|
38
38
|
type: String,
|
|
39
|
-
default: '<div style="color: red;">数据不能为空</div>'
|
|
39
|
+
default: '<div style="color: red;">数据不能为空</div>'
|
|
40
40
|
},
|
|
41
41
|
startHandler: {
|
|
42
42
|
type: Function,
|
|
@@ -45,15 +45,15 @@ export default {
|
|
|
45
45
|
node.attr.class = null;
|
|
46
46
|
node.attr.style = null;
|
|
47
47
|
};
|
|
48
|
-
}
|
|
48
|
+
}
|
|
49
49
|
},
|
|
50
50
|
endHandler: {
|
|
51
51
|
type: Function,
|
|
52
|
-
default: null
|
|
52
|
+
default: null
|
|
53
53
|
},
|
|
54
54
|
charsHandler: {
|
|
55
55
|
type: Function,
|
|
56
|
-
default: null
|
|
56
|
+
default: null
|
|
57
57
|
},
|
|
58
58
|
imageProp: {
|
|
59
59
|
type: Object,
|
|
@@ -62,39 +62,32 @@ export default {
|
|
|
62
62
|
mode: 'aspectFit',
|
|
63
63
|
padding: 0,
|
|
64
64
|
lazyLoad: false,
|
|
65
|
-
domain: ''
|
|
65
|
+
domain: ''
|
|
66
66
|
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
69
|
},
|
|
70
70
|
components: {
|
|
71
|
-
wxParseTemplate
|
|
71
|
+
wxParseTemplate
|
|
72
72
|
},
|
|
73
73
|
data() {
|
|
74
74
|
return {
|
|
75
|
-
imageUrls: []
|
|
75
|
+
imageUrls: []
|
|
76
76
|
};
|
|
77
77
|
},
|
|
78
78
|
computed: {
|
|
79
79
|
nodes() {
|
|
80
|
-
const {
|
|
81
|
-
content,
|
|
82
|
-
noData,
|
|
83
|
-
imageProp,
|
|
84
|
-
startHandler,
|
|
85
|
-
endHandler,
|
|
86
|
-
charsHandler,
|
|
87
|
-
} = this;
|
|
80
|
+
const { content, noData, imageProp, startHandler, endHandler, charsHandler } = this;
|
|
88
81
|
const parseData = content || noData;
|
|
89
82
|
const customHandler = {
|
|
90
83
|
start: startHandler,
|
|
91
84
|
end: endHandler,
|
|
92
|
-
chars: charsHandler
|
|
85
|
+
chars: charsHandler
|
|
93
86
|
};
|
|
94
87
|
const results = HtmlToJson(parseData, customHandler, imageProp, this);
|
|
95
88
|
this.imageUrls = results.imageUrls;
|
|
96
89
|
return results.nodes;
|
|
97
|
-
}
|
|
90
|
+
}
|
|
98
91
|
},
|
|
99
92
|
methods: {
|
|
100
93
|
navigate(href, $event) {
|
|
@@ -104,19 +97,17 @@ export default {
|
|
|
104
97
|
if (!this.imageUrls.length) return;
|
|
105
98
|
uni.previewImage({
|
|
106
99
|
current: src,
|
|
107
|
-
urls: this.imageUrls
|
|
100
|
+
urls: this.imageUrls
|
|
108
101
|
});
|
|
109
102
|
this.$emit('preview', src, $event);
|
|
110
103
|
},
|
|
111
104
|
removeImageUrl(src) {
|
|
112
|
-
const {
|
|
113
|
-
imageUrls
|
|
114
|
-
} = this;
|
|
105
|
+
const { imageUrls } = this;
|
|
115
106
|
imageUrls.splice(imageUrls.indexOf(src), 1);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
118
109
|
};
|
|
119
110
|
</script>
|
|
120
111
|
<style>
|
|
121
|
-
@import
|
|
112
|
+
@import 'u-parse.css';
|
|
122
113
|
</style>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<template>
|
|
10
10
|
<!--基础元素-->
|
|
11
11
|
<div class="wxParse" :class="className" v-if="!loading">
|
|
12
|
-
<block v-for="(node,index) of nodes" :key="index">
|
|
12
|
+
<block v-for="(node, index) of nodes" :key="index">
|
|
13
13
|
<wxParseTemplate :node="node" />
|
|
14
14
|
</block>
|
|
15
15
|
</div>
|
|
@@ -24,19 +24,19 @@ export default {
|
|
|
24
24
|
props: {
|
|
25
25
|
loading: {
|
|
26
26
|
type: Boolean,
|
|
27
|
-
default: false
|
|
27
|
+
default: false
|
|
28
28
|
},
|
|
29
29
|
className: {
|
|
30
30
|
type: String,
|
|
31
|
-
default: ''
|
|
31
|
+
default: ''
|
|
32
32
|
},
|
|
33
33
|
content: {
|
|
34
34
|
type: String,
|
|
35
|
-
default: ''
|
|
35
|
+
default: ''
|
|
36
36
|
},
|
|
37
37
|
noData: {
|
|
38
38
|
type: String,
|
|
39
|
-
default: '<div style="color: red;">数据不能为空</div>'
|
|
39
|
+
default: '<div style="color: red;">数据不能为空</div>'
|
|
40
40
|
},
|
|
41
41
|
startHandler: {
|
|
42
42
|
type: Function,
|
|
@@ -45,15 +45,15 @@ export default {
|
|
|
45
45
|
node.attr.class = null;
|
|
46
46
|
node.attr.style = null;
|
|
47
47
|
};
|
|
48
|
-
}
|
|
48
|
+
}
|
|
49
49
|
},
|
|
50
50
|
endHandler: {
|
|
51
51
|
type: Function,
|
|
52
|
-
default: null
|
|
52
|
+
default: null
|
|
53
53
|
},
|
|
54
54
|
charsHandler: {
|
|
55
55
|
type: Function,
|
|
56
|
-
default: null
|
|
56
|
+
default: null
|
|
57
57
|
},
|
|
58
58
|
imageProp: {
|
|
59
59
|
type: Object,
|
|
@@ -62,39 +62,32 @@ export default {
|
|
|
62
62
|
mode: 'aspectFit',
|
|
63
63
|
padding: 0,
|
|
64
64
|
lazyLoad: false,
|
|
65
|
-
domain: ''
|
|
65
|
+
domain: ''
|
|
66
66
|
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
69
|
},
|
|
70
70
|
components: {
|
|
71
|
-
wxParseTemplate
|
|
71
|
+
wxParseTemplate
|
|
72
72
|
},
|
|
73
73
|
data() {
|
|
74
74
|
return {
|
|
75
|
-
imageUrls: []
|
|
75
|
+
imageUrls: []
|
|
76
76
|
};
|
|
77
77
|
},
|
|
78
78
|
computed: {
|
|
79
79
|
nodes() {
|
|
80
|
-
const {
|
|
81
|
-
content,
|
|
82
|
-
noData,
|
|
83
|
-
imageProp,
|
|
84
|
-
startHandler,
|
|
85
|
-
endHandler,
|
|
86
|
-
charsHandler,
|
|
87
|
-
} = this;
|
|
80
|
+
const { content, noData, imageProp, startHandler, endHandler, charsHandler } = this;
|
|
88
81
|
const parseData = content || noData;
|
|
89
82
|
const customHandler = {
|
|
90
83
|
start: startHandler,
|
|
91
84
|
end: endHandler,
|
|
92
|
-
chars: charsHandler
|
|
85
|
+
chars: charsHandler
|
|
93
86
|
};
|
|
94
87
|
const results = HtmlToJson(parseData, customHandler, imageProp, this);
|
|
95
88
|
this.imageUrls = results.imageUrls;
|
|
96
89
|
return results.nodes;
|
|
97
|
-
}
|
|
90
|
+
}
|
|
98
91
|
},
|
|
99
92
|
methods: {
|
|
100
93
|
navigate(href, $event) {
|
|
@@ -104,19 +97,17 @@ export default {
|
|
|
104
97
|
if (!this.imageUrls.length) return;
|
|
105
98
|
uni.previewImage({
|
|
106
99
|
current: src,
|
|
107
|
-
urls: this.imageUrls
|
|
100
|
+
urls: this.imageUrls
|
|
108
101
|
});
|
|
109
102
|
this.$emit('preview', src, $event);
|
|
110
103
|
},
|
|
111
104
|
removeImageUrl(src) {
|
|
112
|
-
const {
|
|
113
|
-
imageUrls
|
|
114
|
-
} = this;
|
|
105
|
+
const { imageUrls } = this;
|
|
115
106
|
imageUrls.splice(imageUrls.indexOf(src), 1);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
118
109
|
};
|
|
119
110
|
</script>
|
|
120
111
|
<style>
|
|
121
|
-
@import
|
|
112
|
+
@import 'u-parse.css';
|
|
122
113
|
</style>
|
|
@@ -1,47 +1,85 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<view
|
|
3
|
-
|
|
2
|
+
<view
|
|
3
|
+
class="cv-filter-hm"
|
|
4
|
+
:class="{ setDropdownBottom: maskVisibility }"
|
|
5
|
+
:style="{ top: menuTop + 'rpx' }"
|
|
6
|
+
@touchmove.stop.prevent="discard"
|
|
7
|
+
@tap.stop="discard"
|
|
8
|
+
>
|
|
4
9
|
<view class="nav">
|
|
5
|
-
<block v-for="(item,index) in menu" :key="index">
|
|
6
|
-
<view class="first-menu" :class="{
|
|
7
|
-
<text class="name">{{item.name}}</text>
|
|
10
|
+
<block v-for="(item, index) in menu" :key="index">
|
|
11
|
+
<view class="first-menu" :class="{ on: showPage == index }" @tap="togglePage(index)">
|
|
12
|
+
<text class="name">{{ item.name }}</text>
|
|
8
13
|
<!-- <text class="iconfont triangle" :style="'transform:rotate('+triangleDeg[index]+'deg);'"></text> -->
|
|
9
|
-
<cv-icons type="arrow-type1-down" size="12" color="#aaa" :style="'transform:rotate('+triangleDeg[index]+'deg);'" />
|
|
14
|
+
<cv-icons type="arrow-type1-down" size="12" color="#aaa" :style="'transform:rotate(' + triangleDeg[index] + 'deg);'" />
|
|
10
15
|
</view>
|
|
11
16
|
</block>
|
|
12
17
|
</view>
|
|
13
|
-
<view class="mask" :class="{
|
|
14
|
-
<block v-for="(page,page_index) in subData" :key="page_index">
|
|
15
|
-
<view class="sub-menu-class" :class="{
|
|
16
|
-
<block v-if="page.type=='hierarchy'&& page.submenu.length>0">
|
|
17
|
-
<scroll-view
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
<view class="mask" :class="{ show: isShowMask, hide: maskVisibility != true }" @tap="togglePage(showPage)"></view>
|
|
19
|
+
<block v-for="(page, page_index) in subData" :key="page_index">
|
|
20
|
+
<view class="sub-menu-class" :class="{ show: showPage == page_index, hide: pageState[page_index] != true }">
|
|
21
|
+
<block v-if="page.type == 'hierarchy' && page.submenu.length > 0">
|
|
22
|
+
<scroll-view
|
|
23
|
+
class="sub-menu-list"
|
|
24
|
+
:class="[activeMenuArr[page_index].length > 1 ? 'first' : 'alone']"
|
|
25
|
+
:scroll-y="true"
|
|
26
|
+
:scroll-into-view="'first_id' + firstScrollInto"
|
|
27
|
+
>
|
|
28
|
+
<block v-for="(sub, index) in page.submenu" :key="index">
|
|
29
|
+
<view
|
|
30
|
+
class="sub-menu"
|
|
31
|
+
:id="'first_id' + index"
|
|
32
|
+
:class="{ on: activeMenuArr[page_index][0] == index }"
|
|
33
|
+
@tap="selectHierarchyMenu(page_index, index, null, null)"
|
|
34
|
+
>
|
|
22
35
|
<view class="menu-name">
|
|
23
|
-
<text>{{sub.name}}</text>
|
|
36
|
+
<text>{{ sub.name }}</text>
|
|
24
37
|
<!-- <text class="iconfont selected"></text> -->
|
|
25
38
|
</view>
|
|
26
39
|
</view>
|
|
27
40
|
</block>
|
|
28
41
|
</scroll-view>
|
|
29
|
-
<block v-for="(sub,index) in page.submenu" :key="index">
|
|
30
|
-
<scroll-view
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
42
|
+
<block v-for="(sub, index) in page.submenu" :key="index">
|
|
43
|
+
<scroll-view
|
|
44
|
+
class="sub-menu-list not-first"
|
|
45
|
+
:scroll-y="true"
|
|
46
|
+
v-if="activeMenuArr[page_index][0] == index && sub.submenu.length > 0"
|
|
47
|
+
:scroll-into-view="'second_id' + secondScrollInto"
|
|
48
|
+
>
|
|
49
|
+
<block v-for="(sub_second, second_index) in sub.submenu" :key="second_index">
|
|
50
|
+
<view
|
|
51
|
+
class="sub-menu"
|
|
52
|
+
:id="'second_id' + second_index"
|
|
53
|
+
:class="{ on: activeMenuArr[page_index][1] == second_index }"
|
|
54
|
+
>
|
|
55
|
+
<view
|
|
56
|
+
class="menu-name"
|
|
57
|
+
@tap="selectHierarchyMenu(page_index, activeMenuArr[page_index][0], second_index, null)"
|
|
58
|
+
>
|
|
59
|
+
<text>{{ sub_second.name }}</text>
|
|
36
60
|
<!-- <text class="iconfont selected"></text> -->
|
|
37
61
|
</view>
|
|
38
|
-
<view
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<text
|
|
44
|
-
|
|
62
|
+
<view
|
|
63
|
+
class="more-sub-menu"
|
|
64
|
+
v-if="sub_second.submenu && sub.submenu.length > 0 && sub_second.submenu.length > 0"
|
|
65
|
+
>
|
|
66
|
+
<block v-for="(sub2, sub2_index) in sub_second.submenu" :key="sub2_index">
|
|
67
|
+
<text
|
|
68
|
+
v-if="sub_second.showAllSub || sub2_index < 8"
|
|
69
|
+
:class="{
|
|
70
|
+
on: activeMenuArr[page_index][1] == second_index && activeMenuArr[page_index][2] == sub2_index
|
|
71
|
+
}"
|
|
72
|
+
@tap="selectHierarchyMenu(page_index, activeMenuArr[page_index][0], second_index, sub2_index)"
|
|
73
|
+
>
|
|
74
|
+
{{ sub2.name }}
|
|
75
|
+
</text>
|
|
76
|
+
<text
|
|
77
|
+
v-if="sub_second.showAllSub != true && sub2_index == 8 && sub_second.submenu.length > 9"
|
|
78
|
+
@tap="showMoreSub(second_index)"
|
|
79
|
+
>
|
|
80
|
+
更多
|
|
81
|
+
<text class="iconfont triangle"></text>
|
|
82
|
+
</text>
|
|
45
83
|
</block>
|
|
46
84
|
</view>
|
|
47
85
|
</view>
|
|
@@ -49,14 +87,20 @@
|
|
|
49
87
|
</scroll-view>
|
|
50
88
|
</block>
|
|
51
89
|
</block>
|
|
52
|
-
<block v-if="page.type=='filter'">
|
|
90
|
+
<block v-if="page.type == 'filter'">
|
|
53
91
|
<view class="filter">
|
|
54
92
|
<scroll-view class="menu-box" :scroll-y="true">
|
|
55
|
-
<view class="box" v-for="(box,box_index) in page.submenu" :key="box_index">
|
|
56
|
-
<view class="title">{{box.name}}</view>
|
|
93
|
+
<view class="box" v-for="(box, box_index) in page.submenu" :key="box_index">
|
|
94
|
+
<view class="title">{{ box.name }}</view>
|
|
57
95
|
<view class="labels">
|
|
58
|
-
<view
|
|
59
|
-
|
|
96
|
+
<view
|
|
97
|
+
v-for="(label, label_index) in box.submenu"
|
|
98
|
+
:key="label_index"
|
|
99
|
+
@tap="selectFilterLabel(page_index, box_index, label_index)"
|
|
100
|
+
:class="{ on: label.selected }"
|
|
101
|
+
>
|
|
102
|
+
{{ label.name }}
|
|
103
|
+
</view>
|
|
60
104
|
</view>
|
|
61
105
|
</view>
|
|
62
106
|
</scroll-view>
|
|
@@ -66,14 +110,20 @@
|
|
|
66
110
|
</view>
|
|
67
111
|
</view>
|
|
68
112
|
</block>
|
|
69
|
-
<block v-if="page.type=='radio'">
|
|
113
|
+
<block v-if="page.type == 'radio'">
|
|
70
114
|
<view class="filter">
|
|
71
115
|
<scroll-view class="menu-box" :scroll-y="true">
|
|
72
|
-
<view class="box" v-for="(box,box_index) in page.submenu" :key="box_index">
|
|
73
|
-
<view class="title">{{box.name}}</view>
|
|
116
|
+
<view class="box" v-for="(box, box_index) in page.submenu" :key="box_index">
|
|
117
|
+
<view class="title">{{ box.name }}</view>
|
|
74
118
|
<view class="labels">
|
|
75
|
-
<view
|
|
76
|
-
|
|
119
|
+
<view
|
|
120
|
+
v-for="(label, label_index) in box.submenu"
|
|
121
|
+
:key="label_index"
|
|
122
|
+
@tap="selectRadioLabel(page_index, box_index, label_index)"
|
|
123
|
+
:class="{ on: label.selected }"
|
|
124
|
+
>
|
|
125
|
+
{{ label.name }}
|
|
126
|
+
</view>
|
|
77
127
|
</view>
|
|
78
128
|
</view>
|
|
79
129
|
</scroll-view>
|
|
@@ -90,7 +140,7 @@
|
|
|
90
140
|
<script>
|
|
91
141
|
export default {
|
|
92
142
|
component: true,
|
|
93
|
-
name:
|
|
143
|
+
name: 'cvFilterHm',
|
|
94
144
|
data() {
|
|
95
145
|
return {
|
|
96
146
|
subData: [], //菜单数据
|
|
@@ -106,9 +156,9 @@ export default {
|
|
|
106
156
|
//滚动区域定位
|
|
107
157
|
firstScrollInto: 0,
|
|
108
158
|
secondScrollInto: 0,
|
|
109
|
-
componentTop: 0
|
|
159
|
+
componentTop: 0, //组件top
|
|
110
160
|
isReadNewSelect: false
|
|
111
|
-
}
|
|
161
|
+
};
|
|
112
162
|
},
|
|
113
163
|
props: {
|
|
114
164
|
menuTop: {
|
|
@@ -140,7 +190,6 @@ export default {
|
|
|
140
190
|
immediate: true
|
|
141
191
|
},
|
|
142
192
|
defaultSelected(newVal) {
|
|
143
|
-
|
|
144
193
|
if (newVal.length == 0) {
|
|
145
194
|
return;
|
|
146
195
|
}
|
|
@@ -154,14 +203,13 @@ export default {
|
|
|
154
203
|
},
|
|
155
204
|
methods: {
|
|
156
205
|
initMenu() {
|
|
157
|
-
|
|
158
206
|
let tmpMenuActiveArr = [];
|
|
159
207
|
let tmpMenu = [];
|
|
160
208
|
for (let i = 0; i < this.filterData.length; i++) {
|
|
161
209
|
let tmpitem = this.filterData[i];
|
|
162
210
|
tmpMenu.push({
|
|
163
211
|
//如果没有设置name,则取第一个菜单作为menu.name,filter类型则将"筛选"作为menu.name
|
|
164
|
-
name: tmpitem.name || (tmpitem.type ==
|
|
212
|
+
name: tmpitem.name || (tmpitem.type == 'filter' ? '筛选' : tmpitem.submenu[0].name),
|
|
165
213
|
type: tmpitem.type
|
|
166
214
|
});
|
|
167
215
|
//初始化选中项数组-ui状态
|
|
@@ -176,7 +224,12 @@ export default {
|
|
|
176
224
|
}
|
|
177
225
|
this.menu = tmpMenu;
|
|
178
226
|
//初始化选中项数组
|
|
179
|
-
tmpMenuActiveArr =
|
|
227
|
+
tmpMenuActiveArr =
|
|
228
|
+
this.defaultActive.length > 0
|
|
229
|
+
? this.defaultActive
|
|
230
|
+
: this.activeMenuArr.length > 0
|
|
231
|
+
? this.activeMenuArr
|
|
232
|
+
: tmpMenuActiveArr;
|
|
180
233
|
this.defaultActive = [];
|
|
181
234
|
this.activeMenuArr = JSON.parse(JSON.stringify(tmpMenuActiveArr));
|
|
182
235
|
this.shadowActiveMenuArr = JSON.parse(JSON.stringify(tmpMenuActiveArr));
|
|
@@ -191,7 +244,7 @@ export default {
|
|
|
191
244
|
for (var i = 0; i < this.activeMenuArr.length; i++) {
|
|
192
245
|
let row = this.activeMenuArr[i];
|
|
193
246
|
if (this.subData[i].type == 'hierarchy') {
|
|
194
|
-
if (typeof
|
|
247
|
+
if (typeof row[0] == 'number') {
|
|
195
248
|
let tmpsub = this.subData[i].submenu[row[0]];
|
|
196
249
|
if (row.length > 1) {
|
|
197
250
|
tmpsub = tmpsub.submenu[row[1]];
|
|
@@ -214,20 +267,34 @@ export default {
|
|
|
214
267
|
//选中
|
|
215
268
|
selectHierarchyMenu(page_index, level1_index, level2_index, level3_index) {
|
|
216
269
|
//读取记录
|
|
217
|
-
if (
|
|
218
|
-
level1_index
|
|
270
|
+
if (
|
|
271
|
+
level1_index != null &&
|
|
272
|
+
level2_index == null &&
|
|
273
|
+
level3_index == null &&
|
|
274
|
+
this.shadowActiveMenuArr[page_index][0] == level1_index
|
|
275
|
+
) {
|
|
219
276
|
this.activeMenuArr.splice(page_index, 1, JSON.parse(JSON.stringify(this.shadowActiveMenuArr[page_index])));
|
|
220
277
|
} else {
|
|
221
278
|
this.activeMenuArr[page_index].splice(0, 1, level1_index);
|
|
222
|
-
(level2_index != null || this.activeMenuArr[page_index].length >= 2) &&
|
|
223
|
-
|
|
279
|
+
((level2_index != null || this.activeMenuArr[page_index].length >= 2) &&
|
|
280
|
+
this.activeMenuArr[page_index].splice(1, 1, level2_index)) ||
|
|
281
|
+
this.activeMenuArr[page_index].splice(1, 1);
|
|
282
|
+
((level3_index != null || this.activeMenuArr[page_index].length >= 3) &&
|
|
283
|
+
this.activeMenuArr[page_index].splice(2, 1, level3_index)) ||
|
|
284
|
+
this.activeMenuArr[page_index].splice(2, 1);
|
|
224
285
|
}
|
|
225
286
|
//写入结果
|
|
226
|
-
if (
|
|
287
|
+
if (
|
|
288
|
+
level3_index != null ||
|
|
289
|
+
level2_index != null ||
|
|
290
|
+
(level1_index != null && this.subData[page_index].submenu[level1_index].submenu.length == 0)
|
|
227
291
|
) {
|
|
228
292
|
let sub = this.subData[page_index].submenu[level1_index].submenu[level2_index];
|
|
229
293
|
if (this.updateMenuName) {
|
|
230
|
-
this.menu[page_index].name =
|
|
294
|
+
this.menu[page_index].name =
|
|
295
|
+
(level3_index != null && sub.submenu[level3_index].name) ||
|
|
296
|
+
(level2_index != null && sub.name) ||
|
|
297
|
+
this.subData[page_index].submenu[level1_index].name;
|
|
231
298
|
}
|
|
232
299
|
this.shadowActiveMenuArr[page_index] = JSON.parse(JSON.stringify(this.activeMenuArr[page_index]));
|
|
233
300
|
this.togglePage(this.showPage);
|
|
@@ -267,7 +334,6 @@ export default {
|
|
|
267
334
|
},
|
|
268
335
|
//选中单选类label-UI状态
|
|
269
336
|
selectRadioLabel(page_index, box_index, label_index) {
|
|
270
|
-
|
|
271
337
|
let activeIndex = this.activeMenuArr[page_index][box_index][0];
|
|
272
338
|
if (activeIndex == label_index) {
|
|
273
339
|
this.subData[page_index].submenu[box_index].submenu[activeIndex].selected = false;
|
|
@@ -310,7 +376,7 @@ export default {
|
|
|
310
376
|
setTimeout(() => {
|
|
311
377
|
this.isShowMask = true;
|
|
312
378
|
}, 0);
|
|
313
|
-
})
|
|
379
|
+
});
|
|
314
380
|
},
|
|
315
381
|
//hide菜单页
|
|
316
382
|
hidePageLayer(isAnimation) {
|
|
@@ -322,7 +388,7 @@ export default {
|
|
|
322
388
|
}, 200);
|
|
323
389
|
this.confirm();
|
|
324
390
|
} else {
|
|
325
|
-
this.pageState.splice(tmpIndex, 1, false)
|
|
391
|
+
this.pageState.splice(tmpIndex, 1, false);
|
|
326
392
|
}
|
|
327
393
|
this.firstScrollInto = null;
|
|
328
394
|
this.secondScrollInto = null;
|
|
@@ -333,7 +399,7 @@ export default {
|
|
|
333
399
|
|
|
334
400
|
//对结果做一下处理
|
|
335
401
|
index.forEach((item, i) => {
|
|
336
|
-
if (typeof
|
|
402
|
+
if (typeof item[0] == 'object') {
|
|
337
403
|
//针对筛选结果过一个排序
|
|
338
404
|
item.forEach((s, j) => {
|
|
339
405
|
if (s != null) {
|
|
@@ -342,7 +408,10 @@ export default {
|
|
|
342
408
|
});
|
|
343
409
|
item[j] = s;
|
|
344
410
|
s.forEach((v, k) => {
|
|
345
|
-
value[i][j][k] =
|
|
411
|
+
value[i][j][k] =
|
|
412
|
+
v == null || v >= this.subData[i].submenu[j].submenu.length
|
|
413
|
+
? null
|
|
414
|
+
: this.subData[i].submenu[j].submenu[v].value;
|
|
346
415
|
if (this.subData[i].type == 'radio' && value[i][j][k] == null) {
|
|
347
416
|
value[i][j] = [];
|
|
348
417
|
index[i][j] = [];
|
|
@@ -358,7 +427,7 @@ export default {
|
|
|
358
427
|
submenu = submenu.submenu[item[1]];
|
|
359
428
|
value[i][1] = submenu.hasOwnProperty('value') ? submenu.value : null;
|
|
360
429
|
} else {
|
|
361
|
-
value[i][1] = null
|
|
430
|
+
value[i][1] = null;
|
|
362
431
|
}
|
|
363
432
|
if (value[i].length >= 3 && item[2] != null) {
|
|
364
433
|
if (submenu.submenu.length > 0) {
|
|
@@ -371,7 +440,6 @@ export default {
|
|
|
371
440
|
}
|
|
372
441
|
}
|
|
373
442
|
index[i] = item;
|
|
374
|
-
|
|
375
443
|
});
|
|
376
444
|
// 输出
|
|
377
445
|
this.$emit('confirm', {
|
|
@@ -387,7 +455,7 @@ export default {
|
|
|
387
455
|
setTimeout(() => {
|
|
388
456
|
this.showPage = index;
|
|
389
457
|
}, 0);
|
|
390
|
-
})
|
|
458
|
+
});
|
|
391
459
|
this.triangleDeg[index] = 180;
|
|
392
460
|
},
|
|
393
461
|
reloadActiveMenuArr() {
|
|
@@ -429,7 +497,7 @@ export default {
|
|
|
429
497
|
this.firstScrollInto = parseInt(this.activeMenuArr[index][0]);
|
|
430
498
|
this.secondScrollInto = parseInt(this.activeMenuArr[index][1]);
|
|
431
499
|
}, 0);
|
|
432
|
-
})
|
|
500
|
+
});
|
|
433
501
|
} else if (this.menu[index].type == 'radio') {
|
|
434
502
|
//重载筛选页选中状态
|
|
435
503
|
let level = this.shadowActiveMenuArr[index].length;
|
|
@@ -446,7 +514,7 @@ export default {
|
|
|
446
514
|
}
|
|
447
515
|
},
|
|
448
516
|
processActive(tmpitem) {
|
|
449
|
-
let tmpArr = []
|
|
517
|
+
let tmpArr = [];
|
|
450
518
|
if (tmpitem.type == 'hierarchy' && tmpitem.hasOwnProperty('submenu') && tmpitem.submenu.length > 0) {
|
|
451
519
|
let level = this.getMaxFloor(tmpitem.submenu);
|
|
452
520
|
while (level > 0) {
|
|
@@ -480,24 +548,22 @@ export default {
|
|
|
480
548
|
},
|
|
481
549
|
//计算菜单层级
|
|
482
550
|
getMaxFloor(treeData) {
|
|
483
|
-
let floor = 0
|
|
484
|
-
let max = 0
|
|
551
|
+
let floor = 0;
|
|
552
|
+
let max = 0;
|
|
485
553
|
function each(data, floor) {
|
|
486
|
-
data.forEach(e => {
|
|
554
|
+
data.forEach((e) => {
|
|
487
555
|
max = floor > max ? floor : max;
|
|
488
556
|
if (e.hasOwnProperty('submenu') && e.submenu.length > 0) {
|
|
489
|
-
each(e.submenu, floor + 1)
|
|
557
|
+
each(e.submenu, floor + 1);
|
|
490
558
|
}
|
|
491
|
-
})
|
|
559
|
+
});
|
|
492
560
|
}
|
|
493
|
-
each(treeData, 1)
|
|
561
|
+
each(treeData, 1);
|
|
494
562
|
return max;
|
|
495
563
|
},
|
|
496
|
-
discard() {
|
|
497
|
-
|
|
498
|
-
}
|
|
564
|
+
discard() {}
|
|
499
565
|
}
|
|
500
|
-
}
|
|
566
|
+
};
|
|
501
567
|
</script>
|
|
502
568
|
<style>
|
|
503
569
|
.cv-filter-hm {
|