You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

450 lines
12 KiB
Vue

<template>
<div>
<el-tag
v-for="label in selectLabelListInitial"
:key="label.id"
:closable="isEdit"
:disable-transitions="false"
@close="handleCloseTag(label)"
>
{{ label.labelName }}
</el-tag>
<el-tooltip
class="item"
content="添加关联标签"
effect="dark"
placement="right"
>
<el-button
circle
class="bs-el-button-default"
icon="el-icon-plus"
style="margin-left: 10px"
@click="addLabelRelation"
/>
</el-tooltip>
<!-- 配置按钮 -->
<el-button type="text" @click="manageLabel"></el-button>
<!-- 标签列表弹窗 -->
<el-dialog
class="bs-dialog-wrap bs-el-dialog"
:append-to-body="true"
:before-close="handleClose"
:visible.sync="dialogFormVisible"
:title="isManage ? '标签管理' : '选择标签'"
width="1000px"
>
<div>
<el-form
:inline="true"
class="bs-el-form filter-container"
>
<el-form-item label="">
<el-input
v-model="searchForm.labelName"
clearable
class="bs-el-input"
placeholder="请输入标签名称"
/>
</el-form-item>
<el-form-item label="">
<el-select
v-model="searchForm.labelType"
class="bs-el-select"
popper-class="bs-el-select"
clearable
filterable
placeholder="请选择标签类型"
@change="selectLabelType"
>
<el-option
label="全部"
value=""
/>
<el-option
v-for="(item, index) in labelTypeList"
:key="index"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="getDataList"
>
查询
</el-button>
</el-form-item>
<el-form-item>
<el-button
v-show="isManage"
type="primary"
class="bs-el-button-default"
@click="insertLabel"
>
新增
</el-button>
</el-form-item>
</el-form>
<el-table
ref="labelTable"
v-loading="labelCheckLoading"
class="bs-el-table bs-scrollbar"
element-loading-text="正在加载中..."
:data="labelList"
row-key="id"
@select="labelCheckChange"
@select-all="selectAll"
>
<el-empty slot="empty" />
<el-table-column
key="selection"
v-if="!isManage"
type="selection"
width="55"
/>
<el-table-column
key="labelName"
label="标签名称"
prop="labelName"
show-overflow-tooltip
/>
<el-table-column
key="labelType"
label="标签类型"
prop="labelType"
show-overflow-tooltip
/>
<el-table-column
key="labelDesc"
label="标签说明"
prop="labelDesc"
show-overflow-tooltip
/>
<el-table-column
key="opt"
align="center"
label="操作"
width="200"
v-if="isManage"
>
<template slot-scope="scope">
<el-button
class="bs-el-button-default"
@click="editLabel(scope.row)"
>
编辑
</el-button>
<el-button
class="bs-el-button-default"
@click="deleteLabel(scope.row.id)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<div class="bs-pagination">
<el-pagination
class="bs-el-pagination"
popper-class="bs-el-pagination"
:current-page="current"
:page-size="sizeLabel"
:page-sizes="[10, 20, 50, 100]"
:total="totalCount"
background
layout="total, prev, pager, next,sizes,jumper"
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
/>
</div>
<div class="el-dialog__footer">
<el-button
v-show="!isManage"
class="bs-el-button-default"
@click="handleClose"
>
取消
</el-button>
<el-button
v-show="!isManage"
type="primary"
@click="commitLabel"
>
确定
</el-button>
<el-button
v-show="isManage"
class="bs-el-button-default"
@click="handleClose"
>
返回
</el-button>
</div>
<label-edit
v-if="editFormVisible"
@afterEdit="afterEdit"
ref="labelEdit"
/>
</div>
</el-dialog>
</div>
</template>
<script>
import LabelEdit from './LabelConfigEdit'
import { pageMixins } from 'packages/js/mixins/page'
import {getLabelType, labelList, getLabelListByDatasetId, removeLabel} from 'packages/js/utils/LabelConfigService'
export default {
name: 'LabelSelect',
components: {
LabelEdit
},
mixins: [pageMixins],
props: {
// 选中的标签id列表
idList: {
type: Array,
default: () => []
},
isEdit: {
type: Boolean,
default: true
},
datasetId: {
type: String,
default: ''
}
},
data () {
return {
isManage: false,
idListCopy: this.idList,
// 选中的标签列表
selectLabelList: [],
// 初始选中的标签列表
selectLabelListInitial: [],
labelList: [],
dialogFormVisible: false,
// 编辑弹窗可见性
editFormVisible: false,
searchForm: {
labelName: '',
labelType: ''
},
sizeLabel: 20,
labelTypeList: [],
labelCheckLoading: false
}
},
mounted () {
// 根据数据集id获取关联的标签列表
if (this.datasetId) {
getLabelListByDatasetId(this.datasetId).then((data) => {
this.selectLabelListInitial = _.cloneDeep(data)
this.selectLabelList = _.cloneDeep(data)
})
}
},
watch: {
// labelList变化时根据selectLabelList中项的id设置选中状态
labelList: {
handler (val) {
val.forEach((label) => {
this.selectLabelList.forEach((selected) => {
if (label.id === selected.id) {
// 设置选中状态
this.$nextTick(() => {
this.$refs.labelTable.toggleRowSelection(label)
})
}
})
})
},
deep: true
},
// 根据selectLabelList的变化将id赋值给idList
selectLabelList: {
handler (val) {
this.idListCopy = []
val.forEach((item) => {
this.idListCopy.push(item.id)
})
},
deep: true
}
},
methods: {
/**
* 初始化方法
*/
init (manage) {
this.isManage = manage
this.$nextTick(() => {
this.dialogFormVisible = true
this.getDataList()
this.getLabelType()
})
},
/**
* 获取标签类型列表
*/
getLabelType () {
getLabelType().then((data) => {
this.labelTypeList = data
})
},
/**
* 获取标签列表
*/
getDataList () {
this.labelCheckLoading = true
const params = {
current: this.current,
size: this.sizeLabel,
labelName: this.searchForm.labelName,
labelType: this.searchForm.labelType
}
labelList(params).then((data) => {
this.totalCount = data.totalCount
this.labelList = data.list
this.labelCheckLoading = false
}).catch(() => {
this.labelCheckLoading = false
})
},
/**
* 当前页全选
* @param {*} labelList
*/
selectAll (labelList) {
// 如果selectLabelList中包含id相同的项则忽略否则将该项添加到selectLabelList中
labelList.forEach((label) => {
if (!this.selectLabelList.some(selected => selected.id === label.id)) {
this.selectLabelList.push(label)
}
})
},
/**
* 新增标签
*/
insertLabel () {
this.editFormVisible = true
this.$nextTick(() => {
this.$refs.labelEdit.labelTypeList = this.labelTypeList
this.$refs.labelEdit.init()
})
},
editLabel (row) {
this.editFormVisible = true
this.$nextTick(() => {
this.$refs.labelEdit.labelTypeList = this.labelTypeList
this.$refs.labelEdit.init(row)
})
},
deleteLabel (id) {
this.$confirm('确定删除当前标签吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
removeLabel(id).then(() => {
this.getDataList()
this.$message.success('删除成功')
// 如果selectLabelList中包含id相同的项则从selectLabelList中移除
if (this.selectLabelList.some(item => item.id === id)) {
this.selectLabelList = this.selectLabelList.filter(item => item.id !== id)
}
this.selectLabelListInitial = _.cloneDeep(this.selectLabelList)
})
}).catch(() => {
})
},
/**
* 标签选项组选中事件
*/
labelCheckChange (selection, label) {
// 如果selectLabelList中包含id相同的项则从selectLabelList中移除
if (this.selectLabelList.some(item => item.id === label.id)) {
this.selectLabelList = this.selectLabelList.filter(item => item.id !== label.id)
} else {
// 否则将该项添加到selectLabelList中
this.selectLabelList.push(label)
}
},
/**
* 移除选中的标签
*/
handleCloseTag (label) {
this.selectLabelListInitial.forEach((item, index) => {
if (item.id === label.id) {
this.selectLabelListInitial.splice(index, 1)
}
})
this.selectLabelList.forEach((item, index) => {
if (item.id === label.id) {
this.selectLabelList.splice(index, 1)
}
})
},
/**
* 点击添加标签关联按钮
*/
addLabelRelation () {
// 初始化
this.init(false)
},
/**
* 标签管理按钮
*/
manageLabel() {
this.init(true)
},
/**
* 选中标签类型
*/
selectLabelType () {
this.getDataList()
},
/**
* 弹窗关闭
*/
handleClose () {
this.selectLabelList = _.cloneDeep(this.selectLabelListInitial)
this.dialogFormVisible = false
},
/**
* 确认按钮
*/
commitLabel () {
this.labelCheckLoading = false
this.dialogFormVisible = false
this.selectLabelListInitial = _.cloneDeep(this.selectLabelList)
this.$emit('commit', this.idListCopy)
},
/**
* 标签编辑/新增后回调
*/
afterEdit () {
this.getDataList()
this.getLabelType()
}
}
}
</script>
<style lang="scss" scoped>
@import '../../assets/style/bsTheme.scss';
.bs-pagination {
::v-deep .el-input__inner {
border: none;
background: var(--bs-el-background-1);
}
}
</style>