index.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-11-16 09:12:37
  4. * @LastEditTime: 2022-07-14 16:07:56
  5. * @LastEditors: code4eat awesomedema@gmail.com
  6. * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  7. * @FilePath: /KC-MiddlePlatform/src/pages/index/components/topBar/index.tsx
  8. */
  9. import React, { useEffect, useState } from 'react';
  10. import './style.less';
  11. import { Tooltip } from 'antd';
  12. import { LogoutOutlined, SettingOutlined } from '@ant-design/icons';
  13. import logo from '../../../public/images/kc-logo.png';
  14. import platFormMenuIcon from '../../../public/images/platformMenu.png';
  15. import tabCloseIcon from '../../../public/images/tabCloseIcon.png';
  16. import { history, useModel } from 'umi';
  17. import { Divider } from 'antd';
  18. import { addFastEntry, getUserPlatformNav } from '@/service/menu';
  19. import { NavSelecterData } from '../NavSelecter';
  20. interface TopBarType {
  21. onTabChange?: (data: TopBar.Tab[]) => void; //当tab切换时回调
  22. openedTabs: TopBar.Tab[]; //已打开的列表
  23. currentTab?: TopBar.Tab | undefined; //当前tab
  24. userPannelTabClick?: (tag: 'SETTING' | 'LOGOUT' | 'SETUSERINFO') => void;
  25. onCloseTab?: (data: TopBar.Tab) => void;
  26. onTabClick?: (data: TopBar.Tab) => void;
  27. userData?: { name: string;[key: string]: any };
  28. navData: TopBar.PanelData[];
  29. }
  30. const TopBar: React.FC<TopBarType> = (props) => {
  31. const { onTabChange, userPannelTabClick, onCloseTab, onTabClick, userData, navData,currentTab } = props;
  32. const [systemTabs, setSystemTabs] = useState<TopBar.Tab[]>([]); //已打开的tab
  33. const [currentSelectedTab, setCurrentSelectedTab] = useState<TopBar.Tab>();
  34. const [ifOpenPannel, setIfOpenPannel] = useState(false);
  35. const [arrowRotate, setArrowRotate] = useState(false);
  36. const [pageTitle, set_pageTitle] = useState('欢迎进入医管平台');
  37. const [currentActivedBlockIndex, set_currentActivedBlockIndex] = useState(0);
  38. const [panelData, set_panelData] = useState<TopBar.PanelData[]>([]);
  39. const localSavedTab = localStorage.getItem('currentSelectedTab');
  40. const currentSelectedTabFromLocal = localSavedTab ? JSON.parse(localSavedTab) : {};
  41. const _systemTabClickHandle = (item: TopBar.Tab) => {
  42. //导航栏tab点击
  43. console.log('_systemTabClickHandle',item);
  44. onTabClick && onTabClick(item);
  45. localStorage.setItem('currentSelectedTab', JSON.stringify(item));
  46. setCurrentSelectedTab(item);
  47. };
  48. const _systemListClickHandle = (data: TopBar.Tab, currentActivedBlockIndex: number, index: number, i: number) => {
  49. //导航栏系统菜单列表点击回调
  50. if (currentSelectedTab?.menuId == data.menuId) return;
  51. //临时保存衣打开过的菜单
  52. const t = localStorage.getItem('visitedTabs');
  53. if(t){
  54. let visitedTabs = JSON.parse(t);
  55. let index = visitedTabs.findIndex((t:TopBar.Tab)=>t.menuId == data.menuId);
  56. if(index == -1){
  57. visitedTabs.push(data);
  58. localStorage.setItem('visitedTabs',JSON.stringify(visitedTabs));
  59. }
  60. }else{
  61. localStorage.setItem('visitedTabs',JSON.stringify([data]));
  62. }
  63. _systemTabClickHandle(data); //触发一次tab点击
  64. set_pageTitle(panelData[currentActivedBlockIndex].child[index].name)
  65. if (panelData[currentActivedBlockIndex].child[index].child) {
  66. // console.log([...panelData[currentActivedBlockIndex].child[index].child])
  67. setSystemTabs([...panelData[currentActivedBlockIndex].child[index].child]);
  68. }
  69. setIfOpenPannel(false);
  70. };
  71. const _userPannelTabClick = (tag: 'SETTING' | 'LOGOUT') => {
  72. //用户菜单tab点击回调
  73. userPannelTabClick && userPannelTabClick(tag);
  74. };
  75. const closeTabHandle = (item: TopBar.Tab, e: React.MouseEvent) => {
  76. e.stopPropagation();
  77. let _systemTabs = [...systemTabs];
  78. let delIndex = -1;
  79. const filtered = _systemTabs.filter((t, index) => {
  80. if (t.menuId == item.menuId) {
  81. delIndex = index;
  82. }
  83. return t.menuId != item.menuId;
  84. });
  85. setSystemTabs([...filtered]);
  86. if (delIndex != 0) {
  87. _systemTabClickHandle(_systemTabs[delIndex - 1]); //自动切换为前一个tab
  88. }
  89. onTabChange && onTabChange(filtered);
  90. onCloseTab && onCloseTab(item);
  91. };
  92. const UserPannel = () => {
  93. return (
  94. <div className='userPannel'>
  95. <div className='userPannelTab' onClick={() => _userPannelTabClick('SETTING')}>
  96. <SettingOutlined />
  97. 设置
  98. </div>
  99. <div className='userPannelTab' onClick={() => _userPannelTabClick('LOGOUT')}>
  100. <LogoutOutlined />
  101. 退出
  102. </div>
  103. </div>
  104. );
  105. };
  106. const goChannelIndex = (menuData:any) => {
  107. setIfOpenPannel(false);
  108. onTabClick&&onTabClick(menuData)
  109. }
  110. const goToHome = () => {
  111. history.replace('/index');
  112. setSystemTabs([]); //清空tab导航
  113. onTabChange && onTabChange([]);
  114. setCurrentSelectedTab(undefined);
  115. set_pageTitle('欢迎进入医管平台');
  116. setIfOpenPannel(false);
  117. localStorage.removeItem('currentSelectedTab');
  118. }
  119. const goSystemIndex = (name:string)=>{
  120. if(panelData[currentActivedBlockIndex]){
  121. const result:TopBar.TypeBlock[] = panelData[currentActivedBlockIndex].child.filter(t=>(t.name == name));
  122. if(result.length>0){
  123. _systemTabClickHandle(Object.assign(result[0]))
  124. // history.push(result[0].path)
  125. }
  126. }
  127. }
  128. const openNav = () => {
  129. setIfOpenPannel(!ifOpenPannel);
  130. }
  131. const reSetNav = (_panelData: TopBar.PanelData[], cur: TopBar.Tab) => {
  132. if (!(_panelData.length > 0)) return
  133. if (JSON.stringify(cur) != '{}') {
  134. let blockIndex = 0;
  135. let channelIndex = 0;
  136. const _currentSelectedTabFromLocal = cur;
  137. one: for (let index = 0; index < _panelData.length; index++) {
  138. blockIndex = index;
  139. if (_panelData[index] && _panelData[index].child) {
  140. two: for (let i = 0; i < _panelData[index].child.length; i++) {
  141. channelIndex = i;
  142. if (_panelData && _panelData.length > 0) {
  143. const _systems = _panelData[index].child[i].child;
  144. if (_systems && _systems.length > 0) {
  145. for (let k = 0; k < _systems.length; k++) {
  146. if (_systems[k].menuId == _currentSelectedTabFromLocal.menuId) {
  147. set_currentActivedBlockIndex(blockIndex);
  148. set_pageTitle(_panelData[blockIndex].child[channelIndex].name); //设置体系标题
  149. break one;
  150. }
  151. }
  152. }
  153. }
  154. }
  155. }
  156. }
  157. if (_panelData && _panelData.length > 0 && _panelData[blockIndex].child) {
  158. setSystemTabs(_panelData[blockIndex].child[channelIndex].child); //恢复体系列表
  159. }
  160. _systemTabClickHandle(_currentSelectedTabFromLocal); //恢复选中的tab
  161. }
  162. }
  163. useEffect(() => {
  164. if (currentSelectedTabFromLocal) {
  165. reSetNav(navData, currentSelectedTabFromLocal);
  166. }
  167. set_panelData(navData);
  168. }, [navData])
  169. useEffect(()=>{
  170. if(currentTab)reSetNav(panelData,currentTab);
  171. },[currentTab]);
  172. // useEffect(()=>{
  173. // if(currentSelectedSys){
  174. // onTabClickHandle(currentSelectedSys);
  175. // }
  176. // },[currentSelectedSys])
  177. useEffect(() => {
  178. _systemTabClickHandle(currentSelectedTabFromLocal); //恢复选中的tab
  179. document.body.addEventListener('click', (e:any) => {
  180. const classes = ['panel', 'left','typeBlockIcon', 'typeBlock', 'active', 'right', 'row', 'rowDetai', 'channelName', 'channelList', 'systemTab', 'channelIcon'];
  181. if (e.target) {
  182. if (classes.includes(e.target.className)) {
  183. return
  184. }
  185. }
  186. setIfOpenPannel(false);
  187. });
  188. }, []);
  189. return (
  190. <div className='topBar' onClick={e => e.stopPropagation()}>
  191. <div className='logoWrap'>
  192. <img className='logo' src={logo} onClick={() => goToHome()} />
  193. <Divider type="vertical" style={{ background: 'white', height: 16, opacity: 0.29, position: 'relative', top: 1, marginLeft: 24, marginRight: 8 }} />
  194. <div className='menu' onClick={() => openNav()}>
  195. <img src={require('../../../public/images/menu.png')} alt="" />
  196. </div>
  197. <span className='systemTitle' onClick={()=>goSystemIndex(pageTitle)}>{pageTitle}</span>
  198. </div>
  199. <div className='userRelaInfoWrap'>
  200. <>
  201. {/**
  202. * 已打开的tab
  203. */}
  204. <div className='tabWrap'>
  205. {systemTabs&&systemTabs.map((item, index) => (
  206. <div key={index} className={currentSelectedTab?.menuId == item.menuId ? `tab on` : `tab`} onClick={() => _systemTabClickHandle(item)}>
  207. <div className='tabText'>{item.name} </div>
  208. <div className='closeIconWrap'>
  209. <img src={tabCloseIcon} onClick={(e) => closeTabHandle(item, e)} />
  210. </div>
  211. </div>
  212. ))}
  213. </div>
  214. </>
  215. {/* <div className='notification'>
  216. <img className='notificationIcon' src={require('../../../public/images/notificationIcon.png')} />
  217. </div> */}
  218. <Tooltip title={<UserPannel />} color="#fff" onVisibleChange={(visible) => setArrowRotate(visible)}>
  219. <div className='user'>
  220. <img className='avator' src={require('../../../public/images/Mask.png')} />
  221. <span className='name'>{userData?.name}</span>
  222. <img className={arrowRotate ? `arrow on` : `arrow`} src={require('../../../public/images/arrow_white.png')} />
  223. </div>
  224. </Tooltip>
  225. </div>
  226. {
  227. ifOpenPannel && (
  228. <div className='panel' onClick={e => e.stopPropagation()}>
  229. <div className='left'>
  230. {
  231. panelData.map((item, index) => {
  232. return (
  233. <div className={currentActivedBlockIndex == index ? `typeBlock active` : `typeBlock`} key={index} onClick={() => set_currentActivedBlockIndex(index)}>
  234. <img className='typeBlockIcon' src={item?.icon} alt="" />
  235. <span>{item.name}</span>
  236. </div>
  237. )
  238. })
  239. }
  240. </div>
  241. <div className='right'>
  242. {
  243. panelData.length > 0 && panelData[currentActivedBlockIndex] && panelData[currentActivedBlockIndex].child && panelData[currentActivedBlockIndex].child.map((item, index: number) => {
  244. return (
  245. <div className='row' key={index}>
  246. <img className='channelIcon' src={require('../../../public/images/zhilianganquan.png')} alt="" />
  247. <div className='rowDetail'>
  248. <div className='channelName' onClick={() => goChannelIndex(item)}>{item.name}</div>
  249. <div className='channelList'>
  250. {
  251. item.child && item.child.length > 0 && item.child.map((val, i: number) => {
  252. return (
  253. <div className={currentSelectedTab?.menuId == val.menuId ? 'systemTab on' : 'systemTab'} key={i} onClick={() => _systemListClickHandle(val, currentActivedBlockIndex, index, i)}>{val.name}</div>
  254. )
  255. })
  256. }
  257. </div>
  258. </div>
  259. </div>
  260. )
  261. })
  262. }
  263. </div>
  264. </div>
  265. )
  266. }
  267. </div>
  268. );
  269. };
  270. export default TopBar;