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(); + } + }); });