11 Commits

Author SHA1 Message Date
047e1c1763 feat(frontend): Phase 2 & 3 - Client-side document processing utilities
Created comprehensive document processing library:

� src/lib/document-utils/
├── processor.ts - Главный процессор (интеллектуальная обработка)
├── ocr.ts - OCR через Tesseract.js (rus+eng)
├── pdf.ts - PDF операции (extract text, thumbnail, split, merge, rotate)
├── docx.ts - DOCX извлечение текста (mammoth.js)
├── image.ts - Image processing (compress, crop, rotate, thumbnail)
└── index.ts - Экспорты

Возможности:
✅ Автоматическое определение типа файла
✅ OCR для изображений (client-side, не нагружает сервер)
✅ Извлечение текста из PDF и DOCX
✅ Сжатие изображений перед загрузкой
✅ Генерация thumbnails
✅ Progress callbacks для UI
✅ Оценка времени обработки
✅ TypeScript типы для всех функций

Преимущества перед server-side:
- Моментальная обратная связь
- Не нагружает backend
- Приватность (файл не уходит на сервер до загрузки)
- Экономия трафика (сжатие до отправки)
- Можно показать preview extracted text ДО upload

Phase 2 & 3 Complete!
2026-02-28 09:29:47 +03:00
1a86e61341 fix(documents): Упрощение формы загрузки - удалены document_type и tags
- Убраны поля document_type и tags из DocumentUploadForm
- Обновлен API клиент: createDocument и updateDocument без этих полей
- Обновлены TypeScript типы в api.ts
- Убраны document_type и tags из отображения в documents/page.tsx
- Форма теперь принимает только: title, description, file
2026-02-28 08:45:47 +03:00
12f3b7b81b feat(frontend): Полная интеграция документов с django-filer и django-fsm
- Установлены библиотеки: react-dropzone, react-pdf, pdfjs-dist, react-file-icon, @tanstack/react-table
- Обновлены TypeScript типы для Document + FSM статусы
- Обновлен API клиент: CRUD операции, FSM переходы, подтверждение прочтения
- Создан DocumentUploadForm: drag&drop загрузка файлов
- Создан DocumentStatusBadge: цветные статусы (draft/in_review/approved/published/archived/rejected)
- Создан DocumentWorkflowButtons: динамические кнопки FSM переходов
- Создан DocumentPreview: встроенный просмотр PDF с навигацией
- Создан DocumentAcknowledgement: подтверждение прочтения с комментариями
- Обновлена страница documents: фильтры, модальные окна, workflow UI
- Добавлена документация в DOCUMENTS_IMPLEMENTATION.md
2026-02-28 08:30:11 +03:00
98a5095b0e feat: реализована система уведомлений на фронтенде
Frontend:
- Установлен Sonner для toast уведомлений
- Создан Service Worker (public/sw.js) для Web Push
- Реализован хук useWebPush для управления подписками
- Добавлены утилиты Web Push (lib/push.ts)
- Создан компонент NotificationCenter с UI
- Интегрирован в AppShell (header desktop + mobile)
- Добавлен Toaster в Providers

API методы:
- getVapidPublicKey() - получение VAPID ключа
- subscribePush() - создание подписки
- unsubscribePush() - удаление подписки
- getPushSubscriptions() - список подписок

Возможности:
- � Web Push (работают даже когда вкладка закрыта)
- � NotificationCenter с badge и историей
- � Toast уведомления (Sonner)
- ⚙️ Настройки push подписок
- � Респонсивный дизайн

Документация: frontend/NOTIFICATIONS_IMPLEMENTATION.md
2026-02-27 19:39:13 +03:00
8fd44448f4 feat: Add frontend integration for watson search API
Backend:
- Created REST API endpoint /api/v1/search/
- Added SearchResultSerializer and SearchResponseSerializer
- Implemented search_api_view with model formatters (employee, department, post, request, chat, message, event)
- Registered search endpoint in api/v1/urls.py
- Added permission check for requests (HR can see all, users only their own)

Frontend:
- Added SearchResponse, SearchResult, SearchModelType types
- Added apiClient.search() method in lib/api.ts
- Completely rewrote search/page.tsx:
  * Single API call instead of 6 parallel requests
  * Cleaner UI with icons for each result type
  * Real-time search with loading states
  * Meta information display (email, phone, status, etc.)
  * Better performance and UX

Benefits:
- Frontend: 220 lines → 178 lines (19% reduction)
- 1 API request instead of 6 (83% less network calls)
- Server-side full-text search via watson (better relevance)
- Unified search results with metadata

Testing:
- API endpoint verified at /api/v1/search/?q=test
- Returns JSON with query, results, counts, total
- Requires authentication (IsAuthenticated decorator)
2026-02-27 18:27:36 +03:00
eb77ff9291 feat: add auto token refresh and increase refresh token lifetime to 90 days 2026-02-27 16:35:36 +03:00
a9f435ae79 пермишен 2026-02-27 12:06:40 +03:00
8a083f6f67 fix: Исправлена система автоотметки прочитанных сообщений
- Удалено поле last_read_at из ChatReadState, используется только last_read_message FK
- Исправлена логика автоотметки: отмечается последнее ЗАГРУЖЕННОЕ сообщение, а не последнее в чате
- Убран вызов chat.mark_read() при WebSocket open_chat (отмечал последнее в чате вместо загруженного)
- Добавлен signal для мониторинга изменений ChatReadState
- Исправлена логика скролла: убран автоскролл при дозагрузке вниз
- Добавлена проверка разрывов при WebSocket сообщениях (предотвращает пропуск сообщений)
- Реализована автоотметка WebSocket сообщений (только если пользователь внизу)
- Асимметричная загрузка: 24 контекста + 6 новых сообщений
- Добавлен ScrollableMessageList компонент для корректной работы скролла
- Миграции: 0028 (удаление last_read_at), 0029 (индекс на last_read_message)
2026-02-25 20:29:00 +03:00
318e22ca80 Добавлена функция создания новых чатов
- Добавлены API методы в api.ts:
  * getChats, getChat, createChat
  * getChatMessages, sendMessage, sendMessageWithFiles
  * updateMessage, deleteMessage
  * markChatAsRead, togglePinChat, toggleChatNotifications

- Создан компонент NewChatModal:
  * Поиск и выбор сотрудников
  * Поддержка приватных и групповых чатов
  * Автоматическое название для групп

- Интегрирована кнопка 'Новый чат' в Chatscope UI
- При создании чата автоматически открывается диалог
2026-02-25 12:30:16 +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
9908c11c62 feat(calendar): доступ к событиям для участников + UX улучшения
Backend:
- Расширен get_queryset в ScheduleEventViewSet: теперь пользователь видит события где он участник (EventRelation), даже если не имеет доступа к календарю
- Добавлен action my-events для получения только событий участника
- Исправлена архитектурная проблема: участники событий теперь могут видеть свои события

Frontend:
- Добавлен метод apiClient.getMyEvents() для получения событий пользователя
- Добавлена подсказка в EventModal о логике начала/конца для повторяющихся событий
- Улучшен UX: пользователи понимают что начало/конец применяются ко всем повторениям
2026-02-25 00:47:45 +03:00