tmp_27.06.2026
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версия | |||
| tmp_27.06.2026 [2026/06/27 15:29] – VladPolskiy | tmp_27.06.2026 [2026/06/27 15:35] (текущий) – VladPolskiy | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | // assets/ | ||
| + | |||
| document.addEventListener(' | document.addEventListener(' | ||
| // --- НАДЕЖНОЕ УПРАВЛЕНИЕ МОДАЛКОЙ С ДЕБАГ-МАЯКОМ --- | // --- НАДЕЖНОЕ УПРАВЛЕНИЕ МОДАЛКОЙ С ДЕБАГ-МАЯКОМ --- | ||
| Строка 107: | Строка 109: | ||
| } | } | ||
| } catch (error) { | } catch (error) { | ||
| + | // Возвращаем кнопку в исходное рабочее состояние | ||
| btnModalSubmit.disabled = false; | btnModalSubmit.disabled = false; | ||
| btnModalSubmit.textContent = " | btnModalSubmit.textContent = " | ||
| - | | + | |
| + | // КРАСИВО ВЫВОДИМ ОШИБКУ СЕТИ В ТВОЮ ПЛАШКУ БЕЗ ВСЯКИХ АЛЕРТОВ | ||
| + | if (modalErrorBox) { | ||
| + | modalErrorBox.textContent = "Критическая ошибка отправки файлов на сервер."; | ||
| + | modalErrorBox.classList.remove(' | ||
| + | } | ||
| } | } | ||
| }); | }); | ||
| } | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | // Локальное хранилище для текстов текущего выбранного релиза, | ||
| + | // чтобы переключать вкладки мгновенно без повторных запросов к серверу | ||
| + | let currentReleaseTexts = { | ||
| + | readme: '', | ||
| + | license: '', | ||
| + | comment: '', | ||
| + | log: ' | ||
| + | }; | ||
| + | |||
| + | /** | ||
| + | * Отрисовка таблицы файлов в верхнем окне | ||
| + | * @param {Array} files Массив файлов из JSON | ||
| + | */ | ||
| + | function renderFilesTable(files) { | ||
| + | if (!files || files.length === 0) { | ||
| + | filesList.innerHTML = `< | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | let html = ''; | ||
| + | files.forEach(file => { | ||
| + | const icon = file.is_dir ? ' | ||
| + | html += ` | ||
| + | <tr> | ||
| + | < | ||
| + | <td class=" | ||
| + | <td class=" | ||
| + | <td style=" | ||
| + | </tr> | ||
| + | `; | ||
| + | }); | ||
| + | filesList.innerHTML = html; | ||
| + | } | ||
| + | |||
| + | // Вспомогательная функция защиты от XSS при отрисовке имен файлов | ||
| + | function escapeHtml(string) { | ||
| + | return String(string).replace(/&/ | ||
| + | } | ||
| + | |||
| + | // 1. СЛУШАЕМ ВЫБОР РЕЛИЗА В ВЫПАДАЮЩЕМ СПИСКЕ | ||
| + | releasesDropdown.addEventListener(' | ||
| + | const selectedRelease = this.value; | ||
| + | |||
| + | if (!selectedRelease) { | ||
| + | // Если сбросили выбор — возвращаем интерфейс в исходное состояние | ||
| + | btnDownloadZip.disabled = true; | ||
| + | filesList.innerHTML = `< | ||
| + | textEditor.value = ' | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | filesList.innerHTML = `< | ||
| + | |||
| + | // Дергаем наш апи-модуль | ||
| + | const result = await Api.getReleaseData(selectedRelease); | ||
| + | |||
| + | if (result.success) { | ||
| + | // Активируем кнопку ZIP | ||
| + | btnDownloadZip.disabled = false; | ||
| + | | ||
| + | // Сохраняем тексты в память для вкладок | ||
| + | currentReleaseTexts.readme = result.texts.readme || ' | ||
| + | currentReleaseTexts.license = result.texts.license || ' | ||
| + | currentReleaseTexts.comment = result.texts.comment || ' | ||
| + | | ||
| + | // Отрисовываем файлы в таблице верхнего окна | ||
| + | renderFilesTable(result.files); | ||
| + | |||
| + | // Автоматически показываем текст той вкладки, | ||
| + | const activeTab = document.querySelector(' | ||
| + | textEditor.value = currentReleaseTexts[activeTab]; | ||
| + | } else { | ||
| + | alert(" | ||
| + | filesList.innerHTML = `< | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | // 2. СЛУШАЕМ ПЕРЕКЛЮЧЕНИЕ ВКЛАДОК НИЖНЕГО ОКНА | ||
| + | tabButtons.forEach(button => { | ||
| + | button.addEventListener(' | ||
| + | tabButtons.forEach(btn => btn.classList.remove(' | ||
| + | this.classList.add(' | ||
| + | | ||
| + | const targetTab = this.getAttribute(' | ||
| + | | ||
| + | // Вытаскиваем текст из памяти без лишних запросов к PHP | ||
| + | textEditor.value = currentReleaseTexts[targetTab] || `Текст для вкладки ${targetTab.toUpperCase()} отсутствует.`; | ||
| + | }); | ||
| + | }); | ||
| + | }); | ||
| + | |||
| + | |||
tmp_27.06.2026.txt · Последнее изменение: — VladPolskiy
