234 Commits

Author SHA1 Message Date
7fd191d8ef fix: добавлена инициализация AJAX загрузки документов
- Добавлен импорт initDocumentListHandler в documentList.js
- Инициализация documentListHandler с правильными параметрами
- Считывание scope и ack_status из URL параметров
- Добавление scope в API запрос
- Передача userId и canManage через data-атрибуты
- Автоматическое применение scope при инициализации
2025-12-05 13:13:43 +03:00
944e14737b refactor: переход на AJAX загрузку документов
- Упрощен DocumentView - не загружает документы с сервера
- Шаблон использует спиннер вместо серверного рендеринга
- Удалена старая пагинация из шаблона
- Все документы загружаются через documentListHandler.js
- Предотвращена двойная загрузка (сервер + клиент)
2025-12-05 13:07:57 +03:00
066bda1af5 feat: добавлена бесконечная прокрутка для списка документов
- Заменена пагинация на Intersection Observer
- Документы подгружаются автоматически при прокрутке вниз
- Добавлено отслеживание nextUrl и hasMore из API
- При append рендерятся только новые документы, без дублирования
- Убраны кнопки Назад/Вперёд
- Добавлено логирование для отладки
- Сохранена фильтрация по scope и ack_status
2025-12-05 13:03:57 +03:00
b036e2412c fix: исправлено дублирование записей при подгрузке
- loadEmployees() теперь возвращает только новые записи
- render() принимает массив записей для рендеринга, а не использует this.employees
- При append=true рендерятся только новые записи, а не весь массив
- Добавлено логирование в render() для отладки
2025-12-05 12:59:31 +03:00
4ccc85f9f8 fix: исправлена ссылка на чат с сотрудником
- Изменен URL с /communications/chats/private/ на /communications/chats/start/
- Теперь соответствует правильному роуту start_private_chat
2025-12-05 12:56:14 +03:00
1b967a34c9 fix: предотвращение дублирования при бесконечной прокрутке
- Добавлена проверка nextUrl при append=true
- Если nextUrl пуст при подгрузке - останавливаем загрузку
- Добавлено логирование для отладки процесса загрузки
- Предотвращает повторную загрузку с начала списка
2025-12-05 12:54:34 +03:00
c4d2662fcf fix: правки после внедрения бесконечной прокрутки сотрудников 2025-12-05 12:51:00 +03:00
881743bc1f feat: add infinite scroll to employees list
- Added intersection observer for automatic loading
- Track nextUrl and hasMore from API response
- Append new employees instead of replacing
- Removed old pagination controls from template
- Show loading spinner while fetching more data
2025-12-05 12:39:35 +03:00
e31972b7aa fix: убрана двойная загрузка данных на странице списка сотрудников
- Упрощен employee_list view - НЕ загружает данные сотрудников
- Сервер отдает только справочники для фильтров
- Убран серверный рендеринг карточек из шаблона
- Добавлен spinner во время загрузки
- Данные загружаются один раз через JavaScript
- Производительность улучшена - нет двойного запроса
2025-12-05 12:35:10 +03:00
785a82f54b feat: переделана страница списка сотрудников на AJAX загрузку
- Создан новый JS модуль employeesList.js
- Список сотрудников загружается через API /api/v1/employees/
- Аватары получают правильные глобальные URL
- Сохранена поддержка фильтрации и поиска
- Передается ID текущего пользователя для скрытия кнопок
- Добавлена обработка ошибок загрузки
- Исправлена проблема с localhost URL в аватарах
2025-12-05 12:28:59 +03:00
d22b297651 feat: переделана страница профиля на AJAX загрузку
- Создан новый JS модуль employeeProfile.js
- Аватар сотрудника загружается через API с глобальными URL
- Посты сотрудника загружаются через FeedList с правильными URL медиа
- Добавлены ID контейнеров для динамической загрузки (#employeeAvatar, #employeeName, #employeePosts)
- Подключены скрипты для лайков, комментариев и модала деталей
- Добавлен emoji-picker для форм комментариев
- Добавлен модал для просмотра публикаций
- Исправлена проблема с localhost URL в аватарах и медиа постов
2025-12-05 12:21:30 +03:00
5550f7e45a fix: прыжок автоскроллера теперь происходит в середине контента
- Вычисляется loopPoint как blockScrollWidth * floor(totalCopies/2)
- Прыжок происходит реже (в середине вместо начала)
- Переход стал менее заметным для пользователя
- Добавлено логирование loopPoint для отладки
2025-12-05 11:11:09 +03:00
fcc52317cd fix: добавлен cache-busting для динамического импорта autoScrollerHandler
- Добавлен timestamp параметр в URL импорта
- Браузер будет загружать свежую версию вместо кешированной
- Исправлена проблема с устаревшими скриптами
2025-12-05 11:10:02 +03:00
286ce43d9d debug: добавлено детальное логирование автоскроллера
- Логи до и после клонирования элементов
- Логи размеров: scrollWidth, clientWidth, copiesNeeded
- Логи количества элементов до и после клонирования
- Добавлена защита от застревания (прыжок при достижении конца)
- Логи прыжков с maxScrollLeft для диагностики
- Исправлена логика вычисления blockScrollWidth = rail.scrollWidth / totalCopies
2025-12-05 11:08:32 +03:00
aad97df86e fix: улучшена бесконечная прокрутка в автоскроллере
- Теперь создается несколько копий элементов вместо одной
- Минимум 3 экрана контента для плавной прокрутки
- Вычисляется количество копий на основе ширины контейнера
- Убраны резкие прыжки при малом количестве элементов
2025-12-05 11:03:18 +03:00
b964f89c36 fix: автоскролл для новых сотрудников теперь инициализируется после рендеринга
- Перенесена инициализация автоскролла внутрь newEmployeesScroller
- Динамический импорт autoScrollerHandler после создания DOM
- Добавлена задержка 100мс для гарантии обновления DOM
- Убран преждевременный вызов initAutoScroller из шаблона
- Автоскролл запускается только когда элементы уже отрендерены
2025-12-05 11:00:04 +03:00
c9a440c3d3 feat: переделана лента новых сотрудников на AJAX загрузку
- Создан новый JS модуль newEmployeesScroller.js
- Новые сотрудники теперь загружаются через API с клиента
- Аватары используют глобальные URL (как в модале)
- Убран серверный рендеринг из feed_list view
- Шаблон использует пустой контейнер для JS инициализации
- Добавлен полный collapse блок с последним комментарием
- Добавлена форма быстрого комментария с emoji picker
- Исправлена проблема с localhost URL в аватарах
2025-12-05 10:56:23 +03:00
3090d0eba7 fix: исправлена структура футера и кнопок в ленте
- Изменен класс футера на card-actions border-0
- Кнопки имеют правильный класс btn btn-ghost
- Лайк справа через ms-auto spacer
- Кнопка комментариев работает через collapse
- Добавлен collapse блок для комментариев
- Убрано подчеркивание кнопок
2025-12-05 10:45:36 +03:00
cac0068e58 fix: исправлен порт по умолчанию для API_BASE_URL (9000 вместо 8000) 2025-12-05 10:37:09 +03:00
0144cd38de feat: переделана лента на AJAX загрузку через API с infinite scroll
- Создан модуль feedList.js для клиентской загрузки постов
- Посты загружаются напрямую из браузера через API
- Медиа URL формируются правильно (как в модале)
- Добавлен infinite scroll для автоматической подгрузки
- Упрощен view feed_list - только новые сотрудники с сервера
- Убрана серверная пагинация, заменена на клиентскую
2025-12-05 10:35:47 +03:00
65464304f0 fix: использование локального адреса для внутренних API запросов (избежание SSL ошибок) 2025-12-05 10:28:23 +03:00
be15af8bc1 refactor: убран base64 для изображений, динамический API URL, ImageField в сериализаторах 2025-12-05 10:25:24 +03:00
01d5e5c77e API теперь возвращает полные URL для медиа-файлов
- Обновлены serializers для автоматической генерации полных URL
- image, attachment и avatar теперь возвращаются с доменом
- Упрощены шаблоны - убрана сложная логика проверки URL
- Используется request.build_absolute_uri() для правильного формирования URL
- Медиа корректно работает на любом домене (локальном и глобальном)
2025-12-05 09:57:54 +03:00
7fd8e866d2 Добавлена динамическая генерация ссылок на медиа на основе текущего домена
- Создан context processor media_domain() для автоматического определения MEDIA_URL
- Обновлены шаблоны для использования MEDIA_URL_DYNAMIC
- Добавлены lazy loading и async decoding для оптимизации загрузки изображений
- Теперь медиа-файлы корректно загружаются как на локальном, так и на глобальном домене
2025-12-05 09:45:45 +03:00
f03b0aa8ab UI: Сделал кнопку 'Регистрация' более заметной и гармоничной с основной кнопкой входа 2025-12-04 16:31:25 +03:00
c62354576c Рефакторинг рендеринга сообщений и голосований: объединение логики, исправление whitespace, обновление SCSS и CSS 2025-12-04 15:35:08 +03:00
a8604de22c Обновление конфигурации и .env: автоматическое переключение HTTPS/HTTP для медиа и API, улучшена гибкость окружения 2025-12-04 12:26:55 +03:00
e141a4e0f5 communications: добавлен API endpoint для создания чата, исправлен JS для использования нового URL, реализована поддержка создания глобальных/групповых/канальных чатов через модал 2025-12-03 15:25:58 +03:00
7c78bfca10 Документы: исправлена инициализация формы, добавлен CSRF-токен для всех CRUD-операций, исправлен рендер docList для пустого списка, улучшена отладка JS 2025-12-03 14:42:26 +03:00
871a4a8011 fix ссылок на авторов в комментариях 2025-12-03 13:48:31 +03:00
9666253e09 debug(notifications): добавлено логирование воспроизведения звука
- Логирование попыток воспроизведения MP3
- Логирование успеха/ошибок загрузки
- Логирование переключения на fallback звук
- Помогает диагностировать проблемы с аудио файлами
2025-12-03 13:37:15 +03:00
c0e0a4e97f fix(calendar): улучшена обработка ошибки 404 при открытии события
- Добавлено специальное сообщение для 404 (событие не найдено/удалено)
- Автоматическое удаление параметра event_id из URL при 404
- Предотвращение повторных запросов к несуществующему событию
- Улучшен UX при переходе по устаревшим ссылкам
2025-12-03 13:31:42 +03:00
9610903035 feat(notifications): улучшена система звуков уведомлений
- Приоритет: сначала MP3 файл, fallback на Web Audio API
- Удален дублирующийся метод playNotificationSound()
- Добавлен playFallbackSound() для резервного синтетического звука
- Удалено неиспользуемое поле notificationSound
- Улучшена обработка ошибок воспроизведения
2025-12-03 13:27:24 +03:00
619287a547 fix(realtime): добавлены правильные обработчики уведомлений
- Переименован notification_created → notification_new
- Переименован notification_count → notification_count_update
- Теперь совместимы с notifications/services.py
- Исправлена ошибка 'No handler for message type notification_new'
2025-12-03 12:59:12 +03:00
2391ab3189 fix(frontend): обновлен notification-manager для работы с новой архитектурой
- Изменен WebSocket URL: /ws/notifications/ -> /ws/
- Обновлен обработчик типа 'notification' (вместо 'new_notification')
- Добавлена обратная совместимость для старых типов сообщений
- Теперь уведомления приходят через универсальный UserConsumer
2025-12-03 12:54:05 +03:00
b71ccc67bb refactor(websocket): удалены старые WebSocket consumers
Удалены файлы старой архитектуры:
- backend/communications/user_consumer.py
- backend/communications/routing.py
- backend/notifications/consumers.py
- backend/notifications/routing.py

Теперь вся WebSocket логика в backend/realtime/
При необходимости можно откатиться через git revert
2025-12-03 12:50:10 +03:00
d74b85b515 docs: обновлен README с информацией о новой архитектуре realtime 2025-12-03 12:47:51 +03:00
bc696a5d0d docs: добавлено руководство по миграции на архитектуру realtime 2025-12-03 12:46:16 +03:00
49b0231688 refactor(websocket): создано приложение realtime для унификации WebSocket
- Создано новое Django приложение realtime
- UserConsumer перенесен из communications в realtime
- Объединена функциональность чатов и уведомлений в одном consumer
- Обновлен asgi.py для использования realtime.routing
- Добавлена подписка на канал уведомлений (notifications_{user_id})
- Ping interval изменен на 20 секунд для лучшего keepalive
- Создан README.md с документацией по архитектуре

Улучшения архитектуры:
- Separation of Concerns: WebSocket логика отделена от бизнес-логики
- Single Responsibility: realtime отвечает только за real-time
- Расширяемость: легко добавлять новые real-time фичи
- Одно WebSocket соединение вместо двух (чаты + уведомления)
2025-12-03 12:44:21 +03:00
1691a84e3b fix(media): настроена генерация полных HTTPS URL для медиа файлов
- Добавлены переменные USE_HTTPS и DOMAIN в .env
- MEDIA_URL теперь использует полный домен на продакшене
- Убрана зависимость от API_BASE_URL для медиа
- Медиа URL: https://corp.robotail.local/media/ вместо http://127.0.0.1:9000/media/
2025-12-03 11:52:02 +03:00
b1541e7146 Merge branch 'feature/requests-recipients' 2025-12-03 11:15:27 +03:00
7f308bce2f docs: добавлена документация по диагностике WebSocket ошибки 1006 2025-12-03 11:14:36 +03:00
c7a3f475e3 docs: добавлены руководства по диагностике WebSocket 1006
- WEBSOCKET_1006_QUICK_GUIDE.md - быстрая шпаргалка (5 минут)
- WEBSOCKET_1006_PRIORITY_CHECK.md - приоритетная диагностика
- WEBSOCKET_1006_DIAGNOSTIC_PLAN.md - полный план диагностики
- WEBSOCKET_1006_SUMMARY.md - сводка по проблеме
- Обновлен README.md с ссылками на документацию
2025-12-03 11:09:18 +03:00
432224b3ba feat(requests): улучшена UI списка заявлений и добавлены расширенные фильтры
Стили комментариев:
- Приведены к единому стилю с лентой новостей
- Убрана фоновая подложка блока комментариев
- Убрана разделительная линия между заявлением и комментариями
- Обновлена структура: comment-header, comment-body, comment-separator
- Добавлены кликабельные ссылки на профили авторов

Исправления формы комментариев:
- Исправлена перезагрузка страницы при нажатии Enter
- Улучшена обработка submit события (preventDefault + stopPropagation)
- Правильная проверка формы через matches() вместо closest()

API endpoints:
- Использование правильных API endpoints для комментариев
- Переход с /requests/comments/{id}/ на /api/v1/requests/{id}/comments/
- Устранено дублирование запросов к старым и новым endpoints

CSRF токены:
- Добавлена функция getCsrfToken() для извлечения из cookie
- CSRF токен добавлен во все POST запросы к API
- Исправлены ошибки 403 Forbidden для действий (cancel, approve, reject)

Расширенные фильтры:
- Добавлен фильтр 'Все доступные' (свои + адресованные + с правами)
- Добавлен фильтр 'Мои заявления' (только созданные мной)
- Добавлен фильтр 'Мне адресовано' (recipients + cc_users + sent_to_all_department)
- Поддержка параметра addressed_to_me=true в API
- Обновлена логика views_front.py для обработки новых фильтров
- Исправлены lint ошибки (длинные строки)
2025-12-03 08:49:23 +03:00
b8d8a428b9 feat(requests): добавлен custom template filter для форматирования ISO дат
- Создан filter format_iso_date в req_tags.py
- Парсит ISO даты из API (с/без времени, с/без Z)
- Поддерживает форматы: d.m.Y, H:i, d.m.Y H:i, Y-m-d
- Обновлен шаблон для использования нового фильтра
- Более читаемое и надежное отображение дат и времени
2025-12-03 07:45:45 +03:00
a435c77756 fix(requests): исправлено отображение дат в табличном виде
Проблема: API возвращает даты как строки ISO, фильтр date не работал
Решение: используется slice для извлечения даты и времени из ISO строк
- date_from/date_to: slice:":10" для YYYY-MM-DD
- created_at: slice:":10" для даты, slice:"11:16" для времени
- Добавлены проверки на существование значений
2025-12-03 07:44:25 +03:00
3ce95a1458 refactor(requests): настоящий табличный вид с фиксированными колонками
Структура таблицы:
- Иконка (48px) - тип заявления
- Заголовок (расширяемая, 2fr) - название, тип, превью комментария
- Автор (1fr) - имя сотрудника с ссылкой
- Даты (100px) - date_from и date_to
- Статус (110px) - badge со статусом
- Создано (80px) - дата и время создания
- Действия (80px) - кнопки одобрить/отклонить/редактировать

Особенности:
- Grid layout с фиксированными шириной колонок
- Автоматический перенос текста в пределах ячейки (word-wrap)
- Выравнивание всех элементов по сетке
- Футер с комментариями выровнен с содержимым
- Адаптивный дизайн (планшеты, мобильные)
- На мобильных - две колонки (иконка + остальное)
2025-12-03 07:39:10 +03:00
fd4bde67e0 style(requests): табличный вид списка заявлений без разделительных линий
- Сеточный layout с выравниванием колонок (иконка, метаданные, действия)
- Убраны разделительные линии между блоками внутри заявления
- Тонкая линия между заявлениями для визуального разделения
- Убрана граница над блоком комментариев (card-actions border-top: none)
- Выравнивание комментариев по левому краю текста заявления
- Адаптивный дизайн для мобильных устройств
- Мягкий hover-эффект для строк
2025-12-03 07:33:29 +03:00
33e34bbe3f feat(requests): добавлена клиентская валидация формы создания заявления
- RecipientPicker.validate() проверяет наличие получателей/отделов
- RecipientPicker.setError()/clearError() для визуальной индикации ошибок
- Валидация в requestCrudHandler для create и edit
- Проверка: автор не может быть получателем
- Автоматическая очистка ошибки при изменении получателей
- Удалено временное логирование из сериализатора
2025-12-03 07:30:39 +03:00
766f9fa919 chore: закоммичен весь прогресс по тестам и фиксам requests API 2025-12-03 07:21:25 +03:00