From c59ed01f610a871f1db2869aaf08a991dddb600f Mon Sep 17 00:00:00 2001
From: loulijun2021 <1694218219@qq.com>
Date: 星期二, 01 八月 2023 16:14:24 +0800
Subject: [PATCH] 1.基础设置、工单管理、生产执行、统计报表菜单新增
---
src/views/basicSettings/roleList.vue | 695 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 695 insertions(+), 0 deletions(-)
diff --git a/src/views/basicSettings/roleList.vue b/src/views/basicSettings/roleList.vue
new file mode 100644
index 0000000..89635a6
--- /dev/null
+++ b/src/views/basicSettings/roleList.vue
@@ -0,0 +1,695 @@
+<template>
+ <div>
+ <div class="body" :style="{height:mainHeight+'px'}">
+ <div class="bodyTopButtonGroup" style="justify-content: space-between">
+ <el-button v-waves type="primary" icon="el-icon-circle-plus-outline">鏂板</el-button>
+ <el-button v-waves icon="el-icon-download">瀵煎叆</el-button>
+ </div>
+
+ <div class="bodyTopFormGroup">
+ <el-form
+ ref="form"
+ :model="form"
+ label-width="100px"
+ inline
+ style="display: flex;"
+ >
+ <div class="elForm">
+ <el-form-item label="姣嶄欢缂栫爜" style=" display: flex;">
+ <el-input v-model="form.OrgCode" placeholder="璇疯緭鍏�" style="width: 200px" />
+ </el-form-item>
+ <el-form-item label="姣嶄欢鍚嶇О" style=" display: flex;">
+ <el-input v-model="form.OrgName" placeholder="璇疯緭鍏�" style="width: 200px" />
+ </el-form-item>
+ <el-form-item label="姣嶄欢瑙勬牸" style=" display: flex;">
+ <el-input v-model="form.OrgName" placeholder="璇疯緭鍏�" style="width: 200px" />
+ </el-form-item>
+
+ <el-form-item label="鐗堟湰缂栧彿" style=" display: flex;">
+ <el-input v-model="form.OrgName" placeholder="璇疯緭鍏�" style="width: 200px" />
+ </el-form-item>
+ <el-form-item v-show="isExpandForm" label="鍒涘缓浜哄憳" style=" display: flex;">
+ <el-input v-model="form.UserName" style="width: 200px" placeholder="璇疯緭鍏�" />
+ </el-form-item>
+ <el-form-item v-show="isExpandForm" label="鍒涘缓鏃ユ湡" style=" display: flex;">
+ <el-date-picker
+ v-model="form.createdate"
+ style="width: 200px"
+ type="date"
+ placeholder="閫夋嫨鏃ユ湡"
+ />
+ </el-form-item>
+ </div>
+ <div
+ class="bodySearchReset"
+ :style="{marginLeft:$store.state.app.sidebar.opened? $store.state.settings.menuIsHorizontal?'15%':'3%':'10%'}"
+ >
+ <el-button v-waves type="primary" icon="el-icon-search">鏌ヨ</el-button>
+ <el-button v-waves type="info" icon="el-icon-refresh">閲嶇疆</el-button>
+ </div>
+ </el-form>
+ <div
+ class="bodyTopFormExpand"
+ >
+ <svg-icon
+ v-show="mouseHoverType==='mouseout'"
+ style="cursor: pointer"
+ :icon-class="!isExpandForm?'doubleDown3':'doubleUp3'"
+ @mouseenter="mouseHoverType=$event.type"
+ />
+ <svg-icon
+ v-show="mouseHoverType==='mouseenter'"
+ style="cursor: pointer"
+ :icon-class="!isExpandForm?'doubleDown':'doubleUp'"
+ @click="isExpandForm=!isExpandForm"
+ @mouseout="mouseHoverType=$event.type"
+ />
+ </div>
+ </div>
+
+ <div
+ class="elTableDiv"
+ >
+
+ <div style="width: 300px;">
+ <el-tree
+ ref="treeLeftRef"
+ style="padding: 10px;"
+ :style="{height:isExpandForm?tableHeight:(tableHeight+105)+'px'}"
+ :data="treeLeft"
+ node-key="code"
+ highlight-current
+ :props="defaultPropsLeft"
+ :default-expand-all="true"
+ @node-click="treeLeftNodeClick"
+ />
+ </div>
+
+ <div
+ style="margin-left: 15px;width:100%;"
+ >
+ <el-tabs v-model="activeName" type="border-card">
+ <el-tab-pane label="PC绔�" name="PC绔�">
+ <div style="display: flex;">
+
+ <div
+ ref="scrollLeft"
+ style="border-right: 1px solid rgba(0,0,0,0.2);width: 200px;
+ overflow-y: auto;overflow-x:hidden;"
+ :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}"
+ @scroll="scrollLeftScroll()"
+ @mouseover="changeScrollLeftFlag('left')"
+ >
+ <div style=" ">
+ <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> 鑿滃崟鏉冮檺
+ </div>
+ <!-- :style="{height:isExpandForm?tableHeight:(tableHeight+15)+'px',}"-->
+ <el-tree
+ ref="treeCenterRef"
+ style="padding-top: 10px;width: 199px;"
+ :data="treeCenter"
+ highlight-current
+ :props="defaultPropsCenter"
+ show-checkbox
+ node-key="code"
+ :default-expand-all="true"
+ @check-change="handleTreeCenterCheckChange"
+ @check="handleTreeCenterCheck"
+ @node-click="getLeftTreeNode"
+ />
+ </div>
+
+ <div
+ ref="scrollCenter"
+ style="border-right: 1px solid rgba(0,0,0,0.2);width: 600px;padding-left: 10px;overflow-y: auto"
+ :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}"
+ @scroll="scrollCenterScroll()"
+ @mouseover="changeScrollLeftFlag('center')"
+ >
+ <div style=" ">
+ <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> 鎸夐挳鏉冮檺
+ </div>
+
+ <el-checkbox
+ v-model="buttonIsChecked"
+ style="height: 26px;display:flex;align-items: center;margin-top:10px;width:200px"
+ @change="val=>handleCheckAllChange(val,'button')"
+ >鍏ㄩ��
+ </el-checkbox>
+
+ <div v-if="treeCenter.length>0">
+ <div v-for="item in treeCenter[0].children" :key="item.code">
+ <div
+ v-if="item.display"
+ style="margin-left: 40px;height:26px;display: flex;"
+ />
+
+ <el-checkbox-group
+ v-for="it in item.children"
+ v-if="item.expanded"
+ :key="it.code"
+ v-model="it.checkedButton"
+ style="margin-left: 40px;height:26px;display: flex"
+ @change="val=>handleCheckedButtonChange(val,it.code)"
+ >
+
+ <el-checkbox
+ v-for="i in it.itemButton"
+ :key="i"
+ :label="i"
+ style="display:flex;align-items: center"
+ />
+ </el-checkbox-group>
+ </div>
+
+ </div>
+
+ </div>
+
+ <div
+ ref="scrollRight"
+ style="width: 360px;padding-left: 10px;overflow-y: auto"
+ :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}"
+ @scroll="scrollRightScroll()"
+ @mouseover="changeScrollLeftFlag('right')"
+ >
+ <div style=" ">
+ <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> 鏁版嵁鏉冮檺
+ </div>
+
+ <el-checkbox
+ v-model="dataIsChecked"
+ style="height: 26px;display:flex;align-items: center;margin-top:10px;width:200px"
+ @change="val=>handleCheckAllChange(val,'data')"
+ >鍏ㄩ��
+ </el-checkbox>
+
+ <div v-if="treeCenter.length>0">
+ <div v-for="item in treeCenter[0].children" :key="item.code">
+ <div
+ v-if="item.display"
+ style="margin-left: 40px;height:26px;display: flex;"
+ />
+
+ <el-radio-group
+ v-for="it in item.children"
+ v-if="item.expanded"
+ :key="it.code"
+ v-model="it.checkedData"
+ style="margin-left: 40px;height:26px;display: flex"
+ @change="val=>handleCheckedDataChange(val,it.code)"
+ >
+ <el-radio
+ v-for="i in it.itemData"
+ :key="i"
+ style="display:flex;align-items: center"
+ :label="i"
+ />
+ </el-radio-group>
+ </div>
+
+ </div>
+
+ </div>
+
+ </div>
+ </el-tab-pane>
+ <el-tab-pane label="APP绔�" name="APP绔�">澶уぇ</el-tab-pane>
+ <el-tab-pane label="宸ユ帶绔�" name="宸ユ帶绔�">宸ユ帶绔�</el-tab-pane>
+ </el-tabs>
+
+ </div>
+
+ </div>
+
+ </div>
+
+ </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination'
+import ImportPicker from '@/components/ImportPicker'
+import elDragDialog from '@/directive/el-drag-dialog'
+import waves from '@/directive/waves'
+import {
+ RolePermissionSearchRole,
+ RolePermissionSearchRoleMenu,
+ RolePermissionSearchRoleMenuButton
+} from '@/api/basicSettings'
+import arrayToTree from 'array-to-tree'
+
+export default {
+ name: 'Zzjg',
+ components: {
+ Pagination, ImportPicker
+ },
+ directives: { elDragDialog, waves },
+ data() {
+ return {
+ mouseHoverType: 'mouseout',
+ isExpandForm: false,
+ mainHeight: 0,
+ tableHeight: 0,
+ form: {
+ OrgCode: '', // 缁勭粐鏋舵瀯浠g爜
+ OrgName: '', // 缁勭粐鏋舵瀯鍚嶇О
+ OrgType: '', // 缁勭粐绫诲瀷
+ UserName: '', // 鍒涘缓浜哄憳
+ createdate: '',
+ prop: 'lm_date', // 鎺掑簭瀛楁
+ order: 'desc', // 鎺掑簭瀛楁
+ page: 1, // 绗嚑椤�
+ rows: 20 // 姣忛〉澶氬皯鏉�
+ },
+ treeLeft: [],
+ treeCenter: [],
+ defaultPropsLeft: {
+ children: 'roles',
+ label: 'name'
+ },
+ defaultPropsCenter: {
+ children: 'children',
+ label: 'name'
+ },
+ activeName: 'PC绔�',
+
+ buttonIsChecked: false,
+ dataIsChecked: false,
+
+ menuCheckedCodeArr: [], // 鑿滃崟鏉冮檺鏁扮粍閫変腑鐨�
+
+ allButtonData: [], // 鎵�鏈夌殑鎸夐挳鍔犳潈闄�
+
+ isScroll: 'left'
+
+ }
+ },
+
+ created() {
+ this.getRolePermissionSearchRole()
+ },
+ mounted() {
+ window.addEventListener('resize', this.getHeight)
+ this.getHeight()
+ },
+ methods: {
+
+ // 鑾峰彇瑙掕壊鏉冮檺鏌ヨ瑙掕壊
+ async getRolePermissionSearchRole() {
+ const { data: res } = await RolePermissionSearchRole()
+ this.treeLeft = res
+ if (res.length > 0) {
+ this.$nextTick(() => { // 榛樿閫変腑绗竴涓�
+ this.$refs.treeLeftRef.setCurrentKey(res[0].roles[0].code) // 榛樿閫変腑鑺傜偣绗竴涓�
+ })
+ await this.getRolePermissionSearchRoleMenuButton(res[0].roles[0].code)
+ await this.getRolePermissionSearchRoleMenu(res[0].roles[0].code)
+ } else {
+ this.$notify.error('璇峰厛寤虹浉瀵瑰簲鐨勮鑹诧紒')
+ }
+ },
+ // 鑾峰彇鑿滃崟鏉冮檺瀵瑰簲鐨勬寜閽�
+ async getRolePermissionSearchRoleMenuButton(rolecode) {
+ const { data: res } = await RolePermissionSearchRoleMenuButton({ rolecode })
+ this.allButtonData = res
+ },
+ // 鑾峰彇鑿滃崟鏉冮檺
+ async getRolePermissionSearchRoleMenu(rolecode) {
+ const { data: res } = await RolePermissionSearchRoleMenu({ rolecode, type: 'PC' })
+
+ // 鎷垮埌鏁扮粍list杞崲鎴愭爲褰ree
+ const result = arrayToTree(res, {
+ parentProperty: 'parentid',
+ customID: 'code',
+ childrenProperty: 'children'
+ })
+
+ this.menuCheckedCodeArr = []
+
+ // console.log(this.allButtonData, 213)
+ result.forEach(item => {
+ if (item.children && item.children.length) {
+ item.children.forEach(it => {
+ // 鎸夐挳鏉冮檺鍥炴樉
+ const buttonAll = this.allButtonData.tButton.filter(j => j.menucode === it.code).map(j => j.name)
+ const buttonChecked = this.allButtonData.tButton.filter(j =>
+ j.menucode === it.code && j.flag === 'Y'
+ ).map(j => j.name)
+ it.itemButton = buttonAll
+ it.checkedButton = buttonChecked
+
+ // 鏁版嵁鏉冮檺鍥炴樉
+ const dataAll = this.allButtonData.tData.filter(j => j.menucode === it.code).map(j => j.name)
+ const dataChecked = this.allButtonData.tData.filter(j => j.menucode === it.code && j.flag === 'Y').name
+ // console.log(dataAll, dataChecked, 2)
+ it.itemData = dataAll
+ it.checkedData = dataChecked
+
+ // 鐢ㄤ綔鑿滃崟鍕鹃�夊洖鏄�
+ if (it.flag === 'Y') {
+ this.menuCheckedCodeArr.push(it.code)
+ }
+ })
+ item.display = true
+ item.expanded = true
+ }
+ })
+
+ console.log(JSON.parse(JSON.stringify(result)), 8)
+
+ this.treeCenter = [
+ { code: '-1', name: '鍏ㄩ儴', flag: result.every(i => i.flag === 'Y') ? 'Y' : 'N', children: result }
+ ]
+
+ // this.buttonIsChecked = result.every(i => i.flag === 'Y')
+ this.handleCheckedButtonChange('', '', true)
+ this.handleCheckedDataChange('', '', true)
+ // console.log(this.menuCheckedCodeArr, 2)
+ this.$nextTick(() => {
+ this.$refs.treeCenterRef.setCheckedKeys(this.menuCheckedCodeArr)
+ })
+
+ this.$forceUpdate()
+ // console.log(this.treeCenter[0].children)
+ },
+
+ // 宸﹁竟婊氬姩鏉℃粦鍔ㄦ椂
+ scrollLeftScroll() {
+ if (this.isScroll === 'left') {
+ this.$refs.scrollCenter.scrollTop = this.$refs.scrollLeft.scrollTop
+ this.$refs.scrollRight.scrollTop = this.$refs.scrollLeft.scrollTop
+ }
+ },
+ // 涓棿杈规粴鍔ㄦ潯婊戝姩鏃�
+ scrollCenterScroll() {
+ if (this.isScroll === 'center') {
+ this.$refs.scrollLeft.scrollTop = this.$refs.scrollCenter.scrollTop
+ this.$refs.scrollRight.scrollTop = this.$refs.scrollCenter.scrollTop
+ }
+ },
+ // 鍙充晶婊氬姩鏉℃粦鍔ㄦ椂
+ scrollRightScroll() {
+ if (this.isScroll === 'right') {
+ this.$refs.scrollLeft.scrollTop = this.$refs.scrollRight.scrollTop
+ this.$refs.scrollCenter.scrollTop = this.$refs.scrollRight.scrollTop
+ }
+ },
+
+ resize() {
+
+ },
+
+ changeScrollLeftFlag(val) {
+ this.isScroll = val
+ },
+
+ // 鍏ㄩ�夋敼鍙�
+ handleCheckAllChange(val, belong) {
+ const checkedKeys = this.$refs.treeCenterRef.getCheckedKeys()
+
+ if (val) {
+ this.treeCenter[0].children.forEach(item => {
+ if (item.children && item.children.length) {
+ item.children.forEach(it => {
+ if (checkedKeys.includes(it.code)) {
+ if (belong === 'button') {
+ it.checkedButton = it.itemButton
+ }
+ if (belong === 'data') {
+ it.checkedData = '鍏ㄩ儴'
+ }
+ }
+ })
+ }
+ })
+ } else {
+ this.treeCenter[0].children.forEach(item => {
+ if (item.children && item.children.length) {
+ item.children.forEach(it => {
+ if (checkedKeys.includes(it.code)) {
+ if (belong === 'button') {
+ it.checkedButton = []
+ }
+ if (belong === 'data') {
+ it.checkedData = undefined
+ }
+ }
+ })
+ }
+ })
+ }
+
+ // console.log(this.treeCenter[0].children, 20)
+ },
+ // 鍗曚釜鎸夐挳鏀瑰彉
+ handleCheckedButtonChange(value, code, flag) {
+ // 鍒ゆ柇鏄惁鍖呭惈鍦ㄥ唴
+ if (!flag) {
+ if (!this.menuCheckedCodeArr.includes(code) && value.length === 1) { // 鍚�
+ this.menuCheckedCodeArr.push(code)
+ } else if (this.menuCheckedCodeArr.includes(code) && value.length === 0) { // 鏄�
+ this.menuCheckedCodeArr = this.menuCheckedCodeArr.filter(i => i !== code)
+ }
+ this.$refs.treeCenterRef.setCheckedKeys(this.menuCheckedCodeArr)
+ }
+
+ // 杩欓噷鏄垽鏂叏閫塩heckbox 鏄惁閫変腑
+ let count = 0
+ let childrenLength = 0
+ this.treeCenter[0].children.forEach(item => {
+ if (item.children && item.children.length) {
+ item.children.forEach(it => {
+ if (it.checkedButton.length === it.itemButton.length) {
+ count++
+ }
+ childrenLength++
+ })
+ }
+ })
+ this.buttonIsChecked = count === childrenLength
+ this.$forceUpdate()
+ },
+
+ // 鑾峰彇鏍戝舰鑺傜偣node
+ getLeftTreeNode(data, Node, VueComponent) {
+ // console.log(data, Node, VueComponent, 2221)
+ // console.log(Node.expanded)
+ this.treeCenter[0].children.forEach(item => {
+ if (item.name === data.name) {
+ item.expanded = Node.expanded
+ }
+ })
+ if (data.code === '-1') {
+ Node.expanded = true // 鏆傛椂鍏堝啓鎴愯繖涓�
+ // this.treeCenter[0].children.forEach(item => {
+ // item.expanded = Node.expanded
+ // })
+ }
+ this.$forceUpdate()
+ },
+ // 澶勭悊鏍戝舰鍕鹃��
+ handleTreeCenterCheck(obj, { checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys }) {
+ // console.log(obj, checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys, '鍔犲瀹�')
+
+ if (checkedKeys.length === 0) { // 鏍戝舰鑿滃崟鍏ㄤ笉閫夌殑鎯呭喌涓�
+ this.buttonIsChecked = false
+ this.dataIsChecked = false
+ this.menuCheckedCodeArr = []
+ } else {
+ if (checkedKeys.includes(obj.code)) { // 鍒ゆ柇鏄惁鍖呭惈鍦ㄥ唴 //鏄�
+ this.menuCheckedCodeArr.push(obj.code)
+ } else { // 鍚�
+ this.menuCheckedCodeArr = this.menuCheckedCodeArr.filter(i => i !== obj.code)
+ }
+ }
+ },
+ // 澶勭悊鏍戝舰閫変腑鍊兼敼鍙�
+ handleTreeCenterCheckChange(obj, selfChecked, selfChildrenTreeCheck) {
+ // console.log(obj, selfChecked, selfChildrenTreeCheck, '鐜嬭�佸悏')
+ if (!selfChildrenTreeCheck) {
+ if (!selfChecked) {
+ this.treeCenter[0].children.forEach(item => {
+ if (item.children && item.children.length) {
+ item.children.forEach(it => {
+ if (it.code === obj.code) {
+ it.checkedButton = []
+ it.checkedData = undefined
+ }
+ })
+ }
+ })
+ this.$forceUpdate()
+ }
+ }
+ },
+
+ // 鍗曢�夋鎸夐挳鏀瑰彉
+ handleCheckedDataChange(value, code, flag) {
+ // console.log(value, code)
+ if (flag) {
+ this.menuCheckedCodeArr.push(code)
+ this.menuCheckedCodeArr = [...new Set(this.menuCheckedCodeArr)]
+
+ this.$refs.treeCenterRef.setCheckedKeys(this.menuCheckedCodeArr)
+ }
+
+ // 杩欓噷鏄垽鏂叏閫塺adio 鏄惁閫変腑
+ let count = 0
+ let childrenLength = 0
+ this.treeCenter[0].children.forEach(item => {
+ if (item.children && item.children.length) {
+ item.children.forEach(it => {
+ if (it.checkedData) {
+ count++
+ }
+ if (it.itemData.length > 0) {
+ childrenLength++
+ }
+ })
+ }
+ })
+ // console.log(count, childrenLength, 9)
+ this.dataIsChecked = count === childrenLength
+ // console.log(JSON.parse(JSON.stringify(this.treeCenter[0].children)))
+
+ this.$forceUpdate()
+ },
+
+ async treeLeftNodeClick(obj, Node, VueComponent) {
+ // this.menuCheckedCodeArr = []
+
+ await this.getRolePermissionSearchRoleMenuButton(obj.code)
+ await this.getRolePermissionSearchRoleMenu(obj.code)
+ },
+
+ // 鑾峰彇椤甸潰楂樺害
+ getHeight() {
+ this.$nextTick(() => {
+ this.mainHeight = window.innerHeight - 85
+ this.tableHeight = this.mainHeight - 255
+ // this.$refs.tableDataRef.doLayout()
+ })
+ }
+ }
+}
+</script>
+
+<!--鍏叡椤甸潰鏍峰紡-->
+<style lang="scss" scoped>
+$main_color: #42b983;
+::v-deep .el-button--text {
+ font-size: 14px;
+ cursor: pointer;
+}
+
+.el-icon-share, .el-icon-delete, .el-icon-edit-outline {
+ color: $main_color;
+ cursor: pointer;
+}
+
+.el-icon-edit-outline {
+ margin-right: 15px;
+}
+
+::v-deep .el-button--primary, .el-button--default, .el-button--info {
+ height: 34px;
+ display: flex;
+ align-items: center;
+ padding: 0 15px;
+}
+
+::v-deep .el-button--primary {
+ //background-color: $main_color !important;
+}
+
+::v-deep .el-button--default {
+ background-color: #f8f8fa;
+ border: none;
+}
+
+::v-deep .el-input__inner {
+ height: 34px;
+ line-height: 34px;
+ //color: #a7a7a7;
+}
+
+::v-deep .el-dialog__body {
+ padding: 20px 100px !important;
+}
+
+::v-deep .dialogVisibleRoles .el-dialog__body {
+ padding: 20px 20px !important;
+}
+
+::v-deep .importPickerClass .el-dialog__body {
+ padding: 20px 20px !important;
+}
+
+::v-deep .el-dialog__footer {
+ display: flex;
+ justify-content: flex-end;
+}
+
+::v-deep .el-table .caret-wrapper {
+ transform: scale(0.8);
+}
+
+::v-deep .cell {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+::v-deep .el-table::before {
+ height: 0;
+}
+
+::v-deep .el-table__body-wrapper {
+ background-color: #f8f8fa;
+}
+
+::v-deep .el-table__body .el-table__row.hover-row td {
+ background-color: #eaecef;
+}
+
+::v-deep .el-form--inline .el-form-item__label {
+ color: #a7a7a7;
+}
+
+.body ::v-deep .el-divider {
+ border: 1px solid #eee;
+ width: 99%;
+ margin: 10px auto;
+}
+
+.body ::v-deep .el-form-item {
+ margin-bottom: 0;
+}
+
+.userDialogVisible ::v-deep .el-form-item {
+ margin-bottom: 0;
+}
+
+::v-deep .el-select__caret {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.tableFixed {
+ ::v-deep .el-table__fixed-right {
+ height: 100% !important;
+ }
+
+ ::v-deep .el-table__fixed {
+ height: 100% !important;
+ }
+}
+</style>
+<style>
+
+.el-table .custom-row {
+ background: #f8f8fa;
+}
+</style>
--
Gitblit v1.9.3