// main.js - Главный файл инициализации document.addEventListener('DOMContentLoaded', function() { checkAuth(); setupEventListeners(); // Инициализация выбора времени initializeTimeSelectors(); // По умолчанию показываем секцию задач showSection('tasks'); }); function setupEventListeners() { // Форма входа document.getElementById('login-form').addEventListener('submit', login); // Формы задач document.getElementById('create-task-form').addEventListener('submit', createTask); document.getElementById('edit-task-form').addEventListener('submit', updateTask); document.getElementById('copy-task-form').addEventListener('submit', copyTask); document.getElementById('edit-assignment-form').addEventListener('submit', updateAssignment); document.getElementById('rework-task-form').addEventListener('submit', sendForRework); // Файлы document.getElementById('files').addEventListener('change', updateFileList); document.getElementById('edit-files').addEventListener('change', updateEditFileList); // Настройки уведомлений const notificationForm = document.getElementById('notification-settings-form'); if (notificationForm) { notificationForm.addEventListener('submit', saveNotificationSettings); } // Инициализация загрузки файлов initializeFileUploads(); } // Обновленная функция для создания задачи async function createTask(event) { event.preventDefault(); if (!currentUser) { alert('Требуется аутентификация'); return; } const title = document.getElementById('title').value; const description = document.getElementById('description').value; // Получаем полную дату и время из отдельных полей const fullDateTime = getFullDateTime('due-date', 'due-time'); if (!title || !fullDateTime) { alert('Название задачи и дата выполнения обязательны'); return; } if (selectedUsers.length === 0) { alert('Выберите хотя бы одного исполнителя'); return; } const formData = new FormData(); formData.append('title', title); formData.append('description', description); formData.append('dueDate', fullDateTime); selectedUsers.forEach(userId => { formData.append('assignedUsers', userId); }); const files = document.getElementById('files').files; for (let i = 0; i < files.length; i++) { formData.append('files', files[i]); } try { const response = await fetch('/api/tasks', { method: 'POST', body: formData }); if (response.ok) { alert('Задача успешно создана!'); // Сброс формы document.getElementById('create-task-form').reset(); document.getElementById('file-list').innerHTML = ''; document.getElementById('user-search').value = ''; selectedUsers = []; // Сбрасываем дату и время const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); document.getElementById('due-date').value = tomorrow.toISOString().split('T')[0]; document.getElementById('due-time').value = '12:00'; // Сбрасываем активные кнопки const timeButtons = document.querySelectorAll('.time-btn'); timeButtons.forEach(btn => btn.classList.remove('active')); if (timeButtons.length > 0) { timeButtons[0].classList.add('active'); } // Обновляем отображение кнопок updateDateTimeDisplay(); // Обновляем список пользователей renderUsersChecklist(); // Загружаем задачи и логи loadTasks(); loadActivityLogs(); // Показываем секцию задач showSection('tasks'); } else { const error = await response.json(); alert(error.error || 'Ошибка создания задачи'); } } catch (error) { console.error('Ошибка:', error); alert('Ошибка создания задачи'); } } // Обновленная функция открытия модального окна редактирования async function openEditModal(taskId) { try { const response = await fetch(`/api/tasks/${taskId}`); if (!response.ok) { if (response.status === 404) { alert('Задача не найдена или у вас нет прав доступа'); } throw new Error('Ошибка загрузки задачи'); } const task = await response.json(); if (!canUserEditTask(task)) { alert('У вас нет прав для редактирования этой задачи'); return; } document.getElementById('edit-task-id').value = task.id; document.getElementById('edit-title').value = task.title; document.getElementById('edit-description').value = task.description || ''; // Устанавливаем дату и время с помощью новой функции setDateTimeForEdit(task.due_date); // Устанавливаем выбранных пользователей editSelectedUsers = task.assignments ? task.assignments.map(a => a.user_id) : []; renderEditUsersChecklist(users); // Показываем существующие файлы currentEditTaskFiles = task.files || []; updateEditFileList(); document.getElementById('edit-task-modal').style.display = 'block'; } catch (error) { console.error('Ошибка:', error); alert('Ошибка загрузки задачи'); } } // Обновленная функция обновления задачи async function updateTask(event) { event.preventDefault(); const taskId = document.getElementById('edit-task-id').value; const title = document.getElementById('edit-title').value; const description = document.getElementById('edit-description').value; // Получаем полную дату и время из отдельных полей const fullDateTime = getFullDateTime('edit-due-date', 'edit-due-time'); if (!fullDateTime) { alert('Дата и время выполнения обязательны'); return; } // Используем editSelectedUsers const assignedUserIds = editSelectedUsers; const formData = new FormData(); formData.append('title', title); formData.append('description', description); formData.append('assignedUsers', JSON.stringify(assignedUserIds)); formData.append('dueDate', fullDateTime); const files = document.getElementById('edit-files').files; for (let i = 0; i < files.length; i++) { formData.append('files', files[i]); } try { const response = await fetch(`/api/tasks/${taskId}`, { method: 'PUT', body: formData }); if (response.ok) { alert('Задача успешно обновлена!'); closeEditModal(); loadTasks(); loadActivityLogs(); } else { const error = await response.json(); alert(error.error || 'Ошибка обновления задачи'); } } catch (error) { console.error('Ошибка:', error); alert('Ошибка обновления задачи'); } } // Обновленная функция создания копии задачи async function copyTask(event) { event.preventDefault(); const taskId = document.getElementById('copy-task-id').value; // Получаем полную дату и время из отдельных полей const fullDateTime = getFullDateTime('copy-due-date', 'copy-due-time'); if (!fullDateTime) { alert('Дата и время выполнения обязательны для копии задачи'); return; } // Используем copySelectedUsers const assignedUserIds = copySelectedUsers; if (assignedUserIds.length === 0) { alert('Выберите хотя бы одного исполнителя для копии задачи'); return; } try { const response = await fetch(`/api/tasks/${taskId}/copy`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ assignedUsers: assignedUserIds, dueDate: fullDateTime }) }); if (response.ok) { alert('Копия задачи успешно создана!'); closeCopyModal(); loadTasks(); loadActivityLogs(); } else { const error = await response.json(); alert(error.error || 'Ошибка создания копии задачи'); } } catch (error) { console.error('Ошибка:', error); alert('Ошибка создания копии задачи'); } }