diff --git a/web/templates/vm_create.html b/web/templates/vm_create.html index 22ca1b1..28b4da1 100644 --- a/web/templates/vm_create.html +++ b/web/templates/vm_create.html @@ -7,6 +7,8 @@ + {% set disk_images_available = disk_images is defined and disk_images %} + {% set disk_feature_available = disk_images is defined %}
{% include "_sidebar.html" %} @@ -44,16 +46,23 @@
@@ -76,13 +85,14 @@ + {% if disk_feature_available %}
Опция нужна, если предыдущая попытка создания VM оборвалась и оставила хвост в /var/lib/virtuality/images.
+ {% endif %}
- Для обычных ISO выбирай x86_64 на ПК/VPS. Для Raspberry/Orange Pi образов обычно нужен ARM64/aarch64 и источник “Готовый диск”. Опция замены диска удаляет только /var/lib/virtuality/images/ИМЯ_VM.qcow2, если VM с таким именем ещё не существует. + Для обычных ISO выбирай x86_64 на ПК/VPS. Для Raspberry/Orange Pi образов обычно нужен ARM64/aarch64 и источник “Готовый диск”.
{% if not isos %}
Для режима ISO сначала загрузи ISO-образ в ISO-менеджере.
{% endif %} - {% if not disk_images %} + {% if disk_feature_available and not disk_images %}
Для режима готового диска сначала загрузи .img, .raw или .qcow2 в разделе «Диски».
{% endif %} @@ -142,7 +153,7 @@
Готовый диск - Virtuality импортирует .img/.raw/.qcow2 в отдельный qcow2-диск VM, не изменяя оригинал. + Опция показывается только если backend передал список готовых образов. Так форма не уходит в поломанное состояние.
ISO x86: virt-install --arch x86_64 --cdrom ubuntu.iso
@@ -165,18 +176,19 @@ IMG ARM: qemu-img convert -O qcow2 image.img VM.qcow2
     const diskWarning = document.getElementById('disk-image-missing-warning');
     const createButton = document.getElementById('create-vm-button');
     const hasIsos = {{ 'true' if isos else 'false' }};
-    const hasDiskImages = {{ 'true' if disk_images else 'false' }};
+    const diskFeatureAvailable = {{ 'true' if disk_feature_available else 'false' }};
+    const hasDiskImages = {{ 'true' if disk_images_available else 'false' }};
 
     function refreshSourceUI() {
-      const isDisk = sourceType.value === 'disk_image';
+      const isDisk = diskFeatureAvailable && sourceType.value === 'disk_image';
       isoRow.style.display = isDisk ? 'none' : 'grid';
-      diskImageRow.style.display = isDisk ? 'grid' : 'none';
+      if (diskImageRow) diskImageRow.style.display = isDisk ? 'grid' : 'none';
       sourceImageLabel.textContent = isDisk ? 'Готовый образ диска' : 'ISO образ';
-      diskImageLabel.textContent = isDisk ? 'Готовый образ диска' : 'ISO образ';
+      if (diskImageLabel) diskImageLabel.textContent = 'Готовый образ диска';
       diskSizeRow.style.opacity = isDisk ? '.45' : '1';
       diskSizeRow.querySelector('span').textContent = isDisk ? 'Диск, GB — не используется при импорте' : 'Диск, GB';
       sourceModeNotice.textContent = isDisk
-        ? 'Выбран источник “Готовый диск”: Virtuality импортирует .img/.raw/.qcow2 в новый qcow2-диск VM. Поле “Диск, GB” не используется. При необходимости можно заменить хвост от неудачной установки прямо в блоке готового диска.'
+        ? 'Выбран источник “Готовый диск”: Virtuality импортирует .img/.raw/.qcow2 в новый qcow2-диск VM. Поле “Диск, GB” не используется.'
         : 'Выбран источник “ISO-установщик”: Virtuality создаст новый диск указанного размера и запустит установку с ISO.';
       if (isoWarning) isoWarning.style.display = !isDisk && !hasIsos ? 'block' : 'none';
       if (diskWarning) diskWarning.style.display = isDisk && !hasDiskImages ? 'block' : 'none';