Mobile Phase 8h: Grid detail stage/reminder cards + Open-in-Grid deep-link
Grid full-screen investor detail, conformed to the dc anatomy: - G4: pipeline stage as a single tappable .detail-tap-card (chip + Change/Add) - G5: dedicated Reminder card fed by the soonest active reminder; tri-state (loading → disabled "Checking…" so a pre-load tap can't POST a duplicate; none → "No reminder set"; object → edit). Edits PATCH in place, else POST. - G6 (notes timeline) was already in place. Open-in-Grid deep-link, now on all three mobile detail surfaces (Contacts, Pipeline, Reminders): a shared shell openInvestorInGrid(rowId) sets a one-shot gridUiAction object the mobile grid consumes on mount to open that investor's detail; the desktop grid drains the unrecognized object so it can't linger. Each surface gets its grid row id from a server-injected source_row_id: contacts via contact_grid_signals, opportunities via the durable fundraising_investor_id join, reminders via the investor_id join. All are read-only/GET-only or field-allowlist writes, so none need a strip point. Tests: source_row_id injection assertions for contacts, opportunities, and reminders; full suite 40/40. Client surfaces jsdom-verified.
This commit is contained in:
@@ -158,6 +158,13 @@ def main():
|
||||
items = (d or {}).get("data", [])
|
||||
check(st == 200 and len(items) == 4, f"list returns all 4 open (got {st}, {len(items)})")
|
||||
check(all("last_activity_at" in it for it in items), "each row carries last_activity_at")
|
||||
# 8h deep-link: each row injects source_row_id (joined via investor_id) — the grid row id
|
||||
# the mobile Reminders edit sheet uses for "Open investor in Grid"; null for a team task.
|
||||
by_id = {it.get("id"): it for it in items}
|
||||
check(by_id.get(acme_rem_id, {}).get("source_row_id") == "rowAcme",
|
||||
f"investor reminder injects source_row_id == 'rowAcme' (got {by_id.get(acme_rem_id, {}).get('source_row_id')!r})")
|
||||
check(by_id.get(standalone_id, {}).get("source_row_id") in (None, ""),
|
||||
f"team task has null source_row_id -> Open-in-Grid hidden (got {by_id.get(standalone_id, {}).get('source_row_id')!r})")
|
||||
# dated reminders sort before undated, soonest first -> YESTERDAY (beta) leads
|
||||
check(items and items[0].get("id") == beta_rem_id, f"overdue sorts first (got {items[0].get('id') if items else None})")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user