Unification polish: LinkedIn in the grid inline contact editor (v0.1.0:54)

The fundraising grid's per-contact editor now has a LinkedIn URL field next to
name, email, title, and location. It threads through the grid contact object and
sanitize (which preserves contact-object fields), and _upsert_contact_from_fundraising
now reads and persists linkedin_url on both the update and insert paths — so a
LinkedIn entered in the grid lands on the linked contact record.

Test: test_grid_contact_link.py extended to assert LinkedIn entered in the grid
persists to the contact (idempotent). Frontend html.parser clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Keysat
2026-06-05 15:24:50 -05:00
parent 49d384a0fb
commit 300041a7ec
6 changed files with 50 additions and 14 deletions
+5 -2
View File
@@ -44,7 +44,8 @@ def main():
],
"rows": [
{"id": "row-test-1", "investor_name": "Testco Capital",
"contacts": [{"name": "Jane Doe", "email": "jane@testco.com", "title": "Partner"}]},
"contacts": [{"name": "Jane Doe", "email": "jane@testco.com", "title": "Partner",
"linkedin_url": "https://linkedin.com/in/janedoe"}]},
],
}
server.sync_fundraising_relational(conn, server.sanitize_fundraising_grid(grid), [])
@@ -54,9 +55,11 @@ def main():
check(bool(fc and fc["contact_id"]), f"grid contact_id populated by sync (got {dict(fc) if fc else None})")
if fc and fc["contact_id"]:
ct = conn.execute("SELECT id, email FROM contacts WHERE id=?", (fc["contact_id"],)).fetchone()
ct = conn.execute("SELECT id, email, linkedin_url FROM contacts WHERE id=?", (fc["contact_id"],)).fetchone()
check(bool(ct and ct["email"] == "jane@testco.com"),
f"link points to the correct contacts row (got {dict(ct) if ct else None})")
check(bool(ct and ct["linkedin_url"] == "https://linkedin.com/in/janedoe"),
f"LinkedIn entered in the grid persists to the contact (got {ct['linkedin_url'] if ct else None})")
# Re-sync is idempotent: still exactly one linked contact for Jane.
server.sync_fundraising_relational(conn, server.sanitize_fundraising_grid(grid), [])