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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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>