12 Commits

Author SHA1 Message Date
lizerk
5700b53f13 feat: add department calendar bindings and cleanup dept permissions 2026-04-16 15:18:43 +03:00
lizerk
e3ba6ea925 refactor(ui): stabilize equipment deep links and qr flow 2026-04-12 16:09:38 +03:00
lizerk
db05b4fcdb refactor(frontend): align calendar and list UI 2026-04-11 20:44:16 +03:00
lizerk
601f0d58d8 chore(frontend): checkpoint current theme polish state 2026-04-11 19:30:22 +03:00
lizerk
111ddb2bfd Refactor modals and add chat message search 2026-04-03 19:53:31 +03:00
41e4238a84 feat: add document related, comments, tags, versions components and notifications integration 2026-03-02 12:37:55 +03:00
3635eb7759 feat: добавлена полная поддержка редактирования повторяющихся событий
- Реализована возможность конвертации повторяющегося события в обычное:
  * При снятии галочки 'Повторяющееся событие' rule_id сбрасывается в null
  * Событие становится одиночным, все occurrence исчезают

- Добавлен метод updateRule() в apiClient:
  * Позволяет обновлять существующие правила повторения
  * Изменения применяются ко всем occurrence события
  * Использует PUT запрос к /api/v1/schedule/rules/{id}/

- Исправлено использование repeatMode:
  * Заменен устаревший useCount на repeatMode ('until' | 'count' | 'forever')
  * Корректная обработка end_recurring_period только для режима 'until'

- Добавлена универсальная функция normalizeByweekday():
  * Решена проблема с разными форматами byweekday с backend:
    - Массив: [0, 4] ✓
    - Строка: '0,4' ✓
    - Число: 4 ✓
  * Функция используется во всех компонентах:
    - EventModal: авто-выбор дней, отображение кнопок, сохранение
    - ViewEventDetailsModal: отображение дней недели
  * Исправлены ошибки '.map is not a function' и '.includes is not a function'

- Улучшена логика handleSave() в EventModal:
  * Проверка необходимости сброса rule при снятии галочки
  * Разделение логики создания и обновления правил
  * Нормализация byweekday перед отправкой на backend

Closes: полная поддержка CRUD операций для повторяющихся событий
2026-02-25 03:02:59 +03:00
4988f1eee7 feat: детальное отображение параметров повторяющихся событий
Backend:
- Добавлено поле rule_data в EventSerializer
- get_rule_data() возвращает частоту, параметры и описание правила
- Использует rule.get_params() для получения распарсенных параметров

Frontend:
- Добавлены константы FREQUENCY_LABELS и WEEKDAY_LABELS для русификации
- Новый блок с детальной информацией о повторении в синем фоне
- Отображается частота (WEEKLY, MONTHLY и т.д.)
- Дни недели для еженедельных событий (ПН, ВТ, СР...)
- Количество повторений (count)
- Дата окончания повторения (end_recurring_period)
- Подсказка о невозможности редактирования параметров

Проблема: пользователь не видел детали повторяющихся событий.
Решение: красивый информационный блок с полной информацией о правиле.
2026-02-25 02:20:24 +03:00
89d471f525 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
1bc1883d94 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
544b7f3e89 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
93308b3267 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