136 Commits

Author SHA1 Message Date
8ebe241174 feat(requests): добавлены фильтры по сотруднику и периоду дат 2025-12-29 15:32:27 +03:00
f6a1315d76 feat(requests): текст темы в списке заявлений теперь ссылка на страницу деталей 2025-12-29 14:47:13 +03:00
662273ac06 fix(requests): убрано двоеточие перед именем approver в списке заявлений 2025-12-29 14:40:45 +03:00
af31e7c591 refactor(requests): показывать имя approver вместо кнопок действий для уже обработанных заявлений 2025-12-29 14:38:48 +03:00
0890d02efc refactor: переделать страницу деталей заявления с нуля со стилями из списка
- Полная переделка шаблона request_detail.html с единообразными стилями
- Новая структура: основная карточка (8 колонок) + боковая панель комментариев (4 колонки)
- Единообразные иконки типов заявлений (calendar-check, capsule, umbrella-fill и т.д.)
- Единообразные бейджи статуса и типа как в списке
- Информационные блоки для автора, описания, получателей, одобрившего
- Форма комментариев с правильным стилем message-field--compact
- Emoji picker с поддержкой dropdown-menu поверх контента
- AJAX обработка отправки и удаления комментариев
- Новый CSS файл request-detail.css с адаптивностью
- Добавлена функция _add_type_display() в views.py для отображения типа

Улучшения:
- Единство дизайна со страницей списка заявлений
- Правильное позиционирование emoji picker (fixed positioning)
- Sticky боковая панель с комментариями
- Форма комментария как в ленте (message-field--compact)
- Кнопки одобрения/отклонения с правильными иконками
2025-12-29 14:27:47 +03:00
a417ddfb8f fix(requests): исправлена отправка уведомлений при создании заявления
ПРОБЛЕМА: Уведомления не отправлялись при создании нового заявления

ПРИЧИНА: Сигнал post_save срабатывал ДО установки ManyToMany связей (recipients, cc_users)

РЕШЕНИЕ:
- Добавлен сигнал m2m_changed для отслеживания установки recipients/cc_users
- При создании заявления оно помечается как ожидающее отправки уведомлений
- После установки recipients через .set() срабатывает m2m_changed и отправляет уведомления
- Используется глобальный set _pending_new_requests для отслеживания

УЛУЧШЕНИЯ:
- Добавлено подробное логирование процесса создания и отправки уведомлений
- Разные эмодзи-иконки для разных типов получателей (� адресовано, � в копии, ✅ на согласование)
- Все типы используют notification_type='request_new' (существующий в БД)

Файлы:
- notification_signals.py: добавлены сигналы m2m_changed
- serializers.py: добавлено логирование создания и установки recipients
2025-12-29 11:56:56 +03:00
1a5de8c61f fix(requests): убраны alert и немедленный reload при approve/reject на странице списка
- requestCrudHandler.js: заменены alert+reload на закрытие модального окна + событие
- requestList.js: добавлен обработчик события request:updated с отложенной перезагрузкой (500ms)
- Улучшен UX: модальное окно плавно закрывается, затем обновляется список
- Системное уведомление больше не появляется
2025-12-29 11:19:50 +03:00
087cff7901 fix: исключен approver из получателей уведомлений о решении
- Approver (тот кто принял решение) не получает уведомление о своем действии
- Исключены employee.id и approver_id из recipients при approve/reject
- Упрощен signal create_request_notifications (убран лишний запрос в БД)
- Теперь передается актуальный request_obj с установленным approver_id
2025-12-29 11:02:39 +03:00
3941b5c963 fix: уточнен селектор формы решения в request_process.html 2025-12-29 10:15:45 +03:00
eb70384928 � Мобильная оптимизация и новый тип заявления 'Отгул'
MOBILE FIXES:
- request-list.css: переделан мобильный layout с flexbox вместо grid
- page-header.css: оптимизирован padding/margin для мобильных экранов
- requestListHandler.js:
  * Добавлен AbortController с таймаутом (10/15 сек для мобильных)
  * Обработка offline/online событий сети
  * Информативные сообщения об ошибках (отсутствие интернета, таймаут)
  * Адаптивный Intersection Observer (rootMargin 200px для мобильных)
  * Лучшая обработка network failures

UI/UX:
- Скрыт счётчик на экранах < 480px
- Контент теперь отображается на всех разрешениях
- Исчезновение спиннера при ошибке сети
- Визуальное различие между ошибками загрузки

NEW FEATURE:
- Добавлен новый тип заявления 'Отгул' (day_off)
- Обновлена миграция 0009_alter_request_type
- Добавлен во все формы создания/редактирования
- Добавлен в фильтры списка
2025-12-29 10:00:32 +03:00
240f734c92 feat: requests detail view - stage 5: функциональность изменения статуса
- Добавлен обработчик для смены статуса заявления в JavaScript
- Интегрирована форма смены статуса в шаблон request_detail.html
- Форма видна только администраторам (can_process=True)
- Поддерживаются переходы: pending->approved/rejected, *->cancelled
- Добавлена валидация и подтверждение перед изменением статуса
- Используются API endpoints: /api/v1/requests/{id}/approve/, reject/, cancel/
- Автоматическое обновление содержимого модали после смены статуса
- Отображение статуса обновления (loading, success, error) в UI
2025-12-26 16:27:09 +03:00
48a96f495e feat: requests detail view - stage 4: функциональность комментариев
- Добавлена функция удаления комментариев в views_front.py
- Добавлена обработка удаления в URL routing
- Расширен JavaScript модуль для работы с добавлением/удалением комментариев
- Добавлена обработка формы добавления комментариев с JSON
- Улучшена обработка ошибок при добавлении комментария
- Добавлена инициализация emoji picker в модали
- Обновлен счетчик комментариев при добавлении/удалении
- Обновлены шаблоны для работы с данными из API
- Добавлена поддержка перезагрузки содержимого модали после каждого действия
2025-12-26 16:25:18 +03:00
003860f892 feat: requests detail view - stage 3: frontend разработка
Этап 3 разработки включает:

✅ Создан JavaScript модуль requestDetail.js:
  - Класс RequestDetailModal для управления модальным окном
  - Функция open(requestId) для открытия заявления
  - Функция loadData(requestId) для загрузки через AJAX
  - Обработка ошибок (404, 403)
  - Поддержка добавления комментариев в модали
  - initRequestDetailModal() для инициализации на странице список

✅ Добавлено модальное окно в request_list_full.html:
  - HTML структура модального окна requestDetailModal
  - ID контейнера для содержимого: requestDetailContent
  - Bootstrap 5 modal с размером modal-lg
  - Scrollable модаль для больших содержимо

✅ Обновлена инициализация скриптов:
  - Подключение модуля requestDetail.js
  - Инициализация RequestDetailModal при загрузке страницы
  - Сохранение экземпляра для использования на странице

✅ Интеграция с кликами:
  - Подготовка к интеграции с существующей логикой списка
  - Возможность открытия заявления из списка или по прямой ссылке

Готово для следующего этапа 4: Функциональность комментариев
2025-12-26 16:03:25 +03:00
77e34e6e2b feat(avatar): center and enlarge face in overlay guide
Improved human silhouette overlay to better center the face and make it larger for optimal FaceID recognition.

Changes:

Face positioning:
- Moved face center from cy=120 to cy=150 (centered vertically)
- Face now occupies middle of frame instead of upper third
- Eyes align with horizontal center line at y=150
- Better balance between head and body in frame

Face size increase:
- Increased head ellipse from rx=75,ry=95 to rx=90,ry=115
- ~20% larger face area for better recognition
- More prominent facial features in final crop
- Improved face-to-frame ratio (70-80% coverage)

Body proportions updated:
- Neck: y=250 to y=285 (moved down)
- Shoulders: y=230 to y=285 (centered below face)
- Torso extends to bottom of frame
- More natural body proportions

Guide lines adjusted:
- Eye-level line: y=120 → y=150 (center of frame)
- Shoulder line: y=230 → y=285 (below center)
- Vertical center line unchanged (x=150)

UI text updates:
- Instructions emphasize face centering
- 'Расположите глаза на центральной линии'
- 'Голова занимает верхнюю половину фото'
- Changed bottom label from 'Пояс' to 'Низ кадра'

Benefits:
✓ Face more prominent in photo (better for FaceID)
✓ Centered composition (professional appearance)
✓ Balanced head-to-body ratio
✓ Easier for users to align correctly
✓ Improved recognition accuracy
2025-12-18 10:19:47 +03:00
28feac732e feat(avatar): change crop ratio to 3:4 portrait and improve overlay sync
Changed avatar cropper aspect ratio from 1:1 to 3:4 (portrait) for better FaceID recognition.
Improved human silhouette overlay synchronization with crop box during all interactions.

Key changes:

Aspect ratio:
- Changed from 1:1 (square) to 3:4 (portrait)
- Output size: 600x800px (instead of 800x800px)
- Better suited for full body positioning (head, shoulders, torso)

SVG overlay improvements:
- Updated viewBox from 400x400 to 300x400 (3:4 proportions)
- Redesigned human silhouette for portrait format
- Added torso outline up to waist level
- Additional guide line for shoulders
- Better proportions for face/head/shoulders alignment

Synchronization enhancements:
- Added cropstart, cropmove, cropend event handlers
- Overlay now follows crop box during all interactions:
  ✓ Moving the crop box
  ✓ Resizing the crop box
  ✓ Zooming the image
  ✓ Initial positioning
- Real-time position updates using getCropBoxData()

UI/UX updates:
- Updated instructions: 'Совместите тело с зелёным контуром'
- Face should occupy upper third of frame
- Portrait format 3:4 mentioned in requirements
- Changed label from 'Плечи' to 'Пояс' (waist)
- Templates updated with new size requirements (600x800px)

Technical details:
- minCropBoxHeight: 266px (200 * 4/3 for aspect ratio)
- preserveAspectRatio: none (for proper stretching)
- Event handlers ensure overlay follows crop box smoothly
- No performance impact from additional event listeners

Benefits:
✓ Better for FaceID (full body context)
✓ Standard portrait photo format
✓ More professional appearance
✓ Consistent with ID photo standards
✓ Improved overlay visibility and accuracy
2025-12-18 10:15:00 +03:00
c3a82378ff feat(avatar): add human silhouette overlay to avatar cropper
Added visual guide with human body contour overlay to help users properly position their face for FaceID.

Features:
- SVG overlay with human silhouette (head, neck, shoulders)
- Green dashed outline (70-80% face coverage guidance)
- Guide lines (vertical center, horizontal eye level)
- Text labels ('Верх головы', 'Плечи')
- Toggle checkbox to show/hide overlay
- Real-time overlay positioning synchronized with crop box

Technical implementation:
- SVG viewBox 400x400 with preserveAspectRatio
- Dynamic positioning using getCropBoxData()
- Event handlers: ready, crop, zoom
- Overlay updates on cropper interactions
- Pointer-events: none for non-intrusive UI

UI/UX improvements:
- Clear visual guidance for face positioning
- Non-intrusive overlay (can be toggled off)
- Color: #00ff00 (green) for high visibility
- Opacity: 0.8 for overlay, 0.4 for guide lines
- Auto-shown by default, user can disable

Benefits:
✓ Reduces user errors in face positioning
✓ Ensures consistent photo quality for FaceID
✓ Visual feedback for proper head/shoulders alignment
✓ Improves user experience and reduces support requests
2025-12-18 10:03:34 +03:00
53f1eb8096 feat(avatar): implement avatar cropper with FaceID requirements
Implemented avatar cropping component for FaceID system integration.

Features:
- Image cropper using Cropper.js library
- FaceID requirements validation (70-80% face coverage, 600x600px min)
- Square crop area (1:1 aspect ratio)
- Output: 800x800px JPEG at 92% quality
- Real-time size indicator
- Integrated in 2 places: registration + profile editor

Components:
- avatarCropperHandler.js: Main cropper module with AvatarCropper class
- Modal UI with Bootstrap 5
- FaceID instructions and guidelines
- File validation (size, format, dimensions)

Integration:
- auth/register.html: Registration form with cropper
- employees/employee_form_personal.html: Profile editor with cropper
- employees/employee_form_scripts.html: Scripts updated

Technical details:
- CDN: Cropper.js v1.6.1
- Min input size: 600x600px
- Max file size: 10 MB
- Formats: JPG, PNG, GIF
- Output format: JPEG (optimized for face recognition)

Validation:
✓ File format validation
✓ File size validation (10 MB max)
✓ Image dimensions validation (600x600px min)
✓ Real-time crop size indicator
✓ Error handling with user-friendly messages

UI/UX:
- Modal window with instructions
- Live preview of cropped image
- Size indicator (green/red based on requirements)
- Clear FaceID guidelines for users
- Responsive layout
2025-12-18 09:56:50 +03:00
9d47fc0c5c feat: add employee dismissal UI and filter inactive employees
- Added dismissal form on employee profile page with permissions
- Shows warning when dismissing (LDAP deactivation notice)
- Inactive employees filtered by default in employee list (active=true)
- Team wheel now shows only active employees
- Auto-submit filter form on status change
- Added redirect to set active=true by default on first visit
2025-12-17 09:14:34 +03:00
b6f1e09ba5 fix: prevent double form submission in employee edit form
Problem:
- When editing employee profile, got duplicate PATCH requests
- One request returned 502, another 200 OK
- Error appeared in console but operation succeeded
- Classic double-submit race condition

Root Cause:
initEmployeeForm() added new addEventListener('submit') on every call.
If function was called twice (e.g., on tab navigation or re-render),
two event handlers would fire simultaneously, sending parallel requests.

Solution:
1. Check if form already initialized via data-attribute
2. Set form.dataset.employeeFormInitialized = 'true' flag
3. Skip re-initialization if already initialized
4. Return API object for already initialized forms

This ensures only ONE submit handler per form, preventing:
- Duplicate PATCH requests
- 502 errors from race conditions
- Confusing UX with errors that don't break functionality

Now form submits cleanly with single request.
2025-12-08 13:37:20 +03:00
5d2d0841c8 feat: add detailed logging for request creation errors
Backend (API):
- Added logging of user ID and request data keys before validation
- Log validation errors with full details before raising exception
- Helps diagnose 400 Bad Request errors from users

Frontend (JS):
- Added console logging of all FormData entries before submit
- Improved error message display with field-specific validation errors
- Shows structured error messages instead of generic 'HTTP 400'

This will help identify why some users get 400 errors when creating requests.
2025-12-08 12:29:44 +03:00
2543ce54c4 fix: improve recipient picker - load all users with avatars
RecipientPicker (заявления):
- Added pagination support to load ALL users (not just first page)
- Added avatar images from media URLs instead of base64
- Falls back to initials when no avatar available
- Loads users in batches of 100 per page

RecipientPickerHandler (чаты):
- Added pagination support for full user list
- Keeps existing avatar display logic
- Loads 100 users per page when not searching
- Limits to 20 results when searching

CSS improvements:
- Added styles for avatar images (.user-avatar-img)
- Added placeholder styles for initials
- Proper object-fit and border-radius for avatars
2025-12-08 12:09:32 +03:00
c3db56793a Фикс скролла 2025-12-08 11:21:31 +03:00
af89be505c feat: improve employee scroller UX - pause only at edges
Changed auto-scroller behavior for new employees:
- Removed pause on card hover - cards now only scale on hover (CSS)
- Added edge detection (20% zones on left/right sides)
- Scroller pauses ONLY when mouse is near container edges
- When paused at edge, centers nearest card for better visibility
- Mouse in center zone keeps auto-scroll running
- Smoother interaction - no interruption when browsing cards
2025-12-08 11:17:59 +03:00
1f811fde2a feat: add avatar zoom modal on click
- Added Bootstrap modal for enlarged avatar view
- Made avatar image clickable with cursor pointer
- Added modal trigger to both static and dynamically loaded avatars
- Modal displays full-size avatar centered with dark backdrop
- Close button positioned in top-right corner
2025-12-08 11:07:45 +03:00
ab166c9f4a новое уведомление 2025-12-08 07:56:53 +03:00
1e6f60ddfe feat: add paste and drag-and-drop support for chat files
- Added paste event handler to detect and handle files from clipboard
- Support for pasting images and files with Ctrl+V / Cmd+V
- Added drag-and-drop file upload functionality
- Visual feedback with green highlight during drag-over
- Supports multiple file paste/drop at once
- Prevents text insertion when files are pasted
- Uses clipboard items API for better file detection
- Fallback to clipboard files for broader compatibility
- Console logging for debugging paste/drop operations
2025-12-08 07:55:53 +03:00
54a3e46b3d fix: prevent calendar context menu from going off-screen
- Added smart positioning logic to keep menu within viewport bounds
- Menu now adjusts horizontal position if it would overflow right edge
- Menu moves above cursor if it would overflow bottom edge
- Changed position from absolute to fixed for consistent behavior
- Added 10px safety margins from all edges
- Menu is temporarily hidden during position calculation for smooth appearance
2025-12-05 17:01:33 +03:00
3e5b6917f0 feat: move calendar button from FAB to navbar
- Removed floating action button (FAB) for calendar
- Added calendar icon in navbar next to notification bell
- Calendar button only visible on mobile devices (d-lg-none)
- Fixed issue where FAB could overlap message send button
- Commented out calendar-fab CSS in all relevant files
2025-12-05 16:59:23 +03:00
c364d0635a fix(requests): сохраняем шапку таблицы при ajax загрузке, исправлен порядок, счетчик комментариев, preventDefault для Enter
- Добавлен отдельный контейнер для данных заявлений
- JS работает только с #reqListContent, шапка всегда видна
- Исправлен порядок заявлений (order_by)
- comments_count через annotate
- Исправлен обработчик формы комментария (preventDefault)
- Удаление начального спиннера после загрузки
2025-12-05 15:59:21 +03:00
c65558f5a2 fix: добавлен CSRF токен в форму комментариев AJAX
- Добавлена функция getCsrfToken() для получения токена из cookie
- Добавлен скрытый input с csrfmiddlewaretoken в каждую форму
- Исправлена отправка комментариев в AJAX-режиме
2025-12-05 15:02:51 +03:00
19757d2f98 feat: полная AJAX-загрузка списка заявлений с infinite scroll
- Обновлен requestListHandler.js: рендеринг в табличном формате
- Сохранена структура таблицы req-table-header + req-row
- Шаблон: удален SSR-цикл, сохранена шапка таблицы
- Добавлены данные пользователя в dataset (userId, canProcess)
- Включен useAjaxList режим в initRequestListPage
- Удалены старые CSS для req-item (не используются)
- Структура совместима с существующими стилями request-list.css
2025-12-05 15:00:36 +03:00
5d1fd340fb refactor: использование attachment_url из API + AJAX компонент для заявлений
- Шаблоны используют obj.attachment_url напрямую из API
- Удален templatetag absolute_url (больше не нужен)
- Упрощена проверка наличия вложения
- Создан requestListHandler.js для AJAX загрузки с infinite scroll
- Обновлен requestList.js для поддержки AJAX режима
- Подход аналогичен приложению документов
2025-12-05 14:53:52 +03:00
32f8800165 refactor: удалены неиспользуемые файлы заявлений
- Удалены шаблоны: my_requests.html, all_requests.html (старые)
- Удален JS компонент: requestListHandler.js (неиспользуемый)
- Обновлены views: my_requests() и all_requests() теперь редиректят на requests:request_list
- Обновлены все редиректы с requests_app:my_requests на requests:request_list
- Основная страница заявлений: /requests/ (request_list_full.html)
2025-12-05 14:33:15 +03:00
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