DD.WellWorkover.Cloud/AsbCloudWebApi/wwwroot/static/js/main.98821dab.chunk.js.map

1 line
132 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"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}}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>\r\n <span>&nbsp;{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}}>&nbsp;</span>\r\n <Col>\r\n Интервал:&nbsp;\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}}>&nbsp;</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":""}