/
sweetebin
/
hackaton_26
Обзор
Документация
Войти
/
sweetebin
/
hackaton_26
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
web-form-project/src/components/NewProjectDialog.jsx
103 строки
3 KB
sweetebin
serve-first: экран сборки пула в дашборде (файлы/папка, живой СберТрек через фасад), старт анализа кнопкой; fbminer sbertrack в CLI; техдолг
28 июл 2026, 15:32
28 июл 2026, 15:32
8dbd2f7
Код
Авторство
О чём код?
import { useEffect, useState } from 'react'; import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, Stack, TextField, Typography, } from '@mui/material'; import { createProject } from '../api/client'; import DataInput from './DataInput'; const JIRA_KEY_RE = /^[A-Z][A-Z0-9]{1,9}$/; export default function NewProjectDialog({ open, onClose, onCreated }) { const [name, setName] = useState(''); const [jiraKey, setJiraKey] = useState(''); const [payload, setPayload] = useState(null); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); // Сброс полей при каждом открытии диалога useEffect(() => { if (open) { setName(''); setJiraKey(''); setPayload(null); setError(null); } }, [open]); const keyValid = JIRA_KEY_RE.test(jiraKey.trim().toUpperCase()); const handleCreate = async () => { setBusy(true); setError(null); try { const { projectId } = await createProject({ name: name.trim() || undefined, jiraProjectKey: jiraKey.trim().toUpperCase(), ...payload, }); onCreated(projectId); } catch (e) { setError(e.message); } finally { setBusy(false); } }; return ( <Dialog open={open} onClose={busy ? undefined : onClose} maxWidth="sm" fullWidth> <DialogTitle>Новый проект анализа</DialogTitle> {/* key пересоздаёт DataInput при каждом открытии */} <DialogContent key={open}> <Stack spacing={2} sx={{ mt: 1 }}> <TextField label="Название проекта" placeholder="Например: Мобильное приложение" value={name} onChange={(e) => setName(e.target.value)} fullWidth /> <TextField label="Пространство СберТрек (ключ проекта)" placeholder="PROJ" required value={jiraKey} onChange={(e) => setJiraKey(e.target.value.toUpperCase())} error={jiraKey.length > 0 && !keyValid} helperText={ jiraKey.length > 0 && !keyValid ? '2–10 символов: латинские буквы и цифры, начинается с буквы' : 'Принятые задачи будут заводиться в это пространство СберТрек' } fullWidth /> <Typography variant="body2" color="text.secondary"> Данные можно приложить сразу (необязательно) — остальной пул соберёте на следующем экране: файлы, папка с транскриптами или живая выгрузка из СберТрека. </Typography> <DataInput onChange={setPayload} /> {error && ( <Alert severity="error" onClose={() => setError(null)}> {error} </Alert> )} </Stack> </DialogContent> <DialogActions sx={{ px: 3, pb: 2 }}> <Button onClick={onClose} disabled={busy} color="inherit"> Отмена </Button> <Button variant="contained" onClick={handleCreate} disabled={!keyValid || busy}> {busy ? 'Создаём…' : 'Создать проект'} </Button> </DialogActions> </Dialog> ); }