555 Commits

Author SHA1 Message Date
895c366122 fix: учет многодневных событий в индикаторах мини-календаря
- Изменена логика eventDays для учета всех дней многодневного события
- Теперь перебираются все дни от start до end включительно
- Добавлена обработка событий без end (однодневные)
- Сброс времени для корректного сравнения дат

Проблема: точки-индикаторы отображались только в день начала события.
Решение: добавление всех дней из диапазона [start, end] в Set eventDays.
2026-02-25 02:15:15 +03:00
32e0a123e3 fix: исправлена ошибка useCalendar вне CalendarProvider
- Убран вызов useCalendar() из AppShell (вызывался до создания CalendarProvider)
- Добавлен state currentSelectedCalendarId в AppShell
- selectedCalendarId передается через props и синхронизируется через useEffect
- onCalendarChange callback передается в Calendar -> CalendarCard
- CalendarCard синхронизирует selectedCalendarId с родительским компонентом

Проблема: useCalendar вызывался в AppShell до того, как CalendarProvider был создан.
Решение: передача selectedCalendarId через props вместо прямого вызова хука.
2026-02-25 02:13:21 +03:00
1935d18482 fix: добавлена проверка выбранного календаря в мини-календаре и исправлено отображение многодневных событий
- Добавлена проверка selectedCalendarId при создании события из мини-календаря
  * Теперь при попытке создать событие без выбранного календаря появляется предупреждение
  * selectedCalendarId передается в новое событие вместо null
  * Добавлен useCalendar() хук в AppShell для доступа к selectedCalendarId

- Исправлено отображение многодневных событий в ViewDayEventsModal
  * Изменена логика фильтрации событий: теперь проверяется диапазон [start, end]
  * Многодневные события отображаются для всех промежуточных дней, не только для начала/конца
  * Исправлена проблема, когда события не показывались в промежуточные дни

Проблема: в большом календаре проверка была, в мини-календаре - нет.
Решение: унификация логики создания события с проверкой выбранного календаря.
2026-02-25 02:10:52 +03:00
cd1d0f2a69 refactor: полная унификация всех модальных окон
Проведен аудит всех 6 модальных окон календаря и унифицированы стили.

Проблемы до рефакторинга:
- CalendarModal: z-[200] вместо z-[100], нет backdrop-blur-sm, нет max-h/overflow
- CalendarParticipantsModal: нет backdrop-blur-sm, нет max-h/overflow
- Другие модалы: лишние transition классы

Стандартный стиль для ВСЕХ модалов:

Overlay:
  fixed inset-0 z-[100] flex items-center justify-center
  bg-black/50 backdrop-blur-sm p-4

Контейнер:
  w-full max-w-[md/2xl] rounded-2xl bg-white p-6
  shadow-xl max-h-[90vh] overflow-y-auto

Унифицированные модалы:
✅ EventModal
✅ ViewEventDetailsModal
✅ ViewDayEventsModal
✅ CalendarModal
✅ CalendarParticipantsModal
✅ CalendarSubscriptionsModal

Результат:
- Единообразный внешний вид всех модалов
- Правильная иерархия z-index (все z-[100])
- Размытие фона везде одинаковое
- Прокрутка контента при переполнении
- Простой и понятный код без излишеств
2026-02-25 02:06:00 +03:00
ef58ad2bf6 style: унифицировать стили модальных окон календаря
Проблема: модальные окна имели разные стили overlay и z-index:
- EventModal: без backdrop-blur-sm, z-[100]
- ViewEventDetailsModal/ViewDayEventsModal: с backdrop-blur-sm, z-50
- CalendarSubscriptionsModal: без backdrop-blur-sm, z-[100]

Изменения:
- Все модальные окна теперь используют единый стиль overlay:
  * bg-black/50 backdrop-blur-sm (затемнение + размытие фона)
  * z-[100] (одинаковый z-index для всех)
  * p-4 (отступы для мобильных устройств)

- Добавлены плавные transitions:
  * Overlay: transition-all duration-200
  * Модальное окно: transition-all duration-300 ease-out

- Улучшен UX:
  * Единообразное визуальное оформление
  * Плавные переходы при открытии/закрытии
  * Красивый эффект размытия фона

Затронутые компоненты:
- EventModal.tsx
- ViewEventDetailsModal.tsx
- ViewDayEventsModal.tsx
- CalendarSubscriptionsModal.tsx
2026-02-25 02:01:34 +03:00
224cd66322 chore: добавить .next в .gitignore и удалить build-артефакты
- Добавлены Next.js артефакты в .gitignore:
  * .next/ - папка с dev/production builds
  * out/ - папка статического экспорта
  * .turbo/ - кэш Turbopack
  * *.tsbuildinfo - TypeScript build info
  * next-env.d.ts - автогенерируемые типы

- Удалены все .next файлы из git tracking

Эти файлы генерируются автоматически при разработке и сборке,
не должны быть в репозитории
2026-02-25 01:58:06 +03:00
d53414aedc fix: исправлена работа повторяющихся событий с django-scheduler
- Исправлен RuleSerializer для корректной конвертации params между форматами:
  * Frontend отправляет dict/JSON: {"byweekday": [0, 4], "interval": 1}
  * Backend сохраняет в формате django-scheduler: "byweekday:0,4;interval:1"
  * Добавлен универсальный парсер _parse_params_input() для всех форматов

- Добавлен UX в стиле Apple Calendar для еженедельных событий:
  * Авто-выбор дня начала при включении WEEKLY
  * Информационный баннер с датой первого события если начальный день не выбран
  * Защита от перезаписи выбора пользователя через useRef

- Рефакторинг и очистка кода:
  * Удалены все отладочные console.log() и print()
  * Улучшены docstrings с примерами
  * Добавлена константа VALID_FREQUENCIES

- Исправлена загрузка событий в режиме "Все события":
  * Убрана блокировка для selectedCalendarId === null
  * События и occurrences загружаются корректно для всех календарей

Closes: повторяющиеся события теперь генерируются только в выбранные дни недели
2026-02-25 01:55:51 +03:00
be70822945 feat(calendar): улучшенный UX - модалы просмотра перед действиями
Новые компоненты:
- ViewDayEventsModal: показывает все события в выбранный день
  - Список событий с временем и описанием
  - Кнопка "Создать событие на этот день"
  - Клик на событие → ViewEventDetailsModal

- ViewEventDetailsModal: детали события (read-only)
  - Все поля события (время, описание, участники)
  - Индикаторы повторяющихся событий �
  - Кнопки "Редактировать" и "Удалить"

Изменения в BigCalendar:
- handleSelectSlot: клик на дату → открывает ViewDayEventsModal вместо прямого создания
- handleSelectEvent: клик на событие → открывает ViewEventDetailsModal вместо прямого редактирования
- Добавлены обработчики переходов между модалами

Изменения в AppShell:
- handleOpenEventModal: логика маршрутизации модалов (дата/событие/создание)
- Добавлены обработчики для новых модалов
- sidebarEvents: состояние для передачи событий в ViewDayEventsModal
- Интеграция в CalendarCard для обоих календарей (desktop + mobile)

Преимущества UX:
- Пользователь видит контекст перед действием
- Предотвращение случайных дубликатов событий
- Логичный flow: Просмотр → Действие (create/edit/delete)
- Особенно полезно для повторяющихся событий
2026-02-25 01:04:23 +03:00
b490b4e82a refactor(calendar): удалена подсказка о времени повторений из EventModal 2026-02-25 00:54:00 +03:00
49ba212c28 feat(calendar): добавлена опция "Все события" по умолчанию
Frontend:
- Добавлена опция "� Все события" в выбор календаря (BigCalendar и AppShell)
- selectedCalendarId === null теперь показывает все события пользователя
- Изменена логика loadEvents: при null используется apiClient.getMyEvents()
- CalendarContext: по умолчанию selectedCalendarId === null (не выбирается первый календарь)
- UX улучшение: пользователь видит все свои события сразу при загрузке страницы
2026-02-25 00:52:49 +03:00
898ed6fec1 feat(calendar): доступ к событиям для участников + UX улучшения
Backend:
- Расширен get_queryset в ScheduleEventViewSet: теперь пользователь видит события где он участник (EventRelation), даже если не имеет доступа к календарю
- Добавлен action my-events для получения только событий участника
- Исправлена архитектурная проблема: участники событий теперь могут видеть свои события

Frontend:
- Добавлен метод apiClient.getMyEvents() для получения событий пользователя
- Добавлена подсказка в EventModal о логике начала/конца для повторяющихся событий
- Улучшен UX: пользователи понимают что начало/конец применяются ко всем повторениям
2026-02-25 00:47:45 +03:00
c22ccc3e96 fix(calendar): сброс состояния модала при закрытии
- Добавлен useEffect для очистки временных состояний при isOpen=false
- Сбрасываются: showAddParticipants, selectedEmployeeIds, pendingParticipantIds, searchQuery, availableEmployees
- Исправлена проблема с сохранением состояния между открытиями модала
2026-02-25 00:45:10 +03:00
16b11b5401 fix(calendar): timezone handling для datetime-local inputs
- Добавлена функция toLocalDateTimeString для корректной конвертации UTC в локальное время
- Исправлено отображение времени в модальном окне событий (было 21:00 UTC вместо 00:00 MSK)
- Упрощена логика datetime-local inputs (удалена сложная условная логика)
- Добавлен allDayAccessor в react-big-calendar для корректного отображения событий
- Унифицирован EventModal для обоих календарей (~718 строк удалено)
2026-02-25 00:38:54 +03:00
f09ae3996c Реализация системы schedule (django-scheduler) с тестовыми данными
- Добавлен CustomToolbar для BigCalendar со стрелками навигации
- Выпадающий список для выбора вида календаря
- Management command для создания тестовых пользователей и календарей
- Создано 3 тестовых пользователя (anna_ivanova, petr_petrov, maria_sidorova)
- Создано 5 календарей с 11 событиями
- Убраны подписки (они для старой системы calendar_app)
- Исправлены стили тулбара BigCalendar
- Модалы календаря рендерятся на корневом уровне AppShell
2026-02-24 20:24:39 +03:00
dd64d5f540 feat: replace old calendar with django-scheduler in frontend
- Removed legacy calendar with department_id/employee_id filters
- New CalendarCard loads calendars from django-scheduler API
- Events filtered by calendar ID instead of legacy params
- Removed unused SidebarCalendarOption type
2026-02-24 18:12:28 +03:00
01b35c3b83 fix: correct imports after frontend/Igor merge
- Fixed PHONE_FIELD import from _helpers module
- Fixed _normalize_phone import from employees.utils
2026-02-24 18:04:05 +03:00
64c0abf548 feat: update frontend to use django-scheduler API
- Updated API endpoints to /api/v1/schedule/
- Updated Calendar and CalendarEvent types for django-scheduler
- Added methods: getCalendars(), createCalendar(), createEvent()
- Changed field names: start_time -> start, end_time -> end
2026-02-24 18:00:55 +03:00
4f5d6767dc Merge branch 'frontend/Igor' into feature/django-scheduler-integration 2026-02-24 17:59:17 +03:00
f42e6ec7d0 docs: add frontend migration completion report 2026-02-24 17:55:32 +03:00
63b6fff1ef feat: migrate frontend to django-scheduler API
- Updated API endpoints from /api/v1/calendar/ to /api/v1/schedule/
- Removed subscriptions concept (django-scheduler uses simpler approach)
- Adapted CalendarSerializer to accept 'title' field for EUSRR compatibility
- All calendar visibility now stored in localStorage
- Removed deprecated subscribe/unsubscribe functions
2026-02-24 17:54:46 +03:00
d94e82d313 feat: add django-scheduler API v1 endpoints
New clean API alongside old calendar_app:

API endpoints:
- /api/v1/schedule/calendars/ - Calendar CRUD
- /api/v1/schedule/events/ - Event CRUD (with timezone)
- /api/v1/schedule/rules/ - rrule RFC 5545 rules
- /api/v1/schedule/occurrences/ - materialized recurrences
- /api/v1/schedule/relations/ - meeting attendees

Features:
- Timezone support (pytz)
- RFC 5545 rrule for recurring events
- EventRelation for meeting participants
- Clean, tested code (django-scheduler)
- Parallel work with old /api/v1/calendar/

Old API untouched, works as before.
Gradual migration approach (Strangler Fig Pattern).
2026-02-24 17:35:30 +03:00
f67e625c14 feat: add django-scheduler alongside calendar_app
- Install django-scheduler 0.12.0 (parallel to existing calendar_app)
- Add 'schedule' to INSTALLED_APPS
- Create integration plan documentation
- Old calendar_app remains untouched (works as before)
- New django-scheduler for gradual migration
- API v2 will be created next for testing

Related: Strangler Fig Pattern for clean code migration
2026-02-24 17:29:15 +03:00
a590acb762 feat(frontend): добавлен API клиент и восстановлен backend из master
- Создан frontend/src/lib/api.ts с 43 методами для всех API endpoint'ов
- Создан frontend/src/lib/permissions.ts для проверки прав доступа
- Исправлен URL в getChatMessagesAround: /messages/around/ → /messages-around/
- Исправлен параметр: message_id → around_id
- Восстановлен backend из ветки master для стабильности
- Удалены конфликтующие файлы Pages Router (src/pages, App.tsx, providers)
- Оставлена только чистая структура Next.js App Router
- Добавлена документация по миграции API v2
2026-02-24 15:40:50 +03:00
77d781ab75 Бета версия (80% функционала) 2026-02-24 14:13:26 +03:00
38ab1afa7c Альфа версия 2026-02-24 13:11:32 +03:00
e44bfd4755 fix: добавлено поле calendar_title в CalendarEventSerializer 2026-02-23 13:11:54 +03:00
10a1c210a3 fix: исправлено отображение календаря vs контекста в деталях события 2026-02-23 13:07:59 +03:00
abc7f96902 fix: добавлено отображение создателя и календаря в деталях события + исправлен calendarId string→number 2026-02-23 13:02:38 +03:00
705fa39052 - 2026-02-23 12:56:23 +03:00
8c3c4119af - 2026-02-23 12:56:11 +03:00
d31e8cd064 fix: can_user_edit теперь проверяет default_can_edit даже если есть подписка с can_edit=False 2026-02-23 12:47:17 +03:00
8825434b7a fix: can_user_edit теперь учитывает default_can_edit
Проблема: даже после включения default_can_edit=True обычные
пользователи не могли создавать события в календаре.

Причина: метод Calendar.can_user_edit() проверял только:
- is_superuser/is_staff
- is_owner()
- subscription.can_edit
НО НЕ проверял default_can_edit для случая когда подписки нет.

Решение: добавлена проверка default_can_edit после проверки подписки.
Теперь если подписки нет, но default_can_edit=True, пользователь
может редактировать.

Это позволяет создавать публичные календари, где ВСЕ пользователи
могут создавать события без явных подписок.
2026-02-23 12:38:14 +03:00
2c70730a17 fix: добавлено поле default_can_edit в CalendarWriteSerializer
Проблема: настройка 'Подписчики могут редактировать по умолчанию'
не сохранялась при создании/редактировании календаря.

Причина: поле default_can_edit отсутствовало в fields
CalendarWriteSerializer.

Решение: добавлено поле default_can_edit в список полей сериализатора.

Теперь можно включить эту настройку для глобального календаря,
и обычные пользователи смогут создавать события.
2026-02-23 12:33:27 +03:00
7a055c79cb fix: исправлены JS ошибки в календаре и emoji-picker
- Создана заглушка для calendarEventDragDrop.js с экспортом initCalendarEventDragDrop
- Закомментирован импорт несуществующего database.js в emoji-picker/index.js
- Исправлена ошибка 'does not provide an export named initCalendarEventDragDrop'
- Исправлена ошибка 404 для emoji-picker/database.js
2026-02-23 12:26:03 +03:00
ffd3e469a1 фикс календаря 2026-02-23 12:20:18 +03:00
523f09074d merge: resolve AppShell conflict with frontend/main 2026-02-20 13:23:43 +03:00
dfa8833e48 feat: update messaging UI and online status indicators 2026-02-20 13:22:40 +03:00
3f883bca85 Clean up corp.front directory and update frontend layout/AppShell 2026-02-20 11:08:19 +03:00
814c12ceeb feat: integrate Next.js frontend with Django backend
- Add complete Next.js 16 frontend with TypeScript and Tailwind CSS
- Implement API proxy route for CORS-free backend communication
- Create UserContext for global authentication state management
- Add authentication flow with JWT tokens
- Implement real data integration for posts and employees pages
- Add dynamic user avatars (with fallback to initials)
- Update API types to match backend Employee serializer
- Remove all hardcoded mock data
- Add route protection with automatic redirect to /login
- Configure Docker orchestration for full-stack setup
2026-02-19 15:57:42 +03:00
cb6d89dff2 feat: Улучшенный UI с компонентом AppShell
- Добавлен компонент AppShell с Header, Sidebar, Calendar
- Установлен lucide-react для современных иконок
- Обновлены все страницы: главная, login, employees, documents, etc
- Единый дизайн с PageHeader и переиспользуемыми элементами
- Улучшенная навигация с активными ссылками
- Responsive design с sticky элементами
- Градиентный фон и современные shadow/ring эффекты
2026-02-19 14:17:20 +03:00
3cd5bd4167 feat: Полная интеграция Next.js frontend с Docker orchestration
- Создан Next.js 16 frontend приложение с TypeScript и Tailwind
- Настроена Docker инфраструктура (docker-compose с 7 сервисами)
- Добавлен nginx reverse proxy для маршрутизации frontend/backend
- Реализован полный API client с JWT авторизацией
- Интегрированы страницы: login, register, feed, employees
- Переименована папка corp.front → frontend
- Исправлены проблемы с trailing slash в Django APPEND_SLASH
- Добавлена документация: DOCKER_ORCHESTRATION.md, INTEGRATION_GUIDE.md

Архитектура:
- nginx:80 → frontend:3000 (Next.js) + web:8000 (Django API)
- PostgreSQL 16 + Redis 7 для backend
- Celery worker + beat для фоновых задач
- JWT authentication через SimpleJWT
2026-02-19 13:51:19 +03:00
c39d73963b chore: удаление временных тестовых файлов оптимизации
- backend/test_message_optimization.py
- backend/test_refactored_notifications.py
2026-02-17 18:34:25 +03:00
5266e56676 feat(tools): добавление инструмента анализа DB запросов и package-lock
- backend/scripts/analyze_queries.py - автоматизированный анализ запросов
  * count_queries context manager для подсчета запросов
  * Тестирование ViewSet'ов с разными методами (list, retrieve, create)
  * Детальный вывод с количеством запросов на эндпоинт
  * Утилита для выявления N+1 проблем

- backend/package-lock.json - зафиксированы версии npm пакетов
  * sass@1.93.3 для компиляции CSS
  * Гарантирует идентичные сборки на разных машинах
2026-02-17 18:34:16 +03:00
d8a48d4c33 docs: добавление документации по тестированию и оптимизации
API Testing:
- docs/guides/API_TESTING_GUIDE.md - полное руководство по API тестированию
  * Использование Postman коллекции
  * Newman CLI интеграция
  * REST Client примеры
  * Pytest примеры с fixtures
- docs/reports/API_EMPLOYEES_COVERAGE.md - анализ покрытия эндпоинтов
  * Покрытие расширено с 23% до ~70%
  * Список протестированных и непокрытых эндпоинтов

Database Optimization:
- backend/docs/reports/DB_QUERIES_ANALYSIS.md - детальный анализ запросов к БД
  * 8 ViewSet'ов проанализированы
  * Найдены критические N+1 проблемы:
    - SkillViewSet.merge() делает 2N запросов в цикле
    - GroupViewSet.retrieve не использует prefetch_related
    - RegisterAPIView дважды проверяет email
  * Предложены оптимизации с raw SQL
  * Рейтинг текущего состояния: 4/5 звезд
2026-02-17 18:33:56 +03:00
c819196bb9 feat(testing): добавление комплексной инфраструктуры API тестирования
Postman коллекция (52 теста):
- Аутентификация (3): login, refresh, verify
- Сотрудники (11): CRUD, search, bulk operations, skills
- Отделы (3): list, create, retrieve
- Документы (3): list, create, retrieve
- Лента (5): posts CRUD с пагинацией
- Коммуникации (5): чаты и сообщения
- Календарь (3): события и подписки
- Заявки (3): requests CRUD
- Уведомления (3): list, mark_read, mark_all_read
- Действия сотрудников (3): actions CRUD
- Роли отделов (3): department_roles CRUD
- Продвинутые функции: группы (5), навыки (2)

Newman CLI интеграция:
- newman_test_results.txt - последний запуск (32 requests, 0 failures)
- newman-report.json - детальный JSON отчет

REST Client:
- api_tests.http - альтернатива Postman для VSCode REST Client

Документация:
- API_QUICKSTART.md - быстрый старт с примерами
- docs/guides/API_TESTING_GUIDE.md - полное руководство (см. след. коммит)
2026-02-17 18:33:36 +03:00
0c2ad449ef feat(docker): добавление вспомогательных файлов для Docker
- .dockerignore - исключение ненужных файлов при сборке образа
- .env.example - пример переменных окружения
- backend/eusrr_backend/urls.py - добавлена раздача статических файлов в DEBUG режиме
2026-02-17 18:33:20 +03:00
025f82147c feat(logging): внедрение современной системы логирования с ротацией
Добавлена полнофункциональная система логирования:

Структура логов (backend/logs/):
- all.log - все сообщения (DEBUG+)
- error.log - ошибки и критические события (ERROR+)
- debug.log - отладочная информация (DEBUG+)
- security.log - события безопасности (аутентификация, авторизация)
- requests.log - HTTP запросы с деталями производительности

Возможности:
- Ротация файлов (10MB макс. размер, 5 бэкапов)
- 3 форматтера (verbose, simple, json_style)
- Фильтр RequireDebugFalse для production
- Раздельное логирование Django, DRF, Channels, Celery

Документация:
- LOGGING_GUIDE.md - полное руководство (400+ строк)
- logging_examples.py - примеры использования для всех компонентов
2026-02-17 18:32:30 +03:00
98104fcded refactor(settings): упрощение конфигурации и удаление дубликатов
- Упрощена инициализация DATABASES (удален пустой словарь, использован .update())
- Удалена закомментированная секция AUTH_PASSWORD_VALIDATORS
- Консолидированы дублирующиеся настройки LDAP:
  * LDAP_UPN_SUFFIX (было 2 определения)
  * LDAP_USERS_BASE / LDAP_USER_BASE (было дублирование)
- Изменены дефолтные значения с robotail.local на eusrr.local
- Расширена конфигурация логирования (см. следующий коммит)
2026-02-17 18:31:20 +03:00
8aa6d6ec87 chore: удаление устаревших тестовых и временных файлов
- Удалены старые тестовые файлы (test_*.html, test_*.py)
- Удалены временные конфиги и скрипты (.env.test, test_reply.sh)
- Удалены устаревшие документы (CELERY_NEXT_STEPS.md, FIX_INTEGRATION.md)
- Очищена папка localcerts_backup
- Удалены выводы pytest (pytest_output.txt)
- Удалены конфигурационные остатки (.gitignore.ldap, corp-ca.pem)
2026-02-17 18:29:24 +03:00
fcf4bff3a9 fix: add ensure_ldap_disabled to 71 tests to prevent LDAP sync issues 2026-02-16 21:44:53 +03:00