From 5113e93bb23b5527ddbdb1ed4b779a05575dc7cc Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 26 May 2022 17:35:53 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A0=91=E5=BD=A2?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ElTreeSelect/index.vue | 25 ++++++++++- .../widget/DeWidget/DeSelectTree.vue | 41 ++++++------------- .../serviceImpl/TextSelectTreeServiceImpl.js | 6 ++- frontend/src/utils/conditionUtil.js | 13 +++++- 4 files changed, 53 insertions(+), 32 deletions(-) diff --git a/frontend/src/components/ElTreeSelect/index.vue b/frontend/src/components/ElTreeSelect/index.vue index 7dea1fd05c..e7d74955ad 100644 --- a/frontend/src/components/ElTreeSelect/index.vue +++ b/frontend/src/components/ElTreeSelect/index.vue @@ -14,6 +14,7 @@ v-model="labels" v-popover:popover :style="styles" + :collapse-tags="showNumber" class="el-tree-select-input" :disabled="disabled" popper-class="select-option" @@ -119,8 +120,10 @@ export default { } }, // 树渲染方法,具体参考el-tree Function(h, { node, data, store }) {} + // eslint-disable-next-line vue/require-default-prop treeRenderFun: Function, // 搜索过滤方法,具体参考el-tree Function(h, { value, data, node }) {} + // eslint-disable-next-line vue/require-default-prop filterNodeMethod: Function, /* 文本框参数,几乎支持el-select所有的API
@@ -215,7 +218,8 @@ export default { ids: [], // 存储id visible: false, // popover v-model width: 150, - showParent: false + showParent: false, + showNumber: false } }, computed: { @@ -241,6 +245,9 @@ export default { this.ids = val === '' ? [] : [val] } } + }, + labels: function() { + this.setShowNumber() } }, created() { @@ -549,6 +556,22 @@ export default { */ filterFun(val) { this.$refs.tree.filter(val) + }, + + setShowNumber() { + this.showNumber = false + + this.$nextTick(() => { + if (!this.selectParams.multiple || !this.$refs.select || !this.$refs.select.$refs.tags) { + return + } + const kids = this.$refs.select.$refs.tags.children[0].children + let contentWidth = 0 + kids.forEach(kid => { + contentWidth += kid.offsetWidth + }) + this.showNumber = contentWidth > ((this.$refs.select.$refs.tags.clientWidth - 35) * 0.9) + }) } } } diff --git a/frontend/src/components/widget/DeWidget/DeSelectTree.vue b/frontend/src/components/widget/DeWidget/DeSelectTree.vue index 0c73552eda..f9a879600b 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectTree.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectTree.vue @@ -5,7 +5,6 @@ ref="deSelectTree" v-model="value" popover-class="test-class-wrap" - :is-single="isSingle" :data="datas" :select-params="selectParams" :tree-params="treeParams" @@ -45,9 +44,8 @@ export default { }, data() { return { - showNumber: false, - selectOptionWidth: 0, show: true, + selectOptionWidth: 0, datas: [], value: this.isSingle ? '' : [], selectParams: { @@ -135,14 +133,17 @@ export default { }, 'element.options.attrs.multiple': function(value, old) { if (typeof old === 'undefined' || value === old) return + if (!this.inDraw) { this.value = value ? [] : null this.element.options.value = '' } - this.show = false this.$nextTick(() => { this.show = true + this.$nextTick(() => { + this.$refs.deSelectTree && this.$refs.deSelectTree.treeDataUpdateFun(this.datas) + }) }) } @@ -212,25 +213,14 @@ export default { this.element.options.manualModify = true } this.setCondition() - this.showNumber = false - - this.$nextTick(() => { - if (!this.element.options.attrs.multiple || !this.$refs.deSelect || !this.$refs.deSelect.$refs.tags) { - return - } - const kids = this.$refs.deSelect.$refs.tags.children[0].children - let contentWidth = 0 - kids.forEach(kid => { - contentWidth += kid.offsetWidth - }) - this.showNumber = contentWidth > ((this.$refs.deSelectTree.$refs.tags.clientWidth - 30) * 0.9) - }) }, setCondition() { + const val = this.formatFilterValue() + const param = { component: this.element, - value: this.formatFilterValue(), + value: val, operator: this.operator, isTree: true } @@ -267,7 +257,8 @@ export default { return results // return this.value } - return this.value.split(',') + const result = this.value.split(',').map(v => v.replaceAll(SEPARATOR, ',')) + return result }, fillValueDerfault() { @@ -286,14 +277,6 @@ export default { return datas.filter(item => !!item) }, - setOptionWidth(event) { - // 下拉框弹出时,设置弹框的宽度 - this.$nextTick(() => { - // this.selectOptionWidth = event.srcElement.offsetWidth + 'px' - this.selectOptionWidth = event.srcElement.parentElement.parentElement.offsetWidth + 'px' - }) - }, - /* 下面是树的渲染方法 */ _filterFun(value, data, node) { @@ -308,9 +291,9 @@ export default { _searchFun(value) { console.log(value, '<--_searchFun') // 自行判断 是走后台查询,还是前端过滤 - this.$refs.treeSelect.filterFun(value) + this.$refs.deSelectTree.filterFun(value) // 后台查询 - // this.$refs.treeSelect.treeDataUpdateFun(treeData); + // this.$refs.deSelectTree.treeDataUpdateFun(treeData); }, // 自定义render _renderFun(h, { node, data, store }) { diff --git a/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js index 9180883558..23674de94f 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js @@ -88,7 +88,11 @@ class TextSelectTreeServiceImpl extends WidgetService { const param = { component: element, value: !value ? [] : Array.isArray(value) ? value : value.toString().split(','), - operator: element.options.attrs.multiple ? 'in' : 'eq' + operator: element.options.attrs.multiple ? 'in' : 'eq', + isTree: true + } + if (param.value && param.value.length) { + param.value = param.value.map(val => val.replaceAll('-de-', ',')) } return param } diff --git a/frontend/src/utils/conditionUtil.js b/frontend/src/utils/conditionUtil.js index 4416b25f4c..27ba99e879 100644 --- a/frontend/src/utils/conditionUtil.js +++ b/frontend/src/utils/conditionUtil.js @@ -27,8 +27,19 @@ export const valueValid = condition => { export const formatCondition = obj => { const { component, value, operator, isTree } = obj - const fieldId = component.options.attrs.fieldId + + let fieldId = component.options.attrs.fieldId const viewIds = component.options.attrs.viewIds + if (isTree && !component.options.attrs.multiple && value && value.length) { + // 单选树 + const val = value[0] + if (val) { + const len = val.split(',').length + if (len) { + fieldId = fieldId.split(',').slice(0, len).join(',') + } + } + } const condition = new Condition(component.id, fieldId, operator, value, viewIds, isTree) return condition }