69 Commits

Author SHA1 Message Date
4822eee65e feat: добавлена бесконечная прокрутка для заявлений
- Создан компонент requestListHandler.js для AJAX загрузки
- Упрощен view my_requests - данные загружаются через API
- Обновлен шаблон my_requests.html на AJAX загрузку
- Добавлен поиск по типу заявления и комментарию
- Intersection Observer для автоматической подгрузки
- Фильтрация по статусу заявления
- Удалена серверная пагинация
- Добавлены спиннеры загрузки
2025-12-05 13:31:55 +03:00
bc51d7c326 feat: добавлен поиск документов по названию и описанию
- Убран параметр no_search из шапки страницы
- Добавлено поле поиска с placeholder
- Реализована фильтрация по названию и описанию документа
- Поиск работает на клиенте с debounce 300ms
- Фильтрация применяется ко всем загруженным документам
- Настройка обработчика поиска после первой загрузки
2025-12-05 13:19:04 +03:00
e1acebdb34 fix: добавлена инициализация AJAX загрузки документов
- Добавлен импорт initDocumentListHandler в documentList.js
- Инициализация documentListHandler с правильными параметрами
- Считывание scope и ack_status из URL параметров
- Добавление scope в API запрос
- Передача userId и canManage через data-атрибуты
- Автоматическое применение scope при инициализации
2025-12-05 13:13:43 +03:00
756aadb4d3 feat: добавлена бесконечная прокрутка для списка документов
- Заменена пагинация на Intersection Observer
- Документы подгружаются автоматически при прокрутке вниз
- Добавлено отслеживание nextUrl и hasMore из API
- При append рендерятся только новые документы, без дублирования
- Убраны кнопки Назад/Вперёд
- Добавлено логирование для отладки
- Сохранена фильтрация по scope и ack_status
2025-12-05 13:03:57 +03:00
d651211a47 fix: исправлено дублирование записей при подгрузке
- loadEmployees() теперь возвращает только новые записи
- render() принимает массив записей для рендеринга, а не использует this.employees
- При append=true рендерятся только новые записи, а не весь массив
- Добавлено логирование в render() для отладки
2025-12-05 12:59:31 +03:00
ba9d194434 fix: исправлена ссылка на чат с сотрудником
- Изменен URL с /communications/chats/private/ на /communications/chats/start/
- Теперь соответствует правильному роуту start_private_chat
2025-12-05 12:56:14 +03:00
c7b4133282 fix: предотвращение дублирования при бесконечной прокрутке
- Добавлена проверка nextUrl при append=true
- Если nextUrl пуст при подгрузке - останавливаем загрузку
- Добавлено логирование для отладки процесса загрузки
- Предотвращает повторную загрузку с начала списка
2025-12-05 12:54:34 +03:00
839f1a2de1 fix: правки после внедрения бесконечной прокрутки сотрудников 2025-12-05 12:51:00 +03:00
338b9cf065 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
c1a2026a15 feat: переделана страница списка сотрудников на AJAX загрузку
- Создан новый JS модуль employeesList.js
- Список сотрудников загружается через API /api/v1/employees/
- Аватары получают правильные глобальные URL
- Сохранена поддержка фильтрации и поиска
- Передается ID текущего пользователя для скрытия кнопок
- Добавлена обработка ошибок загрузки
- Исправлена проблема с localhost URL в аватарах
2025-12-05 12:28:59 +03:00
5d65b71c21 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
6ae6516db7 fix: прыжок автоскроллера теперь происходит в середине контента
- Вычисляется loopPoint как blockScrollWidth * floor(totalCopies/2)
- Прыжок происходит реже (в середине вместо начала)
- Переход стал менее заметным для пользователя
- Добавлено логирование loopPoint для отладки
2025-12-05 11:11:09 +03:00
17b256a627 fix: добавлен cache-busting для динамического импорта autoScrollerHandler
- Добавлен timestamp параметр в URL импорта
- Браузер будет загружать свежую версию вместо кешированной
- Исправлена проблема с устаревшими скриптами
2025-12-05 11:10:02 +03:00
e7e0f2c559 debug: добавлено детальное логирование автоскроллера
- Логи до и после клонирования элементов
- Логи размеров: scrollWidth, clientWidth, copiesNeeded
- Логи количества элементов до и после клонирования
- Добавлена защита от застревания (прыжок при достижении конца)
- Логи прыжков с maxScrollLeft для диагностики
- Исправлена логика вычисления blockScrollWidth = rail.scrollWidth / totalCopies
2025-12-05 11:08:32 +03:00
de5ca9e70f fix: улучшена бесконечная прокрутка в автоскроллере
- Теперь создается несколько копий элементов вместо одной
- Минимум 3 экрана контента для плавной прокрутки
- Вычисляется количество копий на основе ширины контейнера
- Убраны резкие прыжки при малом количестве элементов
2025-12-05 11:03:18 +03:00
26753ac027 fix: автоскролл для новых сотрудников теперь инициализируется после рендеринга
- Перенесена инициализация автоскролла внутрь newEmployeesScroller
- Динамический импорт autoScrollerHandler после создания DOM
- Добавлена задержка 100мс для гарантии обновления DOM
- Убран преждевременный вызов initAutoScroller из шаблона
- Автоскролл запускается только когда элементы уже отрендерены
2025-12-05 11:00:04 +03:00
66cbbef243 feat: переделана лента новых сотрудников на AJAX загрузку
- Создан новый JS модуль newEmployeesScroller.js
- Новые сотрудники теперь загружаются через API с клиента
- Аватары используют глобальные URL (как в модале)
- Убран серверный рендеринг из feed_list view
- Шаблон использует пустой контейнер для JS инициализации
- Добавлен полный collapse блок с последним комментарием
- Добавлена форма быстрого комментария с emoji picker
- Исправлена проблема с localhost URL в аватарах
2025-12-05 10:56:23 +03:00
35dbc2492d fix: исправлена структура футера и кнопок в ленте
- Изменен класс футера на card-actions border-0
- Кнопки имеют правильный класс btn btn-ghost
- Лайк справа через ms-auto spacer
- Кнопка комментариев работает через collapse
- Добавлен collapse блок для комментариев
- Убрано подчеркивание кнопок
2025-12-05 10:45:36 +03:00
421fdf878b feat: переделана лента на AJAX загрузку через API с infinite scroll
- Создан модуль feedList.js для клиентской загрузки постов
- Посты загружаются напрямую из браузера через API
- Медиа URL формируются правильно (как в модале)
- Добавлен infinite scroll для автоматической подгрузки
- Упрощен view feed_list - только новые сотрудники с сервера
- Убрана серверная пагинация, заменена на клиентскую
2025-12-05 10:35:47 +03:00
dfd4462d20 API теперь возвращает полные URL для медиа-файлов
- Обновлены serializers для автоматической генерации полных URL
- image, attachment и avatar теперь возвращаются с доменом
- Упрощены шаблоны - убрана сложная логика проверки URL
- Используется request.build_absolute_uri() для правильного формирования URL
- Медиа корректно работает на любом домене (локальном и глобальном)
2025-12-05 09:57:54 +03:00
08cdf2badd Рефакторинг рендеринга сообщений и голосований: объединение логики, исправление whitespace, обновление SCSS и CSS 2025-12-04 15:35:08 +03:00
0df247565e Документы: исправлена инициализация формы, добавлен CSRF-токен для всех CRUD-операций, исправлен рендер docList для пустого списка, улучшена отладка JS 2025-12-03 14:42:26 +03:00
ba1f48c942 fix ссылок на авторов в комментариях 2025-12-03 13:48:31 +03:00
092ae0e2f5 fix(calendar): улучшена обработка ошибки 404 при открытии события
- Добавлено специальное сообщение для 404 (событие не найдено/удалено)
- Автоматическое удаление параметра event_id из URL при 404
- Предотвращение повторных запросов к несуществующему событию
- Улучшен UX при переходе по устаревшим ссылкам
2025-12-03 13:31:42 +03:00
5ca0feb9eb 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
20bd4daade feat(requests): добавлена клиентская валидация формы создания заявления
- RecipientPicker.validate() проверяет наличие получателей/отделов
- RecipientPicker.setError()/clearError() для визуальной индикации ошибок
- Валидация в requestCrudHandler для create и edit
- Проверка: автор не может быть получателем
- Автоматическая очистка ошибки при изменении получателей
- Удалено временное логирование из сериализатора
2025-12-03 07:30:39 +03:00
704ebbb7e4 refactor(requests): Улучшена интуитивность RecipientPicker
Изменения по фидбеку:
✨ Строка 'Отделы' теперь показывается по кнопке '+ Отделы'
  - По умолчанию скрыта (как поле CC)
  - Появляется при клике на кнопку рядом с '+ Копия'
  - Автоматически показывается при загрузке данных (редактирование)

✨ Галочка 'Всем в отделе' появляется только после выбора отдела
  - Показывается только если выбран хотя бы 1 отдел
  - Динамически меняет текст: 'Всем в отделе' или 'Всем в отделах'
  - Более понятное название вместо 'Всем сотрудникам'

� Интерфейс стал еще более интуитивным:
  - Пользователь видит только 'Кому:' по умолчанию
  - Дополнительные опции (CC, Отделы) добавляются по кнопкам
  - Прогрессивное раскрытие (progressive disclosure)
  - Меньше visual clutter

� UX паттерн:
  - Следует принципу 'show what's needed, hide what's not'
  - Как в Gmail: To всегда видно, CC/BCC по кнопке
  - Минимальный интерфейс для простых задач
  - Расширенные опции для сложных сценариев
2025-12-02 18:20:15 +03:00
aa32439e8b refactor(requests): Улучшен UX выбора получателей в стиле email-клиента
Переработан 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
2025-12-02 18:09:19 +03:00
deec86f3f9 feat(requests): Этап 5 - реализован frontend для получателей заявлений
Создан компонент RecipientPicker:
- Множественный выбор отделов (ManyToMany)
- Выбор основных получателей (recipients)
- Выбор пользователей в копии (CC users)
- Флаг "Отправить всем сотрудникам отделов"
- Динамический рендеринг выбранных пользователей
- Валидация: нельзя указать recipients с флагом sent_to_all_department

Интеграция:
- Добавлены секции получателей в модальные окна создания и редактирования
- Обновлен requestCrudHandler.js для передачи данных получателей в API
- Добавлены стили recipientPicker.css
- Подключен CSS в request_list_full.html

Функциональность:
- Загрузка списка пользователей и отделов из API
- Добавление/удаление получателей через UI
- Автоматическая очистка форм после создания
- Поддержка редактирования существующих получателей
2025-12-02 17:49:54 +03:00
d370ef678d Валидация ФИО: запрет цифр, обязательность аватара, улучшения JS live validation, фиксы паттернов для отчества 2025-12-02 14:02:10 +03:00
194286ecd5 debug: подробные логи для диагностики валидации аватара (JS, DRF, сериализатор) 2025-12-02 11:28:45 +03:00
22476a5f7a Исправлена ошибка фильтра LdapSyncState: использование model+object_pk вместо несуществующего поля employee 2025-12-02 11:11:50 +03:00
1b3076fb02 Улучшена обработка ошибок валидации: парсинг detail с извлечением имени поля и сообщения, обработка API ошибок в try-except 2025-12-02 11:07:47 +03:00
2d08c8bc56 AJAX submit для формы редактирования сотрудника, ошибки показываются inline 2025-12-02 11:05:37 +03:00
270407abf9 AJAX submit для формы редактирования сотрудника, ошибки показываются inline 2025-12-02 11:01:42 +03:00
68352580e8 Фикс: корректный placeholder для фото сотрудника при пустом avatar, форма отправляет POST на фронтовую вьюху, убрана JS-валидация и кастомный submit. 2025-12-01 15:44:02 +03:00
3562852d84 debug: добавлено детальное логирование отправки PATCH запроса 2025-12-01 15:10:02 +03:00
2749d7f0d4 debug: добавлено логирование в employeeFormHandler для отладки загрузки аватара 2025-12-01 15:06:41 +03:00
26f4bbea02 fix: устранены дубликаты сообщений, архитектура загрузки через WebSocket, исправлен poll_update для Django Channels, улучшена инициализация голосований и защита от повторов 2025-12-01 14:19:58 +03:00
7c2b6b73e3 Убраны console.warn из chatListFilter и chatListRealtime
Модули теперь тихо выходят, если не находят элементы (не на странице чатов),
вместо того чтобы засорять консоль предупреждениями на всех остальных страницах.
2025-11-30 12:21:36 +03:00
43fa0a2053 Добавлена загрузка/замена/удаление фото сотрудника с автоматическим удалением старых файлов 2025-11-30 10:50:09 +03:00
3422f18f4f fix(notifications): восстановлены типы уведомлений, тестовый скрипт и все рабочие изменения 2025-11-29 16:41:03 +03:00
3ec09a0fa7 fix(message-inputs): кнопки не переносятся на новую строку при масштабировании
КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ CSS:
- Добавлен flex-wrap: nowrap в .message-field (запрет переноса)
- Добавлен min-width: 0 в .message-input (позволяет сжиматься)
- Удален flex-wrap: wrap из mobile media query
- Улучшены mobile стили: меньшие отступы и размеры кнопок
- Поле ввода теперь корректно сжимается на мобильных
- Кнопки смайлика и отправки остаются на месте

ВЛИЯНИЕ:
- Модальное окно постов
- Чаты (messenger)
- Все формы комментариев
- Все места с .message-field компонентом

ОТКЛЮЧЕН DEBUG в postDetailModal.js
2025-11-29 16:31:06 +03:00
c96cb46b84 fix(post-modal): комментарии текущего пользователя отображаются справа
КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ ЛОГИКИ:
- Теперь справа отображаются комментарии ТЕКУЩЕГО пользователя (как в мессенджере)
- Добавлена функция getCurrentUserId() для получения ID из meta-тега
- Сравнение: commentAuthorId === currentUserId (а не postAuthorId)
- Обновлена отладка с эмодзи: ✅ МОЙ / ❌ чужой, ➡️ RIGHT / ⬅️ LEFT
- Переименованы переменные для ясности: isMyComment вместо isAuthor
2025-11-29 16:27:10 +03:00
34ddc5588f feat(comments): добавлен флаг is_post_author в API
- Добавлено поле is_post_author в CommentSerializer
- Сервер теперь явно указывает, является ли автор комментария автором поста
- Фронтенд использует этот флаг (с fallback на ручное сравнение)
- Добавлена детальная отладка для диагностики проблемы
- Это устраняет проблему с неправильным определением автора
2025-11-29 16:15:39 +03:00
f955185b91 fix(post-modal): исправлена отрисовка комментариев в модале
- Комментарии автора поста отображаются справа без бейджа
- Форма ввода комментариев теперь не накладывается на список (position: relative вместо sticky)
- Исправлена автоматическая прокрутка к низу комментариев при открытии модала (requestAnimationFrame)
- Блок комментариев использует flex-layout для правильного размещения
- Секция комментариев имеет min-height: 300px и max-height: 65vh
- Добавлена граница сверху формы ввода для визуального разделения
2025-11-29 15:57:26 +03:00
c9fa337669 fix(calendar): добавлена очистка кеша после создания/редактирования/удаления событий
- Добавлен вызов invalidateCalendarEvents() перед refetchEvents()
- Исправлена проблема с отображением событий без перезагрузки страницы
- Кеш теперь корректно очищается при всех операциях с событиями
2025-11-29 15:42:01 +03:00
dd56953e89 Исправлена разметка и стили страницы профиля
- Заменен лишний div.container на стандартный container для единообразия
- Заменен класс .card на .ios-card в секции активности для устранения конфликтов стилей
- Добавлен card-list.css в base.html для корректного отображения карточек новостей
- Добавлены CSS правила для правильного поведения .row и колонок в grid-layout
- Исправлена проблема с выходом календаря за границы страницы
- Убраны видимые скроллбары у modal-body и modal-content для чистого UI
2025-11-29 13:52:21 +03:00
38c4d3aeab Рефакторинг: добавлен DataManager и API обертки для устранения дублирования запросов
НОВОЕ:
- static/js/managers/dataManager.js - централизованное кеширование и дедупликация
- static/js/api/calendarApi.js - обертка над calendar API с кешем (TTL 30s)
- static/js/api/departmentsApi.js - обертка над departments API с кешем (TTL 60s)

ИЗМЕНЕНО:
- calendarWidget.js теперь использует getCalendarEvents() и getMyDepartments()
- Убрано 3x дублирование запроса /api/v1/departments/my-departments/
- Убрано 2-3x дублирование запросов календаря

РЕЗУЛЬТАТ:
- Вместо 10+ API запросов теперь будет 3-4 (с кешем)
- Автоматическая дедупликация одновременных запросов
- Логирование Cache HIT/MISS для отладки
2025-11-28 14:24:26 +03:00
a2ceba626c Добавлен механизм keepalive для WebSocket соединений
- Добавлен ping каждые 20 секунд в ChatConsumer
- Добавлен ping каждые 20 секунд в ChatListConsumer
- Добавлен ping каждые 20 секунд в NotificationConsumer
- Клиенты игнорируют ping сообщения
- Создан WEBSOCKET_KEEPALIVE_FIX.md с инструкциями для nginx
- Исправляет проблему закрытия соединений через 27 секунд
2025-11-28 13:57:59 +03:00