From 015a99675ad021a5b1f8d635da3e8887e0c28a97 Mon Sep 17 00:00:00 2001 From: Surpriseplus <845948745@qq.com> Date: 星期四, 02 三月 2023 17:33:03 +0800 Subject: [PATCH] 资料馆添加附件上传,添加支持查看pdf,图片文件功能;字典管理,值域管理页面左侧目录树展示效果优化 --- src/views/Archive/index.vue | 270 ++++++++++++++++++++++ src/views/datamanage/dictionaryManage.vue | 86 +++--- src/views/datamanage/domainManage.vue | 339 +++++++++++++++++----------- 3 files changed, 520 insertions(+), 175 deletions(-) diff --git a/src/views/Archive/index.vue b/src/views/Archive/index.vue index 3200e8e..745f391 100644 --- a/src/views/Archive/index.vue +++ b/src/views/Archive/index.vue @@ -465,6 +465,102 @@ >纭� 瀹�</el-button> </span> </el-dialog> + <!-- 鏁版嵁搴撻檮浠朵俊鎭� --> + <el-dialog + :title="$t('common.enclosure')" + :visible.sync="outerVisible" + :close-on-click-modal="false" + width="50%" + :modal="false" + > + <div style="height:68vh"> + <el-form + :model="fromfile" + class="demo-form-inline" + > + <el-form-item> + <el-input + v-model="fromfile.file" + style="width: 300px; margin-right: 20px" + :placeholder="$t('common.choose')" + disabled + ></el-input> + <input + name="file1" + type="file" + id="insertFile" + multiple="multiple" + style="display: none" + @change="insertFile( )" + /> + <el-link + @click="getInsertFile( )" + :underline="false" + ><i class="el-icon-folder-opened"></i></el-link> + </el-form-item> + <el-form-item> + <el-row> + <el-col :span="2"> + <el-link + class="elLink" + :underline="false" + @click="setAttachInsert" + >{{$t('common.append')}}</el-link> + </el-col> + <el-col :span="2"> + <el-link + class="elLink" + :underline="false" + @click="setAttachDel" + >{{$t('common.delete')}}</el-link> + </el-col> + </el-row> + </el-form-item> + </el-form> + <el-table + :data="tableAttach" + ref="filterTable" + height="calc(100% - 130px)" + border + style="width: 100%" + @selection-change="handleAttatchChange" + > + <el-table-column + type="selection" + width="70" + /> + <el-table-column + width="60" + type="index" + :label="$t('common.index')" + /> + <el-table-column + prop="name" + :label="$t('common.fileNme')" + /> + + <el-table-column + prop="sizes" + :label="$t('common.size')" + :formatter="statSizeChange" + /> + <el-table-column + align="center" + :label="$t('common.operate')" + min-width="100" + > + <template slot-scope="scope"> + <el-link + @click="setAttatchDetail(scope.$index, scope.row)" + class="elLink" + >{{ $t('common.see') }}</el-link> + + </template> + </el-table-column> + </el-table> + </div> + </el-dialog> + <!-- 鏁版嵁搴揟able淇℃伅 --> <div style="height:68vh"> <el-form :model="formInline" @@ -910,6 +1006,37 @@ </div> </div> </el-dialog> + <el-dialog + title="棰勮" + :append-to-body="false" + :visible.sync="dialog.dialogVisible" + width="70%" + :close-on-click-modal="false" + > + <div + v-if="dialog.isPdf" + class="pdfClass" + > + <iframe + :src="dialog.src" + type="application/x-google-chrome-pdf" + width="100%" + height="100%" + > + </iframe> + </div> + <div + v-if="dialog.isJpg" + class="pdfClass" + > + <img + style="width:100%; height:100%" + :src="dialog.src" + alt="" + /> + </div> + </el-dialog> + <iframe id="downFrame" src="" @@ -938,7 +1065,9 @@ dataLib_selectDownloadFile, dataLib_selectPageCountForDownload, dataLib_selectPageAndCountByPid, - dataLib_selectMetaById + dataLib_selectMetaById, + dataLib_selectFiles, + dataLib_deletes } from '../../api/api'; export default { components: { @@ -966,7 +1095,7 @@ } }; return { - + fromfile: { file: '' }, fromSqlflag: false, filedsOption: [], condOption: [], @@ -1055,6 +1184,20 @@ }, queryMetaFlag: false, metaDataTable: [], + upAttach: { + tabName: null, + eventid: null, + }, + outerVisible: false, + tableAttach: [], + dataLib_selectFiles: [], + attacgSelection: [], + dialog: { + dialogVisible: false, + isPdf: false, + isJpg: false, + src: '' + } }; }, mounted() { @@ -1064,9 +1207,119 @@ this.signGetPublicKey(); }, methods: { - getAttachTable() { - + // 闄勪欢=>琛ㄦ牸閫夋嫨 + handleAttatchChange(val) { + this.attacgSelection = val; }, + //闄勪欢=>鏂囦欢閫夋嫨 + getInsertFile() { + $('#insertFile').click(); + }, + insertFile() { + var val = document.getElementById('insertFile').files; + if (!val || !val.length) return; + this.fromfile.file = val[0].name; + }, + getAttachTable(index, row) { + if (row.eventid != null) { + this.upAttach.eventid = row.eventid; + } else { + this.upAttach.eventid = ""; + } + this.outerVisible = true; + this.getAttacthFlieList(); + }, + //闄勪欢鍒楄〃鏌ヨ + async getAttacthFlieList() { + var obj = this.upAttach; + const res = await dataLib_selectFiles(obj); + if (res.code != 200) { + this.$message.error('鍒楄〃璋冪敤澶辫触'); + return + } + this.tableAttach = res.result; + }, + refreshAttatchDetail() { + this.dialog.src = ""; + this.dialog.dialogVisible = false; + this.dialog.isPdf = false; + this.dialog.isJpg = false; + }, + //闄勪欢鏌ョ湅 + setAttatchDetail(index, row) { + + this.refreshAttatchDetail() + var name = row.name; + if (name.indexOf('.pdf') != -1) { + this.dialog.dialogVisible = true; + this.dialog.isPdf = true; + var url = BASE_URL + "/res/downloadForView?guid=" + row.guid + "&token=" + getToken(); + this.dialog.src = url + } else if (name.indexOf('.jpg') != -1 || name.indexOf('.gif') != -1 || name.indexOf('.png') != -1 || name.indexOf('.jpeg') != -1) { + this.dialog.dialogVisible = true; + this.dialog.isJpg = true; + var url = BASE_URL + "/res/downloadForView?guid=" + row.guid + "&token=" + getToken(); + this.dialog.src = url + } + }, + //闄勪欢鍒櫎 + async setAttachDel() { + var std = []; + for (var i in this.attacgSelection) { + std.push(this.attacgSelection[i].id); + } + const res = await dataLib_deletes({ ids: std.toString() }); + if (res.code != 200) { + this.$message.error('鏂囦欢鍒犻櫎澶辫触'); + } + this.getAttacthFlieList(); + }, + //闄勪欢鍒楄〃鏂板 + setAttachInsert() { + var token = getToken(); + var fs = document.getElementById("insertFile"); + if (fs.files.length == 0) { + + this.$message({ + message: '璇烽�夋嫨瑕佷笂浼犵殑鏂囦欢锛�', + type: 'warning' + }); + return; + } + const formData = new FormData() + for (var i = 0, c = fs.files.length; i < c; i++) { + + formData.append('file', fs.files[i]); // fs.files[i].name,file + } + + $.ajax(BASE_URL + "/dataQuery/uploadFiles?token=" + token + "&tabName=" + this.upAttach.tabName + "&eventid=" + this.upAttach.eventid, { + type: "post", + data: formData, + async: true, + cache: false, + processData: false, + contentType: false, + success: (rs) => { + this.$message({ + message: '闄勪欢娣诲姞鎴愬姛', + type: 'success' + }); + document.getElementById("insertFile").value = ""; + this.fromfile = { + file: '', + } + this.getAttacthFlieList(); + }, + error: (e) => { + document.getElementById("insertFile").value = ""; + this.fromfile = { + file: '', + } + this.$message.error('闄勪欢娣诲姞澶辫触'); + } + }); + }, + setRestMetaData() { this.fromQueryMeta.name = ""; this.listMetaData.name = this.fromQueryMeta.name; @@ -1434,6 +1687,7 @@ this.listBankData.pageIndex = 1; this.listBankData.pageSize = 10; this.listBankData.title = res.tabDesc; + this.upAttach.tabName = res.ns + "." + res.tab; this.filedsLayer = this.getBankTableFiled(); this.getCollapseTable(this.filedsLayer); }, @@ -1614,6 +1868,9 @@ //鏍煎紡鍖栨椂闂� add0(m) { return m < 10 ? '0' + m : m; + }, + statSizeChange(row, column) { + return this.stateFormatSizes(row.sizes) }, stateFormatSizes(res) { if (res >= 1024) { @@ -1903,5 +2160,10 @@ justify-content: center; } } + .pdfClass { + height: 70vh; + width: 100%; + position: relative; + } } </style> diff --git a/src/views/datamanage/dictionaryManage.vue b/src/views/datamanage/dictionaryManage.vue index 0e20bcc..845acae 100644 --- a/src/views/datamanage/dictionaryManage.vue +++ b/src/views/datamanage/dictionaryManage.vue @@ -607,20 +607,7 @@ insert: false, update: false, }, - domainData: [ - { - val: "鍩虹鏁版嵁", - children: [], - }, - { - val: "涓氬姟鏁版嵁", - children: [], - }, - { - val: "鍏冩暟鎹�", - children: [], - }, - ], + domainData: [], defaultProps: { children: "children", label: "val", @@ -787,31 +774,52 @@ if (data.code != 200) { this.$message.error("涓嬫媺璋冪敤澶辫触"); } - let bdres = data.result.filter((item) => item.ns == "bd"); - let bsres = data.result.filter((item) => item.ns == "bs"); - let mdres = data.result.filter((item) => item.ns == "md"); - for (var i in bdres) { - // bdres[i].val = bdres[i].tabDesc + '(' + bdres[i].tab + ')'; - bdres[i].val = bdres[i].tabDesc; - } - for (var i in bsres) { - // bsres[i].val = bsres[i].tabDesc + '(' + bsres[i].tab + ')'; - bsres[i].val = bsres[i].tabDesc; - } - for (var i in mdres) { - // bsres[i].val = bsres[i].tabDesc + '(' + bsres[i].tab + ')'; - mdres[i].val = mdres[i].tabDesc; - } - this.domainData[0].children = bdres; - this.domainData[1].children = bsres; - this.domainData[2].children = mdres; - var val = this.domainData[0].children; - this.insertform.tab = val[0].tab; - this.insertform.tabDesc = val[0].tabDesc; - this.insertform.ns = val[0].ns; - this.listData.tab = val[0].tab; - this.listData.ns = val[0].ns; - this.activeName = val[0].tab; + var val = data.result; + var std = []; + val.filter((item) => { + if (std.indexOf(item.bak) == -1) { + std.push(item.bak); + this.domainData.push( + { + val: item.bak, + children: [], + } + ) + } + }); + this.domainData.filter((item) => { + val.filter((res) => { + if (item.val === res.bak) { + res.val = res.tabDesc + item.children.push(res) + } + }) + }) + // let bdres = data.result.filter((item) => item.ns == "bd"); + // let bsres = data.result.filter((item) => item.ns == "bs"); + // let mdres = data.result.filter((item) => item.ns == "md"); + // for (var i in bdres) { + // // bdres[i].val = bdres[i].tabDesc + '(' + bdres[i].tab + ')'; + // bdres[i].val = bdres[i].tabDesc; + // } + // for (var i in bsres) { + // // bsres[i].val = bsres[i].tabDesc + '(' + bsres[i].tab + ')'; + // bsres[i].val = bsres[i].tabDesc; + // } + // for (var i in mdres) { + // // bsres[i].val = bsres[i].tabDesc + '(' + bsres[i].tab + ')'; + // mdres[i].val = mdres[i].tabDesc; + // } + // this.domainData[0].children = bdres; + // this.domainData[1].children = bsres; + // this.domainData[2].children = mdres; + var result = this.domainData[0].children; + this.insertform.tab = result[0].tab; + this.insertform.tabDesc = result[0].tabDesc; + this.insertform.ns = result[0].ns; + this.listData.tab = result[0].tab; + this.listData.ns = result[0].ns; + this.activeName = result[0].tab; this.startQueryNameData(); }, }, diff --git a/src/views/datamanage/domainManage.vue b/src/views/datamanage/domainManage.vue index e99b85a..db8557e 100644 --- a/src/views/datamanage/domainManage.vue +++ b/src/views/datamanage/domainManage.vue @@ -1,15 +1,22 @@ <template> <div class="domainBox"> - <My-bread - :list="[ + <My-bread :list="[ `${$t('dataManage.dataManage')}`, `${$t('dataManage.rangeManage')}`, - ]" - ></My-bread> + ]"></My-bread> <el-divider /> <div class="mainBox"> - <div class="leftTree subpage_Div" style="border: 1px solid #dcdfe6;"> - <el-input size="small" v-model="filterInput" style="width: 200px" :placeholder="$t('shuJuGuanLi.shuJuJianSuo.valueone')" suffix-icon="el-icon-search"></el-input> + <div + class="leftTree subpage_Div" + style="border: 1px solid #dcdfe6;" + > + <el-input + size="small" + v-model="filterInput" + style="width: 200px" + :placeholder="$t('shuJuGuanLi.shuJuJianSuo.valueone')" + suffix-icon="el-icon-search" + ></el-input> <div style="width: 450px"> <el-tree :data="domainData" @@ -23,14 +30,26 @@ </div> <div class="right subpage_Div"> <div class="inquire"> - <el-form ref="queryForm" :model="queryForm" :inline="true"> - <el-form-item :label="$t('dataManage.vmobj.keyword')" prop="name" > - <el-input - size="small" + <el-form + ref="queryForm" + :model="queryForm" + :inline="true" + > + <el-form-item + :label="$t('dataManage.vmobj.keyword')" + prop="name" + > + <el-input + size="small" v-model="queryForm.code" :placeholder="$t('shuJuGuanLi.lable4')" style="width: 200px" - ><i slot="suffix" class="el-icon-search" @click="queryInfo('queryForm')" style="padding-right: 8px"></i></el-input> + ><i + slot="suffix" + class="el-icon-search" + @click="queryInfo('queryForm')" + style="padding-right: 8px" + ></i></el-input> </el-form-item> <el-form-item style="float: right"> <el-button @@ -39,17 +58,15 @@ icon="el-icon-plus" size="small" type="success" - >{{ $t("common.append") }}</el-button - > + >{{ $t("common.append") }}</el-button> <el-button v-if="btnStatus.delete" @click="deleteInfo" type="danger" size="small" icon="el-icon-delete" - >{{ $t("common.delete") }}</el-button - > -<!-- <el-button + >{{ $t("common.delete") }}</el-button> + <!-- <el-button @click="queryInfo('queryForm')" icon="el-icon-search" size="small" @@ -61,20 +78,25 @@ icon="el-icon-delete" size="small" type="info" - >{{ $t("common.empty") }}</el-button - > + >{{ $t("common.empty") }}</el-button> </el-form-item> </el-form> </div> <div class="dividing-line"></div> - <div class="table_box" style="height: calc(100% - 60px)"> + <div + class="table_box" + style="height: calc(100% - 60px)" + > <el-table :data="tableData" @selection-change="handleSelectionChange" border height="calc(100% - 57px)" > - <el-table-column type="selection" width="50" /> + <el-table-column + type="selection" + width="50" + /> <el-table-column align="center" type="index" @@ -122,27 +144,31 @@ :label="$t('dataManage.domainManage.bak')" /> - <el-table-column min-width="150" :label="$t('common.operate')"> + <el-table-column + min-width="150" + :label="$t('common.operate')" + > <template slot-scope="scope"> <el-button @click="showDetail(scope.row)" type="primary" size="small" plain - >{{ $t("common.details") }}</el-button - > + >{{ $t("common.details") }}</el-button> <el-button v-if="btnStatus.update" type="warning" @click="handleEdit(scope.$index, scope.row)" size="small" plain - >{{ $t("common.update") }}</el-button - > + >{{ $t("common.update") }}</el-button> </template> </el-table-column> </el-table> - <div class="pagination_box" style="margin-top: 15px"> + <div + class="pagination_box" + style="margin-top: 15px" + > <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" @@ -157,11 +183,20 @@ </div> </div> </div> - <div class="infoBox_box" v-show="showinfoBox"> + <div + class="infoBox_box" + v-show="showinfoBox" + > <div class="infoBox subpage_Div box_div"> - <div slot="header" class="clearfix"> + <div + slot="header" + class="clearfix" + > <span>{{ $t("common.details") }}</span> - <div style="float: right; cursor: pointer" @click="closeDetial"> + <div + style="float: right; cursor: pointer" + @click="closeDetial" + > <i class="el-icon-close"></i> </div> </div> @@ -217,75 +252,114 @@ :visible.sync="dialogFormVisible" :before-close="handleClose" > - <div style="height: 500px; overflow: auto"> - <el-form :model="editForm" ref="editForm" label-position="top"> - <el-form-item - :label="$t('dataManage.domainManage.domName')" - :label-width="formLabelWidth" + <div style="height: 500px; overflow: auto"> + <el-form + :model="editForm" + ref="editForm" + label-position="top" > - <el-select - :popper-append-to-body="false" - style="width:85%" - v-model="editForm.domName" - placeholder="璇烽�夋嫨" + <el-form-item + :label="$t('dataManage.domainManage.domName')" + :label-width="formLabelWidth" > - <el-option - v-for="item in domainOptions" - :key="item.value" - :label="item.label" - :value="item.value" + <el-select + :popper-append-to-body="false" + style="width:85%" + v-model="editForm.domName" + placeholder="璇烽�夋嫨" > - </el-option> - </el-select> - <!-- <el-input v-model="editForm.domName" autocomplete="off"></el-input> --> - </el-form-item> - <el-form-item - :label="$t('dataManage.domainManage.domDesc')" - :label-width="formLabelWidth" - > - <el-input v-model="editForm.domDesc" autocomplete="off" style="width:85%"></el-input> - </el-form-item> + <el-option + v-for="item in domainOptions" + :key="item.value" + :label="item.label" + :value="item.value" + > + </el-option> + </el-select> + <!-- <el-input v-model="editForm.domName" autocomplete="off"></el-input> --> + </el-form-item> + <el-form-item + :label="$t('dataManage.domainManage.domDesc')" + :label-width="formLabelWidth" + > + <el-input + v-model="editForm.domDesc" + autocomplete="off" + style="width:85%" + ></el-input> + </el-form-item> - <el-form-item - :label="$t('dataManage.domainManage.domCode')" - :label-width="formLabelWidth" - > - <el-input v-model="editForm.domCode" autocomplete="off" style="width:85%"></el-input> - </el-form-item> - <el-form-item - :label="$t('dataManage.domainManage.codeDesc')" - :label-width="formLabelWidth" - > - <el-input v-model="editForm.codeDesc" autocomplete="off" style="width:85%"></el-input> - </el-form-item> - <el-form-item - :label="$t('dataManage.domainManage.bsm')" - :label-width="formLabelWidth" - > - <el-input v-model="editForm.bsm" autocomplete="off" style="width:85%"></el-input> - </el-form-item> - <el-form-item - :label="$t('dataManage.domainManage.level')" - :label-width="formLabelWidth" - > - <el-input v-model="editForm.level" autocomplete="off" style="width:85%"></el-input> - </el-form-item> - <el-form-item - :label="$t('dataManage.domainManage.orderid')" - :label-width="formLabelWidth" - > - <el-input v-model="editForm.orderid" autocomplete="off" style="width:85%"></el-input> - </el-form-item> - <el-form-item - :label="$t('dataManage.domainManage.bak')" - :label-width="formLabelWidth" - > - <el-input v-model="editForm.bak" autocomplete="off" style="width:85%"></el-input> - </el-form-item> - </el-form> - </div> - <div v-if="behavior == '淇敼淇℃伅'" slot="footer" class="dialog-footer"> - <el-button size="small" @click="cancelEdit()">{{ + <el-form-item + :label="$t('dataManage.domainManage.domCode')" + :label-width="formLabelWidth" + > + <el-input + v-model="editForm.domCode" + autocomplete="off" + style="width:85%" + ></el-input> + </el-form-item> + <el-form-item + :label="$t('dataManage.domainManage.codeDesc')" + :label-width="formLabelWidth" + > + <el-input + v-model="editForm.codeDesc" + autocomplete="off" + style="width:85%" + ></el-input> + </el-form-item> + <el-form-item + :label="$t('dataManage.domainManage.bsm')" + :label-width="formLabelWidth" + > + <el-input + v-model="editForm.bsm" + autocomplete="off" + style="width:85%" + ></el-input> + </el-form-item> + <el-form-item + :label="$t('dataManage.domainManage.level')" + :label-width="formLabelWidth" + > + <el-input + v-model="editForm.level" + autocomplete="off" + style="width:85%" + ></el-input> + </el-form-item> + <el-form-item + :label="$t('dataManage.domainManage.orderid')" + :label-width="formLabelWidth" + > + <el-input + v-model="editForm.orderid" + autocomplete="off" + style="width:85%" + ></el-input> + </el-form-item> + <el-form-item + :label="$t('dataManage.domainManage.bak')" + :label-width="formLabelWidth" + > + <el-input + v-model="editForm.bak" + autocomplete="off" + style="width:85%" + ></el-input> + </el-form-item> + </el-form> + </div> + <div + v-if="behavior == '淇敼淇℃伅'" + slot="footer" + class="dialog-footer" + > + <el-button + size="small" + @click="cancelEdit()" + >{{ $t("common.reset") }}</el-button> <el-button @@ -294,11 +368,18 @@ type="info" @click="sendEdit('editForm')" v-loading.fullscreen.lock="fullscreenLoading" - >{{ $t("common.confirm") }}</el-button - > + >{{ $t("common.confirm") }}</el-button> </div> - <div v-else slot="footer" class="dialog-footer"> - <el-button type="info" size="small" @click="cancelAdd('editForm')">{{ + <div + v-else + slot="footer" + class="dialog-footer" + > + <el-button + type="info" + size="small" + @click="cancelAdd('editForm')" + >{{ $t("common.reset") }}</el-button> <el-button @@ -306,8 +387,7 @@ class="primary" @click="sendAdd('editForm')" v-loading.fullscreen.lock="fullscreenLoading" - >{{ $t("common.confirm") }}</el-button - > + >{{ $t("common.confirm") }}</el-button> </div> </el-dialog> </div> @@ -364,18 +444,7 @@ update: false, }, domainData: [ - { - val: "鍩虹鏁版嵁", - children: [], - }, - { - val: "涓氬姟鏁版嵁", - children: [], - }, - { - val: "鍏冩暟鎹�", - children: [], - }, + ], defaultProps: { children: "children", @@ -400,6 +469,9 @@ return data.val.indexOf(value) !== -1; }, async toggleTabs(data) { + if (data.children != null) { + return + } this.fullscreenLoading = true; this.listData.ns = data.ns; this.listData.tab = data.tab; @@ -442,24 +514,27 @@ }, getAllTabelData() { getDomainTabs().then((res) => { - let bdres = res.result.filter((item) => item.ns == "bd"); - let bsres = res.result.filter((item) => item.ns == "bs"); - let mdres = res.result.filter((item) => item.ns == "md"); - for (var i in bdres) { - // bdres[i].val = bdres[i].tabDesc + '(' + bdres[i].tab + ')'; - bdres[i].val = bdres[i].tabDesc; - } - for (var i in bsres) { - // bsres[i].val = bsres[i].tabDesc + '(' + bsres[i].tab + ')'; - bsres[i].val = bsres[i].tabDesc; - } - for (var i in mdres) { - // bsres[i].val = bsres[i].tabDesc + '(' + bsres[i].tab + ')'; - mdres[i].val = mdres[i].tabDesc; - } - this.domainData[0].children = bdres; - this.domainData[1].children = bsres; - this.domainData[2].children = mdres; + var val = res.result; + var std = []; + val.filter((item) => { + if (std.indexOf(item.bak) == -1) { + std.push(item.bak); + this.domainData.push( + { + val: item.bak, + children: [], + } + ) + } + }); + this.domainData.filter((item) => { + val.filter((res) => { + if (item.val === res.bak) { + res.val = res.tabDesc + item.children.push(res) + } + }) + }) }); }, handleSelectionChange(val) { @@ -588,7 +663,7 @@ this.editForm = {}; done(); }) - .catch((_) => {}); + .catch((_) => { }); }, // 鏌ョ湅鐣岄潰 showDetail(row) { @@ -682,7 +757,7 @@ watch: { pathId: { immediate: true, - handler(val) {}, + handler(val) { }, }, filterInput(val) { this.$refs.tree.filter(val); -- Gitblit v1.9.3