тип заявок
This commit is contained in:
@@ -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>
|
||||
|
||||
256
public/style.css
256
public/style.css
@@ -2452,3 +2452,259 @@ small {
|
||||
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%;
|
||||
}
|
||||
}
|
||||
@@ -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('Дата и время выполнения обязательны');
|
||||
|
||||
154
public/ui.js
154
public/ui.js
@@ -642,3 +642,157 @@ async function loadTaskFiles(taskId) {
|
||||
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';
|
||||
}
|
||||
Reference in New Issue
Block a user