- )
- }
-
- return (<>
-
-
-
-
-
-
- {charts}
-
-
- >)
-}
\ No newline at end of file
diff --git a/src/pages/Archive/ArchiveColumn.jsx b/src/pages/Archive/ArchiveColumn.jsx
new file mode 100644
index 0000000..0118086
--- /dev/null
+++ b/src/pages/Archive/ArchiveColumn.jsx
@@ -0,0 +1,35 @@
+import { useEffect, useState } from 'react'
+import { Grid, GridItem } from '../../components/Grid'
+import { Column } from '../../components/charts/Column'
+
+export const ArchiveColumn = ({ lineGroup, data, interval, style, headerHeight, yStart }) => {
+ const [lineGroupWithoutShapes, setLineGroupWithoutShapes] = useState([])
+ const [pv, setPV] = useState([])
+
+ useEffect(() => {
+ const lgws = lineGroup.filter(cfg => !cfg.isShape)
+ setLineGroupWithoutShapes(lgws)
+ setPV(lgws.filter(line => line.showLabels).map(line => ({
+ color: line.color,
+ label: line.label
+ })))
+ }, [lineGroup])
+
+
+ return (
+
+
+ {pv?.map((v, idx) => (
+ {v.label}
+ ))}
+
+
+
+ )
+}
diff --git a/src/pages/Archive/ArchiveDisplay.jsx b/src/pages/Archive/ArchiveDisplay.jsx
new file mode 100644
index 0000000..7035c82
--- /dev/null
+++ b/src/pages/Archive/ArchiveDisplay.jsx
@@ -0,0 +1,66 @@
+import { useEffect, useState } from 'react'
+import { Grid, GridItem } from '../../components/Grid'
+import { ArchiveColumn } from './ArchiveColumn'
+import { paramsGroups } from '../TelemetryView'
+
+const interpolationSearch = (data, begin, end, accessor) => {
+ const fy = (i) => new Date(data[i]?.[accessor] ?? 0)
+ const fx = (y, b, e) => Math.round(b + (y - fy(b)) * (e - b) / (fy(e) - fy(b)))
+ const findIdx = (val, startIdx, c) => {
+ let x = startIdx
+ let endIdx = data.length - 1
+ if(val < fy(startIdx))
+ return startIdx
+ if(val > fy(endIdx))
+ return endIdx
+ for(let i = 0; i < c; i++){
+ x = fx(val, startIdx, endIdx)
+ if(fy(x) < val)
+ startIdx = x
+ else
+ endIdx = x
+ if ((startIdx === endIdx)||(fy(startIdx) === fy(endIdx)))
+ return x
+ }
+ return x
+ }
+ let x0 = findIdx(begin, 0, 5)
+ let x1 = findIdx(end, x0, 3)
+ return { start: x0, end: x1, count: x1 - x0 }
+}
+
+export const cutData = (data, beginDate, endDate) => {
+ if (data?.length > 0) {
+ let { start, end } = interpolationSearch(data, beginDate, endDate, 'date')
+ if (start > 0) start--
+ if (end + 1 < end.length) end++
+ return data.slice(start, end)
+ }
+ return data
+}
+
+export const ArchiveDisplay = ({data, startDate, interval, onWheel}) => {
+ const [chartData, setChartData] = useState([])
+
+ useEffect(() => {
+ const endDate = new Date(+startDate + interval)
+ setChartData(cutData(data, startDate, endDate))
+ }, [data, startDate, interval])
+
+ return (
+
+ {paramsGroups.map((group, index) => (
+
+
+
+ ))}
+
+ )
+}
diff --git a/src/pages/Archive/index.jsx b/src/pages/Archive/index.jsx
new file mode 100644
index 0000000..f22a53b
--- /dev/null
+++ b/src/pages/Archive/index.jsx
@@ -0,0 +1,146 @@
+import moment from 'moment'
+import { DatePicker } from 'antd'
+import { useState, useEffect } from 'react'
+import { TelemetryDataSaubService } from '../../services/api'
+import { invokeWebApiWrapperAsync } from '../../components/factory'
+import LoaderPortal from '../../components/LoaderPortal'
+import { Flex } from '../../components/Grid'
+import { PeriodPicker, defaultPeriod } from '../../components/PeriodPicker'
+import { ArchiveDisplay, cutData } from './ArchiveDisplay'
+import { normalizeData, sortByDate } from '../TelemetryView'
+
+const DATA_COUNT = 2048 // Колличество точек на подгрузку графика
+const ADDITIVE_PAGES = 2 // Дополнительные данные для графиков
+const LOADING_TRIGGER = 0.5
+const WHEEL_SENSITIVITY = 1 / 530
+
+const getLoadingInterval = (loaded, startDate, interval) => {
+ // Если данные загружены и дата не заходит за тригер дозагрузка не требуется
+ if (
+ loaded &&
+ +startDate - interval * LOADING_TRIGGER > loaded.start &&
+ +startDate + interval * (LOADING_TRIGGER + 1) < loaded.end
+ )
+ return { loadingStartDate: startDate, newLoaded: loaded, loadingInterval: 0 }
+
+ let loadingStartDate = +startDate - interval * ADDITIVE_PAGES
+ let loadingEndDate = +startDate + interval * (ADDITIVE_PAGES + 1)
+
+ const newLoaded = {
+ start: loadingStartDate,
+ end: loadingEndDate
+ }
+
+ if (loaded) {
+ if (loadingStartDate >= loaded.start)
+ loadingStartDate = loaded.end
+ if (loadingEndDate <= loaded.end)
+ loadingEndDate = loaded.start
+ newLoaded.start = Math.min(loaded.start, loadingStartDate)
+ newLoaded.end = Math.max(loaded.end, loadingEndDate)
+ }
+
+ const loadingInterval = Math.trunc((loadingEndDate - loadingStartDate) / 1000)
+
+ return {
+ loadingStartDate: new Date(loadingStartDate),
+ newLoaded: {
+ start: new Date(newLoaded.start),
+ end: new Date(newLoaded.end)
+ },
+ loadingInterval
+ }
+}
+
+export default function Archive({idWell}) {
+ const [dataSaub, setDataSaub] = useState([])
+ const [chartInterval, setChartInterval] = useState(parseInt(defaultPeriod) * 1000)
+ const [startDate, setStartDate] = useState(new Date(+new Date() - chartInterval))
+ const [showLoader, setShowLoader] = useState(false)
+ const [loaded, setLoaded] = useState(null)
+
+ const onGraphWheel = (e) => {
+ if (loaded) {
+ setStartDate((prevStartDate) => {
+ const offset = e.deltaY * chartInterval * WHEEL_SENSITIVITY
+ const nextStartDate = new Date(+prevStartDate + offset)
+ const lastPossibleDate = new Date(Math.min(loaded.end, new Date()) - chartInterval)
+ return new Date(Math.max(loaded.start, Math.min(nextStartDate, lastPossibleDate)))
+ })
+ }
+ }
+
+ useEffect(() => invokeWebApiWrapperAsync(
+ async () => {
+ const dates = await TelemetryDataSaubService.getDataDatesRange(idWell)
+ let startDate
+ if (dates?.from && dates?.to)
+ startDate = Math.max(new Date(dates.from), +new Date(dates.to) - chartInterval)
+ else
+ startDate = +new Date() - chartInterval
+ setStartDate(new Date(startDate))
+ },
+ setShowLoader,
+ `Не удалось загрузить диапозон телеметрии для скважины "${idWell}"`
+ ), [])
+
+ useEffect(() => {
+ setStartDate((startDate) => new Date(Math.min(+new Date() - chartInterval, startDate)))
+ setDataSaub([])
+ }, [chartInterval])
+
+ useEffect(() => {
+ if (showLoader) return
+ const { loadingStartDate, loadingInterval, newLoaded } = getLoadingInterval(loaded, startDate, chartInterval)
+ if (loadingInterval <= 0) return
+ invokeWebApiWrapperAsync(
+ async () => {
+ const data = await TelemetryDataSaubService.getData(idWell, loadingStartDate.toISOString(), loadingInterval, DATA_COUNT)
+
+ const loadedStartDate = new Date(Math.max(+newLoaded.start, +startDate - chartInterval * ADDITIVE_PAGES))
+ const loadedEndDate = new Date(Math.min(+newLoaded.end, +startDate + chartInterval * (ADDITIVE_PAGES + 1)))
+ setLoaded({ start: loadedStartDate, end: loadedEndDate })
+
+ if (data) {
+ data.forEach(elm => elm.date = new Date(elm.date))
+ setDataSaub((prevDataSaub) => {
+ const newData = [...prevDataSaub, ...normalizeData(data)]
+ newData.sort(sortByDate)
+ return cutData(newData, loadedStartDate, loadedEndDate)
+ })
+ }
+
+ },
+ setShowLoader,
+ `Не удалось загрузить данные по скважине "${idWell}" c ${startDate.toISOString()} по ${new Date(+startDate + chartInterval).toISOString()}`
+ )
+ }, [idWell, chartInterval, loaded, startDate])
+
+ return (
+ <>
+
+
+ Начальная дата:
+ setStartDate(new Date(startDate))}
+ value={moment(startDate)}
+ />
+
+
+ Период:
+
setChartInterval(parseInt(val) * 1000)} />
+
+
+
+
+
+ >
+ )
+}
diff --git a/src/pages/TelemetryView/Column.jsx b/src/pages/TelemetryView/Column.jsx
deleted file mode 100644
index 621d541..0000000
--- a/src/pages/TelemetryView/Column.jsx
+++ /dev/null
@@ -1,131 +0,0 @@
-import { useState, useEffect } from 'react'
-import { Grid, GridItem } from '../../components/Grid'
-import { ChartTimeBase } from '../../components/charts/ChartTimeBase'
-import { ChartTimeOnlineFooter } from './ChartTimeOnlineFooter'
-
-const stroke = (sz = '2px', c = 'white') => ({ textShadow: `-${sz} -${sz} 0 ${c}, ${sz} -${sz} 0 ${c}, -${sz} ${sz} 0 ${c}, ${sz} ${sz} 0 ${c}` })
-
-const chartPluginsOptions = {
- plugins: {
- datalabels: {
- backgroundColor: 'transparent',
- borderRadius: 4,
- color: '#000B',
- display: context => (context.dataset.label === 'wellDepth') && 'auto',
- formatter: value => `${value.y.toLocaleTimeString()} ${value.label.toPrecision(4)}`,
- padding: 6,
- align: 'left',
- anchor: 'center',
- clip: true
- },
- legend:{ display: false },
- tooltip: { enable: true }
- }
-}
-
-const GetLimitShape = (flowChartData, points, accessor) => {
- const min = [], max = []
-
- for (let point of points) {
- const program = flowChartData.find(v => v.depthStart < point.depth && point.depth < v.depthEnd)
- if (!program) continue
-
- min.push({ x: program[`${accessor}Min`], y: new Date(point.y), label: point.label })
- max.push({ x: program[`${accessor}Max`], y: new Date(point.y), label: point.label })
- }
-
- return min.concat(max.reverse()) ?? []
-}
-
-const GetRandomColor = () => '#' + Math.floor(Math.random()*16777215).toString(16)
-const GetOrCreateDatasetByLineConfig = (data, lineConfig) => {
- let dataset = data?.datasets.find(d => d.label === lineConfig.label)
- if(!dataset) {
- let color = lineConfig.borderColor
- ?? lineConfig.backgroundColor
- ?? lineConfig.color
- ?? GetRandomColor()
-
- dataset = {
- label: lineConfig.label,
- data: [],
- backgroundColor: lineConfig.backgroundColor ?? color,
- borderColor: lineConfig.borderColor ?? color,
- borderWidth: lineConfig.borderWidth ?? 1,
- borderDash: lineConfig.dash ?? [],
- showLine: lineConfig.showLine ?? !lineConfig.isShape,
- fill: lineConfig.fill ?? (lineConfig.isShape ? 'shape' : 'none')
- }
- data.datasets.push(dataset);
- }
- return dataset
-}
-
-export const Column = ({ lineGroup, data, flowChartData, interval, showBorder, style, headerHeight, yDisplay }) => {
- const [dataParams, setDataParams] = useState({data: {datasets:[]}, yStart: new Date(), })
-
- let dataLast = data?.[data.length - 1]
- let pv = lineGroup.filter(line => line.showLabels).map(line => ({
- color: line.color,
- label: line.label,
- unit: line.units,
- value: dataLast?.[line.xAccessorName]
- }))
-
- useEffect(()=>{
- if((lineGroup.length === 0) || (data.length === 0)) return
-
- setDataParams((preDataParams) => {
- lineGroup.forEach(lineCfg => {
- if (lineCfg.isShape) return
- const dataset = GetOrCreateDatasetByLineConfig(preDataParams.data, lineCfg)
- const points = data.map(dataItem => ({
- x: lineCfg.xConstValue ?? dataItem[lineCfg.xAccessorName],
- label: dataItem[lineCfg.xAccessorName],
- y: new Date(dataItem[lineCfg.yAccessorName]),
- depth: dataItem.wellDepth
- })).filter(point => (point.x ?? null) !== null && (point.y ?? null) !== null)
-
- const lineData = [ ...dataset.data, ...points,]
- if(points?.length > 2)
- lineData.sort((a,b) => a.y > b.y ? 1 : -1)
- if(lineData.length > 1024)
- lineData.splice(0, (1024 - lineData.length))
-
- dataset.data = lineData
-
- //Area
- lineGroup.filter(cfg => cfg.isShape && cfg.xAccessorName === lineCfg.xAccessorName).forEach(areaCfg => {
- const dataset = GetOrCreateDatasetByLineConfig(preDataParams.data, areaCfg)
- dataset.data = GetLimitShape(flowChartData, lineData, areaCfg.xAccessorName)
- })
- })
-
- preDataParams.yStart = new Date(Math.max(new Date(dataLast.date), preDataParams.yStart ?? new Date(0)))
- preDataParams.yStart.setSeconds(preDataParams.yStart.getSeconds() - interval * 0.97)
- preDataParams.yInterval = interval
- preDataParams.displayLabels = yDisplay ?? false
- return {...preDataParams}
- })
-
- }, [data, lineGroup, interval, yDisplay, flowChartData, dataLast])
-
- return (
-
-
- {pv?.map((v, idx) => (
- {v.label}
- ))}
-
-
-
- {pv?.map((v, idx) => (
- {v.value?.toFixed(2) ?? '--'} {v.unit}
- ))}
-
-
-
-
-
- )
-}
diff --git a/src/pages/TelemetryView/MonitoringColumn.jsx b/src/pages/TelemetryView/MonitoringColumn.jsx
new file mode 100644
index 0000000..97e4be0
--- /dev/null
+++ b/src/pages/TelemetryView/MonitoringColumn.jsx
@@ -0,0 +1,95 @@
+import { Grid, GridItem } from '../../components/Grid'
+import { Column, GetOrCreateDatasetByLineConfig } from '../../components/charts/Column'
+import { ChartTimeOnlineFooter } from './ChartTimeOnlineFooter'
+import { useEffect, useState } from 'react'
+
+const stroke = (sz = '2px', c = 'white') => ({ textShadow: `-${sz} -${sz} 0 ${c}, ${sz} -${sz} 0 ${c}, -${sz} ${sz} 0 ${c}, ${sz} ${sz} 0 ${c}` })
+
+const GetLimitShape = (flowChartData, points, accessor) => {
+ const min = [], max = []
+
+ for (let point of points) {
+ const program = flowChartData.find(v => v.depthStart < point.depth && point.depth < v.depthEnd)
+ if (!program) continue
+
+ min.push({ x: program[`${accessor}Min`], y: new Date(point.y), label: point.label })
+ max.push({ x: program[`${accessor}Max`], y: new Date(point.y), label: point.label })
+ }
+
+ return min.concat(max.reverse()) ?? []
+}
+
+const RemoveSimilar = (input) => {
+ const data = [input[0]]
+ for (let i = 1; i < input.length; i++)
+ if (input[i].y !== input[i - 1].y)
+ data.push(input[i])
+ return data
+}
+
+export const MonitoringColumn = ({ lineGroup, data, flowChartData, interval, showBorder, style, headerHeight, pointCount }) => {
+ const [lineGroupWithoutShapes, setLineGroupWithoutShapes] = useState([])
+ const dataLast = data?.[data.length - 1]
+ const yStart = new Date(+(dataLast?.date ? new Date(dataLast.date) : new Date()) - interval * 1000 * 0.97)
+ const pv = lineGroup.filter(line => line.showLabels).map(line => ({
+ color: line.color,
+ label: line.label,
+ unit: line.units,
+ value: dataLast?.[line.xAccessorName]
+ }))
+
+ const addPointData = (point) => ({ depth: point.wellDepth })
+
+ const postParsing = (data) => {
+ lineGroupWithoutShapes.forEach(lineCfg => {
+ const lineDataSet = GetOrCreateDatasetByLineConfig(data.data, lineCfg)
+
+ lineDataSet.data = RemoveSimilar(lineDataSet.data)
+ if (lineDataSet.data.length > pointCount)
+ lineDataSet.data.splice(0, pointCount - lineDataSet.data.length)
+
+ if (flowChartData) {
+ lineGroup.filter(cfg => cfg.isShape && cfg.xAccessorName === lineCfg.xAccessorName).forEach(areaCfg => {
+ const dataset = GetOrCreateDatasetByLineConfig(data.data, areaCfg)
+ dataset.data = GetLimitShape(flowChartData, lineDataSet.data, areaCfg.xAccessorName)
+ })
+ }
+ })
+ }
+
+ useEffect(() => {
+ setLineGroupWithoutShapes(lineGroup.filter(cfg => !cfg.isShape))
+ }, [lineGroup])
+
+ return (
+
+
+ {pv?.map((v, idx) => (
+ {v.label}
+ ))}
+
+
+
+ {pv?.map((v, idx) => (
+ {v.value?.toFixed(2) ?? '--'} {v.unit}
+ ))}
+
+
+
+
+
+ )
+}
+
+MonitoringColumn.defaultProps = {
+ pointCount: 2048
+}
diff --git a/src/pages/TelemetryView/index.jsx b/src/pages/TelemetryView/index.jsx
index f3056c8..a4bc8f1 100644
--- a/src/pages/TelemetryView/index.jsx
+++ b/src/pages/TelemetryView/index.jsx
@@ -1,7 +1,7 @@
import { useState, useEffect } from 'react'
import { Select } from 'antd'
-import { Column } from './Column'
+import { MonitoringColumn } from './MonitoringColumn'
import { CustomColumn } from './CustomColumn'
import ActiveMessagesOnline from './ActiveMessagesOnline'
import { ModeDisplay } from './ModeDisplay'
@@ -22,6 +22,7 @@ import MomentStabPicEnabled from '../../images/DempherOn.png'
import MomentStabPicDisabled from '../../images/DempherOff.png'
import SpinPicEnabled from '../../images/SpinEnabled.png'
import SpinPicDisabled from '../../images/SpinDisabled.png'
+import { PeriodPicker, defaultPeriod } from '../../components/PeriodPicker'
import '../../styles/message.css'
@@ -250,21 +251,15 @@ const rotorTorqueGroup = [
}
]
-const paramsGroups = [blockHeightGroup, blockSpeedGroup, pressureGroup, axialLoadGroup, hookWeightGroup, rotorTorqueGroup]
-
-const timePeriodCollection = [
- { value: '60', label: '1 минута' },
- { value: '300', label: '5 минут' },
- { value: '600', label: '10 минут' },
- { value: '1800', label: '30 минут' },
- { value: '3600', label: '1 час' },
- { value: '21600', label: '6 часов' },
- { value: '43200', label: '12 часов' },
- { value: '86400', label: '24 часа' }
+export const paramsGroups = [
+ blockHeightGroup,
+ blockSpeedGroup,
+ pressureGroup,
+ axialLoadGroup,
+ hookWeightGroup,
+ rotorTorqueGroup
]
-const defaultChartInterval = '600'
-
const getLast = (data) =>
Array.isArray(data) ? data.slice(-1)[0] : data
@@ -295,27 +290,27 @@ const getIndexOfDrillingBy = (dataSaub) => {
return order[idFeedRegulator] ?? -1
}
+export const sortByDate = (a, b) => a.date > b.date ? 1 : -1
+export const normalizeData = (data) => data?.map(item => ({
+ ...item,
+ rotorSpeed: item.rotorSpeed < 1 ? 0 : item.rotorSpeed,
+ rotorTorque: item.rotorTorque < 1 ? 0 : item.rotorTorque,
+ blockSpeed: Math.abs(item.blockSpeed)
+})) ?? []
+
export default function TelemetryView({ idWell }) {
const [dataSaub, setDataSaub] = useState([])
const [dataSpin, setDataSpin] = useState([])
- const [chartInterval, setChartInterval] = useState(defaultChartInterval)
+ const [chartInterval, setChartInterval] = useState(defaultPeriod)
const [wellData, setWellData] = useState({ idState: 0 })
const [showLoader, setShowLoader] = useState(false)
const [flowChartData, setFlowChartData] = useState([])
- const options = timePeriodCollection.map((line) => )
-
const handleDataSaub = (data) => {
if (data) {
- data.forEach((_, idx) => {
- if (data[idx].rotorSpeed < 1)
- data[idx].rotorSpeed = 0;
- if (data[idx].rotorTorque < 1)
- data[idx].rotorTorque = 0;
- data[idx].blockSpeed = Math.abs(data[idx].blockSpeed)
- })
- data.sort((a, b) => a.date > b.date ? 1 : -1)
- setDataSaub(data)
+ const dataSaub = normalizeData(data)
+ dataSaub.sort(sortByDate)
+ setDataSaub(dataSaub)
}
}
@@ -375,9 +370,7 @@ export default function TelemetryView({ idWell }) {
Интервал:
-
+
Статус:
@@ -399,14 +392,16 @@ export default function TelemetryView({ idWell }) {
{paramsGroups.map((group, index) =>
-
+ showBorder={getIndexOfDrillingBy(dataSaub) === index}
+ />
)}
diff --git a/src/services/api/models/ClusterDtoPaginationContainer.ts b/src/services/api/models/ClusterDtoPaginationContainer.ts
index ae329ff..5b6d4e3 100644
--- a/src/services/api/models/ClusterDtoPaginationContainer.ts
+++ b/src/services/api/models/ClusterDtoPaginationContainer.ts
@@ -9,4 +9,4 @@ export type ClusterDtoPaginationContainer = {
take?: number;
count?: number;
items?: Array | null;
-}
\ No newline at end of file
+}
diff --git a/src/services/api/models/CompanyDtoPaginationContainer.ts b/src/services/api/models/CompanyDtoPaginationContainer.ts
index 006ad77..e3a7dcc 100644
--- a/src/services/api/models/CompanyDtoPaginationContainer.ts
+++ b/src/services/api/models/CompanyDtoPaginationContainer.ts
@@ -9,4 +9,4 @@ export type CompanyDtoPaginationContainer = {
take?: number;
count?: number;
items?: Array | null;
-}
\ No newline at end of file
+}
diff --git a/src/services/api/models/DepositDtoPaginationContainer.ts b/src/services/api/models/DepositDtoPaginationContainer.ts
index 861b9bd..704269c 100644
--- a/src/services/api/models/DepositDtoPaginationContainer.ts
+++ b/src/services/api/models/DepositDtoPaginationContainer.ts
@@ -9,4 +9,4 @@ export type DepositDtoPaginationContainer = {
take?: number;
count?: number;
items?: Array | null;
-}
\ No newline at end of file
+}
diff --git a/src/services/api/models/FilePublishInfoDto.ts b/src/services/api/models/FilePublishInfoDto.ts
index 8d0a093..59099f9 100644
--- a/src/services/api/models/FilePublishInfoDto.ts
+++ b/src/services/api/models/FilePublishInfoDto.ts
@@ -6,4 +6,4 @@ export type FilePublishInfoDto = {
publisherLogin?: string | null;
date?: string;
webStorageFileUrl?: string | null;
-}
\ No newline at end of file
+}
diff --git a/src/services/api/models/TelemetryDtoPaginationContainer.ts b/src/services/api/models/TelemetryDtoPaginationContainer.ts
index 0d23b24..ef7a641 100644
--- a/src/services/api/models/TelemetryDtoPaginationContainer.ts
+++ b/src/services/api/models/TelemetryDtoPaginationContainer.ts
@@ -9,4 +9,4 @@ export type TelemetryDtoPaginationContainer = {
take?: number;
count?: number;
items?: Array | null;
-}
\ No newline at end of file
+}
diff --git a/src/services/api/models/UserDtoPaginationContainer.ts b/src/services/api/models/UserDtoPaginationContainer.ts
index 650abe0..d1b285d 100644
--- a/src/services/api/models/UserDtoPaginationContainer.ts
+++ b/src/services/api/models/UserDtoPaginationContainer.ts
@@ -9,4 +9,4 @@ export type UserDtoPaginationContainer = {
take?: number;
count?: number;
items?: Array | null;
-}
\ No newline at end of file
+}
diff --git a/src/services/api/models/UserRoleDtoPaginationContainer.ts b/src/services/api/models/UserRoleDtoPaginationContainer.ts
index d77dd06..aa0e25a 100644
--- a/src/services/api/models/UserRoleDtoPaginationContainer.ts
+++ b/src/services/api/models/UserRoleDtoPaginationContainer.ts
@@ -9,4 +9,4 @@ export type UserRoleDtoPaginationContainer = {
take?: number;
count?: number;
items?: Array | null;
-}
\ No newline at end of file
+}
diff --git a/src/services/api/models/WellDtoPaginationContainer.ts b/src/services/api/models/WellDtoPaginationContainer.ts
index f3f299d..d0bec27 100644
--- a/src/services/api/models/WellDtoPaginationContainer.ts
+++ b/src/services/api/models/WellDtoPaginationContainer.ts
@@ -9,4 +9,4 @@ export type WellDtoPaginationContainer = {
take?: number;
count?: number;
items?: Array | null;
-}
\ No newline at end of file
+}