From a985b112b184542e18233ed5238f091e4cc1f2f3 Mon Sep 17 00:00:00 2001 From: Lukas Remis Date: Sun, 2 Aug 2026 10:12:45 +0200 Subject: [PATCH] M5 Contacts plugin (builtin) + collapsed icon-rail for Calendar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contacts (SPEC Appendix B, phase B1) — new builtin plugin `webmail_plugin_contacts`: - Tables plg_contacts_{books,contacts,groups,group_members} (RLS-isolated, migration contacts0001): vCard-style structured contact fields, address books, groups with membership. - API /api/plugins/contacts/: list (filter all|vip|recent|nogroup, group, q), get/create/update/delete, star toggle, groups CRUD, and the recipients.suggest capability endpoint (enriches the composer). Display name derived server-side from name parts so search + suggestions work regardless of client. - Frontend ui/page.js: three-pane app — shared .wm-side-* sidebar template with a "Contacts" header, alphabetically grouped list, detail pane (avatar, VIP star, Call/Message/Compose/Invite, Contact details, live Mail search, Events stub) and a full edit form (name, org, birthday, repeatable emails/phones, address, notes). Collapsed sidebar: both Contacts and Calendar now show a 60px icon-only rail (like Mail) with expand toggle, primary button, quick nav and Settings/Sign out — instead of hiding the panel (Contacts) / a top-bar button (Calendar). Deferred: Gravatar photos, vCard import/export + merge (B2), CardDAV sync (B3), "Add sender to contacts". Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01U72FZiF1W1pb8XxyWBTREA --- .../webmail_plugin_calendar/ui/page.js | 33 +- .../webmail_plugin_contacts/pyproject.toml | 20 + .../webmail_plugin_contacts/__init__.py | 37 ++ .../migrations/versions/0001_init.py | 108 ++++ .../webmail_plugin_contacts/router.py | 458 ++++++++++++++ .../webmail_plugin_contacts/schemas.py | 59 ++ .../webmail_plugin_contacts/ui/page.js | 591 ++++++++++++++++++ screenshots/contacts-2.png | Bin 0 -> 140707 bytes 8 files changed, 1304 insertions(+), 2 deletions(-) create mode 100644 plugins/webmail_plugin_contacts/pyproject.toml create mode 100644 plugins/webmail_plugin_contacts/webmail_plugin_contacts/__init__.py create mode 100644 plugins/webmail_plugin_contacts/webmail_plugin_contacts/migrations/versions/0001_init.py create mode 100644 plugins/webmail_plugin_contacts/webmail_plugin_contacts/router.py create mode 100644 plugins/webmail_plugin_contacts/webmail_plugin_contacts/schemas.py create mode 100644 plugins/webmail_plugin_contacts/webmail_plugin_contacts/ui/page.js create mode 100644 screenshots/contacts-2.png diff --git a/plugins/webmail_plugin_calendar/webmail_plugin_calendar/ui/page.js b/plugins/webmail_plugin_calendar/webmail_plugin_calendar/ui/page.js index 32e8cbe..719b6ad 100644 --- a/plugins/webmail_plugin_calendar/webmail_plugin_calendar/ui/page.js +++ b/plugins/webmail_plugin_calendar/webmail_plugin_calendar/ui/page.js @@ -201,6 +201,16 @@ const CSS = ` .cal-secadd{opacity:0;border:0;background:none;color:rgb(var(--app-muted));cursor:pointer;font-size:15px;line-height:1;padding:2px 4px;border-radius:4px} .cal-secrow:hover .cal-secadd{opacity:1} .cal-secadd:hover{background:rgb(var(--app-hover));color:rgb(var(--app-fg))} +/* collapsed icon-only rail (matches Mail's 60px rail) */ +.cal-rail{width:60px;align-items:center} +.cal-railtop{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 0 6px} +.cal-railprimary{padding:2px 0 8px} +.cal-railnav{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;align-items:center;gap:4px;padding:2px 0} +.cal-railfoot{width:100%;display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 0;border-top:1px solid rgb(var(--app-border))} +.cal-railbtn{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:9px;color:rgb(var(--app-muted));cursor:pointer;background:none;border:0} +.cal-railbtn:hover{background:rgb(var(--app-hover));color:rgb(var(--app-fg))} +.cal-railnew{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:11px;background:rgb(var(--app-accent));color:rgb(var(--app-accent-fg));cursor:pointer;border:0} +.cal-railnew:hover{opacity:.9} .cal-resizer{flex:0 0 auto;width:5px;margin:0 -2px;cursor:col-resize;position:relative;z-index:10} .cal-resizer::after{content:"";position:absolute;top:0;bottom:0;left:50%;width:1px;transform:translateX(-50%);background:transparent} .cal-resizer:hover::after{background:#3b82f6} @@ -813,7 +823,7 @@ export default function mount(el, ctx) { // ---- render ---------------------------------------------------------------- function render() { el.innerHTML = `
- ${state.leftCollapsed ? "" : `
${leftPanel()}
`} + ${state.leftCollapsed ? railPanel() : `
${leftPanel()}
`}
${topbar()}
@@ -858,7 +868,6 @@ export default function mount(el, ctx) { function topbar() { return `
- ${state.leftCollapsed ? `` : ""} `; } + // Collapsed sidebar: a narrow icon-only rail (like Mail) that keeps the expand + // toggle, so it can always be re-opened. + function railPanel() { + const TODAY_IC = ``; + return `
+
+ + +
+
+
+ +
+
+ + +
+
`; + } + // Left panel = the shared sidebar-shell template (.wm-side-*, see plugin-ui.css): // switcher + collapse/theme, primary button, an app-specific scrollable body // (mini-month + calendars here), and the shared foot. Identical to Mail. diff --git a/plugins/webmail_plugin_contacts/pyproject.toml b/plugins/webmail_plugin_contacts/pyproject.toml new file mode 100644 index 0000000..a002f6e --- /dev/null +++ b/plugins/webmail_plugin_contacts/pyproject.toml @@ -0,0 +1,20 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "webmail-plugin-contacts" +version = "0.1.0" +description = "Contacts — the second heavy plugin (SPEC Appendix B). Local contact books, groups, recipients.suggest; vCard + CardDAV later." +requires-python = ">=3.11" +# B1 (local contacts) needs no external deps; vobject is added at B2 (vCard I/O). +dependencies = [] + +[project.entry-points."webmail.plugins"] +contacts = "webmail_plugin_contacts:plugin" + +[tool.setuptools] +packages = ["webmail_plugin_contacts"] + +[tool.setuptools.package-data] +webmail_plugin_contacts = ["ui/*.js", "migrations/versions/*.py"] diff --git a/plugins/webmail_plugin_contacts/webmail_plugin_contacts/__init__.py b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/__init__.py new file mode 100644 index 0000000..d01b707 --- /dev/null +++ b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/__init__.py @@ -0,0 +1,37 @@ +"""``contacts`` — the second heavy plugin (SPEC Appendix B). + +A **core, non-removable** plugin (``builtin=True``) that ships a `/contacts` page +beside Mail and Calendar. Its own ``plg_contacts_*`` tables (RLS-isolated) hold +address books, contacts (structured vCard-style fields), and groups. Core owns the +*implicit* recipient history (``known_recipients``); this plugin owns the *explicit*, +user-curated contacts and enriches the composer via the ``recipients.suggest`` +capability. Uses the SDK only — zero core diffs. Phase B1 (local contacts) is the +current scope; vCard import/export (B2) and CardDAV sync (B3) build on the same model. +""" + +from __future__ import annotations + +from pathlib import Path + +from app.plugins.sdk import Page, PageNav, Plugin, UiManifest +from webmail_plugin_contacts.router import router + +_HERE = Path(__file__).resolve().parent + +plugin = Plugin( + name="contacts", + version="0.1.0", + builtin=True, + router=router, + ui_manifest=UiManifest( + pages=[ + Page( + route="/contacts", + nav=PageNav(icon="contacts", label="Contacts", order=20), + bundle="/api/plugins/contacts/ui/page.js", + ) + ], + capabilities={"recipients.suggest": "/api/plugins/contacts/suggest"}, + ), + migrations=str(_HERE / "migrations" / "versions"), +) diff --git a/plugins/webmail_plugin_contacts/webmail_plugin_contacts/migrations/versions/0001_init.py b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/migrations/versions/0001_init.py new file mode 100644 index 0000000..610c238 --- /dev/null +++ b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/migrations/versions/0001_init.py @@ -0,0 +1,108 @@ +"""contacts plugin: books + contacts + groups tables with RLS (SPEC §B.3) + +Revision ID: contacts0001 +Revises: +Create Date: 2026-08-02 +""" + +from __future__ import annotations + +from collections.abc import Sequence + +from alembic import op + +from app.plugins.rls import enable_rls + +revision: str = "contacts0001" +down_revision: str | None = None +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.execute( + """ + CREATE TABLE plg_contacts_books ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + name text NOT NULL, + kind text NOT NULL DEFAULT 'local', -- local|carddav + source_config jsonb NOT NULL DEFAULT '{}', + secret_ct bytea, -- CardDAV creds (vault, §10.2) + sync_token text, + read_only boolean NOT NULL DEFAULT false, + UNIQUE (user_id, name) + ) + """ + ) + op.execute( + """ + CREATE TABLE plg_contacts_contacts ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + book_id uuid NOT NULL + REFERENCES plg_contacts_books(id) ON DELETE CASCADE, + vcard_uid text NOT NULL, + etag text, + name_display text NOT NULL DEFAULT '', -- FN + name_parts jsonb NOT NULL DEFAULT '{}', -- {prefix,given,middle,family,suffix} + nickname text NOT NULL DEFAULT '', + emails jsonb NOT NULL DEFAULT '[]', -- [{value,type,pref}] + default_email text NOT NULL DEFAULT '', + phones jsonb NOT NULL DEFAULT '[]', -- [{value,type}] + addresses jsonb NOT NULL DEFAULT '[]', -- [{type,country,street,postal_code,city}] + urls jsonb NOT NULL DEFAULT '[]', -- [{value,type}] + org text NOT NULL DEFAULT '', + department text NOT NULL DEFAULT '', + title text NOT NULL DEFAULT '', + birthday date, + notes text NOT NULL DEFAULT '', + starred boolean NOT NULL DEFAULT false, -- VIP / favourite + photo_sha256 text, + raw_vcard text, -- round-trip fidelity (B2/B3) + updated_at timestamptz NOT NULL DEFAULT now(), + UNIQUE (book_id, vcard_uid) + ) + """ + ) + op.execute( + "CREATE INDEX ix_plg_contacts_contacts_user_name " + "ON plg_contacts_contacts (user_id, name_display)" + ) + op.execute( + "CREATE INDEX ix_plg_contacts_contacts_emails " + "ON plg_contacts_contacts USING gin (emails jsonb_path_ops)" + ) + op.execute( + """ + CREATE TABLE plg_contacts_groups ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + name text NOT NULL, + UNIQUE (user_id, name) + ) + """ + ) + op.execute( + """ + CREATE TABLE plg_contacts_group_members ( + user_id uuid NOT NULL, + group_id uuid NOT NULL + REFERENCES plg_contacts_groups(id) ON DELETE CASCADE, + contact_id uuid NOT NULL + REFERENCES plg_contacts_contacts(id) ON DELETE CASCADE, + PRIMARY KEY (group_id, contact_id) + ) + """ + ) + enable_rls("plg_contacts_books") + enable_rls("plg_contacts_contacts") + enable_rls("plg_contacts_groups") + enable_rls("plg_contacts_group_members") + + +def downgrade() -> None: + op.execute("DROP TABLE IF EXISTS plg_contacts_group_members") + op.execute("DROP TABLE IF EXISTS plg_contacts_groups") + op.execute("DROP TABLE IF EXISTS plg_contacts_contacts") + op.execute("DROP TABLE IF EXISTS plg_contacts_books") diff --git a/plugins/webmail_plugin_contacts/webmail_plugin_contacts/router.py b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/router.py new file mode 100644 index 0000000..c6f79a2 --- /dev/null +++ b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/router.py @@ -0,0 +1,458 @@ +"""Contacts plugin API (SPEC §B.5). Local address book: contact CRUD with +structured fields, groups, alphabetically grouped listing + search, and the +``recipients.suggest`` capability endpoint used by the composer. + +Uses raw SQL through the RLS-scoped ``sdk.session`` (plugin tables aren't in the +core ORM). jsonb columns are written as ``json.dumps`` strings and read back as +already-parsed Python objects — same discipline as the calendar plugin. +""" + +from __future__ import annotations + +import json +import logging +import uuid +from datetime import date +from pathlib import Path +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException, Query +from fastapi.responses import FileResponse +from sqlalchemy import text +from sqlalchemy.ext.asyncio import AsyncSession + +from app.plugins.sdk import CurrentUserId, require_csrf, sdk +from webmail_plugin_contacts.schemas import ContactIn, GroupIn + +_log = logging.getLogger("plg.contacts") +_SDK = sdk("contacts") + +router = APIRouter() + +_UI = Path(__file__).resolve().parent / "ui" + +# Columns selected for both the list and detail responses. +_COLS = ( + "id, book_id, name_display, name_parts, nickname, emails, default_email, phones, " + "urls, addresses, org, department, title, birthday, notes, starred, updated_at" +) + + +def _json(value: object) -> Any: + """Read a jsonb column defensively (SQLAlchemy usually returns parsed objects, + but tolerate a raw JSON string too).""" + if isinstance(value, str): + try: + return json.loads(value) + except ValueError: + return [] + return value if value is not None else [] + + +def _display_name(row: dict[str, object]) -> str: + if row.get("name_display"): + return str(row["name_display"]) + parts = _json(row.get("name_parts")) or {} + if isinstance(parts, dict): + joined = " ".join( + str(parts.get(k, "")).strip() + for k in ("prefix", "given", "middle", "family", "suffix") + if str(parts.get(k, "")).strip() + ) + if joined: + return joined + emails = _json(row.get("emails")) + if emails and isinstance(emails, list): + return str(emails[0].get("value", "")) if isinstance(emails[0], dict) else "" + return "" + + +def _primary_email(row: dict[str, object]) -> str: + if row.get("default_email"): + return str(row["default_email"]) + emails = _json(row.get("emails")) + if isinstance(emails, list) and emails: + pref = next((e for e in emails if isinstance(e, dict) and e.get("pref")), None) + chosen = pref or emails[0] + if isinstance(chosen, dict): + return str(chosen.get("value", "")) + return "" + + +def _detail(row: dict[str, object], groups: list[dict[str, str]]) -> dict[str, object]: + bday = row.get("birthday") + return { + "id": str(row["id"]), + "display_name": _display_name(row), + "name_parts": _json(row.get("name_parts")) or {}, + "nickname": row.get("nickname") or "", + "org": row.get("org") or "", + "department": row.get("department") or "", + "title": row.get("title") or "", + "birthday": bday.isoformat() if isinstance(bday, date) else None, + "emails": _json(row.get("emails")), + "default_email": _primary_email(row), + "phones": _json(row.get("phones")), + "urls": _json(row.get("urls")), + "addresses": _json(row.get("addresses")), + "notes": row.get("notes") or "", + "starred": bool(row.get("starred")), + "groups": groups, + } + + +async def _ensure_book(s: AsyncSession, user_id: uuid.UUID) -> str: + """Return the user's default local book id, creating it (and an 'Autosaved' + group) on first use so the page always has somewhere to put new contacts.""" + row = ( + await s.execute( + text( + "SELECT id FROM plg_contacts_books " + "WHERE user_id = :u ORDER BY name LIMIT 1" + ), + {"u": str(user_id)}, + ) + ).first() + if row is not None: + book_id = str(row[0]) + else: + book_id = str( + ( + await s.execute( + text( + "INSERT INTO plg_contacts_books (user_id, name) " + "VALUES (:u, 'Contacts') RETURNING id" + ), + {"u": str(user_id)}, + ) + ).scalar_one() + ) + await s.execute( + text( + "INSERT INTO plg_contacts_groups (user_id, name) VALUES (:u, 'Autosaved') " + "ON CONFLICT (user_id, name) DO NOTHING" + ), + {"u": str(user_id)}, + ) + return book_id + + +async def _group_map(s: AsyncSession) -> dict[str, list[dict[str, str]]]: + """contact_id -> [{id, name}] for every membership (RLS-scoped).""" + rows = ( + await s.execute( + text( + "SELECT m.contact_id, g.id AS gid, g.name FROM plg_contacts_group_members m " + "JOIN plg_contacts_groups g ON g.id = m.group_id" + ) + ) + ).mappings().all() + out: dict[str, list[dict[str, str]]] = {} + for r in rows: + out.setdefault(str(r["contact_id"]), []).append( + {"id": str(r["gid"]), "name": str(r["name"])} + ) + return out + + +# --- bundle ------------------------------------------------------------------ + +@router.get("/ui/{filename}") +async def bundle(filename: str) -> FileResponse: + if filename != "page.js": + raise HTTPException(status_code=404, detail="not_found") + return FileResponse( + _UI / filename, + media_type="text/javascript", + headers={"Cache-Control": "no-cache"}, + ) + + +# --- groups ------------------------------------------------------------------ + +@router.get("/groups") +async def list_groups(user_id: CurrentUserId) -> list[dict[str, object]]: + async with _SDK.session(user_id) as s: + await _ensure_book(s, user_id) + rows = ( + await s.execute( + text( + "SELECT g.id, g.name, count(m.contact_id) AS n " + "FROM plg_contacts_groups g " + "LEFT JOIN plg_contacts_group_members m ON m.group_id = g.id " + "GROUP BY g.id, g.name ORDER BY lower(g.name)" + ) + ) + ).mappings().all() + return [{"id": str(r["id"]), "name": str(r["name"]), "count": int(r["n"])} for r in rows] + + +@router.post("/groups", dependencies=[Depends(require_csrf)]) +async def create_group(body: GroupIn, user_id: CurrentUserId) -> dict[str, str]: + name = body.name.strip() + if not name: + raise HTTPException(status_code=400, detail="empty_name") + async with _SDK.session(user_id) as s: + gid = ( + await s.execute( + text( + "INSERT INTO plg_contacts_groups (user_id, name) VALUES (:u, :n) " + "ON CONFLICT (user_id, name) DO UPDATE SET name = EXCLUDED.name " + "RETURNING id" + ), + {"u": str(user_id), "n": name}, + ) + ).scalar_one() + return {"id": str(gid), "name": name} + + +@router.delete("/groups/{group_id}", dependencies=[Depends(require_csrf)]) +async def delete_group(group_id: uuid.UUID, user_id: CurrentUserId) -> dict[str, str]: + async with _SDK.session(user_id) as s: + await s.execute( + text("DELETE FROM plg_contacts_groups WHERE id = :id"), {"id": str(group_id)} + ) + return {"status": "ok"} + + +# --- contacts ---------------------------------------------------------------- + +@router.get("/contacts") +async def list_contacts( + user_id: CurrentUserId, + filter: str = Query("all"), # all | vip | recent | nogroup + group: str = Query(""), + q: str = Query("", max_length=200), +) -> dict[str, object]: + async with _SDK.session(user_id) as s: + await _ensure_book(s, user_id) + where = ["c.user_id = :u"] + params: dict[str, object] = {"u": str(user_id)} + if filter == "vip": + where.append("c.starred") + elif filter == "nogroup": + where.append( + "NOT EXISTS (SELECT 1 FROM plg_contacts_group_members m " + "WHERE m.contact_id = c.id)" + ) + if group: + where.append( + "EXISTS (SELECT 1 FROM plg_contacts_group_members m " + "WHERE m.contact_id = c.id AND m.group_id = :g)" + ) + params["g"] = group + if q.strip(): + where.append("(c.name_display ILIKE :q OR c.emails::text ILIKE :q)") + params["q"] = f"%{q.strip()}%" + order = ( + "c.updated_at DESC" + if filter == "recent" + else "lower(c.name_display), c.updated_at DESC" + ) + limit = " LIMIT 50" if filter == "recent" else "" + rows = ( + await s.execute( + text( + f"SELECT {_COLS} FROM plg_contacts_contacts c " + f"WHERE {' AND '.join(where)} ORDER BY {order}{limit}" + ), + params, + ) + ).mappings().all() + groups = await _group_map(s) + contacts = [] + for r in rows: + d = dict(r) + contacts.append( + { + "id": str(r["id"]), + "display_name": _display_name(d), + "primary_email": _primary_email(d), + "org": r["org"] or "", + "title": r["title"] or "", + "starred": bool(r["starred"]), + "groups": groups.get(str(r["id"]), []), + } + ) + return {"contacts": contacts} + + +@router.get("/contacts/{contact_id}") +async def get_contact(contact_id: uuid.UUID, user_id: CurrentUserId) -> dict[str, object]: + async with _SDK.session(user_id) as s: + row = ( + await s.execute( + text(f"SELECT {_COLS} FROM plg_contacts_contacts c WHERE c.id = :id"), + {"id": str(contact_id)}, + ) + ).mappings().first() + if row is None: + raise HTTPException(status_code=404, detail="not_found") + groups = (await _group_map(s)).get(str(contact_id), []) + return _detail(dict(row), groups) + + +def _derive_name(body: ContactIn) -> str: + """FN: the client's display_name, else the assembled name parts, else first email.""" + name = body.display_name.strip() + if not name: + np = body.name_parts + name = " ".join( + x.strip() + for x in (np.prefix, np.given, np.middle, np.family, np.suffix) + if x.strip() + ).strip() + if not name and body.emails: + name = body.emails[0].value.strip() + return name + + +def _contact_params(body: ContactIn) -> dict[str, object]: + bday: date | None = None + if body.birthday: + try: + bday = date.fromisoformat(body.birthday) + except ValueError: + bday = None + return { + "name": _derive_name(body), + "parts": json.dumps(body.name_parts.model_dump()), + "nick": body.nickname.strip(), + "emails": json.dumps([e.model_dump() for e in body.emails]), + "defemail": body.default_email.strip(), + "phones": json.dumps([p.model_dump() for p in body.phones]), + "urls": json.dumps([u.model_dump() for u in body.urls]), + "addrs": json.dumps([a.model_dump() for a in body.addresses]), + "org": body.org.strip(), + "dept": body.department.strip(), + "title": body.title.strip(), + "bday": bday, + "notes": body.notes, + "starred": body.starred, + } + + +async def _set_groups( + s: AsyncSession, user_id: uuid.UUID, contact_id: str, group_ids: list[str] +) -> None: + await s.execute( + text("DELETE FROM plg_contacts_group_members WHERE contact_id = :c"), + {"c": contact_id}, + ) + for gid in group_ids: + await s.execute( + text( + "INSERT INTO plg_contacts_group_members (user_id, group_id, contact_id) " + "VALUES (:u, :g, :c) ON CONFLICT DO NOTHING" + ), + {"u": str(user_id), "g": gid, "c": contact_id}, + ) + + +@router.post("/contacts", dependencies=[Depends(require_csrf)]) +async def create_contact(body: ContactIn, user_id: CurrentUserId) -> dict[str, str]: + async with _SDK.session(user_id) as s: + book_id = await _ensure_book(s, user_id) + p = _contact_params(body) + p.update({"u": str(user_id), "book": book_id, "uid": str(uuid.uuid4())}) + cid = ( + await s.execute( + text( + "INSERT INTO plg_contacts_contacts " + "(user_id, book_id, vcard_uid, name_display, name_parts, nickname, emails, " + " default_email, phones, urls, addresses, org, department, title, birthday, " + " notes, starred) " + "VALUES (:u, :book, :uid, :name, :parts, :nick, :emails, :defemail, :phones, " + " :urls, :addrs, :org, :dept, :title, :bday, :notes, :starred) RETURNING id" + ), + p, + ) + ).scalar_one() + await _set_groups(s, user_id, str(cid), body.group_ids) + return {"id": str(cid)} + + +@router.put("/contacts/{contact_id}", dependencies=[Depends(require_csrf)]) +async def update_contact( + contact_id: uuid.UUID, body: ContactIn, user_id: CurrentUserId +) -> dict[str, str]: + async with _SDK.session(user_id) as s: + p = _contact_params(body) + p["id"] = str(contact_id) + result = await s.execute( + text( + "UPDATE plg_contacts_contacts SET " + "name_display = :name, name_parts = :parts, nickname = :nick, emails = :emails, " + "default_email = :defemail, phones = :phones, urls = :urls, addresses = :addrs, " + "org = :org, department = :dept, title = :title, birthday = :bday, notes = :notes, " + "starred = :starred, updated_at = now() WHERE id = :id" + ), + p, + ) + if result.rowcount == 0: + raise HTTPException(status_code=404, detail="not_found") + await _set_groups(s, user_id, str(contact_id), body.group_ids) + return {"status": "ok"} + + +@router.delete("/contacts/{contact_id}", dependencies=[Depends(require_csrf)]) +async def delete_contact(contact_id: uuid.UUID, user_id: CurrentUserId) -> dict[str, str]: + async with _SDK.session(user_id) as s: + await s.execute( + text("DELETE FROM plg_contacts_contacts WHERE id = :id"), {"id": str(contact_id)} + ) + return {"status": "ok"} + + +@router.post("/contacts/{contact_id}/star", dependencies=[Depends(require_csrf)]) +async def toggle_star(contact_id: uuid.UUID, user_id: CurrentUserId) -> dict[str, object]: + async with _SDK.session(user_id) as s: + row = ( + await s.execute( + text( + "UPDATE plg_contacts_contacts SET starred = NOT starred WHERE id = :id " + "RETURNING starred" + ), + {"id": str(contact_id)}, + ) + ).first() + if row is None: + raise HTTPException(status_code=404, detail="not_found") + return {"starred": bool(row[0])} + + +# --- recipients.suggest capability (SPEC §B.5 / §11.3) ----------------------- + +@router.get("/suggest") +async def suggest( + user_id: CurrentUserId, q: str = Query("", max_length=200) +) -> list[dict[str, object]]: + term = q.strip() + if not term: + return [] + like = f"%{term}%" + async with _SDK.session(user_id) as s: + rows = ( + await s.execute( + text( + "SELECT id, name_display, emails, default_email FROM plg_contacts_contacts " + "WHERE name_display ILIKE :q OR emails::text ILIKE :q " + "ORDER BY lower(name_display) LIMIT 10" + ), + {"q": like}, + ) + ).mappings().all() + out: list[dict[str, object]] = [] + for r in rows: + email = _primary_email(dict(r)) + if not email: + continue + out.append( + { + "name": _display_name(dict(r)), + "email": email, + "source": "contact", + "contact_id": str(r["id"]), + } + ) + return out diff --git a/plugins/webmail_plugin_contacts/webmail_plugin_contacts/schemas.py b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/schemas.py new file mode 100644 index 0000000..609150a --- /dev/null +++ b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/schemas.py @@ -0,0 +1,59 @@ +"""Request models for the contacts API (SPEC §B.5).""" + +from __future__ import annotations + +from pydantic import BaseModel + + +class NameParts(BaseModel): + prefix: str = "" # "Title" in the edit form (Dr, Mr, …) + given: str = "" + middle: str = "" + family: str = "" + suffix: str = "" + + +class EmailEntry(BaseModel): + value: str + type: str = "personal" # personal | work | other + pref: bool = False + + +class PhoneEntry(BaseModel): + value: str + type: str = "mobile" # mobile | home | work | other + + +class UrlEntry(BaseModel): + value: str + type: str = "website" + + +class AddressEntry(BaseModel): + type: str = "home" # home | work | other + country: str = "" + street: str = "" + postal_code: str = "" + city: str = "" + + +class ContactIn(BaseModel): + display_name: str = "" # FN; derived from name parts / first email when blank + name_parts: NameParts = NameParts() + nickname: str = "" + org: str = "" # Company + department: str = "" + title: str = "" # Job title + birthday: str | None = None # "YYYY-MM-DD" (full date) or None + emails: list[EmailEntry] = [] + default_email: str = "" + phones: list[PhoneEntry] = [] + urls: list[UrlEntry] = [] + addresses: list[AddressEntry] = [] + notes: str = "" + starred: bool = False + group_ids: list[str] = [] + + +class GroupIn(BaseModel): + name: str diff --git a/plugins/webmail_plugin_contacts/webmail_plugin_contacts/ui/page.js b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/ui/page.js new file mode 100644 index 0000000..9ad96e1 --- /dev/null +++ b/plugins/webmail_plugin_contacts/webmail_plugin_contacts/ui/page.js @@ -0,0 +1,591 @@ +// contacts · app.page bundle (SPEC §B.6). A full-bleed three-pane contacts app: +// shared sidebar template (.wm-side-*, identical to Mail/Calendar) with a +// "Contacts" header, an alphabetically grouped contact list, and a detail pane +// with an edit-in-place form. Framework-agnostic vanilla DOM; theme-aware via +// rgb(var(--app-*)); data comes from the plugin API. + +const esc = (s) => String(s == null ? "" : s).replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ })[c]); +const MONTHS = ["January","February","March","April","May","June","July","August","September","October","November","December"]; +const EMAIL_TYPES = ["personal", "work", "other"]; +const PHONE_TYPES = ["mobile", "home", "work", "other"]; +const ADDR_TYPES = ["home", "work", "other"]; +const cap = (s) => (s ? s[0].toUpperCase() + s.slice(1) : s); + +// Icons copied from Mail/Calendar (frontend/icons/*.svg) so the apps match exactly. +const HIDE_ICON = ``; +const SHOW_ICON = ``; +const SETTINGS_ICON = ``; +const LOGOUT_ICON = ``; +const PLUS_ICON = ``; +const IC_BOOK = ``; +const IC_STAR = ``; +const IC_CLOCK = ``; +const IC_GROUP = ``; +const IC_PERSON = ``; +const IC_MAIL = ``; +const IC_PHONE = ``; +const IC_CHAT = ``; +const IC_COMPOSE = ``; +const IC_CAL = ``; +const IC_PENCIL = IC_COMPOSE; +const IC_SORT = ``; +const IC_MORE = ``; +const CHEV = ``; +const themeGlyph = () => (document.documentElement.classList.contains("dark") ? "☀" : "☾"); + +const AVATAR_COLORS = ["#ef4444","#f97316","#eab308","#22c55e","#14b8a6","#3b82f6","#8b5cf6","#ec4899","#6b7280"]; +function avatarColor(key) { let h = 0; for (const c of String(key || "?")) h = (h * 31 + c.charCodeAt(0)) >>> 0; return AVATAR_COLORS[h % AVATAR_COLORS.length]; } +function initials(name) { + const parts = String(name || "").trim().split(/\s+/).filter(Boolean); + if (!parts.length) return "?"; + return ((parts[0][0] || "") + (parts.length > 1 ? parts[parts.length - 1][0] : "")).toUpperCase(); +} +function avatarHtml(name, email, size) { + const s = size || 40; + return `${esc(initials(name || email))}`; +} +function shortDate(iso) { + const d = new Date(iso); + if (isNaN(d)) return ""; + const now = new Date(); + const opts = d.getFullYear() === now.getFullYear() ? { month: "short", day: "numeric" } : { year: "numeric", month: "short", day: "numeric" }; + return d.toLocaleDateString("en-GB", opts); +} + +const CSS = ` +.ct-app{display:flex;height:100vh;background:rgb(var(--app-bg));color:rgb(var(--app-fg));font-family:"Lato",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;font-size:14px} +.ct-app .wm-side-item.active{background:rgb(var(--app-active));color:rgb(var(--app-fg));font-weight:600} +.ct-app .wm-side-item .ct-dico{margin-top:0} +/* collapsed icon-only rail (matches Mail's 60px rail) */ +.ct-rail{width:60px;align-items:center} +.ct-railtop{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 0 6px} +.ct-railprimary{padding:2px 0 8px} +.ct-railnav{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;align-items:center;gap:4px;padding:2px 0} +.ct-railfoot{width:100%;display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 0;border-top:1px solid rgb(var(--app-border))} +.ct-railbtn{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:9px;color:rgb(var(--app-muted));cursor:pointer;background:none;border:0} +.ct-railbtn:hover{background:rgb(var(--app-hover));color:rgb(var(--app-fg))} +.ct-railbtn.active{background:rgb(var(--app-active));color:rgb(var(--app-fg))} +.ct-railnew{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:11px;background:rgb(var(--app-accent));color:rgb(var(--app-accent-fg));cursor:pointer;border:0} +.ct-railnew:hover{opacity:.9} +.ct-av{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;color:#fff;font-weight:600;flex:0 0 auto;overflow:hidden} +.ct-listcol{flex:0 0 46%;min-width:0;display:flex;flex-direction:column;border-right:1px solid rgb(var(--app-border))} +.ct-detailcol{flex:1;min-width:0;display:flex;flex-direction:column} +.ct-bar{display:flex;align-items:center;gap:6px;height:49px;padding:0 14px;border-bottom:1px solid rgb(var(--app-border));flex:0 0 auto} +.ct-bar .sp{flex:1} +.ct-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;color:rgb(var(--app-muted));cursor:pointer} +.ct-iconbtn:hover{background:rgb(var(--app-hover));color:rgb(var(--app-fg))} +.ct-barbtn{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:6px;color:rgb(var(--app-fg));cursor:pointer;font-size:13px} +.ct-barbtn:hover{background:rgb(var(--app-hover))} +.ct-cbx{width:16px;height:16px;accent-color:rgb(var(--app-accent))} +.ct-list{flex:1;min-height:0;overflow:auto} +.ct-alpha{position:sticky;top:0;background:rgb(var(--app-bg));color:rgb(var(--app-muted));font-size:12px;font-weight:700;padding:6px 18px 2px;z-index:1} +.ct-row{display:flex;align-items:center;gap:12px;padding:9px 18px;cursor:pointer;border-bottom:1px solid rgb(var(--app-border) / .5)} +.ct-row:hover{background:rgb(var(--app-hover))} +.ct-row.sel{background:rgb(var(--app-active))} +.ct-rowmain{min-width:0;flex:1} +.ct-rowname{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} +.ct-rowmail{color:rgb(var(--app-muted));font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} +.ct-empty{padding:60px 20px;text-align:center;color:rgb(var(--app-muted))} +.ct-detail{flex:1;min-height:0;overflow:auto;padding:20px} +.ct-card{max-width:760px;margin:0 auto;border:1px solid rgb(var(--app-border));border-radius:12px;padding:22px 26px} +.ct-cardhead{display:flex;gap:20px;align-items:flex-start;position:relative} +.ct-headinfo{flex:1;min-width:0} +.ct-name{font-size:22px;font-weight:700;margin:6px 0 12px} +.ct-star{position:absolute;top:0;right:0;color:rgb(var(--app-muted));cursor:pointer} +.ct-star.on{color:#eab308} +.ct-actions{display:flex;gap:8px;flex-wrap:wrap} +.ct-act{display:inline-flex;align-items:center;gap:7px;padding:7px 12px;border:1px solid rgb(var(--app-border));border-radius:7px;color:rgb(var(--app-fg));cursor:pointer;font-size:13px;background:rgb(var(--app-surface))} +.ct-act:hover{background:rgb(var(--app-hover))} +.ct-sec{margin-top:26px} +.ct-sectitle{font-size:15px;font-weight:700;margin-bottom:6px} +.ct-drow{display:flex;gap:14px;align-items:flex-start;padding:12px 2px;border-top:1px solid rgb(var(--app-border))} +.ct-dico{color:rgb(var(--app-muted));margin-top:2px} +.ct-dlabel{color:rgb(var(--app-muted));font-size:12px} +.ct-dval{margin-top:1px} +.ct-mailrow{display:flex;gap:12px;padding:12px 2px;border-top:1px solid rgb(var(--app-border))} +.ct-mailmain{min-width:0;flex:1} +.ct-mailsub{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} +.ct-mailsnip{color:rgb(var(--app-muted));font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} +.ct-maildate{color:rgb(var(--app-muted));font-size:12px;flex:0 0 auto} +.ct-findbtn{margin-top:14px;display:inline-flex;align-items:center;gap:8px;padding:7px 12px;border-radius:7px;background:rgb(var(--app-hover));cursor:pointer;font-size:13px} +/* --- edit form --- */ +.ct-form{max-width:640px;margin:0 auto;padding:6px 0 40px} +.ct-formav{text-align:center;margin-bottom:6px} +.ct-formav .ct-av{margin:0 auto} +.ct-formav .cap{color:rgb(var(--app-muted));font-size:12px;margin-top:6px} +.ct-frow{display:flex;gap:10px;margin-bottom:12px} +.ct-fsec{font-weight:700;margin:22px 0 10px} +.ct-flabel{width:90px;flex:0 0 auto;color:rgb(var(--app-muted));font-size:13px;padding-top:9px} +.ct-in,.ct-sel{width:100%;background:rgb(var(--app-surface));border:1px solid rgb(var(--app-border));border-radius:6px;padding:8px 10px;color:rgb(var(--app-fg));font-size:14px;outline:none} +.ct-in:focus,.ct-sel:focus{border-color:rgb(var(--app-accent))} +.ct-multi{display:flex;gap:8px;align-items:center;margin-bottom:8px} +.ct-multi .ct-sel{width:130px;flex:0 0 auto} +.ct-rm{color:rgb(var(--app-muted));cursor:pointer;padding:4px;flex:0 0 auto} +.ct-rm:hover{color:rgb(var(--app-fg))} +.ct-addline{color:rgb(var(--app-accent));cursor:pointer;font-size:13px;display:inline-flex;align-items:center;gap:6px;margin-top:2px} +.ct-menu{position:absolute;z-index:20;background:rgb(var(--app-surface));border:1px solid rgb(var(--app-border));border-radius:8px;box-shadow:0 8px 24px rgb(0 0 0 / .3);padding:6px;min-width:180px} +.ct-menu button,.ct-menu label{display:flex;align-items:center;gap:8px;width:100%;text-align:left;padding:7px 9px;border-radius:6px;cursor:pointer;font-size:13px;color:rgb(var(--app-fg))} +.ct-menu button:hover,.ct-menu label:hover{background:rgb(var(--app-hover))} +.ct-primary{background:rgb(var(--app-accent));color:rgb(var(--app-accent-fg));padding:6px 16px;border-radius:6px;font-weight:600;font-size:13px;cursor:pointer} +.ct-primary:hover{opacity:.9} +.ct-ghostbtn{padding:6px 14px;border-radius:6px;cursor:pointer;font-size:13px} +.ct-ghostbtn:hover{background:rgb(var(--app-hover))} +`; + +export default function mount(el, ctx) { + if (!document.getElementById("ct-styles")) { + const style = document.createElement("style"); + style.id = "ct-styles"; + style.textContent = CSS; + document.head.appendChild(style); + } + + const state = { + filter: "all", group: "", groupLabel: "All contacts", + q: "", + contacts: [], groups: [], + selectedId: null, detail: null, + mode: "view", // view | edit | new + mail: null, // { loading, threads } + sortAsc: true, + menu: null, // "groups" | "more" | null + leftW: Number(localStorage.getItem("ct.leftW")) || 240, + leftCollapsed: localStorage.getItem("ct.leftCollapsed") === "1", + menuOpen: false, + me: "", quota: "", + apps: [{ label: "Mail", to: "/mail" }, { label: "Contacts", to: null }], + }; + + const api = ctx.api; + + // ---- data loading -------------------------------------------------------- + async function loadGroups() { + try { state.groups = await api.pluginFetch("/groups"); } catch { state.groups = []; } + } + async function loadContacts() { + const qs = `filter=${encodeURIComponent(state.filter)}&group=${encodeURIComponent(state.group)}&q=${encodeURIComponent(state.q)}`; + const res = await api.pluginFetch(`/contacts?${qs}`); + state.contacts = res.contacts || []; + if (!state.contacts.find((c) => c.id === state.selectedId)) { + state.selectedId = state.contacts[0] ? state.contacts[0].id : null; + } + } + async function loadDetail(id) { + if (!id) { state.detail = null; state.mail = null; return; } + state.detail = await api.pluginFetch(`/contacts/${id}`); + loadMail(state.detail.default_email); + } + async function loadMail(email) { + state.mail = { loading: true, threads: [] }; + if (!email) { state.mail = { loading: false, threads: [] }; render(); return; } + try { + const res = await api.fetch(`/search?q=${encodeURIComponent('"' + email + '"')}&limit=5`); + state.mail = { loading: false, threads: (res.threads || []).map((h) => h.thread) }; + } catch { state.mail = { loading: false, threads: [] }; } + render(); + } + + async function selectContact(id) { + state.selectedId = id; + state.mode = "view"; + state.menu = null; + await loadDetail(id); + render(); + } + + async function reloadList(keepSelection) { + if (!keepSelection) state.selectedId = state.selectedId; + await loadContacts(); + await loadDetail(state.selectedId); + render(); + } + + // ---- sidebar (shared .wm-side-* template; identical to Mail/Calendar) ----- + function navItem(icon, label, active, act) { + return ``; + } + function leftPanel() { + const f = state.filter; + const grp = (g) => ``; + return ` +
+
+ + ${state.menuOpen ? `
${state.apps.map((a, i) => ``).join("")}
` : ""} +
+
+ + +
+
+
+ +
+
+
+ ${navItem(IC_BOOK, "All contacts", !state.group && f === "all", "filter-all")} + ${navItem(IC_STAR, "VIPs", !state.group && f === "vip", "filter-vip")} + ${navItem(IC_CLOCK, "Recent", !state.group && f === "recent", "filter-recent")} +
+
Groups
+
+ ${state.groups.map(grp).join("")} + ${navItem(IC_PERSON, "No group", f === "nogroup", "filter-nogroup")} +
+
+
+ + + ${state.quota ? `
${esc(state.quota)}
` : ""} +
`; + } + + // Collapsed sidebar: a narrow icon-only rail (like Mail) that keeps the expand + // toggle, so it can always be re-opened. + function railPanel() { + const nav = (icon, act, on, title) => ``; + return `
+
+ + +
+
+
+ ${nav(IC_BOOK, "filter-all", !state.group && state.filter === "all", "All contacts")} + ${nav(IC_STAR, "filter-vip", !state.group && state.filter === "vip", "VIPs")} + ${nav(IC_CLOCK, "filter-recent", !state.group && state.filter === "recent", "Recent")} +
+
+ + +
+
`; + } + + // ---- middle: contact list ------------------------------------------------ + function listPanel() { + const rows = [...state.contacts].sort((a, b) => { + const r = (a.display_name || a.primary_email || "").localeCompare(b.display_name || b.primary_email || "", undefined, { sensitivity: "base" }); + return state.sortAsc ? r : -r; + }); + let html = ""; + let letter = null; + for (const c of rows) { + const name = c.display_name || c.primary_email || "(no name)"; + const ch = (name[0] || "#").toUpperCase(); + const key = /[A-Z]/.test(ch) ? ch : "#"; + if (key !== letter) { letter = key; html += `
${esc(letter)}
`; } + html += `
+ ${avatarHtml(c.display_name, c.primary_email, 38)} +
+
${esc(name)}
+
${esc(c.primary_email || "")}
+
`; + } + if (!rows.length) html = `
No contacts${state.q ? " match your search" : " yet"}.
`; + return ` +
+ + + + +
+
${html}
`; + } + + // ---- right: detail / edit ------------------------------------------------ + function detailBar() { + if (state.mode === "edit" || state.mode === "new") { + return `
`; + } + const disabled = state.detail ? "" : "opacity:.4;pointer-events:none"; + return `
+ +
${state.menu === "groups" ? groupsMenu() : ""}
+
${state.menu === "more" ? moreMenu() : ""}
+
`; + } + function groupsMenu() { + const mine = new Set((state.detail.groups || []).map((g) => g.id)); + return `
${state.groups.map((g) => ``).join("") || `
No groups yet
`}
`; + } + function moreMenu() { + return `
`; + } + + function detailPanel() { + if (state.mode === "edit" || state.mode === "new") return editForm(); + const c = state.detail; + if (!c) return `
Select a contact.
`; + const groups = (c.groups || []).map((g) => esc(g.name)).join(", "); + const emailRows = (c.emails && c.emails.length ? c.emails : (c.default_email ? [{ value: c.default_email, type: "personal" }] : [])); + const emailsHtml = emailRows.map((e) => `
${IC_MAIL}
${esc(cap(e.type || "email"))}
`).join(""); + return `
+
+ ${avatarHtml(c.display_name, c.default_email, 84)} +
+
${esc(c.display_name || c.default_email || "(no name)")}
+
+ + + + +
+
+ +
+ +
+
Contact details
+ ${groups ? `
${IC_GROUP}
Groups
${groups}
` : ""} + ${emailsHtml} +
${IC_PENCIL}
${c.notes ? `
Notes
${esc(c.notes)}
` : `Add notes`}
+
+ +
+
Mail
+ ${mailSection(c)} +
+ +
+
Events
+
No matches found
+
+
`; + } + + function mailSection(c) { + if (!state.mail || state.mail.loading) return `
Loading…
`; + if (!state.mail.threads.length) return `
No matches found
`; + const rows = state.mail.threads.map((t) => { + const who = (t.participants && t.participants[0]) ? (t.participants[0].name || t.participants[0].email) : (c.display_name || ""); + return `
${avatarHtml(who, (t.participants && t.participants[0] && t.participants[0].email) || c.default_email, 32)} +
${esc(t.subject || "(no subject)")}
${esc(t.snippet || "")}
+
${esc(shortDate(t.last_message_at))}
`; + }).join(""); + return rows + ``; + } + + // ---- edit form ----------------------------------------------------------- + function typeSelect(kind, current) { + const opts = kind === "email" ? EMAIL_TYPES : kind === "phone" ? PHONE_TYPES : ADDR_TYPES; + return ``; + } + function emailRow(e) { + return `
${typeSelect("email", (e && e.type) || "personal")}✕
`; + } + function phoneRow(p) { + return `
${typeSelect("phone", (p && p.type) || "mobile")}✕
`; + } + function editForm() { + const c = state.detail && state.mode === "edit" ? state.detail : {}; + const np = c.name_parts || {}; + const emails = (c.emails && c.emails.length ? c.emails : [null]); + const phones = (c.phones && c.phones.length ? c.phones : [null]); + const url0 = (c.urls && c.urls[0]) || {}; + const ad0 = (c.addresses && c.addresses[0]) || {}; + const bday = c.birthday ? new Date(c.birthday) : null; + const monthSel = ``; + return `
+
${avatarHtml(c.display_name, c.default_email, 88)}
Photo from initials
+
+ + + +
+
+ + + +
+ +
Personal
+
Nickname
+
Birthday
${monthSel} + +
+ +
Email
+
${emails.map(emailRow).join("")}
+ ${PLUS_ICON} Add email + +
Phone
+
${phones.map(phoneRow).join("")}
+ ${PLUS_ICON} Add phone + +
Online
+
+ +
Address
+
${typeSelectAddr(ad0.type || "home")}
+
+
+ +
Notes
+ +
`; + } + function typeSelectAddr(current) { + return ``; + } + + function collectForm() { + const v = (sel) => { const n = el.querySelector(sel); return n ? n.value.trim() : ""; }; + const emails = [...el.querySelectorAll("[data-emailrow]")].map((r) => ({ value: r.querySelector("[data-val]").value.trim(), type: r.querySelector("[data-type]").value })).filter((e) => e.value); + const phones = [...el.querySelectorAll("[data-phonerow]")].map((r) => ({ value: r.querySelector("[data-val]").value.trim(), type: r.querySelector("[data-type]").value })).filter((p) => p.value); + const given = v("[data-f=given]"), family = v("[data-f=family]"), prefix = v("[data-f=prefix]"); + const display = [prefix, given, family].filter(Boolean).join(" ") || (emails[0] ? emails[0].value : ""); + const month = v("[data-f=bmonth]"), day = v("[data-f=bday]"), year = v("[data-f=byear]"); + let birthday = null; + if (month && day && year) birthday = `${year.padStart(4, "0")}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`; + const url = v("[data-f=url]"); + const addr = { type: v("[data-f=addrtype]") || "home", country: v("[data-f=country]"), street: v("[data-f=street]"), postal_code: v("[data-f=postal]"), city: v("[data-f=city]") }; + const hasAddr = addr.country || addr.street || addr.postal_code || addr.city; + return { + display_name: display, + name_parts: { prefix, given, family, middle: "", suffix: "" }, + nickname: v("[data-f=nickname]"), + title: v("[data-f=title]"), department: v("[data-f=department]"), org: v("[data-f=org]"), + birthday, + emails, default_email: emails[0] ? emails[0].value : "", + phones, + urls: url ? [{ value: url, type: "website" }] : [], + addresses: hasAddr ? [addr] : [], + notes: v("[data-f=notes]"), + starred: state.detail ? !!state.detail.starred : false, + group_ids: state.detail ? (state.detail.groups || []).map((g) => g.id) : [], + }; + } + + async function saveForm() { + const body = collectForm(); + if (state.mode === "new") { + const res = await api.pluginFetch("/contacts", { method: "POST", body: JSON.stringify(body) }); + state.selectedId = res.id; + } else { + await api.pluginFetch(`/contacts/${state.selectedId}`, { method: "PUT", body: JSON.stringify(body) }); + } + state.mode = "view"; + await loadGroups(); + await reloadList(true); + } + + // ---- render + wire ------------------------------------------------------- + function render() { + el.innerHTML = `
+ ${state.leftCollapsed ? railPanel() : `
${leftPanel()}
`} +
${listPanel()}
+
${detailBar()}${detailPanel()}
+
`; + wire(); + } + + function wire() { + const on = (sel, ev, fn) => el.querySelectorAll(sel).forEach((n) => n.addEventListener(ev, fn)); + const act = (name, fn) => on(`[data-act="${name}"]`, "click", fn); + const setFilter = (f) => { state.filter = f; state.group = ""; state.menuOpen = false; reloadList(false); }; + + on("[data-app]", "click", (e) => { const a = state.apps[Number(e.currentTarget.getAttribute("data-app"))]; state.menuOpen = false; if (a.to) ctx.navigate(a.to); else render(); }); + act("menu", () => { state.menuOpen = !state.menuOpen; render(); }); + act("left-toggle", () => { state.leftCollapsed = !state.leftCollapsed; try { localStorage.setItem("ct.leftCollapsed", state.leftCollapsed ? "1" : "0"); } catch { /* ignore */ } render(); }); + act("theme", () => { const dark = document.documentElement.classList.toggle("dark"); try { localStorage.setItem("theme", dark ? "dark" : "light"); } catch { /* ignore */ } render(); }); + act("settings", () => ctx.navigate("/settings?from=%2Fp%2Fcontacts")); + act("signout", async () => { await api.fetch("/auth/logout", { method: "POST" }); ctx.navigate("/login"); }); + + act("filter-all", () => setFilter("all")); + act("filter-vip", () => setFilter("vip")); + act("filter-recent", () => setFilter("recent")); + act("filter-nogroup", () => setFilter("nogroup")); + on("[data-group]", "click", (e) => { + state.group = e.currentTarget.getAttribute("data-group"); + state.groupLabel = e.currentTarget.getAttribute("data-groupname"); + state.filter = "group"; state.menuOpen = false; reloadList(false); + }); + + on("[data-contact]", "click", (e) => selectContact(e.currentTarget.getAttribute("data-contact"))); + act("sort", () => { state.sortAsc = !state.sortAsc; render(); }); + act("new", () => { state.mode = "new"; state.selectedId = null; state.detail = null; render(); }); + + // detail actions + act("edit", () => { state.mode = "edit"; state.menu = null; render(); }); + act("cancel", () => { state.mode = "view"; render(); }); + act("save", () => saveForm()); + act("star", async () => { const r = await api.pluginFetch(`/contacts/${state.selectedId}/star`, { method: "POST" }); state.detail.starred = r.starred; render(); }); + act("call", () => { const p = state.detail.phones && state.detail.phones[0]; if (p) window.open(`tel:${p.value}`); }); + act("message", () => { if (state.detail.default_email) window.location.href = `mailto:${state.detail.default_email}`; }); + act("compose", () => { if (state.detail.default_email) window.location.href = `mailto:${state.detail.default_email}`; }); + act("invite", () => ctx.navigate("/p/calendar")); + act("find-mail", () => ctx.navigate(`/mail/search/${encodeURIComponent('"' + state.detail.default_email + '"')}`)); + + // menus + act("menu-groups", (e) => { e.stopPropagation(); state.menu = state.menu === "groups" ? null : "groups"; render(); }); + act("menu-more", (e) => { e.stopPropagation(); state.menu = state.menu === "more" ? null : "more"; render(); }); + on("[data-stop]", "click", (e) => e.stopPropagation()); + on("[data-toggle-group]", "change", async (e) => { + const gid = e.currentTarget.getAttribute("data-toggle-group"); + const cur = new Set((state.detail.groups || []).map((g) => g.id)); + if (e.currentTarget.checked) cur.add(gid); else cur.delete(gid); + const body = detailToBody(state.detail, [...cur]); + await api.pluginFetch(`/contacts/${state.selectedId}`, { method: "PUT", body: JSON.stringify(body) }); + await loadGroups(); await loadDetail(state.selectedId); render(); + }); + act("delete", async () => { + state.menu = null; + await api.pluginFetch(`/contacts/${state.selectedId}`, { method: "DELETE" }); + state.selectedId = null; + await reloadList(false); + }); + + // edit form multi-rows + act("add-email", () => { const box = el.querySelector("[data-emails]"); const w = document.createElement("div"); w.innerHTML = emailRow(null); const row = w.firstElementChild; row.querySelector("[data-act=rm-email]").addEventListener("click", () => row.remove()); box.appendChild(row); }); + act("add-phone", () => { const box = el.querySelector("[data-phones]"); const w = document.createElement("div"); w.innerHTML = phoneRow(null); const row = w.firstElementChild; row.querySelector("[data-act=rm-phone]").addEventListener("click", () => row.remove()); box.appendChild(row); }); + on("[data-act=rm-email]", "click", (e) => e.currentTarget.closest("[data-emailrow]").remove()); + on("[data-act=rm-phone]", "click", (e) => e.currentTarget.closest("[data-phonerow]").remove()); + + // close popover menus on outside click + if (state.menu || state.menuOpen) { + setTimeout(() => { + const close = () => { state.menu = null; state.menuOpen = false; document.removeEventListener("click", close); render(); }; + document.addEventListener("click", close); + }, 0); + } + } + + // Map a loaded detail contact back into a ContactIn body (for group toggles). + function detailToBody(c, groupIds) { + return { + display_name: c.display_name, name_parts: c.name_parts || {}, nickname: c.nickname || "", + title: c.title || "", department: c.department || "", org: c.org || "", + birthday: c.birthday || null, emails: c.emails || [], default_email: c.default_email || "", + phones: c.phones || [], urls: c.urls || [], addresses: c.addresses || [], + notes: c.notes || "", starred: !!c.starred, group_ids: groupIds, + }; + } + + async function loadChrome() { + try { + const manifest = await api.fetch("/plugins/ui-manifest"); + const pages = (manifest.plugins || []).flatMap((p) => p.pages.map((pg) => ({ label: pg.nav.label, to: pg.route === "/contacts" ? null : "/p" + pg.route }))); + state.apps = [{ label: "Mail", to: "/mail" }, ...pages]; + } catch { /* keep defaults */ } + try { const accounts = await api.fetch("/accounts"); if (accounts && accounts[0]) state.me = accounts[0].email; } catch { /* ignore */ } + try { + const q = await api.fetch("/settings/quota"); + if (q && q.quota_bytes) { + const pct = (q.used_bytes / q.quota_bytes) * 100; + const gb = q.quota_bytes / 1024 ** 3; + state.quota = `${pct >= 10 ? Math.round(pct) : Math.round(pct * 10) / 10}% of ${Number.isInteger(gb) ? gb : gb.toFixed(1)} GB`; + } + } catch { /* ignore */ } + } + + (async () => { + await loadChrome(); + await loadGroups(); + await loadContacts(); + await loadDetail(state.selectedId); + render(); + })(); + + return () => { el.innerHTML = ""; }; +} diff --git a/screenshots/contacts-2.png b/screenshots/contacts-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2d879d0bbaae7e2efbca39324a93eeaf6597d474 GIT binary patch literal 140707 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 n6Nc}iw&J)`u0^_rUwcN>Wj=cRFoGMD@-J1lj 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 x41)!>@7WLA$9u^