Repository navigation
fix(формы): нет 🔍 у reference:_users, вкладка с 404 закрывается (#1684) - #1918
Conversation
Вариант 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
|
Ревью. (круг 1) |
|
PromptPilot service marker: REVIEW result publication claimed. |
|
PromptPilot service marker: REVIEW result committed. |
|
PromptPilot service marker: MERGE transaction reserved. |
|
PromptPilot service marker: MERGE cleanup completed. |
Режим работы
Fixes #1684. Вариант 2 по решению владельца от 30.09.2026: обе половины одним PR. Сохранены обе обязательные проверки: карточка для
_usersне показывается, вкладка 404 закрывается, предупреждение о несохранённых изменениях у обычной формы не теряется. Ветка отmain66a9a104.Что меняется
(а) Нет 🔍 у
reference:_usersinternal/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закрывает без запроса.Проверки
internal/ui/ref_card_users_test.go— YAML проекта →project.Load→ productionGET /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»: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).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.(not (hideRefCard $ctx $el))из feat(формы): кнопка «Открыть карточку» только администратору — ref_card_button_admin_only (#1876) #1915 плюс(refHasCard …)отсюда. Шаблонную функцию здесь сознательно поставил рядом сattrRefEntity, а не туда, где feat(формы): кнопка «Открыть карточку» только администратору — ref_card_button_admin_only (#1876) #1915 добавляетhideRefCard. Кто из двух вольётся вторым, тот сводит свежийmainи перепроверяет обе пары тестов.ui.jsиtabs.goс открытыми PR не пересекаются.🤖 Generated with Claude Code