From db04d6b9c3d934b3b7c30a78bc2b836f7dfec5cc Mon Sep 17 00:00:00 2001 From: host Date: Sun, 9 Aug 2026 19:22:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=B0=D1=82=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=B0=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20LXC-=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BA=20=D0=BF=D1=80=D0=B5=D0=B4=D1=8B=D0=B4=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AdminTemplates.jsx | 107 ++++++++------------------ 1 file changed, 33 insertions(+), 74 deletions(-) diff --git a/frontend/src/pages/AdminTemplates.jsx b/frontend/src/pages/AdminTemplates.jsx index 3cf8cf7..c4b22bc 100644 --- a/frontend/src/pages/AdminTemplates.jsx +++ b/frontend/src/pages/AdminTemplates.jsx @@ -20,29 +20,20 @@ export default function AdminTemplates() { const [busy, setBusy] = useState(false); const [importing, setImporting] = useState(null); - const vmTemplates = proxmoxTemplates?.vm_templates || []; - const lxcTemplates = proxmoxTemplates?.lxc_templates || []; + async function refresh() { setTemplates(await api.listTemplates()); } - async function refresh() { - setTemplates(await api.listTemplates()); - } - - async function findTemplates() { + async function fetchProxmox() { setError(""); setBusy(true); - try { - setProxmoxTemplates(await api.fetchProxmoxTemplates()); - } catch (err) { - setError(err.message); - } finally { - setBusy(false); - } + try { setProxmoxTemplates(await api.fetchProxmoxTemplates()); } + catch (err) { setError(err.message); } + finally { setBusy(false); } } async function importVm(vm) { const key = `vm-${vm.vmid}`; - setImporting(key); setError(""); + setImporting(key); try { await api.createTemplate({ name: vm.name || `VM-${vm.vmid}`, @@ -54,17 +45,14 @@ export default function AdminTemplates() { disk_gb: vm.disk_gb || 10, }); await refresh(); - } catch (err) { - setError(err.message); - } finally { - setImporting(null); - } + } catch (err) { setError(err.message); } + finally { setImporting(null); } } async function importLxc(archive) { const key = `lxc-${archive.volid}`; - setImporting(key); setError(""); + setImporting(key); try { await api.createTemplate({ name: archive.name, @@ -76,26 +64,17 @@ export default function AdminTemplates() { disk_gb: 8, }); await refresh(); - } catch (err) { - setError(err.message); - } finally { - setImporting(null); - } + } catch (err) { setError(err.message); } + finally { setImporting(null); } } async function deleteTemplate(id) { if (!confirm("Удалить шаблон?")) return; - try { - await api.deleteTemplate(id); - await refresh(); - } catch (err) { - setError(err.message); - } + try { await api.deleteTemplate(id); await refresh(); } + catch (err) { setError(err.message); } } - useEffect(() => { - refresh().catch((err) => setError(err.message)); - }, []); + useEffect(() => { refresh().catch((err) => setError(err.message)); }, []); function set(field, value) { setForm((current) => ({ ...current, [field]: value })); @@ -116,13 +95,13 @@ export default function AdminTemplates() { }); setForm(empty); await refresh(); - } catch (err) { - setError(err.message); - } finally { - setBusy(false); - } + } catch (err) { setError(err.message); } + finally { setBusy(false); } } + const vmTemplates = proxmoxTemplates?.vm_templates || []; + const lxcTemplates = proxmoxTemplates?.lxc_templates || []; + return (

Шаблоны VPS

@@ -130,7 +109,7 @@ export default function AdminTemplates() {

🔍 Найти шаблоны на Proxmox

- @@ -143,12 +122,10 @@ export default function AdminTemplates() { VMIDИмяvCPURAM {vmTemplates.map((vm) => { const key = `vm-${vm.vmid}`; - return ( - - {vm.vmid}{vm.name}{vm.cores}{vm.memory_mb} МБ - - - ); + return + {vm.vmid}{vm.name}{vm.cores}{vm.memory_mb} МБ + + ; })} ) :

VM-шаблоны не найдены.

} @@ -161,12 +138,10 @@ export default function AdminTemplates() { ИмяХранилищеРазмер {lxcTemplates.map((archive) => { const key = `lxc-${archive.volid}`; - return ( - - {archive.name}{archive.storage || "—"}{archive.size_mb || 0} МБ - - - ); + return + {archive.name}{archive.storage || "—"}{archive.size_mb || 0} МБ + + ; })} ) :

Архивные LXC-шаблоны не найдены.

} @@ -180,25 +155,11 @@ export default function AdminTemplates() {
set("name", e.target.value)} required />
- {form.guest_type === "vm" ? (
set("source_vmid", e.target.value)} placeholder="999" required />
) : ( -
- - -
+
set("source_template", e.target.value)} placeholder="local:vztmpl/..." required />
)} -
set("description", e.target.value)} />
set("cores", e.target.value)} />
set("memory_mb", e.target.value)} />
@@ -210,12 +171,10 @@ export default function AdminTemplates() {

📋 Активные шаблоны

- {templates.map((template) => ( - - - - - ))} + {templates.map((template) => + + + )}
НазваниеТипvCPURAMДиск
{template.name}{template.guest_type === "vm" ? "VM" : "LXC"}{template.cores}{template.memory_mb} МБ{template.disk_gb} ГБ
{template.name}{template.guest_type === "vm" ? "VM" : "LXC"}{template.cores}{template.memory_mb} МБ{template.disk_gb} ГБ
);