|
@@ -1,226 +1,52 @@
|
|
<template>
|
|
<template>
|
|
<selector-card
|
|
<selector-card
|
|
- class="buyerclass-selector card"
|
|
|
|
|
|
+ class="buyerclass-selector"
|
|
|
|
+ :cardType="selectorType"
|
|
@onConfirm="onConfirm"
|
|
@onConfirm="onConfirm"
|
|
@onCancel="onCancel"
|
|
@onCancel="onCancel"
|
|
>
|
|
>
|
|
- <div slot="header">选择采购单位类型</div>
|
|
|
|
- <div class="selector-content" v-loading="loading">
|
|
|
|
- <div class="search-container">
|
|
|
|
- <el-input v-model.trim="searchContent" placeholder="搜索" prefix-icon="el-icon-search"></el-input>
|
|
|
|
- </div>
|
|
|
|
- <div class="select-list scrollbar" ref="selectList">
|
|
|
|
- <div
|
|
|
|
- v-for="(item, key) in cateListMap"
|
|
|
|
- :key="key"
|
|
|
|
- class="select-group-container"
|
|
|
|
- :class="{
|
|
|
|
- global: key === '#'
|
|
|
|
- }"
|
|
|
|
- >
|
|
|
|
- <div class="index-anchor" :id="key" :data-index="key" v-if="key !== '#'">{{ key }}</div>
|
|
|
|
- <div class="select-group">
|
|
|
|
- <button v-for="(cate, i) in item" :key="999-i"
|
|
|
|
- class="j-button-item"
|
|
|
|
- :class="{
|
|
|
|
- active: cate.selected,
|
|
|
|
- [cate.id]: true
|
|
|
|
- }"
|
|
|
|
- @click="changeCateState($event,cate)">{{ cate.name }}</button>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
|
|
+ <div slot="header" v-if="selectorType === 'card'" key="header">选择采购单位类型</div>
|
|
|
|
+ <div slot="header" class="s-header" v-if="selectorType === 'line'" key="header">客户分类:</div>
|
|
|
|
+ <BuyerclassSelectorContent
|
|
|
|
+ ref="buyerclassSelectorContent"
|
|
|
|
+ :selectorType="selectorType"
|
|
|
|
+ :initCate="initCate"
|
|
|
|
+ @onChange="onChange"
|
|
|
|
+ />
|
|
</selector-card>
|
|
</selector-card>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script>
|
|
<script>
|
|
-import { Input } from 'element-ui'
|
|
|
|
import SelectorCard from '@/components/selector/SelectorCard.vue'
|
|
import SelectorCard from '@/components/selector/SelectorCard.vue'
|
|
-import { cateListMapExp } from '@/assets/js/selector.js'
|
|
|
|
-import { debounce, getRandomString } from '@/utils/'
|
|
|
|
|
|
+import BuyerclassSelectorContent from '@/components/selector/BuyerclassSelectorContent.vue'
|
|
export default {
|
|
export default {
|
|
- name: 'buyerclass-selector-card',
|
|
|
|
|
|
+ name: 'buyerclass-selector',
|
|
components: {
|
|
components: {
|
|
- [Input.name]: Input,
|
|
|
|
- SelectorCard
|
|
|
|
|
|
+ SelectorCard,
|
|
|
|
+ BuyerclassSelectorContent
|
|
},
|
|
},
|
|
props: {
|
|
props: {
|
|
|
|
+ selectorType: {
|
|
|
|
+ type: String,
|
|
|
|
+ default: 'card' // card/line
|
|
|
|
+ },
|
|
initCate: {
|
|
initCate: {
|
|
type: Array,
|
|
type: Array,
|
|
default () {
|
|
default () {
|
|
- return [] // '财政', '传媒', '城管', '出版广电'
|
|
|
|
|
|
+ return []
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
data () {
|
|
data () {
|
|
- return {
|
|
|
|
- searchContent: '',
|
|
|
|
- loading: false,
|
|
|
|
- // 原始数据
|
|
|
|
- cateListMapExp,
|
|
|
|
- // 页面中循环的数据
|
|
|
|
- cateListMap: {},
|
|
|
|
- cateExp: {
|
|
|
|
- name: '全部行业',
|
|
|
|
- selected: false,
|
|
|
|
- level: 0,
|
|
|
|
- id: ''
|
|
|
|
- },
|
|
|
|
- // indexBar数据
|
|
|
|
- indexList: []
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- watch: {
|
|
|
|
- initCate (newVal, oldVal) {
|
|
|
|
- // console.log(...arguments)
|
|
|
|
- this.setCateState(newVal)
|
|
|
|
- },
|
|
|
|
- searchContent: debounce(function (newVal, oldVal) {
|
|
|
|
- const search = newVal
|
|
|
|
- const index = this.getIndexWithString(search)
|
|
|
|
- if (index) {
|
|
|
|
- this.$nextTick(() => {
|
|
|
|
- const wrapper = document.querySelector('.buyerclass-selector.card')
|
|
|
|
- this.$refs.selectList.scrollTop = wrapper.querySelector(`[data-index=${index}]`).offsetTop
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- }, 300)
|
|
|
|
- },
|
|
|
|
- created () {
|
|
|
|
- this.initCateMap()
|
|
|
|
- this.setCateState(this.initCate)
|
|
|
|
|
|
+ return {}
|
|
},
|
|
},
|
|
|
|
+ created () {},
|
|
methods: {
|
|
methods: {
|
|
- changeLoadingState (s) {
|
|
|
|
- this.loading = s
|
|
|
|
- },
|
|
|
|
- // 初始化数据
|
|
|
|
- initCateMap () {
|
|
|
|
- const cateListMap = {}
|
|
|
|
- for (const key in this.cateListMapExp) {
|
|
|
|
- this.indexList.push(key)
|
|
|
|
- const cateArr = []
|
|
|
|
- this.cateListMapExp[key].forEach(cateName => {
|
|
|
|
- const cateExp = JSON.parse(JSON.stringify(this.cateExp))
|
|
|
|
- cateExp.name = cateName
|
|
|
|
- cateExp.id = `bc-${getRandomString(8).toLowerCase()}`
|
|
|
|
- if (cateName !== '全部行业') {
|
|
|
|
- cateExp.level = 1
|
|
|
|
- } else {
|
|
|
|
- cateExp.level = 0
|
|
|
|
- cateExp.selected = true
|
|
|
|
- }
|
|
|
|
- cateArr.push(cateExp)
|
|
|
|
- })
|
|
|
|
- cateListMap[key] = cateArr
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for (const k in cateListMap) {
|
|
|
|
- this.$set(this.cateListMap, k, cateListMap[k])
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- changeCateState (e, item) {
|
|
|
|
- // 循环所有数据,判断并改变状态
|
|
|
|
- switch (item.level) {
|
|
|
|
- case 0: {
|
|
|
|
- this.setCateState()
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- case 1: {
|
|
|
|
- this.cateListMap['#'][0].selected = false
|
|
|
|
- item.selected = !item.selected
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- default: {
|
|
|
|
- console.log('未知level')
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (item.level !== 0) {
|
|
|
|
- const allSelected = this.checkAllSelectedState()
|
|
|
|
- if (allSelected.allSelected || allSelected.allNotSelected) {
|
|
|
|
- this.setCateState()
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- // 检查是否全部选中了/全部不选中
|
|
|
|
- checkAllSelectedState () {
|
|
|
|
- const allSelectedArr = []
|
|
|
|
- for (const key in this.cateListMap) {
|
|
|
|
- // 跳过全部进行筛选
|
|
|
|
- if (key === '#') continue
|
|
|
|
- this.cateListMap[key].forEach(item => {
|
|
|
|
- allSelectedArr.push(item.selected)
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return {
|
|
|
|
- // 找不到false,就说明全部被选中
|
|
|
|
- allSelected: allSelectedArr.indexOf(false) === -1,
|
|
|
|
- // 找不到true,就说明没有一个被选中
|
|
|
|
- allNotSelected: allSelectedArr.indexOf(true) === -1
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- /**
|
|
|
|
- * 初始化页面选中状态
|
|
|
|
- * @param { Array | undefined } data 要恢复的数据
|
|
|
|
- */
|
|
|
|
setCateState (data) {
|
|
setCateState (data) {
|
|
- // 设置全部按钮
|
|
|
|
- if (!data || data.length === 0) {
|
|
|
|
- // 其他全部设置不选中,全部按钮设置选中
|
|
|
|
- for (const key in this.cateListMap) {
|
|
|
|
- this.cateListMap[key].forEach(item => {
|
|
|
|
- item.selected = false
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- this.cateListMap['#'][0].selected = true
|
|
|
|
- } else {
|
|
|
|
- this.setCateState()
|
|
|
|
- this.cateListMap['#'][0].selected = false
|
|
|
|
-
|
|
|
|
- if (Array.isArray(data)) {
|
|
|
|
- for (const key in this.cateListMap) {
|
|
|
|
- this.cateListMap[key].forEach(function (item) {
|
|
|
|
- if (data.indexOf(item.name) !== -1) {
|
|
|
|
- item.selected = true
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- console.error('参数必须为undefined或数组')
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ return this.$refs.buyerclassSelectorContent.setCitySelected(data)
|
|
},
|
|
},
|
|
- // 获取选中的数据
|
|
|
|
- getSelected () {
|
|
|
|
- const data = []
|
|
|
|
- for (const key in this.cateListMap) {
|
|
|
|
- // 跳过全部进行查找
|
|
|
|
- if (key === '#') continue
|
|
|
|
- this.cateListMap[key].forEach(item => {
|
|
|
|
- if (item.selected) {
|
|
|
|
- data.push(item.name)
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- return data
|
|
|
|
- },
|
|
|
|
- getIndexWithString (s = '') {
|
|
|
|
- if (!s) return
|
|
|
|
- let giveMyIndex = ''
|
|
|
|
- for (const key in this.cateListMapExp) {
|
|
|
|
- const wowFindIt = this.cateListMapExp[key].find(item => {
|
|
|
|
- return item.includes(s)
|
|
|
|
- })
|
|
|
|
- if (wowFindIt) {
|
|
|
|
- giveMyIndex = key
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return giveMyIndex
|
|
|
|
|
|
+ getSelected (data) {
|
|
|
|
+ return this.$refs.buyerclassSelectorContent.setCitySelected(data)
|
|
},
|
|
},
|
|
onCancel () {
|
|
onCancel () {
|
|
this.$emit('onCancel')
|
|
this.$emit('onCancel')
|
|
@@ -228,21 +54,14 @@ export default {
|
|
onConfirm () {
|
|
onConfirm () {
|
|
const selected = this.getSelected()
|
|
const selected = this.getSelected()
|
|
this.$emit('onConfirm', selected)
|
|
this.$emit('onConfirm', selected)
|
|
|
|
+ },
|
|
|
|
+ onChange (selected) {
|
|
|
|
+ this.$emit('onChange', selected)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
- .card {
|
|
|
|
- font-size: 14px;
|
|
|
|
- .select-group-container {
|
|
|
|
- border-bottom: 1px solid rgba(0,0,0,.05);
|
|
|
|
- .select-group {
|
|
|
|
- display: flex;
|
|
|
|
- flex-wrap: wrap;
|
|
|
|
- margin: 0 16px;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
</style>
|
|
</style>
|