Инструменты пользователя

Инструменты сайта


tmp_27.06.2026

Это старая версия документа!


document.addEventListener('DOMContentLoaded', function() {

   // --- НАДЕЖНОЕ УПРАВЛЕНИЕ МОДАЛКОЙ С ДЕБАГ-МАЯКОМ ---
  // --- УПРАВЛЕНИЕ ЗАГРУЗЧИКОМ ПРОЕКТОВ ---
  const btnCreateProject   = document.getElementById('btn-create-project');
  const projectModal       = document.getElementById('project-modal');
  const btnModalCancel     = document.getElementById('btn-modal-cancel');
  const btnModalSubmit     = document.getElementById('btn-modal-submit');
  const newProjectName     = document.getElementById('new-project-name');
  const modalErrorBox      = document.getElementById('modal-error-box');
  
  const folderInput        = document.getElementById('project-folder-input');
  const btnSelectFolder    = document.getElementById('btn-select-folder');
  const folderStatus       = document.getElementById('selected-folder-status');
  if (btnCreateProject && projectModal) {
      
      // Функция проверки условий для активации кнопки "Загрузить"
      function checkInputsValidity() {
          const nameVal = newProjectName.value.trim();
          const hasFiles = folderInput.files && folderInput.files.length > 0;
          
          if (nameVal !== "" && hasFiles) {
              btnModalSubmit.disabled = false; // Включаем кнопку
              btnModalSubmit.style.opacity = "1";
          } else {
              btnModalSubmit.disabled = true;  // Выключаем кнопку
              btnModalSubmit.style.opacity = "0.6";
          }
      }
      // Следим за вводом имени
      newProjectName.addEventListener('input', checkInputsValidity);
      // Клик по кастомной кнопке -> триггерим скрытый системный инпут выбора папки
      btnSelectFolder.addEventListener('click', function() {
          folderInput.click();
      });
      // Следим за тем, что пользователь выбрал папку на ПК
      folderInput.addEventListener('change', function() {
          if (this.files && this.files.length > 0) {
              // Берем имя корневой папки, которую выбрал юзер
              const firstFile = this.files[0];
              const rootFolderName = firstFile.webkitRelativePath.split('/')[0];
              folderStatus.innerHTML = `Выбрано файлов: <strong>${this.files.length}</strong><br><span style="font-size:11px; color:#2da44e;">(из папки: ${rootFolderName})</span>`;
          } else {
              folderStatus.textContent = "Папка не выбрана";
          }
          checkInputsValidity();
      });
      // Открытие модалки
      btnCreateProject.addEventListener('click', function() {
          newProjectName.value = '';
          folderInput.value = ''; // Сбрасываем выбранные файлы
          folderStatus.textContent = "Папка не выбрана";
          if (modalErrorBox) modalErrorBox.classList.add('hidden');
          btnModalSubmit.disabled = true;
          btnModalSubmit.style.opacity = "0.6";
          projectModal.classList.remove('hidden');
          newProjectName.focus();
      });
      // Отмена
      btnModalCancel.addEventListener('click', function() {
          projectModal.classList.add('hidden');
      });
      // Нажатие на кнопку "Загрузить" -> отправка терабайтов кода по AJAX
      btnModalSubmit.addEventListener('click', async function() {
          const projectName = newProjectName.value.trim();
          if (modalErrorBox) modalErrorBox.classList.add('hidden');
          const formData = new FormData();
          formData.append('name', projectName);
          // КРИТИЧЕСКИ ВАЖНО: Пакуем файлы вместе с их путями вложения
          for (let i = 0; i < folderInput.files.length; i++) {
              let file = folderInput.files[i];
              formData.append('project_files[]', file);
              // Передаем бэкенду относительный путь (например: "my_proj/src/main.php")
              formData.append('project_paths[]', file.webkitRelativePath);
          }
          // Меняем статус кнопки на время тяжелой загрузки
          btnModalSubmit.disabled = true;
          btnModalSubmit.textContent = "Загрузка...";
          try {
              const response = await fetch('backend/router.php?action=create_project', {
                  method: 'POST',
                  body: formData
              });
              const result = await response.json();
              
              if (result.success) {
                  projectModal.classList.add('hidden');
                  btnModalSubmit.textContent = "Загрузить";
                  location.reload();
              } else {
                  btnModalSubmit.disabled = false;
                  btnModalSubmit.textContent = "Загрузить";
                  if (modalErrorBox) {
                      modalErrorBox.textContent = result.error;
                      modalErrorBox.classList.remove('hidden');
                  }
              }
          } catch (error) {
              btnModalSubmit.disabled = false;
              btnModalSubmit.textContent = "Загрузить";
              alert("Ошибка отправки файлов на сервер: " + error.message);
          }
      });
  }
Только авторизованные участники могут оставлять комментарии.
tmp_27.06.2026.1782563369.txt.gz · Последнее изменение: VladPolskiy

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki