import { Button } from '@/component/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/component/ui/card' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from '@/component/ui/dialog' import { Input } from '@/component/ui/input' import { Label } from '@/component/ui/label' import { CellsBadge } from '@/entitiy/element/ui/cellsBadge' import { AlertCircle, Building2, Calendar as CalendarIcon, CheckCircle, Plus, Settings, } from 'lucide-react' import { useEffect, useState } from 'react' import { useDailyConditions, useLaboratories, useLaboratoryConditions, } from './hooks' import { VerificationConditionsConfig, VerificationConditionsValue, } from './types' // Утилиты для работы с localStorage const getLocalStorageKey = (type: string, id: string) => `${type}_${id}` const saveToLocalStorage = (key: string, value: string) => { try { localStorage.setItem(key, value) } catch (error) { console.warn('Failed to save to localStorage:', error) } } const getFromLocalStorage = (key: string): string => { try { return localStorage.getItem(key) || '' } catch (error) { console.warn('Failed to get from localStorage:', error) return '' } } interface VerificationConditionsRenderProps { config: VerificationConditionsConfig & { id?: string } value?: VerificationConditionsValue onChange?: (value: VerificationConditionsValue) => void onSave?: (value: VerificationConditionsValue) => Promise } export function VerificationConditionsRender({ config, value, onChange, onSave, }: VerificationConditionsRenderProps) { // Инициализация даты с учетом localStorage const getInitialDate = () => { if (value?.date) return value.date if (config.selectedDate) return config.selectedDate // Попытка загрузить из localStorage if (config.id) { const key = getLocalStorageKey('verification_conditions_date', config.id) const savedDate = getFromLocalStorage(key) if (savedDate) return savedDate } return new Date().toISOString().split('T')[0] } const [selectedDate, setSelectedDate] = useState(getInitialDate) const [editDialogOpen, setEditDialogOpen] = useState(false) const [editingConditions, setEditingConditions] = useState< Record >({}) const { data: laboratories = [] } = useLaboratories() const { data: labData } = useLaboratoryConditions(config.selectedLaboratoryId) const { data: dailyCondition, saveConditions, isSaving, } = useDailyConditions(config.selectedLaboratoryId, selectedDate) const selectedLab = laboratories.find( lab => lab.id === config.selectedLaboratoryId ) const hasConditions = dailyCondition && Object.keys(dailyCondition.conditions).length > 0 // Инициализация данных при загрузке из БД, только если данные еще не заполнены useEffect(() => { if ( dailyCondition && hasConditions && onChange && (!value?.conditions || Object.keys(value.conditions).length === 0) ) { onChange({ date: selectedDate, conditions: dailyCondition.conditions, }) } }, [dailyCondition, hasConditions, onChange, selectedDate, value?.conditions]) // Синхронизация selectedDate с внешним value.date useEffect(() => { if (value?.date && value.date !== selectedDate) { setSelectedDate(value.date) } }, [value?.date, selectedDate]) // Инициализация значения если оно не установлено useEffect(() => { if (!value && onChange) { onChange({ date: selectedDate, conditions: {}, }) } }, [value, onChange, selectedDate]) const handleDateChange = (event: React.ChangeEvent) => { const newDate = event.target.value setSelectedDate(newDate) // Сохранение в localStorage if (config.id) { const key = getLocalStorageKey('verification_conditions_date', config.id) saveToLocalStorage(key, newDate) } // Обновляем значение даты в value if (onChange) { onChange({ date: newDate, conditions: value?.conditions || {}, }) } } const handleOpenEditDialog = (isCreating = false) => { if (isCreating) { const emptyConditions: Record = {} labData?.conditionTypes.forEach(conditionType => { emptyConditions[conditionType.id] = '' }) setEditingConditions(emptyConditions) } else { setEditingConditions(dailyCondition?.conditions || {}) } setEditDialogOpen(true) } const handleSaveConditions = async () => { if (!config.selectedLaboratoryId || !selectedDate || !labData) return try { await saveConditions(editingConditions) if (onChange) { onChange({ date: selectedDate, conditions: editingConditions, }) } setEditDialogOpen(false) } catch (error) { console.error('Ошибка сохранения:', error) } } const handleConditionChange = (conditionId: string, value: string) => { setEditingConditions(prev => ({ ...prev, [conditionId]: value, })) } if (!config.selectedLaboratoryId) { return (

Лаборатория не настроена

) } if (!labData) { return (

Загрузка...

) } return (
{/* Бейдж ячеек */} {selectedLab?.name || 'Лаборатория'} {/* Выбор даты */}
{/* Статус и данные */}
{hasConditions ? (
Данные внесены
Условия поверки
{selectedLab?.name}
{new Date(selectedDate).toLocaleDateString('ru-RU')}
{labData.conditionTypes.map(conditionType => (
handleConditionChange( conditionType.id, e.target.value ) } placeholder="Значение" className="h-7 text-xs" />
))}
{labData.conditionTypes.map(conditionType => { const conditionValue = dailyCondition!.conditions[conditionType.id] return (
{conditionType.name} {conditionValue || '—'} {conditionValue && conditionType.unit && ( {conditionType.unit} )}
) })}
) : (
Данные не внесены
Условия поверки
{selectedLab?.name}
{new Date(selectedDate).toLocaleDateString('ru-RU')}
{labData.conditionTypes.map(conditionType => (
handleConditionChange( conditionType.id, e.target.value ) } placeholder="Значение" className="h-7 text-xs" />
))}
)}
) }