lizerk
deca5a84ff
Polish mobile chat layout spacing
2026-04-03 12:42:41 +03:00
lizerk
5100851481
Polish mobile chat composer layout
2026-04-03 12:25:01 +03:00
lizerk
4fb637e153
Improve message composer behavior
2026-04-03 12:21:50 +03:00
lizerk
c1a1c31494
Refine message composer styling
2026-04-03 12:06:21 +03:00
lizerk
c4253f6a78
Add readers avatars and emoji picker
2026-04-03 11:43:29 +03:00
lizerk
2b1e13632a
Simplify chat actions dropdown
2026-04-03 11:19:02 +03:00
lizerk
6bd66e7855
Refine chat actions menu styling
2026-04-03 11:16:26 +03:00
lizerk
c5f53cca15
Improve chat delivery states and read details
2026-04-03 11:10:14 +03:00
lizerk
d1aea28be9
Add websocket read receipts and AsyncAPI docs
2026-04-03 09:55:10 +03:00
lizerk
0a71d6a3c9
Read notifications for opened chat
2026-04-02 11:26:09 +03:00
lizerk
9989c98af4
Finish user detail page refactor
2026-04-02 10:32:24 +03:00
lizerk
e3e195c89d
Add user detail components and hook
2026-04-02 10:22:46 +03:00
lizerk
4b179fe801
Sync active chat on shared websocket
2026-04-02 10:20:46 +03:00
lizerk
f03887aa00
Suppress chat notifications for active websocket session
2026-04-02 10:05:20 +03:00
lizerk
a0cda94107
refactor frontend api facade
2026-04-01 20:56:08 +03:00
lizerk
fac1b54e63
Главное изменение этой итерации: orchestration страницы оборудования вынесен из page.tsx в новый hook useEquipmentPage.ts. В hook теперь живут загрузка данных, фильтры, пагинация, create/edit, операции перевода/списания/обслуживания, комментарии, загрузка деталей строки и вся производная логика. Сама страница стала значительно чище и ближе к роли render-слоя, без нетипичной архитектуры и без изменения UI-поведения.
2026-04-01 19:03:04 +03:00
lizerk
d1574dfd31
Refactor equipment page orchestration
2026-04-01 18:39:10 +03:00
lizerk
19f6f660b0
refactor: extract procurement page orchestration into hook
...
- add useProcurementPage hook for loading, filters, modal state and workflow actions
- keep procurement page focused on rendering and section layout
- preserve existing UI behavior while removing API/state orchestration from page component
- frontend checks: eslint clean, TypeScript typecheck clean
- backend checks: realtime websocket smoke, procurement and equipment suites green
2026-04-01 16:34:04 +03:00
lizerk
0a80eb86cf
refactor: extract shared utils/components, split requests page data into hook
...
- Create frontend/src/lib/shared/ with formatters, userUtils, paginationUtils
(formatDate, formatMoney, displayUserName, userProfileLink, extractNextPage, loadAllPages)
- Create frontend/src/components/shared/SearchableSelect.tsx
(SearchableSelectSingle + SearchableSelectMulti, replaces 3 inline copies)
- Extract requests page data/state/actions into useRequestsPage hook
(requests/page.tsx: 1580 → ~280 lines of pure JSX)
- Replace duplicated helpers in equipment/page.tsx with shared imports
(~80 lines removed: formatDate, formatMoney, displayUserName, extractNextPage,
loadAllPages, inline SearchableSelectSingle)
- Replace duplicated helpers in procurement/page.tsx with shared imports
(~90 lines removed: fmt, money, displayUserName, extractNextPage,
inline departments loader, inline SearchableSelectSingle)
- 609 backend tests pass, TypeScript typecheck clean, ESLint clean
2026-04-01 16:21:02 +03:00
lizerk
3ca4d108b6
refactor: split monolithic api.ts into domain modules, extract AppShell calendar/mobile concerns
...
- Split frontend/src/lib/api.ts (2042 lines) into 12 focused domain modules:
client.ts (base HTTP/auth), calendar.ts, documents.ts, employees.ts,
equipment.ts, feed.ts, messages.ts, notifications.ts, procurement.ts,
requests.ts, utils.ts, and index.ts barrel that preserves all existing imports
- Extract calendar modal state from AppShell into useCalendarModals hook
- Extract CalendarModals and MobileDrawers into components/layout/
- AppShell: 745 → 460 lines, focused on layout concerns only
- Fix setState-in-effect lint error with startTransition pattern
- Stabilize notifications memo to prevent unnecessary re-renders
- Fix flaky WS test: handle CancelledError in channels-testing cleanup
- All 609 backend tests pass, TypeScript typecheck clean, ESLint clean
2026-04-01 15:56:10 +03:00
lizerk
a8ec339565
Refactor chat settings and tighten frontend types
2026-04-01 15:31:19 +03:00
lizerk
613248905e
Refactor realtime sync and message UI
2026-04-01 15:20:27 +03:00
lizerk
0833eb13ce
Исправил падение старта ASGI/JWT: перестроил порядок инициализации Django в ASGI и убрал ранние Django/SimpleJWT импорты из middleware.
2026-03-31 20:28:18 +03:00
lizerk
6ee32111db
chore: configure vscode flake8 and commit lint cleanup
2026-03-31 19:17:56 +03:00
lizerk
2815efe069
chore: finalize backend lint cleanup
2026-03-31 17:53:29 +03:00
lizerk
9edb44502a
Harden backend warnings and lint policy
2026-03-31 17:19:59 +03:00
lizerk
3d4416615e
.
2026-03-31 17:09:29 +03:00
lizerk
3f59f8ebb9
Add backend OpenAPI docs and clean test suite
2026-03-31 17:05:31 +03:00
lizerk
7a4ed36b6e
chore(git): stop tracking backend env file
2026-03-30 19:18:06 +03:00
lizerk
676a419a35
feat(frontend): enhance requests page with improved SwipeApprovalMode component
2026-03-30 11:52:27 +03:00
lizerk
c8f78cb0b6
фикс зависимостей
2026-03-30 04:48:04 +03:00
lizerk
f88d90230b
refactor: clean architecture, align tests to current API contracts, all tests green [deploy-ready]
2026-03-30 04:27:18 +03:00
lizerk
bdd6e48c46
фикс мидлвари на регу
2026-03-30 02:23:59 +03:00
lizerk
260f684c75
удалил тест
2026-03-30 02:17:46 +03:00
lizerk
825726e0f0
chore: commit remaining backend and frontend changes, remove legacy test, add missing migrations
2026-03-30 02:17:28 +03:00
lizerk
2031872461
refactor(procurement): approval logic now fully driven by ApprovalRoute table (priority+min_amount), removed hardcoded steps, all workflow is DB-driven; tests and migrations updated
2026-03-30 02:16:29 +03:00
lizerk
c61b62969a
Мелкие правки: обновлены serializers.py и views.py для procurement
2026-03-27 18:14:55 +03:00
lizerk
decbadf47b
Унификация сортировки и визуального стиля карточек: добавлены селекторы сортировки и убраны лишние тени в разделах заявлений, закупок и оборудования
2026-03-27 18:11:14 +03:00
lizerk
3a2d05a64d
feat(requests): улучшены фильтры по датам, исправлена логика фильтрации, добавлена инструкция по тестированию
2026-03-27 14:57:31 +03:00
lizerk
ca4f7c2f86
Merge branch 'feature/ldap-orm-integration'
2026-03-27 12:05:25 +03:00
lizerk
540e295ef4
feat: Fix LDAP DN bugs + add password management in admin
...
BREAKING CHANGES:
- Department.head автоматически очищается при увольнении руководителя
- LDAP managedBy атрибут очищается при увольнении
Fixes:
- DN не перемещался при восстановлении сотрудника (Dismissed → Users)
- DN не перемещался при увольнении сотрудника без отделов
- Ошибка при увольнении из множественных отделов (двойной modify_dn)
- Неправильные URL patterns для LDAP моделей в админке
- Двойное кодирование DN в редиректе смены пароля
Features:
- Добавлен метод _ensure_ldap_dn_location для гарантированного перемещения DN
- Добавлена проверка already_there в sync_department_member_to_ldap
- Управление паролями LDAP пользователей через админку:
* Кнопка смены пароля в карточке пользователя
* Массовое действие смены пароля
* Автосинхронизация с Django password hash
- Автоочистка Department.head и LDAP managedBy при увольнении руководителя
- Добавлены методы set_password() и change_password() в LdapUser
Changed:
- Переписан сигнал sync_department_member_to_ldap с реальными методами
- Исправлены URL patterns: ldap_* → employees_*
2026-03-23 20:32:39 +03:00
lizerk
1a3d533c1d
админка +
2026-03-22 13:55:26 +03:00
lizerk
4c5ea98743
админка+
2026-03-20 14:44:41 +03:00
lizerk
2688df46ef
Fix: Wrap all unsafe int() conversions with try/except
...
Fixed ValueError-prone int() calls in:
- communications/api/viewsets.py (4 places: limit, before_limit, after_limit)
- notifications/api/views.py (2 places: page, page_size)
- api/v1/search/views.py (1 place: limit)
- api/v1/procurement/views.py (1 place: quantity)
Also updated audit script to exclude .venv/
2026-03-20 09:10:33 +03:00
lizerk
2ef43e7177
Feature: Add code quality audit tools and safe helpers
...
- Created CODE_QUALITY_CHECKLIST.md with comprehensive guide
- Added audit_code_patterns.sh for automated code scanning
- Created common/request_utils.py with safe_int(), safe_bool(), etc.
- Fixed unsafe request.data access in notifications/api/views.py
- Updated ldap_password_mixin.py docstring with safe example
Audit found and documented:
- 10 unsafe request.data['key'] accesses
- 8+ unsafe int() conversions without try/except
- Multiple .strip() calls without None checks
2026-03-20 09:06:55 +03:00
lizerk
2943299c08
Fix: Handle both dict and QueryDict in perform_update
...
DRF request.data is dict for JSON but QueryDict for form data.
Use hasattr check to call .dict() only when available, otherwise
use dict() constructor for plain dicts.
2026-03-20 09:01:54 +03:00
lizerk
55d0bcf906
Feature: Add validation warnings for missing fields in sync actions
...
Both LDAP→Django and Django→LDAP sync actions now check for missing
required fields (name, email, employeeNumber) and display warnings
before syncing. Shows up to 10 warnings per action.
2026-03-20 02:35:29 +03:00
lizerk
7a770165f9
Fix: Correct get_action_choices signature (use BLANK_CHOICE_DASH)
2026-03-20 02:31:11 +03:00
lizerk
130dafc5a2
Fix: Replace delete_selected with LDAP-safe custom action
...
Django's delete_selected passes queryset with dn__in filter that
ldapdb doesn't support. Custom delete_selected_ldap reads DNs from
POST and deletes objects one by one. Also hides standard delete_selected
from action choices.
2026-03-20 02:20:42 +03:00
lizerk
6050cd9d26
Fix: Handle ldapdb unsupported dn__in lookup in admin delete
...
- Override get_deleted_objects() in LdapUserAdmin to avoid dn__in
queryset that ldapdb doesn't support
- Also fix phone_number UNIQUE constraint in LDAP auth backend
2026-03-20 02:18:39 +03:00