{"version":3,"sources":["auth/AuthContext.ts","api/http.ts","api/account.ts","auth/AuthRoute.tsx","components/auth/Container.tsx","components/auth/styledFormContainer.tsx","components/auth/styledFormHeader.tsx","components/auth/styledFormFieldWrapper.tsx","store/UserContext.ts","components/auth/LoginFormContainer.tsx","views/LoginView.tsx","components/Nav/NavItem.tsx","components/Nav/Nav.tsx","components/EnergyLogo/types.ts","components/EnergyLogo/Wrapper.tsx","components/EnergyLogo/Logo.tsx","components/Nav/EnergyNav.tsx","components/Nav/MobileNavItem.tsx","components/Nav/EnergyMobileNav.tsx","store/MonitoringContext.ts","api/monitoring.ts","theme.ts","components/Monitoring/DeviceMDDStatus.tsx","components/Monitoring/DeviceCard.tsx","components/Monitoring/DevicesList.tsx","components/Monitoring/Chart.tsx","components/Monitoring/ChannelsTable.tsx","components/Empty.tsx","components/Map/YandexMap.ts","components/Map/templates.ts","components/Map/PositionMarker.tsx","components/Monitoring/MapComponent.tsx","components/Monitoring/MobileChart.tsx","components/Monitoring/ChannelCard.tsx","views/styled/ViewContainer.tsx","views/styled/Dashboard.tsx","components/Monitoring/ShortCircuits.tsx","views/MonitoringView.tsx","api/swr/useRequest.ts","components/Report/DeviceReportCard.tsx","api/report.ts","views/ReportView.tsx","App.tsx","serviceWorker.ts","dayjsru.ts","index.tsx"],"names":["AuthContext","React","createContext","isLoggedIn","logout","login","axiosInstance","axios","create","baseURL","process","interceptors","response","use","error","status","Promise","reject","localStorage","removeItem","window","location","reload","UserRoles","AuthRoute","Component","component","isAuthenticated","isPublic","rest","render","props","to","pathname","state","from","Wrapper","styled","width","height","display","flexDirection","justifyContent","alignItems","backgroundColor","Container","children","FormContainer","boxSizing","FormHeader","textAlign","marginBottom","fontWeight","flexWrap","FormFieldWrapper","marginTop","loginForm","a","http","post","data","getUser","get","UserContext","setUser","LoginSchema","Yup","shape","UserName","required","Password","Logo","LoginFormContainer","authContext","useContext","userContext","theme","useTheme","useStyletron","css","values","actions","user","setItem","Token","setSubmitting","Typography","gutterBottom","variant","src","validateOnBlur","validationSchema","initialValues","onSubmit","TextField","name","label","className","spacing","type","Button","color","disableElevation","fullWidth","size","LoginView","StyledLink","Link","match","blue","textDecoration","fontSize","transition","outline","NavItemWrapper","lineHeight","marginRight","NavLeft","flex","NavRight","NavItem","title","activeOnlyWhenExact","path","exact","NavWrapper","zIndex","position","right","left","borderBottom","Nav","sizes","xsmall","small","medium","large","xlarge","Span","userSelect","fill","top","svg","dangerouslySetInnerHTML","__html","defaultProps","useStyles","makeStyles","createStyles","orange","palette","getContrastText","amber","logoWrapper","minWidth","EnergyNav","useState","anchorEl","setAnchorEl","classes","handleLogout","event","Popper","open","Boolean","placement","role","undefined","disablePortal","TransitionProps","Fade","Paper","MenuList","autoFocusItem","id","MenuItem","onClick","ClickAwayListener","onClickAway","currentTarget","disableRipple","endIcon","Avatar","slice","MobileNavItem","LogoWrapper","Hamburger","MobileMenu","bottom","MenuBody","EnergyMobileNav","isOpen","setIsOpen","onHamburgerClick","monitoringReducer","action","devices","payload","selectedDevice","selectedChannels","Error","DeviceStatus","MDDStatus","ChannelStatus","ChannelType","MonitoringContext","dispatch","getDevices","getChartData","deviceId","averaging","startDt","endDt","params","getShortCircuitEvents","createMuiTheme","primary","main","shadows","MuiButtonBase","centerRipple","DeviceMDDStatus","device","Undefined","Chip","Hi","success","info","green","border","statuses","Warning","warning","icon","Emergency","red","WrongData","Outdated","grey","DeviceCard","isSelected","Card","common","white","divider","CardActionArea","CardContent","Address","AlarmChannelsCount","deviceStatus","Status","Normal","Tooltip","toString","Icon","getStatusTagForDevice","Comment","Body","padding","overflow","DevicesList","onSelectDevice","Toolbar","map","Id","colors","chartData","ChartChannelData","filter","x","includes","i","Name","Values","y","j","Timestamps","toFixed","getChartOptions","currentZoom","onZoom","chart","stacked","events","zoomed","chartContext","xaxis","yaxis","min","max","legend","show","_x","stroke","plotOptions","bar","columnWidth","labels","rotate","formatter","value","dayjs","format","tooltip","enabled","axisTicks","axisBorder","style","numberValue","Number","Unit","isInteger","text","ChartWrapper","zoom","setZoom","setCurrentZoom","chartOptions","setChartOptions","chartSeries","setChartSeries","chartRef","useRef","useEffect","ref","options","series","container","ChannelsTable","onChannelClick","getStatusTagForChannel","channelStatus","WarningHigh","WarningLow","EmergencyHigh","EmergencyLow","Fragment","TableContainer","Table","TableHead","TableRow","TableCell","align","TableBody","Channels","row","Checkbox","checked","scope","Value","Timestamp","AlarmStatus","IsWorking","EmptyContainer","Empty","SET_BOUNDS_DEFAULT_OPTIONS","checkZoomRange","zoomMargin","YandexMap","ymapsAPI","element","mapLayer","clusterer","this","Map","controls","typeSelector","createTypeSelectorControl","add","zoomControl","createZoomControl","Clusterer","hasBalloon","clusterIconLayout","clusterIconPieChartRadius","clusterIconPieChartCoreRadius","clusterIconPieChartStrokeWidth","clusterBalloonLeftColumnWidth","clusterDisableClickZoom","geoObjects","mapType","getItem","setType","getType","destroy","positionMarker","remove","track","callback","layer","indexOf","bounds","setBounds","center","setCenter","getZoom","getBounds","getCenter","layers","layersBounds","layerBounds","push","util","fromBounds","fitToViewport","addOsmMapType","addYandexMapType","control","TypeSelector","mapTypes","panoramasItemMode","osmMapType","MapType","storage","Layer","projection","sphericalMercator","getCopyrights","vow","resolve","getZoomRange","ZoomControl","PositionMarker","clickHandler","ymaps","createPlacemark","target","properties","getAll","geometry","getCoordinates","isLayerOnMap","addLayerToClusterer","removeLayerFromClusterer","template","templateLayoutFactory","createClass","placemarkColor","needLabel","IconSize","Color","clusterCaption","balloonContentBody","ReactDOMServer","renderToStaticMarkup","iconLayout","iconContentLayout","createLayout","templates","iconColor","iconContentSize","iconImageHref","iconImageSize","iconImageOffset","Placemark","Latitude","Longitude","MapContainer","devicesMarkers","MapComponent","ymap","current","maxZoom","forEach","hide","markers","marker","MobileChartWrapper","chartChannelData","isMobile","group","toolbar","followCursor","fontFamily","tickAmount","innerWidth","ChannelCard","channel","channelChartData","elevation","paddingBottom","replace","Grid","justify","item","xs","MobileChart","ViewContainer","Dashboard","paddingTop","ShortCircuits","isFullscreen","chartWidth","shortCircuits","setShortCircuits","currentShortCircuits","setCurrentShortCircuits","loadShortCircuitsData","length","StartDt","EndDt","minHeight","Chart","innerHeight","SettingsItem","marginLeft","configResponsive","middle","Fullscreen","ObjectPanel","DevicesPanel","withYMaps","useSize","chartDimensions","mode","setMode","responsive","useResponsive","setStartDt","setEndDt","setAveraging","tab","setTab","request","initialData","config","useSWR","JSON","stringify","statusText","headers","isValidating","revalidate","useRequest","Authorization","method","url","refreshInterval","setChartData","loadChartData","toISOString","useFullscreen","setFull","exitFull","fullscreenRef","sidePanelVisible","setSidePanelVisible","onStartDateChange","date","onEndDateChange","handleSelectAveraging","getChartSettings","FormControl","InputLabel","Select","labelId","onChange","DateTimePicker","inputVariant","disableFuture","ampm","clearable","onClose","visible","mask","Tabs","indicatorColor","textColor","_","newTab","Tab","find","paddingRight","xor","DeviceReportCard","reportDevice","onChannelsChange","channels","FormControlLabel","e","channelId","channelReportSettings","filename","responseType","download","DownloadButton","Block","ReportView","setDevices","reportDevices","setReportDevices","onReportDeviceChange","has","delete","set","loadData","Array","reduce","acc","address","translit","CyrillicToTranslit","transform","getReport","toDate","ReportSettings","ChannelIds","AppContainer","App","setIsLoggedIn","useReducer","defaults","loadInitialData","Provider","query","apikey","load","preload","enterprise","MonitoringView","hostname","monthStandalone","split","monthShortStandalone","relativeTimeWithPlural","number","withoutSuffix","key","mm","hh","dd","MM","yy","word","num","forms","plural","locale","weekdays","weekdaysShort","weekdaysMin","months","monthsShort","weekStart","formats","LT","LTS","L","LL","LLL","LLLL","relativeTime","future","past","s","m","h","d","M","ordinal","n","engine","Styletron","ReactDOM","overrides","LightTheme","StrictMode","CssBaseline","ThemeProvider","utils","DayjsUtils","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","console","message"],"mappings":"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","file":"static/js/main.fded45c8.chunk.js","sourcesContent":["import React from \"react\";\r\n\r\nexport const AuthContext = React.createContext({\r\n isLoggedIn: false,\r\n logout: () => {},\r\n login: () => {}\r\n });","import axios, { AxiosInstance } from \"axios\";\r\n\r\nconst axiosInstance: AxiosInstance = axios.create({\r\n baseURL: process.env.REACT_APP_API_URL,\r\n});\r\n\r\naxiosInstance.interceptors.response.use(\r\n (response) => {\r\n return response;\r\n },\r\n (error) => {\r\n if (error.response.status !== 401) {\r\n return Promise.reject(error);\r\n }\r\n\r\n localStorage.removeItem(\"token\");\r\n window.location.reload();\r\n }\r\n);\r\n\r\nexport default axiosInstance;\r\n","import http from \"./http\";\r\n\r\nexport interface ILoginForm {\r\n UserName: string;\r\n Password: string;\r\n}\r\n\r\nexport enum UserRoles {\r\n Dispatcher = 0,\r\n Manager = 1,\r\n Admin = 2,\r\n}\r\n\r\nexport interface IUser {\r\n UserName: string;\r\n Trust: number | null;\r\n Role: UserRoles;\r\n Token: string;\r\n}\r\n\r\nexport async function login(loginForm: ILoginForm) {\r\n const { data } = await http.post(\"/users/login\", loginForm);\r\n return data;\r\n}\r\n\r\nexport async function getUser() {\r\n const { data } = await http.get(\"/users\");\r\n return data;\r\n}\r\n","import {\r\n Route,\r\n Redirect,\r\n RouteProps,\r\n} from \"react-router-dom\";\r\nimport React from \"react\";\r\n\r\ninterface AuthRouteProps extends RouteProps {\r\n component: React.ComponentType;\r\n isPublic?: boolean;\r\n isAuthenticated?: boolean;\r\n}\r\n\r\nconst AuthRoute: React.FC = ({\r\n component: Component,\r\n isAuthenticated = false,\r\n isPublic = false,\r\n ...rest\r\n}) => {\r\n return (\r\n \r\n isAuthenticated && !isPublic ? (\r\n \r\n ) : isAuthenticated && isPublic ? (\r\n \r\n ) : isPublic ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n />\r\n );\r\n};\r\n\r\nexport default AuthRoute;","import React from \"react\";\r\nimport { styled } from \"baseui\";\r\n\r\nconst Wrapper = styled(\"div\", {\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n backgroundColor: \"#ffffff\",\r\n});\r\n\r\nconst Container: React.FC = ({ children }) => {\r\n return {children};\r\n};\r\n\r\nexport default Container;\r\n","import { styled } from \"baseui\";\r\n\r\nconst FormContainer = styled(\"div\", {\r\n \"@media (max-width: 1000px)\": {\r\n width: \"90%\",\r\n },\r\n width: \"350px\",\r\n backgroundColor: \"#ffffff\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n boxSizing: \"border-box\",\r\n});\r\n\r\nexport default FormContainer;\r\n","import { styled } from \"baseui\";\r\n\r\nconst FormHeader = styled(\"div\", {\r\n textAlign: \"left\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n marginBottom: \"12px\",\r\n fontWeight: 700,\r\n alignItems: \"center\",\r\n flexWrap: \"nowrap\",\r\n});\r\n\r\nexport default FormHeader;\r\n","import { styled } from \"baseui\";\r\n\r\nconst FormFieldWrapper = styled(\"div\", {\r\n marginTop: \"24px\",\r\n\r\n \"&:first-child\": {\r\n marginTop: \"0\",\r\n },\r\n});\r\n\r\nexport default FormFieldWrapper;\r\n","import React from \"react\";\r\nimport { IUser } from \"../api/account\";\r\n\r\ninterface IUserContext {\r\n user?: IUser;\r\n setUser: React.Dispatch>;\r\n}\r\n\r\nexport const UserContext = React.createContext({\r\n setUser: () => {}\r\n});\r\n","import { useStyletron, styled } from \"baseui\";\r\nimport React from \"react\";\r\nimport { Formik, FormikHelpers, Field, Form } from \"formik\";\r\nimport { useContext } from \"react\";\r\nimport FormContainer from \"./styledFormContainer\";\r\nimport FormHeader from \"./styledFormHeader\";\r\nimport FormFieldWrapper from \"./styledFormFieldWrapper\";\r\nimport * as Yup from \"yup\";\r\nimport { AuthContext } from \"../../auth/AuthContext\";\r\nimport { ILoginForm, login } from \"../../api/account\";\r\nimport { UserContext } from \"../../store/UserContext\";\r\nimport { Typography, useTheme, Button } from \"@material-ui/core\";\r\nimport { TextField } from \"formik-material-ui\";\r\n\r\nconst LoginSchema = Yup.object().shape({\r\n UserName: Yup.string().required(\"Имя пользователя не может быть пустым\"),\r\n Password: Yup.string().required(\"Пароль не может быть пустым\"),\r\n});\r\n\r\nconst Logo = styled(\"img\", {\r\n width: \"33%\",\r\n marginBottom: \"0.5rem\",\r\n});\r\n\r\nconst LoginFormContainer: React.FC = () => {\r\n const authContext = useContext(AuthContext);\r\n const userContext = useContext(UserContext);\r\n const theme = useTheme();\r\n const [css] = useStyletron();\r\n\r\n async function onSubmit(values: ILoginForm, actions: FormikHelpers) {\r\n const user = await login(values);\r\n localStorage.setItem(\"token\", user.Token);\r\n userContext.setUser(user);\r\n authContext.login();\r\n actions.setSubmitting(false);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Вход\r\n \r\n \r\n \r\n \r\n {() => (\r\n
\r\n \r\n \r\n \r\n \r\n Войти\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default LoginFormContainer;\r\n","import React from \"react\";\r\nimport Container from \"../components/auth/Container\";\r\nimport LoginFormContainer from \"../components/auth/LoginFormContainer\";\r\n\r\nconst LoginView: React.FC = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LoginView;\r\n","import React from \"react\";\r\nimport { styled } from \"baseui\";\r\nimport { Link, Route } from \"react-router-dom\";\r\nimport { blue } from \"@material-ui/core/colors\";\r\n\r\ninterface MenuItemProps {\r\n title: string;\r\n to: string;\r\n activeOnlyWhenExact: boolean;\r\n}\r\n\r\ninterface StyledLinkProps {\r\n match: boolean;\r\n}\r\n\r\nconst StyledLink = styled(Link, (props) => ({\r\n color: props.match ? blue[600] : blue[900],\r\n boxSizing: \"border-box\",\r\n textDecoration: \"none\",\r\n fontWeight: 500,\r\n fontSize: \"14px\",\r\n transition: \"all 150ms ease\",\r\n outline: \"none !important\",\r\n \"&:hover\": {\r\n color: `${blue[400]} !important`,\r\n textDecoration: \"none\",\r\n },\r\n}));\r\n\r\nconst NavItemWrapper = styled(\"div\", {\r\n boxSizing: \"border-box\",\r\n lineHeight: \"60px\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n display: \"flex\",\r\n marginRight: \"32px\",\r\n});\r\n\r\nexport const NavLeft = styled(\"div\", {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-start\",\r\n flex: \"1 1 auto\",\r\n});\r\n\r\nexport const NavRight = styled(\"div\", {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n flex: \"1 1 auto\",\r\n});\r\n\r\nconst NavItem: React.FunctionComponent = ({ to, title, activeOnlyWhenExact, children }) => {\r\n return (\r\n \r\n \r\n {({ match }: { match: boolean }) => (\r\n \r\n {title}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport { NavItemWrapper };\r\nexport default NavItem;\r\n","import React from \"react\";\r\nimport { styled } from \"baseui\";\r\n\r\ninterface Props {}\r\n\r\nconst NavWrapper = styled(\"div\", {\r\n display: \"flex\",\r\n backgroundColor: \"#ffffff\",\r\n zIndex: 1000,\r\n position: \"fixed\",\r\n right: \"0\",\r\n left: \"0\",\r\n borderBottom: \"1px solid #d3dae6\",\r\n});\r\n\r\nconst Nav: React.FC = (props) => {\r\n return {props.children};\r\n};\r\n\r\nexport default Nav;\r\n","export type Props = {\r\n size?: \"xsmall\" | \"small\" | \"medium\" | \"large\" | \"xlarge\";\r\n};\r\n\r\nexport const DefaultProps: Partial = {\r\n size: \"medium\"\r\n};\r\n\r\nexport type WrapperProps = Props & {\r\n svg: string;\r\n};\r\n\r\nexport const sizes: { [key: string]: number } = {\r\n xsmall: 16,\r\n small: 24,\r\n medium: 32,\r\n large: 40,\r\n xlarge: 48\r\n};\r\n","import React from \"react\";\r\nimport { styled } from \"baseui\";\r\nimport { WrapperProps, sizes } from \"./types\";\r\n\r\ntype SpanProps = Partial;\r\n\r\nconst Span = styled(\"span\", (props) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n height: props.size && sizes[props.size] + \"px\",\r\n position: \"relative\",\r\n userSelect: \"none\",\r\n \"> svg\": {\r\n fill: \"inherit\",\r\n height: \"100%\",\r\n left: \"0\",\r\n position: \"absolute\",\r\n top: \"0\",\r\n width: \"100%\",\r\n },\r\n}));\r\n\r\nconst Wrapper = ({ svg, ...rest }: WrapperProps) => (\r\n \r\n);\r\n\r\nexport default Wrapper;\r\n","import React from \"react\";\r\nimport Wrapper from \"./Wrapper\";\r\nimport { DefaultProps, Props } from \"./types\";\r\n\r\nconst svg = `\r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n`;\r\n\r\nconst Logo: React.FC = (props) => {\r\n return ;\r\n};\r\n\r\nLogo.defaultProps = DefaultProps;\r\n\r\nexport default Logo;\r\n","import React, { useContext } from \"react\";\r\nimport NavItem, { NavLeft, NavRight, NavItemWrapper } from \"./NavItem\";\r\nimport Nav from \"./Nav\";\r\nimport { EnergyLogo } from \"../EnergyLogo\";\r\nimport { UserContext } from \"../../store/UserContext\";\r\nimport { AuthContext } from \"../../auth/AuthContext\";\r\nimport { amber } from \"@material-ui/core/colors\";\r\nimport { makeStyles, createStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { Avatar, MenuItem, Popper, Paper, ClickAwayListener, MenuList, Fade, Button } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n orange: {\r\n color: theme.palette.getContrastText(amber[500]),\r\n backgroundColor: amber[500],\r\n },\r\n logoWrapper: {\r\n minWidth: 150,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n marginRight: 32,\r\n },\r\n })\r\n);\r\n\r\nconst EnergyNav: React.FC = () => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const userContext = useContext(UserContext);\r\n const authContext = useContext(AuthContext);\r\n const classes = useStyles();\r\n\r\n function handleLogout(event: React.MouseEvent) {\r\n authContext.logout();\r\n setAnchorEl(null);\r\n }\r\n\r\n function handleClick(event: React.MouseEvent) {\r\n setAnchorEl(event.currentTarget);\r\n }\r\n\r\n function handleClose() {\r\n setAnchorEl(null);\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default EnergyNav;\r\n","import React from \"react\";\r\nimport { styled } from \"baseui\";\r\nimport { Link, Route } from \"react-router-dom\";\r\n\r\ninterface MenuItemProps {\r\n title: string;\r\n to: string;\r\n activeOnlyWhenExact: boolean;\r\n}\r\n\r\ninterface StyledLinkProps {\r\n match: boolean;\r\n}\r\n\r\nconst StyledLink = styled(Link, {\r\n color: \"rgba(0, 0, 0, 0.85)\",\r\n boxSizing: \"border-box\",\r\n textDecoration: \"none\",\r\n fontWeight: 500,\r\n fontSize: \"14px\",\r\n transition: \"all 150ms ease\",\r\n outline: \"none !important\",\r\n width: \"100%\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n});\r\n\r\nconst NavItemWrapper = styled(\"div\", {\r\n boxSizing: \"border-box\",\r\n lineHeight: \"60px\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n display: \"flex\",\r\n});\r\n\r\nconst MobileNavItem: React.FunctionComponent = ({ to, title, activeOnlyWhenExact, children }) => {\r\n return (\r\n \r\n \r\n {({ match }: { match: boolean }) => (\r\n \r\n {title}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default MobileNavItem;\r\n","import React, { useContext, useState } from \"react\";\r\nimport { styled } from \"baseui\";\r\nimport { EnergyLogo } from \"../EnergyLogo\";\r\nimport { UserContext } from \"../../store/UserContext\";\r\nimport { AuthContext } from \"../../auth/AuthContext\";\r\nimport MobileNavItem from \"./MobileNavItem\";\r\n\r\nconst LogoWrapper = styled(\"div\", {\r\n width: \"150px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n height: \"60px\",\r\n});\r\n\r\nconst Nav = styled(\"div\", {\r\n height: \"60px\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n backgroundColor: \"#ffffff\",\r\n zIndex: 1000,\r\n position: \"fixed\",\r\n right: \"0\",\r\n left: \"0\",\r\n borderBottom: \"1px solid #d3dae6\",\r\n});\r\n\r\nconst Hamburger = styled(\"div\", {\r\n height: \"60px\",\r\n width: \"60px\",\r\n zIndex: 1000,\r\n position: \"fixed\",\r\n right: \"0\",\r\n top: \"0\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n});\r\n\r\nconst MobileMenu = styled(\"div\", {\r\n height: \"100%\",\r\n width: \"100%\",\r\n zIndex: 1000,\r\n backgroundColor: \"#ffffff\",\r\n position: \"fixed\",\r\n top: \"0\",\r\n bottom: \"0\",\r\n left: \"0\",\r\n right: \"0\",\r\n});\r\n\r\nconst MenuBody = styled(\"div\", {\r\n height: \"calc(100% - 60px)\",\r\n width: \"100%\",\r\n});\r\n\r\nconst MenuItem = styled(\"div\", {\r\n color: \"rgba(0, 0, 0, 0.85)\",\r\n width: \"100%\",\r\n lineHeight: \"60px\",\r\n fontWeight: 500,\r\n fontSize: \"14px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n});\r\n\r\nconst EnergyMobileNav: React.FC = () => {\r\n const userContext = useContext(UserContext);\r\n const authContext = useContext(AuthContext);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n function handleLogout() {\r\n authContext.logout();\r\n }\r\n\r\n function onHamburgerClick() {\r\n setIsOpen(!isOpen);\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default EnergyMobileNav;\r\n","import React from \"react\";\r\nimport { IDevice } from \"../api/monitoring\";\r\n\r\nexport interface State {\r\n devices?: IDevice[];\r\n selectedDevice?: IDevice;\r\n selectedChannels?: number[];\r\n}\r\n\r\nexport type Action =\r\n | { type: \"devices/loaded\"; payload: { devices?: IDevice[] } }\r\n | { type: \"devices/selected\"; payload: { selectedDevice?: IDevice } }\r\n | { type: \"channels/selected\"; payload: { selectedChannels?: number[] } };\r\n\r\nexport function monitoringReducer(state: State, action: Action): State {\r\n switch (action.type) {\r\n case \"devices/loaded\":\r\n return { ...state, devices: action.payload.devices };\r\n case \"devices/selected\":\r\n return { ...state, selectedDevice: action.payload.selectedDevice };\r\n case \"channels/selected\":\r\n return { ...state, selectedChannels: action.payload.selectedChannels };\r\n default:\r\n throw new Error();\r\n }\r\n}\r\n\r\ninterface IMonitoringContext {\r\n state: State;\r\n dispatch: React.Dispatch;\r\n}\r\n\r\nexport const MonitoringContext = React.createContext({\r\n state: {},\r\n dispatch: () => {},\r\n});\r\n","import http from \"./http\";\r\n\r\nexport enum DeviceStatus {\r\n Undefined = -2,\r\n WrongData = -1,\r\n Normal = 0,\r\n Warning = 1,\r\n Emergency = 2,\r\n Outdated = 3,\r\n}\r\n\r\nexport enum MDDStatus {\r\n Undefined,\r\n Hi,\r\n Ok,\r\n}\r\n\r\nexport interface IDevice {\r\n Id: number;\r\n Phone: string;\r\n Comment: string;\r\n Address: string;\r\n StatusId: number;\r\n Status: DeviceStatus;\r\n MDDStatus: MDDStatus;\r\n AlarmChannelsCount: number;\r\n Latitude: number | null;\r\n Longitude: number | null;\r\n Trust: number | null;\r\n Channels: IChannel[];\r\n}\r\n\r\nexport enum ChannelStatus {\r\n WrongData = -1,\r\n Normal = 0,\r\n EmergencyLow = 1,\r\n WarningLow = 2,\r\n WarningHigh = 3,\r\n EmergencyHigh = 4,\r\n}\r\n\r\nexport enum ChannelType {\r\n AnalogChannel = 0,\r\n DiscreteChannel = 1,\r\n}\r\n\r\nexport interface IChannel {\r\n Id: number;\r\n Name: string;\r\n ShowChannel: boolean;\r\n CheckAlarm: boolean;\r\n Timestamp: Date | string | undefined;\r\n Value: number | null;\r\n AlarmStatus: ChannelStatus | null;\r\n ChannelType: ChannelType;\r\n IsWorking: boolean;\r\n UseFixed: boolean;\r\n DigitsAfterDecimalPoint: number;\r\n BinaryValue0: string;\r\n BinaryValue1: string;\r\n Unit: string;\r\n}\r\n\r\nexport interface IChartChannelData {\r\n Id: number;\r\n Name: string;\r\n ChannelType: ChannelType;\r\n Timestamps: string[];\r\n Values: number[];\r\n Unit: string;\r\n FormattedValues: string[];\r\n}\r\n\r\nexport interface IChartData {\r\n Id: number;\r\n StartDt: Date | string | null;\r\n EndDt: Date | string | null;\r\n ChartChannelData: IChartChannelData[];\r\n}\r\n\r\nexport interface ShortCircuitEvent {\r\n StartDt: Date | string;\r\n EndDt: Date | string;\r\n Name: string;\r\n ChartChannelData: IChartChannelData;\r\n}\r\n\r\nexport async function getDevices() {\r\n const { data } = await http.get(\"/devices\");\r\n return data;\r\n}\r\n\r\nexport async function getChartData(\r\n deviceId: number,\r\n averaging?: number | null,\r\n startDt?: Date | string,\r\n endDt?: Date | string\r\n) {\r\n const { data } = await http.get(`/devices.getChartData/${deviceId}`, {\r\n params: {\r\n startDt,\r\n endDt,\r\n averaging,\r\n },\r\n });\r\n return data;\r\n}\r\n\r\nexport async function getShortCircuitEvents(deviceId: number) {\r\n const { data } = await http.get(`/devices.getShortCircuitEvents/${deviceId}`);\r\n return data;\r\n}\r\n","import { createMuiTheme } from \"@material-ui/core/styles\";\r\nimport { blue } from \"@material-ui/core/colors\";\r\n\r\nconst theme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: blue[900],\r\n },\r\n },\r\n shadows: [\r\n \"none\",\r\n \"0px 2px 1px -1px rgba(0,0,0,0.09),0px 1px 1px 0px rgba(0,0,0,0.075),0px 1px 3px 0px rgba(0,0,0,0.05)\",\r\n \"0px 3px 1px -2px rgba(0,0,0,0.09),0px 2px 2px 0px rgba(0,0,0,0.075),0px 1px 5px 0px rgba(0,0,0,0.05)\",\r\n \"0px 3px 3px -2px rgba(0,0,0,0.09),0px 3px 4px 0px rgba(0,0,0,0.075),0px 1px 8px 0px rgba(0,0,0,0.05)\",\r\n \"0px 2px 4px -1px rgba(0,0,0,0.09),0px 4px 5px 0px rgba(0,0,0,0.075),0px 1px 10px 0px rgba(0,0,0,0.05)\",\r\n \"0px 3px 5px -1px rgba(0,0,0,0.09),0px 5px 8px 0px rgba(0,0,0,0.075),0px 1px 14px 0px rgba(0,0,0,0.05)\",\r\n \"0px 3px 5px -1px rgba(0,0,0,0.09),0px 6px 10px 0px rgba(0,0,0,0.075),0px 1px 18px 0px rgba(0,0,0,0.05)\",\r\n \"0px 4px 5px -2px rgba(0,0,0,0.09),0px 7px 10px 1px rgba(0,0,0,0.075),0px 2px 16px 1px rgba(0,0,0,0.05)\",\r\n \"0px 5px 5px -3px rgba(0,0,0,0.09),0px 8px 10px 1px rgba(0,0,0,0.075),0px 3px 14px 2px rgba(0,0,0,0.05)\",\r\n \"0px 5px 6px -3px rgba(0,0,0,0.09),0px 9px 12px 1px rgba(0,0,0,0.075),0px 3px 16px 2px rgba(0,0,0,0.05)\",\r\n \"0px 6px 6px -3px rgba(0,0,0,0.09),0px 10px 14px 1px rgba(0,0,0,0.075),0px 4px 18px 3px rgba(0,0,0,0.05)\",\r\n \"0px 6px 7px -4px rgba(0,0,0,0.09),0px 11px 15px 1px rgba(0,0,0,0.075),0px 4px 20px 3px rgba(0,0,0,0.05)\",\r\n \"0px 7px 8px -4px rgba(0,0,0,0.09),0px 12px 17px 2px rgba(0,0,0,0.075),0px 5px 22px 4px rgba(0,0,0,0.05)\",\r\n \"0px 7px 8px -4px rgba(0,0,0,0.09),0px 13px 19px 2px rgba(0,0,0,0.075),0px 5px 24px 4px rgba(0,0,0,0.05)\",\r\n \"0px 7px 9px -4px rgba(0,0,0,0.09),0px 14px 21px 2px rgba(0,0,0,0.075),0px 5px 26px 4px rgba(0,0,0,0.05)\",\r\n \"0px 8px 9px -5px rgba(0,0,0,0.09),0px 15px 22px 2px rgba(0,0,0,0.075),0px 6px 28px 5px rgba(0,0,0,0.05)\",\r\n \"0px 8px 10px -5px rgba(0,0,0,0.09),0px 16px 24px 2px rgba(0,0,0,0.075),0px 6px 30px 5px rgba(0,0,0,0.05)\",\r\n \"0px 8px 11px -5px rgba(0,0,0,0.09),0px 17px 26px 2px rgba(0,0,0,0.075),0px 6px 32px 5px rgba(0,0,0,0.05)\",\r\n \"0px 9px 11px -5px rgba(0,0,0,0.09),0px 18px 28px 2px rgba(0,0,0,0.075),0px 7px 34px 6px rgba(0,0,0,0.05)\",\r\n \"0px 9px 12px -6px rgba(0,0,0,0.09),0px 19px 29px 2px rgba(0,0,0,0.075),0px 7px 36px 6px rgba(0,0,0,0.05)\",\r\n \"0px 10px 13px -6px rgba(0,0,0,0.09),0px 20px 31px 3px rgba(0,0,0,0.075),0px 8px 38px 7px rgba(0,0,0,0.05)\",\r\n \"0px 10px 13px -6px rgba(0,0,0,0.09),0px 21px 33px 3px rgba(0,0,0,0.075),0px 8px 40px 7px rgba(0,0,0,0.05)\",\r\n \"0px 10px 14px -6px rgba(0,0,0,0.09),0px 22px 35px 3px rgba(0,0,0,0.075),0px 8px 42px 7px rgba(0,0,0,0.05)\",\r\n \"0px 11px 14px -7px rgba(0,0,0,0.09),0px 23px 36px 3px rgba(0,0,0,0.075),0px 9px 44px 8px rgba(0,0,0,0.05)\",\r\n \"0px 11px 15px -7px rgba(0,0,0,0.09),0px 24px 38px 3px rgba(0,0,0,0.075),0px 9px 46px 8px rgba(0,0,0,0.05)\",\r\n ],\r\n props: {\r\n MuiButtonBase: {\r\n centerRipple: true\r\n }\r\n }\r\n});\r\n\r\nexport default theme;\r\n","import React from \"react\";\r\nimport { IDevice, MDDStatus } from \"../../api/monitoring\";\r\nimport { Chip, useTheme } from \"@material-ui/core\";\r\nimport { blue, green } from \"@material-ui/core/colors\";\r\nimport { useStyletron } from \"baseui\";\r\n\r\ninterface Props {\r\n device: IDevice;\r\n}\r\n\r\nexport const DeviceMDDStatus: React.FC = ({ device }) => {\r\n const theme = useTheme();\r\n const [css] = useStyletron();\r\n\r\n return device.MDDStatus !== MDDStatus.Undefined ? (\r\n \r\n ) : null;\r\n};\r\n","import { useStyletron } from \"baseui\";\r\nimport React from \"react\";\r\nimport { IDevice, DeviceStatus, MDDStatus } from \"../../api/monitoring\";\r\nimport { CardActionArea, Card, CardContent, Typography, Icon, useTheme, Chip } from \"@material-ui/core\";\r\nimport { Tooltip } from \"@material-ui/core\";\r\nimport { orange, red, common, blue, green } from \"@material-ui/core/colors\";\r\nimport theme from \"../../theme\";\r\nimport { DeviceMDDStatus } from \"./DeviceMDDStatus\";\r\n\r\ninterface DeviceCardProps {\r\n device: IDevice;\r\n onClick: (device: IDevice) => void;\r\n isSelected: boolean;\r\n}\r\n\r\ninterface Status {\r\n title: string;\r\n color: string;\r\n backgroundColor: string;\r\n icon: string;\r\n}\r\n\r\ninterface Statuses {\r\n [key: number]: Status;\r\n}\r\n\r\nconst statuses: Statuses = {\r\n [DeviceStatus.Warning]: {\r\n title: \"Предаварийная ситуация\",\r\n color: theme.palette.warning.main,\r\n backgroundColor: orange[50],\r\n icon: \"fas fa-exclamation-circle \",\r\n },\r\n [DeviceStatus.Emergency]: {\r\n title: \"Аварийная ситуация\",\r\n color: theme.palette.error.main,\r\n backgroundColor: red[50],\r\n icon: \"fas fa-exclamation-circle \",\r\n },\r\n [DeviceStatus.WrongData]: {\r\n title: \"Неверные данные\",\r\n color: theme.palette.error.main,\r\n backgroundColor: red[50],\r\n icon: \"fas fa-exclamation-circle \",\r\n },\r\n [DeviceStatus.Outdated]: {\r\n title: \"Данные устарели\",\r\n color: theme.palette.grey[500],\r\n backgroundColor: theme.palette.grey[50],\r\n icon: \"fas fa-clock \",\r\n },\r\n};\r\n\r\nconst DeviceCard: React.FC = ({ device, onClick, isSelected }) => {\r\n const theme = useTheme();\r\n const [css] = useStyletron();\r\n\r\n function getStatusTagForDevice(device: IDevice) {\r\n const { AlarmChannelsCount, Status: deviceStatus } = device;\r\n if (deviceStatus === DeviceStatus.Normal || deviceStatus === DeviceStatus.Undefined) {\r\n return null;\r\n }\r\n return (\r\n \r\n \r\n }\r\n />\r\n \r\n );\r\n }\r\n\r\n function onCardClick() {\r\n onClick(device);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {device.Address}\r\n \r\n \r\n {getStatusTagForDevice(device)}\r\n \r\n \r\n \r\n {device.Comment || \"Нет комментария\"}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DeviceCard;\r\n","import React, { useContext } from \"react\";\r\nimport { MonitoringContext } from \"../../store/MonitoringContext\";\r\nimport { IDevice } from \"../../api/monitoring\";\r\nimport DeviceCard from \"./DeviceCard\";\r\nimport { Typography, Toolbar } from \"@material-ui/core\";\r\nimport { common } from \"@material-ui/core/colors\";\r\nimport { styled } from \"baseui\";\r\n\r\nconst Body = styled(\"div\", {\r\n width: \"100%\",\r\n padding: \"0 0.5rem 1rem 0.5rem\",\r\n overflow: \"auto\",\r\n height: \"calc(100% - 60px)\",\r\n \"@media (max-width: 1000px)\": {\r\n padding: \"8px\",\r\n },\r\n});\r\n\r\nconst Container = styled(\"div\", {\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n backgroundColor: common.white,\r\n});\r\n\r\ninterface DevicesListProps {\r\n onSelectDevice: (device: IDevice) => void;\r\n}\r\n\r\nconst DevicesList: React.FC = ({ onSelectDevice }) => {\r\n const { state } = useContext(MonitoringContext);\r\n\r\n return (\r\n \r\n \r\n \r\n Мониторинг\r\n \r\n \r\n \r\n {state.devices &&\r\n state.devices.map((device) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default DevicesList;\r\n","import React, { useEffect, useState, useRef } from \"react\";\r\nimport { IChartData } from \"../../api/monitoring\";\r\nimport Chart from \"react-apexcharts\";\r\nimport dayjs from \"dayjs\";\r\nimport ReactApexChart from \"react-apexcharts\";\r\n\r\nconst colors = [\r\n // \"#6929c4\",\r\n // \"#1192e8\",\r\n // \"#005d5d\",\r\n // \"#9f1853\",\r\n // \"#520408\",\r\n\r\n \"#BF2600\",\r\n \"#FF8B00\",\r\n \"#006644\",\r\n \"#008DA6\",\r\n \"#403294\",\r\n \"#0747A6\",\r\n \"#091E42\",\r\n\r\n // \"#DE350B\",\r\n // \"#FF991F\",\r\n // \"#00875A\",\r\n // \"#00A3BF\",\r\n // \"#5243AA\",\r\n // \"#0052CC\",\r\n // \"#253858\",\r\n\r\n // \"#FF5630\",\r\n // \"#FFAB00\",\r\n // \"#36B37E\",\r\n // \"#00B8D9\",\r\n // \"#8777D9\",\r\n // \"#0065FF\",\r\n // \"#42526E\",\r\n];\r\n\r\ninterface ChartProps {\r\n isMobile?: boolean;\r\n chartData: IChartData;\r\n width?: number;\r\n height?: number;\r\n selectedChannels: number[];\r\n selectedDevice: number;\r\n}\r\n\r\nfunction getChartData(chartData: IChartData, selectedChannels: number[]) {\r\n return chartData.ChartChannelData.filter((x) => selectedChannels.includes(x.Id)).map((x, i) => ({\r\n name: x.Name,\r\n data: x.Values.map((y, j) => ({\r\n x: x.Timestamps[j],\r\n y: y.toFixed(2),\r\n })),\r\n }));\r\n}\r\n\r\nfunction getChartOptions(\r\n chartData: IChartData,\r\n selectedChannels: number[],\r\n currentZoom: [number, number],\r\n onZoom: (min: number, max: number) => void\r\n) {\r\n return {\r\n chart: {\r\n type: \"line\",\r\n stacked: false,\r\n id: \"energy-chart\",\r\n events: {\r\n zoomed: function (chartContext: any, { xaxis, yaxis }: any) {\r\n onZoom(xaxis.min, xaxis.max);\r\n },\r\n },\r\n },\r\n legend: {\r\n show: false,\r\n },\r\n colors: chartData.ChartChannelData.filter((x) => selectedChannels.includes(x.Id)).map((_x, i) => colors[i % 7]),\r\n stroke: {\r\n width: chartData.ChartChannelData.filter((x) => selectedChannels.includes(x.Id)).map(() => 2),\r\n },\r\n plotOptions: {\r\n bar: {\r\n columnWidth: \"20%\",\r\n },\r\n },\r\n xaxis: {\r\n min: currentZoom[0] === 0 ? undefined : currentZoom[0],\r\n max: currentZoom[1] === 0 ? undefined : currentZoom[1],\r\n type: \"datetime\",\r\n labels: {\r\n rotate: 0,\r\n formatter: function (value: string) {\r\n return dayjs(value).format(\"DD.MM.YY HH:mm\");\r\n },\r\n },\r\n tooltip: {\r\n enabled: false,\r\n },\r\n },\r\n yaxis: chartData.ChartChannelData.filter((x) => selectedChannels.includes(x.Id)).map((x, i) => ({\r\n axisTicks: {\r\n show: true,\r\n },\r\n axisBorder: {\r\n show: true,\r\n color: colors[i % 7],\r\n },\r\n labels: {\r\n style: {\r\n colors: colors[i % 7],\r\n },\r\n formatter: function (value: string) {\r\n const numberValue = Number(value);\r\n return x.Unit\r\n ? `${Number.isInteger(numberValue) ? value : numberValue.toFixed(2)} ${x.Unit}`\r\n : value;\r\n },\r\n },\r\n title: {\r\n text: x.Name,\r\n style: {\r\n color: colors[i % 7],\r\n },\r\n },\r\n })),\r\n };\r\n}\r\n\r\nconst ChartWrapper: React.FC = ({ chartData, width, height, selectedChannels, selectedDevice }) => {\r\n const [zoom, setZoom] = useState<[number, number]>([0, 0]);\r\n function setCurrentZoom(min: number, max: number) {\r\n setZoom([min, max]);\r\n }\r\n const [chartOptions, setChartOptions] = useState(() =>\r\n getChartOptions(chartData, selectedChannels, zoom, setCurrentZoom)\r\n );\r\n const [chartSeries, setChartSeries] = useState(getChartData(chartData, selectedChannels));\r\n const chartRef = useRef(null);\r\n\r\n useEffect(() => {\r\n setZoom([0, 0]);\r\n }, [selectedDevice]);\r\n\r\n useEffect(() => {\r\n function drawChart() {\r\n if (chartData) {\r\n // if (!chartOptions.xaxis) {\r\n setChartOptions(getChartOptions(chartData, selectedChannels, zoom, setCurrentZoom));\r\n // }\r\n\r\n setChartSeries(getChartData(chartData, selectedChannels));\r\n }\r\n }\r\n\r\n drawChart();\r\n }, [chartData, selectedChannels]);\r\n\r\n return ;\r\n};\r\n\r\nexport default ChartWrapper;\r\n","import React, { useContext } from \"react\";\r\nimport { Tag } from \"antd\";\r\nimport { IChannel, ChannelStatus } from \"../../api/monitoring\";\r\nimport dayjs from \"dayjs\";\r\nimport { MonitoringContext } from \"../../store/MonitoringContext\";\r\nimport { makeStyles, Theme, createStyles } from \"@material-ui/core/styles\";\r\nimport {\r\n TableContainer,\r\n Paper,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableBody,\r\n Table,\r\n Typography,\r\n Toolbar,\r\n Checkbox,\r\n} from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n container: {\r\n padding: \"0 16px\",\r\n marginBottom: `${theme.spacing(1)}px`,\r\n },\r\n })\r\n);\r\n\r\ninterface ChannelsTableProps {\r\n onChannelClick: (channel: IChannel) => void;\r\n}\r\n\r\nconst ChannelsTable: React.FC = ({ onChannelClick }) => {\r\n const { state } = useContext(MonitoringContext);\r\n const classes = useStyles();\r\n\r\n function getStatusTagForChannel(channelStatus: ChannelStatus | null) {\r\n switch (channelStatus) {\r\n case ChannelStatus.Normal:\r\n return Нормальное;\r\n case ChannelStatus.WarningHigh:\r\n return Предаварийно высокое;\r\n case ChannelStatus.WarningLow:\r\n return Предаварийно низкое;\r\n case ChannelStatus.EmergencyHigh:\r\n return Аварийно высокое;\r\n case ChannelStatus.EmergencyLow:\r\n return Аварийно низкое;\r\n case ChannelStatus.WrongData:\r\n return Ошибка;\r\n case null:\r\n return Неопределено;\r\n }\r\n }\r\n return (\r\n \r\n {state.selectedDevice ? (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n График\r\n Название\r\n Значение\r\n Время\r\n Состояние\r\n Вкл/Выкл\r\n \r\n \r\n \r\n {state.selectedDevice.Channels.map((row) => (\r\n {\r\n onChannelClick(row);\r\n }}\r\n key={row.Id}\r\n >\r\n \r\n \r\n \r\n \r\n {row.Name}\r\n \r\n \r\n {row.Value?.toFixed(2)}\r\n {row.Unit && ` ${row.Unit}`}\r\n \r\n \r\n {dayjs(row.Timestamp).format(\"DD.MM.YYYY HH:mm:ss\")}\r\n \r\n \r\n {getStatusTagForChannel(row.AlarmStatus)}\r\n \r\n {row.IsWorking ? \"Вкл\" : \"Выкл\"}\r\n \r\n ))}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n ) : null}\r\n
\r\n );\r\n};\r\n\r\nexport default ChannelsTable;\r\n","import React from \"react\";\r\nimport { styled } from \"baseui\";\r\n\r\nconst EmptyContainer = styled(\"div\", {\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n});\r\n\r\nconst Empty: React.FC = () => {\r\n return (\r\n \r\n \r\n

Выберите объект

\r\n
\r\n );\r\n};\r\n\r\nexport default Empty;\r\n","/// \r\nimport * as ymaps from \"YandexMaps\";\r\n\r\nconst SET_BOUNDS_DEFAULT_OPTIONS = {\r\n checkZoomRange: true,\r\n zoomMargin: 20,\r\n};\r\n\r\nexport default class YandexMap {\r\n private mapLayer: ymaps.Map;\r\n private clusterer: ymaps.Clusterer;\r\n public ymapsAPI: typeof ymaps;\r\n\r\n constructor(ymapsAPI: typeof ymaps, element: string, options: any) {\r\n this.ymapsAPI = ymapsAPI;\r\n this.mapLayer = new ymapsAPI.Map(element, {\r\n controls: [\"rulerControl\"],\r\n ...options,\r\n });\r\n\r\n const typeSelector = this.createTypeSelectorControl();\r\n this.mapLayer.controls.add(typeSelector);\r\n\r\n const zoomControl = this.createZoomControl();\r\n this.mapLayer.controls.add(zoomControl);\r\n\r\n this.clusterer = new ymapsAPI.Clusterer({\r\n hasBalloon: true,\r\n clusterIconLayout: \"default#pieChart\",\r\n clusterIconPieChartRadius: 14,\r\n // Радиус центральной части макета.\r\n clusterIconPieChartCoreRadius: 10,\r\n // Ширина линий-разделителей секторов и внешней обводки диаграммы.\r\n clusterIconPieChartStrokeWidth: 0,\r\n clusterBalloonLeftColumnWidth: 200,\r\n clusterDisableClickZoom: true,\r\n });\r\n this.mapLayer.geoObjects.add(this.clusterer);\r\n\r\n const mapType = localStorage.getItem(\"mapType\");\r\n if (mapType) {\r\n this.mapLayer.setType(mapType);\r\n }\r\n this.mapLayer.events.add(\"typechange\", () => {\r\n localStorage.setItem(\"mapType\", this.mapLayer.getType().toString());\r\n });\r\n }\r\n\r\n public destroy() {\r\n this.mapLayer.destroy();\r\n }\r\n\r\n public addLayerToClusterer(positionMarker: any) {\r\n this.clusterer.add(positionMarker);\r\n }\r\n\r\n public removeLayerFromClusterer(positionMarker: any) {\r\n this.clusterer.remove(positionMarker);\r\n }\r\n\r\n public addLayer(track: any) {\r\n this.mapLayer.geoObjects.add(track);\r\n }\r\n\r\n public removeLayer(track: any) {\r\n this.mapLayer.geoObjects.remove(track);\r\n }\r\n\r\n public addEvent(event: any, callback: any) {\r\n this.mapLayer.events.add(event, callback);\r\n }\r\n\r\n public removeEvent(event: any, callback: any) {\r\n this.mapLayer.events.remove(event, callback);\r\n }\r\n\r\n public isLayerOnMap(layer: any) {\r\n return this.mapLayer.geoObjects.indexOf(layer) > -1;\r\n }\r\n\r\n public setBounds(bounds: any) {\r\n this.mapLayer.setBounds(bounds, SET_BOUNDS_DEFAULT_OPTIONS);\r\n }\r\n\r\n public setCenter(center: any) {\r\n this.mapLayer.setCenter(center);\r\n }\r\n\r\n public setZoom(zoom: number = 12) {\r\n this.mapLayer.setZoom(zoom);\r\n }\r\n\r\n public getZoom() {\r\n return this.mapLayer.getZoom();\r\n }\r\n\r\n public getBounds() {\r\n return this.mapLayer.getBounds();\r\n }\r\n\r\n public getCenter() {\r\n return this.mapLayer.getCenter();\r\n }\r\n\r\n public focusToLayers(layers: any) {\r\n const layersBounds: ymaps.CoordinateBounds[] = [];\r\n for (const layer of layers) {\r\n const layerBounds = layer.getBounds();\r\n layersBounds.push(layerBounds);\r\n }\r\n const bounds = this.ymapsAPI.util.bounds.fromBounds(layersBounds);\r\n this.setBounds(bounds);\r\n }\r\n\r\n public fitToViewport() {\r\n this.mapLayer.container.fitToViewport();\r\n }\r\n\r\n private createTypeSelectorControl() {\r\n this.addOsmMapType();\r\n this.addYandexMapType();\r\n return new this.ymapsAPI.control.TypeSelector({\r\n mapTypes: [\"yandex#map\", \"osm#map\"],\r\n options: {\r\n panoramasItemMode: \"off\",\r\n },\r\n });\r\n }\r\n\r\n private addYandexMapType() {\r\n const osmMapType = new this.ymapsAPI.MapType(\"Yandex\", [\"yandex#map\"]);\r\n this.ymapsAPI.mapType.storage.add(\"yandex#map\", osmMapType);\r\n }\r\n\r\n private addOsmMapType() {\r\n const OSMLayer = () => {\r\n const layer = new this.ymapsAPI.Layer(\"http://tile.openstreetmap.org/%z/%x/%y.png\", {\r\n projection: this.ymapsAPI.projection.sphericalMercator,\r\n });\r\n layer.getCopyrights = () => {\r\n return this.ymapsAPI.vow.resolve(\"OpenStreetMap contributors, CC-BY-SA\");\r\n };\r\n layer.getZoomRange = () => {\r\n return this.ymapsAPI.vow.resolve<[number, number]>([0, 18]);\r\n };\r\n\r\n return layer;\r\n };\r\n\r\n this.ymapsAPI.layer.storage.add(\"osm#map\", OSMLayer);\r\n const osmMapType = new this.ymapsAPI.MapType(\"OpenStreetMap\", [\"osm#map\"]);\r\n this.ymapsAPI.mapType.storage.add(\"osm#map\", osmMapType);\r\n }\r\n\r\n private createZoomControl() {\r\n return new this.ymapsAPI.control.ZoomControl({\r\n options: {\r\n position: {\r\n top: 60,\r\n right: 10,\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","export default {\r\n markerTemplate: `\r\n
\r\n
\r\n {{ properties.Label }}\r\n
\r\n {% if (properties.needLabel) %}
{{ properties.Name }}
{% endif %}\r\n
`,\r\n};\r\n","/// \r\nimport * as ymaps from \"YandexMaps\";\r\nimport ReactDOMServer from \"react-dom/server\";\r\nimport React from \"react\";\r\nimport templates from \"./templates\";\r\nimport YandexMap from \"./YandexMap\";\r\nimport { IDevice } from \"../../api/monitoring\";\r\n\r\nexport default class PositionMarker {\r\n private map: YandexMap;\r\n private device: IDevice;\r\n private layer: ymaps.Placemark;\r\n private ymaps: typeof ymaps;\r\n\r\n constructor(map: YandexMap, device: IDevice, clickHandler: any) {\r\n this.ymaps = map.ymapsAPI;\r\n this.map = map;\r\n this.device = { ...device };\r\n this.layer = this.createPlacemark(this.device);\r\n this.layer.events.add(\"click\", (event) => {\r\n if (clickHandler) {\r\n const target = (event as ymaps.IEvent).get(\"target\");\r\n if (target) {\r\n const placemark = target as ymaps.Placemark;\r\n clickHandler(placemark.properties.getAll());\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getBounds() {\r\n return this.layer.geometry.getBounds();\r\n }\r\n\r\n public focus() {\r\n const center = this.layer.geometry.getCoordinates();\r\n this.map.setCenter(center);\r\n }\r\n\r\n public show() {\r\n if (!this.map.isLayerOnMap(this.layer)) {\r\n this.map.addLayerToClusterer(this.layer);\r\n }\r\n }\r\n\r\n public hide() {\r\n this.map.removeLayerFromClusterer(this.layer);\r\n }\r\n\r\n private createLayout(template: any) {\r\n return this.map.ymapsAPI.templateLayoutFactory.createClass(template);\r\n }\r\n\r\n private createPlacemark(device: IDevice) {\r\n let placemarkColor = \"#1070ca\";\r\n const properties = {\r\n Id: device.Id,\r\n Name: device.Address,\r\n needLabel: true,\r\n IconSize: 24,\r\n Color: placemarkColor,\r\n clusterCaption: device.Address,\r\n balloonContentBody: ReactDOMServer.renderToStaticMarkup(
{device.Comment || \"Нет комментария\"}
),\r\n };\r\n\r\n const options: ymaps.IPlacemarkOptions = {\r\n hasBalloon: true,\r\n iconLayout: \"default#imageWithContent\",\r\n iconContentLayout: this.createLayout(templates.markerTemplate),\r\n iconColor: placemarkColor,\r\n iconContentSize: [280, 32],\r\n iconImageHref: \"\",\r\n iconImageSize: [32, 32],\r\n iconImageOffset: [-32 / 2, -32 / 2],\r\n };\r\n\r\n return new this.ymaps.Placemark([device.Latitude, device.Longitude], properties, options);\r\n }\r\n}\r\n","/// \r\nimport * as ymapsAPI from \"YandexMaps\";\r\n\r\nimport React, { useRef, useEffect } from \"react\";\r\nimport { WithYMapsProps } from \"react-yandex-maps\";\r\nimport YandexMap from \"../../components/Map/YandexMap\";\r\nimport { IDevice } from \"../../api/monitoring\";\r\nimport PositionMarker from \"../Map/PositionMarker\";\r\nimport { styled } from \"baseui\";\r\n\r\nconst MapContainer = styled(\"div\", {\r\n height: \"100%\",\r\n});\r\n\r\ninterface MapComponentProps extends WithYMapsProps {\r\n devices?: IDevice[];\r\n}\r\n\r\nlet devicesMarkers: PositionMarker[] = [];\r\n\r\nconst MapComponent: React.FC = ({ ymaps, devices }) => {\r\n const ymap = useRef();\r\n useEffect(() => {\r\n if (ymaps && ymaps.Map) {\r\n ymap.current = new YandexMap(ymaps as typeof ymapsAPI, \"ymap\", {\r\n center: [54.194442, 37.599728],\r\n zoom: 10,\r\n maxZoom: 18,\r\n });\r\n }\r\n\r\n return () => {\r\n if (ymap.current) {\r\n ymap.current.destroy();\r\n }\r\n };\r\n }, [ymaps]);\r\n\r\n useEffect(() => {\r\n devicesMarkers.forEach((x) => x.hide());\r\n const markers: PositionMarker[] = [];\r\n devices?.forEach((x) => {\r\n if (ymap.current) {\r\n const marker = new PositionMarker(ymap.current, x, () => {});\r\n marker.show();\r\n markers.push(marker);\r\n }\r\n });\r\n devicesMarkers = markers;\r\n\r\n return () => {\r\n devicesMarkers.forEach((x) => x.hide());\r\n };\r\n }, []);\r\n\r\n return ;\r\n};\r\n\r\nexport default MapComponent;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { IChartChannelData } from \"../../api/monitoring\";\r\nimport Chart from \"react-apexcharts\";\r\nimport dayjs from \"dayjs\";\r\nimport { useTheme } from \"@material-ui/core/styles\";\r\n\r\ninterface ChartProps {\r\n isMobile?: boolean;\r\n chartChannelData: IChartChannelData;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst MobileChartWrapper: React.FC = ({ chartChannelData, width, height, isMobile }) => {\r\n const theme = useTheme();\r\n const [chartOptions, setChartOptions] = useState({\r\n chart: {\r\n id: chartChannelData.Id,\r\n type: \"line\",\r\n group: \"energy\",\r\n toolbar: {\r\n show: false,\r\n },\r\n },\r\n legend: {\r\n show: false,\r\n },\r\n tooltip: {\r\n followCursor: false,\r\n theme: \"dark\",\r\n x: {\r\n show: false,\r\n },\r\n marker: {\r\n show: false,\r\n },\r\n y: {\r\n title: {\r\n formatter: function () {\r\n return \"\";\r\n },\r\n },\r\n },\r\n },\r\n colors: [theme.palette.primary.main],\r\n stroke: {\r\n width: [2],\r\n },\r\n xaxis: {\r\n type: \"datetime\",\r\n axisBorder: {\r\n show: false,\r\n },\r\n labels: {\r\n rotate: 0,\r\n formatter: function (value: string) {\r\n return dayjs(value).format(\"DD.MM.YY HH:mm\");\r\n },\r\n style: {\r\n colors: [theme.palette.text.primary],\r\n fontSize: \"12px\",\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontWeight: 400,\r\n },\r\n },\r\n },\r\n yaxis: [\r\n {\r\n tickAmount: 2,\r\n labels: {\r\n minWidth: 50,\r\n style: {\r\n colors: [theme.palette.text.primary],\r\n fontSize: \"12px\",\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontWeight: 400,\r\n },\r\n formatter: function (value: string) {\r\n const numberValue = Number(value);\r\n return chartChannelData.Unit\r\n ? `${Number.isInteger(numberValue) ? value : numberValue.toFixed(2)} ${\r\n chartChannelData.Unit\r\n }`\r\n : value;\r\n },\r\n },\r\n title: {\r\n show: false,\r\n },\r\n },\r\n ],\r\n });\r\n const [chartSeries, setChartSeries] = useState([\r\n {\r\n name: chartChannelData.Name,\r\n data: chartChannelData.Values.map((y, j) => ({\r\n x: chartChannelData.Timestamps[j],\r\n y: y.toFixed(2),\r\n })),\r\n },\r\n ]);\r\n\r\n useEffect(() => {\r\n function drawChart() {\r\n if (chartChannelData) {\r\n if (!chartOptions.xaxis) {\r\n setChartOptions({\r\n chart: {\r\n id: chartChannelData.Id,\r\n type: \"line\",\r\n group: \"energy\",\r\n },\r\n legend: {\r\n show: false,\r\n },\r\n tooltip: {\r\n followCursor: false,\r\n theme: \"dark\",\r\n x: {\r\n show: false,\r\n },\r\n marker: {\r\n show: false,\r\n },\r\n y: {\r\n title: {\r\n formatter: function () {\r\n return \"\";\r\n },\r\n },\r\n },\r\n },\r\n colors: [\"#1192e8\"],\r\n stroke: {\r\n width: [2],\r\n },\r\n xaxis: {\r\n type: \"datetime\",\r\n labels: {\r\n rotate: 0,\r\n formatter: function (value: string) {\r\n return dayjs(value).format(\"DD.MM.YY HH:mm\");\r\n },\r\n },\r\n },\r\n yaxis: [\r\n {\r\n tickAmount: 2,\r\n axisTicks: {\r\n show: true,\r\n },\r\n axisBorder: {\r\n show: true,\r\n color: \"#1192e8\",\r\n },\r\n labels: {\r\n minWidth: 40,\r\n style: {\r\n colors: \"#1192e8\",\r\n },\r\n formatter: function (value: string) {\r\n const numberValue = Number(value);\r\n return chartChannelData.Unit\r\n ? `${Number.isInteger(numberValue) ? value : numberValue.toFixed(2)} ${\r\n chartChannelData.Unit\r\n }`\r\n : value;\r\n },\r\n },\r\n title: {\r\n text: chartChannelData.Name,\r\n style: {\r\n color: \"#1192e8\",\r\n },\r\n },\r\n },\r\n ],\r\n });\r\n }\r\n\r\n setChartSeries([\r\n {\r\n name: chartChannelData.Name,\r\n data: chartChannelData.Values.map((y, j) => ({\r\n x: chartChannelData.Timestamps[j],\r\n y: y.toFixed(2),\r\n })),\r\n },\r\n ]);\r\n }\r\n }\r\n\r\n drawChart();\r\n }, [chartChannelData, isMobile]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default MobileChartWrapper;\r\n","import React from \"react\";\r\nimport { useStyletron } from \"baseui\";\r\nimport { IChannel, ChannelStatus, IChartChannelData } from \"../../api/monitoring\";\r\nimport { Card, useTheme, Typography, CardContent, Icon, Grid } from \"@material-ui/core\";\r\nimport MobileChart from \"./MobileChart\";\r\nimport dayjs from \"dayjs\";\r\ninterface DeviceCardProps {\r\n channel: IChannel;\r\n channelChartData?: IChartChannelData;\r\n}\r\n\r\nconst ChannelCard: React.FC = ({ channel, channelChartData }) => {\r\n const theme = useTheme();\r\n const [css] = useStyletron();\r\n function getStatusTagForChannel(channelStatus: ChannelStatus | null) {\r\n switch (channelStatus) {\r\n case ChannelStatus.Normal:\r\n return (\r\n \r\n );\r\n case ChannelStatus.WarningHigh:\r\n return (\r\n \r\n );\r\n case ChannelStatus.WarningLow:\r\n return (\r\n \r\n );\r\n case ChannelStatus.EmergencyHigh:\r\n return (\r\n \r\n );\r\n case ChannelStatus.EmergencyLow:\r\n return (\r\n \r\n );\r\n case ChannelStatus.WrongData:\r\n return (\r\n \r\n );\r\n case null:\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {channel.Name.replace(\"Измеренное значение\", \"Значение\")}\r\n \r\n \r\n \r\n {getStatusTagForChannel(channel.AlarmStatus)}\r\n \r\n {channel.Value?.toFixed(2)}\r\n {channel.Unit && ` ${channel.Unit}`}\r\n \r\n \r\n \r\n \r\n {dayjs(channel.Timestamp).format(\"DD.MM.YYYY HH:mm:ss\")}\r\n \r\n \r\n \r\n \r\n {channelChartData && }\r\n \r\n // \r\n // \r\n // {channel.Name}\r\n // \r\n // \r\n // Значение:{\" \"}\r\n // \r\n // {channel.Value?.toFixed(2)}\r\n // {channel.Unit && ` ${channel.Unit}`}\r\n // \r\n // \r\n // \r\n // Время: {dayjs(channel.Timestamp).format(\"DD.MM.YYYY HH:mm:ss\")}\r\n // \r\n // \r\n // Статус:\r\n // {getStatusTagForChannel(channel.AlarmStatus)}{\" \"}\r\n // \r\n // \r\n );\r\n};\r\n\r\nexport { ChannelCard };\r\n","import { styled } from \"baseui\";\r\n\r\nconst ViewContainer = styled(\"div\", {\r\n height: \"100%\",\r\n width: \"100%\",\r\n backgroundColor: \"#eceff1\",\r\n overflow: \"hidden\",\r\n});\r\n\r\nexport default ViewContainer;\r\n","import { styled } from \"baseui\";\r\n\r\nconst Dashboard = styled(\"div\", {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingTop: \"60px\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n});\r\n\r\nexport default Dashboard;\r\n","import { useStyletron } from \"baseui\";\r\nimport dayjs from \"dayjs\";\r\nimport { Card, CardActionArea, CardContent, Paper, Typography, useTheme } from \"@material-ui/core\";\r\nimport React, { useContext, useEffect, useState } from \"react\";\r\nimport { getShortCircuitEvents, ShortCircuitEvent } from \"../../api/monitoring\";\r\nimport { MonitoringContext } from \"../../store/MonitoringContext\";\r\nimport Chart from \"./Chart\";\r\n\r\ninterface Props {\r\n isMobile: boolean;\r\n isFullscreen: boolean;\r\n chartWidth?: number;\r\n}\r\n\r\nexport const ShortCircuits: React.FC = ({ isFullscreen, chartWidth, isMobile }) => {\r\n const theme = useTheme();\r\n const [css] = useStyletron();\r\n const { state, dispatch } = useContext(MonitoringContext);\r\n const [shortCircuits, setShortCircuits] = useState([]);\r\n const [currentShortCircuits, setCurrentShortCircuits] = useState();\r\n\r\n useEffect(() => {\r\n setCurrentShortCircuits(undefined);\r\n async function loadShortCircuitsData() {\r\n if (state.selectedDevice) {\r\n const data = await getShortCircuitEvents(state.selectedDevice.Id);\r\n setShortCircuits(data || []);\r\n }\r\n }\r\n loadShortCircuitsData();\r\n }, [state.selectedDevice]);\r\n\r\n if (!shortCircuits || !shortCircuits?.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {state.selectedDevice && (\r\n \r\n \r\n {shortCircuits.map((x) => (\r\n \r\n {\r\n setCurrentShortCircuits(x);\r\n }}\r\n >\r\n \r\n \r\n {x.Name}\r\n \r\n \r\n {dayjs(x.StartDt).format(\"DD.MM.YY HH:mm.SSS\")} -{\" \"}\r\n {dayjs(x.EndDt).format(\"DD.MM.YY HH:mm.SSS\")}\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n {currentShortCircuits && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { useStyletron, styled } from \"baseui\";\r\nimport React, { useEffect, useContext, useState } from \"react\";\r\nimport { withYMaps, WithYMapsProps } from \"react-yandex-maps\";\r\nimport EnergyNav from \"../components/Nav/EnergyNav\";\r\nimport EnergyMobileNav from \"../components/Nav/EnergyMobileNav\";\r\nimport DevicesList from \"../components/Monitoring/DevicesList\";\r\nimport useRequest from \"../api/swr/useRequest\";\r\nimport { IDevice, getChartData, IChannel, IChartData } from \"../api/monitoring\";\r\nimport { MonitoringContext } from \"../store/MonitoringContext\";\r\nimport Chart from \"../components/Monitoring/Chart\";\r\nimport ChannelsTable from \"../components/Monitoring/ChannelsTable\";\r\nimport { useSize, useFullscreen } from \"@umijs/hooks\";\r\nimport { Drawer } from \"antd\";\r\nimport Empty from \"../components/Empty\";\r\nimport MapComponent from \"../components/Monitoring/MapComponent\";\r\nimport { Dayjs } from \"dayjs\";\r\nimport { configResponsive, useResponsive } from \"@umijs/hooks\";\r\nimport { MobileViewProps } from \"../helpers/MobileViewProps\";\r\nimport { ChannelCard } from \"../components/Monitoring/ChannelCard\";\r\nimport ViewContainer from \"./styled/ViewContainer\";\r\nimport Dashboard from \"./styled/Dashboard\";\r\nimport xor from \"lodash.xor\";\r\nimport {\r\n Paper,\r\n Toolbar,\r\n Button,\r\n Tooltip,\r\n Icon,\r\n FormControl,\r\n Select,\r\n InputLabel,\r\n MenuItem,\r\n Typography,\r\n Card,\r\n CardContent,\r\n CardActionArea,\r\n Tabs,\r\n Tab,\r\n} from \"@material-ui/core\";\r\nimport { DateTimePicker } from \"@material-ui/pickers\";\r\nimport { MaterialUiPickersDate } from \"@material-ui/pickers/typings/date\";\r\nimport { useTheme } from \"@material-ui/core/styles\";\r\nimport theme from \"../theme\";\r\nimport ApexCharts from \"apexcharts\";\r\nimport { ShortCircuits } from \"../components/Monitoring/ShortCircuits\";\r\nimport { DeviceMDDStatus } from \"../components/Monitoring/DeviceMDDStatus\";\r\nimport { stat } from \"fs\";\r\n\r\ninterface SettingsItemProps {\r\n isMobile: boolean;\r\n}\r\n\r\nconst SettingsItem = styled(\"div\", (props) => ({\r\n marginLeft: props.isMobile ? 0 : `${theme.spacing(1)}px`,\r\n marginBottom: props.isMobile ? `${theme.spacing(2)}px` : 0,\r\n}));\r\n\r\nconfigResponsive({\r\n small: 0,\r\n middle: 1000,\r\n large: 1366,\r\n});\r\n\r\nconst MapContainer = styled(\"div\", {\r\n height: \"400px\",\r\n paddingTop: \"4px\",\r\n});\r\n\r\nconst Fullscreen = styled(\"div\", {\r\n width: \"100%\",\r\n height: \"100%\",\r\n});\r\n\r\nconst ObjectPanel = styled(\"div\", {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n width: \"calc(100% - 325px)\",\r\n overflow: \"auto\",\r\n height: \"100%\",\r\n zIndex: 100,\r\n});\r\n\r\nconst DevicesPanel = styled(\"div\", (props) => ({\r\n width: props.isMobile ? \"100%\" : \"325px\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n zIndex: 100,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n}));\r\n\r\ntype Mode = \"map\" | \"chart\";\r\n\r\nconst MonitoringView: React.FC = ({ ymaps }) => {\r\n const { state, dispatch } = useContext(MonitoringContext);\r\n const [chartDimensions, chartRef] = useSize();\r\n const [mode, setMode] = useState(\"chart\");\r\n const responsive = useResponsive();\r\n const [startDt, setStartDt] = useState(null);\r\n const [endDt, setEndDt] = useState(null);\r\n const [averaging, setAveraging] = useState(0);\r\n const theme = useTheme();\r\n const [css] = useStyletron();\r\n const [tab, setTab] = React.useState(0);\r\n\r\n function onChannelClick(channel: IChannel) {\r\n dispatch({\r\n type: \"channels/selected\",\r\n payload: { selectedChannels: xor(state.selectedChannels || [], [channel.Id]) },\r\n });\r\n }\r\n\r\n const { data: devices } = useRequest(\r\n {\r\n headers: {\r\n Authorization: \"Bearer \" + localStorage.getItem(\"token\"),\r\n },\r\n baseURL: process.env.REACT_APP_API_URL,\r\n method: \"GET\",\r\n url: \"/devices\",\r\n },\r\n {\r\n refreshInterval: 30000,\r\n }\r\n );\r\n const [chartData, setChartData] = useState();\r\n\r\n useEffect(() => {\r\n async function loadChartData() {\r\n if (state.selectedDevice && !startDt && !startDt) {\r\n const data = await getChartData(state.selectedDevice.Id, averaging !== 0 ? Number(averaging) : null);\r\n setChartData(data);\r\n }\r\n }\r\n loadChartData();\r\n }, [state.selectedDevice, devices, startDt, endDt, averaging]);\r\n\r\n useEffect(() => {\r\n async function loadChartData() {\r\n if (state.selectedDevice && startDt && endDt) {\r\n const data = await getChartData(\r\n state.selectedDevice.Id,\r\n averaging !== 0 ? Number(averaging) : null,\r\n startDt.toISOString(),\r\n endDt.toISOString()\r\n );\r\n setChartData(data);\r\n }\r\n }\r\n loadChartData();\r\n }, [state.selectedDevice, startDt, endDt, averaging]);\r\n\r\n useEffect(() => {\r\n dispatch({\r\n type: \"devices/loaded\",\r\n payload: {\r\n devices,\r\n },\r\n });\r\n }, [devices]);\r\n\r\n const { isFullscreen, setFull, exitFull, ref: fullscreenRef } = useFullscreen();\r\n\r\n function handleChangeMode() {\r\n if (mode === \"chart\") {\r\n setMode(\"map\");\r\n } else {\r\n setMode(\"chart\");\r\n }\r\n }\r\n\r\n const [sidePanelVisible, setSidePanelVisible] = useState(false);\r\n\r\n function handleDrawerClose() {\r\n setSidePanelVisible(false);\r\n }\r\n\r\n function onDeviceCardClick(device: IDevice) {\r\n setSidePanelVisible(true);\r\n dispatch({\r\n type: \"channels/selected\",\r\n payload: { selectedChannels: device.Channels.map((x) => x.Id) },\r\n });\r\n dispatch({ type: \"devices/selected\", payload: { selectedDevice: device } });\r\n }\r\n\r\n function onStartDateChange(date: MaterialUiPickersDate) {\r\n setStartDt(date);\r\n }\r\n\r\n function onEndDateChange(date: MaterialUiPickersDate) {\r\n setEndDt(date);\r\n }\r\n\r\n function handleSelectAveraging(\r\n event: React.ChangeEvent<{\r\n name?: string | undefined;\r\n value: unknown;\r\n }>\r\n ) {\r\n setAveraging(Number(event.target.value));\r\n }\r\n\r\n function getChartSettings() {\r\n return (\r\n \r\n \r\n \r\n Усреденение\r\n \r\n Без усреднения\r\n 5 минут\r\n 10 минут\r\n 30 минут\r\n 1 час\r\n 2 часа\r\n 4 часа\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {responsive.middle ? : }\r\n \r\n {!responsive.middle && (\r\n \r\n \r\n {\r\n setTab(newTab);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {state.selectedDevice && tab === 1 && (\r\n \r\n )}\r\n {tab === 0 && (\r\n \r\n \r\n \r\n Настройки\r\n \r\n {getChartSettings()}\r\n \r\n {state.selectedDevice &&\r\n state.selectedDevice.Channels.map((x) => (\r\n y.Id === x.Id)}\r\n channel={x}\r\n >\r\n ))}\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n {responsive.middle && (\r\n \r\n {state.selectedDevice ? (\r\n \r\n \r\n \r\n \r\n \r\n {state.selectedDevice.Address}\r\n \r\n \r\n \r\n {\r\n setTab(newTab);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {tab === 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {mode === \"chart\" && getChartSettings()}\r\n \r\n \r\n \r\n {mode === \"map\" ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n isFullscreen ? exitFull() : setFull();\r\n }}\r\n >\r\n {isFullscreen ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {mode === \"chart\" && chartData && (\r\n \r\n x.Id)\r\n }\r\n chartData={chartData}\r\n width={\r\n isFullscreen\r\n ? window.innerWidth\r\n : chartDimensions.width\r\n }\r\n height={isFullscreen ? window.innerHeight - 100 : 400}\r\n >\r\n \r\n )}\r\n {mode === \"map\" && state.devices && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n {state.selectedDevice && tab === 1 && (\r\n \r\n )}\r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default withYMaps(MonitoringView);\r\n","import useSWR, { ConfigInterface, responseInterface } from \"swr\";\r\nimport axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from \"axios\";\r\n\r\nexport type GetRequest = AxiosRequestConfig | null;\r\n\r\ninterface Return\r\n extends Pick, AxiosError>, \"isValidating\" | \"revalidate\" | \"error\"> {\r\n data?: Data;\r\n response?: AxiosResponse;\r\n}\r\n\r\nexport interface Config\r\n extends Omit, AxiosError>, \"initialData\"> {\r\n initialData?: Data;\r\n}\r\n\r\nexport default function useRequest(\r\n request: GetRequest,\r\n { initialData, ...config }: Config = {}\r\n): Return {\r\n const { data: response, error, isValidating, revalidate } = useSWR, AxiosError>(\r\n request && JSON.stringify(request),\r\n () => axios(request!),\r\n {\r\n ...config,\r\n initialData:\r\n initialData &&\r\n ({\r\n status: 200,\r\n statusText: \"InitialData\",\r\n config: request,\r\n headers: {},\r\n data: initialData,\r\n } as AxiosResponse),\r\n }\r\n );\r\n\r\n return {\r\n data: response && response.data,\r\n response,\r\n error,\r\n isValidating,\r\n revalidate,\r\n };\r\n}\r\n","import { useStyletron } from \"baseui\";\r\nimport React from \"react\";\r\nimport { IDevice } from \"../../api/monitoring\";\r\nimport xor from \"lodash.xor\";\r\nimport { Card, CardActionArea, Typography, CardContent, useTheme, Checkbox, FormControlLabel } from \"@material-ui/core\";\r\nimport { blue } from \"@material-ui/core/colors\";\r\n\r\nexport interface IReportDevice {\r\n id: number;\r\n channels?: number[];\r\n}\r\n\r\ninterface DeviceReportCardProps {\r\n reportDevice?: IReportDevice;\r\n device: IDevice;\r\n onClick: (reportDevice: IReportDevice) => void;\r\n onChannelsChange: (reportDevice: IReportDevice) => void;\r\n}\r\n\r\nconst DeviceReportCard: React.FC = ({ device, reportDevice, onClick, onChannelsChange }) => {\r\n const theme = useTheme();\r\n const [css] = useStyletron();\r\n\r\n function onCardClick() {\r\n if (reportDevice) {\r\n onClick({\r\n id: device.Id,\r\n });\r\n } else {\r\n onClick({\r\n id: device.Id,\r\n channels: device.Channels.map((x) => x.Id),\r\n });\r\n }\r\n }\r\n\r\n function onChannelClick(e: React.ChangeEvent, channelId: number) {\r\n if (reportDevice) {\r\n onChannelsChange({\r\n id: device.Id,\r\n channels: xor(reportDevice.channels, [channelId]),\r\n });\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {device.Address}\r\n \r\n \r\n {device.Comment || \"Нет комментария\"}\r\n \r\n \r\n \r\n {reportDevice && (\r\n \r\n {device.Channels.map((x) => (\r\n onChannelClick(e, x.Id)}\r\n >\r\n }\r\n label={x.Name}\r\n />\r\n ))}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default DeviceReportCard;\r\n","import http from \"./http\";\r\nimport { saveAs } from \"file-saver\";\r\nimport download from \"downloadjs\";\r\n\r\nexport interface IChannelsReportSettings {\r\n ReportSettings: IDeviceReportSettings[];\r\n StartDt: Date | string;\r\n EndDt: Date | string;\r\n}\r\n\r\nexport interface IDeviceReportSettings {\r\n Id: number;\r\n ChannelIds: number[];\r\n}\r\n\r\nexport async function getReport(channelReportSettings: IChannelsReportSettings, filename: string) {\r\n const { data } = await http.post(\"/report\", channelReportSettings, {\r\n responseType: \"blob\",\r\n });\r\n download(data, filename, \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\");\r\n}\r\n","import { useStyletron, styled } from \"baseui\";\r\nimport React, { useEffect, useState, useContext } from \"react\";\r\nimport ViewContainer from \"./styled/ViewContainer\";\r\nimport EnergyNav from \"../components/Nav/EnergyNav\";\r\nimport EnergyMobileNav from \"../components/Nav/EnergyMobileNav\";\r\nimport { useResponsive } from \"@umijs/hooks\";\r\nimport DeviceReportCard, { IReportDevice } from \"../components/Report/DeviceReportCard\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport { getDevices, IDevice } from \"../api/monitoring\";\r\nimport { getReport } from \"../api/report\";\r\nimport { UserContext } from \"../store/UserContext\";\r\nimport theme from \"../theme\";\r\nimport { DateTimePicker } from \"@material-ui/pickers\";\r\nimport { MaterialUiPickersDate } from \"@material-ui/pickers/typings/date\";\r\nimport { Button, Typography, Toolbar, Paper } from \"@material-ui/core\";\r\nimport CyrillicToTranslit from \"cyrillic-to-translit-js\"\r\n\r\ninterface SettingsItemProps {\r\n isMobile: boolean;\r\n}\r\n\r\nconst SettingsItem = styled(\"div\", (props) => ({\r\n marginLeft: props.isMobile ? 0 : `${theme.spacing(2)}px`,\r\n marginBottom: `${theme.spacing(2)}px`,\r\n flex: props.isMobile ? \"0 0 100%\" : \"1 1 auto\",\r\n \":first-child\": {\r\n marginLeft: 0,\r\n },\r\n}));\r\n\r\nconst DownloadButton = styled(Button, {\r\n \"@media (max-width: 1000px)\": {\r\n width: \"100%\",\r\n },\r\n});\r\n\r\nconst Dashboard = styled(\"div\", {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n paddingTop: \"76px\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n overflow: \"auto\",\r\n alignItems: \"center\",\r\n});\r\n\r\nconst Block = styled(\"div\", {\r\n marginBottom: \"16px\",\r\n});\r\n\r\nconst ReportView: React.FC = () => {\r\n const [css] = useStyletron();\r\n const { user } = useContext(UserContext);\r\n const responsive = useResponsive();\r\n const [devices, setDevices] = useState([]);\r\n const [reportDevices, setReportDevices] = useState>(new Map());\r\n const [startDt, setStartDt] = useState(null);\r\n const [endDt, setEndDt] = useState(null);\r\n\r\n function onStartDateChange(date: MaterialUiPickersDate) {\r\n setStartDt(date);\r\n }\r\n\r\n function onEndDateChange(date: MaterialUiPickersDate) {\r\n setEndDt(date);\r\n }\r\n\r\n useEffect(() => {\r\n async function loadData() {\r\n const devices = await getDevices();\r\n setDevices(devices);\r\n }\r\n if (!!user) {\r\n loadData();\r\n }\r\n }, [user]);\r\n\r\n function loadReport() {\r\n if (startDt && endDt) {\r\n const filename = Array.from(reportDevices.values())\r\n .slice(0, 3)\r\n .reduce((acc, device) => {\r\n const address = devices.find((x) => x.Id === device.id)?.Address;\r\n if (!address || acc.length + address.length + 1 > 100) {\r\n return acc;\r\n }\r\n const cyrillicToTranslit = new CyrillicToTranslit();\r\n const translit = cyrillicToTranslit.transform(address, \"_\")\r\n if(acc.length) {\r\n return `${acc}_${translit}`;\r\n }\r\n\r\n return translit;\r\n }, \"\");\r\n\r\n getReport(\r\n {\r\n StartDt: startDt.toDate(),\r\n EndDt: endDt.toDate(),\r\n ReportSettings: Array.from(reportDevices.values())\r\n .filter((x) => x.channels && x.channels.length)\r\n .map((x) => ({\r\n Id: x.id,\r\n ChannelIds: x.channels || [],\r\n })),\r\n },\r\n `${filename}_${dayjs().format(\"YYYYMMDDhhmm\")}`\r\n );\r\n }\r\n }\r\n\r\n function onReportDeviceChange(reportDevice: IReportDevice) {\r\n if (reportDevices.has(reportDevice.id)) {\r\n reportDevices.delete(reportDevice.id);\r\n setReportDevices(new Map(reportDevices));\r\n } else {\r\n setReportDevices(new Map(reportDevices.set(reportDevice.id, reportDevice)));\r\n }\r\n }\r\n\r\n function onChannelsChange(reportDevice: IReportDevice) {\r\n if (reportDevices.has(reportDevice.id)) {\r\n setReportDevices(new Map(reportDevices.set(reportDevice.id, reportDevice)));\r\n }\r\n }\r\n\r\n return (\r\n \r\n {responsive.middle ? : }\r\n \r\n \r\n \r\n \r\n Построение отчетов\r\n \r\n \r\n \r\n \r\n Интервал\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Объекты и датчики\r\n \r\n {devices.map((x) => (\r\n \r\n ))}\r\n \r\n \r\n Загрузить отчет\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ReportView;\r\n","import { styled } from \"baseui\";\r\nimport React, { useState, useEffect, useReducer } from \"react\";\r\nimport { AuthContext } from \"./auth/AuthContext\";\r\nimport http from \"./api/http\";\r\nimport AuthRoute from \"./auth/AuthRoute\";\r\nimport { BrowserRouter as Router, Switch } from \"react-router-dom\";\r\nimport LoginView from \"./views/LoginView\";\r\nimport MonitoringView from \"./views/MonitoringView\";\r\nimport ReportView from \"./views/ReportView\";\r\nimport { YMaps } from \"react-yandex-maps\";\r\nimport { UserContext } from \"./store/UserContext\";\r\nimport { IUser, getUser } from \"./api/account\";\r\nimport { MonitoringContext, monitoringReducer } from \"./store/MonitoringContext\";\r\n\r\nconst AppContainer = styled(\"div\", {\r\n textAlign: \"left\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n});\r\n\r\nconst App: React.FC = () => {\r\n const [isLoggedIn, setIsLoggedIn] = useState(!!localStorage.getItem(\"token\"));\r\n const [user, setUser] = useState();\r\n const [state, dispatch] = useReducer(monitoringReducer, {});\r\n\r\n useEffect(() => {\r\n async function loadInitialData() {\r\n const user = await getUser();\r\n setUser(user);\r\n }\r\n\r\n if (isLoggedIn) {\r\n http.defaults.headers.common[\"Authorization\"] = \"Bearer \" + localStorage.getItem(\"token\");\r\n loadInitialData();\r\n }\r\n }, []);\r\n return (\r\n \r\n \r\n {\r\n http.defaults.headers.common[\"Authorization\"] = \"Bearer \" + localStorage.getItem(\"token\");\r\n setIsLoggedIn(true);\r\n },\r\n logout: () => {\r\n setIsLoggedIn(false);\r\n localStorage.removeItem(\"token\");\r\n },\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n process.env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then(registration => {\r\n registration.unregister();\r\n })\r\n .catch(error => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","// Russian [ru]\r\nimport dayjs from \"dayjs\";\r\n\r\nconst monthStandalone = \"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь\".split(\"_\");\r\n\r\nconst monthShortStandalone = \"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.\".split(\"_\");\r\n\r\nfunction plural(word: any, num: any) {\r\n const forms = word.split(\"_\");\r\n return num % 10 === 1 && num % 100 !== 11\r\n ? forms[0]\r\n : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\r\n ? forms[1]\r\n : forms[2]; // eslint-disable-line\r\n}\r\nfunction relativeTimeWithPlural(number: any, withoutSuffix: any, key: any) {\r\n const format = {\r\n mm: withoutSuffix ? \"минута_минуты_минут\" : \"минуту_минуты_минут\",\r\n hh: \"час_часа_часов\",\r\n dd: \"день_дня_дней\",\r\n MM: \"месяц_месяца_месяцев\",\r\n yy: \"год_года_лет\",\r\n };\r\n if (key === \"m\") {\r\n return withoutSuffix ? \"минута\" : \"минуту\";\r\n }\r\n\r\n // @ts-ignore\r\n return `${number} ${plural(format[key], +number)}`;\r\n}\r\n\r\nconst locale = {\r\n name: \"ru\",\r\n weekdays: \"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота\".split(\"_\"),\r\n weekdaysShort: \"вск_пнд_втр_срд_чтв_птн_сбт\".split(\"_\"),\r\n weekdaysMin: \"вс_пн_вт_ср_чт_пт_сб\".split(\"_\"),\r\n months: monthStandalone,\r\n monthsShort: monthShortStandalone,\r\n weekStart: 1,\r\n formats: {\r\n LT: \"H:mm\",\r\n LTS: \"H:mm:ss\",\r\n L: \"DD.MM.YYYY\",\r\n LL: \"D MMMM YYYY г.\",\r\n LLL: \"D MMMM YYYY г., H:mm\",\r\n LLLL: \"dddd, D MMMM YYYY г., H:mm\",\r\n },\r\n relativeTime: {\r\n future: \"через %s\",\r\n past: \"%s назад\",\r\n s: \"несколько секунд\",\r\n m: relativeTimeWithPlural,\r\n mm: relativeTimeWithPlural,\r\n h: \"час\",\r\n hh: relativeTimeWithPlural,\r\n d: \"день\",\r\n dd: relativeTimeWithPlural,\r\n M: \"месяц\",\r\n MM: relativeTimeWithPlural,\r\n y: \"год\",\r\n yy: relativeTimeWithPlural,\r\n },\r\n ordinal: (n: any) => n,\r\n};\r\n// @ts-ignore\r\ndayjs.locale(locale, null, true);\r\n\r\nexport default locale;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.scss\";\r\nimport \"antd/dist/antd.css\";\r\nimport App from \"./App\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\nimport \"./dayjsru\";\r\nimport CssBaseline from \"@material-ui/core/CssBaseline\";\r\nimport { MuiPickersUtilsProvider } from \"@material-ui/pickers\";\r\nimport DayjsUtils from \"@date-io/dayjs\";\r\nimport { ThemeProvider } from \"@material-ui/core/styles\";\r\nimport theme from \"./theme\";\r\nimport { Client as Styletron } from \"styletron-engine-atomic\";\r\nimport { Provider as StyletronProvider } from \"styletron-react\";\r\nimport { LightTheme, BaseProvider } from \"baseui\";\r\n\r\nconst engine = new Styletron();\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}