Show required-info as distinct worklist columns with blank visibility

Objective

  • Let teams add selected required-info fields as separate, scannable columns on custom worklists (and any surface that reuses the same column model) so operators can see what is filled in and what is still missing without expanding each row or opening the workorder/quote.
  • Replace the limitation of the current stacked Required Info group column, which only surfaces populated values and collapses multiple fields into one cell — insufficient for operational queues that need spreadsheet-style triage.
  • Support blank-state visibility in every required-info column (empty/missing values must remain visible in the grid, not hidden), so teams can work down a process checklist from the list view.

Background

  • ATT-1639 (Done) shipped a worklist column catalog, saved visibleColumns on worklistSchema, and row rendering via SingleJobsBar, SingleQuoteBar, and SingleEventBar in WorklistResolver.tsx.
  • ATT-1614 (Done) added required-info to the expanded row panel via WorklistRequiredInfoPanel.tsx — useful for detail, but not the at-a-glance column scan users asked for on the June 16 implementation call.
  • Today’s group column (grp_ri sentinel) renders through GroupInfoCell.tsx, which skips fields with no value (if (!val) return null) and stacks remaining values vertically in a single ~200px column. Row bars pass all company required-info definitions into that cell today, not the worklist’s riGroupFields selection.
  • The column picker in NewWorklistDrawer.tsx only exposes grp_ri as one toggle (“Display all required info fields in a single column”) with no sub-field picker (unlike grp_cr, which lets users choose contact roles). Individual ri_<fieldId> keys are stripped from the picker even though row renderers already support them.
  • Individual ri_* column rendering already exists in SingleJobsBar.tsx, SingleQuoteBar.tsx, and SingleEventBar.tsx: each shows the field value or an em-dash () when blank. Headers resolve field names via getColumnHeaders() in columnConfig.ts. The product gap is picker + persistence + blank-state UX policy, not greenfield row rendering.
  • Worklist data payloads already include requiredInfoValues on inspections and quotes via buildWorklistPopulationStages in attik-backend/src/routes/worklist.ts. Required-info definitions come from GET required-info (requiredInfoSchema.ts).
  • “Custom fields” in stakeholder language maps to Attik required-info definitions (including Spectora-synced fields via _spectoraCustomFieldId), not a separate field system. Static quote columns like reason_not_booked and follow_up_date already live in the static catalog in columnConfig.ts and are out of this issue’s core ask unless product expands scope.
  • On the June 16 implementation call, users said the stacked required-info summary is not enough — they want chosen fields as distinct columns with blank values visible so the worklist works like a process spreadsheet.
  • No attachments, linked documents, or inline media on this ticket.

Product Decisions

Locked

  1. Distinct columns, not stacked-only — Selected required-info fields must appear as separate grid columns with their own headers, not only inside the single stacked grp_ri cell.
  2. Blank-state visibility — Empty/missing values for a selected field must remain visible in the column (not omitted from the row), so operators can see gaps without opening the record.
  3. Read-only scan (v1 assumption) — Primary outcome is visibility/triage from the list row; inline editing from the column is not assumed unless product expands scope.
  4. Required-info fields only — Scope centers on company required-info definitions (required-info API / requiredInfoValues on rows), not arbitrary Mongo paths or Reports Hub requiredInfoValue.* export columns (though the same field IDs may apply).

Open

  1. Relationship to grp_riReplace the stacked group column with per-field ri_* columns, keep both (group for quick summary + individual columns for triage), or upgrade grp_ri to show selected fields with blanks instead of adding individual columns?
  2. Field picker UX — Add required-info fields to the column picker in NewWorklistDrawer.tsx as individual toggles (like contact roles under grp_cr), a nested multi-select under grp_ri, or a separate “Add required-info column” flow?
  3. Which fields are selectable — All non-hidden company required-info definitions, or only fields applicable to the row’s services (respecting _requiredInfoId on services)? If a field does not apply to a row, should the column show blank, “N/A”, or hide for that row?
  4. Blank-state presentation — Is em-dash () sufficient, or should blanks use stronger affordances (e.g. “Missing”, muted label, color/icon for required-but-empty fields)?
  5. Entity and surface scopeCustom worklists only for v1, or also default prebuilt worklists (ATT-1937)? Apply to inspections + quotes + events, or a subset?
  6. Column limit / performance — Any cap on how many required-info columns one worklist may enable before horizontal scroll becomes unusable?
  7. Hidden required-info fields — Should fields marked hidden: true on the definition be excluded from the picker entirely?
  8. Value formatting — Should column cells reuse workorder formatting (dates, booleans, select labels) from WorklistRequiredInfoPanel.tsx / RequiredInfoAccordion, or plain string truncation is enough for v1?

Scope

Frontend (attik-frontend)

  • Column pickerNewWorklistDrawer.tsx column section currently blocks individual ri_* keys and offers grp_ri without sub-field selection; extend so teams can add specific required-info fields as columns in visibleColumns (and persist order via drag-and-drop).
  • Row renderingSingleJobsBar.tsx, SingleQuoteBar.tsx, SingleEventBar.tsx already render individual ri_* keys with blank em-dashes; align blank-state UX with product decision and ensure selected fields drive headers via WorklistTableHeader.tsx / getColumnHeaders().
  • Group columnGroupInfoCell.tsx and grp_ri handling in row bars may need updates if product retires or upgrades the stacked column (today hides blanks and ignores riGroupFields).
  • MigrationWorklistResolver.tsx migrateWorklistColumns() converts legacy individual ri_* keys to grp_ri; revisit if individual columns become the preferred model again.
  • Catalog / layoutcolumnConfig.ts assigns ~120px width to extra keys and supports dynamic headers from requiredInfoFields; may need width or formatting tweaks for many RI columns.

Backend (attik-backend)

  • worklistSchema.ts already stores visibleColumns, riGroupFields, and crGroupFields; individual ri_<id> keys in visibleColumns may be sufficient for persistence without schema changes — confirm whether riGroupFields remains needed if grp_ri is deprecated or upgraded.
  • worklist.ts data pipeline already populates requiredInfoValues for worklist rows; confirm event worklists resolve inspection-linked values correctly for event-type lists.
  • No new API strictly required if picker writes ri_* keys into existing visibleColumns PATCH — unless product wants server-side validation of field IDs.

Out of scope (unless product expands Open decisions)

  • Inline editing of required-info from the worklist row/column.
  • Static catalog columns (reason_not_booked, follow_up_date, etc.) — already shipped separately in ATT-1639 catalog.
  • ATT-1937 default prebuilt worklist column config — adjacent; may consume this issue’s column model once built.
  • Reports Hub / data-export requiredInfoValue.<id> column namespace — different surface; reuse field IDs only.

References

  • ATT-1639 — Custom worklist column catalog (Done)
  • ATT-1614 — Required-info in expanded row (Done)
  • ATT-1937 — Default worklist column config (Backlog, adjacent)
  • Frontend: attik-frontend/src/util/worklist/columnConfig.ts, attik-frontend/src/components/task-check/GroupInfoCell.tsx, attik-frontend/src/app/tools/work/NewWorklistDrawer.tsx
  • Backend: attik-backend/src/models/worklistSchema.ts, attik-backend/src/routes/worklist.ts

Please authenticate to join the conversation.

Upvoters
Status

Planned

Board
🏠

Main App

Date

1 day ago

Author

Linear

Subscribe to post

Get notified by email when there are changes.