grouping Table components and functions into Table folder

This commit is contained in:
Фролов 2021-08-20 10:49:20 +05:00
parent 9d6669c160
commit a1173fb6a4
24 changed files with 289 additions and 284 deletions

View File

@ -1,5 +1,5 @@
import { ChartDepthToDay } from './charts/ChartDepthToDay' import { ChartDepthToDay } from './charts/ChartDepthToDay'
import notify from "../components/notify" import { notify } from "../components/factory"
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { TelemetryAnalyticsService } from "../services/api" import { TelemetryAnalyticsService } from "../services/api"
import LoaderPortal from '../components/LoaderPortal' import LoaderPortal from '../components/LoaderPortal'

View File

@ -1,5 +1,5 @@
import { useParams } from "react-router-dom" import { useParams } from "react-router-dom"
import notify from "../components/notify" import { notify } from "../components/factory"
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { TelemetryAnalyticsService } from '../services/api' import { TelemetryAnalyticsService } from '../services/api'
import { ChartDepthToInterval } from './charts/ChartDepthToInterval' import { ChartDepthToInterval } from './charts/ChartDepthToInterval'

View File

@ -1,6 +1,6 @@
import { useParams } from "react-router-dom" import { useParams } from "react-router-dom"
import { DatePicker } from 'antd'; import { DatePicker } from 'antd';
import notify from "../components/notify" import { notify } from "../components/factory"
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { TelemetryAnalyticsService } from '../services/api' import { TelemetryAnalyticsService } from '../services/api'
import { ChartOperationTime } from './charts/ChartOperationTime' import { ChartOperationTime } from './charts/ChartOperationTime'

View File

@ -0,0 +1,13 @@
import { DatePicker } from "antd"
import moment from "moment"
import {formatDate} from './index'
export const DatePickerWrapper = ({value, onChange, ...other}) => (<DatePicker
allowClear={false}
defaultValue={moment()}
value={moment.utc(value).local()}
format={formatDate}
showTime
onChange={(date) => onChange(date)}
{...other}
/>)

View File

@ -0,0 +1,34 @@
import { Form, Input} from "antd"
export const EditableCell = ({
editing,
record,
dataIndex,
input,
isRequired,
title,
formItemClass,
formItemRules,
children,
initialValue,
}) => {
const inputNode = input ?? <Input/>
const rules = formItemRules ?? [{
required: isRequired,
message: `Please Input ${title}!`,
}]
const editor = <Form.Item
name={dataIndex}
style={{margin:0}}
className={formItemClass}
rules={rules}
initialValue={initialValue}>
{inputNode}
</Form.Item>
return (<td>
{editing ? editor: children}
</td>)
}

View File

@ -1,42 +1,10 @@
import { Form, Input, Table, Button, Popconfirm } from "antd" import { Form, Table, Button, Popconfirm } from "antd"
import { EditOutlined, SaveOutlined, PlusOutlined, CloseCircleOutlined, DeleteOutlined } from '@ant-design/icons' import { EditOutlined, SaveOutlined, PlusOutlined, CloseCircleOutlined, DeleteOutlined } from '@ant-design/icons'
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { EditableCell } from './EditableCell'
const newRowKeyValue = 'newRow' const newRowKeyValue = 'newRow'
const EditableCell = ({
editing,
record,
dataIndex,
input,
isRequired,
title,
formItemClass,
formItemRules,
children,
initialValue,
}) => {
const inputNode = input ?? <Input/>
const rules = formItemRules ?? [{
required: isRequired,
message: `Please Input ${title}!`,
}]
const editor = <Form.Item
name={dataIndex}
style={{margin:0}}
className={formItemClass}
rules={rules}
initialValue={initialValue}>
{inputNode}
</Form.Item>
return (<td>
{editing ? editor: children}
</td>)
}
const tryAddKeys = (items) => { const tryAddKeys = (items) => {
if(!items?.length) if(!items?.length)
return [] return []

View File

@ -0,0 +1,83 @@
export { EditableTable } from './EditableTable'
export { DatePickerWrapper } from './DatePickerWrapper'
export { Table } from 'antd'
export const RegExpIsFloat = /^[-+]?\d+\.?\d*$/
export const formatDate='YYYY.MM.DD HH:mm'
export const numericColumnOptions = {
editable: true,
initialValue: 0,
width:100,
formItemRules: [
{
required: true,
message: `Введите число`,
pattern: RegExpIsFloat,
},
],
};
/*
other - объект с дополнительными свойствами колонки
поддерживаются все базовые свойства из описания https://ant.design/components/table/#Column
плю дополнительные для колонок EditableTable:
editable - редактируемая колонка, bool
input - react компонента редактора (<Input/>, <InputNumber/>, <DatePickerWrapper/>...)
isRequired - значение может быть пустым,
formItemClass - css класс для <FormItem/>, если требуется
formItemRules - массив правил валидации значений https://ant.design/components/form/#Rule,
initialValue - дефолтное значение при добавлении новой строки
*/
export const makeColumn = (title:string, key:string, other?:any) => ({
title: title,
key: key,
dataIndex: key,
...other,
})
export const makeColumnsPlanFact = (title:string, key:string|string[], columsOther?:any|any[], gruopOther?:any) =>
{
let keyPlanLocal = key
let keyFactLocal = key
if(key instanceof Array){
keyPlanLocal = key[0]
keyFactLocal = key[1]
}else{
keyPlanLocal = key + 'Plan'
keyFactLocal = key + 'Fact'
}
let columsOtherLoacl :any[2]
if(columsOther instanceof Array)
columsOtherLoacl = [columsOther[0], columsOther[1]]
else
columsOtherLoacl = [columsOther, columsOther]
return {
title: title,
...gruopOther,
children: [
makeColumn('план', keyPlanLocal, columsOtherLoacl[0]),
makeColumn('факт', keyFactLocal, columsOtherLoacl[1]),
]
}
}
type PaginationContainer = {
skip?: number;
take?: number;
count?: number;
items?: any[] | null;
}
export const makePaginationObject = (paginationContainer:PaginationContainer, ...other:any) => {
let page = 1 + Math.floor((paginationContainer.skip??0) /(paginationContainer.take??1));
return {
...other,
pageSize: paginationContainer.take,
total: paginationContainer.count ?? paginationContainer.items?.length ?? 0,
current: page,
}
}

View File

@ -4,7 +4,7 @@ import { DepositService } from '../services/api'
import LoaderPortal from './LoaderPortal' import LoaderPortal from './LoaderPortal'
import { TreeSelect } from 'antd' import { TreeSelect } from 'antd'
import { useHistory } from 'react-router-dom' import { useHistory } from 'react-router-dom'
import notify from './notify' import { notify } from "./factory"
import '../styles/wellTreeSelect.css' import '../styles/wellTreeSelect.css'
export default function WellTreeSelector() { export default function WellTreeSelector() {

View File

@ -1,90 +1,35 @@
import { Dispatch, SetStateAction } from "react" import { Dispatch, SetStateAction } from "react"
import notify from "./notify" import { notification } from 'antd';
export const RegExpIsFloat = /^[-+]?\d+\.?\d*$/ const notificationTypeDictionary = new Map([
['error', {notifyInstance: notification.error, caption: 'Ошибка'}],
['warning', {notifyInstance: notification.warning, caption: 'Предупреждение'}],
['info', {notifyInstance: notification.info, caption: 'Инфо'}],
['open', {notifyInstance: notification.info, caption: ''}],
])
/* /**
other - объект с дополнительными свойствами колонки * Вызов оповещений всплывающим окошком.
поддерживаются все базовые свойства из описания https://ant.design/components/table/#Column * @param body string или ReactNode
плю дополнительные для колонок EditableTable: * @param notifyType для параметра типа. Допустимые значение 'error', 'warning', 'info'
editable - редактируемая колонка, bool
input - react компонента редактора (<Input/>, <InputNumber/>, <DatePicker/>...)
isRequired - значение может быть пустым,
formItemClass - css класс для <FormItem/>, если требуется
formItemRules - массив правил валидации значений https://ant.design/components/form/#Rule,
initialValue - дефолтное значение при добавлении новой строки
*/ */
export const makeColumn = (title:string, key:string, other?:any) => ({ export const notify = (body: string|any, notifyType:string ='info', other?: any) => {
title: title, if(!body)
key: key, return
dataIndex: key, const instance = notificationTypeDictionary.get(notifyType) ??
...other, notificationTypeDictionary.get('open')
})
export const makeColumnsPlanFact = (title:string, key:string|string[], columsOther?:any|any[], gruopOther?:any) => instance?.notifyInstance({
{ description: body,
let keyPlanLocal = key message: instance.caption,
let keyFactLocal = key placement: "bottomRight",
duration: 10,
if(key instanceof Array){ ...other
keyPlanLocal = key[0] })
keyFactLocal = key[1]
}else{
keyPlanLocal = key + 'Plan'
keyFactLocal = key + 'Fact'
}
let columsOtherLoacl :any[2]
if(columsOther instanceof Array)
columsOtherLoacl = [columsOther[0], columsOther[1]]
else
columsOtherLoacl = [columsOther, columsOther]
return {
title: title,
...gruopOther,
children: [
makeColumn('план', keyPlanLocal, columsOtherLoacl[0]),
makeColumn('факт', keyFactLocal, columsOtherLoacl[1]),
]
}
}
type PaginationContainer = {
skip?: number;
take?: number;
count?: number;
items?: any[] | null;
} }
type asyncFunction = (...args:any) => Promise<any|void>; type asyncFunction = (...args:any) => Promise<any|void>;
export const makePaginationObject = (paginationContainer:PaginationContainer, ...other:any) => {
let page = 1 + Math.floor((paginationContainer.skip??0) /(paginationContainer.take??1));
return {
...other,
pageSize: paginationContainer.take,
total: paginationContainer.count ?? paginationContainer.items?.length ?? 0,
current: page,
}
}
export const invokeWebApiWrapper = async (func: Function, setShowLoader: Dispatch<SetStateAction<boolean>>, errorNotifyText: string) => {
if(setShowLoader)
setShowLoader(true)
try{
func()
} catch (ex) {
if(process.env.NODE_ENV === 'development')
console.log(ex)
if(errorNotifyText)
notify(errorNotifyText, 'error')
} finally{
if(setShowLoader)
setShowLoader(false)
}
}
export const invokeWebApiWrapperAsync = async (funcAsync: asyncFunction, setShowLoader: Dispatch<SetStateAction<boolean>>, errorNotifyText: string) => { export const invokeWebApiWrapperAsync = async (funcAsync: asyncFunction, setShowLoader: Dispatch<SetStateAction<boolean>>, errorNotifyText: string) => {
if(setShowLoader) if(setShowLoader)
setShowLoader(true) setShowLoader(true)

View File

@ -1,10 +1,10 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { Table, InputNumber, Form, Popconfirm, Typography, Button } from 'antd' import { InputNumber, Form, Popconfirm, Typography, Button } from 'antd'
import LoaderPortal from '../LoaderPortal' import LoaderPortal from '../LoaderPortal'
import { makeColumn } from '../factory' import { makeColumn, Table } from '../Table'
import { FluidService } from '../../services/api/services/FluidService'; import { FluidService } from '../../services/api/services/FluidService';
import notify from "../notify" import { notify } from "../factory"
const EditableCell = ({ const EditableCell = ({
editing, editing,

View File

@ -2,9 +2,9 @@ import { useState, useEffect } from 'react';
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { Table, InputNumber, Input, Form, Popconfirm, Typography, Button } from 'antd' import { Table, InputNumber, Input, Form, Popconfirm, Typography, Button } from 'antd'
import LoaderPortal from '../LoaderPortal' import LoaderPortal from '../LoaderPortal'
import { makeColumn } from '../factory' import { makeColumn } from '../Table'
import { MudDiagramService } from '../../services/api/services/MudDiagramService' import { MudDiagramService } from '../../services/api/services/MudDiagramService'
import notify from "../notify" import { notify } from "../factory"
const EditableCell = ({ const EditableCell = ({
editing, editing,

View File

@ -2,9 +2,9 @@ import { useState, useEffect } from 'react'
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import {Table, InputNumber, Form, Popconfirm, Typography, Button } from 'antd' import {Table, InputNumber, Form, Popconfirm, Typography, Button } from 'antd'
import LoaderPortal from '../LoaderPortal' import LoaderPortal from '../LoaderPortal'
import { makeColumn } from '../factory' import { makeColumn } from '../Table'
import { NnbDataService } from '../../services/api/services/NnbDataService'; import { NnbDataService } from '../../services/api/services/NnbDataService';
import notify from "../notify" import { notify } from "../factory"
const EditableCell = ({ const EditableCell = ({

View File

@ -1,24 +0,0 @@
import { notification } from 'antd';
const typeDictionary = {
'error': 'Ошибка',
'warning': 'Предупрежение',
'info': 'Информация'
}
/**
* Вызов оповещений всплывающим окошком.
* @param body string или ReactNode
* @param type для параметра типа. Допустимые значение 'error', 'warning', 'info'
*/
export default function notify(body, type='info'){
notification[type]({
description: body,
message: typeDictionary[type],
type,
placement: "bottomRight",
duration: 10,
})
}

View File

@ -10,7 +10,7 @@ import { DataService } from '../services/api'
import {generateUUID} from '../services/UidGenerator' import {generateUUID} from '../services/UidGenerator'
import { ArchiveColumn } from '../components/ArchiveColumn' import { ArchiveColumn } from '../components/ArchiveColumn'
import moment from 'moment' import moment from 'moment'
import notify from '../components/notify' import { notify } from "../components/factory"
import LoaderPortal from '../components/LoaderPortal' import LoaderPortal from '../components/LoaderPortal'
const { RangePicker } = DatePicker const { RangePicker } = DatePicker

View File

@ -3,7 +3,7 @@ import { Link } from "react-router-dom";
import LoaderPortal from '../components/LoaderPortal' import LoaderPortal from '../components/LoaderPortal'
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { ClusterService } from '../services/api' import { ClusterService } from '../services/api'
import notify from '../components/notify' import { notify } from "../components/factory"
import { Table, Tag, Button } from 'antd'; import { Table, Tag, Button } from 'antd';
import ModalChartDepthToDay from '../components/modalWindows/ModalChartDepthToday' import ModalChartDepthToDay from '../components/modalWindows/ModalChartDepthToday'

View File

@ -3,7 +3,7 @@ import {Link} from "react-router-dom";
import LoaderPortal from '../components/LoaderPortal' import LoaderPortal from '../components/LoaderPortal'
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import {ClusterService} from '../services/api' import {ClusterService} from '../services/api'
import notify from '../components/notify' import { notify } from "../components/factory"
import {Table, Tag, Button} from 'antd'; import {Table, Tag, Button} from 'antd';
const columns = [ const columns = [

View File

@ -4,7 +4,7 @@ import {Link} from "react-router-dom";
import LoaderPortal from '../components/LoaderPortal' import LoaderPortal from '../components/LoaderPortal'
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import {ClusterService} from '../services/api' import {ClusterService} from '../services/api'
import notify from '../components/notify' import { notify } from "../components/factory"
const calcViewParams = (clusters) => { const calcViewParams = (clusters) => {
if ((!clusters) || clusters.length === 0) if ((!clusters) || clusters.length === 0)

View File

@ -5,9 +5,8 @@ import { FileService } from "../../services/api"
import { import {
invokeWebApiWrapperAsync, invokeWebApiWrapperAsync,
download, download,
makePaginationObject,
} from "../../components/factory" } from "../../components/factory"
import { EditableTable } from "../../components/EditableTable" import { EditableTable, makePaginationObject } from "../../components/Table"
import UploadForm from "../../components/UploadForm" import UploadForm from "../../components/UploadForm"
import LoaderPortal from "../../components/LoaderPortal" import LoaderPortal from "../../components/LoaderPortal"

View File

@ -4,7 +4,7 @@ import moment from 'moment'
import {MessageService} from '../services/api' import {MessageService} from '../services/api'
import LoaderPortal from '../components/LoaderPortal' import LoaderPortal from '../components/LoaderPortal'
import notify from '../components/notify' import { notify } from "../components/factory"
import '../styles/message.css' import '../styles/message.css'
const {Option} = Select const {Option} = Select

View File

@ -1,7 +1,5 @@
import { Progress } from "antd" import { Progress } from "antd"
import { download } from "../../components/factory"; import { download, notify } from "../../components/factory"
import notify from '../../components/notify'
export const getReportFile = async (idWell, reportName) => { export const getReportFile = async (idWell, reportName) => {
try { try {

View File

@ -11,11 +11,10 @@ import {
import "moment/locale/ru" import "moment/locale/ru"
import moment from "moment" import moment from "moment"
import { Subscribe } from "../../services/signalr" import { Subscribe } from "../../services/signalr"
import notify from "../../components/notify"
import LoaderPortal from "../../components/LoaderPortal" import LoaderPortal from "../../components/LoaderPortal"
import { ReportService } from "../../services/api" import { ReportService } from "../../services/api"
import { ReportCreationNotify, getReportFile } from "./ReportCreationNotify" import { ReportCreationNotify, getReportFile } from "./ReportCreationNotify"
import { invokeWebApiWrapperAsync } from "../../components/factory" import { invokeWebApiWrapperAsync, notify} from "../../components/factory"
const { RangePicker } = DatePicker const { RangePicker } = DatePicker
const { Option } = Select const { Option } = Select

View File

@ -1,73 +1,82 @@
import {useEffect, useRef, useState} from 'react' import { useEffect, useRef, useState } from "react";
import { import {
Chart, Chart,
TimeScale, TimeScale,
LinearScale, LinearScale,
Legend, Legend,
LineController, LineController,
PointElement, PointElement,
LineElement, LineElement,
} from 'chart.js' } from "chart.js";
import 'chartjs-adapter-moment' import "chartjs-adapter-moment";
import ChartDataLabels from 'chartjs-plugin-datalabels' import ChartDataLabels from "chartjs-plugin-datalabels";
import zoomPlugin from 'chartjs-plugin-zoom' import zoomPlugin from "chartjs-plugin-zoom";
import { invokeWebApiWrapper } from '../../components/factory' import { invokeWebApiWrapperAsync } from "../../components/factory";
import LoaderPortal from '../../components/LoaderPortal' import LoaderPortal from "../../components/LoaderPortal";
//import { TvdService} from '../../services/api' //import { TvdService} from '../../services/api'
Chart.register(TimeScale, LinearScale, LineController, LineElement, PointElement, Legend, ChartDataLabels, zoomPlugin) Chart.register(
TimeScale,
LinearScale,
LineController,
LineElement,
PointElement,
Legend,
ChartDataLabels,
zoomPlugin
);
const defaultOptions = { const defaultOptions = {
responsive: true, responsive: true,
aspectRatio: 2.35, aspectRatio: 2.35,
interaction: { interaction: {
intersect: false, intersect: false,
mode: 'index', mode: "index",
}, },
scales: { scales: {
x:{ x: {
display: true, display: true,
title: { title: {
display: true display: true,
}, },
type: 'linear', // был 'time' + его конфиг ниже type: "linear", // был 'time' + его конфиг ниже
grid:{ grid: {
drawTicks: true, drawTicks: true,
}, },
ticks: { ticks: {
//count:24, //count:24,
stepSize:3, stepSize: 3,
major:{enabled:true,}, major: { enabled: true },
z: 1, z: 1,
display : true, display: true,
textStrokeColor : "#fff", textStrokeColor: "#fff",
textStrokeWidth : 2, textStrokeWidth: 2,
color:"#000", color: "#000",
} },
}, },
y:{ y: {
type:'linear', type: "linear",
position:'top', position: "top",
reverse:true, reverse: true,
display: true, display: true,
title: { title: {
display: true, display: true,
text: 'Value' text: "Value",
}, },
}
},
parsing: {
xAxisKey: 'date',
yAxisKey: 'depth'
},
elements:{
point:{
radius:1.7,
}, },
}, },
plugins:{ parsing: {
legend:{ xAxisKey: "date",
yAxisKey: "depth",
},
elements: {
point: {
radius: 1.7,
},
},
plugins: {
legend: {
display: true, display: true,
}, },
datalabels: { datalabels: {
@ -77,67 +86,73 @@ const defaultOptions = {
enabled: true, enabled: true,
callbacks: { callbacks: {
label(tooltipItem) { label(tooltipItem) {
return tooltipItem.yLabel return tooltipItem.yLabel;
} },
} },
}, },
} },
} };
const makeDataset = (data, label, color, width=1.5, dash) => ({ const makeDataset = (data, label, color, width = 1.5, dash) => ({
label: label, label: label,
data: data, data: data,
backgroundColor: color, backgroundColor: color,
borderColor: color, borderColor: color,
borderWidth: width, borderWidth: width,
borderDash: dash, borderDash: dash,
}) });
export const Tvd = ({idWell}) =>{ export const Tvd = ({ idWell }) => {
const chartRef = useRef(null) const chartRef = useRef(null);
const [chart, setChart] = useState() const [chart, setChart] = useState();
const [data, setData] = useState({datasets: []}) const [data, setData] = useState({ datasets: [] });
const [showLoader, setShowLoader] = useState(false) const [showLoader, setShowLoader] = useState(false);
useEffect(() => invokeWebApiWrapper( useEffect(
async() => { () =>
const dataPlan = [] invokeWebApiWrapperAsync(
const dataFact = [] async () => {
const dataPredict = [] const dataPlan = [];
const data = { const dataFact = [];
datasets: [ const dataPredict = [];
makeDataset(dataPlan, 'План', '#C004', 4), const data = {
makeDataset(dataFact, 'Факт', '#0A0'), datasets: [
makeDataset(dataPredict, 'Прогноз', 'purple', 1, [7,3]), makeDataset(dataPlan, "План", "#C004", 4),
] makeDataset(dataFact, "Факт", "#0A0"),
} makeDataset(dataPredict, "Прогноз", "purple", 1, [7, 3]),
setData(data) ],
}, };
setShowLoader, setData(data);
`Не удалось загрузить данные TVD по скважине ${idWell}`), },
[idWell]) setShowLoader,
`Не удалось загрузить данные TVD по скважине ${idWell}`
),
[idWell]
);
useEffect(() => { useEffect(() => {
if((chartRef.current)&&(!chart)) { if (chartRef.current && !chart) {
let thisOptions = {} let thisOptions = {};
Object.assign(thisOptions, defaultOptions) Object.assign(thisOptions, defaultOptions);
let newChart = new Chart(chartRef.current, { let newChart = new Chart(chartRef.current, {
type: 'line', type: "line",
plugins: [ChartDataLabels], plugins: [ChartDataLabels],
options: thisOptions, options: thisOptions,
data: data data: data,
}) });
setChart(newChart) setChart(newChart);
return () => chart?.destroy() return () => chart?.destroy();
}else{ } else {
chart.data = data chart.data = data;
chart.update() chart.update();
} }
}, [chart, data]) }, [chart, data]);
return <LoaderPortal show={showLoader}> return (
<canvas ref={chartRef} /> <LoaderPortal show={showLoader}>
</LoaderPortal> <canvas ref={chartRef} />
} </LoaderPortal>
);
};

View File

@ -1,9 +1,9 @@
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { Input, DatePicker, Select } from 'antd' import { Input, Select } from 'antd'
import moment from 'moment' import moment from 'moment'
import { EditableTable } from "../../components/EditableTable" import { EditableTable, DatePickerWrapper, numericColumnOptions, makeColumn } from "../../components/Table"
import LoaderPortal from '../../components/LoaderPortal' import LoaderPortal from '../../components/LoaderPortal'
import { makeColumn, RegExpIsFloat, invokeWebApiWrapperAsync } from '../../components/factory' import { invokeWebApiWrapperAsync } from '../../components/factory'
import { WellOperationService} from '../../services/api' import { WellOperationService} from '../../services/api'
import { dictionarySectionType, getNameById } from './dictionary' import { dictionarySectionType, getNameById } from './dictionary'
@ -13,31 +13,6 @@ const { TextArea } = Input;
const basePageSize = 160; const basePageSize = 160;
const format='YYYY.MM.DD HH:mm' const format='YYYY.MM.DD HH:mm'
const numericColumnOptions = {
editable: true,
initialValue: 0,
width:100,
formItemRules: [
{
required: true,
message: `Введите число`,
pattern: RegExpIsFloat,
},
],
};
const DatePickerWrapper = ({value, onChange, ...other}) => {
return <DatePicker
allowClear={false}
defaultValue={moment()}
value={moment.utc(value).local()}
format={format}
showTime
onChange={(date) => onChange(date)}
{...other}
/>
}
export const WellOperationsEditor = ({idWell, idType}) => { export const WellOperationsEditor = ({idWell, idType}) => {
const [pageNumAndPageSize, setPageNumAndPageSize] = useState({current:1, pageSize:basePageSize}) const [pageNumAndPageSize, setPageNumAndPageSize] = useState({current:1, pageSize:basePageSize})
const [paginationTotal, setPaginationTotal] = useState(0) const [paginationTotal, setPaginationTotal] = useState(0)
@ -97,14 +72,14 @@ export const WellOperationsEditor = ({idWell, idType}) => {
render:(_, record)=>getNameById(dictionaryOperationCategory, record.idCategory) render:(_, record)=>getNameById(dictionaryOperationCategory, record.idCategory)
}), }),
makeColumn('Доп. инфо','categoryInfo', {editable:true, width:300, input:<TextArea/>}), makeColumn('Доп. инфо','categoryInfo', {editable:true, width:300, input:<TextArea/>}),
makeColumn('Глубина забоя','wellDepth', {...numericColumnOptions}), makeColumn('Глубина забоя','wellDepth', numericColumnOptions),
makeColumn('Время начала','startDate', { makeColumn('Время начала','startDate', {
editable:true, editable:true,
width:200, width:200,
input:<DatePickerWrapper/>, input:<DatePickerWrapper/>,
render:(_, record) => moment.utc(record.startDate).local().format(format) render:(_, record) => moment.utc(record.startDate).local().format(format)
}), }),
makeColumn('Часы','durationHours', {...numericColumnOptions}), makeColumn('Часы','durationHours', numericColumnOptions),
makeColumn('Комментарий','comment', {editable:true, input:<TextArea/>}), makeColumn('Комментарий','comment', {editable:true, input:<TextArea/>}),
] ]

View File

@ -1,7 +1,7 @@
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { Table } from 'antd'
import LoaderPortal from '../../components/LoaderPortal' import LoaderPortal from '../../components/LoaderPortal'
import { makeColumn, makeColumnsPlanFact, invokeWebApiWrapperAsync } from '../../components/factory' import { invokeWebApiWrapperAsync } from '../../components/factory'
import { Table, makeColumn, makeColumnsPlanFact } from '../../components/Table'
import { WellSectionService } from '../../services/api' import { WellSectionService } from '../../services/api'
const makeNumberRender = (format) => ((value) => (+value).toFixed(format)) const makeNumberRender = (format) => ((value) => (+value).toFixed(format))