diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx index ee4372d..be9e660 100644 --- a/frontend/src/pages/Dashboard.jsx +++ b/frontend/src/pages/Dashboard.jsx @@ -45,7 +45,7 @@ export default function Dashboard() { const [instances, setInstances] = useState([]); const [templates, setTemplates] = useState([]); const [showForm, setShowForm] = useState(false); - const [guestType, setGuestType] = useState("vm"); // "vm" | "lxc" + const [guestType, setGuestType] = useState("vm"); // "vm" | "lxc" — задаётся кнопкой в шапке, внутри формы не меняется const [name, setName] = useState(""); const [ciuser, setCiuser] = useState("ubuntu"); const [cipassword, setCipassword] = useState(""); @@ -68,7 +68,7 @@ export default function Dashboard() { return () => clearInterval(timer); }, [refresh]); - // Шаблоны строго по типу: при выбранном "vm" — только VM, при "lxc" — только LXC. + // Шаблоны строго по выбранному типу. const typeTemplates = useMemo( () => templates.filter((t) => t.guest_type === guestType), [templates, guestType] @@ -78,12 +78,10 @@ export default function Dashboard() { [typeTemplates, selectedOS] ); - // При смене типа — сбросить выбор ОС и тарифа. Иначе может остаться шаблон - // другого типа или несуществующая ОС. + // При смене типа — сбросить выбор тарифа и подобрать доступную ОС. useEffect(() => { setTemplateId(""); setSelectedPreset(null); - // Если текущая выбранная ОС недоступна для нового типа — сбросить на дефолт. if (!OS_OPTIONS.some((os) => os.key === selectedOS && filterByOS(typeTemplates, os.key).length > 0)) { const firstAvailable = OS_OPTIONS.find((os) => filterByOS(typeTemplates, os.key).length > 0); setSelectedOS(firstAvailable?.key || "ubuntu"); @@ -106,6 +104,9 @@ export default function Dashboard() { // Открыть форму для конкретного типа — VM или LXC. const openForm = (type) => { setGuestType(type); + setName(""); + setCipassword(""); + setSelectedPreset(null); setShowForm(true); }; @@ -121,17 +122,12 @@ export default function Dashboard() { setBusy(true); try { const isLxc = guestType === "lxc"; - // Для LXC пользователь — root (зашит в бэкенде), пароль — ввод пользователя. - // Для VM — стандартная cloud-init пара. await api.createInstance({ name, template_id: Number(templateId), ciuser: isLxc ? "" : (ciuser || ""), cipassword: cipassword || "", }); - setName(""); - setCipassword(""); - setSelectedPreset(null); setShowForm(false); await refresh(); } catch (err) { setError(err.message); } @@ -157,11 +153,7 @@ export default function Dashboard() { }; const isLxc = guestType === "lxc"; - const submitLabel = isLxc - ? (busy ? "⏳ Создаём..." : "📦 Создать LXC") - : (busy ? "⏳ Создаём..." : "🚀 Развернуть VM"); const hasTypeTemplates = typeTemplates.length > 0; - const typeLabel = isLxc ? "LXC-контейнеров" : "VM (виртуальных машин)"; return (