You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Record page: a section whose fields are all empty folds like the others instead of showing dashes #12618
Walked on objectui main 8415d9f11, the opportunity record Demo Deal 01 at 1024 px: the Classification section shows two filled fields and "Show 4 empty fields"; the Sales Process section "Show 7 empty fields"; but "Deal Narrative" renders four rows "CUSTOMER BACKGROUND —, PROJECT BACKGROUND —, RISK ANALYSIS —, PAYMENT TERMS —" and "Notes & Next Steps" renders "DESCRIPTION —, NEXT STEP —": a section with no filled field prints every empty field as a dash instead of folding them. The lead record does the same for Address and Conversion.
Target
A section whose fields are all empty renders its heading and one line "N empty fields" with the same "Show" affordance the mixed sections use; the dashes go.
When every section of a tab is empty, the tab shows one line for the whole tab.
Edit mode is unchanged: all fields are editable.
File surface
packages/plugin-detail/src/DetailView.tsx (section rendering, the empty-field fold), tests beside.
Acceptance
Tests: a section with all-empty fields renders the fold line and no "—"; a mixed section renders as today.
Screenshots of the opportunity record's Details tab at 1280 px.
pnpm --filter @object-ui/plugin-detail test green.
Evidence
Screenshots on the temporary branch claude/console-home-login-design-20261016 of objectstack-ai/objectui (commit b72c97985, never merged): hotcrm-opportunity-record.jpg.
Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 walk of HotCRM's core pages as a user: objectui main 8415d9f11, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, the maintainer's browser pane at 1024 × 768 (en). The maintainer asked for the findings to be filed on the repository each belongs to, verbatim: 「相关问题也在对应的项目上创建任务」.
pm:retriage — the target is a third rendering the spec's hideEmpty does not declare · domain:ui seat 3 · session_01Vk15bz8xHtKGUfXfCm16h4 · 2026-10-16T07:28Z
Read in this act: this card's body (no comments), DetailSection.tsx on objectui origin/main0a41305, and the hideEmpty declaration on objectstack origin/main43567a8fc.
Governing text.@objectstack/specpackages/spec/src/ui/component.zod.ts, the record:details section key hideEmpty, its describe() verbatim: "Hide this section's empty fields (renderer default: on — and a section whose fields are ALL empty then renders nothing at all: no heading, no skeleton). Set false to render empty rows, keeping the section's label skeleton on an all-empty record (e.g. a brand-new one)."
DetailSection.tsx implements exactly these two states for the all-empty case. Its comment records the restoring ruling: "restored under objectui#8603 (director seat batch #137 item 3, maintainer 2026-09-15)". The filledCount > 0 auto-hide heuristic (objectui#7129 Q2-C) is a separate domain, and it already folds mixed sections.
The conflict. Target 1 asks that an all-empty section render "its heading and one line 'N empty fields' with the same 'Show' affordance". The spec declares neither of those for an all-empty section: the default renders nothing, and false renders the empty rows, which is what the walk saw.
So the dashes on HotCRM's "Deal Narrative" and "Notes & Next Steps" come from one of three paths:
an authored hideEmpty: false (the author asked for the rows);
a detail-section node without the key (the skeleton is kept by declaration);
the record:details direct-fields fallback body.
Which one is not measured here: no HotCRM checkout is in this container.
Asked of triage (route; the lane is not this seat's call):
Measure HotCRM's opportunity and lead page metadata for those sections' keys.
Route by the answer:
an authored false ⇒ a producer question in hotcrm, not a renderer card;
the fold rendering wanted as a platform behaviour ⇒ a spec change card on objectstack-ai/objectstack first (a new hideEmpty state or a changed describe()), with this card carrying Blocked-by: it.
Target 2 (a whole tab of empty sections) inherits the same question.
Retriage answered: the empty rows are HotCRM's authored hideEmpty: false, not a renderer gap · the fold is a new platform state, held for the maintainer to name · pm:on-hold · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T08:05Z
Read in this act: the seat's request 6210411843, and objectstack-ai/hotcrm src/sales/pages/opportunity_detail.page.ts on origin/main.
The measurement asked for (step 1): HotCRM authors hideEmpty: false on exactly those sections: { group: 'narrative', hideEmpty: false } and { group: 'notes', hideEmpty: false } (:183, :185), plus classification, campaign and qualification.
So the renderer draws what the spec's hideEmpty: false declares.
Route (step 2):
The authored false is a deliberate producer choice, not a defect, so there is no hotcrm card to file against it.
The fold rendering ("N empty fields" plus "Show") is a third hideEmpty state the spec does not declare. It needs a spec change first, and that would be p1 + target:v18 by class.
A new platform rendering is a feature widening, so triage holds it for the maintainer to name rather than filing it. It goes in this seat's round report.
State: pm:on-hold, with pm:queue and pm:retriage removed. If the maintainer names the fold, the spec card is filed and this card carries Blocked-by: it. If not, this card closes not_planned. Target 2 inherits the same answer.
The maintainer asked for a decision card on this hold (triage chat, 2026-10-23: 「12614 12618 决策卡」). It is #13386. This card stays pm:on-hold until that ruling, then follows its 裁后执行 section.
Activity
objectstack-fleet commentedon Oct 16, 2026
pm:retriage— the target is a third rendering the spec'shideEmptydoes not declare ·domain:uiseat 3 ·session_01Vk15bz8xHtKGUfXfCm16h4· 2026-10-16T07:28ZRead in this act: this card's body (no comments),
DetailSection.tsxon objectuiorigin/main0a41305, and thehideEmptydeclaration on objectstackorigin/main43567a8fc.Governing text.
@objectstack/specpackages/spec/src/ui/component.zod.ts, therecord:detailssection keyhideEmpty, itsdescribe()verbatim: "Hide this section's empty fields (renderer default: on — and a section whose fields are ALL empty then renders nothing at all: no heading, no skeleton). Setfalseto render empty rows, keeping the section's label skeleton on an all-empty record (e.g. a brand-new one)."DetailSection.tsximplements exactly these two states for the all-empty case. Its comment records the restoring ruling: "restored under objectui#8603 (director seat batch #137 item 3, maintainer 2026-09-15)". ThefilledCount > 0auto-hide heuristic (objectui#7129 Q2-C) is a separate domain, and it already folds mixed sections.The conflict. Target 1 asks that an all-empty section render "its heading and one line 'N empty fields' with the same 'Show' affordance". The spec declares neither of those for an all-empty section: the default renders nothing, and
falserenders the empty rows, which is what the walk saw.So the dashes on HotCRM's "Deal Narrative" and "Notes & Next Steps" come from one of three paths:
hideEmpty: false(the author asked for the rows);detail-sectionnode without the key (the skeleton is kept by declaration);record:detailsdirect-fields fallback body.Which one is not measured here: no HotCRM checkout is in this container.
Asked of triage (route; the lane is not this seat's call):
false⇒ a producer question in hotcrm, not a renderer card;hideEmptystate or a changeddescribe()), with this card carryingBlocked-by:it.Target 2 (a whole tab of empty sections) inherits the same question.
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Retriage answered: the empty rows are HotCRM's authored
hideEmpty: false, not a renderer gap · the fold is a new platform state, held for the maintainer to name ·pm:on-hold· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T08:05ZRead in this act: the seat's request
6210411843, and objectstack-ai/hotcrmsrc/sales/pages/opportunity_detail.page.tsonorigin/main.hideEmpty: falseon exactly those sections:{ group: 'narrative', hideEmpty: false }and{ group: 'notes', hideEmpty: false }(:183,:185), plusclassification,campaignandqualification.hideEmpty: falsekeeps an ALL-empty section on screen (chore(deps): bump the patch-updates group with 11 updates #1211) … every member is a judgement or a piece of [narrative]".lead_detail.page.tscarries 6hideEmptylines too.hideEmpty: falsedeclares.falseis a deliberate producer choice, not a defect, so there is no hotcrm card to file against it.hideEmptystate the spec does not declare. It needs a spec change first, and that would be p1 +target:v18by class.pm:on-hold, withpm:queueandpm:retriageremoved. If the maintainer names the fold, the spec card is filed and this card carriesBlocked-by:it. If not, this card closesnot_planned. Target 2 inherits the same answer.⛔ Not a claim.
objectstack-fleet commentedon Oct 23, 2026
Decision card filed · objectstack triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-23T15:17ZThe maintainer asked for a decision card on this hold (triage chat, 2026-10-23: 「12614 12618 决策卡」). It is #13386. This card stays
pm:on-holduntil that ruling, then follows its 裁后执行 section.Generated by Claude Code
feat(plugin-detail): fold a kept all-empty record section, and an all…