Repository navigation
feat(ux): lay out forms and record pages for the work done on them (#2369) - #2380
Merged
Merged
Conversation
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAnq1x2jshPfejjsKuT
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAnq1x2jshPfejjsKuT
Contact email and phone on the first tab, lead name row and score hint, Send Email description, highlights that carry what the title does not (product picker shows List Price), case type on the internal form and an SLA-breached banner instead of a red "No", article body first with vote counts and outcome messages, attendee hint on the activity actions, and related panels open by default. Row 10 is measured only. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAnq1x2jshPfejjsKuT
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
Author
席位核对Verdict: ACCEPT ·
Generated by Claude Code |
This was referenced Oct 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Irene · project thread
Part of #2369
Clause-②: no
Metadata-protocol: none
维护者速读
src/service/actions/knowledge_article.actions.ts(投票返回 outcome 与计数、outcomeMessages)、src/service/pages/case_detail.page.ts(SLA 横幅)、下方"第 10 行:方案"一节。pnpm exec vitest run test/forms-record-pages-2369.test.ts test/knowledge-feedback.test.ts test/case-create-form-narrowing.test.ts,预期全部通过;或以 admin 打开一篇已发布文章点 Helpful,应提示 "Thanks — recorded as helpful. Helpful: 1 · Not helpful: 0."。What changes
Every row was measured on
origin/main(52083a5, then 66c63cb after #2368) in the console on 18.2.0 before it was edited. Screenshots, before and after, are in the project files (issue-2369/, 81 files) and named in the report on #2369.src/sales/views/contact.view.ts: the Identity section is three columns and holds Email and Phone beside the names and Account. Create with a bad email now shows the error on the Identity tab.test/forms-record-pages-2369.test.tsrow 1src/sales/views/lead.view.ts: Contact Information is three columns, Last Name no longerspan: 'full'.crm_lead.ratingdescription (andhelpin four packs) says a blank score is filled from the email domain, phone, title, industry and company size (computeRating,lead.hook.ts:175).SendEmailAction.descriptionnow says the email goes to this contact's address and is logged on the timeline (four packs). The button text and naming the actual address are platform: the dialog's button is always "Confirm" with no metadata key, and the dialog is opened without the row, so a{{ record.full_name }}hole prints raw anddefaultFromRowfills nothing (measured from the header and the list ⋮)._line-item-price-fill.ts, which readscrm_product.list_price, the field #2324 phase 1 keeps).crm_product.highlightFieldsnow leads with category and List Price, so the product picker on a line item shows the price while you pick.highlightFieldson account (number, tier, health, revenue, owner), quote (account, deal, status, total, expiry), product, campaign (type, status, start, budget) and knowledge article (category, status, audience, both vote counts). A related list without its own columns shows the child's highlightFields, sorelatedListColumnspin the old columns oncrm_account.parent_account,crm_quote.crm_account/crm_contact/crm_opportunityandcrm_knowledge_article.related_to_case.src/service/views/case.view.ts:typeon the internal form (the public form is #2368's, unchanged).case_detail.page.ts:is_sla_violatedleaves the strip (the strip draws any false boolean as red "× No"); arecord:alertcase_sla_breached(severity error, four locales) shows only when the flag is true. On the Details tab the flag is a neutral circle.case-create-form-narrowing(typeis creator-authorable; the flag keeps the list column, the alert and the details)knowledge_article.object.ts: thecontentgroup is first; counts in the strip. The vote body returnsoutcome(recorded/changed/already) and the article'shelpful/notHelpfultally;outcomeMessagessay which, with the counts (four packs). A button that stays marked after you vote is platform: header buttons cannot read per-reader state.test/knowledge-feedback.test.ts"returns the outcome and the article's tally for the toast"defaultFromRowonattendee_contactsfilled nothing, and on a case the field-bound param inheriteddependsOn("Select crm_account first"). The body already adds the contact or lead it runs on as an attendee (activity-actions.ts:325-332), so the picker'shelpTextnow says so (three actions, four packs). The UTC date + time split (Marketing S9) is untouched, waiting on the platform.opportunity_detail.page.ts:allowMultiple: true, Quotes, Products and Open Taskscollapsed: false.case_detail.page.ts: Open Taskscollapsed: false.Docs: the in-app manual, en and zh:
src/docs/crm_sales_activities(who is added as an attendee),src/docs/crm_sales_leads(blank score),src/service/docs/crm_service_cases(the SLA banner),src/service/docs/crm_service_knowledge(the vote message and counts, body first). Changeset (patch).Row 10: options, measured
Measured three ways on 18.2.0: as shipped, and in a scratch copy of this branch booted fresh with the six titles (account, product, quote, campaign, case, article) set to A the name alone, then B name first (
Globex Industries · ACC-000002). Nothing in this PR changes a title.What depends on the stored title:
@objectstack/core's lookup matcher tries, in order:id, the lookup'sdisplayField, the target'snameField, thenname,title,label,full_name,email,username, and refuses more than one hit asreference_ambiguous. A bare number (ACC-000012) matches nothing.ACC-000012 - Probe Solo(today's title, every old export)Probe Solo(the name)Probe Solo · ACC-000012ACC-000012reference_ambiguous$searchreadssearchableFields(name and number), so it finds the record by name or number under all three. The global search hit shows the title.display_title).record_linkresult screens all show the title (the spec'srecord_link: "by its display name").product_title, mirrored byproduct.hook.ts), price-book entries name themselves from it, quote success messages use it, andquote.hook.tswrites "QTE-… - name" into its freeze refusals itself. Stored rows keep the old value untilscripts/backfill-record-titles.tsandscripts/backfill-line-product-title.tsrun.stored-record-titles,hooks-runtime-sales,line-item-product-title,quote-accepted-lookups).ACC-000002 - Globex Ind…: the name is cuthighlightFieldslead with it)Globex Industries, subtitleAccount Number: ACC-000002quote.hooktextGlobex Industries · ACC-00…: the number is cut, not the namequote.hooktext; drop the number fromhighlightFieldsor the picker subtitle repeats itRecommendation: B for all six, because it keeps every title unique, so an export still re-imports, and it still puts the name first. A fits
crm_accountalone, whose name is unique. Either way, the backfills must run on upgrade and old export files stop matching. A platform change would remove that cost: letting the import matcher also try an object's unique fields (the autonumber), which would make A safe everywhere.Platform findings (for the seat to file)
{{ record.x }}indescriptionandhelpTextprints raw, anddefaultFromRowfills nothing (rows 3, 8).actionDialog.confirm) with no metadata key (row 3).Tests
New:
test/forms-record-pages-2369.test.ts(18 tests, rows 1–9). With the source atorigin/mainall 18 are red.test/knowledge-feedback.test.tsadds one case, red with the action file atorigin/main.test/case-create-form-narrowing.test.tsgains adetail.alertsurface andtypein the creator set. The lead-conversion and import tests that name form sections pass.Verification
pnpm verify at 252b0e6 (after merging #2370's c362ccd)
The first full run, before the merge, was red on one lint warning: campaign highlights that held both dates hid the "schedule" group from the detail page (
field-group-shadowed). The campaign strip is type, status, start date and budget now. CI runs coverage and e2e.Ablations
Console readings on the dev boot (18.2.0, Playwright)
🤖 Generated with Claude Code
https://claude.ai/code/session_01J8VVAnq1x2jshPfejjsKuT