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 { FileText, Settings, Weight } from 'lucide-react' import { useEffect, useState } from 'react' import { useStandards } from './hooks' import { getStandardById } from './mockStandards' import { StandardsEditor } from './StandardsEditor' import { StandardsPreview } from './StandardsPreview' import { StandardsSelector } from './StandardsSelector' interface StandardsConfig { sheet: string // Лист Excel startCell: string // Первая ячейка (например "A10") maxItems: number // Обычно 7 targetCells: CellTarget[] selectedStandards?: string[] // Выбранные эталоны (ID) } export const standardsDefinition: ElementDefinition = { type: 'standards', label: 'Измерительные эталоны', icon: , version: 1, defaultConfig: { sheet: 'L', startCell: 'A1', maxItems: 7, targetCells: [], selectedStandards: [], // По умолчанию пустой массив }, Editor: StandardsEditor, Preview: StandardsPreview, // Использует моки для демонстрации Render: ({ config, value, onChange }) => { const [isStandardsDialogOpen, setIsStandardsDialogOpen] = useState(false) const [selectedStandardIds, setSelectedStandardIds] = useState( // Инициализируем из config.selectedStandards или value config.selectedStandards || (Array.isArray(value) ? value : []) ) // Получаем реальные данные эталонов const { data: standards = [] } = useStandards() // Синхронизируем selectedStandardIds с config и value useEffect(() => { const standards = config.selectedStandards || (Array.isArray(value) ? value : []) setSelectedStandardIds(standards) }, [config.selectedStandards, value]) // Получаем данные выбранных эталонов из реального API const selectedStandardsData = selectedStandardIds .map(id => standards.find(s => s.id === id)) .filter(Boolean) return (
{/* Блок с измерительными эталонами */}
{selectedStandardsData.length > 0 ? (
{selectedStandardsData.map( (standard, index) => standard && (
{index + 1}
{standard.name}
{standard.registry_number}
{standard.range}
) )}
) : (
Эталоны не выбраны
)}
setIsStandardsDialogOpen(false)} value={selectedStandardIds} onChange={standardIds => { setSelectedStandardIds(standardIds) // Сохраняем ID эталонов в value для записи в Excel onChange?.(standardIds) }} maxItems={config.maxItems} />
) }, mapToCells: cfg => { // Используем только ячейки, указанные пользователем в targetCells return cfg.targetCells || [] }, mapToCellValues: (cfg, value) => { // Используем targetCells из конфигурации const cells = cfg.targetCells || [] // Конвертируем ID эталонов в их названия для записи в Excel // Здесь используем моки для быстрого доступа к данным при записи в Excel const standardIds = Array.isArray(value) ? value : [] const standardNames = standardIds.map( id => getStandardById(id)?.name || '' ) return cells.map((target, idx) => ({ target, value: standardNames[idx] || '', // Берем значение по индексу или пустую строку })) }, }