From 599859cbfeecf91c044ca3f5de238f997a00a425 Mon Sep 17 00:00:00 2001 From: 田源 <lastanimals@163.com> Date: 星期四, 21 三月 2024 11:39:28 +0800 Subject: [PATCH] 修改paramVOS字段名 --- Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue | 209 ++++++++++++++++++++ Source/ProjectWeb/src/views/base/uiDefineVO.js | 100 +++++----- Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue | 244 ++--------------------- 3 files changed, 275 insertions(+), 278 deletions(-) diff --git a/Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue b/Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue index eece340..1c26a42 100644 --- a/Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue +++ b/Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue @@ -5,8 +5,8 @@ <!--top灞曠ず琛ㄦ牸涓婃柟鍖哄煙 menu灞曠ず琛ㄦ牸鎿嶄綔鏍忓尯鍩� --> <el-button v-for="item in basicButtonList.top" v-if="LocationType === 'top'" - :key="item.oid" :icon="item.icon" - :type="item.paramVOS.buttonType || 'primary'" plain + :key="item.oid" :icon="item.paramVOS.webUiButtonIcon" + :type="item.paramVOS.webUiButtonType || 'primary'" plain size="small" @click="buttonClick(item)"> {{ item.name }} @@ -15,18 +15,21 @@ <el-button v-for="item in basicButtonList.menu" v-if="LocationType === 'menu'" :key="item.oid" - :icon="item.paramVOS.icon ? item.paramVOS.icon : (item.paramVOS.buttonMethods === 'edit' ? 'el-icon-edit' : (item.paramVOS.buttonMethods === 'delete' ? 'el-icon-delete' : ''))" - :type="item.paramVOS.buttonType || 'text'" plain + :icon="item.paramVOS.webUiButtonIcon ? item.paramVOS.webUiButtonIcon : (item.paramVOS.webUiButtonMethods === 'edit' ? 'el-icon-edit' : (item.paramVOS.webUiButtonMethods === 'delete' ? 'el-icon-delete' : ''))" + :type="item.paramVOS.webUiButtonType || 'text'" plain size="small" @click="buttonClick(item,scope)"> {{ item.name }} </el-button> + <!-- 琛ㄦ牸鍐呮寜閽搷浣滃璇濇琛ㄥ崟 --> + <dynamic-table-form ref="dynamicForm" :formList="formList" :title="formName" :visible.sync="visible" + style="display: none"></dynamic-table-form> </div> <div v-else-if="type === 'form'"> <el-button v-for="item in basicButtonList" :key="item.oid" - :icon="item.icon" - :type="(item.paramVOS.buttonType !== 'text' ? item.paramVOS.buttonType : 'primary') || 'primary'" + :icon="item.paramVOS.webUiButtonIcon" + :type="(item.paramVOS.webUiButtonType !== 'text' ? item.paramVOS.buttonType : 'primary') || 'primary'" plain size="small" @click="buttonClick(item)"> @@ -60,6 +63,167 @@ return { visible: false, formName: '', + // 琛ㄥ崟鏁版嵁 + formList: [ + { + comboxKey: null, + customClass: null, + data: null, + dateFormate: null, + defaultValue: "", + displayExtension: "", + extendAttrMap: null, + extendAttrString: null, + field: "name", + hidden: false, + keyAttr: true, + prefix: null, + readOnly: false, + referConfig: null, + required: true, + selectLibFlag: null, + showField: null, + suffix: '$', + text: "鍚嶇О", + tooltips: '鍚嶇О', + type: "text", + unique: false, + verify: "" + }, + { + comboxKey: null, + customClass: null, + data: null, + dateFormate: null, + defaultValue: "", + displayExtension: "", + extendAttrMap: null, + extendAttrString: null, + field: "code", + hidden: false, + keyAttr: false, + prefix: null, + readOnly: false, + referConfig: null, + required: false, + selectLibFlag: null, + showField: null, + suffix: null, + disabled: true, + text: "缂栫爜", + tooltips: null, + type: "text", + unique: false, + verify: "" + }, + { + comboxKey: "EnumReviewType", + customClass: null, + data: null, + dateFormate: null, + defaultValue: "department", + displayExtension: "", + extendAttrMap: null, + extendAttrString: null, + field: "reviewtype", + hidden: false, + keyAttr: false, + prefix: null, + readOnly: false, + referConfig: null, + required: false, + selectLibFlag: null, + showField: null, + suffix: null, + text: "绫诲瀷", + tooltips: null, + type: "combox", + unique: false, + verify: "", + dicData: [{ + label: '娴嬭瘯1', + value: 'department' + }, { + label: '娴嬭瘯2', + value: 'departments' + }] + }, + { + comboxKey: null, + customClass: null, + data: null, + dateFormate: null, + defaultValue: "", + displayExtension: "", + extendAttrMap: null, + extendAttrString: null, + field: "creator", + hidden: true, + keyAttr: false, + prefix: null, + readOnly: true, + referConfig: null, + required: false, + selectLibFlag: null, + showField: null, + suffix: null, + text: "鍒涘缓浜�", + tooltips: null, + type: "text", + unique: false, + verify: "" + }, + { + comboxKey: null, + customClass: null, + data: null, + dateFormate: "yyyy-MM-dd HH:mm:ss", + defaultValue: "", + displayExtension: "", + extendAttrMap: null, + extendAttrString: null, + field: "createtime", + hidden: true, + keyAttr: false, + prefix: null, + readOnly: false, + referConfig: null, + required: false, + selectLibFlag: null, + showField: null, + suffix: null, + text: "鍒涘缓鏃堕棿", + tooltips: null, + type: "datetime", + unique: false, + verify: "" + }, + { + comboxKey: null, + customClass: null, + data: null, + dateFormate: null, + defaultValue: "", + displayExtension: "", + extendAttrMap: null, + extendAttrString: null, + field: "content", + hidden: false, + keyAttr: false, + prefix: null, + readOnly: false, + referConfig: null, + required: false, + selectLibFlag: null, + showField: null, + suffix: null, + text: "澶囨敞", + tooltips: null, + type: "textarea", + unique: false, + verify: "" + }, + ], } }, computed: { @@ -73,8 +237,8 @@ } else if (this.type === 'table') { - const top = basicColumn.filter(item => item.paramVOS.location === 'top' || func.isEmpty(item.paramVOS.location)); // 杩囨护鍑烘潵琛ㄦ牸涓婇潰鍖哄煙灞曠ず鐨勬寜閽� - const menu = basicColumn.filter(item => item.paramVOS.location === 'menu'); // 杩囨护鍑烘潵鎿嶄綔鏍忓睍绀虹殑鎸夐挳 + const top = basicColumn.filter(item => item.paramVOS.webUiButtonLocation === 'top' || func.isEmpty(item.paramVOS.webUiButtonLocation)); // 杩囨护鍑烘潵琛ㄦ牸涓婇潰鍖哄煙灞曠ず鐨勬寜閽� + const menu = basicColumn.filter(item => item.paramVOS.webUiButtonLocation === 'menu'); // 杩囨护鍑烘潵鎿嶄綔鏍忓睍绀虹殑鎸夐挳 return { top: top, @@ -85,7 +249,34 @@ }, methods: { buttonClick(item) { - this.$emit('buttonClick', this.scope, item) + this.formName = item.name; + + function handleAdd() { + this.visible = true; + } + + function handleEdit() { + this.visible = true; + this.$refs.dynamicForm.form = this.scope.row; + } + + function handleDelete() { + this.$message.success('鍒犻櫎鎴愬姛锛�'); + } + + const methodHandlers = { + add: handleAdd.bind(this), + edit: handleEdit.bind(this), + delete: handleDelete.bind(this), + }; + + const method = item.paramVOS.webUiButtonMethods; + const handler = methodHandlers[method]; + if (handler) { + handler(); + } else { + this.$message.error('璇烽噸鏂伴厤缃寜閽紒') + } } } } diff --git a/Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue b/Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue index bb99f2b..2ac2f71 100644 --- a/Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue +++ b/Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue @@ -1,23 +1,22 @@ <template> - <div class="UI-dynamic" :id="'UI-dynamic-'+areasName+componentVO.oid"> - <avue-crud v-model="form" - :data="tableList" - :option="option" - :page.sync="page" - :table-loading="loading"> - <!--top鍖哄煙鎸夐挳--> - <template slot="menuLeft" slot-scope="scope"> - <dynamic-button LocationType="top" type="table":butttonList="componentVO.buttons" @buttonClick="buttonClick" ></dynamic-button> - </template> + <div :id="'UI-dynamic-'+areasName+componentVO.oid" class="UI-dynamic"> + <div> + <avue-crud v-model="form" + :data="tableList" + :option="option" + :page.sync="page" + :table-loading="loading"> + <!--top鍖哄煙鎸夐挳--> + <template slot="menuLeft" slot-scope="scope"> + <dynamic-button :butttonList="componentVO.buttons" LocationType="top" type="table"></dynamic-button> + </template> - <!--menu鍖哄煙鎸夐挳--> - <template slot="menu" slot-scope="scope"> - <dynamic-button :scope="scope" LocationType="menu" type="table":butttonList="componentVO.buttons" @buttonClick="buttonClick" ></dynamic-button> - </template> - </avue-crud> - <!-- 琛ㄦ牸鍐呮寜閽搷浣滃璇濇琛ㄥ崟 --> - <dynamic-table-form ref="dynamicForm" :formList="formList" :title="formName" :visible.sync="visible" - style="display: none"></dynamic-table-form> + <!--menu鍖哄煙鎸夐挳--> + <template slot="menu" slot-scope="scope"> + <dynamic-button :butttonList="componentVO.buttons" :scope="scope" LocationType="menu" type="table"></dynamic-button> + </template> + </avue-crud> + </div> </div> </template> @@ -49,12 +48,10 @@ }, data() { return { - clientHeight:0, - parentHeight:'100%',//褰撳墠缁勪欢鏍硅妭鐐瑰厓绱犻珮搴� + clientHeight: 0, + parentHeight: '100%',//褰撳墠缁勪欢鏍硅妭鐐瑰厓绱犻珮搴� form: {}, - formName: '', loading: false, - visible: false, page: { pageSize: 10, currentPage: 1, @@ -455,167 +452,6 @@ ts: "2022-02-18 14:35:53.177" }, ], - // 琛ㄥ崟鏁版嵁 - formList: [ - { - comboxKey: null, - customClass: null, - data: null, - dateFormate: null, - defaultValue: "", - displayExtension: "", - extendAttrMap: null, - extendAttrString: null, - field: "name", - hidden: false, - keyAttr: true, - prefix: null, - readOnly: false, - referConfig: null, - required: true, - selectLibFlag: null, - showField: null, - suffix: '$', - text: "鍚嶇О", - tooltips: '鍚嶇О', - type: "text", - unique: false, - verify: "" - }, - { - comboxKey: null, - customClass: null, - data: null, - dateFormate: null, - defaultValue: "", - displayExtension: "", - extendAttrMap: null, - extendAttrString: null, - field: "code", - hidden: false, - keyAttr: false, - prefix: null, - readOnly: false, - referConfig: null, - required: false, - selectLibFlag: null, - showField: null, - suffix: null, - disabled:true, - text: "缂栫爜", - tooltips: null, - type: "text", - unique: false, - verify: "" - }, - { - comboxKey: "EnumReviewType", - customClass: null, - data: null, - dateFormate: null, - defaultValue: "department", - displayExtension: "", - extendAttrMap: null, - extendAttrString: null, - field: "reviewtype", - hidden: false, - keyAttr: false, - prefix: null, - readOnly: false, - referConfig: null, - required: false, - selectLibFlag: null, - showField: null, - suffix: null, - text: "绫诲瀷", - tooltips: null, - type: "combox", - unique: false, - verify: "", - dicData: [{ - label: '娴嬭瘯1', - value: 'department' - }, { - label: '娴嬭瘯2', - value: 'departments' - }] - }, - { - comboxKey: null, - customClass: null, - data: null, - dateFormate: null, - defaultValue: "", - displayExtension: "", - extendAttrMap: null, - extendAttrString: null, - field: "creator", - hidden: true, - keyAttr: false, - prefix: null, - readOnly: true, - referConfig: null, - required: false, - selectLibFlag: null, - showField: null, - suffix: null, - text: "鍒涘缓浜�", - tooltips: null, - type: "text", - unique: false, - verify: "" - }, - { - comboxKey: null, - customClass: null, - data: null, - dateFormate: "yyyy-MM-dd HH:mm:ss", - defaultValue: "", - displayExtension: "", - extendAttrMap: null, - extendAttrString: null, - field: "createtime", - hidden: true, - keyAttr: false, - prefix: null, - readOnly: false, - referConfig: null, - required: false, - selectLibFlag: null, - showField: null, - suffix: null, - text: "鍒涘缓鏃堕棿", - tooltips: null, - type: "datetime", - unique: false, - verify: "" - }, - { - comboxKey: null, - customClass: null, - data: null, - dateFormate: null, - defaultValue: "", - displayExtension: "", - extendAttrMap: null, - extendAttrString: null, - field: "content", - hidden: false, - keyAttr: false, - prefix: null, - readOnly: false, - referConfig: null, - required: false, - selectLibFlag: null, - showField: null, - suffix: null, - text: "澶囨敞", - tooltips: null, - type: "textarea", - unique: false, - verify: "" - }, - ], } }, computed: { @@ -625,6 +461,7 @@ addBtn: false, editBtn: false, delBtn: false, + selection:true, height: this.parentHeight, calcHeight: 15, indexFixed: false, @@ -648,52 +485,21 @@ }); }, }, - watch:{ + watch: { clientHeight: { handler(newval) { - if(newval>50){ + if (newval > 50) { //鐖跺厓绱犻珮搴�-鎸夐挳楂樺害-鍒嗛〉楂樺害 - this.parentHeight=this.$el.clientHeight-this.$children[0].$children[1].$children[0].$el.clientHeight-this.$children[0].$children[2].$el.clientHeight-5; + this.parentHeight = this.$el.clientHeight - this.$children[0].$children[1].$children[0].$el.clientHeight - this.$children[0].$children[2].$el.clientHeight - 5; console.log(this.parentHeight) } } }, }, mounted() { - this.clientHeight=this.$el.clientHeight; + this.clientHeight = this.$el.clientHeight; }, - methods: { - buttonClick(scope, item) { - this.formName = item.name; - - function handleAdd() { - this.visible = true; - } - - function handleEdit() { - this.visible = true; - this.$refs.dynamicForm.form = scope.row; - } - - function handleDelete() { - this.$message.success('鍒犻櫎鎴愬姛锛�'); - } - - const methodHandlers = { - add: handleAdd.bind(this), - edit: handleEdit.bind(this), - delete: handleDelete.bind(this), - }; - - const method = item.paramVOS.buttonMethods; - const handler = methodHandlers[method]; - if (handler) { - handler(); - } else { - this.$message.error('璇烽噸鏂伴厤缃寜閽紒') - } - } - } + methods: {} } </script> diff --git a/Source/ProjectWeb/src/views/base/uiDefineVO.js b/Source/ProjectWeb/src/views/base/uiDefineVO.js index f7d065e..86d7387 100644 --- a/Source/ProjectWeb/src/views/base/uiDefineVO.js +++ b/Source/ProjectWeb/src/views/base/uiDefineVO.js @@ -45,9 +45,9 @@ "oid": "E20C314B-E741-FBE0-534A-D68E9C0D8E2C", "orderNum": 6, "paramVOS": { - 'location': 'top', - 'buttonType': 'primary', - 'buttonMethods': 'refresh' + 'webUiButtonLocation': 'top', + 'webUiButtonType': 'primary', + 'webUiButtonMethods': 'refresh' }, "pkComponent": "2D6D571B-BB6E-677D-9764-191BC5D5D3F1", "pkParentOid": "", @@ -955,9 +955,9 @@ "owner": "true", "context": "CreateAuditQuestionDocume", "type": "document", - 'location': 'edit', - 'buttonMethods': 'edit', - 'buttonType':'text' + 'webUiButtonLocation': 'edit', + 'webUiButtonMethods': 'edit', + 'webUiButtonType':'text' }, "pkComponent": "E00C3C31-D27F-E3AC-6C2B-1882EE8B6FEE", "pkParentOid": "", @@ -997,9 +997,9 @@ "orderNum": 2, "paramVOS": { "owner": "true", - 'location': 'menu', - 'buttonType': 'text', - 'buttonMethods': 'delete' + 'webUiButtonLocation': 'menu', + 'webUiButtonType': 'text', + 'webUiButtonMethods': 'delete' }, "pkComponent": "E00C3C31-D27F-E3AC-6C2B-1882EE8B6FEE", "pkParentOid": "", @@ -1038,9 +1038,9 @@ "oid": "A860B3E6-8FA5-92AE-8D8A-A2AE5CC552F4", "orderNum": 3, "paramVOS": { - 'location': 'top', - 'buttonType': 'primary', - 'buttonMethods': 'refresh' + 'webUiButtonLocation': 'top', + 'webUiButtonType': 'primary', + 'webUiButtonMethods': 'refresh' }, "pkComponent": "E00C3C31-D27F-E3AC-6C2B-1882EE8B6FEE", "pkParentOid": "", @@ -1557,9 +1557,9 @@ "form": "CreateDocument", "type": "document", "initvalue": "doctype=9;processreviewoid=root.${oid}", - 'location': 'top', - 'buttonType': 'primary', - 'buttonMethods': 'add' + 'webUiButtonLocation': 'top', + 'webUiButtonType': 'primary', + 'webUiButtonMethods': 'add' }, "pkComponent": "8FA7A8BD-5063-B118-D4FC-E5233404D182", "pkParentOid": "", @@ -1600,8 +1600,8 @@ "paramVOS": { "form": "CreateDocument", "checkNotOperation": "${lcstatus}=Editing", - 'location': 'menu', - 'buttonMethods': 'edit' + 'webUiButtonLocation': 'menu', + 'webUiButtonMethods': 'edit' }, "pkComponent": "8FA7A8BD-5063-B118-D4FC-E5233404D182", "pkParentOid": "", @@ -1642,9 +1642,9 @@ "paramVOS": { "owner": "true", "checkNotOperation": "${lcstatus}=Editing", - 'location': 'menu', - 'buttonType': 'text', - 'buttonMethods': 'delete' + 'webUiButtonLocation': 'menu', + 'webUiButtonType': 'text', + 'webUiButtonMethods': 'delete' }, "pkComponent": "8FA7A8BD-5063-B118-D4FC-E5233404D182", "pkParentOid": "", @@ -1686,8 +1686,8 @@ "owner": "true", "forsourcedata": "false", "state": "Editing", - 'location': 'top', - 'buttonMethods': 'upload' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'upload' }, "pkComponent": "8FA7A8BD-5063-B118-D4FC-E5233404D182", "pkParentOid": "", @@ -1729,8 +1729,8 @@ "owner": "true", "flowtemplates": "宸ヨ壓鏂囨。瀹$娴佺▼", "type": "document", - 'location': 'top', - 'buttonMethods': 'launchworkflow' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'launchworkflow' }, "pkComponent": "8FA7A8BD-5063-B118-D4FC-E5233404D182", "pkParentOid": "", @@ -1769,8 +1769,8 @@ "oid": "110B50FD-67F2-8EA2-0400-D25D591218BA", "orderNum": 6, "paramVOS": { - 'location': 'top', - 'buttonMethods': 'refresh' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'refresh' }, "pkComponent": "8FA7A8BD-5063-B118-D4FC-E5233404D182", "pkParentOid": "", @@ -2487,9 +2487,9 @@ "orderNum": 2, "paramVOS": { "setpath": "true", - 'location': 'top', - 'buttonType': 'primary', - 'buttonMethods': 'download' + 'webUiButtonLocation': 'top', + 'webUiButtonType': 'primary', + 'webUiButtonMethods': 'download' }, "pkComponent": "F6380995-A148-5EA4-46B8-65168D9F187C", "pkParentOid": "", @@ -2528,9 +2528,9 @@ "oid": "2D6CF3C0-8E18-CEED-0C04-A50628626D7D", "orderNum": 4, "paramVOS": { - 'location': 'top', - 'buttonType': 'primary', - 'buttonMethods': 'refresh' + 'webUiButtonLocation': 'top', + 'webUiButtonType': 'primary', + 'webUiButtonMethods': 'refresh' }, "pkComponent": "F6380995-A148-5EA4-46B8-65168D9F187C", "pkParentOid": "", @@ -3051,8 +3051,8 @@ "paramVOS": { "state": "Editing", "checkout": "me;null", - 'location': 'top', - 'buttonMethods': 'upload' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'upload' }, "pkComponent": "A8572D5B-444E-C223-D5C7-7B02698852DA", "pkParentOid": "", @@ -3092,8 +3092,8 @@ "orderNum": 2, "paramVOS": { "setpath": "true", - 'location': 'top', - 'buttonMethods': 'download', + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'download', }, "pkComponent": "A8572D5B-444E-C223-D5C7-7B02698852DA", "pkParentOid": "", @@ -3135,8 +3135,8 @@ "owner": "true", "state": "Editing", "checkout": "me;null", - 'location': 'menu', - 'buttonMethods': 'delete' + 'webUiButtonLocation': 'menu', + 'webUiButtonMethods': 'delete' }, "pkComponent": "A8572D5B-444E-C223-D5C7-7B02698852DA", "pkParentOid": "", @@ -3175,8 +3175,8 @@ "oid": "E9119347-26C4-3BE8-2EA2-B4FCC54120CF", "orderNum": 4, "paramVOS": { - 'location': 'top', - 'buttonMethods': 'refresh' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'refresh' }, "pkComponent": "A8572D5B-444E-C223-D5C7-7B02698852DA", "pkParentOid": "", @@ -4087,8 +4087,8 @@ "form": "createAuditTask_web", "state": "Waiting", "type": "audittask", - 'location': 'top', - 'buttonMethods': 'add' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'add' }, "pkComponent": "8D269B20-03E4-A9B0-7D06-4BE074EEF4DD", "pkParentOid": "", @@ -4127,8 +4127,8 @@ "oid": "1E72BCA6-4FB2-0BC8-BE99-F6EDC43CCA10", "orderNum": 2, "paramVOS": { - 'location': 'top', - 'buttonMethods': 'conductinternalreview' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'conductinternalreview' }, "pkComponent": "8D269B20-03E4-A9B0-7D06-4BE074EEF4DD", "pkParentOid": "", @@ -4170,8 +4170,8 @@ "context": "CreateAuditQuestionDocume", "type": "document", "initvalue": "processreviewoid=${oid};doctype=8", - 'location': 'top', - 'buttonMethods': 'add' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'add' }, "pkComponent": "8D269B20-03E4-A9B0-7D06-4BE074EEF4DD", "pkParentOid": "", @@ -4212,8 +4212,8 @@ "paramVOS": { "form": "CreateAuditQuestionDocument", "type": "document", - 'location': 'top', - 'buttonMethods': 'opinionsummary' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'opinionsummary' }, "pkComponent": "8D269B20-03E4-A9B0-7D06-4BE074EEF4DD", "pkParentOid": "", @@ -4252,8 +4252,8 @@ "oid": "F52BE746-4D0E-9E00-1D5E-E3729DEEE1FA", "orderNum": 9, "paramVOS": { - 'location': 'top', - 'buttonMethods': 'refresh' + 'webUiButtonLocation': 'top', + 'webUiButtonMethods': 'refresh' }, "pkComponent": "8D269B20-03E4-A9B0-7D06-4BE074EEF4DD", "pkParentOid": "", -- Gitblit v1.9.3