import React, { useState, useEffect } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, Button, TextField, Box, Typography, IconButton, Paper, Tooltip, } from '@mui/material'; import Grid from '@mui/material/GridLegacy'; import { Star as StarIcon, Archive as ArchiveIcon, Person as PersonIcon, Work as WorkIcon, Receipt as ReceiptIcon, Scale as ScaleIcon, LocalHospital as MedicalIcon, AttachMoney as DollarIcon, BusinessCenter as BriefcaseIcon, Description as DocumentIcon, Label as LabelIcon, BugReport as BugIcon, Build as BuildIcon, Folder as FolderIcon, Assignment as AssignmentIcon, Schedule as ScheduleIcon, } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; import Label, { type LabelData } from './Label'; interface LabelCreateDialogProps { open: boolean; onClose: () => void; onSubmit: (labelData: Omit) => Promise; prefilledName?: string; editingLabel?: LabelData; } const availableIcons = [ { name: 'star', icon: StarIcon, label: 'Star' }, { name: 'archive', icon: ArchiveIcon, label: 'Archive' }, { name: 'person', icon: PersonIcon, label: 'Person' }, { name: 'work', icon: WorkIcon, label: 'Work' }, { name: 'briefcase', icon: BriefcaseIcon, label: 'Briefcase' }, { name: 'receipt', icon: ReceiptIcon, label: 'Receipt' }, { name: 'scale', icon: ScaleIcon, label: 'Legal' }, { name: 'medical', icon: MedicalIcon, label: 'Medical' }, { name: 'dollar', icon: DollarIcon, label: 'Money' }, { name: 'document', icon: DocumentIcon, label: 'Document' }, { name: 'label', icon: LabelIcon, label: 'Label' }, { name: 'bug', icon: BugIcon, label: 'Bug' }, { name: 'build', icon: BuildIcon, label: 'Build' }, { name: 'folder', icon: FolderIcon, label: 'Folder' }, { name: 'assignment', icon: AssignmentIcon, label: 'Assignment' }, { name: 'schedule', icon: ScheduleIcon, label: 'Schedule' }, ]; const predefinedColors = [ '#0969da', // GitHub blue '#d73a49', // GitHub red '#28a745', // GitHub green '#ffd33d', // GitHub yellow '#8250df', // GitHub purple '#fd7e14', // Orange '#20c997', // Teal '#6f42c1', // Indigo '#e83e8c', // Pink '#6c757d', // Gray ]; const LabelCreateDialog: React.FC = ({ open, onClose, onSubmit, prefilledName = '', editingLabel }) => { const { t } = useTranslation(); const [formData, setFormData] = useState({ name: '', description: '', color: '#0969da', background_color: '', icon: '', }); const [loading, setLoading] = useState(false); const [nameError, setNameError] = useState(''); useEffect(() => { if (editingLabel) { setFormData({ name: editingLabel.name, description: editingLabel.description || '', color: editingLabel.color, background_color: editingLabel.background_color || '', icon: editingLabel.icon || '', }); } else { setFormData({ name: prefilledName, description: '', color: '#0969da', background_color: '', icon: '', }); } setNameError(''); }, [editingLabel, prefilledName, open]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.name.trim()) { setNameError(t('labels.errors.invalidName')); return; } setLoading(true); try { await onSubmit({ name: formData.name.trim(), description: formData.description.trim() || undefined, color: formData.color, background_color: formData.background_color || undefined, icon: formData.icon || undefined, }); handleClose(); } catch (error) { console.error('Failed to save label:', error); // Could add error handling UI here } finally { setLoading(false); } }; const handleClose = () => { if (!loading) { onClose(); } }; const previewLabel: LabelData = { id: 'preview', name: formData.name || 'Label Preview', description: formData.description, color: formData.color, background_color: formData.background_color, icon: formData.icon, is_system: false, created_at: new Date().toISOString(), updated_at: new Date().toISOString(), document_count: 0, source_count: 0, }; return ( {editingLabel ? t('labels.create.editTitle') : t('labels.create.title')} {/* Name Field */} { setFormData({ ...formData, name: e.target.value }); if (nameError) setNameError(''); }} error={!!nameError} helperText={nameError} fullWidth required autoFocus disabled={loading} /> {/* Description Field */} setFormData({ ...formData, description: e.target.value })} fullWidth multiline rows={2} disabled={loading} /> {/* Color Selection */} {t('labels.create.colorLabel')} {predefinedColors.map((color) => ( setFormData({ ...formData, color })} disabled={loading} sx={{ width: 32, height: 32, backgroundColor: color, border: formData.color === color ? '3px solid' : '1px solid', borderColor: formData.color === color ? 'primary.main' : 'divider', '&:hover': { backgroundColor: color, opacity: 0.8, }, }} /> ))} setFormData({ ...formData, color: e.target.value })} size="small" disabled={loading} InputProps={{ startAdornment: ( ), }} /> {/* Icon Selection */} {t('labels.create.iconLabel')} setFormData({ ...formData, icon: '' })} disabled={loading} sx={{ border: '1px solid', borderColor: !formData.icon ? 'primary.main' : 'divider', backgroundColor: !formData.icon ? 'action.selected' : 'transparent', }} > {t('labels.create.iconNone')} {availableIcons.map((iconData) => { const IconComponent = iconData.icon; return ( setFormData({ ...formData, icon: iconData.name })} disabled={loading} sx={{ border: '1px solid', borderColor: formData.icon === iconData.name ? 'primary.main' : 'divider', backgroundColor: formData.icon === iconData.name ? 'action.selected' : 'transparent', }} > ); })} {/* Preview */} {t('labels.create.previewLabel')} ); }; export default LabelCreateDialog;