0.8
This commit is contained in:
@@ -25,7 +25,7 @@
|
|||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
<div class="test-users">
|
<div class="test-users">
|
||||||
<h3><i class="fas fa-users"></i> Управление задачами 0.7</h3>
|
<h3><i class="fas fa-users"></i> Управление задачами 0.8</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong><i class="fas fa-school"></i> @2025</strong> МАОУ - СОШ № 25</li>
|
<li><strong><i class="fas fa-school"></i> @2025</strong> МАОУ - СОШ № 25</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -61,10 +61,16 @@
|
|||||||
<h2><i class="fas fa-tasks"></i> Все задачи</h2>
|
<h2><i class="fas fa-tasks"></i> Все задачи</h2>
|
||||||
<div id="tasks-controls">
|
<div id="tasks-controls">
|
||||||
<div class="filters">
|
<div class="filters">
|
||||||
<div class="filter-group">
|
<!--
|
||||||
<label for="search-tasks"><i class="fas fa-search"></i> Поиск:</label>
|
<div class="filter-group">
|
||||||
<input type="text" id="search-tasks" placeholder="Поиск по названию и описанию..." oninput="loadTasks()">
|
<label for="task-view-filter"><i class="fas fa-eye"></i> Вид задач:</label>
|
||||||
</div>
|
<select id="task-view-filter" onchange="changeTaskView()">
|
||||||
|
<option value="all">Все задачи</option>
|
||||||
|
<option value="my_assigned">Задачи, которые я назначил</option>
|
||||||
|
<option value="assigned_to_me">Задачи, назначенные мне</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
<div class="filter-group">
|
<div class="filter-group">
|
||||||
<label for="status-filter"><i class="fas fa-filter"></i> Статус:</label>
|
<label for="status-filter"><i class="fas fa-filter"></i> Статус:</label>
|
||||||
<select id="status-filter" onchange="loadTasks()">
|
<select id="status-filter" onchange="loadTasks()">
|
||||||
@@ -98,6 +104,10 @@
|
|||||||
<option value="24h">Менее 24 часов</option>
|
<option value="24h">Менее 24 часов</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="filter-group" style="flex-grow: 1; min-width: 180px;">
|
||||||
|
<label for="search-tasks"><i class="fas fa-search"></i> Поиск:</label>
|
||||||
|
<input type="text" id="search-tasks" placeholder="Поиск по названию и описанию..." oninput="loadTasks()">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<label class="show-deleted-label" style="display: none;">
|
<label class="show-deleted-label" style="display: none;">
|
||||||
<input type="checkbox" id="show-deleted" onchange="loadTasks()">
|
<input type="checkbox" id="show-deleted" onchange="loadTasks()">
|
||||||
|
|||||||
129
public/main.js
129
public/main.js
@@ -1,4 +1,7 @@
|
|||||||
// main.js - Главный файл инициализации
|
// main.js - Главный файл инициализации
|
||||||
|
let currentTaskView = 'all'; // 'all', 'my_assigned', 'assigned_to_me'
|
||||||
|
let allTasksCache = []; // Кэш всех задач
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
checkAuth();
|
checkAuth();
|
||||||
setupEventListeners();
|
setupEventListeners();
|
||||||
@@ -6,6 +9,12 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
// Инициализация выбора времени
|
// Инициализация выбора времени
|
||||||
initializeTimeSelectors();
|
initializeTimeSelectors();
|
||||||
|
|
||||||
|
// Инициализация фильтра
|
||||||
|
const taskViewFilter = document.getElementById('task-view-filter');
|
||||||
|
if (taskViewFilter) {
|
||||||
|
taskViewFilter.value = currentTaskView;
|
||||||
|
}
|
||||||
|
|
||||||
// По умолчанию показываем секцию задач
|
// По умолчанию показываем секцию задач
|
||||||
showSection('tasks');
|
showSection('tasks');
|
||||||
});
|
});
|
||||||
@@ -21,7 +30,7 @@ function setupEventListeners() {
|
|||||||
document.getElementById('edit-assignment-form').addEventListener('submit', updateAssignment);
|
document.getElementById('edit-assignment-form').addEventListener('submit', updateAssignment);
|
||||||
document.getElementById('rework-task-form').addEventListener('submit', sendForRework);
|
document.getElementById('rework-task-form').addEventListener('submit', sendForRework);
|
||||||
|
|
||||||
// Файлыcreate-task
|
// Файлы
|
||||||
document.getElementById('files').addEventListener('change', updateFileList);
|
document.getElementById('files').addEventListener('change', updateFileList);
|
||||||
document.getElementById('edit-files').addEventListener('change', updateEditFileList);
|
document.getElementById('edit-files').addEventListener('change', updateEditFileList);
|
||||||
|
|
||||||
@@ -35,6 +44,64 @@ function setupEventListeners() {
|
|||||||
initializeFileUploads();
|
initializeFileUploads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Функция для изменения вида задач
|
||||||
|
function changeTaskView() {
|
||||||
|
const select = document.getElementById('task-view-filter');
|
||||||
|
currentTaskView = select.value;
|
||||||
|
loadTasks();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Переопределяем функцию loadTasks для фильтрации
|
||||||
|
(function() {
|
||||||
|
// Сохраняем оригинальную функцию loadTasks
|
||||||
|
const originalLoadTasks = window.loadTasks;
|
||||||
|
|
||||||
|
// Создаем новую функцию
|
||||||
|
window.loadTasks = async function() {
|
||||||
|
// Вызываем оригинальную функцию
|
||||||
|
if (typeof originalLoadTasks === 'function') {
|
||||||
|
await originalLoadTasks();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Кэшируем все задачи
|
||||||
|
if (window.tasks && Array.isArray(window.tasks)) {
|
||||||
|
allTasksCache = [...window.tasks];
|
||||||
|
|
||||||
|
// Фильтруем задачи в зависимости от выбранного вида
|
||||||
|
if (currentTaskView !== 'all' && currentUser) {
|
||||||
|
let filteredTasks = [];
|
||||||
|
|
||||||
|
if (currentTaskView === 'my_assigned') {
|
||||||
|
// Показываем задачи, которые я назначил (я - создатель)
|
||||||
|
filteredTasks = window.tasks.filter(task => {
|
||||||
|
return parseInt(task.created_by) === currentUser.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
} else if (currentTaskView === 'assigned_to_me') {
|
||||||
|
// Показываем задачи, назначенные мне (я - исполнитель)
|
||||||
|
filteredTasks = window.tasks.filter(task => {
|
||||||
|
// Проверяем, назначена ли задача текущему пользователю
|
||||||
|
if (task.assignments && Array.isArray(task.assignments)) {
|
||||||
|
return task.assignments.some(assignment =>
|
||||||
|
parseInt(assignment.user_id) === currentUser.id
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновляем глобальный массив задач
|
||||||
|
window.tasks = filteredTasks;
|
||||||
|
|
||||||
|
// Перерисовываем задачи
|
||||||
|
if (window.renderTasks && typeof window.renderTasks === 'function') {
|
||||||
|
window.renderTasks();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
// Обновленная функция для создания задачи
|
// Обновленная функция для создания задачи
|
||||||
async function createTask(event) {
|
async function createTask(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -46,7 +113,7 @@ async function createTask(event) {
|
|||||||
|
|
||||||
const title = document.getElementById('title').value;
|
const title = document.getElementById('title').value;
|
||||||
const description = document.getElementById('description').value;
|
const description = document.getElementById('description').value;
|
||||||
const taskType = document.getElementById('task-type').value; // Добавлено из tasks.js
|
const taskType = document.getElementById('task-type').value;
|
||||||
|
|
||||||
// Получаем полную дату и время из отдельных полей
|
// Получаем полную дату и время из отдельных полей
|
||||||
const fullDateTime = getFullDateTime('due-date', 'due-time');
|
const fullDateTime = getFullDateTime('due-date', 'due-time');
|
||||||
@@ -64,7 +131,7 @@ async function createTask(event) {
|
|||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('title', title);
|
formData.append('title', title);
|
||||||
formData.append('description', description);
|
formData.append('description', description);
|
||||||
formData.append('taskType', taskType); // Добавлено
|
formData.append('taskType', taskType);
|
||||||
formData.append('dueDate', fullDateTime);
|
formData.append('dueDate', fullDateTime);
|
||||||
|
|
||||||
selectedUsers.forEach(userId => {
|
selectedUsers.forEach(userId => {
|
||||||
@@ -85,7 +152,7 @@ async function createTask(event) {
|
|||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
alert('Задача успешно создана!');
|
alert('Задача успешно создана!');
|
||||||
|
|
||||||
// Сброс формы (из main.js)
|
// Сброс формы
|
||||||
document.getElementById('create-task-form').reset();
|
document.getElementById('create-task-form').reset();
|
||||||
document.getElementById('file-list').innerHTML = '';
|
document.getElementById('file-list').innerHTML = '';
|
||||||
document.getElementById('user-search').value = '';
|
document.getElementById('user-search').value = '';
|
||||||
@@ -265,3 +332,57 @@ async function copyTask(event) {
|
|||||||
alert('Ошибка создания копии задачи');
|
alert('Ошибка создания копии задачи');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Функция для отображения секции
|
||||||
|
function showSection(sectionName) {
|
||||||
|
document.querySelectorAll('.section').forEach(section => {
|
||||||
|
section.classList.remove('active');
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById(sectionName + '-section').classList.add('active');
|
||||||
|
|
||||||
|
if (sectionName === 'tasks') {
|
||||||
|
loadTasks();
|
||||||
|
} else if (sectionName === 'logs') {
|
||||||
|
loadActivityLogs();
|
||||||
|
} else if (sectionName === 'kanban') {
|
||||||
|
loadKanbanTasks();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Загрузка профиля при переходе в личный кабинет
|
||||||
|
if (sectionName === 'profile') {
|
||||||
|
loadUserProfile();
|
||||||
|
loadNotificationSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция для отображения Канбан доски
|
||||||
|
function showKanbanSection() {
|
||||||
|
showSection('kanban');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функции для работы с модальными окнами (добавьте если их нет)
|
||||||
|
function closeEditModal() {
|
||||||
|
document.getElementById('edit-task-modal').style.display = 'none';
|
||||||
|
document.getElementById('edit-file-list').innerHTML = '';
|
||||||
|
document.getElementById('edit-user-search').value = '';
|
||||||
|
editSelectedUsers = [];
|
||||||
|
currentEditTaskFiles = [];
|
||||||
|
filterEditUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeCopyModal() {
|
||||||
|
document.getElementById('copy-task-modal').style.display = 'none';
|
||||||
|
document.getElementById('copy-user-search').value = '';
|
||||||
|
copySelectedUsers = [];
|
||||||
|
filterCopyUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeEditAssignmentModal() {
|
||||||
|
document.getElementById('edit-assignment-modal').style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeReworkModal() {
|
||||||
|
document.getElementById('rework-task-modal').style.display = 'none';
|
||||||
|
document.getElementById('rework-comment').value = '';
|
||||||
|
}
|
||||||
@@ -131,7 +131,12 @@ ${task.assignments && task.assignments.length > 0 ?
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="task-meta">
|
<div class="task-meta">
|
||||||
<small>Создана: ${formatDateTime(task.start_date || task.created_at)} | Выполнить до: ${formatDateTime(task.due_date || task.created_at)} | Автор: ${task.creator_name} </small>
|
<small>
|
||||||
|
Создана: ${formatDateTime(task.start_date || task.created_at)}
|
||||||
|
| Выполнить до: ${formatDateTime(task.due_date || task.created_at)}
|
||||||
|
| Автор: ${task.creator_name}
|
||||||
|
| Тип: ${task.task_type ? `<span class="task-type-badge ${task.task_type}">${getTaskTypeDisplayName(task.task_type)}</span>` : ''}
|
||||||
|
</small>
|
||||||
${task.deleted_at ? `<br><small>Удалена: ${formatDateTime(task.deleted_at)}</small>` : ''}
|
${task.deleted_at ? `<br><small>Удалена: ${formatDateTime(task.deleted_at)}</small>` : ''}
|
||||||
${task.closed_at ? `<br><small>Закрыта: ${formatDateTime(task.closed_at)}</small>` : ''}
|
${task.closed_at ? `<br><small>Закрыта: ${formatDateTime(task.closed_at)}</small>` : ''}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user