From 28c04093bb09e27c2c9ee16231e4fbe825c93111 Mon Sep 17 00:00:00 2001 From: "hong.yang" <hong.yang@ustcinfo.com> Date: Tue, 11 Jul 2023 09:09:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8E=BB=E9=99=A4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E6=A0=87=E7=AD=BE=E7=AE=A1=E7=90=86=E9=A1=B5=EF=BC=8C?= =?UTF-8?q?=E5=B0=86=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=E9=9B=86=E6=88=90?= =?UTF-8?q?=E5=88=B0=E6=A0=87=E7=AD=BE=E9=80=89=E6=8B=A9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去除数据集标签管理页,将管理页面集成到标签选择器 --- data-room-ui/package.json | 1 - .../packages/DataSetLabelManagement/index.js | 7 - .../src/LabelConfigAddOrUpdate.vue | 474 ------------------ .../src/LabelConfigDetails.vue | 385 -------------- .../src/LabelConfigEdit.vue | 223 ++++++++ .../src/LabelSelect.vue | 253 +++++++--- .../DataSetLabelManagement/src/Tree/index.vue | 167 ------ .../DataSetLabelManagement/src/index.vue | 311 ------------ data-room-ui/packages/index.js | 8 +- .../packages/js/utils/registerConfig.js | 7 - 10 files changed, 397 insertions(+), 1439 deletions(-) delete mode 100644 data-room-ui/packages/DataSetLabelManagement/index.js delete mode 100644 data-room-ui/packages/DataSetLabelManagement/src/LabelConfigAddOrUpdate.vue delete mode 100644 data-room-ui/packages/DataSetLabelManagement/src/LabelConfigDetails.vue create mode 100644 data-room-ui/packages/DataSetLabelManagement/src/LabelConfigEdit.vue delete mode 100644 data-room-ui/packages/DataSetLabelManagement/src/Tree/index.vue delete mode 100644 data-room-ui/packages/DataSetLabelManagement/src/index.vue diff --git a/data-room-ui/package.json b/data-room-ui/package.json index cee56852..554915cf 100644 --- a/data-room-ui/package.json +++ b/data-room-ui/package.json @@ -48,7 +48,6 @@ ] }, "dependencies": { - "@antv/g6": "4.3.6", "@amap/amap-jsapi-loader": "^1.0.1", "@antv/g2plot": "2.4.0", "@jiaminghi/data-view": "2.10.0", diff --git a/data-room-ui/packages/DataSetLabelManagement/index.js b/data-room-ui/packages/DataSetLabelManagement/index.js deleted file mode 100644 index df2e5d0f..00000000 --- a/data-room-ui/packages/DataSetLabelManagement/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import DataSetLabelManagement from './src/index.vue' - -DataSetLabelManagement.install = function (Vue) { - Vue.component(DataSetLabelManagement.name, DataSetLabelManagement) -} - -export default DataSetLabelManagement diff --git a/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigAddOrUpdate.vue b/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigAddOrUpdate.vue deleted file mode 100644 index 115d6a28..00000000 --- a/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigAddOrUpdate.vue +++ /dev/null @@ -1,474 +0,0 @@ -<template> - <el-dialog - class="bs-dialog-wrap bs-el-dialog" - :append-to-body="true" - :before-close="handleClose" - :title="dataForm.id!==''?'编辑标签':'新增标签'" - :visible.sync="dialogFormVisible" - :width="relVisible?'1100px':'450px'" - > - <el-row> - <el-col :span="relVisible ? 8 : 24"> - <el-divider - class="bs-el-divider" - content-position="left" - > - 属性信息 - </el-divider> - - <el-form - ref="ruleForm" - :model="dataForm" - :rules="rules" - label-position="right" - label-width="90px" - class="form-container" - > - <el-form-item - label="标签名称" - prop="labelName" - > - <el-input - v-model="dataForm.labelName" - class="bs-el-input" - clearable - placeholder="请输入标签名称" - maxlength="200" - /> - </el-form-item> - - <el-form-item - label="标签类型" - prop="labelType" - > - <el-select - ref="searchSelect" - v-model="dataForm.labelType" - class="bs-el-select" - popper-class="bs-el-select" - allow-create - clearable - filterable - placeholder="请选择或输入标签类型" - @blur="selectBlur" - @input.native="filterData" - > - <el-option - v-for="(item,K) in labelTypeList" - :key="K" - :label="item" - :value="item" - /> - </el-select> - </el-form-item> - - <el-form-item - label="标签说明" - prop="labelDesc" - > - <el-input - v-model="dataForm.labelDesc" - clearable - placeholder="请输入标签说明" - class="bs-el-input" - type="text" - /> - </el-form-item> - </el-form> - - <el-divider - class="bs-el-divider" - content-position="left" - > - 关联数据集信息 - </el-divider> - <el-form class="form-container"> - <el-form-item align="center"> - <el-tag effect="plain"> - 标签 - </el-tag> - <span>—————</span> - <el-button - round - size="mini" - type="primary" - @click="buildRel" - > - 添加关联 - </el-button> - </el-form-item> - </el-form> - </el-col> - - <el-col - v-if="relVisible" - :span="8" - > - <div> - <el-divider - class="bs-el-divider" - content-position="left" - > - 添加关联 - </el-divider> - <div - class="tree-box full-box--position" - style="padding: 0 8px 24px 0" - > - <Tree - ref="tree" - :tree-data="categoryData" - style="height: 300px;overflow: auto" - @handleNodeClick="handleNodeClick" - /> - </div> - </div> - </el-col> - - <el-col - v-if="relVisible" - :span="8" - > - <el-divider - class="bs-el-divider" - content-position="left" - > - 数据集列表 - </el-divider> - <div class="bs-table-box"> - <el-table - ref="mytable" - class="bs-el-table" - :data="datasetList" - height="300" - @select="handleSelect" - @select-all="handleSelectionAll" - > - <el-table-column - type="selection" - width="55" - /> - - <el-table-column - label="数据集名称" - prop="name" - show-overflow-tooltip - /> - </el-table> - </div> - </el-col> - </el-row> - - <span - slot="footer" - class="dialog-footer" - > - <el-button - class="bs-el-button-default" - @click="cancel" - > - 取消 - </el-button> - <el-button - type="primary" - @click="submitForm('ruleForm')" - > - 确定 - </el-button> - </span> - </el-dialog> -</template> - -<script> -import { pageMixins } from 'packages/js/mixins/page' -import Tree from './Tree' -import { addOrUpdateLabel, checkRepeatLabel, getDataSetIdListByLabelId } from 'packages/js/utils/LabelConfigService' -import { datasetList, getCategoryTree } from 'packages/js/utils/datasetConfigService' - -export default { - name: 'LabelConfigAddOrUpdate', - mixins: [pageMixins], - data () { - return { - loading: false, - datasetList: [], - typeId: '', - dataForm: { - id: '', - labelName: '', - labelType: '', - labelDesc: '', - relList: [] - }, - dialogFormVisible: true, - rules: { - labelName: [ - { required: true, message: '标签名称不能为空', trigger: 'blur' }, - { validator: this.validateLabelName, trigger: 'blur' } - ], - labelType: [ - { required: true, message: '标签类型不能为空', trigger: 'change' } - ] - }, - // 分类树数据 - categoryData: [], - relVisible: false, - // 标签分类列表 - labelTypeList: [], - // 选中的数据集id列表 - datasetIdList: [] - } - }, - components: { - Tree - }, - watch: { - 'dataForm.labelType': function (val) { - if (val.length > 20) { - this.dataForm.labelType = val.substring(0, 20) - } - }, - // datasetList变化时,根据datasetIdList设置其选中状态 - datasetList: { - handler: function (val) { - this.$nextTick(() => { - if (this.$refs.mytable) { - this.$refs.mytable.clearSelection() - } - this.datasetList.forEach((item) => { - if (this.datasetIdList.includes(item.id)) { - this.$refs.mytable.toggleRowSelection(item, true) - } - }) - }) - }, - deep: true - } - }, - methods: { - /** - * 初始化 - * @param row 标签信息 - */ - init (row) { - this.dataForm.id = row ? row.id : '' - this.dialogFormVisible = true - if (row) { - this.dataForm.id = row.id - this.dataForm.labelName = row.labelName - this.dataForm.labelType = row.labelType - this.dataForm.labelDesc = row.labelDesc - // 获取选中的数据集id列表 - getDataSetIdListByLabelId(row.id).then((list) => { - this.datasetIdList = list - this.buildRel() - }) - } - this.$nextTick(() => { - this.getDataList() - }) - }, - /** - * 获取数据集列表 - */ - getDataList () { - this.loading = true - const params = { - typeId: this.typeId - } - datasetList(params).then((list) => { - this.datasetList = list - if (!this.relVisible) { - this.loading = false - return - } - this.loading = false - }).catch(() => { - this.loading = false - }) - }, - - /** - * 获取分类树 - */ - getTreeList () { - getCategoryTree({ type: 'dataset' }).then((categoryTree) => { - this.categoryData = categoryTree - }) - }, - /** - * 标签名称校验 - * @param rule - * @param value - * @param callback - */ - validateLabelName (rule, value, callback) { - checkRepeatLabel({ id: this.dataForm.id, labelName: this.dataForm.labelName }).then(repeat => { - if (repeat) { - callback(new Error('标签名称已存在')) - } else { - callback() - } - }) - }, - /** - * 树节点点击事件 - * @param row - * @param value - */ - handleNodeClick (row, value) { - this.$nextTick(() => { - this.typeId = row.id - this.getDataList() - }) - }, - /** - * 选中数据集 - * @param selection 选中的数据集列表 - * @param row 操作行 - */ - handleSelect (selection, row) { - // 如row.id存在于datasetIdList中,则将其从datasetIdList中删除 - if (this.datasetIdList.includes(row.id)) { - const index = this.datasetIdList.indexOf(row.id) - if (index > -1) { - this.datasetIdList.splice(index, 1) - } - return - } - // 如row.id不存在于datasetIdList中,则将其添加到datasetIdList中 - if (!this.datasetIdList.includes(row.id)) { - this.datasetIdList.push(row.id) - } - }, - /** - * 数据集全选 - * @param selection - */ - handleSelectionAll (selection) { - // 选中项为空,将datasetList中所有项从datasetIdList中删除 - if (selection.length === 0) { - this.datasetList.forEach((dataset) => { - const index = this.datasetIdList.indexOf(dataset.id) - if (index > -1) { - this.datasetIdList.splice(index, 1) - } - }) - return - } - // 选中项不为空,将datasetList中所有项添加到datasetIdList中 - if (selection.length > 0) { - this.datasetList.forEach((dataset) => { - if (!this.datasetIdList.includes(dataset.id)) { - this.datasetIdList.push(dataset.id) - } - }) - } - }, - - /** - * 表单关闭 - */ - handleClose () { - this.$parent.addOrUpdateVisible = false - }, - /** - * 取消按钮 - */ - cancel () { - this.dialogFormVisible = false - this.$nextTick(() => { - this.handleClose() - }) - }, - /** - * 提交按钮 - * @param formName - */ - submitForm (formName) { - this.$refs[formName].validate((valid) => { - if (valid) { - this.saveForm(true) - } else { - return false - } - }) - }, - /** - * 保存标签信息 - * @param flag - */ - saveForm (flag) { - this.dataForm.relList = [] - this.datasetIdList.forEach(id => { - const param = { - datasetId: id, - labelId: this.dataForm.id - } - this.dataForm.relList.push(param) - }) - addOrUpdateLabel(this.dataForm).then((r) => { - this.$message.success('保存成功') - this.cancel() - this.$parent.getDataList() - // 更新一下类型 - this.$parent.getLabelType() - }) - }, - /** - * 添加关联按钮 - */ - buildRel () { - this.relVisible = !this.relVisible - if (this.relVisible) { - this.getTreeList() - this.$nextTick(() => { - this.getDataList() - }) - } - }, - filterNode (value, data) { - if (!value) return true - return data.name.indexOf(value) !== -1 - }, - ellipsis (value, len) { - if (!value) return '' - if (value.length > len) { - return value.slice(0, len) + '...' - } - return value - }, - selectBlur (e) { - this.dataForm.labelType = e.target.value - }, - // 对输入字符串控制 - filterData () { - // 此属性得到输入的文字 - const str = this.$refs.searchSelect.$data.selectedLabel - // 控制的js - if (str.length > 20) { - this.$refs.searchSelect.$data.selectedLabel = str.substr(0, 20) - } - } - } -} -</script> - -<style scoped> -.el-col { - height: 358px; -} - -.tree-box { - overflow-x: auto; -} -.form-container{ - padding: 0 8px; -} -::v-deep .el-table{ - border: 1px solid transparent !important; -} -::v-deep .el-table th.el-table__cell.is-leaf, .el-table td.el-table__cell{ - border-bottom: 1px solid transparent !important; -} -</style> diff --git a/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigDetails.vue b/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigDetails.vue deleted file mode 100644 index a0922b19..00000000 --- a/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigDetails.vue +++ /dev/null @@ -1,385 +0,0 @@ -<template> - <div - v-if="dialogFormVisible" - class="inner-container" - > - <el-scrollbar class="data-set-scrollbar"> - <!-- <el-page-header - class="bs-el-page-header" - @back="goBack" - /> --> - <el-page-header class="bs-el-page-header"> - <template slot="content"> - <div class="page-header"> - <div class="page-header-left"> - 标签详情 - </div> - <div class="page-header-right"> - <el-button - class="back bs-el-button-default" - @click="goBack" - > - 返回 - </el-button> - </div> - </div> - </template> - </el-page-header> - <el-divider - class="bs-el-divider" - content-position="left" - > - 属性信息 - </el-divider> - - <el-row - style="width: 100%;" - :gutter="5" - > - <el-col - :span="8" - class="attrInfo" - > - <el-tooltip - v-if="dataForm.labelName.length > 20" - :content="dataForm.labelName" - class="item" - effect="dark" - placement="bottom-start" - > - <span class="text-style">标签名称: {{ ellipsis(dataForm.labelName, 20) }}</span> - </el-tooltip> - <span - v-else - class="text-style" - > - 标签名称: {{ ellipsis(dataForm.labelName, 20) }} - </span> - </el-col> - <el-col - :span="8" - class="attrInfo" - > - <el-tooltip - v-if="dataForm.labelType.length > 20" - :content="dataForm.labelType" - class="item" - effect="dark" - placement="bottom-start" - > - <span class="text-style">标签类型: {{ ellipsis(dataForm.labelType, 20) }}</span> - </el-tooltip> - <span - v-else - class="text-style" - > - 标签类型: {{ ellipsis(dataForm.labelType, 20) }} - </span> - </el-col> - <el-col - :span="8" - class="attrInfo" - > - <el-tooltip - v-if="dataForm.labelDesc.length > 20" - :content="dataForm.labelDesc" - class="item" - effect="dark" - placement="bottom-start" - > - <span class="text-style">标签说明: {{ ellipsis(dataForm.labelDesc, 20) }}</span> - </el-tooltip> - <span - v-else - class="text-style" - > - 标签说明: {{ ellipsis(dataForm.labelDesc, 20) }} - </span> - </el-col> - <el-col - :span="8" - class="attrInfo" - > - <el-tooltip - v-if="dataForm.createBy && dataForm.createBy.length > 20" - :content="dataForm.createBy" - class="item" - effect="dark" - placement="bottom-start" - > - <span class="text-style">创建人: {{ ellipsis(dataForm.createBy, 20) }}</span> - </el-tooltip> - <span - v-else - class="text-style" - > - 创建人: {{ ellipsis(dataForm.createBy, 20) }} - </span> - </el-col> - <el-col - :span="16" - class="attrInfo" - > - <el-tooltip - v-if="dataForm.createDate.length > 20" - :content="dataForm.createDate" - class="item" - effect="dark" - placement="bottom-start" - > - <span class="text-style">创建时间: {{ ellipsis(dataForm.createDate, 20) }}</span> - </el-tooltip> - <span - v-else - class="text-style" - > - 创建时间: {{ ellipsis(dataForm.createDate, 20) }} - </span> - </el-col> - <el-col - :span="8" - class="attrInfo" - > - <el-tooltip - v-if="dataForm.updateBy && dataForm.updateBy.length > 20" - :content="dataForm.updateBy" - class="item" - effect="dark" - placement="bottom-start" - > - <span class="text-style"> - 修改人: {{ ellipsis(dataForm.updateBy, 20) }} - </span> - </el-tooltip> - <span - v-else - class="text-style" - > - 修改人: {{ ellipsis(dataForm.updateBy, 20) }} - </span> - </el-col> - <el-col - :span="8" - class="attrInfo" - > - <el-tooltip - v-if="dataForm.updateDate.length > 20" - :content="dataForm.updateDate" - class="item" - effect="dark" - placement="bottom-start" - > - <span class="text-style">修改时间: {{ ellipsis(dataForm.updateDate, 20) }}</span> - </el-tooltip> - <span - v-else - class="text-style" - > - 修改时间: {{ ellipsis(dataForm.updateDate, 20) }} - </span> - </el-col> - </el-row> - - <el-divider - class="bs-el-divider" - content-position="left" - > - 关联数据集信息 - </el-divider> - - <div id="container" /> - </el-scrollbar> - </div> -</template> - -<script> -import G6 from '@antv/g6' -import { getLabelDetail } from 'packages/js/utils/LabelConfigService' - -export default { - name: 'LabelConfigDetails', - data () { - return { - dialogFormVisible: false, - dataForm: { - createBy: '', - createDate: '', - updateBy: '', - updateDate: '', - labelDesc: '', - labelName: '', - labelType: '' - }, - jsonData: {}, - chartHeight: 0, - chartWidth: 0 - } - }, - methods: { - ellipsis (value, len) { - if (!value) return '' - if (value.length > len) { - return value.slice(0, len) + '...' - } - return value - }, - init (row) { - this.dialogFormVisible = true - getLabelDetail(row.id).then((r) => { - this.jsonData = r.jsonData - if (r.jsonData.nodes.length > 1) { - this.chartHeight = r.jsonData.nodes.length * 100 - } else { - this.chartHeight = 200 - } - this.dataForm = r - - this.chartWidth = r.labelName.length * 20 - - this.$nextTick(() => { - this.initG6(r.jsonData) - }) - }) - }, - goBack () { - this.dialogFormVisible = false - this.$nextTick(() => { - this.$parent.labelVisible = true - this.$parent.getDataList() - }) - }, - nodeEach (nodes) { - nodes.forEach(node => { - if (!node.style) { - node.style = {} - } - switch (node.class) { - case 'c1': { - node.shape = 'circle' - node.size = 40 - break - } - case 'c3': { - node.shape = 'rect' - // node.size = [80, 50]; - node.style = { - stroke: '#FFFFFF', - fill: '#DFE1E3' - } - break - } - case 'c0': { - node.shape = 'ellipse' - node.size = [80, 40] - break - } - case 'c2': { - node.shape = 'diamond' - node.size = [60, 60] - break - } - } - }) - }, - // 初始化G6 - initG6 (json) { - const data = json - const width = document.getElementById('container').scrollWidth - - this.nodeEach(data.nodes) - const tooltip = new G6.Tooltip({ - offsetX: 10, - offsetY: 0, - fixToNode: [1, 0], - itemTypes: ['node', 'edge'], - getContent: (e) => { - const outDiv = document.createElement('div') - outDiv.style.width = 'fit-content' - outDiv.innerHTML = `<div style='width: 200px;'>${e.item.getModel()._label}</div>` - return outDiv - }, - shouldBegin: (e) => { - let res = true - if (e.item.getModel()._label && e.item.getModel()._label.length > 12) { - res = true - } else { - res = false - } - return res - } - }) - - const graph = new G6.Graph({ - container: 'container', - // width: '800', - height: this.chartHeight, - plugins: [tooltip], - // modes: { - // default: ['drag-canvas', 'zoom-canvas', 'click-select'] - // }, - defaultNode: { - type: 'rect', - size: [150, 50], - style: { - fill: '#9ACAFF', - stroke: '#FFFFFF' - } - }, - // 连线类型及样式 - defaultEdge: { - type: 'line', - style: { - offset: 25, - endArrow: true, - lineWidth: 2, - stroke: '#333' - } - } - }) - data.nodes.forEach(node => { - node._label = node.label - if (node.label.length > 12) { - node.label = node.label.substr(0, 9) + '...' - } - }) - graph.data(data) - graph.render() - } - } -} -</script> - -<style scoped> - -@import '../../assets/style/bsTheme.scss'; -.data-set-scrollbar { - height: 100%; - width: 100%; - overflow-y: auto; - overflow-x: none; -} -.inner-container{ - overflow-x: hidden; -} -.el-col { - height: 35px; -} - -.attrInfo { - padding-left: 20px !important; -} - -.text-style{ - color: var(--bs-el-title); -} - -.page-header { - display: flex; - position: relative; - - .page-header-right { - position: absolute; - right: 16px; - } -} -</style> diff --git a/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigEdit.vue b/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigEdit.vue new file mode 100644 index 00000000..ab0f5d8d --- /dev/null +++ b/data-room-ui/packages/DataSetLabelManagement/src/LabelConfigEdit.vue @@ -0,0 +1,223 @@ +<template> + <el-dialog + class="bs-dialog-wrap bs-el-dialog" + :append-to-body="true" + :before-close="cancel" + :title="dataForm.id!==''?'编辑标签':'新增标签'" + :visible.sync="formVisible" + > + <el-form + ref="ruleForm" + :model="dataForm" + :rules="rules" + label-position="right" + label-width="90px" + class="form-container" + > + <el-form-item + label="标签名称" + prop="labelName" + > + <el-input + v-model="dataForm.labelName" + class="bs-el-input" + clearable + placeholder="请输入标签名称" + maxlength="200" + /> + </el-form-item> + + <el-form-item + label="标签类型" + prop="labelType" + > + <el-select + ref="searchSelect" + v-model="dataForm.labelType" + class="bs-el-select" + popper-class="bs-el-select" + allow-create + clearable + filterable + placeholder="请选择或输入标签类型" + @blur="selectBlur" + @input.native="filterData" + > + <el-option + v-for="(item,K) in labelTypeList" + :key="K" + :label="item" + :value="item" + /> + </el-select> + </el-form-item> + + <el-form-item + label="标签说明" + prop="labelDesc" + > + <el-input + v-model="dataForm.labelDesc" + clearable + placeholder="请输入标签说明" + class="bs-el-input" + type="text" + /> + </el-form-item> + </el-form> + <span + slot="footer" + class="dialog-footer" + > + <el-button + class="bs-el-button-default" + @click="cancel" + > + 取消 + </el-button> + <el-button + type="primary" + @click="submitForm('ruleForm')" + > + 确定 + </el-button> + </span> + </el-dialog> +</template> + +<script> +import { addOrUpdateLabel, checkRepeatLabel } from 'packages/js/utils/LabelConfigService' + +export default { + name: 'LabelEdit', + data () { + return { + loading: false, + datasetList: [], + typeId: '', + dataForm: { + id: '', + labelName: '', + labelType: '', + labelDesc: '', + relList: [] + }, + formVisible: true, + rules: { + labelName: [ + { required: true, message: '标签名称不能为空', trigger: 'blur' }, + { validator: this.validateLabelName, trigger: 'blur' } + ], + labelType: [ + { required: true, message: '标签类型不能为空', trigger: 'change' } + ] + }, + // 分类树数据 + categoryData: [], + relVisible: false, + // 标签分类列表 + labelTypeList: [], + // 选中的数据集id列表 + datasetIdList: [] + } + }, + watch: { + 'dataForm.labelType': function (val) { + if (val.length > 20) { + this.dataForm.labelType = val.substring(0, 20) + } + } + }, + methods: { + /** + * 初始化 + * @param row 标签信息 + */ + init (row) { + this.$nextTick(() => { + this.$refs.ruleForm.clearValidate() + }) + this.dataForm.id = row ? row.id : '' + this.formVisible = true + if (row) { + this.dataForm.id = row.id + this.dataForm.labelName = row.labelName + this.dataForm.labelType = row.labelType + this.dataForm.labelDesc = row.labelDesc + } + }, + /** + * 标签名称校验 + * @param rule + * @param value + * @param callback + */ + validateLabelName (rule, value, callback) { + checkRepeatLabel({ id: this.dataForm.id, labelName: this.dataForm.labelName }).then(repeat => { + if (repeat) { + callback(new Error('标签名称已存在')) + } else { + callback() + } + }) + }, + /** + * 表单关闭 + */ + handleClose () { + this.$parent.editFormVisible = false + }, + /** + * 取消按钮 + */ + cancel () { + this.formVisible = false + this.$nextTick(() => { + this.handleClose() + }) + }, + /** + * 提交按钮 + * @param formName + */ + submitForm (formName) { + this.$refs[formName].validate((valid) => { + if (valid) { + this.saveForm(true) + } else { + return false + } + }) + }, + /** + * 保存标签信息 + * @param flag + */ + saveForm (flag) { + addOrUpdateLabel(this.dataForm).then((r) => { + this.$message.success('保存成功') + this.cancel() + this.$emit('afterEdit') + }) + }, + selectBlur (e) { + this.dataForm.labelType = e.target.value + }, + // 对输入字符串控制 + filterData () { + // 此属性得到输入的文字 + const str = this.$refs.searchSelect.$data.selectedLabel + // 控制的js + if (str.length > 20) { + this.$refs.searchSelect.$data.selectedLabel = str.substr(0, 20) + } + } + } +} +</script> + +<style scoped> +.form-container{ + padding: 0 8px; +} +</style> diff --git a/data-room-ui/packages/DataSetLabelManagement/src/LabelSelect.vue b/data-room-ui/packages/DataSetLabelManagement/src/LabelSelect.vue index e85b7616..4c8b9d1a 100644 --- a/data-room-ui/packages/DataSetLabelManagement/src/LabelSelect.vue +++ b/data-room-ui/packages/DataSetLabelManagement/src/LabelSelect.vue @@ -20,19 +20,21 @@ class="bs-el-button-default" icon="el-icon-plus" style="margin-left: 10px" - @click="addLabel" + @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="选择标签" + :title="isManage ? '标签管理' : '选择标签'" width="1000px" > - <div v-loading="labelCheckLoading"> + <div> <el-form :inline="true" class="bs-el-form filter-container" @@ -68,7 +70,6 @@ /> </el-select> </el-form-item> - <el-form-item> <el-button type="primary" @@ -77,57 +78,82 @@ 查询 </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-checkbox-group - v-model="checkLabelList" - style="padding-bottom: 10px" + <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-row :gutter="2"> - <el-col - v-for="label in labelList" - :key="label.id" - :span="4" - style="padding-top: 10px" - > - <el-tooltip - v-if="label.labelDesc || getByteLength(label.labelName) > 18" - effect="light" - placement="top-start" + <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)" > - <div slot="content"> - <div v-if="getByteLength(label.labelName) > 18"> - 名称: {{ label.labelName }} - </div> - <div v-if="label.labelDesc"> - 描述: {{ label.labelDesc }} - </div> - </div> - <el-checkbox - :label="label.id" - @change="labelCheckChange(label)" - > - {{ getByteLength(label.labelName) > 18 ? ellipsis(label.labelName, 18) : label.labelName }} - </el-checkbox> - </el-tooltip> - <el-checkbox - v-else - :label="label.id" - @change="labelCheckChange(label)" + 编辑 + </el-button> + <el-button + class="bs-el-button-default" + @click="deleteLabel(scope.row.id)" > - {{ label.labelName }} - </el-checkbox> - </el-col> - </el-row> - </el-checkbox-group> - + 删除 + </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="[20, 40, 60, 80]" + :page-sizes="[10, 20, 50, 100]" :total="totalCount" background layout="total, prev, pager, next,sizes,jumper" @@ -137,28 +163,48 @@ </div> <div class="el-dialog__footer"> - <el-button @click="handleClose"> + <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 } from 'packages/js/utils/LabelConfigService' +import {getLabelType, labelList, getLabelListByDatasetId, removeLabel} from 'packages/js/utils/LabelConfigService' export default { name: 'LabelSelect', - components: {}, + components: { + LabelEdit + }, mixins: [pageMixins], props: { // 选中的标签id列表 @@ -177,17 +223,20 @@ export default { }, data () { return { + isManage: false, idListCopy: this.idList, + // 选中的标签列表 selectLabelList: [], // 初始选中的标签列表 selectLabelListInitial: [], labelList: [], dialogFormVisible: false, + // 编辑弹窗可见性 + editFormVisible: false, searchForm: { labelName: '', labelType: '' }, - checkLabelList: [], sizeLabel: 20, labelTypeList: [], labelCheckLoading: false @@ -206,11 +255,13 @@ export default { // labelList变化时,根据selectLabelList中项的id,设置选中状态 labelList: { handler (val) { - this.checkLabelList = [] val.forEach((label) => { this.selectLabelList.forEach((selected) => { if (label.id === selected.id) { - this.checkLabelList.push(label.id) + // 设置选中状态 + this.$nextTick(() => { + this.$refs.labelTable.toggleRowSelection(label) + }) } }) }) @@ -220,25 +271,25 @@ export default { // 根据selectLabelList的变化,将id赋值给idList selectLabelList: { handler (val) { - this.checkLabelList = [] this.idListCopy = [] val.forEach((item) => { this.idListCopy.push(item.id) - this.checkLabelList.push(item.id) }) }, deep: true } - }, methods: { /** * 初始化方法 */ - init () { - this.dialogFormVisible = true - this.getDataList() - this.getLabelType() + init (manage) { + this.isManage = manage + this.$nextTick(() => { + this.dialogFormVisible = true + this.getDataList() + this.getLabelType() + }) }, /** * 获取标签类型列表 @@ -267,10 +318,57 @@ export default { 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 (label) { + 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) @@ -295,11 +393,17 @@ export default { }) }, /** - * 点击添加标签按钮 + * 点击添加标签关联按钮 */ - addLabel () { + addLabelRelation () { // 初始化 - this.init() + this.init(false) + }, + /** + * 标签管理按钮 + */ + manageLabel() { + this.init(true) }, /** * 选中标签类型 @@ -323,25 +427,12 @@ export default { this.selectLabelListInitial = _.cloneDeep(this.selectLabelList) this.$emit('commit', this.idListCopy) }, - getByteLength (str) { - return unescape(encodeURIComponent(str)).length - }, - ellipsis (str, len) { - if ((!str && typeof (str) !== 'undefined')) { - return '' - } - let num = 0 - const str1 = str - var str = '' - for (let i = 0, lens = str1.length; i < lens; i++) { - num += ((str1.charCodeAt(i) > 255) ? 2 : 1) - if (num > len - 3) { - break - } else { - str = str1.substring(0, i + 1) - } - } - return str + '...' + /** + * 标签编辑/新增后回调 + */ + afterEdit () { + this.getDataList() + this.getLabelType() } } } diff --git a/data-room-ui/packages/DataSetLabelManagement/src/Tree/index.vue b/data-room-ui/packages/DataSetLabelManagement/src/Tree/index.vue deleted file mode 100644 index 9eeb321e..00000000 --- a/data-room-ui/packages/DataSetLabelManagement/src/Tree/index.vue +++ /dev/null @@ -1,167 +0,0 @@ -<template> - <el-tree - :ref="treeRef" - class="bs-el-tree" - :data="treeData" - :default-expand-all="expandAll" - :expand-on-click-node="false" - :filter-node-method="filterNode" - :highlight-current="true" - :indent="0" - :props="defaultProps" - node-key="id" - style="width: fit-content;min-width: 100%;" - @node-click="handleNodeClick" - @node-contextmenu="rihgtClick" - > - <span - slot-scope="{ node,data }" - class="custom-tree-node" - style="width: 100%;position: relative;" - @mouseenter="mouseEnter(data)" - @mouseleave="mouseLeave(data)" - > - <span :style="data.children && data.children.length ? {} : {'padding-left': '12px'}"> - <i - :class="data.children && data.children.length ? 'el-icon el-icon-folder': 'el-icon el-icon-document'" - style="margin-right: 8px;" - /> - <span class="nodeText">{{ data.name }}</span> - </span> - <span - v-if="optionShow" - class="options" - > - <el-dropdown @command="(command) => { treeCommand(command, data) }"> - <i class="el-icon-more" /> - <el-dropdown-menu slot="dropdown"> - <slot name="options" /> - </el-dropdown-menu> - </el-dropdown> - </span> - </span> - </el-tree> -</template> - -<script> -export default { - name: 'Tree', - props: { - treeData: { - type: Array, - default: () => ([]) - }, - treeRef: { - type: String, - default: 'tree' - }, - nodeWidth: { - type: String, - default: '280px' - }, - expandAll: { - type: Boolean, - default: true - }, - filterText: { - type: String, - default: '' - }, - optionShow: { - type: Boolean, - default: false - } - }, - data () { - return { - defaultProps: { - children: 'children', - label: 'name' - } - } - }, - watch: { - treeData: function (val) { - // console.log('valx', val) - }, - filterText (val) { - this.$refs[this.treeRef].filter(val) - } - }, - methods: { - treeCommand (command, nodeData) { - this.$emit('treeCommand', command, nodeData) - }, - filterNode (value, data) { - if (!value) return true - return data.name.indexOf(value) !== -1 - }, - // 节点点击 - handleNodeClick (row, value) { - this.$emit('handleNodeClick', row, value) - }, - // 节点右键 - rihgtClick (event, object, value, element) { - this.$emit('rihgtClick', event, object, value, element) - }, - mouseEnter (data) { - // this.$set(data, 'show', true) - // 弹射节点数据 - this.$emit('mouseEnter', data) - }, - mouseLeave (data) { - // this.$set(data, 'show', false) - } - } -} -</script> - -<style lang="scss" scoped> -::v-deep .el-tree-node { - display: block; - min-width: 270px; - - .el-tree-node__content { - width: 270px; - overflow: hidden; - } - - .el-tree-node__children { - .el-tree-node { - display: block; - min-width: 270px; - - .el-tree-node__content { - width: 270px; - overflow: hidden; - } - } - } -} - -.custom-tree-node { - position: relative; - - .nodeText { - display: inline-block; - width: 225px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - line-height: 14px; - } - - .options { - position: absolute; - right: 30px; - height: 16px; - top: 2px; - line-height: 16px; - transform: rotate(90deg); - } -} - -// ::v-deep .is-current .options{ -// background: #fff; -// } -</style> diff --git a/data-room-ui/packages/DataSetLabelManagement/src/index.vue b/data-room-ui/packages/DataSetLabelManagement/src/index.vue deleted file mode 100644 index 7099074c..00000000 --- a/data-room-ui/packages/DataSetLabelManagement/src/index.vue +++ /dev/null @@ -1,311 +0,0 @@ -<template> - <div class="bs-container"> - <div - v-if="labelVisible" - class="inner-container" - > - <el-form - ref="queryForm" - :model="queryForm" - class="filter-container" - > - <el-form-item - class="filter-item" - prop="labelName" - > - <el-input - v-model="queryForm.labelName" - class="bs-el-input" - clearable - placeholder="请输入标签名称" - @clear="reSearch()" - @keyup.enter.native="reSearch()" - /> - </el-form-item> - <el-form-item - class="filter-item" - prop="labelType" - > - <el-select - v-model="queryForm.labelType" - clearable - filterable - class="bs-el-select" - popper-class="bs-el-select" - placeholder="请选择标签类型" - @change="reSearch()" - > - <el-option - key="all" - label="全部" - value="" - /> - <el-option - v-for="labelType in labelTypeList" - :key="labelType" - :label="labelType" - :value="labelType" - > - <span> - {{ labelType }} - </span> - <span style="float: right;padding-right: 20px"> - <el-button - class="bs-el-button-default" - icon="el-icon-edit" - type="text" - @click.stop="editLabelType(labelType)" - /> - <el-button - class="bs-el-button-default" - icon="el-icon-delete" - type="text" - @click.stop="deleteLabelType(labelType)" - /> - </span> - </el-option> - </el-select> - </el-form-item> - <el-form-item class="filter-item"> - <el-button - :loading="dataListLoading" - icon="el-icon-search" - type="primary" - @click="reSearch" - > - 查询 - </el-button> - </el-form-item> - <el-form-item - class="filter-item" - > - <el-button - type="primary" - class="bs-el-button-default" - @click="addOrUpdateLabel(undefined)" - > - 新增 - </el-button> - </el-form-item> - </el-form> - <div class="bs-table-box"> - <el-table - v-table - v-loading="dataListLoading" - height="0" - :data="tableData" - class="bs-el-table bs-scrollbar" - :element-loading-text="loadingText" - :header-cell-style="sortStyle" - @sort-change="reSort" - > - <el-empty slot="empty" /> - <el-table-column - label="标签名称" - prop="labelName" - show-overflow-tooltip - /> - <el-table-column - label="标签类型" - prop="labelType" - show-overflow-tooltip - /> - <el-table-column - label="标签说明" - prop="labelDesc" - show-overflow-tooltip - /> - <el-table-column - align="center" - label="操作" - width="200" - > - <template slot-scope="scope"> - <el-button - class="bs-el-button-default" - @click="getDetail(scope.row)" - > - 详情 - </el-button> - <el-button - class="bs-el-button-default" - @click="addOrUpdateLabel(scope.row)" - > - 编辑 - </el-button> - <el-button - class="bs-el-button-default" - @click="handleDelete(scope.row.id)" - > - 删除 - </el-button> - </template> - </el-table-column> - </el-table> - </div> - <div class="bs-pagination"> - <el-pagination - class="bs-el-pagination" - popper-class="bs-el-pagination" - :current-page="current" - :next-text="nextText" - :page-size="size" - :page-sizes="[10, 20, 50, 100]" - :prev-text="prevText" - :total="totalCount" - background - layout="total, prev, pager, next, sizes" - @size-change="sizeChangeHandle" - @current-change="currentChangeHandle" - /> - </div> - </div> - <label-config-add-or-update - v-if="addOrUpdateVisible" - ref="LabelConfigAddOrUpdate" - /> - <label-type-edit - v-if="labelTypeEditVisible" - ref="LabelTypeEdit" - /> - <label-config-details - ref="LabelConfigDetails" - /> - </div> -</template> - -<script> -import table from 'packages/js/utils/table.js' -import { pageMixins } from 'packages/js/mixins/page' -import LabelConfigAddOrUpdate from './LabelConfigAddOrUpdate.vue' -import LabelConfigDetails from './LabelConfigDetails.vue' -import LabelTypeEdit from './LabelTypeEdit.vue' -import { getLabelType, labelList, removeLabel, removeLabelByType } from 'packages/js/utils/LabelConfigService' - -export default { - name: 'LabelConfig', - directives: { - table // 注册自定义指令 - }, - mixins: [pageMixins], - components: { - LabelConfigDetails, - LabelConfigAddOrUpdate, - LabelTypeEdit - }, - data () { - return { - tableData: [], - addOrUpdateVisible: false, - addOrUpdateDetailVisible: false, - labelTypeEditVisible: false, - labelVisible: true, - labelTypeList: [], - dataListLoading: false, - loadingText: '', - queryForm: { - labelName: '', - labelType: '' - } - } - }, - watch: {}, - mounted () { - this.getDataList() - this.getLabelType() - }, - methods: { - deleteLabelType (labelType) { - this.$confirm('是否删除当前标签类型? ', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - removeLabelByType({ labelType: labelType }).then(() => { - this.$nextTick(() => { - this.reSearch() - this.getLabelType() - this.$message.success('删除成功') - }) - }) - }) - }, - editLabelType (labelType) { - this.labelTypeEditVisible = true - this.$nextTick(() => { - this.$refs.LabelTypeEdit.dialogFormVisible = true - this.$refs.LabelTypeEdit.init(labelType) - }) - }, - handleDelete (id) { - this.$confirm('确定删除当前标签吗?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - removeLabel(id).then(() => { - this.getDataList() - this.$message.success('删除成功') - }) - }).catch(() => { - }) - }, - // 新增/编辑 - addOrUpdateLabel (row) { - this.addOrUpdateVisible = true - this.$nextTick(() => { - this.$refs.LabelConfigAddOrUpdate.labelTypeList = this.labelTypeList - this.$refs.LabelConfigAddOrUpdate.init(row) - }) - }, - // 查看详情 - getDetail (row) { - this.addOrUpdateDetailVisible = true - this.labelVisible = false - this.$nextTick(() => { - this.$refs.LabelConfigDetails.init(row) - }) - }, - // 获取标签列表 - getLabelType () { - getLabelType().then((data) => { - this.labelTypeList = data - }) - }, - // 获取列表方法 - getDataList () { - this.dataListLoading = true - this.loadingText = '正在查询数据...' - const params = { - current: this.current, - size: this.size, - ...this.queryForm - } - labelList(params).then((data) => { - this.totalCount = data.totalCount - this.tableData = data.list - this.dataListLoading = false - }).catch(() => { - this.dataListLoading = false - }) - }, - // 查询事件 - reSearch () { - // 从第一页 - this.current = 1 - this.getDataList() - } - } -} -</script> -<style lang="scss" scoped> -@import '../../assets/style/bsTheme.scss'; - -.bs-pagination { - ::v-deep .el-input__inner { - width: 110px !important; - border: none; - background: var(--bs-el-background-1); - } - } -</style> diff --git a/data-room-ui/packages/index.js b/data-room-ui/packages/index.js index 2327e363..39e07d6c 100644 --- a/data-room-ui/packages/index.js +++ b/data-room-ui/packages/index.js @@ -26,8 +26,7 @@ const BigScreenDesign = () => import('./BigScreenDesign') const DataSetManagement = () => import('./DataSetManagement') // 数据源管理页面 const DataSourceManagement = () => import('./DataSourceManagement') -// 数据集标签管理页面 -import DataSetLabelManagement from 'packages/DataSetLabelManagement' + // 存储组件列表 const components = [ @@ -38,8 +37,7 @@ const components = [ BigScreenRun, BigScreenDesign, DataSetManagement, - DataSourceManagement, - DataSetLabelManagement + DataSourceManagement ] const $bigScreen = { @@ -62,7 +60,6 @@ export { BigScreenDesign, DataSetManagement, DataSourceManagement, - DataSetLabelManagement, $bigScreen, registerConfig, updateTheme @@ -78,7 +75,6 @@ export default { BigScreenDesign, DataSetManagement, DataSourceManagement, - DataSetLabelManagement, $bigScreen, registerConfig, updateTheme diff --git a/data-room-ui/packages/js/utils/registerConfig.js b/data-room-ui/packages/js/utils/registerConfig.js index f97f94b3..55501711 100644 --- a/data-room-ui/packages/js/utils/registerConfig.js +++ b/data-room-ui/packages/js/utils/registerConfig.js @@ -72,13 +72,6 @@ function registerRouters (config, router) { title: '数据集管理' } }, - { - path: config?.routers?.labelUrl || '/big-screen-label', - component: () => import('packages/DataSetLabelManagement'), - meta: { - title: '标签管理' - } - }, { path: config?.routers?.SourceUrl || '/big-screen-source', component: () => import('packages/SourceManagement'),