- Изменена логика eventDays для учета всех дней многодневного события
- Теперь перебираются все дни от start до end включительно
- Добавлена обработка событий без end (однодневные)
- Сброс времени для корректного сравнения дат
Проблема: точки-индикаторы отображались только в день начала события.
Решение: добавление всех дней из диапазона [start, end] в Set eventDays.
- Убран вызов useCalendar() из AppShell (вызывался до создания CalendarProvider)
- Добавлен state currentSelectedCalendarId в AppShell
- selectedCalendarId передается через props и синхронизируется через useEffect
- onCalendarChange callback передается в Calendar -> CalendarCard
- CalendarCard синхронизирует selectedCalendarId с родительским компонентом
Проблема: useCalendar вызывался в AppShell до того, как CalendarProvider был создан.
Решение: передача selectedCalendarId через props вместо прямого вызова хука.
- Добавлена проверка selectedCalendarId при создании события из мини-календаря
* Теперь при попытке создать событие без выбранного календаря появляется предупреждение
* selectedCalendarId передается в новое событие вместо null
* Добавлен useCalendar() хук в AppShell для доступа к selectedCalendarId
- Исправлено отображение многодневных событий в ViewDayEventsModal
* Изменена логика фильтрации событий: теперь проверяется диапазон [start, end]
* Многодневные события отображаются для всех промежуточных дней, не только для начала/конца
* Исправлена проблема, когда события не показывались в промежуточные дни
Проблема: в большом календаре проверка была, в мини-календаре - нет.
Решение: унификация логики создания события с проверкой выбранного календаря.
- Добавлены Next.js артефакты в .gitignore:
* .next/ - папка с dev/production builds
* out/ - папка статического экспорта
* .turbo/ - кэш Turbopack
* *.tsbuildinfo - TypeScript build info
* next-env.d.ts - автогенерируемые типы
- Удалены все .next файлы из git tracking
Эти файлы генерируются автоматически при разработке и сборке,
не должны быть в репозитории
- Исправлен 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: повторяющиеся события теперь генерируются только в выбранные дни недели
Новые компоненты:
- ViewDayEventsModal: показывает все события в выбранный день
- Список событий с временем и описанием
- Кнопка "Создать событие на этот день"
- Клик на событие → ViewEventDetailsModal
- ViewEventDetailsModal: детали события (read-only)
- Все поля события (время, описание, участники)
- Индикаторы повторяющихся событий �
- Кнопки "Редактировать" и "Удалить"
Изменения в BigCalendar:
- handleSelectSlot: клик на дату → открывает ViewDayEventsModal вместо прямого создания
- handleSelectEvent: клик на событие → открывает ViewEventDetailsModal вместо прямого редактирования
- Добавлены обработчики переходов между модалами
Изменения в AppShell:
- handleOpenEventModal: логика маршрутизации модалов (дата/событие/создание)
- Добавлены обработчики для новых модалов
- sidebarEvents: состояние для передачи событий в ViewDayEventsModal
- Интеграция в CalendarCard для обоих календарей (desktop + mobile)
Преимущества UX:
- Пользователь видит контекст перед действием
- Предотвращение случайных дубликатов событий
- Логичный flow: Просмотр → Действие (create/edit/delete)
- Особенно полезно для повторяющихся событий
Frontend:
- Добавлена опция "� Все события" в выбор календаря (BigCalendar и AppShell)
- selectedCalendarId === null теперь показывает все события пользователя
- Изменена логика loadEvents: при null используется apiClient.getMyEvents()
- CalendarContext: по умолчанию selectedCalendarId === null (не выбирается первый календарь)
- UX улучшение: пользователь видит все свои события сразу при загрузке страницы
Backend:
- Расширен get_queryset в ScheduleEventViewSet: теперь пользователь видит события где он участник (EventRelation), даже если не имеет доступа к календарю
- Добавлен action my-events для получения только событий участника
- Исправлена архитектурная проблема: участники событий теперь могут видеть свои события
Frontend:
- Добавлен метод apiClient.getMyEvents() для получения событий пользователя
- Добавлена подсказка в EventModal о логике начала/конца для повторяющихся событий
- Улучшен UX: пользователи понимают что начало/конец применяются ко всем повторениям
- Добавлен useEffect для очистки временных состояний при isOpen=false
- Сбрасываются: showAddParticipants, selectedEmployeeIds, pendingParticipantIds, searchQuery, availableEmployees
- Исправлена проблема с сохранением состояния между открытиями модала
- Добавлена функция toLocalDateTimeString для корректной конвертации UTC в локальное время
- Исправлено отображение времени в модальном окне событий (было 21:00 UTC вместо 00:00 MSK)
- Упрощена логика datetime-local inputs (удалена сложная условная логика)
- Добавлен allDayAccessor в react-big-calendar для корректного отображения событий
- Унифицирован EventModal для обоих календарей (~718 строк удалено)
- Добавлен CustomToolbar для BigCalendar со стрелками навигации
- Выпадающий список для выбора вида календаря
- Management command для создания тестовых пользователей и календарей
- Создано 3 тестовых пользователя (anna_ivanova, petr_petrov, maria_sidorova)
- Создано 5 календарей с 11 событиями
- Убраны подписки (они для старой системы calendar_app)
- Исправлены стили тулбара BigCalendar
- Модалы календаря рендерятся на корневом уровне AppShell
- 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
- 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
- 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
- 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
- Создан 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
Проблема: даже после включения 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, пользователь
может редактировать.
Это позволяет создавать публичные календари, где ВСЕ пользователи
могут создавать события без явных подписок.
Проблема: настройка 'Подписчики могут редактировать по умолчанию'
не сохранялась при создании/редактировании календаря.
Причина: поле default_can_edit отсутствовало в fields
CalendarWriteSerializer.
Решение: добавлено поле default_can_edit в список полей сериализатора.
Теперь можно включить эту настройку для глобального календаря,
и обычные пользователи смогут создавать события.
- Создана заглушка для calendarEventDragDrop.js с экспортом initCalendarEventDragDrop
- Закомментирован импорт несуществующего database.js в emoji-picker/index.js
- Исправлена ошибка 'does not provide an export named initCalendarEventDragDrop'
- Исправлена ошибка 404 для emoji-picker/database.js
- 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
- Добавлен компонент AppShell с Header, Sidebar, Calendar
- Установлен lucide-react для современных иконок
- Обновлены все страницы: главная, login, employees, documents, etc
- Единый дизайн с PageHeader и переиспользуемыми элементами
- Улучшенная навигация с активными ссылками
- Responsive design с sticky элементами
- Градиентный фон и современные shadow/ring эффекты
- 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
* Гарантирует идентичные сборки на разных машинах
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 звезд
Добавлена полнофункциональная система логирования:
Структура логов (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 - примеры использования для всех компонентов