|
@@ -0,0 +1,498 @@
|
|
|
+import { Card, Tabs, Checkbox, Button, message, Spin } from 'antd'
|
|
|
+import React, { useState } from 'react'
|
|
|
+import { queryRoleDetailByID, setRolePermission } from '@/services/permission'
|
|
|
+import { useRequest } from '@umijs/max'
|
|
|
+import { RoleType } from '../RoleLeftMenu'
|
|
|
+import './index.less'
|
|
|
+const { TabPane } = Tabs
|
|
|
+
|
|
|
+type PermTabsProps = {
|
|
|
+ currentPermData: {
|
|
|
+ ID: string
|
|
|
+ roleType: RoleType
|
|
|
+ }
|
|
|
+}
|
|
|
+export enum OperationType {
|
|
|
+ FRONT = 'front', // 前台
|
|
|
+ BACKSTAGE = 'backstage' // 后台
|
|
|
+}
|
|
|
+const PermTabs: React.FC<PermTabsProps> = ({ currentPermData: { ID, roleType } }) => {
|
|
|
+ const [state, setState] = useState({
|
|
|
+ frontPermission: [], // 前台权限
|
|
|
+ backstagePermission: [] // 后台权限
|
|
|
+ })
|
|
|
+
|
|
|
+ const { loading } = useRequest(() => queryRoleDetailByID({ ID }), {
|
|
|
+ refreshDeps: [ID],
|
|
|
+ onSuccess: ({ frontPermission = [], backstagePermission = [] } = {}) => {
|
|
|
+ setState({ ...state, frontPermission, backstagePermission })
|
|
|
+ },
|
|
|
+ onError: e => console.log(e)
|
|
|
+ })
|
|
|
+
|
|
|
+ const { run: trySetRolePermission, loading: submitStauts } = useRequest(
|
|
|
+ (params: API.SetRolePermissionParams) => setRolePermission(params),
|
|
|
+ {
|
|
|
+ manual: true,
|
|
|
+ onSuccess: () => {
|
|
|
+ message.success('设置成功')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+ const handleFrontOnchange = (checked: boolean, perm: string) => {
|
|
|
+ if (checked) {
|
|
|
+ setState({ ...state, frontPermission: [...state.frontPermission, perm] })
|
|
|
+ } else {
|
|
|
+ setState({ ...state, frontPermission: state.frontPermission.filter(item => item !== perm) })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const handleBackOnchange = (checked: boolean, perm: string) => {
|
|
|
+ if (checked) {
|
|
|
+ setState({ ...state, backstagePermission: [...state.backstagePermission, perm] })
|
|
|
+ } else {
|
|
|
+ setState({
|
|
|
+ ...state,
|
|
|
+ backstagePermission: state.backstagePermission.filter(item => item !== perm)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const handleSubmitFront = () => {
|
|
|
+ trySetRolePermission({
|
|
|
+ ID,
|
|
|
+ operation: OperationType.FRONT,
|
|
|
+ frontPermission: state.frontPermission
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleSubmitBackstage = () => {
|
|
|
+ trySetRolePermission({
|
|
|
+ ID,
|
|
|
+ operation: OperationType.BACKSTAGE,
|
|
|
+ backstagePermission: state.backstagePermission
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <Tabs type="card">
|
|
|
+ <TabPane tab="前台" key="3" className="tab-height overflow-y-auto">
|
|
|
+ <Spin spinning={loading}>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="待办列表">
|
|
|
+ <div>
|
|
|
+ {/* <h4>我的项目</h4> */}
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox onChange={e => handleFrontOnchange(e.target.checked, 'todo')} disabled>
|
|
|
+ 已办待办
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="项目列表">
|
|
|
+ <div>
|
|
|
+ <h4>我的项目</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'viewProject')}
|
|
|
+ checked={state.frontPermission.includes('viewProject')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 查看项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'addProject')}
|
|
|
+ checked={state.frontPermission.includes('addProject')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 新建项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'editProject')}
|
|
|
+ checked={state.frontPermission.includes('editProject')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 编辑项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'exportProject')}
|
|
|
+ checked={state.frontPermission.includes('exportProject')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 导出项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'delProject')}
|
|
|
+ checked={state.frontPermission.includes('delProject')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 删除项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'report')}
|
|
|
+ checked={state.frontPermission.includes('report')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 项目上报(审批模板)
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'report1')}
|
|
|
+ checked={state.frontPermission.includes('report1')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 项目上报(自由流程)
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">我参与的项目</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ disabled={roleType === RoleType.SYSTEM}
|
|
|
+ checked={state.frontPermission.includes('viewParticipatingProject')}
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'viewParticipatingProject')}>
|
|
|
+ 查看项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ disabled={roleType === RoleType.SYSTEM}
|
|
|
+ checked={state.frontPermission.includes('saveIndex')}
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'saveIndex')}>
|
|
|
+ 指标入库
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ disabled={roleType === RoleType.SYSTEM}
|
|
|
+ checked={state.frontPermission.includes('exportParticipatingProject')}
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'exportParticipatingProject')}>
|
|
|
+ 导出
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">全部项目</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'viewAllProjects')}
|
|
|
+ checked={state.frontPermission.includes('viewAllProjects')}
|
|
|
+ disabled={roleType === RoleType.SYSTEM}>
|
|
|
+ 查看项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ disabled={roleType === RoleType.SYSTEM}
|
|
|
+ checked={state.frontPermission.includes('saveIndexAll')}
|
|
|
+ onChange={e => handleFrontOnchange(e.target.checked, 'saveIndexAll')}>
|
|
|
+ 指标入库
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">指标库</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox onChange={e => handleFrontOnchange(e.target.checked, 'section')} disabled>
|
|
|
+ 区间对数
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="个人设置">
|
|
|
+ <div>
|
|
|
+ <h4>基本设置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox onChange={e => handleFrontOnchange(e.target.checked, 'edit')} disabled>
|
|
|
+ 编辑
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">企事业信息</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox onChange={e => handleFrontOnchange(e.target.checked, 'access2')} disabled>
|
|
|
+ 查看
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">安全设置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox onChange={e => handleFrontOnchange(e.target.checked, 'phone')} disabled>
|
|
|
+ 手机绑定
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox onChange={e => handleFrontOnchange(e.target.checked, 'password')} disabled>
|
|
|
+ 密码修改
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ </Spin>
|
|
|
+ <Button type="primary" onClick={handleSubmitFront} loading={submitStauts}>
|
|
|
+ 提交
|
|
|
+ </Button>
|
|
|
+ </TabPane>
|
|
|
+ <TabPane tab="后台" key="4" className="tab-height overflow-y-auto">
|
|
|
+ <Spin spinning={loading}>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="项目审批设置">
|
|
|
+ <div>
|
|
|
+ <h4>项目管理</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewManagement')}
|
|
|
+ checked={state.backstagePermission.includes('viewManagement')}>
|
|
|
+ 查看项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'addBa1')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 新建项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa1')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑项目
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'bindBa1')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 绑定角色
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'deployBa1')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 流程配置
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">审批流程模板</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewVerification')}
|
|
|
+ checked={state.backstagePermission.includes('viewVerification')}>
|
|
|
+ 查看流程
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'addBa2')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 新建流程
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa2')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑流程
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="企事业单位">
|
|
|
+ <div>
|
|
|
+ <h4>单位管理</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewCompany')}
|
|
|
+ checked={state.backstagePermission.includes('viewCompany')}>
|
|
|
+ 查看单位
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'addBa4')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 新建单位
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'staff')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 人员管理
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'organizational')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 组织管理
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'deploy')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 单位设置
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">人员管理</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewStaff')}
|
|
|
+ checked={state.backstagePermission.includes('viewStaff')}>
|
|
|
+ 查看人员
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa5')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑人员
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">限制登录</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewRestrict')}
|
|
|
+ checked={state.backstagePermission.includes('viewRestrict')}>
|
|
|
+ 查看人员
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa5')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑人员
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="业务审批设置">
|
|
|
+ {/* <div>
|
|
|
+ <h4>业务管理</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewBusiness')}
|
|
|
+ checked={state.backstagePermission.includes('viewBusiness')}>
|
|
|
+ 查看信息
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div> */}
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">流程用户配置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewProcess')}
|
|
|
+ checked={state.backstagePermission.includes('viewProcess')}>
|
|
|
+ 查看信息
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">资料清单配置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewInventory')}
|
|
|
+ checked={state.backstagePermission.includes('viewInventory')}>
|
|
|
+ 查看信息
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="表单设置">
|
|
|
+ <div>
|
|
|
+ <h4>基础数据设置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewBase')}
|
|
|
+ checked={state.backstagePermission.includes('viewBase')}>
|
|
|
+ 查看项目信息
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa6')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑项目信息
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa6')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 查看企事业单位信息
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa6')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑企事业单位信息
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa6')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 查看人员信息
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa6')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑人员信息
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">数据源设置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewOption')}
|
|
|
+ checked={state.backstagePermission.includes('viewOption')}>
|
|
|
+ 查看信息
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa7')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑信息
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <h4 className="pt-3">预算业务表单设置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewBudget')}
|
|
|
+ checked={state.backstagePermission.includes('viewBudget')}>
|
|
|
+ 查看信息
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ <div className="shadow-md mb-4">
|
|
|
+ <Card size="small" type="inner" title="系统管理">
|
|
|
+ <div>
|
|
|
+ <h4>管理员设置</h4>
|
|
|
+ <div className="my-2">
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'viewAdmin')}
|
|
|
+ checked={state.backstagePermission.includes('viewAdmin')}>
|
|
|
+ 查看信息
|
|
|
+ </Checkbox>
|
|
|
+ <Checkbox
|
|
|
+ onChange={e => handleBackOnchange(e.target.checked, 'editBa9')}
|
|
|
+ checked={state.backstagePermission.includes('updatePsw')}
|
|
|
+ disabled>
|
|
|
+ 编辑信息
|
|
|
+ </Checkbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ </Spin>
|
|
|
+ <Button type="primary" onClick={handleSubmitBackstage} loading={submitStauts}>
|
|
|
+ 提交
|
|
|
+ </Button>
|
|
|
+ </TabPane>
|
|
|
+ </Tabs>
|
|
|
+ {/* <Affix offsetBottom={10}>
|
|
|
+ <Button type="primary" onClick={handleSubmit} loading={submitStauts}>
|
|
|
+ 提交
|
|
|
+ </Button>
|
|
|
+ </Affix> */}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+export default PermTabs
|