diff --git a/public/style.css b/public/style.css index 7bd7f8d..504fbe7 100644 --- a/public/style.css +++ b/public/style.css @@ -4654,4 +4654,110 @@ button.btn-primary { word-break: break-word; max-width: 100%; } - } \ No newline at end of file + } +/* Стили для кнопки изменения срока */ +.change-deadline-btn { + background-color: #4a6fa5; + color: white; + border: none; + border-radius: 4px; + padding: 6px 12px; + margin: 0 4px; + cursor: pointer; + font-size: 13px; + display: inline-flex; + align-items: center; + gap: 4px; + transition: background-color 0.2s; +} + +.change-deadline-btn:hover { + background-color: #2c4a7a; +} + +/* Стили для модального окна */ +#change-deadline-modal .modal-content { + border-radius: 8px; + animation: slideIn 0.3s ease; +} + +#change-deadline-modal .form-group { + margin-bottom: 20px; +} + +#change-deadline-modal label { + display: block; + margin-bottom: 8px; + color: #333; + font-weight: 500; +} + +#change-deadline-modal .form-control { + width: 100%; + padding: 10px; + border: 2px solid #e1e5e9; + border-radius: 6px; + font-size: 14px; + transition: border-color 0.2s; +} + +#change-deadline-modal .form-control:focus { + border-color: #4a6fa5; + outline: none; +} + +#change-deadline-modal small { + display: block; + margin-top: 5px; + color: #666; + font-size: 12px; +} + +#change-deadline-modal .modal-footer { + border-top: 1px solid #e1e5e9; + padding-top: 20px; +} + +#change-deadline-modal .btn-primary { + background-color: #28a745; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + font-weight: 500; +} + +#change-deadline-modal .btn-primary:hover:not(:disabled) { + background-color: #218838; +} + +#change-deadline-modal .btn-primary:disabled { + background-color: #6c757d; + cursor: not-allowed; +} + +#change-deadline-modal .btn-cancel { + background-color: #6c757d; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + margin-right: 10px; +} + +#change-deadline-modal .btn-cancel:hover { + background-color: #5a6268; +} + +@keyframes slideIn { + from { + transform: translateY(-20px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} \ No newline at end of file diff --git a/public/ui.js b/public/ui.js index f24d1e3..a8a5697 100644 --- a/public/ui.js +++ b/public/ui.js @@ -212,7 +212,11 @@ ${currentUser && currentUser.role === 'tasks' && canEdit || currentUser.role === ${currentUser && currentUser.login === 'kalugin.o' ? `` : ''} ${task.task_type === 'document' && userRole === 'Исполнитель' ? `` : ''} - ${currentUser && currentUser.login === 'minicrm' ? `` : ''} + +${!isDeleted && !isClosed && task.task_type !== 'regular' && task.assignments && task.assignments.some(a => parseInt(a.user_id) === currentUser.id) ? +`` : ''} + +${currentUser && currentUser.login === 'minicrm' ? `` : ''} ${canEdit ? `` : ''} ` : ''} ${isClosed && canEdit ? ` @@ -1927,4 +1931,173 @@ function renderGroupedFiles(task) { `).join(''); -} \ No newline at end of file +} +// ++++++++++++++++++++++++++++++ кнопки изменения срока задачи для исполнителей ++++++++++++++++++++++++++++++ +// Функция для открытия модального окна изменения срока задачи +function openChangeDeadlineModal(taskId) { + const task = tasks.find(t => t.id === taskId); + if (!task) { + alert('Задача не найдена'); + return; + } + + // Проверяем, что задача не обычная (regular) + if (task.task_type === 'regular') { + alert('Для обычных задач изменение срока недоступно'); + return; + } + + // Проверяем, является ли пользователь исполнителем + const isExecutor = task.assignments && task.assignments.some(a => + parseInt(a.user_id) === currentUser.id + ); + + if (!isExecutor && currentUser.role !== 'admin') { + alert('Только исполнители могут изменять срок задачи'); + return; + } + + const modalHtml = ` +