17 Commits

Author SHA1 Message Date
Andrey Epifancev
99252d7a85 fix(web): синхронизация встроенного фронта с arm-web@test (025233f) (#115)
Перенесён диапазон arm-web 100fbfb..025233f (2 коммитов, 19 файлов набора
синхронизации) скриптом docs/scripts/sync-web.sh. После переноса web/ и
arm-web@test идентичны по набору. Коммиты arm-web:
- f868a92 Скан PDF с JBIG2 не рисовался: передать pdf.js wasmUrl и копировать wasm в сборку (#32)
- a8a6da0 Форматирование перед PR: ESLint + Prettier и npm run format (#29)

Co-Authored-By: sync-web.sh <noreply@aepif.ru>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:46:39 +04:00
Andrey Epifancev
2ea8a96f26 fix(web): синхронизация встроенного фронта с arm-web — панель файлов в контексте консолидации (#100)
Перенос в arm-core/web правок RSHB/arm-web PR #27 «Панель «Первичные документы»: рабочий стол
консолидации и загрузка в консолидацию» (ветка test, диапазон коммитов fc75edf..100fbfb), только src/:
- services/api/files.ts: filesPath, маршруты /consolidations/{cid}/legal-entities/{le}/files
  вместо ?consolidation_version_id=, которое ядро игнорирует;
- store/slices/consolidations/selectors.ts: текущая консолидация и статус версии (новый файл);
- widgets/FilesDrawer: рабочий стол консолидации, переключатель «Все документы организации»,
  подпись консолидации у файла (consolidationLabel.ts), загрузка только в версии «в работе»;
- widgets/Sidebar: перечитывание списка консолидаций после создания;
- типы api.ts и consolidations.ts, тесты.

Закрывает находку I-1 из #98: загрузка из встроенного фронта снова переводит версию
INITIATED -> DOCUMENTS_PROCESSING. Спеки, CLAUDE.md и scripts из arm-web не переносятся.
После переноса web/src и arm-web@test идентичны (diff -rq пуст).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 10:16:17 +04:00
Andrey Epifancev
f7cdd42c3d fix(web): синхронизация встроенного фронта с arm-web — ячейка ИНН в сводной ОСВ (#94)
Перенесён коммит arm-web 0f7a101 (#17): «Указать» только у строк без ИНН и без
связи с ЮЛ, «таблетка» с ИНН сопоставленного ЮЛ и пересопоставление («Связано»
в модалке), фильтр «только без ИНН» в колонке, баннер по макету [32-osv-no-inn],
поле counterparty_entity_inn в типах (бэкенд — arm-core #74). После переноса
исходники web/ и arm-web@test совпадают.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 22:38:22 +04:00
aep
fde860be7c Merge pull request 'web: legacy-сборка pdf.js — «Не удалось открыть PDF» в Яндекс Браузере (#90)' (#91) from feat/90-pdfjs-legacy into main
Reviewed-on: #91
2026-10-09 20:43:12 +03:00
Andrey Epifancev
d065fc31dd fix(web): обратный поток из контура — vitest 3.1.4, форма dev-входа в любой сборке (#92)
- vitest зафиксирован точно на 3.1.4: в зеркале npm банка нет 3.2.x, lock-файл не в git,
  каретка давала бы разные версии снаружи и внутри контура;
- DevLogin больше не выбирает форму по NODE_ENV: платформа всегда собирает фронт в production,
  а контур работает на dev-заглушке аутентификации, переменные сборки в пайплайне задать нельзя.
  Форма входа по email показывается всегда; заглушка «Вход выполняется через РАИСА» — только после
  404 «Not Found» от бэкенда (маршрута /dev/token нет → dev-эмитент выключен). Признак вынесен
  в isDevIssuerDisabled и покрыт тестами: 404 «пользователь не найден» остаётся ошибкой в форме.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 20:29:39 +04:00
Andrey Epifancev
ca6f2b7cc4 fix(web): legacy-сборка pdf.js — «Не удалось открыть PDF» в Яндекс Браузере (#90)
Копия исправления arm-web #22 (контур разворачивается из web/). Обычная сборка pdfjs-dist 5.7 в воркере
вызывает Uint8Array.prototype.toHex (Chromium 140+), в Яндекс Браузере getDocument падает
«a.toHex is not a function». PdfPages берёт модуль и воркер из pdfjs-dist/legacy/build через
widgets/DocumentReview/pdfjs.ts; регрессионный тест открывает PDF без Uint8Array.prototype.toHex.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 19:41:19 +04:00
Andrey Epifancev
d5118ba3a6 fix(web): перенос правки шаблонных строк во встроенный фронт (#80)
Правка arm-web 9e89b9f перенесена в arm-core/web: id и origin у строк и ячеек
формы, ключ достроенной строки code-<код>, отправка line_code, раскладка
formLayout. Без неё встроенный фронт отправлял бы line_id "null" (I-1, R-12).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 12:33:00 +04:00
maxim
c41c376ca5 clear from agent files in web 2026-10-08 18:26:17 +03:00
maxim
2a6383ec1c Merge web repo 2026-10-08 18:09:07 +03:00
Andrey Epifancev
4d719ecc0e fix(web): /admin — снятие неактивной роли, слияние ответов матрицы, защита от двойной отправки (T14.1–T14.6)
T14.1: неактивная роль, уже назначенная пользователю, больше не disabled в его Select — её можно снять
(новое назначение неактивной роли по-прежнему запрещено). T14.2: матрица подставляет роли из ответов
успешных PUT до перечитывания — при неудачном перечитывании на экране сохранённое, а не прежнее.
T14.3: исправлен комментарий useAsyncData (неудачный reload оставляет прежние данные). T14.4: ref-замок
от двойного POST в окне создания. T14.5: черновик матрицы — Map вместо объекта (ключи прототипа).
T14.6: группы меню в useMemo, чтобы memo(Section) работал.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 01:22:30 +04:00
Andrey Epifancev
d3c2f8ab1f feat(web): страница администратора — пользователи, роли, матрица прав
Маршрут /admin (вкладки «Пользователи» и «Матрица прав») и пункт «Система → Пользователи и роли» в меню;
без USERS_ADMIN в /me — экран «Нет доступа», таблицы не монтируются и запросов к /admin/* нет, пункт меню скрыт.

Почему без Redux: данные экрана нужны только ему, после каждой правки перечитываются с сервера — хватает
локального state и маленького хука useAsyncData (отбрасывает устаревшие ответы и ответы после ухода со страницы).
Клиент один — api/client.ts (Bearer из sessionStorage, ошибки сервера -> ApiError с кодом и текстом); ошибки
показываются через App.useApp().message (корень обёрнут в antd App). Экран показывает только серверное состояние:
при отказе (409 LAST_ADMIN и др.) — уведомление и перечитывание, матрица сохраняет роли по очереди.
РАИСА появится в auth/: токен даст SSO вместо dev-входа; этот экран и клиент не меняются.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 01:04:32 +04:00
Andrey Epifancev
d76ca570d8 fix(web): клиент — сетевые/не-JSON ошибки, ошибка входа в prod, мелочи (T13.1–T13.3, T13.5–T13.10)
apiFetch оборачивает сбой сети в ApiError(0, NETWORK) и не-JSON тело 2xx в ApiError(BAD_RESPONSE); AbortError пробрасывается как есть, пустое тело даёт undefined.
В production-ветке входа показываются ошибка загрузки профиля и кнопка «Повторить», форма dev-входа по-прежнему вырезается из бандла литералом process.env.NODE_ENV.
Мелочи: «Сессия истекла» при 401, trim и whitespace-правило для email, центрирование по 100svh, union-типы прав, срез хвостовых слэшей в API_BASE.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 00:39:59 +04:00
Andrey Epifancev
498450b763 feat(web): API-клиент с Bearer, dev-вход по email, загрузка /me
Токен хранится в sessionStorage (design D-9; без Redux): живёт до закрытия вкладки, все обращения к хранилищу в try/catch с запасным токеном в памяти.
apiFetch подставляет Bearer, на 401 сбрасывает токен и шлёт событие armka:unauthorized, ошибки разбирает по трём формам detail (строка / {code,message} / массив 422).
useMe не ходит в /me без токена и отбрасывает устаревшие ответы (флаг cancelled), AuthGate показывает вход, пока профиля нет.
Форма DevLogin вырезается из production-сборки по литералу process.env.NODE_ENV; через Config это не работает: process.env там заменён объектом REACT_APP_*.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 00:23:56 +04:00
Andrey Epifancev
353f3cd46a build: @biomejs/cli-linux-x64-musl — в optionalDependencies (EBADPLATFORM на macOS)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:29:02 +04:00
Andrey Epifancev
15a06a075d build: Dockerfile на python:3.11-slim без raisa_*, raisa-* npm в optionalDependencies
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:28:43 +04:00
Andrey Epifancev
8e1f423ad6 chore: вычищены остатки доменного кода, каркас проходит tsc/biome/rsbuild 2026-10-02 23:34:55 +04:00
Andrey Epifancev
ba922225ab chore: каркас из шаблона команды (DKB_ARMKA@ba172f8, доменный код удалён) 2026-10-02 23:15:37 +04:00