This commit is contained in:
2026-02-02 16:16:14 +05:00
parent cd827b0e9a
commit 0b54ca8404
11 changed files with 1185 additions and 1020 deletions

View File

@@ -3,10 +3,8 @@ document.addEventListener('DOMContentLoaded', function() {
checkAuth();
setupEventListeners();
// Устанавливаем дату по умолчанию для создания задачи (через 3 дня)
const defaultDate = new Date();
defaultDate.setDate(defaultDate.getDate() + 3);
document.getElementById('due-date').value = defaultDate.toISOString().substring(0, 16);
// Инициализация выбора времени
initializeTimeSelectors();
// По умолчанию показываем секцию задач
showSection('tasks');
@@ -35,4 +33,233 @@ function setupEventListeners() {
// Инициализация загрузки файлов
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('Ошибка создания копии задачи');
}
}