Contacts plugin: - Detail pane now renders ALL populated fields (job/company subtitle, every email, phones, addresses, websites, nickname, birthday, notes) — not just the email. - Company fallback for the display name: personal name → company → email, applied at read time so existing contacts whose name_display holds only the email now show the company without a re-save; name_display no longer stores emails going forward. - Search box in the list top bar (like Calendar): debounced, matches name/email/company, keeps focus + caret across re-renders. - Mail-style selection: hovering a row's avatar reveals a square checkbox; once anything is checked every row shows one (select mode), the bar "select all" matches and aligns with the row checkboxes, and the detail pane shows "N contact(s) selected". - Delete contact now confirms via a modal. - Empty reading pane shows contacts-illustration.svg (served from the plugin's ui/ dir), mirroring Mail's email-illustration empty state. Calendar: - Invite from a contact opens /p/calendar?guest=<email>, which pops a new-event form with that guest already added, then strips the param. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U72FZiF1W1pb8XxyWBTREA
21 lines
672 B
TOML
21 lines
672 B
TOML
[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", "ui/*.svg", "migrations/versions/*.py"]
|