- Добавлена проверка nextUrl при append=true
- Если nextUrl пуст при подгрузке - останавливаем загрузку
- Добавлено логирование для отладки процесса загрузки
- Предотвращает повторную загрузку с начала списка
- 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
- Упрощен employee_list view - НЕ загружает данные сотрудников
- Сервер отдает только справочники для фильтров
- Убран серверный рендеринг карточек из шаблона
- Добавлен spinner во время загрузки
- Данные загружаются один раз через JavaScript
- Производительность улучшена - нет двойного запроса
- Создан новый JS модуль employeesList.js
- Список сотрудников загружается через API /api/v1/employees/
- Аватары получают правильные глобальные URL
- Сохранена поддержка фильтрации и поиска
- Передается ID текущего пользователя для скрытия кнопок
- Добавлена обработка ошибок загрузки
- Исправлена проблема с localhost URL в аватарах
- Создан новый JS модуль employeeProfile.js
- Аватар сотрудника загружается через API с глобальными URL
- Посты сотрудника загружаются через FeedList с правильными URL медиа
- Добавлены ID контейнеров для динамической загрузки (#employeeAvatar, #employeeName, #employeePosts)
- Подключены скрипты для лайков, комментариев и модала деталей
- Добавлен emoji-picker для форм комментариев
- Добавлен модал для просмотра публикаций
- Исправлена проблема с localhost URL в аватарах и медиа постов
- Вычисляется loopPoint как blockScrollWidth * floor(totalCopies/2)
- Прыжок происходит реже (в середине вместо начала)
- Переход стал менее заметным для пользователя
- Добавлено логирование loopPoint для отладки
- Логи до и после клонирования элементов
- Логи размеров: scrollWidth, clientWidth, copiesNeeded
- Логи количества элементов до и после клонирования
- Добавлена защита от застревания (прыжок при достижении конца)
- Логи прыжков с maxScrollLeft для диагностики
- Исправлена логика вычисления blockScrollWidth = rail.scrollWidth / totalCopies
- Теперь создается несколько копий элементов вместо одной
- Минимум 3 экрана контента для плавной прокрутки
- Вычисляется количество копий на основе ширины контейнера
- Убраны резкие прыжки при малом количестве элементов
- Перенесена инициализация автоскролла внутрь newEmployeesScroller
- Динамический импорт autoScrollerHandler после создания DOM
- Добавлена задержка 100мс для гарантии обновления DOM
- Убран преждевременный вызов initAutoScroller из шаблона
- Автоскролл запускается только когда элементы уже отрендерены
- Создан новый JS модуль newEmployeesScroller.js
- Новые сотрудники теперь загружаются через API с клиента
- Аватары используют глобальные URL (как в модале)
- Убран серверный рендеринг из feed_list view
- Шаблон использует пустой контейнер для JS инициализации
- Добавлен полный collapse блок с последним комментарием
- Добавлена форма быстрого комментария с emoji picker
- Исправлена проблема с localhost URL в аватарах
- Изменен класс футера на card-actions border-0
- Кнопки имеют правильный класс btn btn-ghost
- Лайк справа через ms-auto spacer
- Кнопка комментариев работает через collapse
- Добавлен collapse блок для комментариев
- Убрано подчеркивание кнопок
- Создан модуль feedList.js для клиентской загрузки постов
- Посты загружаются напрямую из браузера через API
- Медиа URL формируются правильно (как в модале)
- Добавлен infinite scroll для автоматической подгрузки
- Упрощен view feed_list - только новые сотрудники с сервера
- Убрана серверная пагинация, заменена на клиентскую
- Обновлены serializers для автоматической генерации полных URL
- image, attachment и avatar теперь возвращаются с доменом
- Упрощены шаблоны - убрана сложная логика проверки URL
- Используется request.build_absolute_uri() для правильного формирования URL
- Медиа корректно работает на любом домене (локальном и глобальном)
- Создан context processor media_domain() для автоматического определения MEDIA_URL
- Обновлены шаблоны для использования MEDIA_URL_DYNAMIC
- Добавлены lazy loading и async decoding для оптимизации загрузки изображений
- Теперь медиа-файлы корректно загружаются как на локальном, так и на глобальном домене
- Логирование попыток воспроизведения MP3
- Логирование успеха/ошибок загрузки
- Логирование переключения на fallback звук
- Помогает диагностировать проблемы с аудио файлами
- Добавлено специальное сообщение для 404 (событие не найдено/удалено)
- Автоматическое удаление параметра event_id из URL при 404
- Предотвращение повторных запросов к несуществующему событию
- Улучшен UX при переходе по устаревшим ссылкам
- Приоритет: сначала MP3 файл, fallback на Web Audio API
- Удален дублирующийся метод playNotificationSound()
- Добавлен playFallbackSound() для резервного синтетического звука
- Удалено неиспользуемое поле notificationSound
- Улучшена обработка ошибок воспроизведения
- Переименован notification_created → notification_new
- Переименован notification_count → notification_count_update
- Теперь совместимы с notifications/services.py
- Исправлена ошибка 'No handler for message type notification_new'
- Изменен WebSocket URL: /ws/notifications/ -> /ws/
- Обновлен обработчик типа 'notification' (вместо 'new_notification')
- Добавлена обратная совместимость для старых типов сообщений
- Теперь уведомления приходят через универсальный UserConsumer
Удалены файлы старой архитектуры:
- backend/communications/user_consumer.py
- backend/communications/routing.py
- backend/notifications/consumers.py
- backend/notifications/routing.py
Теперь вся WebSocket логика в backend/realtime/
При необходимости можно откатиться через git revert
- Создано новое 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 соединение вместо двух (чаты + уведомления)
Стили комментариев:
- Приведены к единому стилю с лентой новостей
- Убрана фоновая подложка блока комментариев
- Убрана разделительная линия между заявлением и комментариями
- Обновлена структура: 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 ошибки (длинные строки)
- Создан filter format_iso_date в req_tags.py
- Парсит ISO даты из API (с/без времени, с/без Z)
- Поддерживает форматы: d.m.Y, H:i, d.m.Y H:i, Y-m-d
- Обновлен шаблон для использования нового фильтра
- Более читаемое и надежное отображение дат и времени
Проблема: API возвращает даты как строки ISO, фильтр date не работал
Решение: используется slice для извлечения даты и времени из ISO строк
- date_from/date_to: slice:":10" для YYYY-MM-DD
- created_at: slice:":10" для даты, slice:"11:16" для времени
- Добавлены проверки на существование значений
Структура таблицы:
- Иконка (48px) - тип заявления
- Заголовок (расширяемая, 2fr) - название, тип, превью комментария
- Автор (1fr) - имя сотрудника с ссылкой
- Даты (100px) - date_from и date_to
- Статус (110px) - badge со статусом
- Создано (80px) - дата и время создания
- Действия (80px) - кнопки одобрить/отклонить/редактировать
Особенности:
- Grid layout с фиксированными шириной колонок
- Автоматический перенос текста в пределах ячейки (word-wrap)
- Выравнивание всех элементов по сетке
- Футер с комментариями выровнен с содержимым
- Адаптивный дизайн (планшеты, мобильные)
- На мобильных - две колонки (иконка + остальное)
- Сеточный layout с выравниванием колонок (иконка, метаданные, действия)
- Убраны разделительные линии между блоками внутри заявления
- Тонкая линия между заявлениями для визуального разделения
- Убрана граница над блоком комментариев (card-actions border-top: none)
- Выравнивание комментариев по левому краю текста заявления
- Адаптивный дизайн для мобильных устройств
- Мягкий hover-эффект для строк
- RecipientPicker.validate() проверяет наличие получателей/отделов
- RecipientPicker.setError()/clearError() для визуальной индикации ошибок
- Валидация в requestCrudHandler для create и edit
- Проверка: автор не может быть получателем
- Автоматическая очистка ошибки при изменении получателей
- Удалено временное логирование из сериализатора
Изменения по фидбеку:
✨ Строка 'Отделы' теперь показывается по кнопке '+ Отделы'
- По умолчанию скрыта (как поле CC)
- Появляется при клике на кнопку рядом с '+ Копия'
- Автоматически показывается при загрузке данных (редактирование)
✨ Галочка 'Всем в отделе' появляется только после выбора отдела
- Показывается только если выбран хотя бы 1 отдел
- Динамически меняет текст: 'Всем в отделе' или 'Всем в отделах'
- Более понятное название вместо 'Всем сотрудникам'
� Интерфейс стал еще более интуитивным:
- Пользователь видит только 'Кому:' по умолчанию
- Дополнительные опции (CC, Отделы) добавляются по кнопкам
- Прогрессивное раскрытие (progressive disclosure)
- Меньше visual clutter
� UX паттерн:
- Следует принципу 'show what's needed, hide what's not'
- Как в Gmail: To всегда видно, CC/BCC по кнопке
- Минимальный интерфейс для простых задач
- Расширенные опции для сложных сценариев
Переработан RecipientPicker компонент:
✨ Chip-based UI (как в Gmail/Outlook)
- Пользователи отображаются как chips с крестиком для удаления
- Autocomplete с живым поиском по имени/email
- Dropdown с аватарами и должностями пользователей
� Интуитивный интерфейс:
- Структура To:/CC:/Отделы: (как в почтовых клиентах)
- Получатели всегда видны (убраны collapse)
- Кнопка '+ Копия' для показа поля CC
- Inline флаг 'Всем сотрудникам'
� Улучшенная верстка:
- Модальные окна расширены до modal-lg
- Получатели перенесены в начало (как тема в email)
- Добавлены иконки для визуальной группировки
- Добавлены emoji в типы заявлений для удобства
� CSS обновлен:
- Email-style компактный дизайн
- Фокус-состояния для inputs
- Hover-эффекты для dropdown items
- Адаптивность для мобильных устройств
- Поддержка темной темы
� UX улучшения:
- Поиск с автодополнением вместо select
- Визуальные аватары пользователей (инициалы)
- Показ должности и email в dropdown
- Автофокус после добавления пользователя
- Ограничение результатов поиска до 10
- Детальный статус всех 8 этапов
- 5 из 8 этапов завершены (62%)
- Список коммитов и метрики
- Приоритеты следующих действий
- Известные проблемы и TODO
Создан компонент RecipientPicker:
- Множественный выбор отделов (ManyToMany)
- Выбор основных получателей (recipients)
- Выбор пользователей в копии (CC users)
- Флаг "Отправить всем сотрудникам отделов"
- Динамический рендеринг выбранных пользователей
- Валидация: нельзя указать recipients с флагом sent_to_all_department
Интеграция:
- Добавлены секции получателей в модальные окна создания и редактирования
- Обновлен requestCrudHandler.js для передачи данных получателей в API
- Добавлены стили recipientPicker.css
- Подключен CSS в request_list_full.html
Функциональность:
- Загрузка списка пользователей и отделов из API
- Добавление/удаление получателей через UI
- Автоматическая очистка форм после создания
- Поддержка редактирования существующих получателей
- Результаты тестирования: 7/7 модельных тестов пройдено
- Описание всех проверенных функций
- Список исправленных ошибок
- Рекомендации для следующих этапов (Frontend, Admin, Tests)
- Команды для запуска тестов