Appearance
Интеграторская консоль: обзор и маршрут просмотра
Обновлено: 18.05.2026 (K-ADM2 — переход на widget-based UI без сырого JSON/YAML в основном интерфейсе). Статус: wave K-ADM2 Slices 1-3 закрыты codex-ревью, Slices 4-6 задеплоены и ожидают финальный codex re-review (см. §6). Развёрнуто на dev.antroute.pro. Это уже не «пилотный YAML-конфигуратор», а виджетный интерфейс под целевого пользователя — интегратора, который не должен видеть raw технические форматы в основном UI. Адресат: интегратор-владелец конфигурации (Андрей или замещающий технолог), технолог-заказчик.
Описывает интеграторскую консоль AntRoute — место, куда заходит человек, отвечающий за заведение конкретного предприятия. С K-ADM2 интерфейс полностью на виджетах: список организаций, конструктор меню, визуальный preview под ролью, версии конфигурации с восстановлением, импорт Excel.
1. Что это и зачем
AntRoute — одна сборка для всех заказчиков. Под конкретное предприятие настройки (меню, экраны, вкладки, столбцы, словари) живут в DSL-конфигурации, к которой интегратор не обращается напрямую как к файлу. Вместо этого интеграторская консоль даёт:
- Dashboard — карточки всех организаций с реальными счётчиками (изделия / РМ / материалы / операции / спецификации / кооперации);
- Карточка организации — статус, последний импорт, активная версия DSL, действия (импорт, превью, меню, экраны, доступы, версии);
- Конструктор меню — виджетный редактор секций и пунктов с выпадающим списком разрешённых экранов;
- Превью под ролью — визуальный макет боковой панели и рабочего экрана для выбранной роли в выбранной организации;
- Версии — список карточек предыдущих публикаций с кнопкой «Восстановить» (forward-publish, не destructive);
- Импорт Excel — мастер из 5 шагов под канонический шаблон Кочарина с разбивкой по 7 организациям.
Цель: интегратор ведёт DSL без переразвёртывания кода, без правки YAML, без видения raw UUID и run_id в основном интерфейсе.
2. Доступ и роли
| Кто | Логин | Что видит в консоли |
|---|---|---|
Глобальный superuser с активным IntegratorAssignment (is_global=true) | vladimir | Все 17 организаций на Dashboard |
| Scoped integrator (грант на список организаций) | koc-vsp-integrator | Только разрешённые карточки (демо — одна KOC-4505016987) |
Superuser без IntegratorAssignment | — | Баннер «Нет integrator-доступа», действия скрыты |
| Admin/диспетчер предприятия | koc-{numCode}-admin | Раздел не доступен — RouteGuard ведёт его на обычный дашборд |
| Технолог / Мастер / Оператор | производственные роли | Консоль скрыта целиком |
Доступ к консоли — только под integrator-грантом (superuser + IntegratorAssignment). Это сознательный выбор: правка конфигурации и импорт данных — admin-level действия.
3. Что реально на экранах
3.1. Dashboard — список организаций
Адрес — /v/admin/integrator-tools. Карточки 17 организаций отсортированы по числу изделий (по убыванию) с tie-break по коду организации. Каждая карточка показывает:
- статус (Действует / Триал / Приостановлено / Неактивно);
- 6 счётчиков (Изделия / Рабочие места / Материалы / Операции / Спецификации / Кооперации);
- кнопку «Импорт Excel» (ссылка на shared platform-wide мастер).

Под scoped пользователем (koc-vsp-integrator) Dashboard показывает только разрешённые карточки с пояснительным баннером:

Под superuser без грантов — единый баннер «Нет integrator-доступа», без раскрытия каких-либо организаций (без leakage):

3.2. Карточка организации
Адрес — /v/admin/integrator-tools/:orgCode. Клик по любой карточке Dashboard либо прямой переход по коду организации. Содержит:
- заголовок и статус организации;
- блок «Наполненность данными» с теми же 6 счётчиками крупным шрифтом;
- «Последний импорт» (дата / тип / статус — без UUID);
- «Активная DSL-конфигурация» (номер версии / дата публикации / автор);
- блок «Действия»: Импорт Excel · Превью под ролью · Меню роли · Экраны · Роли и доступ · Версии конфига.

Для триал-организации статус-бейдж жёлтый:

Для организации без импортов и DSL — пустые состояния «Импорта ещё не было» и «Конфигурация ещё не создана»:

Если organization не в скоупе текущего integrator-гранта — generic banner «Организация не найдена или недоступна» (тот же текст что для несуществующих org — анти-leak):

Действия «Экраны» и «Роли и доступ» пока заглушки (информационный toast «появится в следующих фазах K-ADM2»). Остальные четыре действия (Импорт Excel, Превью, Меню, Версии) — рабочие routes.
3.3. Конструктор меню
Адрес — /v/admin/integrator-tools/:orgCode/menu. Виджетный редактор без YAML/JSON:
- секции — карточки с заголовком (id + русское название в Input), кнопки «↑/↓» для перестановки, «Пункт» (Add Item) и «Удалить»;
- пункты внутри секций — пары
screen → русское название, плюс «↑/↓» и «Удалить»; - «Добавить секцию» — модальное окно с двумя полями (latin id, русское название);
- «Добавить пункт» — модальное окно с Select разрешённых экранов (allowed_screens из effective_json.screens) и полем подписи;
- «Сохранить» — отправляет PATCH
/api/v1/integrator/orgs/<org_id>/menu/с заголовкомIf-Match, на успех показывает toast «Меню сохранено. Версия N» и обновляет ETag; - «Отменить изменения» — возвращает draft к серверному состоянию;
- 412 → жёлтый banner «Кто-то изменил конфигурацию параллельно. Обновите страницу.»

«Добавить секцию» открывает модальное окно с виджетной формой (а не raw JSON-редактор):

Сохранение переименованной секции:

Откат изменений:

Добавление пункта (Select разрешённых экранов):

Сервер хранит каждую публикацию как TenantConfigVersion с YAML snapshot, обновляет tc.published_yaml/draft_yaml/published_at. AuditLog payload_summary.diff фиксирует added_sections / removed_sections / total_sections / total_items.
3.4. Превью под ролью
Адрес — /v/admin/integrator-tools/:orgCode/preview. Визуальный макет: слева — карточка-эмулятор боковой панели, справа — макет рабочего экрана.
- Select роли с шестью вариантами (Технолог / Диспетчер / Конструктор / Поставщик / ОТК / Суперпользователь);
- по умолчанию — Технолог. При смене роли секции пересчитываются: если у роли в DSL есть свой
menu, показываем его; иначе fallback на глобальноеmenu.sections; - секции без пунктов — «Без пунктов»;
- информационный alert на каждой странице — «Это структурное превью, бизнес-данные не подтягиваются».

Смена роли на «Диспетчер»:

В этой версии нет ни YAML дампа, ни JSON-сниппетов, ни таблиц routes (всё это было в K-ADM1 viewer):

3.5. Версии конфигурации
Адрес — /v/admin/integrator-tools/:orgCode/versions. Список карточек предыдущих публикаций, новейшие сверху.
- каждая карточка — номер версии, дата, автор (display name / username), note;
- активная версия помечена зелёным бейджом «Текущая», её кнопка «Восстановить» disabled;
- «Восстановить» открывает confirm-модалку, при подтверждении: запрашивает свежий ETag со
/integrator/tenant-config/<org_id>/status/, шлёт POST/rollback/сversion_number,note,If-Match. Бэкенд использует forward-publish — старая версия не теряется, создаётся новая запись с содержимым выбранной; - успех → toast «Версия N восстановлена», список обновляется.

Restore-confirm:

3.6. Импорт Excel (Slice 6 polish)
Адрес — /v/admin/integrator-tools/imports/kocharin. Мастер из 5 шагов под канонический шаблон Кочарина (см. отдельный документ Импорт Excel). На финальном шаге успешного применения «Подробности» развёрнуты только за кнопкой «Подробнее (для разработчика)» — обычный пользователь не видит JSON-дамп, но при необходимости (например, для отладки) разработчик/integrator может его раскрыть.
Это не «скрыть JSON», а «не показывать его как primary surface». Тот же принцип везде в K-ADM2: raw технические форматы прячутся за дисклоузерами или вовсе отсутствуют, виджеты ведут пользователя.
4. Что отложено
Заглушки в карточке организации (информационный toast «появится в следующих фазах»):
- Редактор экранов (C5) — drag-drop layout виджетов внутри одного screen, выбор виджет-варианта (tabbed-card / crud-list / dashboard-grid), привязка к классификаторам;
- Матрица доступа (C6) — таблица ролей × секции/пункты/экраны с галочками «видит / редактирует».
Обе фазы предполагают тот же widget-first принцип: никаких YAML, только визуальные таблицы и формы. Появятся в следующих волнах K-ADM2.
5. Контракт «no JSON/YAML/CodeMirror в primary UI»
Это инвариант K-ADM2, прописанный в гейте codex-ревью и автоматических проверках walkthrough'ов:
- grep гейт —
frontend/src/features/integrator/v2/**не содержитJSON.stringify,<pre,CodeMirror,yamlв primary surface; - DOM гейт walkthrough — Playwright проверяет на каждой странице:
precount = 0,.cm-editorcount = 0, body innerText не содержитYAML/JSON/raw UUID-паттерн; - vitest гейт —
screen.queryByTestId('apply-summary-json')либо отсутствует, либо находится внутри неоткрытогоCollapse.
Это снимает прежнее замечание (K-ADM1 показывал YAML-редактор и таблицы routes с UUID в адресе) и приводит интерфейс к виджетному виду.
6. Источники истины
- Backend mutation —
antroute_backend/screens/views_integrator_menu.py(GET/PATCH menu),views_integrator.py(publish/rollback/versions),views_integrator_summary.py(Dashboard). - Frontend pages —
frontend/src/features/integrator/v2/*.tsx. - Walkthrough evidence —
docs/sprint_2026_may/active/K-ADM2-evidence/sliceN/summary.json(по каждой фазе overall_pass=true с machine_assertions). - Code review trail — K-ADM2 Iter1–Iter4 (methodology), Slice 1 Iter5+Iter6, Slice 2 Iter2, Slice 3 Iter2 — все ACCEPTED codex; Slice 4-6 ожидают финальный codex re-review.