import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Calendar, Check, FileText, Settings, X } from "lucide-react"; import { useState } from "react"; interface MeasurementStandard { id: string; name: string; shortName: string; type: string; registryNumber: string; range: string; accuracy: string; certificateNumber: string; validUntil: string; } interface StandardsSelectorProps { isOpen: boolean; onClose: () => void; value: string[]; onChange: (value: string[]) => void; registryNumber?: string; } // Моковые данные для эталонов const mockStandards: MeasurementStandard[] = [ { 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", }, ]; export function StandardsSelector({ isOpen, onClose, value = [], onChange, registryNumber = "ГРСИ 12345" }: StandardsSelectorProps) { const [selectedStandards, setSelectedStandards] = useState(value); const toggleStandard = (standardId: string) => { setSelectedStandards(prev => { if (prev.includes(standardId)) { return prev.filter(id => id !== standardId); } else if (prev.length < 7) { return [...prev, standardId]; } return prev; }); }; const handleSave = () => { onChange(selectedStandards); onClose(); }; const handleClose = () => { setSelectedStandards(value); // Сбрасываем к исходному значению onClose(); }; const isExpiringSoon = (validUntil: string) => { const expiryDate = new Date(validUntil); const now = new Date(); const monthsUntilExpiry = (expiryDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24 * 30); return monthsUntilExpiry <= 3; }; return (
Измерительные эталоны

ГРСИ: {registryNumber} • Выбрано: {selectedStandards.length}/7

{mockStandards.map((standard) => { const isSelected = selectedStandards.includes(standard.id); const isExpiring = isExpiringSoon(standard.validUntil); return (
toggleStandard(standard.id)} className={`p-3 rounded-lg border cursor-pointer transition-all duration-200 ${ isSelected ? "border-primary bg-primary/10 shadow-sm" : "border-border hover:border-primary/50 hover:bg-primary/5" }`} >
{isSelected && }
{standard.shortName}
{standard.name}
{standard.accuracy} {isExpiring && ( Истекает )}
{standard.registryNumber}
Диапазон: {standard.range}
Действует до: {new Date(standard.validUntil).toLocaleDateString('ru-RU')}
); })}
Максимум 7 эталонов. Выбрано: {selectedStandards.length}
); }