From 858d1802e6f163b6bb7d3a4a68a2f08ab802dd80 Mon Sep 17 00:00:00 2001 From: kalugin66 Date: Tue, 3 Feb 2026 00:07:57 +0500 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B8=D0=BF=20=D0=B7=D0=B0=D1=8F=D0=B2?= =?UTF-8?q?=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/index.html | 28 +++++ public/style.css | 256 ++++++++++++++++++++++++++++++++++++++++++++++ public/tasks.js | 4 + public/ui.js | 154 ++++++++++++++++++++++++++++ 4 files changed, 442 insertions(+) diff --git a/public/index.html b/public/index.html index 70055a3..6b61ce4 100644 --- a/public/index.html +++ b/public/index.html @@ -46,8 +46,10 @@ + @@ -108,6 +110,32 @@

Создать новую задачу

+
+
+ + + + + + + + + +
+ +
diff --git a/public/style.css b/public/style.css index d225fbf..80374db 100644 --- a/public/style.css +++ b/public/style.css @@ -2451,4 +2451,260 @@ small { padding: 8px 15px; font-size: 0.8rem; } +} +/* Стили для выбора типа задачи */ +.task-type-selector { + margin-bottom: 20px; + width: 100%; +} + +.task-type-buttons { + display: flex; + flex-wrap: wrap; + justify-content: space-between; /* Равномерное распределение */ + align-items: stretch; + gap: 10px; + margin-bottom: 10px; + width: 100%; +} + +.task-type-btn { + flex: 1 1 calc(11.11% - 10px); /* 9 кнопок = примерно 11.11% каждая */ + min-width: 100px; + max-width: 150px; + padding: 12px 8px; + border: 2px solid #e0e0e0; + background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); + border-radius: 12px; + cursor: pointer; + text-align: center; + font-weight: 500; + transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 95px; + font-size: 12px; + box-sizing: border-box; + position: relative; + overflow: hidden; + box-shadow: 0 2px 5px rgba(0,0,0,0.1); + color: #333; /* Темный цвет текста для неактивных кнопок */ +} + +.task-type-btn::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 3px; + background: transparent; + transition: all 0.3s ease; +} + +.task-type-btn:hover { + transform: translateY(-5px); + box-shadow: 0 8px 15px rgba(0,0,0,0.15); +} + +/* Цвета для разных типов задач при наведении и активности */ +.task-type-btn[data-type="regular"]:hover { + border-color: #3498db; + background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%); +} +.task-type-btn[data-type="regular"].active { + border-color: #2980b9; + background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); + color: white; + box-shadow: 0 6px 12px rgba(52, 152, 219, 0.3); +} + +.task-type-btn[data-type="document"]:hover { + border-color: #9b59b6; + background: linear-gradient(135deg, #f3e5f5 0%, #e1bee7 100%); +} +.task-type-btn[data-type="document"].active { + border-color: #8e44ad; + background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); + color: white; + box-shadow: 0 6px 12px rgba(155, 89, 182, 0.3); +} + +.task-type-btn[data-type="it"]:hover { + border-color: #2ecc71; + background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%); +} +.task-type-btn[data-type="it"].active { + border-color: #27ae60; + background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); + color: white; + box-shadow: 0 6px 12px rgba(46, 204, 113, 0.3); +} + +.task-type-btn[data-type="ahch"]:hover { + border-color: #e67e22; + background: linear-gradient(135deg, #fff3e0 0%, #ffe0b2 100%); +} +.task-type-btn[data-type="ahch"].active { + border-color: #d35400; + background: linear-gradient(135deg, #e67e22 0%, #d35400 100%); + color: white; + box-shadow: 0 6px 12px rgba(230, 126, 34, 0.3); +} + +.task-type-btn[data-type="psychologist"]:hover { + border-color: #e74c3c; + background: linear-gradient(135deg, #ffebee 0%, #ffcdd2 100%); +} +.task-type-btn[data-type="psychologist"].active { + border-color: #c0392b; + background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); + color: white; + box-shadow: 0 6px 12px rgba(231, 76, 60, 0.3); +} + +.task-type-btn[data-type="speech_therapist"]:hover { + border-color: #1abc9c; + background: linear-gradient(135deg, #e0f2f1 0%, #b2dfdb 100%); +} +.task-type-btn[data-type="speech_therapist"].active { + border-color: #16a085; + background: linear-gradient(135deg, #1abc9c 0%, #16a085 100%); + color: white; + box-shadow: 0 6px 12px rgba(26, 188, 156, 0.3); +} + +.task-type-btn[data-type="hr"]:hover { + border-color: #f39c12; + background: linear-gradient(135deg, #fff8e1 0%, #ffecb3 100%); +} +.task-type-btn[data-type="hr"].active { + border-color: #e67e22; + background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); + color: white; + box-shadow: 0 6px 12px rgba(243, 156, 18, 0.3); +} + +.task-type-btn[data-type="certificate"]:hover { + border-color: #34495e; + background: linear-gradient(135deg, #eceff1 0%, #cfd8dc 100%); +} +.task-type-btn[data-type="certificate"].active { + border-color: #2c3e50; + background: linear-gradient(135deg, #34495e 0%, #2c3e50 100%); + color: white; + box-shadow: 0 6px 12px rgba(52, 73, 94, 0.3); +} + +.task-type-btn[data-type="e_journal"]:hover { + border-color: #8e44ad; + background: linear-gradient(135deg, #f3e5f5 0%, #e1bee7 100%); +} +.task-type-btn[data-type="e_journal"].active { + border-color: #7d3c98; + background: linear-gradient(135deg, #8e44ad 0%, #7d3c98 100%); + color: white; + box-shadow: 0 6px 12px rgba(142, 68, 173, 0.3); +} + +.task-type-btn.active::before { + background: rgba(255, 255, 255, 0.5); +} + +.task-type-btn i { + font-size: 20px; + margin-bottom: 8px; + color: #666; + transition: all 0.3s ease; +} + +.task-type-btn:hover i { + color: #333; + transform: scale(1.05); +} + +.task-type-btn.active i { + color: white; + transform: scale(1.1); +} + +/* Цвета иконок для неактивных кнопок */ +.task-type-btn[data-type="regular"] i { + color: #3498db; +} +.task-type-btn[data-type="document"] i { + color: #9b59b6; +} +.task-type-btn[data-type="it"] i { + color: #2ecc71; +} +.task-type-btn[data-type="ahch"] i { + color: #e67e22; +} +.task-type-btn[data-type="psychologist"] i { + color: #e74c3c; +} +.task-type-btn[data-type="speech_therapist"] i { + color: #1abc9c; +} +.task-type-btn[data-type="hr"] i { + color: #f39c12; +} +.task-type-btn[data-type="certificate"] i { + color: #34495e; +} +.task-type-btn[data-type="e_journal"] i { + color: #8e44ad; +} + +/* Адаптивность */ +@media (max-width: 1400px) { + .task-type-btn { + flex: 1 1 calc(16.66% - 10px); /* 6 в ряд */ + min-width: 120px; + } +} + +@media (max-width: 1200px) { + .task-type-btn { + flex: 1 1 calc(20% - 10px); /* 5 в ряд */ + min-width: 110px; + font-size: 11px; + } +} + +@media (max-width: 992px) { + .task-type-btn { + flex: 1 1 calc(25% - 10px); /* 4 в ряд */ + min-width: 100px; + } +} + +@media (max-width: 768px) { + .task-type-btn { + flex: 1 1 calc(33.333% - 10px); /* 3 в ряд */ + min-width: 90px; + min-height: 85px; + } + .task-type-btn i { + font-size: 18px; + } +} + +@media (max-width: 576px) { + .task-type-btn { + flex: 1 1 calc(50% - 10px); /* 2 в ряд */ + min-width: 120px; + font-size: 13px; + } +} + +@media (max-width: 400px) { + .task-type-btn { + flex: 1 1 100%; /* 1 в ряд */ + min-width: 100%; + max-width: 100%; + } } \ No newline at end of file diff --git a/public/tasks.js b/public/tasks.js index 7580dcd..588b833 100644 --- a/public/tasks.js +++ b/public/tasks.js @@ -102,6 +102,10 @@ async function createTask(event) { formData.append('title', document.getElementById('title').value); formData.append('description', document.getElementById('description').value); + // Добавляем тип задачи + const taskType = document.getElementById('task-type').value; + formData.append('taskType', taskType); + const dueDate = document.getElementById('due-date').value; if (!dueDate) { alert('Дата и время выполнения обязательны'); diff --git a/public/ui.js b/public/ui.js index c79ec6e..5a9e754 100644 --- a/public/ui.js +++ b/public/ui.js @@ -641,4 +641,158 @@ async function loadTaskFiles(taskId) { } catch (error) { console.error('Ошибка загрузки файлов:', error); } +} +// Функция для выбора типа задачи +function selectTaskType(type) { + // Убираем активный класс со всех кнопок + document.querySelectorAll('.task-type-btn').forEach(btn => { + btn.classList.remove('active'); + }); + + // Добавляем активный класс выбранной кнопке + document.querySelector(`.task-type-btn[data-type="${type}"]`).classList.add('active'); + + // Устанавливаем значение в скрытое поле + document.getElementById('task-type').value = type; + + // Можем добавить дополнительную логику в зависимости от типа + updateTaskFormBasedOnType(type); + // Предлагаем заголовок по умолчанию + suggestDefaultTitle(type); +} + +// Функция для предложения заголовка по умолчанию +function suggestDefaultTitle(type) { + const titleField = document.getElementById('title'); + if (!titleField) return; + + // Если поле уже заполнено, не меняем + if (titleField.value.trim() !== '') return; + + const defaultTitles = { + 'regular': '', + 'document': 'Согласование документа: ', + 'it': 'Заявка в ИТ отдел: ', + 'ahch': 'Заявка в АХЧ: ', + 'psychologist': 'Заявка к психологу: ', + 'speech_therapist': 'Заявка к логопеду: ', + 'hr': 'Заявка в кадры: ', + 'certificate': 'Заявка на получение справки: ', + 'e_journal': 'Заявка на доступ в электронный журнал: ' + }; + + const defaultTitle = defaultTitles[type] || ''; + titleField.placeholder = `${defaultTitle}укажите детали...`; +} + +// Функция для обновления формы в зависимости от типа задачи +function updateTaskFormBasedOnType(type) { + const userSearchField = document.getElementById('user-search'); + + // Устанавливаем заголовки placeholder для поиска исполнителей + const defaultPlaceholders = { + 'regular': 'Поиск исполнителей...', + 'document': 'Поиск секретарей/администрации...', + 'it': 'Поиск ИТ специалистов...', + 'ahch': 'Поиск АХЧ сотрудников...', + 'psychologist': 'Поиск психологов...', + 'speech_therapist': 'Поиск логопедов...', + 'hr': 'Поиск сотрудников кадровой службы...', + 'certificate': 'Поиск секретаря/завуча...', + 'e_journal': 'Поиск администратора электронного журнала...' + }; + + // Обновляем placeholder поля поиска исполнителей + if (userSearchField) { + userSearchField.placeholder = defaultPlaceholders[type] || 'Поиск исполнителей...'; + } + + // Показываем/скрываем дополнительные поля в зависимости от типа + showAdditionalFieldsForType(type); +} +// Функция для показа дополнительных полей +function showAdditionalFieldsForType(type) { + // Пока скрываем все дополнительные поля (если они есть) + hideAllAdditionalFields(); + + // Показываем поля в зависимости от типа + switch(type) { + case 'certificate': + showCertificateFields(); + break; + case 'e_journal': + showEJournalFields(); + break; + case 'psychologist': + case 'speech_therapist': + showSpecialistFields(type); + break; + // Можно добавить другие типы + } +} +// Функции для управления дополнительными полями +function hideAllAdditionalFields() { + // Если есть дополнительные поля, скрываем их + // Пока оставляем пустым, можно добавить позже +} + +function showCertificateFields() { + // Можно добавить поля для справок + // Например: тип справки, для кого, срок действия +} + +function showEJournalFields() { + // Можно добавить поля для доступа к электронному журналу + // Например: логин, класс, предметы +} + +function showSpecialistFields(type) { + // Можно добавить поля для специалистов + // Например: ученик, класс, причина обращения +} +// Вспомогательная функция для получения названия типа задачи +function getTaskTypeName(type) { + const typeNames = { + 'regular': 'задачу', + 'document': 'название документа', + 'it': 'описание проблемы', + 'ahch': 'описание заявки', + 'psychologist': 'повод для обращения к психологу', + 'speech_therapist': 'повод для обращения к логопеду', + 'hr': 'вопрос к кадровой службе', + 'certificate': 'тип необходимой справки', + 'e_journal': 'информацию для доступа к журналу' + }; + return typeNames[type] || 'задачу'; +} +// Функция для получения отображаемого имени типа задачи +function getTaskTypeDisplayName(type) { + const typeNames = { + 'regular': 'Задача', + 'document': 'Документ', + 'it': 'ИТ', + 'ahch': 'АХЧ', + 'psychologist': 'Психолог', + 'speech_therapist': 'Логопед', + 'hr': 'Кадры', + 'certificate': 'Справка', + 'e_journal': 'Эл. журнал' + }; + return typeNames[type] || type; +} + +// Функция для получения иконки типа задачи +function getTaskTypeIcon(type) { + const icons = { + 'regular': 'fas fa-tasks', + 'document': 'fas fa-file-signature', + 'it': 'fas fa-desktop', + 'ahch': 'fas fa-tools', + 'psychologist': 'fas fa-brain', + 'speech_therapist': 'fas fa-comment-medical', + 'hr': 'fas fa-users', + 'certificate': 'fas fa-file-certificate', + 'e_journal': 'fas fa-book' + }; + return icons[type] || 'fas fa-tasks'; } \ No newline at end of file