тип заявок

This commit is contained in:
2026-02-03 00:07:57 +05:00
parent 1b4b65cc37
commit 858d1802e6
4 changed files with 442 additions and 0 deletions

View File

@@ -46,8 +46,10 @@
<button onclick="showSection('tasks')" class="nav-btn tasks"><i class="fas fa-list"></i> Задачи</button>
<button onclick="showSection('create-task')" class="nav-btn create"><i class="fas fa-plus-circle"></i> Создать задачу</button>
<button onclick="showKanbanSection()" class="nav-btn kanban"><i class="fas fa-columns"></i> Канбан</button>
<!--
<button onclick="window.location.href = '/doc?action=create'" class="nav-btn create"><i class="fa-solid fa-file"></i> Согласование документов</button>
<button onclick="window.location.href = '/help'" class="nav-btn doc"><i class="fas fa-user-circle"></i> Заявки</button>
-->
<button onclick="showSection('profile')" class="nav-btn profile" id="profile-btn"><i class="fas fa-user-circle"></i> Личный кабинет</button>
<button onclick="window.location.href = '/admin'" class="nav-btn admin"><i class="fas fa-cog"></i> Админ-панель</button>
<button onclick="logout()" class="btn-logout"><i class="fas fa-sign-out-alt"></i> Выйти</button>
@@ -108,6 +110,32 @@
<section id="create-task-section" class="section">
<h2><i class="fas fa-plus-circle"></i> Создать новую задачу</h2>
<form id="create-task-form" enctype="multipart/form-data">
<div class="task-type-selector">
<div class="task-type-buttons">
<button type="button" class="task-type-btn active" data-type="regular" onclick="selectTaskType('regular')"><i class="fas fa-tasks"></i> Обычная задача</button>
<button type="button" class="task-type-btn" data-type="document" onclick="selectTaskType('document')"><i class="fas fa-file-signature"></i> Согласование документа</button>
<button type="button" class="task-type-btn" data-type="it" onclick="selectTaskType('it')"><i class="fas fa-desktop"></i> Заявка в ИТ отдел</button>
<button type="button" class="task-type-btn" data-type="ahch" onclick="selectTaskType('ahch')">
<i class="fas fa-tools"></i> Заявка в АХЧ
</button>
<button type="button" class="task-type-btn" data-type="psychologist" onclick="selectTaskType('psychologist')">
<i class="fas fa-brain"></i> Заявка к психологу
</button>
<button type="button" class="task-type-btn" data-type="speech_therapist" onclick="selectTaskType('speech_therapist')">
<i class="fas fa-comment-medical"></i> Заявка к логопеду
</button>
<button type="button" class="task-type-btn" data-type="hr" onclick="selectTaskType('hr')">
<i class="fas fa-users"></i> Заявка в кадры
</button>
<button type="button" class="task-type-btn" data-type="certificate" onclick="selectTaskType('certificate')">
<i class="fas fa-book"></i> Заявка на справку
</button>
<button type="button" class="task-type-btn" data-type="e_journal" onclick="selectTaskType('e_journal')">
<i class="fas fa-book"></i> Доступ в электронный журнал
</button>
</div>
<input type="hidden" id="task-type" name="taskType" value="regular">
</div>
<div class="form-group">
<label for="title"><i class="fas fa-heading"></i> Название задачи:</label>
<input type="text" id="title" name="title" required>

View File

@@ -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%;
}
}

View File

@@ -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('Дата и время выполнения обязательны');

View File

@@ -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';
}