Repository navigation
test(app-shell): pin the invite outcome toast and the copy-invite-link dialog on Setup → Invitations - #28182
Conversation
…g on Setup → Invitations Drive the served sys_invitation through the real ObjectView: a link_only invite answer toasts the declared created/no-mail copy and never "sent", a sent answer keeps "Invitation sent to …", and the pending row's Copy Invite Link runs the server action and copies the answered acceptUrl from the result dialog; an accepted row offers no copy action. Claude-Session: https://claude.ai/code/session_01L9qibvGisaRusgvzEwJxoQ Co-Authored-By: Claude <noreply@anthropic.com>
|
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN 席位核对ACCEPT · seat 席位意见:服务端修复(#27843,PR #27902)已经到达控制台。没有配置邮件服务时,邀请提示说「已创建、没有发出邮件、请用 Copy Invite Link」,不再说「已发送」。待处理的邀请在行菜单和抽屉头部都有 Copy Invite Link,复制出的是控制台挂载下的接受页链接。本 PR 只加一个测试把这条链路钉住,不改产品代码,符合裁决 E(6512831254)。
|
…-tk3ydm Claude-Session: https://claude.ai/code/session_01L9qibvGisaRusgvzEwJxoQ Co-Authored-By: Claude <noreply@anthropic.com>
|
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN 席位核对ACCEPT · seat The new head only merges |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 41095296286 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Requested by Tesla · project thread
Fixes #27797
Refs #27521 (row 6)
Clause-②: no
Metadata-protocol: none
维护者速读
outcomeby mail delivery andsys_invitationgains a servercopy_invitation_linkaction that answers the accept URL (ruling E on #27797) #27843,PR feat(plugin-auth): an invite answers its mail-delivery outcome, and sys_invitation gains copy_invitation_link #27902)已在 main 上;按裁决 E,本卡只做现场复测和一个 ObjectView 钉子。现场复测确认修复已经到达控制台,管理员在无邮件部署上不再被告知「已发送」,也能把链接手动交给受邀人。@object-ui/app-shell的src下,不随任何包发布)。回滚即 revert 本 PR。ui/packages/app-shell/src/views/ObjectView.inviteOutcome-27797.test.tsx(唯一文件;先看 fixture 里的FEATURES与copy_invitation_link的visible)。pnpm --dir ui exec vitest run packages/app-shell/src/views/ObjectView.inviteOutcome-27797.test.tsx,预期 4 passed。What changes
One new pin,
ui/packages/app-shell/src/views/ObjectView.inviteOutcome-27797.test.tsx, besideObjectView.inviteFeedback-11817.test.tsx. It mounts the realObjectViewoversys_invitationas a stock boot serves it, with the real action runner, console action runtime, param dialog, result dialog and toaster (sonner not mocked):link_onlyinvite answer: the toast is the declared "Invitation created for ada@example.com. Mail is not configured on this server, so no email went out. Use Copy Invite Link on the invitation to share it." and no "Invitation sent" text appears.sentanswer: "Invitation sent to ada@example.com", and no "no email went out" text./api/v1/actions/sys_invitation/copy_invitation_linknaming the row id. The result dialog titled "Invite link" shows the answeredacceptUrlas text, and its copy button writes exactly that URL to the clipboard.No ui code changed. Per ruling E (comment 6512831254), the server carries the fix (
outcomeMessages, and atype: 'script'action answering into aresultDialogwithformat: 'text'). The live re-measure below shows that fix reaching the console unchanged, so no renderer change was needed.Tests
43ba24a6(pnpm --dir ui exec vitest run packages/app-shell/src/views/ObjectView.inviteOutcome-27797.test.tsx, underscripts/pm/os-verify-lock.sh, VERDICT command-exit 0).cloudManaged. Every served invite predicate readsfeatures.cloudManaged != true, an absent key fails the predicate closed, and a stock boot servescloudManaged: false. The fixture now carries the served value, with a comment saying why.Acceptance notes
examples/app-showcase(pnpm dev -- --fresh, seeded admin, desktop 1440×900, Chromium),origin/main10fc9bf1, full workspace build plus console build from this tree:log): the invite door answersoutcome: "link_only". Toast: "Invitation created for ada.nomail@example.com. Mail is not configured on this server, so no email went out. Use Copy Invite Link on the invitation to share it." Resend toast: "Invitation renewed for … no email went out …". Row menu: Cancel Invitation, Resend Invitation, Copy Invite Link. The detail drawer's record header shows Copy Invite Link. The copy dialog showshttp://localhost:38797/_console/accept-invitation/ID, the copy button puts that same string on the clipboard, and the URL answers 200text/html(the accept page under the console mount).OS_EMAIL_PROVIDER=smtpagainst a local SMTP sink. The door answersoutcome: "sent", and the toast reads "Invitation sent to grace.mail@example.com". The accept URL in the delivered mail (quoted-printable decoded) equals the copy dialog's URL byte for byte.CopyButtoninActionResultDialog.tsx, used by thetext/secret/qrcode/code-list/jsonformats) is icon-only and has no accessible name. In the live dialog itsaria-labeland text are both empty, so a screen reader announces an unnamed button. This affects everyresultDialog, not only invitations. Dedupe words: result dialog copy button accessible name, CopyButton aria-label, resultDialog copy icon.skip-changesetis right for this diff: it is tests only, in@object-ui/app-shell("private": true,fileslistsdist, and the builtdisthas 0 hits for the test against a positive control of 8 forActionResultDialog). The seat applies the label after its own check.Verification
Derived gates (dispatch-gates --commands, 24) — all exit 0 at 43ba24a; --ran: 24 run, 0 NOT-MEASURED, 0 UNRUN
Outside the derivation
Generated by Claude Code