Skip to content

fix(формы): нет 🔍 у reference:_users, вкладка с 404 закрывается (#1684) - #1918

Merged
ivanarama merged 1 commit into
ivanarama:mainfrom
AnnaSIceberg:fix/ref-card-users-tab-close
Oct 7, 2026
Merged

ivanarama merged 1 commit into
ivanarama:mainfrom
AnnaSIceberg:fix/ref-card-users-tab-close

Conversation

@AnnaSIceberg

@AnnaSIceberg AnnaSIceberg commented Oct 5, 2026 •

Copy link
Copy Markdown

Режим работы

  • Эксперимент: PR остаётся Draft, гипотеза или контракт ещё меняются
  • Поставка: результат проверен, текущий HEAD готов к конвейеру

Fixes #1684. Вариант 2 по решению владельца от 30.09.2026: обе половины одним PR. Сохранены обе обязательные проверки: карточка для _users не показывается, вкладка 404 закрывается, предупреждение о несохранённых изменениях у обычной формы не теряется. Ветка от main 66a9a104.

Что меняется

(а) Нет 🔍 у reference:_users

  • В internal/ui/templates.go добавлена шаблонная функция refHasCard(refEntity). Она возвращает false для пустой цели и для системной таблицы — по metadata.IsSystemRefTarget, это уже единственное место признака «системная цель ссылки» (Нет штатной связи учётной записи входа с элементом справочника Пользователи #1646).
  • В templates_managed.go обе ветки ссылочного поля добавляют её в условие кнопки «Открыть карточку»: и реквизит объекта ($f.RefEntity), и реквизит формы (attrRefEntity $attr.TypeRef). Остальные условия кнопки, включая ref_card_button: false формы, не меняются.

(б) Вкладка вне протокола закрытия закрывается

  • Было. closeTab всегда спрашивал фрейм через obRequestFrameClose и ждал ответа до 135 с. Текстовая 404 (http.Error из refOpenRedirect) не загружает ui.js и не ответит никогда. Через 135 с — «Форма не закрыта», вкладка остаётся и переживает перезагрузку.
  • Маркер участия. ui.js, рядом с обработчиком obRequestFormClose, объявляет window.obAnswersFrameClose = true — страница явно говорит, что отвечает на запрос закрытия.
  • Решение оболочки. В tabs.go новая frameIsSilent(t): «молчащая» страница — полностью загруженная, того же источника, не managed-форма и без маркера. Её closeTab закрывает без запроса.
  • Несохранённые изменения. Если оболочка всё же считает вкладку грязной, остаётся прежнее подтверждение, как у legacy-ветки без моста.
  • Всё остальное — прежним путём. Загрузка, managed-форма (в том числе без маркера), чужой источник и любая ошибка доступа к фрейму идут через запрос к фрейму (fail-closed).

Проверки

  • internal/ui/ref_card_users_test.go — YAML проекта → project.Load → production GET /ui/document/Заказ/new: у reference:Клиент кнопка есть, у reference:_users — нет. Тот же тест проверяет, что адрес кнопки GET /ui/_ref-open/_users/<uuid> отвечает 404 без ui.js, то есть это страница вне протокола. Если она когда-нибудь станет страницей приложения, тест скажет, где смотреть.
  • internal/ui/static/tabs_behavior_test.js (через TestTabsBehaviorInNode, на HTML оболочки из публичного маршрута), новый случай «a page outside the close protocol closes without a frame request»:
    • страница вне протокола закрывается без запроса, подтверждения и alert;
    • грязная — спрашивает, отказ оставляет вкладку, согласие закрывает;
    • загружающаяся и managed-страница без маркера идут обычным запросом.
  • Изменение модели теста. Фальшивый фрейм по умолчанию теперь — обычная страница приложения с ui.js (obAnswersFrameClose: true), новый хелпер markPlainPage моделирует 404. Без этого все прежние тесты описывали бы «молчащие» страницы. Их ожидания — запрос к фрейму, отсутствие второго подтверждения, alert при недоступной финализации — не менялись и проходят.
  • Мутации: без IsSystemRefTarget в refHasCard краснеет «у reference:_users нарисована кнопка»; без frameIsSilent в closeTab — «silent page kept the tab».
  • go vet ./internal/ui, go test -count=1 ./internal/ui/ — ok (Windows, Node 24 в PATH).
  • CI на HEAD 621931b7 зелёный целиком: https://github.com/ivanarama/onebase/actions/runs/37343560088

Пересечения

Сверено по pulls/N/files: internal/ui/templates.go и internal/ui/templates_managed.go трогают и #1915 (мой, ref_card_button_admin_only), #1914 (маршрут #1759) и #1871.

🤖 Generated with Claude Code

Вариант 2 по ivanarama#1684 — обе половины одним PR.

(а) Кнопка «Открыть карточку» рисовалась у любого ссылочного поля, в
том числе у reference:_users (ivanarama#1646): карточки у системной таблицы нет,
/ui/_ref-open/_users/<id> отвечает 404. Шаблонная функция refHasCard
опирается на metadata.IsSystemRefTarget — единственное место признака
системной цели; обе ветки ссылочного поля (реквизит объекта и реквизит
формы) её спрашивают.

(б) Оболочка вкладок спрашивала у фрейма разрешение на закрытие и ждала
ответа до 135 с; текстовая 404 в протоколе не участвует, и вкладка не
закрывалась, переживая перезагрузку. ui.js теперь объявляет участие
(window.obAnswersFrameClose); загруженная страница того же источника,
которая не managed-форма и без маркера, закрывается сразу. Несохранённое
по-прежнему спрашивается, загрузка, managed-форма и ошибка доступа идут
прежним путём запроса (fail-closed).

Fixes ivanarama#1684

Generated-with: Claude Code
@AnnaSIceberg
AnnaSIceberg marked this pull request as ready for review October 5, 2026 17:04
@ivanarama

Copy link
Copy Markdown
Owner

Ревью. (круг 1)
Reviewed-SHA: 621931b
Outcome-Label: reviewed
Что меняется: Независимое ревью Codex PR #1918 на HEAD 621931b. refHasCard исключает системную цель _users из обеих веток кнопки карточки управляемой формы. Маркер obAnswersFrameClose позволяет оболочке сразу закрывать загруженную страницу ошибки без протокола закрытия; подтверждение несохранённых изменений и lifecycle управляемых форм сохранены. Блокирующих и неблокирующих находок нет..
Проверено: Проверены все 6 файлов diff относительно main 66a9a10 и окружающие обработчики, шаблоны и протокол закрытия. Detached worktree закреплён на точном HEAD из lease; git diff --check прошёл, рабочее дерево чистое.; go build ./... — успешно (Go 1.26.6, macOS).; go test -count=1 -json ./internal/ui ./internal/app ./internal/api — успешно. Проверены UI и потребители, которые создают и монтируют HTTP frontend. Node v22.21.0 добавлен в PATH прогона; JavaScript-проверки выполнены.; TestRefCardButtonHiddenForSystemUsers прошёл через project.Load и публичные HTTP-маршруты: кнопка обычной ссылки остаётся, у reference:_users отсутствует, адрес карточки возвращает текстовую 404. TestManagedRefCardButtonThroughHTTP подтвердил прежнюю настройку ref_card_button: false.; TestTabsBehaviorInNode: 28 сценариев, 28 passed, 0 failed, 0 skipped. Новый сценарий подтвердил закрытие страницы вне протокола, отмену и согласие при dirty, сохранение запросов к loading/managed-фреймам. TestFormCloseBridgeBehavior прошёл, включая подтверждение несохранённых изменений обычной формы.; go vet ./internal/ui ./internal/app ./internal/api — успешно.; go run ./cmd/onebase check --project examples/trade — успешно: ошибок не найдено.; Все обязательные CI точного HEAD успешны: build, lint, postgres-integration, vuln, smoke, e2e, test-windows, launcher-webview-build; run 37343560088. Локальные PostgreSQL-подтесты пропущены без TEST_DATABASE_URL; браузерный layout-тест пропущен без своего окружения. Эти ограничения не затрагивают выполненные регрессии данного PR..
Блокирующее: нет.
Хвост:
—
Вердикт: годится к мержу.

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result publication claimed.

@ivanarama ivanarama added the reviewed Ревью: блокирующего нет — ждёт ship label Oct 5, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result committed.

@ivanarama ivanarama added the ship Иван одобрил мерж: пастух может вливать label Oct 7, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: MERGE transaction reserved.

@ivanarama
ivanarama merged commit d93ddaf into ivanarama:main Oct 7, 2026
13 checks passed
@ivanarama ivanarama removed the ship Иван одобрил мерж: пастух может вливать label Oct 7, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: MERGE cleanup completed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

reviewed Ревью: блокирующего нет — ждёт ship

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Лупа у поля reference:_users открывает вкладку, которую нельзя закрыть

2 participants