From 8c1a1064c6004865dbf66c1b2aed9fcf71bfbec2 Mon Sep 17 00:00:00 2001 From: whycwx <1272078254@qq.com> Date: 星期三, 24 十一月 2021 09:18:45 +0800 Subject: [PATCH] 修改 --- src/pages/alarmWork/js/workInfo/workInfo.js | 52 ++++- src/pages/alarmWork/workInfo.vue | 476 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 437 insertions(+), 91 deletions(-) diff --git a/src/pages/alarmWork/js/workInfo/workInfo.js b/src/pages/alarmWork/js/workInfo/workInfo.js index 91c9a9a..490bcb2 100644 --- a/src/pages/alarmWork/js/workInfo/workInfo.js +++ b/src/pages/alarmWork/js/workInfo/workInfo.js @@ -13,15 +13,52 @@ }); } /* -*鎺ュ彛鍔熻兘锛氭煡璇㈢珯鐐圭敤鎴� +*鎺ュ彛鍔熻兘锛氭煡璇㈠綋鍓嶇敤鎴风殑鎵�鏈夊寘鏈虹粍鍜屽搴旂敤鎴� *浼犲弬锛歿stationId:42010047} * */ -export const userList = function (data) { +export const groupAndUserListOfCurrentUser = function (data) { return axios({ method: 'GET', - url: '/BattGroupUser/userList', + url: 'baoJiGroupUser/groupAndUserListOfCurrentUser', params: data + }); +} +/* +*鎺ュ彛鍔熻兘锛氭煡璇㈡墍鏈夌珯鐐圭敤鎴� +*浼犲弬锛氭棤鍙� +* +*/ +export const groupAndUser = function (data) { + return axios({ + method: 'GET', + url: '/baoJiGroupUser/groupAndUser', + params: data + }); +} + +/* +*鎺ュ彛鍔熻兘锛氭煡璇㈠姩浣滃垪琛� +*浼犲弬锛歿status:5,type:1} +* +*/ +export const actionTypeList4Role = function (data) { + return axios({ + method: 'GET', + url: '/workflowAction/actionTypeList4Role', + params: data + }); +} +/* +*澶勭悊宸ュ崟鑺傜偣 +*浼犲弬锛歿status:5,type:1} +* +*/ +export const updateLink = function (data) { + return axios({ + method: 'PUT', + url: 'workflow/updateLink', + data: data }); } @@ -29,12 +66,3 @@ - -// 鐧诲綍 -export const login = function (data) { - return axios({ - method: 'PUT', - url: '/changeUser', - params: {userId:1023} - }); - } \ No newline at end of file diff --git a/src/pages/alarmWork/workInfo.vue b/src/pages/alarmWork/workInfo.vue index 3adb0bf..7a851cd 100644 --- a/src/pages/alarmWork/workInfo.vue +++ b/src/pages/alarmWork/workInfo.vue @@ -4,7 +4,7 @@ <el-row type="flex" class="row-bg" justify="space-between"> <el-col :span="6"><div class="grid-content bg-purple">宸ュ崟缂栧彿锛歿{ workInfo.orderId }}</div></el-col> <el-col :span="8"><div class="grid-content">宸ュ崟鐢熸垚鏃堕棿锛歿{ workInfo.createTime }}</div></el-col> - <el-col :span="6"><div class="grid-content bg-purple">褰撳墠鐘舵�侊細<span class="color_red">{{ workInfo.status }}</span></div></el-col> + <el-col :span="6"><div class="grid-content bg-purple">褰撳墠鐘舵�侊細<span class="color_red">{{ workInfo.statusName }}</span></div></el-col> </el-row> <div class="list_box"> <el-tabs type="border-card"> @@ -26,7 +26,7 @@ <!-- <p><span class="label_box">鍛婅闄勪欢锛�</span><a href="#" download>鏌愭煇鏂囦欢.txt</a></p> --> <!-- 澶勭悊鍒嗘淳鍥炲 --> <div class="change_box" v-if="tableData.length>0"> - <el-table :data="tableData" stripe style="width: 100%"> + <el-table ref="teble" :data="tableData" stripe style="width: 100%" @select="tebleselect"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="dealUserId" label="鍒嗘淳澶勭悊浜�"></el-table-column> <el-table-column prop="dealReason" label="澶勭悊鍥炲鍐呭" ></el-table-column> @@ -34,15 +34,15 @@ <el-table-column prop="createTime" label="鏃ユ湡"></el-table-column> <el-table-column prop="option" label="鎿嶄綔"> <template slot-scope="scope"> - <el-button size="mini" type="success">閫氳繃</el-button> - <el-button size="mini" type="info">椹冲洖</el-button> + <el-button size="mini" type="success" @click="listBtn(5,scope.row)">閫氳繃</el-button> + <el-button size="mini" type="info" @click="listBtn(4,scope.row)">椹冲洖</el-button> </template> </el-table-column> </el-table> </div> </div> - <div class="select_box"> + <div class="select_box" v-if="thisObj"> <p> <span class="label_box">澶勭悊鍔ㄤ綔:</span> <el-select v-model="value" placeholder="璇烽�夋嫨" @change="getSelectVal"> @@ -59,9 +59,9 @@ <!-- 杞淳 --> <div class="change_box" v-if="value==1"> <el-form ref="form2" :model="form2" label-width="120px"> - <el-form-item label="瑕佹眰瀹屾垚鏃堕棿锛�"> + <!-- <el-form-item label="瑕佹眰瀹屾垚鏃堕棿锛�"> <el-date-picker v-model="form2.date2" type="datetime" placeholder="閫夋嫨鏃ユ湡鏃堕棿" > </el-date-picker> - </el-form-item> + </el-form-item> --> <el-form-item label="杞淳澶勭悊浜猴細"> <el-input v-model="form2.user" placeholder="璇烽�夋嫨" readonly="" @click.native="getUserList()" style="width: 20%;"></el-input> </el-form-item> @@ -69,34 +69,17 @@ <el-input type="textarea" v-model="form2.desc" style="width: 40%;"></el-input> </el-form-item> <el-form-item > - <el-button size="mini" type="primary">鎻愪氦</el-button> + <el-button size="mini" type="primary" @click="submit">鎻愪氦</el-button> </el-form-item> </el-form> </div> - <!-- 鍒嗘淳 --> - <div class="change_box" v-if="value==3"> - <el-form ref="form3" :model="form3" label-width="120px"> - <el-form-item label="瑕佹眰瀹屾垚鏃堕棿锛�"> - <el-date-picker v-model="form3.date2" type="datetime" placeholder="閫夋嫨鏃ユ湡鏃堕棿" > </el-date-picker> - </el-form-item> - <el-form-item label="鍒嗘淳澶勭悊浜猴細"> - <el-input v-model="form3.user" placeholder="璇疯緭鍏�" readonly="" @click.native="getUserList()" style="width: 40%;"></el-input> - </el-form-item> - <el-form-item label="杞淳鎰忚锛�"> - <el-input type="textarea" v-model="form3.desc" style="width: 40%;"></el-input> - </el-form-item> - <el-form-item > - <el-button size="mini" type="primary">鎻愪氦</el-button> - </el-form-item> - </el-form> - </div> <!-- 绉讳氦 --> <div class="change_box" v-if="value==2"> <el-form ref="form4" :model="form4" label-width="120px"> - <el-form-item label="瑕佹眰瀹屾垚鏃堕棿锛�"> + <!-- <el-form-item label="瑕佹眰瀹屾垚鏃堕棿锛�"> <el-date-picker v-model="form4.date2" type="datetime" placeholder="閫夋嫨鏃ユ湡鏃堕棿" > </el-date-picker> - </el-form-item> + </el-form-item> --> <el-form-item label="绉讳氦澶勭悊缁勶細"> <el-input v-model="form4.user" placeholder="璇烽�夋嫨" readonly="" @click.native="getUserList()" style="width: 40%;"></el-input> </el-form-item> @@ -104,23 +87,40 @@ <el-input type="textarea" v-model="form4.desc" style="width: 40%;"></el-input> </el-form-item> <el-form-item > - <el-button size="mini" type="primary">鎻愪氦</el-button> + <el-button size="mini" type="primary" @click="submit">鎻愪氦</el-button> + </el-form-item> + </el-form> + </div> + <!-- 鍒嗘淳 --> + <div class="change_box" v-if="value==3"> + <el-form ref="form3" :model="form3" label-width="120px"> + <el-form-item label="瑕佹眰瀹屾垚鏃堕棿锛�"> + <el-date-picker v-model="form3.date2" value-format="yyyy-MM-dd HH:mm:ss" type="datetime" placeholder="閫夋嫨鏃ユ湡鏃堕棿" > </el-date-picker> + </el-form-item> + <el-form-item label="鍒嗘淳澶勭悊浜猴細"> + <el-input v-model="form3.user" placeholder="璇疯緭鍏�" readonly="" @click.native="getUserList()" style="width: 40%;"></el-input> + </el-form-item> + <el-form-item label="鍒嗘淳鎰忚锛�"> + <el-input type="textarea" v-model="form3.desc" style="width: 40%;"></el-input> + </el-form-item> + <el-form-item > + <el-button size="mini" type="primary" @click="submit">鎻愪氦</el-button> </el-form-item> </el-form> </div> <!-- 鍥炲 --> - <div class="change_box" v-if="value==5"> + <div class="change_box" v-if="value==6"> <el-form ref="form5" :model="form5" label-width="120px"> - <el-form-item label="澶勭悊鎰忚锛�"> + <el-form-item label="鍥炲鎰忚锛�"> <el-input type="textarea" v-model="form5.desc" style="width: 40%;"></el-input> </el-form-item> <el-form-item > - <el-button size="mini" type="primary">鎻愪氦</el-button> + <el-button size="mini" type="primary" @click="submit">鎻愪氦</el-button> </el-form-item> </el-form> </div> <!-- 澶勭悊骞跺綊妗� --> - <div class="change_box" v-if="value==6"> + <div class="change_box" v-if="value==7"> <el-form ref="form6" :model="form6" label-width="120px"> <el-form-item label="褰掓。鎰忚锛�"> <el-input type="textarea" v-model="form6.desc" style="width: 40%;"></el-input> @@ -286,7 +286,7 @@ <el-tab-pane label="娴佺▼鍥�">娴佺▼鍥�</el-tab-pane> </el-tabs> - <!-- <el-button size="mini" type="primary" @click="basicInfo">鏌ヨ</el-button> --> + <el-button size="mini" type="primary" @click="cc">鏌ヨ</el-button> </div> <!-- 鐢ㄦ埛鍒楄〃 --> <el-dialog @@ -300,24 +300,44 @@ show-checkbox @check="check" node-key="id" + ref="tree" :default-expanded-keys="expandedList" :props="defaultProps"> </el-tree> </div> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="ok()">纭� 瀹�</el-button> - <el-button @click="cancel()">鍙� 娑�</el-button> + <el-button @click="getCurrentNode()">鍙� 娑�</el-button> + </span> + </el-dialog> + <!-- 閫氳繃銆侀┏鍥炴剰瑙佹 --> + <el-dialog + :title="listBtnStatus==4?'椹冲洖鎰忚':'閫氳繃鎰忚'" + :visible.sync="dialog2" + width="30%" + center> + <div> + <el-input type="textarea" v-model="txtData" style="width: 100%;"></el-input> + </div> + <span slot="footer" class="dialog-footer"> + <el-button type="primary" @click="clearBtn(1)">纭� 瀹�</el-button> + <el-button @click="clearBtn(2)">鍙� 娑�</el-button> </span> </el-dialog> </div> </template> <script> -import { login,basicInfo , userList} from './js/workInfo/workInfo' +import { actionTypeList4Role,basicInfo , groupAndUserListOfCurrentUser,groupAndUser,updateLink} from './js/workInfo/workInfo' import {STATUS} from './js/const' export default { data(){ return { + listBtnStatus:"", + txtData:"", + thisObj:null, + listObj:null, dialog:false, + dialog2:false, expandedList:[], userCheckId:"", userCheckName:"", @@ -329,6 +349,7 @@ value:"", workInfo:{ status:0, + statusName:"", title:"", orderId:"", createTime:"", @@ -337,33 +358,35 @@ alarmLevel:"", countdown:"", stationId:"", + id:"", + type:"", }, numList:["涓�","浜�","涓�","鍥�","浜�","鍏�","涓�","鍏�","涔�","鍗�"], selectList:[ {value:1,label:"杞淳"}, - {value:3,label:"鍒嗘淳"}, {value:2,label:"绉讳氦"}, - {value:5,label:"鍥炲"}, - {value:6,label:"澶勭悊骞跺綊妗�"}, + {value:3,label:"鍒嗘淳"}, + {value:6,label:"鍥炲"}, + {value:7,label:"澶勭悊骞跺綊妗�"}, ], tableData:[], form2:{ - date1:"", + // date2:"", + desc:"", + user:"", + userId:"", + }, + form3:{ date2:"", desc:"", user:"", - }, - form3:{ - date1:"", - date2:"", - desc:"", - user:"" + userId:"", }, form4:{ - date1:"", - date2:"", + // date2:"", desc:"", - user:"" + user:"", + userId:"", }, form5:{ desc:"", @@ -381,28 +404,97 @@ this.basicInfo(); }, methods: { + // 閫氳繃銆侀┏鍥炴寜閽� + listBtn:function(val,row){ + console.log(row) + let self = this; + self.dialog2 = true; + self.listBtnStatus = val; + self.listObj = row; + }, + // 閫氳繃椹冲~鍐欐剰瑙佸脊绐楁搷浣� + clearBtn:function(value){ + let self = this; + if(value == 1){//纭 + if(self.txtData == ""){ + let txt = self.listBtnStatus == 4?"椹冲洖鎰忚!":"閫氳繃鎰忚!"; + self.$message({ + type: 'error', + message:'璇峰~鍐�' + txt + }); + return false; + } + let params = {}; + if(self.listBtnStatus == 5){//閫氳繃 + params={ + dealType:5, + id:self.workInfo.id, + replyContent:self.txtData + } + }else{//椹冲洖4 + params={ + dealType:4, + id:self.workInfo.id, + replyContent:self.txtData, + parentId:self.listObj.parentId, + dealUserId:self.listObj.dealUserId, + dealTaskReplyNum:self.listObj.dealTaskReplyNum, + mainId:self.listObj.mainId, + replyContent:self.txtData + } + } + self.updateLink(params); + console.log(params) + } + self.txtData = ""; + self.dialog2 = false; + }, + cc:function(){ + console.log(this.form3) + }, + // 閫変腑鍒楄〃鏃� + tebleselect:function(selection, row){ + console.log(selection, row) + let self = this; + if(selection.length>0){ + selection.forEach(item => { + if(item.id != row.id){ + self.$refs.teble.toggleRowSelection(item,false) + } + }); + self.thisObj = row; + }else{ + self.thisObj = null; + } + }, // 鑾峰彇澶勭悊鍔ㄤ綔閫夋嫨 getSelectVal:function(val){ console.log(val) console.log("val:" + this.value) }, + // 鑾峰彇閫変腑鐨勫垪琛� + getCurrentNode:function(){ + let self = this; + let data = self.$refs.tree.getCheckedNodes(); + console.log(data) + }, // 鑾峰彇鐢ㄦ埛鍒楄〃 getUserList:function(){ let self = this; - let params = { - stationId:self.workInfo.stationId - } - userList(params).then((res)=>{ + if(self.value == 3){//鍒嗘淳鏃舵煡璇㈠綋鍓嶇粍鎴愬憳 + groupAndUserListOfCurrentUser().then((res)=>{ let resdata = res.data; + console.log(resdata) if(resdata.code == 1){ + let rs = resdata.data[0]; let dataList = [ { - id:self.workInfo.stationId, - label:self.workInfo.stationName, + id:rs.baoJiGroupId, + label:rs.baoJiGroupName, children:[] } ]; - resdata.data.forEach(item => { + rs.userList.forEach(item => { let obj = { id:item.uid, label:item.uname @@ -416,6 +508,34 @@ }).catch((err)=>{ }) + }else{//闈炲垎娲炬椂鏌ヨ鎵�鏈夌粍鎴愬憳 + groupAndUser().then((res)=>{ + let resdata = res.data; + if(resdata.code ==1){ + let rs = resdata.data; + let userArr = []; + rs.forEach(item => { + let dataList = { + id:item.baoJiGroupId, + label:item.baoJiGroupName, + // children:[] + }; + // item.userList.forEach(list => { + // let obj = { + // id:list.uid, + // label:list.uname + // } + // dataList.children.push(obj); + // }); + userArr.push(dataList); + }); + self.userList = userArr; + self.dialog = true; + console.log(self.userList); + } + }) + } + }, // 鏍戝凡閫夋暟鎹� @@ -429,39 +549,194 @@ * halfCheckedNodes锛氬凡閫夋暟鎹墍灞炵粍鐨勮缁嗕俊鎭� *} */ + console.log(obj,data) let self = this; - if(obj.id!=self.workInfo.stationId){ - self.userCheckId = data.checkedKeys.join(","); - }else{ - self.userCheckId = data.checkedKeys.slice(1, data.checkedKeys.length).join(","); - } - let nameArr = []; - data.checkedNodes.forEach((item,i) => { - if(obj.id!=self.workInfo.stationId){ - nameArr.push(item.label); - }else{ - if(i>0){ - nameArr.push(item.label); - } - } + if(self.value == 3){ - }); - self.userCheckName = nameArr.join(","); - console.log(obj,data) - console.log(self.userCheckId,self.userCheckName) + if(obj.id!=self.workInfo.stationId && data.checkedKeys.length<self.userList[0].length){ + self.userCheckId = data.checkedKeys; + }else{ + self.userCheckId = data.checkedKeys.slice(1, data.checkedKeys.length); + } + console.log(data.checkedKeys,self.userList) + let nameArr = []; + data.checkedNodes.forEach((item,i) => { + if(obj.id!=self.workInfo.stationId && data.checkedKeys.length<self.userList[0].children.length){ + nameArr.push(item.label); + }else{ + if(i>0){ + nameArr.push(item.label); + } + } + + }); + self.userCheckName = nameArr.join(","); + // console.log(obj,data) + // console.log(self.userCheckId,self.userCheckName) + }else{ + self.userList.forEach(item => { + if(item.id != obj.id){ + self.$refs.tree.setChecked(item.id,false); + } + }); + } }, // 纭畾 ok:function(){ let self = this; - self.form2.user = self.userCheckName; + let data = self.$refs.tree.getCheckedNodes(); + console.log(data) + if(data.length >0){ + switch (self.value) { + case 1://杞淳 + self.form2.userId = self.$refs.tree.getCheckedNodes()[0].id; + self.form2.user = self.$refs.tree.getCheckedNodes()[0].label; + break; + case 3://鍒嗘淳 + + self.form3.user = self.userCheckName; + self.form3.userId = self.userCheckId; + console.log(self.form3.userId) + break; + case 2://绉讳氦 + self.form4.userId = self.$refs.tree.getCheckedNodes()[0].id; + self.form4.user = self.$refs.tree.getCheckedNodes()[0].label; + break; + + default: + break; + } + } self.dialog = false; }, // 鍙栨秷 cancel:function(){ let self = this; - self.userCheckName = ""; - self.form2.user = ""; + // self.userCheckName = ""; + // self.form2.user = ""; self.dialog = false; + }, + // 鎻愪氦 + submit:function(){ + let self = this; + let params = {}; + switch (self.value) { + case 1://杞淳 + let status = true; + for (const key in self.form2) { + if (self.form2[key] == "") { + status = false; + } + } + if(!status){ + self.$message({ + type: 'error', + message:'璇峰~鍐欏畬鏁寸殑琛ㄥ崟锛�' + }); + }else{ + params = { + dealReason:self.form2.desc, + dealType:1, + dealUserId:self.form2.userId, + id:self.workInfo.id, + mainId:self.thisObj.mainId, + // requiredFinishTime:self.form2.date2 + } + self.updateLink(params); + } + break; + case 3://鍒嗘淳 + let k = true; + for (const key in self.form3) { + if (self.form3[key] == "") { + k = false; + } + } + if(!k){ + self.$message({ + type: 'error', + message:'璇峰~鍐欏畬鏁寸殑琛ㄥ崟锛�' + }); + }else{ + params = { + dealReason:self.form3.desc, + dealType:3, + dealUserIdList:self.form3.userId, + id:self.workInfo.id, + mainId:self.thisObj.mainId, + requiredFinishTime:self.form3.date2 + } + self.updateLink(params); + } + break; + case 2://绉讳氦 + let y = true; + for (const key in self.form4) { + if (self.form4[key] == "") { + y = false; + } + } + if(!y){ + self.$message({ + type: 'error', + message:'璇峰~鍐欏畬鏁寸殑琛ㄥ崟锛�' + }); + }else{ + params = { + dealReason:self.form4.desc, + dealType:2, + dealUserId:self.form4.userId, + id:self.workInfo.id, + mainId:self.thisObj.mainId, + parentId:self.thisObj.parentId||0 + } + self.updateLink(params); + } + break; + case 6://鍥炲 + if(self.form5.desc == ""){ + self.$message({ + type: 'error', + message:'璇峰~鍐欏洖澶嶆剰瑙侊紒' + }); + }else{ + params = { + dealReason:self.form5.desc, + dealType:6, + dealTaskReplyNum:self.thisObj.dealTaskReplyNum || 0, + parentId:self.thisObj.parentId, + id:self.workInfo.id, + } + self.updateLink(params); + } + break; + case 7://褰掓。 + + break; + + default: + break; + } + + }, + // 鎻愪氦 + updateLink:function(data){ + let self = this; + updateLink(data).then(res=>{ + if(res.data.code == 1){ + self.$message({ + type: 'success', + message:res.data.msg + }); + self.intData(); + } + }) + }, + // 鍒濆鍖� + intData:function(){ + let self = this; + Object.assign(self.$data, self.$options.data()) + self.basicInfo(); }, // 鏌ヨ宸ュ崟鍩烘湰淇℃伅 basicInfo:function(){ @@ -471,13 +746,15 @@ basicInfo({mainId:31}).then((res)=>{ if(res.data.code == 1){ let resdata = res.data.data; - self.workInfo.status = STATUS[resdata.status]; + self.workInfo.status = resdata.status; + self.workInfo.statusName = STATUS[resdata.status]; self.workInfo.title = resdata.title;//鏍囬 self.workInfo.orderId = resdata.orderId;//宸ュ崟缂栧彿 self.workInfo.createTime = resdata.createTime;//宸ュ崟鐢熸垚鏃堕棿 self.workInfo.alarmTime = resdata.workflowAlarm.alarmTime;//鍛婅寮�濮嬫椂闂� self.workInfo.alarmLevel = resdata.workflowAlarm.alarmLevel;//鍛婅绛夌骇 - self.workInfo.taskDesc = resdata.taskDesc;//鍛婅鎻忚堪 + self.workInfo.taskDesc = resdata.taskDesc;//鍛婅鎻忚堪type + self.workInfo.type = resdata.type;//鍛婅鎻忚堪 console.log(resdata) // 鍊掕鏃� self.time = setInterval(function(){self.showTime()},1000); @@ -486,14 +763,50 @@ // 褰撳墠鍖呮満缁処D銆佸悕绉� self.workInfo.stationId = resdata.workflowAlarm.stationId; self.workInfo.stationName = resdata.workflowAlarm.stationName; - // self.time; + // id + self.workInfo.id = resdata.id; + let listArr = []; + if(resdata.linkList.length>0){ + resdata.linkList.forEach(item => { + if(item.status == 0 || item.status == 3 || item.status == 4 ){ + listArr.push(item); + } + }); + } + self.tableData = listArr; + // 鏌ヨ澶勭悊鍔ㄤ綔 + self.actionTypeList4Role(resdata.status,resdata.type); } }).catch((err)=>{ }) }, // 鏌ヨ澶勭悊鍔ㄤ綔 + actionTypeList4Role:function(status,type){ + let self = this; + let arr = [1,2,3,6,7]; + let arrName = ['杞淳','绉讳氦','鍒嗘淳','鍥炲','澶勭悊骞跺綊妗�'] + let data = { + status:status, + type:type + } + actionTypeList4Role(data).then((res)=>{ + if(res.data.code == 1){ + let resdata = res.data.data; + if(resdata.length>0){ + resdata.forEach(item => { + arr.forEach(element => { + if(item.actionType == element){ + } + }); + }); + } + console.log(res) + } + + }) + }, // 鍊掕鏃� checkTime:function (i){ if(i<10) @@ -529,6 +842,11 @@ } </script> <style scoped> +/* element */ +/deep/.has-gutter /deep/.el-checkbox{ + display:none !important +} +/* */ .main{ height: 100%; padding: 10px 15px; -- Gitblit v1.9.1