import { Badge } from '@/component/ui/badge' import { Button } from '@/component/ui/button' import { Label } from '@/component/ui/label' import { ElementDefinition } from '@/entitiy/element/model/interface' import { CellTarget } from '@/type/template' import { Settings, Weight, Wrench } from 'lucide-react' import { useEffect, useState } from 'react' import { StandardsEditor } from './StandardsEditor' import { StandardsPreview } from './StandardsPreview' import { StandardsSelector } from './StandardsSelector' // Моковые данные для эталонов (такие же как в StandardsSelector) const mockStandards = [ { id: '1', name: 'Эталон массы 1 кг', shortName: 'ЭМ-1кг', type: 'Масса', registryNumber: 'ГРСИ 12345-01', range: '0.5-2 кг', accuracy: '±0.001 г', certificateNumber: 'СИ-2024-001', validUntil: '2025-12-31', }, { id: '2', name: 'Эталон длины 1 м', shortName: 'ЭД-1м', type: 'Длина', registryNumber: 'ГРСИ 12345-02', range: '0.5-2 м', accuracy: '±0.001 мм', certificateNumber: 'СИ-2024-002', validUntil: '2025-06-30', }, { id: '3', name: 'Эталон температуры 20°C', shortName: 'ЭТ-20°C', type: 'Температура', registryNumber: 'ГРСИ 12345-03', range: '15-25°C', accuracy: '±0.01°C', certificateNumber: 'СИ-2024-003', validUntil: '2025-03-15', }, { id: '4', name: 'Эталон давления 1 Па', shortName: 'ЭД-1Па', type: 'Давление', registryNumber: 'ГРСИ 12345-04', range: '0.5-2 Па', accuracy: '±0.001 Па', certificateNumber: 'СИ-2024-004', validUntil: '2025-09-20', }, { id: '5', name: 'Эталон времени 1 с', shortName: 'ЭВ-1с', type: 'Время', registryNumber: 'ГРСИ 12345-05', range: '0.5-2 с', accuracy: '±0.000001 с', certificateNumber: 'СИ-2024-005', validUntil: '2025-12-01', }, ] // Функция для получения данных эталона по ID const getStandardById = (id: string) => { return mockStandards.find(standard => standard.id === id) } // Функция для получения типа эталона в сокращенном виде const getStandardTypeBadge = (type: string) => { switch (type) { case 'Манометр грузопоршневой': return 'МГП' case 'Калибратор давления': return 'КД' default: return 'МО' } } interface StandardsConfig { sheet: string // Лист Excel startCell: string // Первая ячейка (например "A10") maxItems: number // Обычно 7 targetCells: CellTarget[] } export const standardsDefinition: ElementDefinition = { type: 'standards', label: 'Измерительные эталоны', icon: , version: 1, defaultConfig: { sheet: 'L', startCell: 'A1', maxItems: 7, targetCells: [], }, Editor: StandardsEditor, Preview: StandardsPreview, Render: ({ config, value, onChange }) => { const [isStandardsDialogOpen, setIsStandardsDialogOpen] = useState(false) const [selectedStandardIds, setSelectedStandardIds] = useState( [] ) // Если value содержит названия эталонов, находим соответствующие ID useEffect(() => { if (Array.isArray(value) && value.length > 0) { const ids = value .map(name => { const standard = mockStandards.find(s => s.name === name) return standard?.id || '' }) .filter(Boolean) setSelectedStandardIds(ids) } }, [value]) const selectedStandardsData = selectedStandardIds .map(id => getStandardById(id)) .filter(Boolean) return (
{/* Блок с измерительными эталонами */}
{selectedStandardsData.length > 0 ? (
{selectedStandardsData.map( (standard, index) => standard && (
{index + 1}
{standard.shortName}
{standard.accuracy} • {standard.range}
{getStandardTypeBadge(standard.type)}
) )}
) : (
Эталоны не выбраны
)}
setIsStandardsDialogOpen(false)} value={selectedStandardIds} onChange={standardIds => { setSelectedStandardIds(standardIds) // Преобразуем ID эталонов в их названия для сохранения в ячейки const standardNames = standardIds.map( id => getStandardById(id)?.name || '' ) onChange?.(standardNames) }} />
) }, mapToCells: cfg => { // Используем только ячейки, указанные пользователем в targetCells return cfg.targetCells || [] }, mapToCellValues: (cfg, value) => { // Используем targetCells из конфигурации const cells = cfg.targetCells || [] // Сопоставляем значения с ячейками const standardNames = Array.isArray(value) ? value : [] return cells.map((target, idx) => ({ target, value: standardNames[idx] || '', // Берем значение по индексу или пустую строку })) }, }