import { useState, useEffect, memo } from 'react' import { Button, Form, Input, Popconfirm, Timeline } from 'antd' import { CheckSquareOutlined, EditOutlined, SaveOutlined, PlusOutlined, CloseCircleOutlined, DeleteOutlined } from '@ant-design/icons' import LoaderPortal from '@components/LoaderPortal' import { invokeWebApiWrapperAsync } from '@components/factory' import { MeasureService } from '@api' import { formatDate } from '@utils' import { View } from './View' import '@styles/index.css' import '@styles/measure.css' const createEditingColumns = (cols, renderDelegate) => cols.map(col => ({ render: renderDelegate, ...col })) export const MeasureTable = memo(({idWell, group, updateMeasuresFunc, additionalButtons}) => { const [showLoader, setShowLoader] = useState(false) const [displayedValues, setDisplayedValues] = useState({}) const [editingColumns, setEditingColumns] = useState(group.columns) const [isTableEditing, setIsTableEditing] = useState(false) const [editingActionName, setEditingActionName] = useState('') const [data, setData] = useState([]) const [measuresForm] = Form.useForm() useEffect(() => { let data = [group.defaultValue] if (group?.values?.length > 0) data = group.values setData(data) setDisplayedValues(data.at(-1)) }, [group.defaultValue, group.values]) useEffect(() => { const switchableColumns = createEditingColumns( group.columns, isTableEditing ? () => : null ) if(editingActionName === 'edit') measuresForm.setFieldsValue(displayedValues?.data) else if(editingActionName === 'add') measuresForm.resetFields() setEditingColumns(switchableColumns) }, [isTableEditing, group.columns, editingActionName, displayedValues?.data, measuresForm]) const markMeasuresAsDeleted = async () => await invokeWebApiWrapperAsync( async () => { await MeasureService.markAsDelete(idWell, displayedValues.id) updateMeasuresFunc() }, setShowLoader, `Не удалось удалить запись ${displayedValues.id} для скважины "${idWell}"`, 'Удаление записи для скважины' ) const isDataDefault = () => !!displayedValues?.isDefaultData const editTable = (action) => { setEditingActionName(action) setIsTableEditing(true) } const handleSubmitMeasuresForm = async (formData) => await invokeWebApiWrapperAsync( async () => { measuresForm.validateFields() const measureParams = { idWell: idWell, idCategory: group.idCategory, timestamp: new Date().toISOString(), data: formData } if(editingActionName === 'add') { await MeasureService.insert(idWell, measureParams) } else if (editingActionName === 'edit') { measureParams.id = displayedValues.id measureParams.timestamp = displayedValues.timestamp await MeasureService.update(idWell, measureParams) } setIsTableEditing(false) updateMeasuresFunc() }, setShowLoader, `Не удалось добавить/изменить запись для скаважины "${idWell}"`, 'Добавление/изменение записи по скважине' ) return ( <>