123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- <template>
- <div class="dept-select-drodown__wrap">
- <div class="dept_path" style=" white-space:nowrap;">
- <div class="dept_paths">
- <a href="javascript:void(0);" style="display: flex; align-items: center;" @click="backToIndex(-1)" >全部</a>
- <a
- v-for="(item, i) in selectedDeptStack"
- :key="i"
- href="javascript:void(0);"
- @click.stop="backToIndex(i)"
- >
- <van-icon name="arrow"/>
- {{item.name}}
- </a>
- </div>
- </div>
- <div class="select-dropdown__content" :style="contentStyle">
- <scroller class="selector-left _v-container">
- <van-cell-group style="margin-top:0;">
- <van-cell
- :class="{on: item.id === selectedLeftDeptId}"
- v-for="(item,index) in deptData"
- :key="index"
- :title="item.name"
- v-show="item.pid == 0"
- class="employee_cell"
- @click.stop="onselectedLeftDepart(item)"
- />
- <ListEmptyDataCell :data="deptData" :loading="loading"/>
- </van-cell-group>
- </scroller>
- <scroller ref="scroller_com" class="selector-right _v-container" style="left:2.2rem; width:5.4rem;">
- <van-cell
- :is-link="selectedRightDeptId !== item.id"
- v-for="(item, i) in rightDepartData"
- :key="i"
- :title="item.name"
- class="employee_cell"
- :class="{on: selectedRightDeptId === item.id}"
- @click.stop="onselectedRightDepart(item)"
- >
- <template slot="right-icon">
- <van-icon name="success" v-if="selectedRightDeptId === item.id"/>
- </template>
- </van-cell>
- </scroller>
- </div>
- <div class="date-picker__toolbar">
- <van-button
- class="reset-button"
- block
- square
- color="rgba(38,162,255,0.2)"
- @click.stop="onResetDepart"
- >{{ resetBtnText }}
- </van-button>
- <van-button block square type="info" @click="onConfirmDepart">确认</van-button>
- </div>
- </div>
- </template>
- <script>
- import Vue from 'vue'
- import {CellGroup, Cell, Icon, Loading} from 'vant'
- import ListEmptyDataCell from './ListEmptyDataCell'
- Vue.use(CellGroup).use(Cell).use(Icon).use(Loading)
- export default {
- props: {
- contentHeight: {type: String, default: '5rem'},
- resetBtnText: {type: String, default: '恢复默认'}
- },
- name: 'RuleCategorySelDropdown',
- data () {
- return {
- loading: false,
- deptData: null,
- rightDepartData: null,
- selectedDeptStack: null,
- selectedLeftDeptId: null,
- selectedLeftDeptItem: null,
- selectedRightDeptId: null,
- selectedRightDeptItem: null
- }
- },
- components: {ListEmptyDataCell},
- computed: {
- contentStyle () {
- return {height: this.contentHeight}
- }
- },
- methods: {
- backToIndex (index) {
- if (index < 0) {
- this.restoreDefaults()
- // this.$emit('onchange', 0)
- } else {
- this.Paging_return(index)// 传入当前点击下标
- const deptItem = this.selectedDeptStack[index]
- this.selectedRightDeptId = deptItem.id
- this.selectedRightDeptItem = deptItem
- this.rightDepartData = [].concat(deptItem, deptItem.child)
- // this.$emit('onchange', deptItem)
- }
- },
- Paging_return (deptItem) {
- // 1.循环遍历重新插入数组
- // let Paging_return_Arrer = []
- // for(let i=0;i<this.selectedDeptStack.length;i++){//循环当前有的面包屑,获取当前点击下标及前面的面包屑
- // if(i <= deptItem){
- // Paging_return_Arrer.push(this.selectedDeptStack[i])
- // }
- // }
- // this.selectedDeptStack = Paging_return_Arrer
- // 2.删除点击的下标后边所有
- this.selectedDeptStack.splice(deptItem + 1, 1 * 1000)
- },
- onselectedLeftDepart (deptItem) {
- this.selectedLeftDeptId = deptItem.id
- this.selectedLeftDeptItem = deptItem
- this.selectedRightDeptId = deptItem.id
- this.selectedRightDeptItem = deptItem
- this.selectedDeptStack = [deptItem]
- this.rightDepartData = [].concat(deptItem, deptItem.child)
- // this.$emit('onchange', deptItem)
- },
- onselectedRightDepart (deptItem) {
- if (deptItem.id === this.selectedRightDeptId) {
- return
- }
- this.selectedRightDeptId = deptItem.id
- this.selectedRightDeptItem = deptItem
- this.selectedDeptStack.push(deptItem)
- this.rightDepartData = [].concat(deptItem, deptItem.child)
- },
- onResetDepart () {
- this.backToIndex(-1)
- },
- onConfirmDepart () {
- this.$emit('onConfirm', this.selectedRightDeptItem == null ? '' : this.selectedRightDeptItem.id)
- },
- getDepartData () {
- this.loading = true
- this.$axiosUser('get', '/api/pro/integral/rule/trees', {cycle_type: '1'}).then((res) => {
- const result = res.data
- if (result.code === 1) {
- const arr = []
- const {rule_tree: items} = result.data
- for (let key in items) {
- arr.push(items[key])
- }
- this.deptData = arr
- }
- }).finally(() => {
- this.$toast.clear()
- this.loading = false
- })
- },
- restoreDefaults () {
- this.selectedLeftDeptId = null
- this.selectedLeftDeptItem = null
- this.selectedRightDeptId = null
- this.selectedRightDeptItem = null
- this.selectedDeptStack = null
- this.rightDepartData = null
- }
- },
- mounted () {
- this.getDepartData()
- }
- }
- </script>
- <style lang="less" scoped>
- .dept-select-drodown__wrap {
- position: relative;
- overflow: hidden;
- }
- .select-dropdown__content {
- position: relative;
- }
- .employee_cell {
- display: flex;
- align-items: center;
- padding: 0.16rem 0.32rem;
- touch-action: none;
- }
- .employee_cell .van-cell__title {
- line-height: 0.8rem;
- & > span {
- font-size: 0.3rem;
- }
- }
- .dept_path a {
- color: #238dfa;
- font-size: 0.3rem;
- }
- .dept_path a:nth-last-child(1) {
- color: #999;
- }
- .dept_path a * {
- vertical-align: middle;
- }
- //滚动条
- .dept_paths{
- overflow-x: scroll;
- height: 0.8rem;
- display: flex;
- align-items: center;
- }
- .dept_path {
- width: 7rem;
- // position: relative;
- display: flex;
- flex-wrap: nowrap;
- height: 0.8rem;
- font-size: 0.32rem;
- padding: 0 0.32rem;
- align-items: center;
- touch-action: none;
- }
- .dept_path:after {
- content: ' ';
- bottom: 0;
- left: 0;
- right: 0;
- background-color: #efefef;
- height: 1px;
- position: absolute;
- transform: scaleY(0.5);
- }
- .selector-left {
- width: 2.2rem !important;
- background-color: #f5f5f5;
- }
- .selector-left .van-cell {
- background-color: #f5f5f5;
- }
- .selector-left .employee_cell {
- padding-left: 0.32rem;
- }
- .selector-left .employee_cell.on {
- position: relative;
- &:before {
- position: absolute;
- top: 50%;
- left: 0.08rem;
- content: '';
- width: 0.04rem;
- height: 0.36rem;
- background: #26a2ff;
- border-radius: 0.04rem;
- transform: translateY(-50%);
- }
- }
- /deep/ .selector-left .van-cell:not(:last-child):after {
- left: 0;
- }
- .selector-right {
- width: 5.4rem !important;
- background-color: #fff;
- }
- .van-cell {
- &.on {
- color: #238dfa;
- & .van-cell__title > span {
- font-size: 0.3rem;
- }
- }
- & .van-cell__title > span {
- font-size: 0.3rem;
- }
- & .van-icon-success {
- align-self: center;
- }
- }
- .date-picker__toolbar {
- display: flex;
- flex-direction: row;
- & .reset-button {
- touch-action: none;
- color: #26a2ff !important;
- border: transparent !important;
- }
- }
- // .rule-selector__wrap {
- // display: flex;
- // position: relative;
- // overflow: hidden;
- // height: 7rem;
- // flex-direction: column;
- // & .rule-selector__conetent {
- // display: flex;
- // position: relative;
- // flex: 1;
- // padding: 0.26rem 0.19rem;
- // flex-direction: column;
- // overflow-y: auto;
- // overflow-x: hidden;
- // & .rule-category__content {
- // position: relative;
- // & .rule-category___title {
- // padding: 0 0.13rem;
- // color: #333;
- // font-size: 0.3rem;
- // }
- // & .rule-category__sub-items {
- // display: flex;
- // padding-bottom: 0.24rem;
- // flex-flow: row wrap;
- // & .rule-sub__item {
- // display: flex;
- // margin: 0.24rem 0.13rem 0 0.13rem;
- // width: 1.52rem;
- // height: 0.72rem;
- // background: #f5f7fa;
- // border-radius: 0.04rem;
- // align-items: center;
- // justify-content: center;
- // touch-action: none;
- // &.selected {
- // color: #26a2ff;
- // background: #26a2ff33;
- // }
- // & > span {
- // font-size: 0.28rem;
- // }
- // }
- // }
- // }
- // }
- // & .date-picker__toolbar {
- // display: flex;
- // flex-direction: row;
- // & .reset-button {
- // color: #26a2ff !important;
- // border: transparent !important;
- // }
- // }
- // }
- </style>
|