|
@@ -1,15 +1,15 @@
|
|
|
/*
|
|
|
* @Author: your name
|
|
|
* @Date: 2022-01-13 15:22:48
|
|
|
- * @LastEditTime: 2023-05-25 18:36:55
|
|
|
+ * @LastEditTime: 2023-09-20 15:51:06
|
|
|
* @LastEditors: code4eat awesomedema@gmail.com
|
|
|
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
|
|
* @FilePath: /KC-MiddlePlatform/src/pages/platform/setting/hospManage/index.tsx
|
|
|
*/
|
|
|
|
|
|
-import { FC, useEffect, useState } from 'react';
|
|
|
+import { FC, Key, useEffect, useState } from 'react';
|
|
|
import { roleManageModelState, ConnectProps, Loading, connect } from 'umi';
|
|
|
-import {Checkbox, Divider, Dropdown, Input, Popconfirm, Table, TreeProps } from 'antd';
|
|
|
+import { Checkbox, Divider, Dropdown, Input, Popconfirm, Switch, Table, TreeProps } from 'antd';
|
|
|
import KCTable from '@/components/kcTable';
|
|
|
import type { ProColumns } from '@ant-design/pro-table';
|
|
|
import { getAllRoles, getRoleHasBindMenus, getRoleHasBindUsers, getRolePermRelaMenu, initRoleFunc, initRoleReadOnlyFunc, saveRoleRelaApiPerm } from '@/service/role';
|
|
@@ -29,8 +29,11 @@ import { DataNode } from 'antd/es/tree';
|
|
|
import expandedIcon from '../../../../../public/images/treenode_open.png';
|
|
|
import closeIcon from '../../../../../public/images/treenode_collapse.png';
|
|
|
import DirectoryTree from 'antd/es/tree/DirectoryTree';
|
|
|
-import { getTreeData, getTreeDataRespType } from '../systemNavMana/service';
|
|
|
-import { getHospOwnSys } from '@/service/hospList';
|
|
|
+import { getTableDataRequest, getTreeData, getTreeDataRespType } from '../systemNavMana/service';
|
|
|
+import { getHospOwnSys, getMenuRelaPerm } from '@/service/hospList';
|
|
|
+import { extractAttributeValues, findParents } from '../hospManage';
|
|
|
+import { TreeNode } from 'antd/lib/tree-select';
|
|
|
+import ProCardDivider from '@ant-design/pro-card/lib/components/Divider';
|
|
|
|
|
|
export enum TableActType {
|
|
|
NOACT,
|
|
@@ -46,15 +49,20 @@ interface PageProps extends ConnectProps {
|
|
|
loading: boolean;
|
|
|
}
|
|
|
|
|
|
+interface TreeNode {
|
|
|
+ [key: string]: any;
|
|
|
+ children?: TreeNode[];
|
|
|
+}
|
|
|
+
|
|
|
const SearchIcon = createFromIconfontCN({
|
|
|
scriptUrl: '//at.alicdn.com/t/c/font_1927152_g1njmm1kh7b.js',
|
|
|
});
|
|
|
|
|
|
-
|
|
|
+const selectSystem:{systemId:string,type:number}[] = [];
|
|
|
|
|
|
const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
|
|
|
-
|
|
|
+
|
|
|
const [treeData, set_treeData] = useState<getTreeDataRespType[]>([]);
|
|
|
const [currentSelectedTreeNode, set_currentSelectedTreeNode] = useState<any | undefined>(undefined);
|
|
|
const [drawerTablereload, set_drawerTablereload] = useState(false);
|
|
@@ -67,12 +75,23 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
|
|
|
const [drawerTableDataSearchKeywords, set_drawerTableDataSearchKeywords] = useState<string>('');
|
|
|
|
|
|
+ const [checkedMenuParentsIds, set_checkedMenuParentsIds] = useState<Key[]>([]); //所有需要保存的菜单id
|
|
|
+
|
|
|
const [checkedTableMenuIds, set_checkedTableMenuIds] = useState<any[]>([]);
|
|
|
|
|
|
- const [oldSelectedMenuIds,set_oldSelectedMenuIds] = useState<any[]>([]);
|
|
|
+ const [oldSelectedMenuIds, set_oldSelectedMenuIds] = useState<any[]>([]);
|
|
|
|
|
|
const [drawerVisible, set_drawerVisible] = useState(false);
|
|
|
|
|
|
+ const [hospAllMenuTree, set_hospAllMenuTree] = useState<any[]>([]); //角色可选的全量菜单
|
|
|
+
|
|
|
+ const [expandedRowKeys, set_expandedRowKeys] = useState<any[]>([]);
|
|
|
+
|
|
|
+ const [selectSystem,set_selectSystem] = useState<{systemId:string,type:number}[]>([]); //角色已绑定的系统
|
|
|
+
|
|
|
+ const [ifTixiMenu,set_ifTixiMenu] = useState(false);
|
|
|
+ const [ifTixiMenuAuth,set_ifTixiMenuAuth] = useState(false);
|
|
|
+
|
|
|
const columnsData: ProColumns<TableListItem>[] = [
|
|
|
{
|
|
|
title: '名称',
|
|
@@ -125,10 +144,9 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
const onCheckGroupChange = (checkedValue: CheckboxValueType[]) => {
|
|
|
|
|
|
if (checkedValue.length > 0) {
|
|
|
- const _temp = checkBoxCodes;
|
|
|
+ const _temp = [...checkBoxCodes];
|
|
|
const index = checkBoxCodes.findIndex((item) => item.menuId == record.menuId);
|
|
|
|
|
|
-
|
|
|
const needed = options.filter((item: any) => checkedValue.includes(item.value));
|
|
|
const transfered = needed.map((item: any) => ({ name: item.label, code: item.value }));
|
|
|
|
|
@@ -142,9 +160,11 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
function: transfered
|
|
|
});
|
|
|
|
|
|
- const menuIdsArr = _temp.map((item: any) => item.menuId);
|
|
|
|
|
|
- set_checkedTableMenuIds([...menuIdsArr])
|
|
|
+ set_checkedMenuParentsIds([...checkedMenuParentsIds, record.menuId]);
|
|
|
+
|
|
|
+ set_checkedTableMenuIds([...checkedTableMenuIds, record.menuId])
|
|
|
+
|
|
|
|
|
|
set_checkBoxCodes([..._temp]);
|
|
|
} else {
|
|
@@ -154,8 +174,6 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
|
|
|
_temp.splice(index, 1);
|
|
|
|
|
|
- const menuIdsArr = _temp.map((item: any) => item.menuId);
|
|
|
- set_checkedTableMenuIds([...menuIdsArr])
|
|
|
set_checkBoxCodes([..._temp]);
|
|
|
|
|
|
}
|
|
@@ -178,14 +196,16 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
];
|
|
|
|
|
|
const getTreeReqFunc = async (hospId: string) => {
|
|
|
- const resp = await getHospOwnSys(hospId);
|
|
|
- set_treeData(resp);
|
|
|
+ if (hospId) {
|
|
|
+ const resp = await getHospOwnSys(hospId);
|
|
|
+ set_treeData(resp);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
const onSelect: TreeProps['onSelect'] = (selectedKeys, info) => {
|
|
|
//console.log('selected', selectedKeys, info);
|
|
|
- const { node } = info;
|
|
|
- set_currentSelectedTreeNode(node);
|
|
|
+ const { node }:{node:any}= info;
|
|
|
+ set_currentSelectedTreeNode({...node});
|
|
|
};
|
|
|
|
|
|
const dataList: any[] = [];
|
|
@@ -243,23 +263,96 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
generateList(treeData as any);
|
|
|
|
|
|
|
|
|
+ // const getTableData = async (params: any, sort: any, filter: any) => {
|
|
|
+ // set_drawerTablereload(false);
|
|
|
+ // if (currentSelectedTreeNode && record.hospId && record.roleId) {
|
|
|
+
|
|
|
+ // }
|
|
|
+ // return []
|
|
|
+ // }
|
|
|
+
|
|
|
const getTableData = async (params: any, sort: any, filter: any) => {
|
|
|
- //console.log({record});
|
|
|
+
|
|
|
+ set_drawerTablereload(false);
|
|
|
+ const currentHosp = localStorage.getItem('currentSelectedSubHop');
|
|
|
+
|
|
|
+ if (currentSelectedTreeNode&¤tHosp) {
|
|
|
+ const {id} = JSON.parse(currentHosp);
|
|
|
+ const resp = await getMenuRelaPerm({ hospId:id, systemId: currentSelectedTreeNode.code });
|
|
|
+ if (resp) {
|
|
|
+ const {menuList} = resp;
|
|
|
+ let expandKeys:Key[] = [];
|
|
|
+ set_hospAllMenuTree(menuList);
|
|
|
+
|
|
|
+ const getParentsIds = (data: any) => {
|
|
|
+ data.map((item: any, index: number) => {
|
|
|
+
|
|
|
+ if(item.type == 0){
|
|
|
+ expandKeys.push(item.menuId)
|
|
|
+ }
|
|
|
+
|
|
|
+ if (item.children && item.children.length != 0) {
|
|
|
+ getParentsIds(item.children);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ getParentsIds(menuList);
|
|
|
+ set_expandedRowKeys(expandKeys);
|
|
|
+
|
|
|
+ return {
|
|
|
+ data: menuList,
|
|
|
+ success: true,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ data: [],
|
|
|
+ success: true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return []
|
|
|
+ }
|
|
|
+
|
|
|
+ const setInitCheckData = async () => {
|
|
|
set_drawerTablereload(false);
|
|
|
- if (currentSelectedTreeNode&&record.hospId&&record.roleId) {
|
|
|
+ if (currentSelectedTreeNode && record.hospId && record.roleId) {
|
|
|
// console.log({params,record});
|
|
|
- const resp = await getRolePermRelaMenu({ ...params, hospId: record.hospId,roleId:record.roleId});
|
|
|
+ const resp = await getRolePermRelaMenu({hospId: record.hospId, roleId: record.roleId,systemId:currentSelectedTreeNode.code });
|
|
|
if (resp) {
|
|
|
let temp: { menuId: any; function: any; }[] = [];
|
|
|
+ let expandKeys: Key[] = [];
|
|
|
+ let selectedMenuIds:Key[] = [];
|
|
|
+ const { menuList = [],selectSystem=[] } = resp;
|
|
|
+ set_selectSystem(selectSystem);
|
|
|
+
|
|
|
+
|
|
|
+ if(currentSelectedTreeNode.type == 1){
|
|
|
+ //判断体系菜单是否授权
|
|
|
+ const needItem = selectSystem.filter((a:any)=>a.systemId == currentSelectedTreeNode.code);
|
|
|
+ if(needItem.length>0){
|
|
|
+ set_ifTixiMenuAuth(true);
|
|
|
+ }else{
|
|
|
+ set_ifTixiMenuAuth(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
const setTreeRecursion = (data: any) => {
|
|
|
data.map((item: any, index: number) => {
|
|
|
-
|
|
|
-
|
|
|
+ if (item.type == 0) {
|
|
|
+ expandKeys.push(item.menuId);
|
|
|
+ }
|
|
|
+ if(item.type == 1){
|
|
|
+ selectedMenuIds.push(item.menuId);
|
|
|
+ }
|
|
|
if (item.type == 1 && item.functionCheckList) {
|
|
|
//菜单
|
|
|
temp.push({
|
|
|
menuId: item.menuId,
|
|
|
function: item.functionCheckList
|
|
|
+
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -270,15 +363,17 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- setTreeRecursion(resp);
|
|
|
+
|
|
|
+ setTreeRecursion(menuList);
|
|
|
|
|
|
+ set_checkedMenuParentsIds([...expandKeys,...selectedMenuIds]);
|
|
|
set_checkBoxCodes(temp);
|
|
|
-
|
|
|
- set_checkedTableMenuIds(temp.map((a: any) => a.menuId));
|
|
|
- set_oldSelectedMenuIds(temp.map((a: any) => a.menuId));
|
|
|
+ set_checkedTableMenuIds(selectedMenuIds);
|
|
|
+ set_oldSelectedMenuIds(selectedMenuIds);
|
|
|
+
|
|
|
|
|
|
return {
|
|
|
- data: resp,
|
|
|
+ data: menuList,
|
|
|
success: true,
|
|
|
}
|
|
|
}
|
|
@@ -288,30 +383,39 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
}
|
|
|
}
|
|
|
return []
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
const saveResult = async () => {
|
|
|
|
|
|
- let old = oldSelectedMenuIds;
|
|
|
+ let old = [...oldSelectedMenuIds];
|
|
|
//const needCancelMenus = needCancelCheckedMenus.map(a=>({hospId: record.id ,systemId: currentSelectedTreeNode.code,function:[],menuId:a}));
|
|
|
const result = checkBoxCodes.map((item: any) => {
|
|
|
- old.splice(old.findIndex(a=>a == item.menuId),1);
|
|
|
- return { ...item, hospId: record.hospId,roleId:record.roleId,systemId: currentSelectedTreeNode.code }
|
|
|
+ old.splice(old.findIndex(a => a == item.menuId), 1);
|
|
|
+ return { ...item, hospId: record.hospId, roleId: record.roleId, systemId: currentSelectedTreeNode.code }
|
|
|
});
|
|
|
|
|
|
|
|
|
- const needCancelMenus = old.map(a => ({
|
|
|
- hospId: record.hospId,
|
|
|
+
|
|
|
+ const needCancelMenus = old.map(a => ({
|
|
|
+ hospId: record.hospId,
|
|
|
systemId: currentSelectedTreeNode.code,
|
|
|
- menuId:a,
|
|
|
- roleId:record.roleId, function: [],
|
|
|
+ menuId: a,
|
|
|
+ roleId: record.roleId, function: [],
|
|
|
}));
|
|
|
-
|
|
|
- const data = [...result, ...needCancelMenus];
|
|
|
-
|
|
|
|
|
|
- const resp = await saveRoleRelaApiPerm(result.length == 0?[{hospId: record.hospId,roleId:record.roleId,systemId: currentSelectedTreeNode.code}]:data);
|
|
|
+ console.log({checkedTableMenuIds});
|
|
|
+
|
|
|
+
|
|
|
+ const data = {
|
|
|
+ hospId: record.hospId,
|
|
|
+ roleId: record.roleId,
|
|
|
+ systemId: currentSelectedTreeNode.code,
|
|
|
+ menuIds: ifTixiMenu?(ifTixiMenuAuth?[currentSelectedTreeNode.code]:[]):[...new Set(checkedMenuParentsIds),currentSelectedTreeNode.code],
|
|
|
+ functionList: [...result, ...needCancelMenus]
|
|
|
+ };
|
|
|
+
|
|
|
+ const resp = await saveRoleRelaApiPerm(data);
|
|
|
if (resp) {
|
|
|
set_drawerTablereload(true);
|
|
|
set_checkBoxCodes([]);
|
|
@@ -334,74 +438,82 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
}
|
|
|
|
|
|
|
|
|
- const oneKeySetReadOnly = (bool:boolean)=>{
|
|
|
-
|
|
|
- if(bool){
|
|
|
- const _temp = checkBoxCodes.map((item:any)=>{
|
|
|
- const needed = item.function.filter((a:any)=>a.code == 'search');
|
|
|
- return {...item,function:needed}
|
|
|
- })
|
|
|
- set_checkBoxCodes([..._temp]);
|
|
|
- }
|
|
|
-
|
|
|
+ const clearFunction = () => {
|
|
|
+ let emptyFunc = checkBoxCodes.map((a) => ({ ...a, function: [] }));
|
|
|
+ set_checkBoxCodes(emptyFunc);
|
|
|
}
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
- if (currentSelectedTreeNode) {
|
|
|
- set_drawerTableDataFilterParams({ ...drawerTableDataFilterParams, systemId: currentSelectedTreeNode.code })
|
|
|
- }
|
|
|
+ console.log({currentSelectedTreeNode});
|
|
|
+ if (currentSelectedTreeNode && !currentSelectedTreeNode.children) {
|
|
|
|
|
|
- //切换系统清空数据
|
|
|
- set_checkBoxCodes([]);
|
|
|
- set_checkedTableMenuIds([]);
|
|
|
+ // setInitCheckData();
|
|
|
+
|
|
|
+ set_ifTixiMenu(currentSelectedTreeNode.type == 1);
|
|
|
+
|
|
|
+ setInitCheckData()
|
|
|
|
|
|
+ set_drawerTableDataFilterParams({ ...drawerTableDataFilterParams, systemId: currentSelectedTreeNode.code });
|
|
|
+ //切换系统清空数据
|
|
|
+ set_checkBoxCodes([]);
|
|
|
+ set_checkedTableMenuIds([]);
|
|
|
+ }
|
|
|
|
|
|
}, [currentSelectedTreeNode]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
//初始化左侧树结构数据后
|
|
|
-
|
|
|
if (treeData?.length > 0) {
|
|
|
|
|
|
if (treeData[0].children && treeData[0].children.length > 0) {
|
|
|
const [node, nodeParent] = getDeepestTreeData(treeData[0], 'children');
|
|
|
-
|
|
|
+ setAutoExpandParent(true);
|
|
|
set_currentSelectedTreeNode(node);
|
|
|
setExpandedKeys([nodeParent.code]);
|
|
|
}
|
|
|
}
|
|
|
}, [treeData]);
|
|
|
|
|
|
+ useEffect(()=>{
|
|
|
+ console.log({checkedMenuParentsIds});
|
|
|
+ },[checkedMenuParentsIds])
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
- getTreeReqFunc(record.hospId);
|
|
|
-
|
|
|
- }, []);
|
|
|
+ if (drawerVisible) {
|
|
|
+ getTreeReqFunc(record.hospId);
|
|
|
+ } else {
|
|
|
+ set_drawerVisible(false);
|
|
|
+ set_currentSelectedTreeNode(undefined);
|
|
|
+ set_treeData([]);
|
|
|
+ setExpandedKeys([]);
|
|
|
+ }
|
|
|
+ }, [drawerVisible]);
|
|
|
|
|
|
|
|
|
return (
|
|
|
<DrawerForm
|
|
|
trigger={
|
|
|
- <a key="link3" onClick={()=>set_drawerVisible(true)}>功能</a>
|
|
|
+ <a key="link3" onClick={() => set_drawerVisible(true)}>菜单</a>
|
|
|
}
|
|
|
drawerProps={{
|
|
|
- open:drawerVisible,
|
|
|
- afterOpenChange(open) {
|
|
|
- set_drawerVisible(open)
|
|
|
- },
|
|
|
- closable:false,
|
|
|
- extra:null
|
|
|
+ open: drawerVisible,
|
|
|
+ afterOpenChange(open) {
|
|
|
+ set_drawerVisible(open)
|
|
|
+ },
|
|
|
+ closable: false,
|
|
|
+ extra: null
|
|
|
}}
|
|
|
|
|
|
width={908}
|
|
|
submitter={false}
|
|
|
>
|
|
|
- <div className='setApiPermDrawer'>
|
|
|
+ <div className='setApiPermDrawer_roleMana'>
|
|
|
<div className='topbar'>
|
|
|
<div className='title'>{`角色功能权限设置(${record.roleName})`}</div>
|
|
|
<div className='btnGroup'>
|
|
|
+ {currentSelectedTreeNode&¤tSelectedTreeNode.type == 5 &&<span className={'clearBtn'} onClick={() => clearFunction()}>清除功能权限</span>}
|
|
|
<span className='cancel' onClick={() => onCancel()}>取消</span>
|
|
|
<span className='save' onClick={() => saveResult()}>保存</span>
|
|
|
</div>
|
|
@@ -477,33 +589,53 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
</div>
|
|
|
{/* <div style={{width:16,height:'92vh',background:'#F5F7FA'}}></div> */}
|
|
|
<div className='rightContent'>
|
|
|
- <div className='tableToolbar'>
|
|
|
- <div className='filter'>
|
|
|
- <div className='filterItem'>
|
|
|
- <span className='label'>检索:</span>
|
|
|
- <KCInput placeholder={'请输入'} style={{ width: 160 }} search allowClear
|
|
|
- onChange={(e) => {
|
|
|
- set_drawerTableDataSearchKeywords(e.target.value);
|
|
|
- if (e.target.value.length == 0) {
|
|
|
- set_drawerTableDataFilterParams({
|
|
|
- ...drawerTableDataFilterParams,
|
|
|
- name: ''
|
|
|
- });
|
|
|
- }
|
|
|
- }}
|
|
|
- onSearch={() => drawerTableDataSearchHandle('name')}
|
|
|
+ {
|
|
|
+ !ifTixiMenu&& (
|
|
|
+ <div className='tableToolbar'>
|
|
|
+ <div className='filter'>
|
|
|
+ <div className='filterItem'>
|
|
|
+ <span className='label'>检索:</span>
|
|
|
+ <KCInput placeholder={'请输入'} style={{ width: 160 }} search allowClear
|
|
|
+ onChange={(e) => {
|
|
|
+ set_drawerTableDataSearchKeywords(e.target.value);
|
|
|
+ if (e.target.value.length == 0) {
|
|
|
+ set_drawerTableDataFilterParams({
|
|
|
+ ...drawerTableDataFilterParams,
|
|
|
+ name: ''
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ onSearch={() => drawerTableDataSearchHandle('name')}
|
|
|
+
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div className={'btnGroup'}>
|
|
|
+ {/* <a style={{color: '#17181A'}}><Switch style={{position:'relative',marginRight:4}} size='small' onChange={(bool)=>oneKeySetReadOnly(bool)} />只读</a> */}
|
|
|
+ {/* <UpDataActBtn key={'act'} record={undefined} type='ADD' /> */}
|
|
|
+ </div>
|
|
|
|
|
|
- />
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
|
|
|
- <div className={'btnGroup'}>
|
|
|
- {/* <a style={{color: '#17181A'}}><Switch style={{position:'relative',marginRight:4}} size='small' onChange={(bool)=>oneKeySetReadOnly(bool)} />只读</a> */}
|
|
|
- {/* <UpDataActBtn key={'act'} record={undefined} type='ADD' /> */}
|
|
|
+ {
|
|
|
+ ifTixiMenu && <div className='tixiMenuSet'>
|
|
|
+ <img src={require('../../../../../public/images/zanwuneirong.png')} style={{ width: 100, height: 88 }} alt="" />
|
|
|
+ <div className='despcrip'>当前所选系统没有可管理的菜单/功能权限</div>
|
|
|
+ <div>授予系统权限:<Switch size='small' checked={ifTixiMenuAuth} onChange={bool=>set_ifTixiMenuAuth(bool)} /></div>
|
|
|
</div>
|
|
|
-
|
|
|
- </div>
|
|
|
- {currentSelectedTreeNode && <KCTable
|
|
|
+ }
|
|
|
+ {!ifTixiMenu && <KCTable
|
|
|
+ scroll={{ y: `calc(100vh - 150px)` }}
|
|
|
+ tableAlertRender={false}
|
|
|
+ expandable={{
|
|
|
+ expandedRowKeys: expandedRowKeys,
|
|
|
+ onExpandedRowsChange(expandedKeys) {
|
|
|
+ set_expandedRowKeys(expandedKeys as Key[])
|
|
|
+ },
|
|
|
+ }}
|
|
|
rowSelection={{
|
|
|
// 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
|
|
|
// 注释该行则默认不显示下拉选项
|
|
@@ -517,31 +649,46 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
set_checkBoxCodes([]);
|
|
|
}
|
|
|
},
|
|
|
+
|
|
|
selectedRowKeys: checkedTableMenuIds,
|
|
|
- selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],
|
|
|
+ hideSelectAll: true,
|
|
|
onSelect: (record, selected, selectedRows, nativeEvent) => {
|
|
|
//console.log({ record, selected, selectedRows, nativeEvent });
|
|
|
|
|
|
- let checkedData = checkBoxCodes;
|
|
|
+ let checkedData = [...checkBoxCodes];
|
|
|
|
|
|
if (selected) {
|
|
|
//选中
|
|
|
+ const parents = findParents(hospAllMenuTree,record.menuId);
|
|
|
+ const parentsIds = parents?parents.map(a=>a.menuId):[];
|
|
|
+
|
|
|
+ if (record.children) {
|
|
|
+ const childIds = extractAttributeValues(record, 'menuId');
|
|
|
+ console.log({parentsIds,childIds});
|
|
|
+ set_checkedMenuParentsIds([...checkedMenuParentsIds, ...childIds,...parentsIds]);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ console.log([...checkedMenuParentsIds, record.menuId,...parentsIds]);
|
|
|
+ set_checkedMenuParentsIds([...checkedMenuParentsIds, record.menuId,...parentsIds]);
|
|
|
+ }
|
|
|
+
|
|
|
selectedRows.forEach(a => {
|
|
|
if (a.functionList) {
|
|
|
checkedData.push({
|
|
|
menuId: a.menuId,
|
|
|
function: a.functionList
|
|
|
});
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
});
|
|
|
+
|
|
|
//更新表格row选中状态
|
|
|
if (record.type == 0) {
|
|
|
//选中的是目录
|
|
|
const ids = record.children.map((item: any) => item.menuId);
|
|
|
const totalData = Array.from(new Set([...checkedTableMenuIds, ...ids]));
|
|
|
-
|
|
|
+
|
|
|
set_checkedTableMenuIds([...totalData]);
|
|
|
}
|
|
|
if (record.type == 1) {
|
|
@@ -550,20 +697,27 @@ const DrawerActBtn = ({ record }: { record: any }) => {
|
|
|
|
|
|
}
|
|
|
|
|
|
- set_checkBoxCodes([...checkedData]);
|
|
|
+ set_checkBoxCodes([...uniqueFunc(checkedData, 'menuId')]);
|
|
|
+
|
|
|
|
|
|
} else {
|
|
|
|
|
|
//取消勾选\
|
|
|
- let _tempCheckedCodes = checkBoxCodes;
|
|
|
-
|
|
|
- const leftCheckedMenuIds = selectedRows.map(a=>a.menuId);
|
|
|
+ let _tempCheckedCodes = [...checkBoxCodes];
|
|
|
+
|
|
|
+ const ids = extractAttributeValues(record, 'menuId');
|
|
|
+
|
|
|
+ const filtedMenuIds = checkedMenuParentsIds.filter((a) => ![...ids, record.menuId].includes(a));
|
|
|
|
|
|
- const filtedCheckCodes = _tempCheckedCodes.filter(a=>(leftCheckedMenuIds.includes(a.menuId)));
|
|
|
+ set_checkedMenuParentsIds(filtedMenuIds);
|
|
|
+
|
|
|
+ const leftCheckedMenuIds = selectedRows.map(a => a.menuId);
|
|
|
+
|
|
|
+ const filtedCheckCodes = _tempCheckedCodes.filter(a => (leftCheckedMenuIds.includes(a.menuId)));
|
|
|
|
|
|
set_checkedTableMenuIds([...leftCheckedMenuIds]);
|
|
|
-
|
|
|
- set_checkBoxCodes([...uniqueFunc(filtedCheckCodes,'menuId')]);
|
|
|
+
|
|
|
+ set_checkBoxCodes([...uniqueFunc(filtedCheckCodes, 'menuId')]);
|
|
|
|
|
|
}
|
|
|
}
|
|
@@ -625,11 +779,9 @@ const RoleManage: FC<PageProps> = ({ roleManageModel: state, dispatch }) => {
|
|
|
<a key="link4" onClick={() => editUserBind(record)}>
|
|
|
用户
|
|
|
</a>,
|
|
|
+ <Divider key="9" type="vertical" style={{ margin: '0 1px' }} />,
|
|
|
+ <DrawerActBtn key="link7" record={record} />,
|
|
|
<Divider key="3" type="vertical" style={{ margin: '0 1px' }} />,
|
|
|
- <a key="link" onClick={() => editHandle(record)}>
|
|
|
- 编辑
|
|
|
- </a>,
|
|
|
- <Divider key="1" type="vertical" style={{ margin: '0 1px' }} />,
|
|
|
<Popconfirm
|
|
|
title="是否确定删除?"
|
|
|
onConfirm={() => delHandle(record)}
|
|
@@ -640,13 +792,12 @@ const RoleManage: FC<PageProps> = ({ roleManageModel: state, dispatch }) => {
|
|
|
>
|
|
|
<a>删除</a>
|
|
|
</Popconfirm>,
|
|
|
- <Divider key="9" type="vertical" style={{ margin: '0 1px' }} />,
|
|
|
+ <Divider key="10" type="vertical" style={{ margin: '0 1px' }} />,
|
|
|
<Dropdown key='4' menu={{
|
|
|
items: [
|
|
|
- { key:'0',label: <a key="link3" onClick={() => editMenuBind(record)}>菜单</a>},
|
|
|
- { key: '5', label: <DrawerActBtn key="link7" record={record} /> },
|
|
|
- { key: '2', label: <a key="link4" onClick={() => initRoleData('func',record)} >初始化功能</a> },
|
|
|
- { key: '6', label: <a key="link6" onClick={() => initRoleData('read',record)}>初始化只读</a> },
|
|
|
+ { key: '5', label: <a key="link" onClick={() => editHandle(record)}>编辑</a> },
|
|
|
+ { key: '2', label: <a key="link4" onClick={() => initRoleData('func', record)} >初始化权限</a> },
|
|
|
+ //{ key: '6', label: <a key="link6" onClick={() => initRoleData('read',record)}>初始化只读</a> },
|
|
|
]
|
|
|
}}>
|
|
|
<a>
|
|
@@ -658,7 +809,7 @@ const RoleManage: FC<PageProps> = ({ roleManageModel: state, dispatch }) => {
|
|
|
|
|
|
];
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
const getData = async (params: TableRequestParamsType) => {
|
|
|
const { current = 1, pageSize = 10, roleName } = params;
|
|
@@ -752,27 +903,27 @@ const RoleManage: FC<PageProps> = ({ roleManageModel: state, dispatch }) => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- const initRoleData =async (type:string,record:any) => {
|
|
|
- if(type == 'func'){
|
|
|
- const resp = await initRoleFunc({roleId:record.roleId,hospId:record.hospId});
|
|
|
- if(resp){
|
|
|
- dispatch &&
|
|
|
- dispatch({
|
|
|
- type: 'roleManageModel/reloadTable',
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- if(type == 'read'){
|
|
|
- const resp = await initRoleReadOnlyFunc({roleId:record.roleId,hospId:record.hospId});
|
|
|
- if(resp){
|
|
|
- dispatch &&
|
|
|
- dispatch({
|
|
|
- type: 'roleManageModel/reloadTable',
|
|
|
- });
|
|
|
- }
|
|
|
+ const initRoleData = async (type: string, record: any) => {
|
|
|
+ if (type == 'func') {
|
|
|
+ const resp = await initRoleFunc({ roleId: record.roleId, hospId: record.hospId });
|
|
|
+ if (resp) {
|
|
|
+ dispatch &&
|
|
|
+ dispatch({
|
|
|
+ type: 'roleManageModel/reloadTable',
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (type == 'read') {
|
|
|
+ const resp = await initRoleReadOnlyFunc({ roleId: record.roleId, hospId: record.hospId });
|
|
|
+ if (resp) {
|
|
|
+ dispatch &&
|
|
|
+ dispatch({
|
|
|
+ type: 'roleManageModel/reloadTable',
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
|
|
|
// console.log({state});
|
|
|
|
|
@@ -803,7 +954,7 @@ const RoleManage: FC<PageProps> = ({ roleManageModel: state, dispatch }) => {
|
|
|
<span className='add' onClick={addHandle}>新增</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
-
|
|
|
+
|
|
|
<KCTable
|
|
|
rowKey="roleId"
|
|
|
columns={columns}
|