| | |
| | | <template> |
| | | <div class="UI-dynamic" :id="'UI-dynamic-'+areasName+componentVO.oid"> |
| | | |
| | | <dynamic-button v-if="componentVO.buttons && componentVO.buttons.length>0" :componentVO="componentVO" |
| | | :key="areasName+'buttons-'+componentVO.oid" |
| | | :butttonList="componentVO.buttons" :dataStore="checkDatas" |
| | | :sourceData="sourceData" type="tree" style="margin-bottom: 5px;"></dynamic-button> |
| | | <el-input |
| | | placeholder="输入关键字进行过滤" |
| | | v-model="filterText"> |
| | | </el-input> |
| | | <el-tree |
| | | class="filter-tree" |
| | | :show-checkbox="isMuti" |
| | | :check-on-click-node="true" |
| | | :lazy="lazy" |
| | | :data="data" |
| | | :load="loadNode" |
| | | :props="defaultProps" |
| | | :filter-node-method="filterNode" |
| | | highlight-current |
| | | node-key="oid" |
| | | @check="checkNode" |
| | | @current-change="changeNode" |
| | | @node-click="clickNode" |
| | | ref="tree"> |
| | | </el-tree> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import {getList, getTree} from '@/api/base/ui' |
| | | import {validatenull} from "@/util/validate"; |
| | | |
| | | export default { |
| | | name: "dynamic-tree", |
| | | props:{ |
| | | //ui上下文的业务类型(或链接类型) |
| | | uiBtmType: { |
| | | type: String |
| | | }, |
| | | //ui上下文 |
| | | uiContext:{ |
| | | type: String |
| | | }, |
| | | componentVO:{ |
| | | type:Object, |
| | | default: {} |
| | |
| | | type:Object, |
| | | default: {} |
| | | }, |
| | | //上一区域业务类型 |
| | | sourceBtmType:{ |
| | | type: String |
| | | }, |
| | | dataStore:{ |
| | | //弹窗时按钮所属区域选中数据 |
| | | type:Array, |
| | | default: [] |
| | | }, |
| | | paramVOS:{ |
| | | type:Object, |
| | | default: {} |
| | | }, |
| | | isShow: { |
| | | //所在区域是否已显示,针对tab和collapse |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | }, |
| | | watch: { |
| | | filterText(val) { |
| | | this.$refs.tree.filter(val); |
| | | }, |
| | | isShow:{ |
| | | handler(newval) { |
| | | if(newval) { |
| | | //console.log(this.$el.clientHeight) |
| | | } |
| | | } |
| | | }, |
| | | checkDatas:{ |
| | | handler(newval) { |
| | | if(newval) { |
| | | this.$emit("setDataStore", { |
| | | area: this.areasName, |
| | | type:this.componentVO.uiComponentType, |
| | | btmType:this.componentVO.treeDefineVO.btmType, |
| | | dataStore:newval |
| | | }); |
| | | } |
| | | } |
| | | }, |
| | | sourceData:{ |
| | | handler(newval) { |
| | | //源数据有变化时变更当前区域数据 |
| | | this.sourceDataMapParams=this.sourceDataMap(); |
| | | this.getParams(); |
| | | this.handleRefresh(); |
| | | } |
| | | } |
| | | }, |
| | | data() { |
| | | return {} |
| | | } |
| | | return { |
| | | filterText: '', |
| | | defaultProps: { |
| | | children: 'children', |
| | | label: 'text' |
| | | }, |
| | | lazy:this.componentVO.treeDefineVO.loadType == 'node', |
| | | isMuti:false, |
| | | data:[], |
| | | checkDatas:[], |
| | | currentClickNode:null, |
| | | params:{}, |
| | | sourceDataMapParams:{} |
| | | } |
| | | }, |
| | | created() { |
| | | this.getParams(); |
| | | if (!this.lazy) { |
| | | this.initData(); |
| | | } |
| | | }, |
| | | mounted() { |
| | | if(this.componentVO.buttons && this.componentVO.buttons.length>0){ |
| | | this.$children[2].$el.style.height = 'calc(100% - 50px - '+this.$children[0].$el.clientHeight+'px - 10px)'; |
| | | } |
| | | }, |
| | | methods: { |
| | | filterNode(value, data) { |
| | | if (!value) return true; |
| | | return data[this.defaultProps.label].indexOf(value) !== -1; |
| | | }, |
| | | sourceDataMap: function () { |
| | | const sourceDataMap = {}; |
| | | if (Object.keys(this.sourceData).length > 0) { |
| | | if (this.sourceData.oid) { |
| | | if (this.sourceData.oid.indexOf('@vcitreesep@') > -1) { |
| | | this.sourceData.oid = this.sourceData.oid.split('@vcitreesep@')[1]; |
| | | } |
| | | sourceDataMap.sourceBtmName = this.sourceBtmType; |
| | | ; |
| | | sourceDataMap.sourceOid = this.sourceData.oid; |
| | | } |
| | | for (let i in this.sourceData) { |
| | | let item = this.sourceData[i] |
| | | if (item && item.constructor === Object) return; |
| | | if (i == 'type' || i == 'context' || i == 'content') return; |
| | | sourceDataMap['sourceData["' + i + '"]'] = item |
| | | } |
| | | } |
| | | |
| | | if (Object.keys(this.paramVOS).length > 0) { |
| | | for (let i in this.paramVOS) { |
| | | let item = this.paramVOS[i] |
| | | if (item && item.constructor === Object) return; |
| | | if (i == 'type' || i == 'context' || i == 'content') return; |
| | | sourceDataMap['sourceData["' + i + '"]'] = item |
| | | } |
| | | } |
| | | return sourceDataMap; |
| | | }, |
| | | getParams: function () { |
| | | let parentFieldName = ""; |
| | | if (this.componentVO.treeDefineVO.showLinkAbs) { |
| | | parentFieldName = this.componentVO.treeDefineVO.showLinkAbs.split(",")[0]; |
| | | } |
| | | const treeParams = { |
| | | queryAllLevel: !this.lazy, |
| | | loadType: this.componentVO.treeDefineVO.loadType, |
| | | multipleSelect: this.isMuti, |
| | | isMuti: this.isMuti, |
| | | isQueryAllColumn: true, |
| | | btmname: this.componentVO.treeDefineVO.btmType, |
| | | componentOid: this.componentVO.oid, |
| | | uiDefineId: this.uiContext, |
| | | valueField: this.componentVO.treeDefineVO.valueField || 'oid', |
| | | parentFieldName: parentFieldName, |
| | | textField: this.componentVO.treeDefineVO.treeNodeExpression, |
| | | queryTemplate: this.sourceData.querytemplate, |
| | | linkTypeFlag: validatenull(this.sourceData.queryType) ? (validatenull(this.sourceData.linkType) ? false : true) : (this.sourceData.queryType == 0 ? false : true), |
| | | rootExpress: this.componentVO.treeDefineVO.rootExpress || '' |
| | | } |
| | | const sourceDataMapList = this.sourceDataMapParams; |
| | | |
| | | this.params = Object.assign({}, treeParams, sourceDataMapList); |
| | | }, |
| | | initData() { |
| | | if (Object.keys(this.sourceData).length > 0 && this.isShow) { |
| | | getTree(null, null, Object.assign({ |
| | | queryRoot: true |
| | | }, this.params)).then(res => { |
| | | this.data = res.data.treeData; |
| | | }).catch(error => { |
| | | this.$message.error(error); |
| | | }) |
| | | } |
| | | }, |
| | | loadNode(node, resolve) { |
| | | //逐级加载 |
| | | let parentOid = (node.level === 0) ? 0 : node.data.oid; |
| | | if (parentOid != 0 && parentOid.indexOf('@vcitreesep@') > -1) { |
| | | parentOid = parentOid.split('@vcitreesep@')[1]; |
| | | } |
| | | const parentBtmName = (node.level === 0) ? '' : node.data.attributes.btmname; |
| | | const params=this.params; |
| | | if(node.level === 0){ |
| | | params.queryRoot= true; |
| | | }else { |
| | | delete params.queryRoot; |
| | | } |
| | | getTree(parentOid, parentBtmName, params).then(res => { |
| | | resolve(res.data.treeData) |
| | | }).catch(error => { |
| | | this.$message.error(error); |
| | | }) |
| | | }, |
| | | checkNode(checkedNode, checkedData) { |
| | | if (this.isMuti) { |
| | | this.checkDatas = checkedData.checkedNodes; |
| | | } |
| | | }, |
| | | changeNode(data, node) { |
| | | if (!this.isMuti) { |
| | | this.checkDatas = [data]; |
| | | } |
| | | }, |
| | | clickNode(data, node) { |
| | | this.currentClickNode = node; |
| | | }, |
| | | handleRefresh() { |
| | | if (!this.lazy) { |
| | | this.initData(); |
| | | } else { |
| | | if (this.currentClickNode) { |
| | | let node = this.currentClickNode.parent; |
| | | node.loaded = false; |
| | | node.expand(); |
| | | } |
| | | } |
| | | this.checkDatas = []; |
| | | } |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | .filter-tree{ |
| | | height: calc(100% - 50px); |
| | | overflow: auto; |
| | | box-sizing: border-box; |
| | | padding-top: 10px; |
| | | } |
| | | </style> |