feat: add address book directories with drag-and-drop and editor picker

- Show address books in sidebar organized by personal directories and
  shared accounts, replacing the flat shared accounts list
- Make contact list items draggable with multi-select support using
  native HTML5 drag-and-drop (application/x-contact-ids MIME type)
- Add drop targets on sidebar address book items with visual feedback
- Add moveContactToAddressBook store method supporting same-account
  updates and cross-account create+delete moves
- Add address book picker dropdown in contact create/edit form
- Update ContactCategory type from sharedAccountId to addressBookId
- Add address_books translations to all 8 locales
- Fix contact-list-item tests for new selectedContactIds prop
This commit is contained in:
Linus Rath
2026-03-19 01:13:34 +01:00
parent fc79bf4f9b
commit af115e3245
17 changed files with 766 additions and 81 deletions
+12
View File
@@ -1469,6 +1469,16 @@
"all": "Alle",
"groups": "Gruppen"
},
"shared": {
"title": "Geteilt"
},
"address_books": {
"title": "Verzeichnisse",
"moved": "Kontakt verschoben nach {name}",
"moved_plural": "{count} Kontakte verschoben nach {name}",
"move_failed": "Kontakt konnte nicht verschoben werden",
"address_book": "Verzeichnis"
},
"detail": {
"emails": "E-Mail-Adressen",
"phones": "Telefonnummern",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "Neuer Kontakt",
"edit_title": "Kontakt bearbeiten",
"section_address_book": "Verzeichnis",
"select_address_book": "Verzeichnis auswählen...",
"section_identity": "Name & Identität",
"section_work": "Beruf & Organisation",
"prefix": "Anrede",
+12
View File
@@ -1469,6 +1469,16 @@
"all": "All",
"groups": "Groups"
},
"shared": {
"title": "Shared"
},
"address_books": {
"title": "Directories",
"moved": "Contact moved to {name}",
"moved_plural": "{count} contacts moved to {name}",
"move_failed": "Failed to move contact",
"address_book": "Directory"
},
"detail": {
"emails": "Email Addresses",
"phones": "Phone Numbers",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "New Contact",
"edit_title": "Edit Contact",
"section_address_book": "Directory",
"select_address_book": "Select a directory...",
"section_identity": "Name & Identity",
"section_work": "Work & Organization",
"prefix": "Prefix",
+12
View File
@@ -1469,6 +1469,16 @@
"all": "Todos",
"groups": "Grupos"
},
"shared": {
"title": "Compartidos"
},
"address_books": {
"title": "Directorios",
"moved": "Contacto movido a {name}",
"moved_plural": "{count} contactos movidos a {name}",
"move_failed": "Error al mover el contacto",
"address_book": "Directorio"
},
"detail": {
"emails": "Direcciones de correo",
"phones": "Números de teléfono",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "Nuevo contacto",
"edit_title": "Editar contacto",
"section_address_book": "Directorio",
"select_address_book": "Seleccionar un directorio...",
"section_identity": "Nombre e identidad",
"section_work": "Trabajo y organización",
"prefix": "Prefijo",
+12
View File
@@ -1469,6 +1469,16 @@
"all": "Tous",
"groups": "Groupes"
},
"shared": {
"title": "Partagés"
},
"address_books": {
"title": "Répertoires",
"moved": "Contact déplacé vers {name}",
"moved_plural": "{count} contacts déplacés vers {name}",
"move_failed": "Échec du déplacement du contact",
"address_book": "Répertoire"
},
"detail": {
"emails": "Adresses e-mail",
"phones": "Numéros de téléphone",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "Nouveau contact",
"edit_title": "Modifier le contact",
"section_address_book": "Répertoire",
"select_address_book": "Sélectionner un répertoire...",
"section_identity": "Nom et identité",
"section_work": "Travail et organisation",
"prefix": "Préfixe",
+12
View File
@@ -1469,6 +1469,16 @@
"all": "Tutti",
"groups": "Gruppi"
},
"shared": {
"title": "Condivisi"
},
"address_books": {
"title": "Rubriche",
"moved": "Contatto spostato in {name}",
"moved_plural": "{count} contatti spostati in {name}",
"move_failed": "Impossibile spostare il contatto",
"address_book": "Rubrica"
},
"detail": {
"emails": "Indirizzi email",
"phones": "Numeri di telefono",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "Nuovo contatto",
"edit_title": "Modifica contatto",
"section_address_book": "Rubrica",
"select_address_book": "Seleziona una rubrica...",
"section_identity": "Nome e identità",
"section_work": "Lavoro e organizzazione",
"prefix": "Prefisso",
+12
View File
@@ -1469,6 +1469,16 @@
"all": "すべて",
"groups": "グループ"
},
"shared": {
"title": "共有"
},
"address_books": {
"title": "ディレクトリ",
"moved": "連絡先を {name} に移動しました",
"moved_plural": "{count} 件の連絡先を {name} に移動しました",
"move_failed": "連絡先の移動に失敗しました",
"address_book": "ディレクトリ"
},
"detail": {
"emails": "メールアドレス",
"phones": "電話番号",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "新しい連絡先",
"edit_title": "連絡先を編集",
"section_address_book": "ディレクトリ",
"select_address_book": "ディレクトリを選択...",
"section_identity": "名前と識別情報",
"section_work": "職業と組織",
"prefix": "敬称",
+12
View File
@@ -1469,6 +1469,16 @@
"all": "Alle",
"groups": "Groepen"
},
"shared": {
"title": "Gedeeld"
},
"address_books": {
"title": "Adresboeken",
"moved": "Contact verplaatst naar {name}",
"moved_plural": "{count} contacten verplaatst naar {name}",
"move_failed": "Verplaatsen van contact mislukt",
"address_book": "Adresboek"
},
"detail": {
"emails": "E-mailadressen",
"phones": "Telefoonnummers",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "Nieuw contact",
"edit_title": "Contact bewerken",
"section_address_book": "Adresboek",
"select_address_book": "Selecteer een adresboek...",
"section_identity": "Naam en identiteit",
"section_work": "Werk en organisatie",
"prefix": "Voorvoegsel",
+12
View File
@@ -1469,6 +1469,16 @@
"all": "Todos",
"groups": "Grupos"
},
"shared": {
"title": "Compartilhados"
},
"address_books": {
"title": "Diretórios",
"moved": "Contato movido para {name}",
"moved_plural": "{count} contatos movidos para {name}",
"move_failed": "Falha ao mover o contato",
"address_book": "Diretório"
},
"detail": {
"emails": "Endereços de e-mail",
"phones": "Números de telefone",
@@ -1524,6 +1534,8 @@
"form": {
"create_title": "Novo contato",
"edit_title": "Editar contato",
"section_address_book": "Diretório",
"select_address_book": "Selecionar um diretório...",
"section_identity": "Nome e identidade",
"section_work": "Trabalho e organização",
"prefix": "Prefixo",