2021-07-30 12:26:52 +05:00
import { useState } from 'react'
2021-07-29 17:17:28 +05:00
import { Table , Input , Form , Popconfirm , Typography } from 'antd'
2021-07-30 12:26:52 +05:00
import { makeColumn } from './factory'
2021-07-28 17:59:16 +05:00
2021-07-29 17:17:28 +05:00
const originData = [
2021-07-28 17:59:16 +05:00
{
2021-07-29 17:17:28 +05:00
key : '1' , depth : '' , zenithAngle : '' , magneticAzimuth : '' , trueAzimuth : '' , directAzimuth : '' , verticalDepth : '' , absoluteMark : '' , localNorthOffset : '' ,
localEastOffset : '' , outFallOffset : '' , offsetAzimuth : '' , areaIntensity : '' , offsetStopAngle : '' , zenithIntensity : '' , comment : '' , depthPlanFactDifference : '' ,
distancePlanFactDifference : ''
2021-07-28 17:59:16 +05:00
}
2021-07-29 17:17:28 +05:00
]
2021-07-28 17:59:16 +05:00
2021-07-29 17:17:28 +05:00
const EditableCell = ( {
editing ,
dataIndex ,
title ,
inputType ,
record ,
index ,
children ,
... restProps
} ) => {
return (
< td { ...restProps } style = { { paddingLeft : 2 , paddingRight : 2 } } >
< div style = { { width : '100%' , display : 'flex' , justifyContent : 'center' } } >
{ editing ? (
< Form.Item
name = { dataIndex }
style = { { margin : 0 } }
rules = { [
{
required : true ,
message : '' ,
pattern : '(-?[1-9]+\d*([.,]\d+)?)$|^(-?0[.,]\d*[1-9]+)$|^0$|^0.0$'
} ,
] }
>
< Input size = "small" / >
< / Form.Item >
) : (
children
) }
< / div >
< / td >
) ;
} ;
2021-07-28 17:59:16 +05:00
export function Nnb ( ) {
2021-07-29 17:17:28 +05:00
const [ form ] = Form . useForm ( ) ;
const [ data , setData ] = useState ( originData ) ;
const [ editingKey , setEditingKey ] = useState ( '' ) ;
const isEditing = ( row ) => row . key === editingKey ;
const columns = [
2021-07-30 12:26:52 +05:00
makeColumn ( 'Глубина по стволу, м' , 'depth' , { dataIndex : 'depth' , align : 'center' , editable : true } ) ,
makeColumn ( 'Зенитный угол, град' , 'zenithAngle' , { dataIndex : 'zenithAngle' , align : 'center' , editable : true } ) ,
makeColumn ( 'Азимут магнитный, град' , 'trueAzimuth' , { dataIndex : 'trueAzimuth' , align : 'center' , editable : true } ) ,
makeColumn ( 'Азимут истинный, град' , 'conditionalViscosity' , { dataIndex : 'conditionalViscosity' , align : 'center' , editable : true } ) ,
makeColumn ( 'Азимут дирекц., град' , 'directAzimuth' , { dataIndex : 'directAzimuth' , align : 'center' , editable : true } ) ,
makeColumn ( 'Глубина по вертикали, м' , 'verticalDepth' , { dataIndex : 'verticalDepth' , align : 'center' , editable : true } ) ,
makeColumn ( 'Абсолютная отметка, м' , 'absoluteMark' , { dataIndex : 'absoluteMark' , align : 'center' , editable : true } ) ,
makeColumn ( 'Лок. смещение к северу, м' , 'localNorthOffset' , { dataIndex : 'localNorthOffset' , align : 'center' , editable : true } ) ,
makeColumn ( 'Лок. смещение к востоку, м' , 'localEastOffset' , { dataIndex : 'localEastOffset' , align : 'center' , editable : true } ) ,
makeColumn ( 'Отклонение от устья, м' , 'outFallOffset' , { dataIndex : 'outFallOffset' , align : 'center' , editable : true } ) ,
makeColumn ( 'Азимут смещения, град' , 'offsetAzimuth' , { dataIndex : 'offsetAzimuth' , align : 'center' , editable : true } ) ,
makeColumn ( 'Пространст. интенсивность, град/10 м' , 'areaIntensity' , { dataIndex : 'areaIntensity' , align : 'center' , editable : true } ) ,
makeColumn ( 'Угол установки отклон., град' , 'offsetStopAngle' , { dataIndex : 'offsetStopAngle' , align : 'center' , editable : true } ) ,
makeColumn ( 'Интенсив. по зениту, град/10 м' , 'zenithIntensity' , { dataIndex : 'zenithIntensity' , align : 'center' , editable : true } ) ,
makeColumn ( 'Комментарий' , 'comment' , { dataIndex : 'comment' , align : 'comment' , editable : true } ) ,
makeColumn ( 'Разница вертикальных глубин между Х Х Х (план) и Х Х Х (факт)' , 'depthPlanFactDifference' , { dataIndex : 'depthPlanFactDifference' , align : 'center' , editable : true } ) ,
makeColumn ( 'Расстояние в пространстве между Х Х Х (план) и Х Х Х (факт)' , 'distancePlanFactDifference' , { dataIndex : 'distancePlanFactDifference' , align : 'center' , editable : true } ) ,
2021-07-29 17:17:28 +05:00
{
title : 'Действие' ,
dataIndex : 'action' ,
align : 'center' ,
width : 150 ,
className : 'small-font' ,
render : ( _ , row ) => {
const editable = isEditing ( row ) ;
return editable ? (
< span >
< a
href = "javascript:;"
onClick = { ( ) => save ( row . key ) }
style = { { marginRight : 8 } }
>
Сохранить
< / a >
< Popconfirm style = { { width : '100px' } } title = { < span > Отменить < br / > редактирование ? < / span > } onConfirm = { cancel } >
< a > Отменить < / a >
< / Popconfirm >
< / span >
) : (
< Typography.Link disabled = { editingKey !== '' } onClick = { ( ) => edit ( row ) } >
Редактировать
< / Typography.Link >
) ;
} ,
}
] ;
const mergedColumns = columns . map ( ( col ) => {
if ( ! col . editable ) {
return col ;
}
return {
... col ,
onCell : ( row ) => ( {
row ,
dataIndex : col . dataIndex ,
title : col . title ,
editing : isEditing ( row ) ,
} ) ,
} ;
} ) ;
const edit = ( row ) => {
form . setFieldsValue ( {
... row ,
} ) ;
setEditingKey ( row . key ) ;
} ;
const cancel = ( ) => {
setEditingKey ( '' ) ;
} ;
const save = async ( key ) => {
try {
const row = await form . validateFields ( ) ;
const newData = [ ... data ] ;
const index = newData . findIndex ( ( item ) => key === item . key ) ;
if ( index > - 1 ) {
const item = newData [ index ] ;
newData . splice ( index , 1 , { ... item , ... row } ) ;
setData ( newData ) ;
setEditingKey ( '' ) ;
} else {
newData . push ( row ) ;
setData ( newData ) ;
setEditingKey ( '' ) ;
}
} catch ( errInfo ) {
console . log ( 'Validate Failed:' , errInfo ) ;
}
} ;
2021-07-28 17:59:16 +05:00
return ( < >
2021-07-29 17:17:28 +05:00
< Form form = { form } component = { false } >
< Table
components = { {
body : {
cell : EditableCell ,
} ,
} }
columns = { mergedColumns }
dataSource = { data }
size = { 'small' }
bordered = { true }
pagination = { false }
/ >
< / Form >
2021-07-28 17:59:16 +05:00
< / > )
}