mh-lcmk-sms-web/src/layout/Header.js

598 lines
17 KiB
JavaScript
Raw Normal View History

2024-07-15 09:11:59 +08:00
import React, { useState, useMemo, useEffect } from "react";
2024-05-27 09:25:22 +08:00
import { connect } from "dva";
import { withRouter } from "dva/router";
import { Dropdown, Icon, Menu, message, Button, Modal, Input } from "antd";
import { HeaderSearch as OPTSearch, PictureThumb } from "@woowalker/feui";
import ModifyPassword from "../components/MainPage/ModifyPassword";
import FoUserInfoShow from "../components/MainPage/FoUserInfoShow";
import FeedbackQuestion from "../components/MainPage/FeedbackQuestion";
import GuideCanvas from "../components/MainPage/GuideCanvas";
import IconFont from "../utils/iconFont";
2024-07-15 09:11:59 +08:00
import { initFilter, requestFullScreenMethod } from "../utils/common";
2024-05-27 09:25:22 +08:00
import config from "../config";
import "./header.less";
import Option from "./Option";
2024-07-03 11:50:29 +08:00
import RiskFourPage from "./RiskFour";
2024-07-12 16:06:46 +08:00
import FullScreenPage from "./FullScreen";
2024-05-27 09:25:22 +08:00
// 投屏
const DataV = (props) => {
const navTo = () => {
const { OrgId, Tenant, baseConfig } = props.login;
const preUrl = baseConfig.SCREEN_URL || config.dataVUrl;
const queryStr = `OrgId=${OrgId}&Tenant=${Tenant}`;
const url = `${
preUrl.indexOf("?") !== -1 ? preUrl : preUrl + "?"
}${queryStr}`;
window.open(url, "_blank");
};
return (
<span title="投屏" onClick={navTo} className="header__right-datav">
{/* <EnergyIcon type='icon-touping' className='header__right-icon' /> */}
</span>
);
};
const HeaderDataV = connect(({ login }) => ({ login }))(DataV);
// 搜索
const SearchBox = (props) => {
const [autoCompleteData, setAutoCompleteData] = useState([]);
const [inputVal, setInputVal] = useState("");
const leafMenus = useMemo(() => {
const menuForms = [];
const menuDatas = [];
function traverseChild(item) {
if (!item.Menu.Nav_MenuForm || item.ChildMenus?.length) {
item.ChildMenus.forEach((x) => {
traverseChild(x);
});
} else if (item.Menu.Nav_MenuForm) {
menuForms.push({
MenuName: item.Menu.NAME,
...item.Menu.Nav_MenuForm,
});
menuDatas.push(item);
}
}
const menus = props.login.loginInfo.Menus || [];
menus.forEach((item) => {
traverseChild(item);
});
return { menuForms, menuDatas };
}, [props.login.loginInfo?.Menus]);
/**
* 搜索菜单
* @param {*} e
*/
const handleSearchMenu = (e) => {
setInputVal(e.target.value);
if (!e.target.value || e.target.value === "") {
setAutoCompleteData([]);
return;
}
const validResult = [];
leafMenus.menuForms.forEach((item) => {
if (
item.CODE.toLowerCase().indexOf(e.target.value.toLowerCase()) >= 0 ||
item.NAME.toLowerCase().indexOf(e.target.value.toLowerCase()) >= 0 ||
item.MenuName.toLowerCase().indexOf(e.target.value.toLowerCase()) >= 0
) {
validResult.push(item);
}
});
setAutoCompleteData(validResult);
};
/**
* 选中菜单
* @param {*} e
*/
const overMenu = () => {
if (autoCompleteData.length == 0) {
return (
<Menu>
<Menu.Item key="0">暂无匹配项</Menu.Item>
</Menu>
);
} else {
return (
<Menu
// onClick={handleMenuClick}
style={{ height: "200px", overflow: "auto" }}
>
{autoCompleteData.map((item, index) => {
return (
<Menu.Item
key={index}
onClick={() => {
handleSelectMenu(item.ID);
}}
>
{item.NAME}({item.CODE})
</Menu.Item>
);
})}
</Menu>
);
}
};
const handleSelectMenu = (e) => {
const menu = leafMenus.menuDatas.find(
(item) => item.Menu.Nav_MenuForm.ID === e
);
props.dispatch({
type: "app/updateActivatedMenu",
payload: {
currActivatedTab: menu.Node.ID,
currActivatedMenu: menu.Node,
},
});
props.history.push({ pathname: `/main/${menu.Node.ID}` });
setInputVal("");
2024-07-15 09:11:59 +08:00
setAutoCompleteData([]);
2024-05-27 09:25:22 +08:00
};
if (window.navigator.userAgent.indexOf("Windows") < 1) {
return <span></span>;
} else {
return (
// <OPTSearch
// dataSource={autoCompleteData}
// onChange={handleSearchMenu}
// onSelect={handleSelectMenu}
// />
// <SearchBox
// backgroundColor="#F7F7F7" // 自定义背景色
// placeholder="请输入关键词" // 输入框提示
// hasDropdown={true} // 是否显示下拉搜索类型
// onClick={handleSelectMenu} // 点击菜单执行方法
// onClickSearch={handleSearchMenu} // 点击搜索按钮执行
// size="sm" // 大小 lg or sm
// hasBorder={false}
// lists={autoCompleteData}
// />
2024-07-15 09:11:59 +08:00
<Dropdown overlay={overMenu} placement="topLeft" trigger={["click"]}>
2024-05-27 09:25:22 +08:00
<div className="headerInput">
{/* <Search
placeholder={"请输入搜索内容"}
onSearch={handleSearchMenu}
style={{ width: 200 }}
/> */}
<Input
placeholder="搜索菜单"
2024-07-15 09:11:59 +08:00
prefix={
<Icon
type="search"
style={{ color: "#909399", fontSize: "18px" }}
/>
}
2024-05-27 09:25:22 +08:00
onChange={(e) => {
handleSearchMenu(e);
}}
onPressEnter={(e) => {
handleSearchMenu(e);
}}
value={inputVal}
/>
</div>
</Dropdown>
);
}
//return (
//
// <OPTSearch
// dataSource={autoCompleteData}
// onChange={handleSearchMenu}
// onSelect={handleSelectMenu}
// />
//)
};
const HeaderSearch = withRouter(connect(({ login }) => ({ login }))(SearchBox));
// 个人中心
const User = (props) => {
const [visible, setVisible] = useState(false);
/**
* 注销登录
*/
const handleLogout = () => {
const { OrgId, userId } = props.login;
const logJson = initFilter(OrgId, userId, "", 0, 1, 0);
props.dispatch({
type: "app/addLoginOut",
payload: logJson,
});
localStorage.removeItem("accessToken");
props.history.push({ pathname: "/login" });
};
/**
* 锁屏
*/
const handleLockScreen = () => {
localStorage.removeItem("accessToken");
props.dispatch({
type: "login/save",
payload: {
screenLocked: true,
},
});
};
/**
* 菜单选中
* @param {*} evt
*/
const handleUserMenuClick = (evt) => {
switch (evt.key) {
case "user-menu-logout":
handleLogout();
break;
case "user-menu-lockscreen":
handleLockScreen();
break;
case "user-menu-cacheclean":
window.localStorage.clear();
message.success("清除成功,即将重新加载页面", 2, () => {
setTimeout(() => window.location.reload(true), 500);
});
break;
default:
break;
}
setVisible(false);
};
const { loginInfo = {} } = props.login;
return (
<Dropdown
visible={visible}
onVisibleChange={setVisible}
overlay={
<Menu onClick={handleUserMenuClick}>
<Menu.Item key="user-menu-userinfo">
当前登录{loginInfo.User?.NAME}
</Menu.Item>
<Menu.Item key="user-menu-UserInfoShow">
<FoUserInfoShow>我的资料</FoUserInfoShow>
</Menu.Item>
<Menu.Item key="user-menu-updatepwd">
<ModifyPassword>修改密码</ModifyPassword>
</Menu.Item>
{/* <Menu.Item key='user-menu-feedbackqtn'><FeedbackQuestion>问题反馈</FeedbackQuestion></Menu.Item> */}
{/* <Menu.Item key='user-menu-lockscreen'>屏幕锁定</Menu.Item> */}
<Menu.Item key="user-menu-cacheclean">清除缓存</Menu.Item>
<Menu.Item>版本号:{config.version}</Menu.Item>
<Menu.Item key="user-menu-logout">退出登录</Menu.Item>
</Menu>
}
>
<span className="header__right-user">
<Icon type="user" className="header__right-icon" />
</span>
</Dropdown>
);
};
const HeaderUser = withRouter(connect(({ login }) => ({ login }))(User));
const GuideCodePage = (props) => {
const [showCanvas, setshowCanvas] = useState(false);
const currVans = (val) => {
setshowCanvas(true);
};
/**
* 生产单元切换
* @param {*} evt
*/
if (window.navigator.userAgent.indexOf("Windows") < 1) {
return <div></div>;
} else {
return (
<div>
<div
onClick={() => {
currVans();
}}
style={{ margin: "0px 36px", display: "flex", alignItems: "center" }}
>
<Icon type="qrcode" className="header__right-icon" />
</div>
<Modal
title=""
visible={showCanvas}
width="400px"
centered={true}
onOk={() => {
setshowCanvas(false);
}}
onCancel={() => {
setshowCanvas(false);
}}
footer={null}
>
<GuideCanvas />
</Modal>
</div>
);
}
};
const GuideCode = withRouter(
connect(({ login }) => ({ login }))(GuideCodePage)
);
2024-07-03 11:50:29 +08:00
const RiskFourColorOpton = (props) => {
const [showModal, setshowModal] = useState(false);
const escFunction = () => {
let isFull = !!(
document.fullscreen ||
document.mozFullScreen ||
document.webkitIsFullScreen ||
document.webkitFullScreen ||
document.msFullScreen
);
if (isFull) {
2024-07-15 09:11:59 +08:00
// /
} else {
2024-07-03 11:50:29 +08:00
// requestFullScreenMethod(document.body);
setshowModal(false);
}
};
useEffect(() => {
// 监听退出全屏事件 --- chrome 用 esc 退出全屏并不会触发 keyup 事件
document.addEventListener(
"webkitfullscreenchange",
escFunction
); /* Chrome, Safari and Opera */
document.addEventListener("mozfullscreenchange", escFunction); /* Firefox */
document.addEventListener(
"fullscreenchange",
escFunction
); /* Standard syntax */
document.addEventListener(
"msfullscreenchange",
escFunction
); /* IE / Edge */
return () => {
//销毁时清除监听
document.removeEventListener("webkitfullscreenchange", escFunction);
document.removeEventListener("mozfullscreenchange", escFunction);
document.removeEventListener("fullscreenchange", escFunction);
document.removeEventListener("MSFullscreenChange", escFunction);
};
}, []);
if (window.navigator.userAgent.indexOf("Windows") < 1) {
return <div></div>;
} else {
return (
<div>
<div
type="primary"
onClick={() => {
setshowModal(true);
2024-07-15 09:11:59 +08:00
requestFullScreenMethod(document.body); // 进入全屏
2024-07-03 11:50:29 +08:00
}}
2024-07-12 16:06:46 +08:00
style={{ margin: "0px 36px", display: "flex", alignItems: "center" }}
2024-07-03 11:50:29 +08:00
>
2024-07-15 09:11:59 +08:00
<Icon type="global" className="header__right-icon"></Icon>
2024-07-10 15:58:19 +08:00
{/* <IconFont
2024-07-03 11:50:29 +08:00
type="icon-line-108"
style={{ fontSize: "22px", color: "#333333", cursor: "pointer" }}
2024-07-10 15:58:19 +08:00
></IconFont> */}
2024-07-03 11:50:29 +08:00
</div>
<Modal
title="功能导航"
visible={showModal}
width="100%"
centered={true}
onOk={() => {
setshowModal(false);
}}
onCancel={() => {
setshowModal(false);
}}
className="fullScreen"
>
<RiskFourPage />
</Modal>
</div>
);
}
};
const RiskFourColor = withRouter(
connect(({ login }) => ({ login }))(RiskFourColorOpton)
);
2024-07-12 16:06:46 +08:00
const FullScreenOpton = (props) => {
const [showModal, setshowModal] = useState(false);
const getChildCount = (val) => {
setshowModal(val);
};
const [fullScreen, setFullScreen] = useState(false);
const [originResizeFunc, setOriginResizeFunc] = useState();
const escFunction = () => {
let isFull = !!(
document.fullscreen ||
document.mozFullScreen ||
document.webkitIsFullScreen ||
document.webkitFullScreen ||
document.msFullScreen
);
if (isFull) {
2024-07-15 09:11:59 +08:00
// /
} else {
2024-07-12 16:06:46 +08:00
// requestFullScreenMethod(document.body);
setshowModal(false);
}
};
useEffect(() => {
// 监听退出全屏事件 --- chrome 用 esc 退出全屏并不会触发 keyup 事件
document.addEventListener(
"webkitfullscreenchange",
escFunction
); /* Chrome, Safari and Opera */
document.addEventListener("mozfullscreenchange", escFunction); /* Firefox */
document.addEventListener(
"fullscreenchange",
escFunction
); /* Standard syntax */
document.addEventListener(
"msfullscreenchange",
escFunction
); /* IE / Edge */
return () => {
//销毁时清除监听
document.removeEventListener("webkitfullscreenchange", escFunction);
document.removeEventListener("mozfullscreenchange", escFunction);
document.removeEventListener("fullscreenchange", escFunction);
document.removeEventListener("MSFullscreenChange", escFunction);
};
}, []);
if (window.navigator.userAgent.indexOf("Windows") < 1) {
return <div></div>;
} else {
return (
<div>
<div
type="primary"
onClick={() => {
setshowModal(true);
2024-07-15 09:11:59 +08:00
requestFullScreenMethod(document.body); // 进入全屏
2024-07-12 16:06:46 +08:00
}}
>
2024-07-15 09:11:59 +08:00
<Icon type="alert" className="header__right-icon"></Icon>
2024-07-12 16:06:46 +08:00
{/* <IconFont
type="icon-line-108"
style={{ fontSize: "22px", color: "#333333", cursor: "pointer" }}
></IconFont> */}
</div>
<Modal
title="功能导航"
visible={showModal}
width="100%"
centered={true}
onOk={() => {
setshowModal(false);
}}
onCancel={() => {
setshowModal(false);
}}
className="fullScreen"
>
<FullScreenPage />
</Modal>
</div>
);
}
};
const FullScreen = withRouter(
connect(({ login }) => ({ login }))(FullScreenOpton)
);
2024-05-27 09:25:22 +08:00
const NavOpton = (props) => {
const [showModal, setshowModal] = useState(false);
const getChildCount = (val) => {
setshowModal(val);
};
if (window.navigator.userAgent.indexOf("Windows") < 1) {
return <div></div>;
} else {
return (
<div>
<div
type="primary"
onClick={() => {
setshowModal(true);
}}
>
{/* <Icon type='bars' className='header__right-icon'></Icon> */}
<IconFont
type="icon-line-108"
style={{ fontSize: "22px", color: "#909399", cursor: "pointer" }}
></IconFont>
</div>
<Modal
title="功能导航"
visible={showModal}
width="96%"
centered={true}
onOk={() => {
setshowModal(false);
}}
onCancel={() => {
setshowModal(false);
}}
className="headerModal"
>
<Option getCount={getChildCount}></Option>
</Modal>
</div>
);
}
};
const HeaderNav = withRouter(connect(({ login }) => ({ login }))(NavOpton));
function Header(props) {
const { baseConfig = {} } = props.login;
const thumbCode = baseConfig.Nav_PictureLogo
? baseConfig.Nav_PictureLogo.CODE
: "";
let isMobile = false;
if (window.navigator.userAgent.indexOf("Windows") < 1) {
isMobile = true;
}
return (
<div className={`header ${props.matchLogin ? "login" : "nologin"}`}>
<div className="header__left">
2024-06-06 08:53:33 +08:00
<PictureThumb
2024-05-27 09:25:22 +08:00
thumbCodes={thumbCode ? [thumbCode] : []}
thumbConfigs={[{ target: thumbCode }]}
defaultThumb={require("../assets/layout/header-logo.png")}
className="header__left-logo"
2024-06-06 08:53:33 +08:00
/>
2024-05-27 09:25:22 +08:00
{isMobile ? (
<span className="header__left-slogan-mobile"> </span>
) : (
<span
className={`${
props.matchLogin
? "header__left-sloganLogin"
: "header__left-slogan"
}`}
>
2024-06-06 08:53:33 +08:00
双重预防机制管控系统
2024-05-27 16:17:28 +08:00
{/*
<span style={{ color: "#c99d03" }}>SMS</span> */}
2024-05-27 09:25:22 +08:00
{baseConfig.SYS_NAME}{" "}
</span>
)}
</div>
{!props.matchLogin ? (
<div className="header__right">
2024-07-15 09:11:59 +08:00
<RiskFourColor />
2024-07-16 17:02:18 +08:00
{window.location.host == "47.122.43.22:7001" ? <FullScreen /> : ""}
2024-05-27 09:25:22 +08:00
<HeaderDataV />
<HeaderSearch />
<GuideCode />
<HeaderNav />
{/* style={{"color":"#f3eded"}} */}
<HeaderUser />
<b>
{props.login.user.NAME}({props.login.user.CODE})
</b>
</div>
) : null}
</div>
);
}
export default connect(({ login }) => ({ login }))(Header);