asb_cloud_front/src/pages/Measure/MeasureTable.jsx

178 lines
5.4 KiB
React
Raw Normal View History

2021-10-06 13:57:04 +05:00
import { useState, useEffect } from 'react'
import { Button, Form, Input, Timeline } from 'antd'
import moment from 'moment'
import { ExclamationCircleOutlined } from '@ant-design/icons'
import { View } from './View'
2021-10-06 13:57:04 +05:00
import LoaderPortal from '../../components/LoaderPortal'
import { MeasureService } from '../../services/api'
import '../../styles/index.css'
import '../../styles/measure.css'
const format='YYYY.MM.DD HH:mm'
export const MeasureTable = ({idWell, idCategory, title, columns, values, updateMeasuresFunc}) => {
2021-10-06 13:57:04 +05:00
const [showLoader, setShowLoader] = useState(false);
const [selectedTimeLineId, setSelectedTimeLineId] = useState(0)
const [displayedValues, setDisplayedValues] = useState([]);
const [editingColumns, setEditingColumns] = useState(columns);
const [isTableEditing, setIsTableEditing] = useState(false);
2021-10-06 13:57:04 +05:00
const [editingActionName, setEditingActionName] = useState('');
const [measuresForm] = Form.useForm();
const createEditingColumns = (cols, renderDelegate) =>
cols.map(col =>
({ render: renderDelegate,
...col
})
)
useEffect(() => {
let valuesToDisplay = []
if(selectedTimeLineId === 0) {
valuesToDisplay = values.length
? values[values.length-1]
: []
} else {
valuesToDisplay = values.find(el => el.id === selectedTimeLineId)
}
setDisplayedValues(valuesToDisplay)
}, [selectedTimeLineId, values])
useEffect(() => {
let switchableColumns = []
isTableEditing && editingActionName !== 'Удалить'
? switchableColumns = createEditingColumns(columns, () => <Input className='w-100' />)
: switchableColumns = createEditingColumns(columns, null)
if(editingActionName === 'Редактировать')
measuresForm.setFieldsValue(displayedValues.data);
else if(editingActionName === 'Добавить')
measuresForm.resetFields()
setEditingColumns(switchableColumns)
}, [isTableEditing, columns, editingActionName, displayedValues.data, measuresForm])
2021-10-06 13:57:04 +05:00
const buttonsConfig = [
{name:'Добавить', key:'add'},
{name:'Редактировать', key:'edit'},
{name:'Удалить', key:'delete'}
]
const createButtons = (config, onClickDelegate) => {
return (
<div className='w-300px mt-12px'>
{config.map(conf => {
2021-10-06 13:57:04 +05:00
return (
<Button
key={conf.key}
2021-10-06 13:57:04 +05:00
className='w-100'
onClick={onClickDelegate}
disabled={conf.key !== 'add' && displayedValues.isDefaultData
? true
: false}
2021-10-06 13:57:04 +05:00
>
{conf.name}
2021-10-06 13:57:04 +05:00
</Button>
)
})}
</div>
)
}
const crudButtons = createButtons(buttonsConfig, (e) => {
2021-10-06 13:57:04 +05:00
setEditingActionName(e.target.innerText)
setIsTableEditing(true)
})
const confirmButtons =
<div className='w-300px'>
<h3 style={{textAlign: 'center'}}>{editingActionName} данные?</h3>
<div className='d-flex mt-20px'>
<Button key='confirm' className='w-100' onClick={async () => {
if(editingActionName === 'Удалить'){
setShowLoader(true)
await MeasureService.markAsDelete(idWell, displayedValues.id)
updateMeasuresFunc()
setShowLoader(false)
setIsTableEditing(false)
} else {
measuresForm.submit()
}
}}
>
Да
</Button>
2021-10-06 13:57:04 +05:00
<Button key='decline' className='w-100' onClick={()=> setIsTableEditing(false)}>Нет</Button>
</div>
</div>
let handleSubmitMeasuresForm = async (formData) => {
measuresForm.validateFields()
2021-08-30 16:40:56 +05:00
const measureParams = {
idWell: idWell,
idCategory: idCategory,
timestamp: new Date().toISOString(),
data: formData
}
2021-10-06 13:57:04 +05:00
setShowLoader(true)
await MeasureService.insert(idWell, measureParams)
setIsTableEditing(false)
updateMeasuresFunc()
2021-10-06 13:57:04 +05:00
setShowLoader(false)
}
2021-08-28 22:32:13 +05:00
return <>
&nbsp;
2021-08-28 22:32:13 +05:00
<h3>{title}</h3>
2021-08-30 16:40:56 +05:00
&nbsp;
<div className='d-flex'>
<div className='flex-direction-column'>
<div className='d-flex button-container'>
{isTableEditing
? confirmButtons
: crudButtons
}
</div>
<div className='measure-dates mt-20px'>
<Timeline className='mt-12px ml-10px'>
{values.map((item, index) =>
<Timeline.Item
key={item.id}
className={index === values.length-1
? 'last-measure-button'
: 'measure-button'}
onClick={() => setSelectedTimeLineId(item.id)}
dot={item?.id === displayedValues?.id
? <ExclamationCircleOutlined className="timeline-clock-icon" />
2021-10-06 13:57:04 +05:00
: null}
>
{moment.utc(item.timestamp).local().format(format)}
</Timeline.Item>
)}
</Timeline>
</div>
</div>
<div className='w-100'>
2021-10-06 13:57:04 +05:00
<LoaderPortal show={showLoader}>
<Form
form={measuresForm}
onFinish={handleSubmitMeasuresForm}
>
<View
item={displayedValues.data}
2021-10-06 13:57:04 +05:00
columns={editingColumns}
/>
</Form>
</LoaderPortal>
</div>
</div>
</>
2021-08-28 22:32:13 +05:00
}