From e552be85470d93d6d7491e54bb19fcd68738dea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Thu, 27 Nov 2025 17:59:24 +0300 Subject: [PATCH] =?UTF-8?q?Fix:=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BE=D1=81=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D1=80=D1=83=D1=82=D0=BA=D0=B8=20=D1=83=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0=20=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B8=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Убрана полоска скролла у textarea (overflow-y: hidden, scrollbar-width: none) - Исправлена логика обработки вложений: теперь файлы хранятся в массиве - Улучшено удаление отдельных файлов из превью - Добавлена обработка отправки формы с файлами (подготовка к API) - Пока отправка файлов показывает предупреждение о будущей реализации --- backend/static/css/components/chat-detail.css | 6 ++ .../templates/communications/chat_detail.html | 85 ++++++++++++++++--- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/backend/static/css/components/chat-detail.css b/backend/static/css/components/chat-detail.css index 72757380..d2f67482 100644 --- a/backend/static/css/components/chat-detail.css +++ b/backend/static/css/components/chat-detail.css @@ -159,6 +159,12 @@ main.main { border: 1px solid var(--bs-border-color); background: var(--bs-body-bg); transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + overflow-y: hidden; /* Убираем полоску прокрутки */ + scrollbar-width: none; /* Firefox */ +} + +.composer-textarea::-webkit-scrollbar { + display: none; /* Chrome, Safari, Edge */ } .composer-textarea:focus { diff --git a/backend/templates/communications/chat_detail.html b/backend/templates/communications/chat_detail.html index 6fcc053a..8450e46f 100644 --- a/backend/templates/communications/chat_detail.html +++ b/backend/templates/communications/chat_detail.html @@ -194,6 +194,10 @@ document.addEventListener('DOMContentLoaded', function() { const audioInput = document.getElementById('audioInput'); const attachmentPreview = document.getElementById('attachmentPreview'); + const chatForm = document.getElementById('chatForm'); + + // Массив для хранения выбранных файлов + let selectedFiles = []; // Обработчики кликов на пункты меню attachDocument?.addEventListener('click', (e) => { @@ -220,10 +224,23 @@ document.addEventListener('DOMContentLoaded', function() { function handleFileSelect(files) { if (!files || files.length === 0) return; + // Добавляем новые файлы к существующим + selectedFiles = [...selectedFiles, ...Array.from(files)]; + + updatePreview(); + } + + function updatePreview() { + if (selectedFiles.length === 0) { + attachmentPreview.classList.add('d-none'); + attachmentPreview.innerHTML = ''; + return; + } + attachmentPreview.classList.remove('d-none'); attachmentPreview.innerHTML = ''; - Array.from(files).forEach((file, index) => { + selectedFiles.forEach((file, index) => { const fileItem = document.createElement('div'); fileItem.className = 'attachment-item d-flex align-items-center gap-2 p-2 border rounded mb-2'; @@ -240,11 +257,15 @@ document.addEventListener('DOMContentLoaded', function() {
${file.name}
${formatFileSize(file.size)}
- `; + // Обработчик удаления конкретного файла + const removeBtn = fileItem.querySelector('[data-remove-index]'); + removeBtn.addEventListener('click', () => removeAttachment(index)); + attachmentPreview.appendChild(fileItem); }); } @@ -255,21 +276,61 @@ document.addEventListener('DOMContentLoaded', function() { return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; } + function removeAttachment(index) { + selectedFiles.splice(index, 1); + updatePreview(); + } + documentInput?.addEventListener('change', (e) => handleFileSelect(e.target.files)); imageInput?.addEventListener('change', (e) => handleFileSelect(e.target.files)); cameraInput?.addEventListener('change', (e) => handleFileSelect(e.target.files)); audioInput?.addEventListener('change', (e) => handleFileSelect(e.target.files)); - // Глобальная функция для удаления вложения - window.removeAttachment = function(index) { - // TODO: Реализовать удаление конкретного файла - attachmentPreview.classList.add('d-none'); - attachmentPreview.innerHTML = ''; - documentInput.value = ''; - imageInput.value = ''; - cameraInput.value = ''; - audioInput.value = ''; - }; + // Обработка отправки формы с файлами + chatForm?.addEventListener('submit', async function(e) { + e.preventDefault(); + + const textarea = document.getElementById('id_content'); + const content = textarea.value.trim(); + + // Если есть вложения, отправляем через API + if (selectedFiles.length > 0) { + const formData = new FormData(); + formData.append('content', content || 'Вложение'); + + selectedFiles.forEach((file, index) => { + formData.append(`file_${index}`, file); + }); + + try { + // TODO: Реализовать API endpoint для загрузки файлов + // const response = await fetch('/communications/api/upload-message/', { + // method: 'POST', + // body: formData, + // headers: { + // 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value + // } + // }); + + console.log('Отправка файлов пока не реализована на бэкенде'); + alert('Отправка файлов будет реализована в следующем обновлении'); + + // Очищаем форму + textarea.value = ''; + selectedFiles = []; + updatePreview(); + documentInput.value = ''; + imageInput.value = ''; + cameraInput.value = ''; + audioInput.value = ''; + } catch (error) { + console.error('Ошибка отправки файлов:', error); + } + } else if (content) { + // Отправляем только текст (стандартное поведение формы) + chatForm.submit(); + } + }); });