2021-04-22 12:25:23 +08:00
|
|
|
<template>
|
|
|
|
|
<div class="nz-transfer">
|
|
|
|
|
<div :style="calcStyle" class="nz-transfer__box nz-transfer__box--left">
|
|
|
|
|
<div class="box__header">
|
|
|
|
|
<search-input
|
|
|
|
|
ref="searchInput"
|
|
|
|
|
:placeholder="$t('overall.placeHolder')"
|
|
|
|
|
:search-msg="searchMsg"
|
|
|
|
|
:show-history="false"
|
|
|
|
|
:show-search="false"
|
|
|
|
|
style="width:100%"
|
|
|
|
|
@search="search"
|
|
|
|
|
></search-input>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="box__table">
|
|
|
|
|
<el-table
|
|
|
|
|
v-loading="loading"
|
|
|
|
|
:data="selectableData"
|
|
|
|
|
:row-class-name="setRowShow"
|
|
|
|
|
height="100%"
|
|
|
|
|
size="small"
|
|
|
|
|
@selection-change="selectableSelectionChange"
|
|
|
|
|
>
|
|
|
|
|
<el-table-column
|
|
|
|
|
:resizable="false"
|
|
|
|
|
align="center"
|
|
|
|
|
type="selection"
|
|
|
|
|
width="36">
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column
|
2021-04-26 10:28:01 +08:00
|
|
|
:label="item.label"
|
|
|
|
|
v-for="(item,index) in tableTitle"
|
|
|
|
|
:key="index"
|
2021-04-22 12:25:23 +08:00
|
|
|
>
|
2021-04-26 10:28:01 +08:00
|
|
|
<template slot-scope="scope" v-if="!item.slot">{{scope.row[item.prop]}}</template>
|
|
|
|
|
<slot :name="item.prop" v-else></slot>
|
2021-04-22 12:25:23 +08:00
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="box__footer">
|
|
|
|
|
<el-pagination
|
2021-05-21 16:34:22 +08:00
|
|
|
@current-change="pageNoChange"
|
2021-04-22 12:25:23 +08:00
|
|
|
:current-page.sync="selectablePage.pageNo"
|
|
|
|
|
:page-size="selectablePage.pageSize"
|
|
|
|
|
:total="selectablePage.total"
|
|
|
|
|
layout="prev, slot, next"
|
|
|
|
|
small
|
|
|
|
|
>
|
|
|
|
|
<template>
|
2021-05-21 16:34:22 +08:00
|
|
|
<el-input ref="jumpInput" v-model.number="selectablePage.pageNo" class="jump-input" @change="selectableChange" @keyup.enter.native="selectableChange"/>
|
2021-04-22 12:25:23 +08:00
|
|
|
<span class="jump-pages">/ {{selectablePage.pages}}</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-pagination>
|
|
|
|
|
<button :class="{'top-tool-btn--disabled': selectableSelection.length === 0}"
|
|
|
|
|
class="top-tool-btn"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="leftToRight">
|
|
|
|
|
<i class="nz-icon nz-icon-arrow-right"></i>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2021-07-02 14:03:17 +08:00
|
|
|
<div :style="calcStyle" class="nz-transfer__box nz-transfer__box--right" :class="showError?'error' : ''">
|
2021-04-22 12:25:23 +08:00
|
|
|
<div class="box__header">
|
|
|
|
|
<slot name="title"></slot>
|
|
|
|
|
<slot></slot>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="box__table">
|
|
|
|
|
<el-table
|
|
|
|
|
:data="selectedData"
|
|
|
|
|
height="100%"
|
|
|
|
|
size="small"
|
|
|
|
|
@selection-change="selectedSelectionChange"
|
|
|
|
|
>
|
|
|
|
|
<el-table-column
|
|
|
|
|
:resizable="false"
|
|
|
|
|
align="center"
|
|
|
|
|
type="selection"
|
|
|
|
|
width="36">
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column
|
2021-04-26 10:28:01 +08:00
|
|
|
:label="item.label"
|
|
|
|
|
v-for="(item,index) in tableTitle"
|
|
|
|
|
:key="index"
|
2021-04-22 12:25:23 +08:00
|
|
|
>
|
2021-04-26 10:28:01 +08:00
|
|
|
<template slot-scope="scope" v-if="!item.slot">{{scope.row[item.prop]}}</template>
|
|
|
|
|
<slot :name="item.prop" v-else></slot>
|
2021-04-22 12:25:23 +08:00
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="box__footer">
|
|
|
|
|
<button :class="{'top-tool-btn--disabled': selectedSelection.length === 0}"
|
|
|
|
|
:disabled="selectedSelection.length === 0"
|
|
|
|
|
class="top-tool-btn"
|
|
|
|
|
type="button"
|
|
|
|
|
@click="rightToLeft">
|
|
|
|
|
<i class="nz-icon nz-icon-arrow-left"></i>
|
|
|
|
|
</button>
|
|
|
|
|
<!-- <el-pagination
|
|
|
|
|
:current-page.sync="selectedPage.pageNo"
|
|
|
|
|
:page-size="selectedPage.pageSize"
|
|
|
|
|
:total="selectedPage.total"
|
|
|
|
|
layout="prev, slot, next"
|
|
|
|
|
small
|
|
|
|
|
>
|
|
|
|
|
<template>
|
|
|
|
|
<el-input ref="jumpInput" class="jump-input" v-model="selectedPage.pageNo" @change="selectedChange" @keyup.enter.native="selectedChange"/>
|
|
|
|
|
<span class="jump-pages">/ {{selectedPage.pages}}</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-pagination>-->
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
export default {
|
|
|
|
|
name: 'nzTransfer',
|
|
|
|
|
props: {
|
|
|
|
|
height: {
|
|
|
|
|
type: String,
|
|
|
|
|
default: '430'
|
|
|
|
|
},
|
|
|
|
|
tableData: { // 左侧待选
|
|
|
|
|
type: Array
|
|
|
|
|
},
|
|
|
|
|
searchMsg: {
|
|
|
|
|
type: Object
|
|
|
|
|
},
|
|
|
|
|
pageObj: {
|
|
|
|
|
type: Object
|
2021-04-26 10:28:01 +08:00
|
|
|
},
|
|
|
|
|
tableTitle: {
|
2021-04-27 17:38:58 +08:00
|
|
|
type: Array
|
2021-07-02 14:03:17 +08:00
|
|
|
},
|
|
|
|
|
showError: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
default: false
|
2021-04-22 12:25:23 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
data () {
|
|
|
|
|
return {
|
|
|
|
|
selectedData: [], // 右侧已选
|
|
|
|
|
searchLabel: {},
|
|
|
|
|
loading: false,
|
|
|
|
|
selectablePage: {},
|
|
|
|
|
selectedPage: {
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
total: 0,
|
|
|
|
|
pages: 0
|
|
|
|
|
},
|
|
|
|
|
selectableSelection: [],
|
|
|
|
|
selectedSelection: []
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
computed: {
|
|
|
|
|
selectableData () {
|
|
|
|
|
return this.tableData.filter(d => {
|
|
|
|
|
return !this.selectedData.find(s => d.id === s.id)
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
calcStyle () {
|
|
|
|
|
const style = {}
|
|
|
|
|
let height
|
|
|
|
|
if (parseInt(this.height)) {
|
|
|
|
|
height = `${this.height}px`
|
|
|
|
|
} else {
|
|
|
|
|
height = this.height
|
|
|
|
|
}
|
|
|
|
|
style.height = height
|
|
|
|
|
return style
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
search (searchLabel) {
|
|
|
|
|
this.searchLabel = { ...searchLabel }
|
|
|
|
|
this.$emit('search', this.searchLabel, this.selectablePage)
|
|
|
|
|
},
|
|
|
|
|
selectableChange (current) { // 左侧table翻页
|
2021-05-21 16:34:22 +08:00
|
|
|
// this.selectablePage.pageNo = current
|
2021-04-22 12:25:23 +08:00
|
|
|
this.$emit('search', this.searchLabel, this.selectablePage)
|
|
|
|
|
},
|
|
|
|
|
selectedChange (current) { // 右侧table翻页
|
|
|
|
|
|
2021-05-21 16:34:22 +08:00
|
|
|
},
|
|
|
|
|
pageNoChange (val) {
|
|
|
|
|
this.$emit('pageNo', val)
|
2021-04-22 12:25:23 +08:00
|
|
|
},
|
|
|
|
|
selectableSelectionChange (val) { // 左侧选项变化
|
|
|
|
|
this.selectableSelection = val
|
|
|
|
|
},
|
|
|
|
|
selectedSelectionChange (val) { // 右侧选项变化
|
|
|
|
|
this.selectedSelection = val
|
|
|
|
|
},
|
|
|
|
|
leftToRight () {
|
|
|
|
|
this.selectedData.splice(0, 0, ...this.selectableSelection)
|
2022-03-14 17:59:14 +08:00
|
|
|
this.$emit('leftToRight', this.selectedData)
|
2021-04-22 12:25:23 +08:00
|
|
|
},
|
|
|
|
|
rightToLeft () {
|
|
|
|
|
this.$emit('rightToLeft', this.selectedSelection)
|
|
|
|
|
this.selectedData = this.selectedData.filter(d => !this.selectedSelection.find(s => d.id === s.id))
|
|
|
|
|
},
|
|
|
|
|
startLoading () {
|
|
|
|
|
this.loading = true
|
|
|
|
|
},
|
|
|
|
|
endLoading () {
|
|
|
|
|
this.loading = false
|
|
|
|
|
},
|
|
|
|
|
setRowShow ({ row }) {
|
|
|
|
|
if (this.tableData.some(d => d.hide && row.id === d.id)) {
|
|
|
|
|
return 'hide-row'
|
|
|
|
|
}
|
|
|
|
|
return ''
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
watch: {
|
|
|
|
|
pageObj: {
|
|
|
|
|
immediate: true,
|
|
|
|
|
deep: true,
|
|
|
|
|
handler (n) {
|
|
|
|
|
this.selectablePage = { ...n }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</script>
|