forked from ddrilling/AsbCloudServer
1 line
132 KiB
Plaintext
1 line
132 KiB
Plaintext
{"version":3,"sources":["images/logo_32.png","components/Loader.jsx","services/api/core/ApiError.ts","services/api/core/OpenAPI.ts","services/api/core/request.ts","services/api/services/DataService.ts","services/api/services/MessageService.ts","services/api/services/ReportService.ts","services/api/services/WellService.ts","pages/Login.jsx","services/api/services/AuthService.ts","components/LoaderPortal.jsx","components/notify.js","pages/Wells.jsx","pages/Files.jsx","services/UidGenerator.ts","components/charts/ChartTimeBase.tsx","components/charts/ChartTimeArchive.jsx","components/ArchiveColumn.jsx","pages/Archive.jsx","pages/Messages.jsx","services/signalr/index.ts","pages/Report.jsx","pages/Analysis.jsx","components/charts/ChartTimeOnline.tsx","components/Display.jsx","components/ChartTimeOnlineFooter.jsx","components/CustomColumn.jsx","components/UserOfWells.jsx","components/ModeDisplay.jsx","pages/TelemetryView.jsx","components/Well.jsx","components/WellTreeSelector.jsx","pages/Header.jsx","pages/LayoutPortal.jsx","pages/Main.jsx","components/PrivateRoute.jsx","App.js","reportWebVitals.js","index.js"],"names":["Loader","className","ApiError","Error","constructor","response","message","super","url","status","statusText","body","this","OpenAPI","BASE","VERSION","WITH_CREDENTIALS","TOKEN","undefined","USERNAME","PASSWORD","HEADERS","isDefined","value","isString","isStringWithValue","isBlob","Blob","getUrl","options","path","replace","query","params","qs","Object","keys","forEach","key","Array","isArray","push","encodeURIComponent","String","length","join","getQueryString","async","resolve","resolver","getHeaders","token","username","password","defaultHeaders","headers","Headers","Accept","append","credentials","btoa","type","getRequestBody","formData","FormData","getFormData","JSON","stringify","request","method","fetch","sendRequest","responseBody","contentType","get","toLowerCase","startsWith","json","text","error","console","getResponseBody","responseHeader","content","getResponseHeader","result","ok","400","401","403","404","500","502","503","errors","catchErrors","DataService","wellId","begin","intervalSec","approxPointsCount","__request","MessageService","skip","take","categoryids","end","ReportService","stepSeconds","format","reportName","WellService","login","requestBody","Login","loader","setLoader","useState","history","useHistory","logoIcon","src","logo","alt","title","bordered","style","width","extra","onFinish","user","localStorage","setUser","e","notification","description","Item","name","rules","required","placeholder","prefix","UserOutlined","Password","LockOutlined","htmlType","LoaderPortal","show","fade","children","typeDictionary","notify","placement","duration","columns","dataIndex","Wells","props","wells","setWells","useEffect","newWells","getWells","map","w","id","log","updateWellsList","dataSource","onRow","record","onClick","event","Files","generateUUID","seed","Date","getTime","performance","now","c","random","Math","floor","toString","Chart","register","TimeScale","LinearScale","LineController","LineElement","PointElement","Legend","ChartDataLabels","defaultOptions","responsive","aspectRatio","animation","events","scales","y","reverse","time","stepSize","displayFormats","millisecond","second","minute","hour","day","week","month","quarter","year","grid","drawTicks","ticks","z","display","textStrokeColor","textStrokeWidth","color","x","position","beginAtZero","elements","point","radius","hoverRadius","plugins","legend","datalabels","ChartTimeBase","dataParams","chartRef","useRef","chart","setChart","current","thisOptions","assign","newChart","data","destroy","yStart","interval","Number","yInterval","start","setSeconds","getSeconds","unit","timeUnitByInterval","round","timeParamsByInterval","max","min","displayLabels","update","ref","CreateDataset","lineConfig","borderColor","backgroundColor","label","borderWidth","borderDash","dash","ChartOptions","ChartTimeArchive","lines","yDisplay","rangeDate","chartRatio","setDataParams","datasets","newDatasets","lineCfg","dataset","dataItem","xAccessorName","yAccessorName","startDate","moment","opt","Option","Select","linesCollection","tagRender","closable","onClose","find","l","onMouseDown","preventDefault","stopPropagation","marginRight","ArchiveColumn","config","onRemoveChart","onSaveConfig","setLines","selectedValues","line","select","mode","allowClear","showArrow","onChange","linesKeys","newLines","filter","includes","minWidth","maxWidth","popBar","DeleteOutlined","RangePicker","DatePicker","SaveObject","obj","setItem","Archive","useParams","saubData","setSaubData","chartsCfgs","setChartsCfgs","setRangeDate","subtract","geometry","setGeometry","ratioRest","ratio1st","wRest","w1st","chartsCfgsKey","chartsContainerRef","handleReceiveDataSaub","newChartCfgs","cfg","useLayoutEffect","offsetWidth","ot","offsetTop","h","offsetParent","offsetHeight","chartsCount","labelLenght","cfgs","getItem","parse","LoadObject","toISOString","getData","then","catch","finally","charts","i","flex","disabled","locale","showTime","range","categoryDictionary","1","2","3","render","item","_","categoryId","ellipsis","filterOptions","Messages","messages","setMessages","pagination","setPagination","page","setPage","setRange","categories","setCategories","paginatedMessages","getMessage","items","m","date","total","count","ex","GetMessages","rowClassName","size","pageSize","showSizeChanger","rowKey","ConnectionOptions","accessTokenFactory","transport","Connections","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","connectionPromise","GetConnectionAsync","Connection","hubUrl","state","HubConnectionState","Disconnected","Connected","Subscribe","methodName","groupName","handler","connection","send","on","off","reportDatesRange","from","to","timePeriodNames","600","86400","604800","imgPaths","Report","step","setStep","setFormat","approxPages","setPagesCount","suitableReports","setSuitableReports","getReportFile","download","ReportCreationNotify","progressData","progress","operation","percent","reportFileName","element","target","href","Authorization","blob","reader","FileReader","readAsDataURL","onload","click","approxPagesResponse","getReportSize","getRepostSizeAsync","getSuitableReportsNames","reportFormat","reportParams","toLocaleDateString","toLocaleString","getSuitableReportsAsync","getReportsDateRange","getDatesRange","layout","initialValues","remember","taskId","createReport","values","unSubscribeReportHub","open","initialValue","disabledDate","From","To","onCalendarChange","dates","dateStrings","info","Group","Button","Analysis","GetOrCreateDatasetByLineConfig","d","showLine","ChartTimeOnline","preDataParams","points","xConstValue","sort","a","b","splice","borderRadius","context","formatter","toLocaleTimeString","toPrecision","padding","align","anchor","clip","ValueDisplay","suffix","isArrowVisible","oldVal","setOldVal","NaN","val","setVal","arrowState","setArrowState","isFinite","newArrowState","arrow","CaretUpOutlined","CaretDownOutlined","Display","flexGrow","ChartTimeOnlineFooter","lineIdle","lineSp","linesOther","sp","idle","spField","popContent","ControlOutlined","CustomColumn","dataLast","accessorName","units","UserOfWells","modeNames","0","4","5","6","10","ModeDisplay","index","paramsGroups","linePv","lineOther","Column","lineGroup","pv","sorter","sortDirections","onFilter","indexOf","TelemetryView","chartInterval","setChartInterval","handleReceiveMessages","promiseData","promiseMessages","Promise","all","unSubscribeDataSaubHub","unSubscribeMessagesHub","colSpan","marginBottom","defaultValue","span","group","showHeader","Content","Layout","Well","selectable","icon","FundViewOutlined","FolderOutlined","pathname","groupBy","table","groups","reduce","rv","keyValue","o","slice","WellTreeSelector","wellsTree","setWellsTree","dropdownMatchSelectWidth","treeData","treeDefaultExpandAll","onSelect","Header","PageHeader","wellsList","removeItem","LayoutPortal","Main","PrivateRoute","rest","location","App","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.98821dab.chunk.js","sourcesContent":["export default \"data:image/png;base64,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\"","/* original from https://loading.io/css/ */\r\nexport default function Loader(){\r\n return(<div className=\"lds-ripple\"><div></div><div></div></div>)\r\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { ApiResult } from './ApiResult';\n\nexport class ApiError extends Error {\n public readonly url: string;\n public readonly status: number;\n public readonly statusText: string;\n public readonly body: any;\n\n constructor(response: ApiResult, message: string) {\n super(message);\n\n this.url = response.url;\n this.status = response.status;\n this.statusText = response.statusText;\n this.body = response.body;\n }\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { ApiRequestOptions } from './ApiRequestOptions';\n\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\ntype Headers = Record<string, string>;\n\ntype Config = {\n BASE: string;\n VERSION: string;\n WITH_CREDENTIALS: boolean;\n TOKEN?: string | Resolver<string>;\n USERNAME?: string | Resolver<string>;\n PASSWORD?: string | Resolver<string>;\n HEADERS?: Headers | Resolver<Headers>;\n}\n\nexport const OpenAPI: Config = {\n BASE: '',\n VERSION: '1',\n WITH_CREDENTIALS: false,\n TOKEN: undefined,\n USERNAME: undefined,\n PASSWORD: undefined,\n HEADERS: undefined,\n};","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport { ApiError } from './ApiError';\nimport type { ApiRequestOptions } from './ApiRequestOptions';\nimport type { ApiResult } from './ApiResult';\nimport { OpenAPI } from './OpenAPI';\n\nfunction isDefined<T>(value: T | null | undefined): value is Exclude<T, null | undefined> {\n return value !== undefined && value !== null;\n}\n\nfunction isString(value: any): value is string {\n return typeof value === 'string';\n}\n\nfunction isStringWithValue(value: any): value is string {\n return isString(value) && value !== '';\n}\n\nfunction isBlob(value: any): value is Blob {\n return value instanceof Blob;\n}\n\nfunction getQueryString(params: Record<string, any>): string {\n const qs: string[] = [];\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (isDefined(value)) {\n if (Array.isArray(value)) {\n value.forEach(value => {\n qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n });\n } else {\n qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n }\n }\n });\n if (qs.length > 0) {\n return `?${qs.join('&')}`;\n }\n return '';\n}\n\nfunction getUrl(options: ApiRequestOptions): string {\n const path = options.path.replace(/[:]/g, '_');\n const url = `${OpenAPI.BASE}${path}`;\n\n if (options.query) {\n return `${url}${getQueryString(options.query)}`;\n }\n return url;\n}\n\nfunction getFormData(params: Record<string, any>): FormData {\n const formData = new FormData();\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (isDefined(value)) {\n formData.append(key, value);\n }\n });\n return formData;\n}\n\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\n\nasync function resolve<T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> {\n if (typeof resolver === 'function') {\n return (resolver as Resolver<T>)(options);\n }\n return resolver;\n}\n\nasync function getHeaders(options: ApiRequestOptions): Promise<Headers> {\n const token = await resolve(options, OpenAPI.TOKEN);\n const username = await resolve(options, OpenAPI.USERNAME);\n const password = await resolve(options, OpenAPI.PASSWORD);\n const defaultHeaders = await resolve(options, OpenAPI.HEADERS);\n\n const headers = new Headers({\n Accept: 'application/json',\n ...defaultHeaders,\n ...options.headers,\n });\n\n if (isStringWithValue(token)) {\n headers.append('Authorization', `Bearer ${token}`);\n }\n\n if (isStringWithValue(username) && isStringWithValue(password)) {\n const credentials = btoa(`${username}:${password}`);\n headers.append('Authorization', `Basic ${credentials}`);\n }\n\n if (options.body) {\n if (isBlob(options.body)) {\n headers.append('Content-Type', options.body.type || 'application/octet-stream');\n } else if (isString(options.body)) {\n headers.append('Content-Type', 'text/plain');\n } else {\n headers.append('Content-Type', 'application/json');\n }\n }\n return headers;\n}\n\nfunction getRequestBody(options: ApiRequestOptions): BodyInit | undefined {\n if (options.formData) {\n return getFormData(options.formData);\n }\n if (options.body) {\n if (isString(options.body) || isBlob(options.body)) {\n return options.body;\n } else {\n return JSON.stringify(options.body);\n }\n }\n return undefined;\n}\n\nasync function sendRequest(options: ApiRequestOptions, url: string): Promise<Response> {\n const request: RequestInit = {\n method: options.method,\n headers: await getHeaders(options),\n body: getRequestBody(options),\n };\n if (OpenAPI.WITH_CREDENTIALS) {\n request.credentials = 'include';\n }\n return await fetch(url, request);\n}\n\nfunction getResponseHeader(response: Response, responseHeader?: string): string | null {\n if (responseHeader) {\n const content = response.headers.get(responseHeader);\n if (isString(content)) {\n return content;\n }\n }\n return null;\n}\n\nasync function getResponseBody(response: Response): Promise<any> {\n try {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n const isJSON = contentType.toLowerCase().startsWith('application/json');\n if (isJSON) {\n return await response.json();\n } else {\n return await response.text();\n }\n }\n } catch (error) {\n console.error(error);\n }\n return null;\n}\n\nfunction catchErrors(options: ApiRequestOptions, result: ApiResult): void {\n const errors: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n ...options.errors,\n }\n\n const error = errors[result.status];\n if (error) {\n throw new ApiError(result, error);\n }\n\n if (!result.ok) {\n throw new ApiError(result, 'Generic Error');\n }\n}\n\n/**\n * Request using fetch client\n * @param options The request options from the the service\n * @returns ApiResult\n * @throws ApiError\n */\nexport async function request(options: ApiRequestOptions): Promise<ApiResult> {\n const url = getUrl(options);\n const response = await sendRequest(options, url);\n const responseBody = await getResponseBody(response);\n const responseHeader = getResponseHeader(response, options.responseHeader);\n\n const result: ApiResult = {\n url,\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n body: responseHeader || responseBody,\n };\n\n catchErrors(options, result);\n return result;\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { DataSaubBaseDto } from '../models/DataSaubBaseDto';\nimport type { DatesRangeDto } from '../models/DatesRangeDto';\nimport { request as __request } from '../core/request';\n\nexport class DataService {\n\n /**\n * Возвращает данные САУБ по скважине.\r\n * По умолчанию за последние 10 минут.\n * @param wellId id скважины\n * @param begin дата начала выборки. По умолчанию: текущее время - intervalSec\n * @param intervalSec интервал времени даты начала выборки, секунды\n * @param approxPointsCount желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена.\n * @returns DataSaubBaseDto Success\n * @throws ApiError\n */\n public static async getData(\nwellId: number,\nbegin?: string,\nintervalSec: number = 600,\napproxPointsCount: number = 1024,\n): Promise<Array<DataSaubBaseDto>> {\n const result = await __request({\n method: 'GET',\n path: `/api/well/${wellId}/data`,\n query: {\n 'begin': begin,\n 'intervalSec': intervalSec,\n 'approxPointsCount': approxPointsCount,\n },\n });\n return result.body;\n }\n\n /**\n * @param wellId \n * @returns DatesRangeDto Success\n * @throws ApiError\n */\n public static async getDataDatesRange(\nwellId: number,\n): Promise<DatesRangeDto> {\n const result = await __request({\n method: 'GET',\n path: `/api/well/${wellId}/dataDatesRange`,\n });\n return result.body;\n }\n\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { DatesRangeDto } from '../models/DatesRangeDto';\nimport type { MessageDtoPaginationContainer } from '../models/MessageDtoPaginationContainer';\nimport { request as __request } from '../core/request';\n\nexport class MessageService {\n\n /**\n * Выдает список сообщений по скважине\n * @param wellId id скважины\n * @param skip для пагинации кол-во записей пропустить\n * @param take для пагинации кол-во записей\n * @param categoryids список категорий\n * @param begin дата начала\n * @param end окончание\n * @returns MessageDtoPaginationContainer Success\n * @throws ApiError\n */\n public static async getMessage(\nwellId: number,\nskip: number,\ntake: number = 32,\ncategoryids?: Array<number>,\nbegin?: string,\nend?: string,\n): Promise<MessageDtoPaginationContainer> {\n const result = await __request({\n method: 'GET',\n path: `/api/well/${wellId}/message`,\n query: {\n 'skip': skip,\n 'take': take,\n 'categoryids': categoryids,\n 'begin': begin,\n 'end': end,\n },\n });\n return result.body;\n }\n\n /**\n * @param wellId \n * @returns DatesRangeDto Success\n * @throws ApiError\n */\n public static async getMessagesDateRange(\nwellId: number,\n): Promise<DatesRangeDto> {\n const result = await __request({\n method: 'GET',\n path: `/api/well/${wellId}/messagesDatesRange`,\n });\n return result.body;\n }\n\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { DatesRangeDto } from '../models/DatesRangeDto';\nimport { request as __request } from '../core/request';\n\nexport class ReportService {\n\n /**\n * Создает отчет по скважине с указанными параметрами\n * @param wellId id скважины\n * @param stepSeconds шаг интервала\n * @param format формат отчета (0-PDF, 1-LAS)\n * @param begin дата начала интервала\n * @param end дата окончания интервала\n * @returns number Success\n * @throws ApiError\n */\n public static async createReport(\nwellId: number,\nstepSeconds?: number,\nformat?: number,\nbegin?: string,\nend?: string,\n): Promise<number> {\n const result = await __request({\n method: 'POST',\n path: `/api/report/${wellId}/report`,\n query: {\n 'stepSeconds': stepSeconds,\n 'format': format,\n 'begin': begin,\n 'end': end,\n },\n });\n return result.body;\n }\n\n /**\n * Возвращает файл-отчет с диска на сервере\n * @param wellId id скважины\n * @param reportName имя запрашиваемого файла (отчета)\n * @returns string Success\n * @throws ApiError\n */\n public static async getReport(\nwellId: number,\nreportName: string,\n): Promise<string> {\n const result = await __request({\n method: 'GET',\n path: `/api/report/${wellId}/${reportName}`,\n });\n return result.body;\n }\n\n /**\n * Возвращает имена отчетов, хранящихся на диске,\r\n * которые подходят под указанные параметры\n * @param wellId id скважины\n * @param stepSeconds шаг интервала\n * @param format формат отчета (0-PDF, 1-LAS)\n * @param begin дата начала интервала\n * @param end дата окончания интервала\n * @returns string Success\n * @throws ApiError\n */\n public static async getSuitableReportsNames(\nwellId: number,\nstepSeconds?: number,\nformat?: number,\nbegin?: string,\nend?: string,\n): Promise<Array<string>> {\n const result = await __request({\n method: 'GET',\n path: `/api/report/${wellId}/suitableReports`,\n query: {\n 'stepSeconds': stepSeconds,\n 'format': format,\n 'begin': begin,\n 'end': end,\n },\n });\n return result.body;\n }\n\n /**\n * Возвращает прогнозируемое количество страниц будущего отчета\n * @param wellId id скважины\n * @param stepSeconds шаг интервала\n * @param format формат отчета (0-PDF, 1-LAS)\n * @param begin дата начала интервала\n * @param end дата окончания интервала\n * @returns string Success\n * @throws ApiError\n */\n public static async getReportSize(\nwellId: number,\nstepSeconds?: number,\nformat?: number,\nbegin?: string,\nend?: string,\n): Promise<string> {\n const result = await __request({\n method: 'GET',\n path: `/api/report/${wellId}/reportSize`,\n query: {\n 'stepSeconds': stepSeconds,\n 'format': format,\n 'begin': begin,\n 'end': end,\n },\n });\n return result.body;\n }\n\n /**\n * Возвращает даты самого старого и самого свежего отчетов в БД\n * @param wellId id скважины\n * @returns DatesRangeDto Success\n * @throws ApiError\n */\n public static async getReportsDateRange(\nwellId: number,\n): Promise<DatesRangeDto> {\n const result = await __request({\n method: 'GET',\n path: `/api/report/${wellId}/reportsDatesRange`,\n });\n return result.body;\n }\n\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { WellDto } from '../models/WellDto';\nimport { request as __request } from '../core/request';\n\nexport class WellService {\n\n /**\n * @returns WellDto Success\n * @throws ApiError\n */\n public static async getWells(): Promise<Array<WellDto>> {\n const result = await __request({\n method: 'GET',\n path: `/api/well`,\n });\n return result.body;\n }\n\n /**\n * @returns WellDto Success\n * @throws ApiError\n */\n public static async getTransmittingWells(): Promise<Array<WellDto>> {\n const result = await __request({\n method: 'GET',\n path: `/api/well/transmittingWells`,\n });\n return result.body;\n }\n\n}","import { Card, Form, Input, Button, notification } from 'antd';\r\nimport { UserOutlined, LockOutlined } from '@ant-design/icons'\r\nimport logo from '../images/logo_32.png'\r\nimport Loader from '../components/Loader'\r\nimport { useState } from 'react'\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { AuthService, OpenAPI } from '../services/api/'\r\n\r\nconst { login } = AuthService\r\n\r\nconst openNotificationError = (message, title) => {\r\n notification['error']({\r\n message: title||'Ошибка',\r\n description: message,\r\n });\r\n};\r\n\r\nconst setUser = (user) =>{ \r\n OpenAPI.TOKEN = user.token\r\n localStorage['token'] = user.token\r\n localStorage['login'] = user.login\r\n}\r\n\r\nexport default function Login() {\r\n const [loader, setLoader] = useState(false);\r\n const history = useHistory();\r\n\r\n const logoIcon = <img src={logo} alt=\"АСБ\" className=\"logo\"/>\r\n\r\n let handleLogin = async (formData) =>{\r\n setLoader(true)\r\n try{\r\n let user = await login(formData)\r\n setUser(user)\r\n setLoader(false)\r\n history.push('well') \r\n }catch(e){\r\n if(e.status === 400)\r\n openNotificationError(e.message)\r\n console.error(`Error ${e}`) \r\n setLoader(false)\r\n }\r\n }\r\n \r\n return (\r\n <div className='login_page shadow'>\r\n <Card title=\"Система мониторинга\" className='shadow' bordered={true} style={{ width: 350 }} extra={logoIcon}>\r\n <Form onFinish={handleLogin}>\r\n <Form.Item\r\n name=\"login\"\r\n rules={[{ required: true, message: 'Пожалуйста введите имя!' }]}>\r\n <Input placeholder=\"Пользователь\" prefix={<UserOutlined />}/>\r\n </Form.Item>\r\n\r\n <Form.Item\r\n name=\"password\"\r\n rules={[{ required: true, message: 'Пожалуйста введите пароль!' }]}\r\n >\r\n <Input.Password placeholder='пароль' prefix={<LockOutlined />}/>\r\n </Form.Item>\r\n\r\n <Form.Item>\r\n <Button type=\"primary\" htmlType=\"submit\">\r\n Вход\r\n </Button>\r\n </Form.Item> \r\n </Form>\r\n </Card>\r\n {loader && <Loader/>}\r\n </div> \r\n )\r\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { AuthDto } from '../models/AuthDto';\nimport type { UserTokenDto } from '../models/UserTokenDto';\nimport { request as __request } from '../core/request';\n\nexport class AuthService {\n\n /**\n * Аутентификация пользователя\n * @param requestBody \n * @returns UserTokenDto новый токен\n * @throws ApiError\n */\n public static async login(\nrequestBody?: AuthDto,\n): Promise<UserTokenDto> {\n const result = await __request({\n method: 'POST',\n path: `/auth/login`,\n body: requestBody,\n errors: {\n 400: `логин и пароль не подходят`,\n },\n });\n return result.body;\n }\n\n /**\n * Продление срока действия токена\n * @returns any Success\n * @throws ApiError\n */\n public static async refresh(): Promise<any> {\n const result = await __request({\n method: 'GET',\n path: `/auth/refresh`,\n });\n return result.body;\n }\n\n}","import Loader from './Loader'\r\n\r\nexport default function LoaderPortal({show, fade=true, children}){\r\n return(\r\n <div className='loader-container'>\r\n <div className='loader-content'>\r\n {children}\r\n </div>\r\n {show && fade && <div className='loader-fade'/>} \r\n {show && <div className='loader-overlay'><Loader/></div>}\r\n </div>)\r\n}","import { notification } from 'antd';\r\n\r\nconst typeDictionary = {\r\n 'error': 'Ошибка',\r\n 'warning': 'Предупрежение',\r\n 'info': 'Информация'\r\n\r\n}\r\n/**\r\n * Вызов оповещений всплывающим окошком.\r\n * @param body string или ReactNode\r\n * @param type для параметра типа. Допустимые значение 'error', 'warning', 'info'\r\n */\r\nexport default function notify(body, type='info'){\r\n\r\n notification[type]({\r\n description: body,\r\n message: typeDictionary[type],\r\n type,\r\n placement: \"bottomRight\",\r\n duration: 10,\r\n })\r\n\r\n}","import { useState, useEffect } from 'react'\r\nimport { WellService } from '../services/api'\r\nimport LoaderPortal from '../components/LoaderPortal'\r\nimport { Table } from 'antd' // TreeSelect \r\nimport { useHistory } from 'react-router-dom'\r\nimport notify from '../components/notify'\r\n\r\nconst columns = [\r\n {\r\n title: 'Месторождение',\r\n dataIndex: 'deposit',\r\n key: 'deposit',\r\n },\r\n {\r\n title: 'Куст',\r\n dataIndex: 'cluster',\r\n key: 'cluster',\r\n },\r\n {\r\n title: 'Скважина',\r\n dataIndex: 'caption',\r\n key: 'caption',\r\n }, \r\n {\r\n title: 'Данные',\r\n dataIndex: 'lastData',\r\n key: 'lastData',\r\n },\r\n];\r\n\r\nexport default function Wells(props){\r\n const [wells, setWells] = useState([])\r\n const [loader, setLoader] = useState(false)\r\n const history = useHistory()\r\n\r\n const updateWellsList = async () => {\r\n setLoader(true)\r\n try{\r\n let newWells = (await WellService.getWells()).map(w =>{return {key:w.id, ...w}})\r\n console.log(newWells)\r\n setWells( newWells )\r\n }\r\n catch(e){\r\n notify('Не удалось загрузить список скважин', 'error')\r\n console.error(`${e}`);\r\n }\r\n setLoader(false)\r\n }\r\n\r\n useEffect(()=>updateWellsList(), [])\r\n\r\n return(<>\r\n <h2>Скважины</h2>\r\n <LoaderPortal show={loader}>\r\n <Table \r\n dataSource={wells} \r\n columns={columns}\r\n onRow={(record) => {\r\n return {\r\n onClick: event => {history.push(`/well/${record.id}/`)},\r\n };\r\n }}/>\r\n </LoaderPortal>\r\n </>)\r\n}","export default function Files(props) {\r\n return (\r\n <div className=\"menu-title\">\r\n <h2>Файлы</h2>\r\n </div>\r\n )\r\n}","export function generateUUID():string {\r\n let seed = (25869874412483\r\n * new Date().getTime()\r\n * (performance && performance.now && (performance.now()))) % 173395562924509\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n let random = Math.random()\r\n seed = seed > 272\r\n ? seed = seed / 17\r\n : seed = (seed * random * random * 557833831325167) % 173395562924509\r\n random = Math.floor((random * seed) % 16)\r\n return (c === 'x' ? random : (random & 0xB)).toString(16)\r\n })\r\n}","import { useEffect, useRef, useState} from 'react';\r\nimport { \r\n Chart, \r\n TimeScale, \r\n LinearScale, \r\n Legend, \r\n LineController, \r\n PointElement, \r\n LineElement, \r\n ChartData, \r\n ChartTypeRegistry, \r\n ChartOptions} from 'chart.js'\r\nimport 'chartjs-adapter-moment';\r\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\r\n\r\nChart.register( TimeScale, LinearScale, LineController, LineElement, PointElement, Legend, ChartDataLabels );\r\n\r\nconst defaultOptions = {\r\n responsive: true,\r\n aspectRatio: 0.45,\r\n animation: false, \r\n events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\r\n scales: {\r\n y:{\r\n type: 'time',\r\n reverse: true,\r\n time: {\r\n stepSize: 20,\r\n displayFormats: {\r\n millisecond: 'HH:mm:ss.SSS',\r\n second: 'HH:mm:ss',\r\n minute: 'HH:mm:ss',\r\n hour: 'DD HH:mm:ss',\r\n day: 'MM.DD HH:mm',\r\n week: 'yy.MM.DD HH:mm',\r\n month: 'yyyy.MM.DD',\r\n quarter: 'yyyy.MM.DD',\r\n year: 'yyyy.MM',\r\n },\r\n },\r\n grid:{\r\n drawTicks: false,\r\n },\r\n ticks: {\r\n z: 1,\r\n display : false,\r\n textStrokeColor : \"#ffff\",\r\n textStrokeWidth : 2,\r\n color:\"#000\",\r\n }\r\n },\r\n \r\n x:{\r\n type:'linear',\r\n position:'top',\r\n beginAtZero: true\r\n }\r\n },\r\n elements:{\r\n point:{\r\n radius:0,\r\n hoverRadius:5,\r\n },\r\n },\r\n plugins:{\r\n legend:{\r\n display: false,\r\n },\r\n datalabels: {\r\n display: false,\r\n },\r\n }\r\n}\r\n\r\nexport type ChartTimeData = ChartData<keyof ChartTypeRegistry, {\r\n x: number;\r\n label: number;\r\n y: Date;\r\n}[], unknown>\r\n\r\nexport type ChartTimeDataParams = {\r\n data: ChartTimeData,\r\n yStart?: Date,\r\n yInterval?: number,\r\n displayLabels?: Boolean,\r\n}\r\n\r\nexport type ChartTimeBaseProps = {\r\n dataParams: ChartTimeDataParams,\r\n // TODO: Create good type for options\r\n options?: ChartOptions<keyof ChartTypeRegistry> | any,\r\n}\r\n\r\nexport type TimeParams = {\r\n unit: String\r\n stepSize: number\r\n}\r\n\r\nconst linesPerInterval = 32\r\n\r\nconst timeUnitByInterval = (intervalSec:number):String => {\r\n if(intervalSec <= 60)\r\n return 'millisecond'\r\n\r\n if(intervalSec <= 32*60)\r\n return 'second'\r\n\r\n if(intervalSec <= 32*60*60)\r\n return 'minute'\r\n \r\n if(intervalSec <= 32*12*60*60)\r\n return 'hour'\r\n \r\n if(intervalSec <= 32*24*60*60)\r\n return 'day'\r\n\r\n if(intervalSec <= 32*7*24*60*60)\r\n return 'week'\r\n \r\n if(intervalSec <= 32*30.4375*24*60*60)\r\n return 'month'\r\n\r\n if(intervalSec <= 32*121.75*24*60*60)\r\n return 'quarter'\r\n else\r\n return 'year'\r\n}\r\n\r\nconst timeParamsByInterval = (intervalSec:number) :TimeParams => {\r\n let stepSize = intervalSec\r\n let unit = timeUnitByInterval(intervalSec)\r\n\r\n switch(unit){\r\n case \"millisecond\":\r\n stepSize *= 1000\r\n break;\r\n case \"second\":\r\n //stepSize *= 1\r\n break;\r\n case \"minute\":\r\n stepSize /= 60\r\n break;\r\n case \"hour\":\r\n stepSize /= 60*60\r\n break;\r\n case \"day\":\r\n stepSize /= 24*60*60\r\n break;\r\n case \"week\":\r\n stepSize /= 7*24*60*60\r\n break;\r\n case \"month\":\r\n stepSize /= 30*24*60*60\r\n break;\r\n case \"quarter\":\r\n stepSize /= 91*24*60*60\r\n break;\r\n case \"year\":\r\n stepSize /= 365.25*24*60*60\r\n break;\r\n }\r\n \r\n stepSize = Math.round(stepSize/linesPerInterval)\r\n stepSize = stepSize > 0 ? stepSize : 1;\r\n return {unit, stepSize}\r\n}\r\n\r\nexport const ChartTimeBase: React.FC<ChartTimeBaseProps> = ({options, dataParams}) => { \r\n const chartRef = useRef<HTMLCanvasElement>(null)\r\n const [chart, setChart] = useState<any>()\r\n\r\n useEffect(()=>{\r\n if((chartRef.current)&&(!chart)){\r\n let thisOptions = {}\r\n Object.assign(thisOptions, defaultOptions, options)\r\n\r\n let newChart = new Chart(chartRef.current, {\r\n type: 'line', \r\n plugins: [ChartDataLabels],\r\n options: thisOptions,\r\n data: dataParams.data\r\n })\r\n setChart(newChart)\r\n\r\n return () => chart?.destroy()\r\n }\r\n }, [chart, options, dataParams])\r\n\r\n useEffect(()=>{\r\n if(!chart)\r\n return\r\n\r\n chart.data = dataParams.data\r\n chart.options.aspectRatio = options?.aspectRatio\r\n if(dataParams.yStart){\r\n let interval = Number(dataParams.yInterval ?? 600)\r\n let start = new Date(dataParams.yStart)\r\n let end = new Date(dataParams.yStart)\r\n end.setSeconds(end.getSeconds() + interval) \r\n let {unit, stepSize} = timeParamsByInterval(interval)\r\n\r\n if(chart.options.scales?.y){\r\n chart.options.scales.y.max = end.getTime()\r\n chart.options.scales.y.min = start.getTime()\r\n chart.options.scales.y.ticks.display = dataParams.displayLabels ?? true\r\n chart.options.scales.y.time.unit = unit\r\n chart.options.scales.y.time.stepSize = stepSize\r\n }\r\n }\r\n\r\n chart.update()\r\n }, [chart, dataParams, options])\r\n\r\n return(<canvas ref={chartRef} />)\r\n}","import moment from 'moment';\r\nimport { useEffect, useState} from 'react';\r\nimport {ChartTimeBase} from './ChartTimeBase'\r\n\r\nconst GetRandomColor = () => \"#\" + Math.floor(Math.random()*16777215).toString(16)\r\n\r\nconst CreateDataset = (lineConfig) => {\r\n let color = lineConfig.borderColor\r\n ?? lineConfig.backgroundColor\r\n ?? lineConfig.color\r\n ?? GetRandomColor()\r\n\r\n let dataset = {\r\n label: lineConfig.label,\r\n data: [],\r\n backgroundColor: lineConfig.backgroundColor ?? color,\r\n borderColor: lineConfig.borderColor ?? color,\r\n borderWidth: lineConfig.borderWidth ?? 1,\r\n borderDash: lineConfig.dash ?? [],\r\n }\r\n return dataset\r\n}\r\n\r\nconst ChartOptions = {\r\n // responsive: true,\r\n // plugins:{\r\n // legend:{\r\n // display: false,\r\n // maxHeight: 64,\r\n // fullSize: true,\r\n // posision:'chartArea',\r\n // align: 'start',\r\n // }\r\n // }\r\n}\r\n\r\nexport const ChartTimeArchive = ({lines, data, yDisplay, rangeDate, chartRatio}) => {\r\n const [dataParams, setDataParams] = useState({data:{datasets:[]}})\r\n\r\n useEffect(() => {\r\n if ((!lines)\r\n || (!data))\r\n return\r\n\r\n let newDatasets = lines.map(lineCfg => { \r\n let dataset = CreateDataset(lineCfg)\r\n dataset.data = data.map(dataItem => {\r\n return {\r\n x: dataItem[lineCfg.xAccessorName],\r\n y: new Date(dataItem[lineCfg.yAccessorName??'date'])\r\n }\r\n })\r\n return dataset\r\n })\r\n\r\n let interval = rangeDate ? (rangeDate[1] - rangeDate[0]) / 1000 : null\r\n let startDate = rangeDate ? rangeDate[0] : moment()\r\n let newParams = {\r\n yInterval: interval,\r\n yStart: startDate,\r\n displayLabels: yDisplay??false,\r\n data: {\r\n datasets: newDatasets\r\n }\r\n }\r\n setDataParams(newParams)\r\n }, [data, lines, yDisplay, rangeDate, chartRatio])\r\n\r\n const opt = ChartOptions\r\n opt.aspectRatio = chartRatio\r\n\r\n return (<ChartTimeBase dataParams={dataParams} options={opt}/>)\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport { Button, Select, Tag, Popover, Row, Tooltip } from 'antd';\r\nimport { ChartTimeArchive } from './charts/ChartTimeArchive';\r\nimport { DeleteOutlined } from '@ant-design/icons';\r\n\r\nconst { Option } = Select;\r\n\r\nconst linesCollection = [\r\n { label: \"Глубина забоя\", xAccessorName: \"wellDepth\", color: '#f00' },\r\n { label: \"Положение инструмента\", xAccessorName: \"bitDepth\", color: '#ff0' },\r\n { label: \"Положение талевого блока\", xAccessorName: \"blockPosition\", color: '#f0f' },\r\n { label: \"Талевый блок. Мин положение\", xAccessorName: \"blockPositionMin\", color: '#0ff' },\r\n { label: \"Талевый блок. Макс положение\", xAccessorName: \"blockPositionMax\", color: '#0f0' },\r\n { label: \"Скорость талевого блока\", xAccessorName: \"blockSpeed\", color: '#00f' },\r\n\r\n { label: \"Скорости талевого блока. Задание\", xAccessorName: \"blockSpeedSp\", color: '#c00' },\r\n { label: \"Талевый блок. Задание скорости для роторного бурения\", xAccessorName: \"blockSpeedSpRotor\", color: '#cc0' },\r\n { label: \"Талевый блок. Задание скорости для режима слайда\", xAccessorName: \"blockSpeedSpSlide\", color: '#c0c' },\r\n { label: \"Талевый блок. Задание скорости для проработки\", xAccessorName: \"blockSpeedSpDevelop\", color: '#0cc' },\r\n { label: \"Давление\", xAccessorName: \"pressure\", color: '#0c0' },\r\n { label: \"Давление. Холостой ход\", xAccessorName: \"pressureIdle\", color: '#00c' },\r\n \r\n { label: \"Давление. Задание\", xAccessorName: \"pressureSp\", color: '#900' },\r\n { label: \"Давление. Задание для роторного бурения\", xAccessorName: \"pressureSpRotor\", color: '#990' },\r\n { label: \"Давление. Задание для режима слайда\", xAccessorName: \"pressureSpSlide\", color: '#909' },\r\n { label: \"Давление. Задание для проработки\", xAccessorName: \"pressureSpDevelop\", color: '#099' },\r\n { label: \"Давление дифф. Аварийное макс.\", xAccessorName: \"pressureDeltaLimitMax\", color: '#090' },\r\n { label: \"Осевая нагрузка\", xAccessorName: \"axialLoad\", color: '#009' },\r\n \r\n { label: \"Осевая нагрузка. Задание\", xAccessorName: \"axialLoadSp\", color: '#600' },\r\n { label: \"Осевая нагрузка. Аварийная макс.\", xAccessorName: \"axialLoadLimitMax\", color: '#660' },\r\n { label: \"Вес на крюке\", xAccessorName: \"hookWeight\", color: '#606' },\r\n { label: \"Вес на крюке. Холостой ход\", xAccessorName: \"hookWeightIdle\", color: '#066' },\r\n { label: \"Вес на крюке. Посадка\", xAccessorName: \"hookWeightLimitMin\", color: '#060' },\r\n { label: \"Вес на крюке. Затяжка\", xAccessorName: \"hookWeightLimitMax\", color: '#006' },\r\n \r\n { label: \"Момент на роторе\", xAccessorName: \"rotorTorque\", color: '#300' },\r\n { label: \"Момент на роторе. Холостой ход\", xAccessorName: \"rotorTorqueIdle\", color: '#330' },\r\n { label: \"Момент на роторе. Задание\", xAccessorName: \"rotorTorqueSp\", color: '#303' },\r\n { label: \"Момент на роторе. Аварийный макс.\", xAccessorName: \"rotorTorqueLimitMax\", color: '#033' },\r\n { label: \"Обороты ротора\", xAccessorName: \"rotorSpeed\", color: '#030' },\r\n { label: \"Расход\", xAccessorName: \"flow\", color: '#003' },\r\n \r\n { label: \"Расход. Холостой ход\", xAccessorName: \"flowIdle\", color: '#666' },\r\n { label: \"Расход. Аварийный макс.\", xAccessorName: \"flowDeltaLimitMax\", color: '#ccc' },\r\n]\r\n\r\nconst tagRender = ({ label, value, closable, onClose }) =>{ \r\n const onPreventMouseDown = event => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n\r\n let color = linesCollection.find(l=>l.xAccessorName === value)?.color\r\n return (\r\n <Tag\r\n onMouseDown={onPreventMouseDown}\r\n closable={closable}\r\n onClose={onClose}\r\n style={{ marginRight: 3 }}>\r\n <span style={{backgroundColor:color}}> </span>\r\n <span> {label}</span>\r\n </Tag>\r\n );\r\n}\r\n\r\nexport function ArchiveColumn({ data, config, rangeDate, chartRatio, onRemoveChart, onSaveConfig }) {\r\n const [lines, setLines] = useState([]);\r\n\r\n useEffect(() => {\r\n setLines(config.lines);\r\n },[config]);\r\n\r\n const handleLinesSetChange = (linesKeys) => {\r\n let newLines = linesCollection.filter(line => linesKeys.includes(line.xAccessorName));\r\n config.lines = newLines;\r\n if(onSaveConfig)\r\n onSaveConfig()\r\n setLines(newLines);\r\n };\r\n\r\n let selectedValues = lines?.map(line=>line.xAccessorName)??[]\r\n\r\n const select = <Select\r\n mode=\"multiple\" \r\n placeholder=\"Выберите линии\"\r\n value={selectedValues}\r\n allowClear={false}\r\n showArrow\r\n bordered={false}\r\n tagRender={tagRender}\r\n onChange={handleLinesSetChange}\r\n style={{ \r\n minWidth: \"300px\",\r\n maxWidth: \"400px\"\r\n }}\r\n >\r\n {linesCollection.map((line) => (<Option key={line.xAccessorName} value={line.xAccessorName} color={line.color}>{line.label}</Option>))}\r\n </Select>;\r\n\r\n const popBar = <Row>\r\n {select}\r\n <Tooltip title=\"Удалить этот график\">\r\n <Button onClick={() => onRemoveChart(config.id)}><DeleteOutlined /></Button>\r\n </Tooltip> \r\n </Row>\r\n\r\n return (\r\n <>\r\n <Popover content={popBar}>\r\n <div>\r\n <ChartTimeArchive\r\n data={data}\r\n yDisplay={config.yDisplay}\r\n lines={lines}\r\n rangeDate={rangeDate}\r\n chartRatio={chartRatio} \r\n />\r\n </div>\r\n </Popover>\r\n\r\n </>);\r\n}\r\n","import { useRef, useLayoutEffect, useState, useEffect } from 'react'\r\nimport {\r\n Button,\r\n DatePicker,\r\n ConfigProvider,\r\n Row,\r\n Col,\r\n Tooltip} from 'antd'\r\nimport { useParams } from 'react-router-dom'\r\nimport { DataService } from '../services/api'\r\nimport locale from 'antd/lib/locale/ru_RU'\r\nimport {generateUUID} from '../services/UidGenerator'\r\nimport { ArchiveColumn } from '../components/ArchiveColumn'\r\nimport moment from 'moment'\r\nimport notify from '../components/notify'\r\nimport LoaderPortal from '../components/LoaderPortal'\r\n\r\nconst { RangePicker } = DatePicker;\r\n\r\nconst SaveObject = (key, obj) => {\r\n let json = JSON.stringify(obj)\r\n localStorage.setItem(key, json)\r\n}\r\n\r\nconst LoadObject = (key) => {\r\n let json = localStorage.getItem(key)\r\n return json ? JSON.parse(json) : null \r\n}\r\n\r\nexport default function Archive() {\r\n let { id } = useParams();\r\n const [saubData, setSaubData] = useState([])\r\n const [chartsCfgs, setChartsCfgs] = useState([])\r\n const [rangeDate, setRangeDate] = useState([moment().subtract(3,'hours'), moment()])\r\n const [geometry, setGeometry] = useState({ratioRest:1, ratio1st:1, wRest:.5, w1st:.5}) \r\n const [loader, setLoader] = useState(false)\r\n const chartsCfgsKey = 'chartsCfgs'\r\n const chartsContainerRef = useRef();\r\n\r\n const handleReceiveDataSaub = (data) => {\r\n if (data)\r\n setSaubData(data)\r\n }\r\n \r\n const onAddChart = () => {\r\n let newChartCfgs = [...chartsCfgs, {id: generateUUID(), yDisplay: false, aspectRatio:1}]\r\n setChartsCfgs(newChartCfgs)\r\n }\r\n\r\n const onRemoveChart = (id) => {\r\n let newChartCfgs = chartsCfgs.filter(cfg => cfg.id !== id )\r\n setChartsCfgs(newChartCfgs)\r\n }\r\n\r\n const onSaveConfig = ()=>{ \r\n SaveObject(chartsCfgsKey, chartsCfgs)\r\n }\r\n\r\n const onChangeRange = (range) => {\r\n setRangeDate(range)\r\n }\r\n \r\n useLayoutEffect(()=>{\r\n if(chartsContainerRef.current && chartsCfgs?.length){\r\n let w = chartsContainerRef.current.offsetWidth //1792\r\n w = w > 0 ? w : 1792\r\n let ot = chartsContainerRef.current.offsetTop\r\n let ph = chartsContainerRef.current.offsetParent.offsetHeight\r\n let h = ph - ot - 32 //761 \r\n h = h > 0 ? h : 761\r\n\r\n let chartsCount = chartsCfgs.length\r\n\r\n let labelLenght = 8\r\n let borderWidth = 8\r\n let wRest = Math.floor((w - labelLenght)/chartsCount) - borderWidth\r\n let w1st = wRest + labelLenght\r\n\r\n let ratio1st = w1st/h\r\n let ratioRest = wRest/h\r\n\r\n setGeometry({ratio1st, ratioRest, w1st, wRest})\r\n }\r\n },[chartsContainerRef, chartsCfgs])\r\n\r\n useEffect(() => { \r\n let cfgs = LoadObject(chartsCfgsKey)\r\n if(cfgs)\r\n setChartsCfgs(cfgs)\r\n },[])\r\n\r\n useEffect(()=>{\r\n SaveObject(chartsCfgsKey, chartsCfgs)\r\n },[chartsCfgs])\r\n\r\n useEffect(() => {\r\n let interval = (rangeDate[1] - rangeDate[0]) / 1000\r\n let startDate = rangeDate[0].toISOString()\r\n \r\n setLoader(true)\r\n DataService.getData(id, startDate, interval, 2048)\r\n .then(handleReceiveDataSaub)\r\n .catch(error => {\r\n notify(`Не удалось загрузить данные по скважине (${id}) c ${rangeDate[0]} по ${rangeDate[1]}`, 'error')\r\n console.error(error)\r\n })\r\n .finally(()=>setLoader(false))\r\n }, [id, rangeDate]);\r\n\r\n let charts = null\r\n if(chartsCfgs.length > 0){\r\n chartsCfgs[0].yDisplay = true\r\n \r\n charts = chartsCfgs.map((cfg, i) =>\r\n <Col flex={`${i===0 ? geometry.w1st : geometry.wRest}px`}\r\n key={cfg.id}>\r\n <ArchiveColumn\r\n data={saubData}\r\n rangeDate={rangeDate}\r\n chartRatio={i===0 ? geometry.ratio1st : geometry.ratioRest}\r\n onRemoveChart={onRemoveChart} \r\n onSaveConfig={onSaveConfig}\r\n config={cfg}/>\r\n </Col>)\r\n }\r\n\r\n return (<>\r\n <Tooltip title=\"Добавить график\">\r\n <Button \r\n type=\"primary\"\r\n onClick={onAddChart}\r\n disabled={chartsCfgs.length >= 6}>\r\n +\r\n </Button>\r\n </Tooltip>\r\n <ConfigProvider locale={locale}>\r\n <RangePicker\r\n showTime\r\n allowClear={false}\r\n onChange = {onChangeRange}\r\n value = {rangeDate}\r\n />\r\n </ConfigProvider>\r\n <LoaderPortal show={loader}>\r\n <Row ref={chartsContainerRef}>\r\n {charts}\r\n </Row>\r\n </LoaderPortal>\r\n </>)\r\n}","import {Table, Select, DatePicker, ConfigProvider} from 'antd';\r\nimport {MessageService} from '../services/api'\r\nimport {useState, useEffect} from 'react'\r\nimport {useParams} from 'react-router-dom'\r\nimport LoaderPortal from '../components/LoaderPortal'\r\nimport '../styles/message.css'\r\nimport notify from '../components/notify'\r\nimport locale from \"antd/lib/locale/ru_RU\";\r\nimport moment from 'moment'\r\n\r\nconst {Option} = Select\r\nconst pageSize = 26\r\nconst {RangePicker} = DatePicker;\r\n\r\n// Словарь категорий для строк таблицы\r\nconst categoryDictionary = {\r\n 1: {title: 'Авария'},\r\n 2: {title: 'Предупреждение'},\r\n 3: {title: 'Информация'},\r\n}\r\n\r\nconst columns = [\r\n {\r\n title: 'Дата',\r\n key: 'date',\r\n dataIndex: 'date',\r\n render: (item) => moment(item).format('DD MMM YYYY, HH:MM:ss'),\r\n },\r\n {\r\n title: 'Категория',\r\n key: 'categoryId',\r\n dataIndex: 'categoryId',\r\n render: (_, item) => categoryDictionary[item.categoryId].title,\r\n style: (_, item) => categoryDictionary[item.categoryId].style,\r\n ellipsis: true,\r\n },\r\n {\r\n title: 'Сообщение',\r\n key: 'message',\r\n dataIndex: 'message',\r\n },\r\n {\r\n title: 'Пользователь',\r\n key: 'user',\r\n dataIndex: 'user',\r\n },\r\n];\r\n\r\nconst filterOptions = [\r\n {label: 'Авария', value: 1},\r\n {label: 'Предупреждение', value: 2},\r\n {label: 'Информация', value: 3},\r\n]\r\n\r\n// Данные для таблицы\r\nexport default function Messages() {\r\n let {id} = useParams()\r\n const [messages, setMessages] = useState([])\r\n const [pagination, setPagination] = useState(null)\r\n const [page, setPage] = useState(1)\r\n const [range, setRange] = useState([])\r\n const [categories, setCategories] = useState([])\r\n\r\n const [loader, setLoader] = useState(false)\r\n\r\n const children = filterOptions.map((line) => <Option key={line.value}>{line.label}</Option>)\r\n\r\n const onChangeRange = (range) => {\r\n setRange(range)\r\n }\r\n \r\n useEffect(() => {\r\n const GetMessages = async () => {\r\n setLoader(true)\r\n try {\r\n let begin = null\r\n let end = null\r\n if (range?.length > 1) {\r\n begin = range[0].toISOString()\r\n end = range[1].toISOString()\r\n }\r\n let paginatedMessages = await MessageService.getMessage(`${id}`,\r\n (page - 1) * pageSize,\r\n pageSize,\r\n categories,\r\n begin,\r\n end)\r\n setMessages(paginatedMessages.items.map(m => {\r\n return {\r\n key: m.id,\r\n categoryids: categoryDictionary[m.categoryId],\r\n begin: m.date,\r\n ...m\r\n }\r\n }))\r\n setPagination({\r\n total: paginatedMessages.count,\r\n current: Math.floor(paginatedMessages.skip / pageSize),\r\n })\r\n } catch (ex) {\r\n notify(`Не удалось загрузить сообщения по скважине \"${id}\"`, 'error')\r\n console.log(ex)\r\n }\r\n setLoader(false)\r\n }\r\n GetMessages()\r\n }, [id, page, categories, range])\r\n\r\n return (\r\n <>\r\n\r\n <div className='filter-group'>\r\n <h3 className='filter-group__heading'>Фильтр сообщений</h3>\r\n <Select\r\n mode=\"multiple\"\r\n allowClear\r\n placeholder=\"Фильтр сообщений\"\r\n className=\"filter-selector\"\r\n value={categories}\r\n onChange={setCategories}>\r\n {children}\r\n </Select>\r\n <ConfigProvider locale={locale}>\r\n <RangePicker\r\n showTime\r\n onChange={onChangeRange}\r\n />\r\n </ConfigProvider>\r\n </div>\r\n <LoaderPortal show={loader}>\r\n <Table\r\n columns={columns}\r\n dataSource={messages}\r\n rowClassName={(record) => `event_message_${record.categoryId} event_message`}\r\n size={'small'}\r\n pagination={{\r\n pageSize: pageSize,\r\n showSizeChanger: false,\r\n total: pagination?.total,\r\n current: page,\r\n onChange: (page) => setPage(page)\r\n }}\r\n rowKey={(record) => record.id}\r\n />\r\n </LoaderPortal>\r\n </>\r\n )\r\n}","import { HubConnection, HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';\r\n\r\n// SignalR js api:\r\n//https://docs.microsoft.com/ru-ru/javascript/api/@aspnet/signalr/?view=signalr-js-latest\r\n\r\nconst ConnectionOptions = { \r\n accessTokenFactory: () => localStorage['token'],\r\n transport:1,\r\n}\r\n\r\ntype ConnectionsDict = {\r\n [route: string]: HubConnection;\r\n};\r\n\r\nconst Connections: ConnectionsDict = {\r\n 'hubs/telemetry': new HubConnectionBuilder()\r\n .withUrl(`http://localhost:5000/hubs/telemetry`, ConnectionOptions)\r\n .withAutomaticReconnect()\r\n .build(),\r\n\r\n 'hubs/reports': new HubConnectionBuilder()\r\n .withUrl(`http://localhost:5000/hubs/reports`, ConnectionOptions)\r\n .withAutomaticReconnect()\r\n .build()\r\n}\r\n\r\nlet connectionPromise: Promise<void>\r\n\r\nconst GetConnectionAsync = async (hubUrl: string) => {\r\n\r\n let Connection: HubConnection = Connections[hubUrl];\r\n\r\n if (Connection.state === HubConnectionState.Disconnected)\r\n connectionPromise = Connection.start()\r\n \r\n if (Connection.state !== HubConnectionState.Connected)\r\n await connectionPromise\r\n \r\n return Connection\r\n }\r\n\r\ntype handlerFunction = (...args: any[]) => void;\r\n\r\ntype cleanFunction = (...args: any[]) => void;\r\n\r\n/** Subscribe on some SignalR method (topic).\r\n * @example useEffect(() => Subscribe('methodName', `${id}`, handleNewData), [id]);\r\n * @param {string} methodName name of the method\r\n * @param {string} groupName name of the group\r\n * @param {handlerFunction} handler fires when got new data by subscription\r\n * @return {cleanFunction} unsubscribe function for useEffect cleanup.\r\n */ \r\nconst Subscribe = (\r\n hubUrl: string,\r\n methodName: string, \r\n groupName: string = '', \r\n handler: handlerFunction ):cleanFunction=>{\r\n GetConnectionAsync(hubUrl).then(async connection => {\r\n if(groupName)\r\n await connection.send('AddToGroup', groupName) \r\n connection.on(methodName, handler)\r\n })\r\n \r\n if(groupName)\r\n return () => {\r\n Connections[hubUrl].send('RemoveFromGroup', groupName)\r\n .finally(()=>Connections[hubUrl].off(methodName))\r\n }\r\n return () => Connections[hubUrl].off(methodName) \r\n}\r\n\r\n/** Invokes some SignalR method.\r\n * @param {string} methodName name of the method\r\n * @param {any[]} args methods arguments\r\n * @return {Promise<void>} Promise\r\n */ \r\nconst InvokeAsync = async (methodName:string, hubUrl: string, ...args:any[]) => {\r\n await GetConnectionAsync(hubUrl)\r\n await Connections[hubUrl].send(methodName, ...args)\r\n}\r\n\r\nexport {\r\n Subscribe,\r\n InvokeAsync,\r\n GetConnectionAsync,\r\n}","import { useState, useEffect } from \"react\";\r\nimport { useParams } from 'react-router-dom';\r\nimport {\r\n Form,\r\n DatePicker,\r\n Radio,\r\n Button,\r\n Select,\r\n Table,\r\n Progress, \r\n notification\r\n} from 'antd';\r\nimport 'moment/locale/ru';\r\nimport locale from 'antd/lib/locale/ru_RU';\r\nimport moment from \"moment\";\r\nimport {Subscribe} from '../services/signalr';\r\nimport notify from '../components/notify';\r\nimport LoaderPortal from '../components/LoaderPortal';\r\nimport { ReportService } from '../services/api';\r\n\r\nconst { RangePicker } = DatePicker;\r\nconst { Option } = Select;\r\n\r\nlet reportDatesRange = {\r\n from: moment(\"0001-01-01T00:00:00\"),\r\n to: moment(\"9999-12-31T23:59:59.9999999\")\r\n}\r\n\r\nconst timePeriodNames = {\r\n 600: '1 минута',\r\n 86400:'1 день',\r\n 604800:'1 неделя' \r\n}\r\n\r\nconst imgPaths = {\r\n '.pdf': '/images/pdf.png',\r\n '.las': '/images/las.png'\r\n}\r\n\r\n\r\n// Экспорт рендера\r\nexport default function Report(props) { \r\n \r\n const [rangeDate, setRangeDate] = useState([moment().subtract(1,'days'), moment()])\r\n const [step, setStep] = useState(600)\r\n const [format, setFormat] = useState(0)\r\n const [approxPages, setPagesCount] = useState(0)\r\n const [suitableReports, setSuitableReports] = useState([])\r\n const [loader, setLoader] = useState(false)\r\n\r\n\r\n let wellId = useParams().id;\r\n\r\n const columns = [\r\n {\r\n title: '',\r\n dataIndex: 'reportFormat',\r\n key: 'reportFormat',\r\n render: format => <img src={imgPaths[format]} width=\"50\" alt={format}></img>\r\n },\r\n {\r\n title: 'Параметры отчета',\r\n dataIndex: 'reportParams',\r\n key: 'reportParams',\r\n },\r\n {\r\n title: 'Название отчета',\r\n dataIndex: 'reportName',\r\n key: 'reportName',\r\n render: name => <a onClick={event => getReportFile(event, name)} download={name}>{name}</a>\r\n },\r\n ];\r\n \r\n const ReportCreationNotify = ({progressData}) => {\r\n progressData = progressData ?? {progress: 0.0, operation: 'Создание отчета', reportName: ''} \r\n\r\n return (\r\n <>\r\n <Progress percent={ progressData.progress } />\r\n <br />\r\n <span> { progressData.operation } </span>\r\n <br />\r\n <a onClick={event => {getReportFile(event, progressData.reportName)}}\r\n download={progressData.reportName}>\r\n { progressData.reportName } \r\n </a>\r\n </>\r\n )\r\n }\r\n\r\n const getReportFile = async (event, reportFileName) => {\r\n const element = event.target\r\n\r\n if(!element.href.length) {\r\n try {\r\n await fetch(`/api/report/${wellId}/${reportFileName}`, {\r\n headers: {\r\n Authorization: 'Bearer ' + localStorage['token']\r\n }\r\n })\r\n .then(async (response) => {\r\n const blob = await response.blob();\r\n \r\n let reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function (e) {\r\n element.href = e.target.result\r\n element.click()\r\n };\r\n });\r\n } catch (error) {\r\n notify(`Не удалось скачать отчет по скважине (${wellId}) c \r\n ${rangeDate[0].format(\"DD.MM.YYYY hh:mm:ss\")} по \r\n ${rangeDate[1].format(\"DD.MM.YYYY hh:mm:ss\")}`, 'error')\r\n console.log(error)\r\n }\r\n }\r\n }\r\n\r\n const handleReportCreation = async (values) => {\r\n let begin = rangeDate[0].toISOString()\r\n let end = rangeDate[1].toISOString()\r\n\r\n try {\r\n const taskId = await ReportService.createReport(wellId, values.step, values.format, begin, end)\r\n if(!taskId)\r\n return \r\n\r\n const handleReportProgress = (progressData) => {\r\n if(progressData) {\r\n notification.open({\r\n key: taskId,\r\n message: 'Создание отчета:',\r\n description: <ReportCreationNotify progressData={progressData}></ReportCreationNotify>,\r\n duration: 0\r\n });\r\n\r\n if (progressData.reportName?.length)\r\n unSubscribeReportHub()\r\n }\r\n }\r\n\r\n const unSubscribeReportHub = Subscribe('hubs/reports', 'GetReportProgress', `Report_${taskId}`, handleReportProgress)\r\n }\r\n catch(error) {\r\n notify(`Не удалось создать отчет по скважине (${wellId}) c \r\n ${rangeDate[0].format(\"DD.MM.YYYY hh:mm:ss\")} по \r\n ${rangeDate[1].format(\"DD.MM.YYYY hh:mm:ss\")}`, 'error')\r\n console.log(error)\r\n }\r\n }\r\n\r\n function disabledDate(current) {\r\n return reportDatesRange.From >= current || reportDatesRange.To <= current;\r\n }\r\n\r\n useEffect(()=>{\r\n async function getRepostSizeAsync() {\r\n let begin = rangeDate[0].toISOString()\r\n let end = rangeDate[1].toISOString()\r\n try {\r\n let approxPagesResponse = await ReportService.getReportSize(wellId, step, format, begin, end)\r\n setPagesCount(approxPagesResponse)\r\n } catch(error) {\r\n notify(`Не удалось получить предварительный размер отчета c \r\n ${rangeDate[0].format(\"DD.MM.YYYY hh:mm:ss\")} по \r\n ${rangeDate[1].format(\"DD.MM.YYYY hh:mm:ss\")}`, 'error')\r\n console.log(error)\r\n } finally {\r\n setLoader(false)\r\n }\r\n }\r\n\r\n getRepostSizeAsync()\r\n },[rangeDate, step, format])\r\n\r\n useEffect(()=>{\r\n async function getSuitableReportsAsync() {\r\n let begin = rangeDate[0].toISOString()\r\n let end = rangeDate[1].toISOString()\r\n try {\r\n setLoader(true)\r\n let suitableReportsResponse = await ReportService.getSuitableReportsNames(wellId, step, format, begin, end)\r\n let suitableReports = suitableReportsResponse.map(value => {\r\n return { \r\n key: value.id,\r\n reportFormat: value.format,\r\n reportParams: `Дата создания: ${new Date(value.date).toLocaleDateString()}, \r\n Данные от ${new Date(value.begin).toLocaleString()} \r\n до ${new Date(value.end).toLocaleString()}, \r\n Шаг: ${timePeriodNames[value.step]}`,\r\n reportName: value.name\r\n }\r\n })\r\n setSuitableReports(suitableReports)\r\n } catch(error) {\r\n notify(`Не удалось получить подходящие по параметрам отчеты c \r\n ${rangeDate[0].format(\"DD.MM.YYYY hh:mm:ss\")} по \r\n ${rangeDate[1].format(\"DD.MM.YYYY hh:mm:ss\")}`, 'error')\r\n console.log(error)\r\n } finally {\r\n setLoader(false)\r\n }\r\n }\r\n\r\n getSuitableReportsAsync()\r\n },[rangeDate, step, format])\r\n\r\n useEffect(()=>{\r\n async function getDatesRange() {\r\n let response = await ReportService.getReportsDateRange(wellId)\r\n reportDatesRange.from = moment(response.from)\r\n reportDatesRange.to = moment(response.to)\r\n }\r\n\r\n getDatesRange()\r\n },[])\r\n\r\n return (<>\r\n <div className=\"w-100 mt-20px\">\r\n <Form\r\n layout=\"vertical\"\r\n name=\"reportForm\"\r\n initialValues={{ remember: true }}\r\n onFinish={handleReportCreation}\r\n >\r\n <div className={'d-flex'}>\r\n <Form.Item\r\n label=\"Диапазон дат отчета\"\r\n name=\"period\"\r\n initialValue = { [rangeDate[0], rangeDate[1]] }\r\n >\r\n <RangePicker\r\n disabledDate={disabledDate}\r\n allowClear={false}\r\n onCalendarChange = { (dates, dateStrings, info) => {\r\n setRangeDate([moment(dateStrings[0]), moment(dateStrings[1])])\r\n }\r\n } \r\n locale={locale} \r\n showTime \r\n />\r\n </Form.Item>\r\n <Form.Item\r\n label=\"Шаг графиков\"\r\n name=\"step\"\r\n initialValue = {step}\r\n className=\"ml-30px\"\r\n >\r\n <Select\r\n onChange={(value) => setStep(value)}\r\n >\r\n <Option value={600}>1 минута</Option>\r\n <Option value={86400}>1 день</Option>\r\n <Option value={604800}>1 неделя</Option>\r\n </Select>\r\n </Form.Item>\r\n <Form.Item\r\n label=\"Формат отчета\"\r\n name=\"format\"\r\n initialValue = {format}\r\n onChange={(e) => setFormat(e.target.value)}\r\n className=\"ml-30px\"\r\n >\r\n <Radio.Group>\r\n <Radio.Button value={0}>PDF</Radio.Button>\r\n <Radio.Button value={1}>LAS</Radio.Button>\r\n </Radio.Group>\r\n </Form.Item>\r\n <Button \r\n type=\"primary\" \r\n htmlType=\"submit\"\r\n className=\"mt-30px ml-30px\">\r\n <span>Получить рапорт</span>\r\n <span className={'ml-5px'}>\r\n ({approxPages} стр.)\r\n </span> \r\n <span style={{display: approxPages > 100 ? 'inline' : 'none'}} className={'ml-5px'}>\r\n !!!\r\n </span> \r\n </Button>\r\n </div>\r\n </Form>\r\n </div>\r\n <br/>\r\n <h3>\r\n Отчеты с аналогичными параметрами, доступные для скачивания:\r\n </h3> <br/>\r\n \r\n <LoaderPortal show={loader}>\r\n <Table dataSource={suitableReports} columns={columns} />\r\n </LoaderPortal>\r\n </>\r\n )\r\n}\r\n","// import {UserOfWells} from \"../components/UserOfWells\";\r\n\r\nexport default function Analysis(props) {\r\n return (\r\n <div className=\"menu_title\">\r\n <h2>Анализ</h2>\r\n {/*<UserOfWells data={saubData}/>*/}\r\n <hr/>\r\n </div>\r\n )\r\n}","import { useEffect, useState} from 'react';\r\nimport {ChartTimeBase, ChartTimeData, ChartTimeDataParams} from './ChartTimeBase'\r\n\r\nconst GetRandomColor = () => \"#\" + Math.floor(Math.random()*16777215).toString(16)\r\n\r\nfunction GetOrCreateDatasetByLineConfig (data: ChartTimeData, lineConfig: LineConfig) {\r\n let dataset = data?.datasets.find(d=>d.label === lineConfig.label)\r\n if(!dataset)\r\n {\r\n let color = lineConfig.borderColor \r\n ?? lineConfig.backgroundColor \r\n ?? lineConfig.color \r\n ?? GetRandomColor()\r\n\r\n dataset = {\r\n label:lineConfig.label, \r\n data:[],\r\n backgroundColor: lineConfig.backgroundColor ?? color,\r\n borderColor: lineConfig.borderColor ?? color,\r\n borderWidth: lineConfig.borderWidth ?? 1,\r\n borderDash: lineConfig.dash ?? [],\r\n showLine: lineConfig.showLine,\r\n }\r\n data.datasets.push(dataset);\r\n }\r\n return dataset\r\n}\r\n\r\nexport type LineConfig = {\r\n type?: string\r\n label: string\r\n units?: string\r\n xAccessorName: string\r\n yAccessorName: string\r\n color?:string\r\n borderColor?: string\r\n backgroundColor?: string\r\n borderWidth?: number\r\n dash?:number[]\r\n labels?: any[]\r\n showLine: boolean\r\n xConstValue?: number|null\r\n}\r\n\r\nexport type ChartTimeProps = {\r\n label?: string,\r\n yDisplay: Boolean,\r\n // linePv?: LineConfig,\r\n // lineSp?: LineConfig,\r\n // lineIdle?: LineConfig,\r\n lines: LineConfig[],\r\n data: any[],\r\n interval: number,\r\n}\r\n\r\nexport const ChartTimeOnline: React.FC<ChartTimeProps> = (props) => {\r\n const [dataParams, setDataParams] = useState<ChartTimeDataParams>({data: {datasets:[]}, yStart: new Date(), })\r\n\r\n useEffect(()=>{\r\n if( (!props?.lines)\r\n || (!props?.data)\r\n || (props.lines.length === 0)\r\n || (props.data.length === 0))\r\n return\r\n\r\n setDataParams((preDataParams) => {\r\n props.lines.forEach(lineCfg => {\r\n let dataset = GetOrCreateDatasetByLineConfig(preDataParams.data, lineCfg) \r\n let points = props.data.map(dataItem => {return{\r\n x: lineCfg.xConstValue ?? dataItem[lineCfg.xAccessorName],\r\n label: dataItem[lineCfg.xAccessorName],\r\n y: new Date(dataItem[lineCfg.yAccessorName])}\r\n })\r\n //dataset.data = [ ...dataset.data, ...points,].slice(-1024) \r\n let data = [ ...dataset.data, ...points,]\r\n if(points?.length > 2)\r\n data.sort((a,b) => a.y > b.y ? 1 : -1)\r\n if(data.length > 1024)\r\n data.splice(0, (1024 - data.length))\r\n dataset.data = data;\r\n });\r\n\r\n preDataParams.yStart = new Date()\r\n preDataParams.yStart.setSeconds(preDataParams.yStart.getSeconds() - props.interval)\r\n preDataParams.yInterval = props.interval\r\n preDataParams.displayLabels = props.yDisplay\r\n return preDataParams\r\n })\r\n\r\n }, [ props.data, props.lines, props.interval, props.yDisplay])\r\n\r\n const chartPluginsOptions = {\r\n plugins:{\r\n legend:{\r\n display: false,\r\n },\r\n datalabels: {\r\n backgroundColor: 'transparent',\r\n borderRadius: 4,\r\n color: '#000B',\r\n display: function(context:any) {\r\n return context.dataset.label === 'wellDepth'\r\n ? 'auto'\r\n : false\r\n },\r\n formatter: function(value: any, context: any) {\r\n return `${value.y.toLocaleTimeString()} ${value.label.toPrecision(4)}`\r\n },\r\n padding: 6,\r\n align: 'left',\r\n anchor: 'center',\r\n clip: true\r\n }\r\n }\r\n }\r\n\r\n return(<ChartTimeBase dataParams = {dataParams} options = { chartPluginsOptions } />)\r\n}\r\n\r\n","import { useState, useEffect } from 'react';\r\nimport {CaretUpOutlined, CaretDownOutlined} from '@ant-design/icons'\r\n\r\nexport const ValueDisplay = ({prefix, value, suffix, isArrowVisible}) =>{\r\n const [oldVal, setOldVal] = useState(NaN)\r\n const [val, setVal] = useState('---')\r\n const [arrowState, setArrowState] = useState(0)\r\n\r\n useEffect(()=>{\r\n if(value){\r\n if(Number.isFinite(+value)){\r\n if (isArrowVisible)\r\n {\r\n let newArrowState = 0\r\n if (value > oldVal)\r\n newArrowState = 1\r\n if (value < oldVal)\r\n newArrowState = -1\r\n setArrowState(newArrowState)\r\n setOldVal(value)\r\n }\r\n setVal((+value).toPrecision(4)??'---')\r\n }\r\n else\r\n setVal(value)\r\n }\r\n\r\n },[value, isArrowVisible, oldVal])\r\n\r\n let arrow = null\r\n switch (arrowState){\r\n case 1:\r\n arrow = <CaretUpOutlined style={{color:\"red\"}}/>\r\n break\r\n case -1:\r\n arrow = <CaretDownOutlined style={{color:\"red\"}}/>\r\n break\r\n default:\r\n break\r\n } \r\n\r\n return(<span className='display_value'>{prefix} {val} {suffix}{arrow}</span>)\r\n}\r\n\r\nexport const Display = (props)=>{\r\n const {label} = props\r\n\r\n return <div className={props.className}>\r\n <div className='display_label'>{label}</div> \r\n <div style={{display:\"flex\", flexGrow:1}}>\r\n <ValueDisplay {...props}/>\r\n </div>\r\n </div>\r\n \r\n}","import {ValueDisplay} from './Display'\r\nimport {ControlOutlined} from '@ant-design/icons'\r\nimport {Popover} from 'antd'\r\n\r\nexport const ChartTimeOnlineFooter = (props) =>{ \r\n const { data,\r\n lineIdle,\r\n lineSp,\r\n linesOther} = props\r\n \r\n let sp = null\r\n let idle = null\r\n\r\n if(data && lineSp)\r\n sp = data[lineSp.xAccessorName]\r\n\r\n if(data && lineIdle)\r\n idle = data[lineIdle.xAccessorName]\r\n\r\n let spField = <ValueDisplay value={sp}/>\r\n\r\n let popContent = linesOther?.map(line =>{\r\n let val = null \r\n if(data)\r\n val = data[line.xAccessorName]\r\n return (\r\n <div key={line.label}>\r\n {line.label}\r\n <ValueDisplay value={val}/>\r\n </div>)\r\n })\r\n\r\n if(popContent)\r\n spField = <Popover content={popContent}>\r\n <div className=\"chart-footer\">\r\n <ControlOutlined className='display_label'/>\r\n {spField}\r\n </div>\r\n </Popover>\r\n else\r\n spField = <div style={{display:\"flex\"}}>\r\n {spField}\r\n </div>\r\n\r\n return(<div>\r\n {spField}\r\n <div style={{display:\"flex\"}}>\r\n <span className='display_label'>х.х.</span>\r\n <ValueDisplay value={idle}/>\r\n </div>\r\n </div>)\r\n}","import {Display} from './Display'\r\n\r\nexport const CustomColumn = ({data}) => {\r\n const dataLast = data[data.length -1]\r\n\r\n const lines = [\r\n {label:'Рот., об/мин', accessorName:'rotorSpeed'},\r\n {label:'Долото, м', accessorName:'bitDepth'},\r\n {label:'Забой, м', accessorName:'wellDepth'},\r\n {label:'Расход, м³/ч', accessorName:'flow'},\r\n {label:'Расход х.х., м³/ч', accessorName:'flowIdle'},\r\n ]\r\n \r\n if(dataLast)\r\n lines.forEach(line => line.value = dataLast[line.accessorName]?.toPrecision(4)??'-' )\r\n else\r\n lines.forEach(line => line.value = '-' )\r\n\r\n return (<>\r\n {lines.map(line => <Display className='border_small display_flex_container'\r\n key={line.label}\r\n label={line.label} \r\n value={line.value} \r\n suffix={line.units}/>)}\r\n </>)\r\n}","import { Display } from './Display'\r\n\r\nexport const UserOfWells = ({ data }) => {\r\n const dataLast = data[data.length - 1]\r\n\r\n const lines = [\r\n { label: 'Пользователь', accessorName: 'user' },\r\n ]\r\n\r\n if (dataLast)\r\n lines.forEach(line => line.value = dataLast[line.accessorName] ?? '-')\r\n else\r\n lines.forEach(line => line.value = '-')\r\n\r\n return (<>\r\n {lines.map(line => <Display className='border_small display_flex_container user_card'\r\n key={line.label}\r\n label={line.label}\r\n value={line.value}\r\n suffix={line.units} />)}\r\n </>)\r\n}","const modeNames = {\r\n 0: \"Ручной\",\r\n 1: \"Бурение в роторе\",\r\n 2: \"Проработка\",\r\n 3: \"Бурение в слайде\",\r\n 4: \"Спуск СПО\",\r\n 5: \"Подъем СПО\",\r\n 6: \"Подъем с проработкой\",\r\n\r\n 10: \"БЛОКИРОВКА\",\r\n}\r\n\r\nexport const ModeDisplay = (props)=>{\r\n let value = '---'\r\n\r\n if(props.data.length > 0){\r\n let lastFullData = props.data[props.data.length - 1]\r\n let index = lastFullData['mode']\r\n if(index >= 0)\r\n value = modeNames[index] ?? index\r\n }\r\n\r\n return(<div className=\"display_header\">\r\n <span className=\"display_label\">Режим:</span>\r\n <span className=\"display_value\">{value}</span>\r\n </div>)\r\n}","import {useState, useEffect} from 'react'\r\nimport {useParams} from 'react-router-dom'\r\nimport {Row, Col, Select, Table} from 'antd'\r\nimport {ChartTimeOnline} from '../components/charts/ChartTimeOnline'\r\nimport LoaderPortal from '../components/LoaderPortal'\r\nimport {ChartTimeOnlineFooter} from '../components/ChartTimeOnlineFooter'\r\nimport {CustomColumn} from '../components/CustomColumn'\r\nimport {UserOfWells} from '../components/UserOfWells'\r\nimport {ModeDisplay} from '../components/ModeDisplay'\r\nimport {Display} from '../components/Display'\r\nimport moment from 'moment'\r\nimport {Subscribe} from '../services/signalr'\r\nimport {DataService, MessageService} from '../services/api'\r\nimport '../styles/message.css'\r\nimport notify from \"../components/notify\";\r\n\r\nconst {Option} = Select\r\n\r\nconst dash = [7, 3]\r\n\r\nconst blockHeightGroup = {\r\n label: \"Высота блока\",\r\n yDisplay: false,\r\n linePv: { label: \"blockPosition\", units: 'м', xAccessorName: \"blockPosition\", yAccessorName: \"date\", color: '#333' },\r\n lineOther: { label: \"wellDepth\", units: 'м', xAccessorName: \"wellDepth\", yAccessorName: \"date\", color: '#333', showLine: false, xConstValue:30 },\r\n}\r\n\r\nconst blockSpeedGroup = {\r\n label: \"Скорость блока\",\r\n yDisplay: false,\r\n linePv: {label: \"blockSpeed\", units: 'м/ч', xAccessorName: \"blockSpeed\", yAccessorName: \"date\", color: '#0a0'},\r\n lineSp: {label: \"blockSpeedSp\", units: 'м/ч', xAccessorName: \"blockSpeedSp\", yAccessorName: \"date\", color: '#0a0'},\r\n}\r\n\r\nconst pressureGroup = {\r\n label: \"Давление\",\r\n yDisplay: false,\r\n linePv: {label: \"pressure\", units: 'атм', xAccessorName: \"pressure\", yAccessorName: \"date\", color: '#c00'},\r\n lineSp: {label: \"pressureSp\", units: 'атм', xAccessorName: \"pressureSp\", yAccessorName: \"date\", color: '#c00'},\r\n lineIdle: {label: \"pressureIdle\", units: 'атм', xAccessorName: \"pressureIdle\", yAccessorName: \"date\", color: '#c00'},\r\n linesOther: [\r\n {\r\n label: \"мекс. перепад\",\r\n units: 'атм',\r\n xAccessorName: \"pressureDeltaLimitMax\",\r\n yAccessorName: \"date\",\r\n color: '#c00'\r\n },\r\n ],\r\n}\r\n\r\nconst axialLoadGroup = {\r\n label: \"Осевая нагрузка\",\r\n yDisplay: false,\r\n linePv: {label: \"axialLoad\", units: 'т', xAccessorName: \"axialLoad\", yAccessorName: \"date\", color: '#00a'},\r\n lineSp: {label: \"axialLoadSp\", units: 'т', xAccessorName: \"axialLoadSp\", yAccessorName: \"date\", color: '#00a', dash},\r\n linesOther: [\r\n {label: \"axialLoadLimitMax\", units: 'т', xAccessorName: \"axialLoadLimitMax\", yAccessorName: \"date\", color: '#00a'},\r\n ],\r\n}\r\n\r\nconst hookWeightGroup = {\r\n label: \"Вес на крюке\",\r\n yDisplay: false,\r\n linePv: {label: \"hookWeight\", units: 'т', xAccessorName: \"hookWeight\", yAccessorName: \"date\", color: '#0aa'},\r\n lineIdle: {\r\n label: \"hookWeightIdle\",\r\n units: 'т',\r\n xAccessorName: \"hookWeightIdle\",\r\n yAccessorName: \"date\",\r\n color: '#0aa',\r\n dash\r\n },\r\n linesOther: [\r\n {\r\n label: \"hookWeightLimitMin\",\r\n units: 'т',\r\n xAccessorName: \"hookWeightLimitMin\",\r\n yAccessorName: \"date\",\r\n color: '#0aa'\r\n },\r\n {\r\n label: \"hookWeightLimitMax\",\r\n units: 'т',\r\n xAccessorName: \"hookWeightLimitMax\",\r\n yAccessorName: \"date\",\r\n color: '#0aa'\r\n },\r\n ],\r\n}\r\n\r\nconst rotorTorqueGroup = {\r\n label: \"Момент на роторе\",\r\n yDisplay: false,\r\n linePv: {label: \"rotorTorque\", units: 'кН·м', xAccessorName: \"rotorTorque\", yAccessorName: \"date\", color: '#a0a'},\r\n lineSp: {label: \"rotorTorqueSp\", units: 'кН·м', xAccessorName: \"rotorTorqueSp\", yAccessorName: \"date\", color: '#a0a'},\r\n lineIdle: {\r\n label: \"rotorTorqueIdle\",\r\n units: 'кН·м',\r\n xAccessorName: \"rotorTorqueIdle\",\r\n yAccessorName: \"date\",\r\n color: '#a0a'\r\n },\r\n linesOther: [\r\n {\r\n label: \"rotorTorqueLimitMax\",\r\n units: 'кН·м',\r\n xAccessorName: \"rotorTorqueLimitMax\",\r\n yAccessorName: \"date\",\r\n color: '#a0a'\r\n },\r\n ],\r\n}\r\n\r\nconst paramsGroups = [blockHeightGroup, blockSpeedGroup, pressureGroup, axialLoadGroup, hookWeightGroup, rotorTorqueGroup]\r\n\r\nexport const Column = ({lineGroup, data, interval}) => {\r\n let lines = [lineGroup.linePv]\r\n\r\n if (lineGroup.lineSp)\r\n lines.push(lineGroup.lineSp)\r\n\r\n if (lineGroup.lineOther)\r\n lines.push(lineGroup.lineOther)\r\n\r\n let dataLast = null\r\n let pv = null\r\n if (data?.length > 0) {\r\n dataLast = data[data.length - 1];\r\n if (lineGroup.linePv)\r\n pv = dataLast[lineGroup.linePv?.xAccessorName]\r\n }\r\n\r\n return (\r\n <>\r\n <Display\r\n label={lineGroup.label}\r\n value={pv}\r\n suffix={lineGroup.linePv?.units} isArrowVisible={true}/>\r\n <ChartTimeOnline\r\n data={data}\r\n yDisplay={lineGroup.yDisplay}\r\n lines={lines}\r\n interval={interval}/>\r\n <ChartTimeOnlineFooter\r\n data={dataLast}\r\n {...lineGroup} />\r\n </>)\r\n}\r\n\r\n// Словарь категорий для строк таблицы\r\nconst categoryDictionary = {\r\n 1: {title: 'Авария'},\r\n 2: {title: 'Предупреждение'},\r\n 3: {title: 'Информация'},\r\n}\r\n\r\n// Конфигурация таблицы\r\nconst columns = [\r\n {\r\n title: 'Дата',\r\n dataIndex: 'date',\r\n render: (item) => moment(item).format('DD MMM YYYY, HH:MM:ss'),\r\n sorter: (a, b) => new Date(b.date) - new Date(a.date),\r\n sortDirections: ['descend', 'ascend'],\r\n },\r\n {\r\n title: 'Категория',\r\n dataIndex: 'categoryId',\r\n render: (_, item) => categoryDictionary[item.categoryId].title,\r\n style: (_, item) => categoryDictionary[item.categoryId].style,\r\n sorter: (a, b) => a.categoryId - b.categoryId,\r\n sortDirections: ['descend', 'ascend'],\r\n },\r\n {\r\n title: 'Сообщение',\r\n dataIndex: 'message',\r\n onFilter: (value, record) => record.name.indexOf(value) === 0,\r\n },\r\n {\r\n title: 'Пользователь',\r\n dataIndex: 'user',\r\n },\r\n];\r\n\r\nexport default function TelemetryView(props) {\r\n let {id} = useParams()\r\n const [saubData, setSaubData] = useState([])\r\n const [chartInterval, setChartInterval] = useState(600)\r\n const [messages, setMessages] = useState([])\r\n\r\n const [loader, setLoader] = useState(false) // , setLoader\r\n\r\n const handleReceiveDataSaub = (data) => {\r\n if (data) {\r\n setSaubData(data)\r\n }\r\n }\r\n\r\n const handleReceiveMessages = (messages) => {\r\n if (messages) {\r\n setMessages(messages.items.splice(0, 4))\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n setLoader(true)\r\n let promiseData = DataService.getData(id)\r\n .then(handleReceiveDataSaub)\r\n .catch((ex) => {\r\n notify(`Не удалось загрузить данные по скважине \"${id}\"`, 'error')\r\n console.log(ex)\r\n })\r\n\r\n let promiseMessages = MessageService.getMessage(id)\r\n .then(handleReceiveMessages)\r\n .catch((ex) => {\r\n notify(`Не удалось загрузить сообщения по скважине \"${id}\"`, 'error')\r\n console.log(ex)\r\n })\r\n\r\n Promise.all([promiseData, promiseMessages]).then(()=>setLoader(false))\r\n\r\n let unSubscribeDataSaubHub = Subscribe('hubs/telemetry', 'ReceiveDataSaub', `well_${id}`, handleReceiveDataSaub)\r\n let unSubscribeMessagesHub = Subscribe('hubs/telemetry','ReceiveMessages', `well_${id}`, handleReceiveMessages)\r\n return () => {\r\n unSubscribeDataSaubHub()\r\n unSubscribeMessagesHub()\r\n }\r\n }, [id]);\r\n\r\n useEffect(() => {\r\n setLoader(true)\r\n DataService.getData(id, null, chartInterval)\r\n .then(handleReceiveDataSaub)\r\n .catch(error => console.error(error))\r\n .finally(()=>setLoader(false))\r\n }, [id, chartInterval]);\r\n\r\n const colSpan = 24 / (paramsGroups.length)\r\n\r\n return (<LoaderPortal show={loader}>\r\n <Row style={{marginBottom: '1rem'}}>\r\n <Col>\r\n <ModeDisplay data={saubData}/>\r\n </Col>\r\n <span style={{flexGrow: 0.1}}> </span>\r\n <Col>\r\n Интервал: \r\n <Select defaultValue=\"600\" onChange={setChartInterval}>\r\n <Option value='600'>10 минут</Option>\r\n <Option value='1800'>30 минут</Option>\r\n <Option value='3600'>1 час</Option>\r\n <Option value='21600'>6 час</Option>\r\n <Option value='86400'>1 день</Option>\r\n </Select>\r\n </Col>\r\n <span style={{flexGrow: 1}}> </span>\r\n <Col>\r\n <UserOfWells data={saubData}/>\r\n </Col>\r\n </Row>\r\n <Row>\r\n <Col span={2}>\r\n <CustomColumn data={saubData}/>\r\n </Col>\r\n <Col span={24 - 2}>\r\n <Row>\r\n {paramsGroups.map(group =>\r\n <Col span={colSpan} className='border_small' key={group.label}>\r\n <Column data={saubData} lineGroup={group} interval={chartInterval}/>\r\n </Col>)}\r\n </Row>\r\n </Col>\r\n </Row>\r\n <Table\r\n showHeader={false}\r\n columns={columns}\r\n dataSource={messages}\r\n rowClassName={(record) => `event_message_${record.categoryId} event_message`}\r\n className={'message_table'}\r\n size={'small'}\r\n pagination={false}\r\n rowKey={(record) => record.id}\r\n />\r\n </LoaderPortal>)\r\n}","import {Layout, Menu} from \"antd\";\r\nimport {FolderOutlined, FundViewOutlined} from \"@ant-design/icons\";\r\nimport {Link, Redirect, Route, Switch, useParams} from \"react-router-dom\";\r\nimport Files from \"../pages/Files\";\r\nimport Archive from \"../pages/Archive\";\r\nimport Messages from \"../pages/Messages\";\r\nimport Report from \"../pages/Report\";\r\nimport Analysis from \"../pages/Analysis\";\r\nimport TelemetryView from \"../pages/TelemetryView\";\r\n\r\nconst { Content } = Layout\r\n\r\nexport default function Well() {\r\n let { id } = useParams()\r\n\r\n return (<>\r\n <Layout>\r\n <Menu\r\n mode=\"horizontal\"\r\n selectable={true}\r\n className=\"well_menu\"\r\n >\r\n <Menu.Item key=\"1\" icon={<FundViewOutlined/>}>\r\n <Link to='telemetry'>Мониторинг</Link>\r\n </Menu.Item>\r\n <Menu.Item key=\"2\" icon={<FolderOutlined/>}>\r\n <Link to='message'>Сообщения</Link>\r\n </Menu.Item>\r\n <Menu.Item key=\"3\" icon={<FolderOutlined/>}>\r\n <Link to='report'>Рапорт</Link>\r\n </Menu.Item>\r\n <Menu.Item key=\"4\" icon={<FolderOutlined/>}>\r\n <Link to='analysis'>Анализ</Link>\r\n </Menu.Item>\r\n <Menu.Item key=\"5\" icon={<FolderOutlined/>}>\r\n <Link to='file'>Файлы</Link>\r\n </Menu.Item>\r\n <Menu.Item key=\"6\" icon={<FolderOutlined/>}>\r\n <Link to='archive'>Архив</Link>\r\n </Menu.Item>\r\n </Menu>\r\n\r\n <Layout>\r\n <Content className=\"site-layout-background\">\r\n <Switch>\r\n <Route path=\"/well/:id/file\">\r\n <Files/>\r\n </Route>\r\n <Route path=\"/well/:id/archive\">\r\n <Archive/>\r\n </Route>\r\n <Route path=\"/well/:id/message\">\r\n <Messages/>\r\n </Route>\r\n <Route path=\"/well/:id/report\">\r\n <Report/>\r\n </Route>\r\n <Route path=\"/well/:id/analysis\">\r\n <Analysis/>\r\n </Route>\r\n <Route path=\"/well/:id/telemetry\">\r\n <TelemetryView/>\r\n </Route>\r\n <Route path=\"/\">\r\n <Redirect to={{pathname: `/well/${id}/telemetry`}}/>\r\n </Route>\r\n </Switch>\r\n </Content>\r\n </Layout>\r\n </Layout>\r\n </>)\r\n}\r\n","import { useState, useEffect } from 'react'\r\nimport { useParams } from 'react-router-dom'\r\nimport { WellService } from '../services/api'\r\nimport Loader from '../components/Loader'\r\nimport { TreeSelect } from 'antd'\r\nimport { useHistory } from 'react-router-dom'\r\nimport notify from './notify'\r\n\r\nconst groupBy = (table, ...keys) => {\r\n let key = keys[0]\r\n\r\n let groups = table.reduce((rv, item) => {\r\n let keyValue = item[key]\r\n let group = rv.find(o => o.title === keyValue)\r\n if (!group) {\r\n group = {\r\n title: keyValue,\r\n value: keys.length === 1 ? `${item['id']}` : `${key} ${keyValue} ${item['id']}`,\r\n selectable: keys.length === 1,\r\n children: []\r\n }\r\n rv.push(group)\r\n }\r\n if (keys.length > 1)\r\n group.children.push(item);\r\n return rv;\r\n }, []);\r\n\r\n if (keys.length > 1) {\r\n for (let group of groups) {\r\n group.children = groupBy(group.children, ...keys.slice(1))\r\n }\r\n }\r\n\r\n return groups\r\n};\r\n\r\nexport default function WellTreeSelector(props) {\r\n // const [wells, setWells] = useState([])\r\n const [wellsTree, setWellsTree] = useState([])\r\n const [loader, setLoader] = useState(false)\r\n const history = useHistory()\r\n let { id } = useParams();\r\n\r\n let updateWellsList = async () => {\r\n setLoader(true)\r\n try {\r\n let newWells = (await WellService.getWells()).map(w => { return { key: w.id, ...w } })\r\n let wellsTree = groupBy(newWells, 'deposit', 'cluster', 'caption')\r\n setWellsTree(wellsTree)\r\n }\r\n catch (e) {\r\n notify('Не удалось загрузить список скважин', 'error')\r\n console.error(`${e.message}`);\r\n }\r\n setLoader(false)\r\n }\r\n\r\n useEffect(() => { updateWellsList() }, [])\r\n\r\n const onSelect = (value) => {\r\n if (value)\r\n history.push(`/well/${value}/`);\r\n console.log(value)\r\n }\r\n\r\n return (\r\n <>\r\n <TreeSelect\r\n className='header-tree-select'\r\n bordered={false}\r\n dropdownMatchSelectWidth={false}\r\n placeholder='Выберите месторождение'\r\n treeData={wellsTree}\r\n treeDefaultExpandAll\r\n onSelect={onSelect}\r\n value = {id}\r\n />\r\n {loader && <Loader />}\r\n </>\r\n )\r\n}","import { Layout, Button } from 'antd'\r\nimport { UserOutlined } from '@ant-design/icons'\r\nimport logo from '../images/logo_32.png'\r\nimport { Link } from \"react-router-dom\"\r\nimport WellTreeSelector from '../components/WellTreeSelector'\r\n\r\nconst { Header } = Layout\r\n\r\nexport default function PageHeader({title='Мониторинг', wellsList}){\r\n const login = localStorage['login']\r\n\r\n let handleLogout = () => {\r\n localStorage.removeItem('login')\r\n localStorage.removeItem('token')\r\n }\r\n \r\n return(\r\n <Layout>\r\n <Header className=\"header\">\r\n <img src={logo} alt=\"АСБ\" className=\"logo\"/>\r\n <WellTreeSelector wellsList={wellsList}/>\r\n <h1 className=\"title\">{title}</h1> \r\n <Link to=\"/login\" onClick={handleLogout}>\r\n <Button icon={<UserOutlined/>}> \r\n ({login}) Выход\r\n </Button>\r\n </Link>\r\n </Header>\r\n </Layout>\r\n )\r\n};","import {Layout} from 'antd'\r\nimport PageHeader from './Header'\r\n\r\nconst {Content} = Layout\r\n\r\nexport default function LayoutPortal({title, children}) {\r\n return ( \r\n <Content>\r\n <PageHeader title={title}/>\r\n <Layout>\r\n <Content className=\"site-layout-background sheet\">\r\n {children}\r\n </Content>\r\n </Layout>\r\n </Content>)\r\n}","import Wells from './Wells'\r\nimport Well from \"../components/Well\";\r\nimport LayoutPortal from './LayoutPortal'\r\nimport {Redirect, Route, Switch} from \"react-router-dom\";\r\n\r\nexport default function Main() {\r\n\r\n return (\r\n <Switch>\r\n <Route path=\"/well/:id/\">\r\n <LayoutPortal>\r\n <Well/>\r\n </LayoutPortal>\r\n </Route>\r\n <Route path=\"/well\">\r\n <LayoutPortal>\r\n <Wells/>\r\n </LayoutPortal>\r\n </Route>\r\n <Route path=\"/\">\r\n <Redirect to={{pathname: `/well`}}/>\r\n </Route>\r\n </Switch>\r\n )\r\n}\r\n","import React /*, { useContext, createContext, useState }*/ from \"react\";\r\nimport {\r\n Route,\r\n Redirect\r\n} from \"react-router-dom\";\r\n\r\nexport function PrivateRoute({ children, ...rest }) {\r\n let token = localStorage['token'];\r\n return (\r\n <Route\r\n {...rest}\r\n render={({ location }) => token\r\n ? (children)\r\n : (<Redirect to={{ pathname: \"/login\", state: { from: location } }} />)} />\r\n );\r\n}\r\n","import './styles/App.less'\r\nimport {\r\n BrowserRouter as Router,\r\n Switch,\r\n Route} from \"react-router-dom\"\r\nimport Login from './pages/Login'\r\nimport Main from './pages/Main'\r\nimport { OpenAPI } from './services/api'\r\nimport { PrivateRoute } from './components/PrivateRoute'\r\n\r\n//OpenAPI.BASE = 'http://localhost:3000'\r\nOpenAPI.TOKEN = localStorage['token']\r\n\r\nexport default function App() {\r\n return (\r\n <Router>\r\n <Switch>\r\n <Route path=\"/login\">\r\n <Login />\r\n </Route>\r\n <PrivateRoute path=\"/\">\r\n <Main />\r\n </PrivateRoute>\r\n </Switch>\r\n </Router>\r\n )\r\n}","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './styles/index.css';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <App />\r\n </React.StrictMode>,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""} |