16 changed files with 2325 additions and 643 deletions
|
After Width: | Height: | Size: 873 B |
|
After Width: | Height: | Size: 670 B |
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -0,0 +1,409 @@ |
|||
<!-- |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-17 16:53:07 |
|||
@ 备注: |
|||
--> |
|||
<script lang='ts' setup> |
|||
import { appTableBut, appListBut,appDetailBut,formBaseBut,appGroupBut } from "@/utils/workflow/const"; |
|||
import { orgInfo } from '@/api/displayboardapi/types'; |
|||
import { appInitAuthorization,tabsAuthorizationMode } from "@/api/system/roleapi/postrole"; |
|||
import type { TabsPaneContext } from 'element-plus' |
|||
|
|||
const props = defineProps({ |
|||
appType: { |
|||
type: String, |
|||
default: "app" |
|||
}, |
|||
powerType: { |
|||
type: String, |
|||
default: "" |
|||
}, |
|||
roleId: { |
|||
type: String, |
|||
default: "" |
|||
}, |
|||
orgTree: { |
|||
type: Array as PropType<orgInfo[]>, |
|||
default: () => [] |
|||
} |
|||
}) |
|||
const appLoading = ref(false) |
|||
const submitLoading = ref(false) |
|||
const appPowerArt = ref<any>([]) |
|||
const appGroupButAry = ref<string[]>([]) |
|||
const powerActiveName = reactive({ |
|||
group:"", |
|||
app:"" |
|||
}) |
|||
const systemMenuTreePropsing = { |
|||
children: "child", |
|||
label: "name", |
|||
value: "id", |
|||
}; |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-05-13 14:20:47 |
|||
@ 功能: 获取自定义App |
|||
*/ |
|||
|
|||
const getAppList = () => { |
|||
appLoading.value=true |
|||
appPowerArt.value = [] |
|||
appGroupButAry.value = [] |
|||
appInitAuthorization({appType:"app",powerType:props.powerType,roleId:props.roleId}).then((data: any) => { |
|||
console.log("获取自定义App", data); |
|||
// appList.value = data.data; |
|||
appPowerArt.value = data.data.appList |
|||
appGroupButAry.value = data.data.groupButPower |
|||
appLoading.value=false |
|||
if(data.data.appList && Array.isArray(data.data.appList)){ |
|||
powerActiveName.group = data.data.appList[0].id |
|||
if(data.data.appList[0].appList && Array.isArray(data.data.appList[0].appList)){ |
|||
powerActiveName.app = data.data.appList[0].appList[0].id |
|||
} |
|||
} |
|||
}).finally(()=>{ |
|||
appLoading.value=false |
|||
submitLoading.value = false |
|||
}) |
|||
}; |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 10:17:07 |
|||
@ 功能: 标签被选择 |
|||
*/ |
|||
const handleTabClick = (val:any) => { |
|||
|
|||
if(appPowerArt.value && Array.isArray(appPowerArt.value)){ |
|||
appPowerArt.value.find((item:any) => { |
|||
if(item.id === powerActiveName.group){ |
|||
powerActiveName.app = item.appList[0].id |
|||
} |
|||
}) |
|||
|
|||
// powerActiveName.app = appPowerArt.value.find((item:any) => item.id === powerActiveName.group)?.appList[0].id |
|||
} |
|||
|
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 11:14:56 |
|||
@ 功能: 选择分组 |
|||
*/ |
|||
const handleGroupChange = (item:any) => { |
|||
console.log("-------------------------->",item) |
|||
// if(item.isTrue){ |
|||
if(item.appList && Array.isArray(item.appList)){ |
|||
item.appList.find((app:any) => { |
|||
app.isTrue = item.isTrue |
|||
if(item.isTrue){ |
|||
app.operationButton = ["bjapp","scapp","xzfg","scfg","yzfg","xz","bj","sc","yz","jczdh","yysz","yyfb"] |
|||
}else{ |
|||
app.operationButton = [] |
|||
} |
|||
if(app.appMenuTree && Array.isArray(app.appMenuTree)){ |
|||
app.appMenuTree = handleAppChange(app.appMenuTree,item.isTrue) |
|||
} |
|||
}) |
|||
} |
|||
// } |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 11:23:40 |
|||
@ 功能: 循环递归联动赋值 |
|||
*/ |
|||
const handleAppChange = (item:any,isTrue:boolean) => { |
|||
// console.log("--------循环递归联动赋值------------------>",item) |
|||
if(item && Array.isArray(item)){ |
|||
item.forEach((menu:any) => { |
|||
menu.isTrue = isTrue |
|||
if(isTrue){ |
|||
menu.formPower = [ "zc", "tj", "dy", "sc", "fz"] |
|||
menu.listPower = [ "newAdd", "import", "export", "sc", "dy", "showQrCode","del","bj"] |
|||
}else{ |
|||
menu.formPower = [] |
|||
menu.listPower = [] |
|||
} |
|||
if(menu.children && Array.isArray(menu.children)){ |
|||
menu.children = handleAppChange(menu.children,isTrue) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
return item |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 13:48:26 |
|||
@ 功能: 选择App |
|||
*/ |
|||
const handleAppPowerChange = (item:any) => { |
|||
console.log("----------------选择App---------->",item) |
|||
if(item.isTrue){ |
|||
item.operationButton = ["bjapp","scapp","xzfg","scfg","yzfg","xz","bj","sc","yz","jczdh","yysz","yyfb"] |
|||
}else{ |
|||
item.operationButton = [] |
|||
} |
|||
if(item.appMenuTree && Array.isArray(item.appMenuTree)){ |
|||
item.appMenuTree = handleAppChange(item.appMenuTree,item.isTrue) |
|||
} |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 13:58:21 |
|||
@ 功能: 选择App菜单是选中状态下,关联操作按钮 |
|||
*/ |
|||
const handleAppMenuChange = (item:any) => { |
|||
// console.log("----------------选择App菜单---------->",item) |
|||
if(item.isTrue){ |
|||
item.formPower = [ "zc", "tj", "dy", "sc", "fz"] |
|||
item.listPower = [ "newAdd", "import", "export", "sc", "dy", "showQrCode","del","bj"] |
|||
}else{ |
|||
item.formPower = [] |
|||
item.listPower = [] |
|||
} |
|||
if(item.children && Array.isArray(item.children)){ |
|||
item.children = handleAppChange(item.children,item.isTrue) |
|||
} |
|||
} |
|||
onMounted(()=>{ |
|||
// getAppList() |
|||
}) |
|||
defineExpose({ |
|||
getAppList |
|||
}) |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 14:16:49 |
|||
@ 功能: 提交授权 |
|||
*/ |
|||
const submitPower = () => { |
|||
submitLoading.value = true |
|||
let sendData:any = { |
|||
appType:"app", |
|||
powerType:props.powerType, |
|||
roleId:props.roleId, |
|||
listPower:appPowerArt.value, |
|||
groupPower:appGroupButAry.value |
|||
} |
|||
if(!props.roleId || props.roleId === ""){ |
|||
ElMessage.error("具体授权属性!") |
|||
submitLoading.value = false |
|||
return |
|||
} |
|||
console.log("----------------提交授权---------->",sendData) |
|||
// submitLoading.value = true |
|||
tabsAuthorizationMode(sendData).then((data: any) => { |
|||
if(data.code === 0){ |
|||
ElMessage.success("授权成功!") |
|||
submitLoading.value = false |
|||
}else{ |
|||
ElMessage.error(data.msg) |
|||
} |
|||
}).catch((err: any) => { |
|||
ElMessage.error(err.message) |
|||
submitLoading.value = false |
|||
}) |
|||
} |
|||
|
|||
</script> |
|||
<template> |
|||
<div class="app-tabs-content" v-loading="appLoading"> |
|||
<el-checkbox-group v-model="appGroupButAry"> |
|||
<el-checkbox |
|||
v-for="city in appGroupBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
|
|||
<el-tabs v-model="powerActiveName.group" @tab-change="handleTabClick" class="demo-tabs " > |
|||
<el-tab-pane v-for="item in appPowerArt" :label="item.name" :key="item.id" :name="item.id" class="center-content"> |
|||
<template #label> |
|||
<div class="app-tabs-checkbox"> |
|||
<el-checkbox v-model="item.isTrue" @change="handleGroupChange(item)" /><span>{{item.name}}{{ item.isTrue }}</span> |
|||
</div> |
|||
|
|||
</template> |
|||
<!--应用--> |
|||
|
|||
|
|||
|
|||
<el-tabs v-model="powerActiveName.app" class="demo-tabs left_hight" tab-position="left"> |
|||
<el-tab-pane v-for="app in item.appList" :label="app.name" :key="app.id" :name="app.id" class="center-content"> |
|||
<template #label> |
|||
<div class="app-tabs-checkbox"> |
|||
<el-checkbox v-model="app.isTrue" @change="handleAppPowerChange(app)" /><span>{{app.name}}</span> |
|||
</div> |
|||
</template> |
|||
|
|||
<div class="app-form-checkbox"> |
|||
<el-checkbox-group v-model="app.operationButton"> |
|||
<el-checkbox |
|||
v-for="city in appDetailBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</div> |
|||
<el-table |
|||
:data="app.appMenuTree" |
|||
style="width: 100%;" |
|||
class="tableScrollbar" |
|||
row-key="id" |
|||
border |
|||
default-expand-all |
|||
> |
|||
<el-table-column prop="name" label="栏目名称" > |
|||
<template #default="scope"> |
|||
<el-checkbox v-model="scope.row.isTrue" :value="scope.row.isTrue" @change="handleAppMenuChange(scope.row)" ></el-checkbox> |
|||
{{ scope.row.name }} |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="pagePower" label="页面权力" > |
|||
<template #header> |
|||
<el-text>页面权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox-group v-model="scope.row.pagePower"> |
|||
<el-checkbox |
|||
v-for="city in formBaseBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="formPower" label="表单权限" > |
|||
<template #header> |
|||
<el-text>表单权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox-group v-model="scope.row.formPower"> |
|||
<el-checkbox |
|||
v-for="city in appTableBut" |
|||
:key="city.value" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="listPower" label="listPower" > |
|||
<template #header> |
|||
<el-text>列表权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox-group v-model="scope.row.listPower"> |
|||
<el-checkbox |
|||
v-for="city in appListBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="visibleRange" label="数据权限" > |
|||
<template #header> |
|||
<el-text>数据权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-radio-group |
|||
v-model="scope.row.visibleRange.types" |
|||
> |
|||
<el-row> |
|||
<el-col :span="24"><el-radio :value="1">本人</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="2">本岗位</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="3">本部门</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="4">本分部</el-radio></el-col> |
|||
<el-col :span="24"> |
|||
<el-radio :value="5">指定行政组织</el-radio> |
|||
<el-tree-select |
|||
v-if="scope.row.visibleRange.types == 5" |
|||
v-model="scope.row.visibleRange.attribute" |
|||
:data="orgTree" |
|||
style="width: 100%" |
|||
node-key="id" |
|||
:props="systemMenuTreePropsing" |
|||
clearable |
|||
multiple |
|||
:render-after-expand="false" |
|||
show-checkbox |
|||
collapse-tags |
|||
collapse-tags-tooltip |
|||
/> |
|||
</el-col> |
|||
<el-col :span="24"><el-radio :value="6">所有</el-radio></el-col> |
|||
</el-row> |
|||
</el-radio-group> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
</el-table> |
|||
|
|||
</el-tab-pane> |
|||
</el-tabs> |
|||
</el-tab-pane> |
|||
<el-affix position="bottom" :offset="100" style="margin-left: 250px;"> |
|||
<el-button v-loading="submitLoading" type="primary" @click="submitPower">确定授权</el-button> |
|||
</el-affix> |
|||
</el-tabs> |
|||
|
|||
</div> |
|||
</template> |
|||
<style lang='scss' scoped> |
|||
.app-tabs-content { |
|||
|
|||
width: 100%; |
|||
:deep .el-tabs__content{ |
|||
padding: 0; |
|||
} |
|||
.app-form-checkbox{ |
|||
width: 200px; |
|||
display: grid; |
|||
grid-template-columns: repeat(2, 1fr); |
|||
grid-gap: 10px; |
|||
} |
|||
} |
|||
|
|||
.app-tabs-checkbox{ |
|||
width: 100%; |
|||
text-align: left; |
|||
padding: 0 10px; |
|||
display: flex; |
|||
align-items: center; |
|||
span{ |
|||
margin-left: 5px; |
|||
} |
|||
} |
|||
.center-content { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
height: 100%; /* 根据需要设置高度 */ |
|||
padding: 0px; |
|||
} |
|||
.tableScrollbar{ |
|||
width: 100%; |
|||
height: calc(100vh - 365px); |
|||
overflow: hidden; |
|||
overflow-y: auto; |
|||
} |
|||
.left_hight{ |
|||
height: calc(100vh - 350px); |
|||
} |
|||
</style> |
|||
@ -0,0 +1,249 @@ |
|||
<!-- |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-17 16:40:42 |
|||
@ 备注: app授权布局 |
|||
--> |
|||
<script lang='ts' setup> |
|||
import { appTableBut, appListBut,appDetailBut,formBaseBut,appGroupBut } from "@/utils/workflow/const"; |
|||
import { appInitAuthorization,gainAppTableListNew,getPowerPageUser,systemAppAuthorization,gainAppEmpowerPower } from "@/api/system/roleapi/postrole"; |
|||
import { orgInfo } from "@/api/displayboardapi/types"; |
|||
|
|||
const props = defineProps({ |
|||
appType: { |
|||
type: String, |
|||
default: "" |
|||
}, |
|||
powerType: { |
|||
type: String, |
|||
default: "" |
|||
}, |
|||
roleId: { |
|||
type: String, |
|||
default: "" |
|||
} |
|||
}) |
|||
const orgTree = ref<orgInfo[]>([]) //行政组织树 |
|||
const appLoading = ref(false) |
|||
const grouTabsLoading = ref(false) |
|||
const appSystemConfig = ref<any[]>([]) |
|||
const appGroupButAry = ref<string[]>([]) |
|||
const appPowerArt = ref<any>([]) |
|||
const appFormButConfig = ref<any[]>([]) |
|||
|
|||
const systemMenuTreePropsing = { |
|||
children: "child", |
|||
label: "name", |
|||
value: "id", |
|||
}; |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-05-13 14:20:47 |
|||
@ 功能: 获取自定义App |
|||
*/ |
|||
|
|||
const getAppList = () => { |
|||
grouTabsLoading.value=true |
|||
appInitAuthorization({appType:props.appType,powerType:props.powerType,roleId:props.roleId}).then((data: any) => { |
|||
console.log("获取自定义App", data); |
|||
// appList.value = data.data; |
|||
appPowerArt.value = data.data.appList |
|||
appGroupButAry.value = data.data.groupButton |
|||
// if (data.data && data.data.length > 0) { |
|||
// if (data.data[0] && data.data[0].signCode) { |
|||
// activeAppId.value = data.data[0].signCode; |
|||
|
|||
// } |
|||
// } |
|||
// console.log("获取自定义App", activeAppId.value); |
|||
grouTabsLoading.value=false |
|||
}).finally(()=>{ |
|||
appLoading.value=false |
|||
}) |
|||
}; |
|||
const pickAppTableList = (val: any) =>{ |
|||
|
|||
} |
|||
</script> |
|||
<template> |
|||
<el-scrollbar class="tableScrollbar" v-loading="appLoading"> |
|||
<table class="table_body"> |
|||
<thead> |
|||
<tr> |
|||
<th align="center" width="10%">分组权限</th> |
|||
<th align="center" width="10%">应用分组</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr > |
|||
<td width="10%" valign="top"> |
|||
<el-checkbox-group v-model="appSystemConfig"> |
|||
<el-checkbox |
|||
v-for="city in appGroupBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</td> |
|||
<td align="center" width="90%" valign="top"> |
|||
<table class="table_body"> |
|||
|
|||
<tbody> |
|||
<tr v-for="item in appPowerArt" :key="item.id"> |
|||
<td align="center" width="10%" valign="top"> |
|||
<el-checkbox @click.stop="pickAppTableList(item)" v-model="item.isTrue" :value="item.isTrue" ></el-checkbox> |
|||
{{ item.name }} |
|||
</td> |
|||
<td align="center" width="90%" valign="top"> |
|||
<table class="table_body"> |
|||
<thead> |
|||
<tr> |
|||
<th align="center" width="10%">应用</th> |
|||
<th align="center" width="10%">应用操作按钮</th> |
|||
<th align="center" width="80%">应用栏目</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr v-for="itemApp in item.appList" :key="itemApp.id"> |
|||
<td align="center" width="10%" valign="top"> |
|||
<el-checkbox @click.stop="pickAppTableList(itemApp)" v-model="itemApp.isTrue" :value="itemApp.isTrue" ></el-checkbox> |
|||
{{ itemApp.name }} |
|||
</td> |
|||
<td align="left" width="10%" valign="top"> |
|||
<el-checkbox-group v-model="appFormButConfig"> |
|||
<el-checkbox |
|||
v-for="city in appDetailBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</td> |
|||
<td align="center" width="80%" valign="top"> |
|||
<el-table |
|||
:data="itemApp.appMenuTree" |
|||
style="width: 100%; margin-bottom: 20px" |
|||
row-key="id" |
|||
border |
|||
default-expand-all |
|||
> |
|||
<el-table-column prop="name" label="栏目名称" > |
|||
<template #default="scope"> |
|||
<el-checkbox @click.stop="pickAppTableList(scope.row)" v-model="scope.row.isTrue" :value="scope.row.isTrue" ></el-checkbox> |
|||
{{ scope.row.name }} |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="pagePower" label="页面权力" > |
|||
<template #header> |
|||
<el-text>页面权力</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox-group v-model="scope.pagePower"> |
|||
<el-checkbox |
|||
v-for="city in formBaseBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="formPower" label="表单权限" > |
|||
<template #header> |
|||
<el-text>表单权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox-group v-model="scope.formPower"> |
|||
<el-checkbox |
|||
v-for="city in formBaseBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="listPower" label="listPower" > |
|||
<template #header> |
|||
<el-text>列表权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox-group v-model="scope.listPower"> |
|||
<el-checkbox |
|||
v-for="city in formBaseBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="visibleRange" label="数据权限" > |
|||
<template #header> |
|||
<el-text>数据权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-radio-group |
|||
v-model="scope.row.visibleRange.types" |
|||
> |
|||
<el-row> |
|||
<el-col :span="24"><el-radio :value="1">本人</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="2">本岗位</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="3">本部门</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="4">本分部</el-radio></el-col> |
|||
<el-col :span="24"> |
|||
<el-radio :value="5">指定行政组织</el-radio> |
|||
<el-tree-select |
|||
v-if="scope.row.visibleRange.types == 5" |
|||
v-model="scope.row.visibleRange.attribute" |
|||
:data="orgTree" |
|||
style="width: 100%" |
|||
node-key="id" |
|||
:props="systemMenuTreePropsing" |
|||
clearable |
|||
multiple |
|||
:render-after-expand="false" |
|||
show-checkbox |
|||
collapse-tags |
|||
collapse-tags-tooltip |
|||
/> |
|||
</el-col> |
|||
<el-col :span="24"><el-radio :value="6">所有</el-radio></el-col> |
|||
</el-row> |
|||
</el-radio-group> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
|
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</el-scrollbar> |
|||
</template> |
|||
<style lang='scss' scoped> |
|||
.tableScrollbar{ |
|||
width: 100%; |
|||
height: calc(100vh - 260px); |
|||
overflow: hidden; |
|||
overflow-y: auto; |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue