feat(contacts): add no-category filter, drag-drop to category, and category combo box

- Add 'No Category' sidebar item to filter uncategorized contacts
- Categories section now always visible (not just when keywords exist)
- Add drag-and-drop support on category items in sidebar to assign keywords
- Fix effectAllowed mismatch (move -> copyMove) for category drop targets
- Replace plain text categories input with combo box in contact edit form
  - Shows existing categories as clickable suggestions
  - Displays assigned categories as removable badges
  - Supports adding new categories inline
- Add translations for all 8 locales
This commit is contained in:
Linus Rath
2026-03-21 03:04:36 +01:00
parent 2d834213ee
commit 089583a9ef
12 changed files with 357 additions and 60 deletions
+5 -1
View File
@@ -1482,6 +1482,9 @@
"title": "Kontakte",
"search_placeholder": "Kontakte suchen...",
"create_new": "Neuer Kontakt",
"no_category": "Ohne Kategorie",
"category_added": "Kontakt zu {name} hinzugefügt",
"category_added_plural": "{count} Kontakte zu {name} hinzugefügt",
"empty_state": "Keine Kontakte",
"empty_state_title": "Keine Kontakte",
"empty_state_subtitle": "Erstellen Sie Ihren ersten Kontakt oder importieren Sie aus einer vCard-Datei",
@@ -1625,7 +1628,8 @@
"level_low": "Niedrig",
"categories": "Kategorien",
"categories_placeholder": "z. B. Familie, Freunde, Kollegen",
"categories_hint": "Mit Kommas trennen",
"categories_hint": "Tippen zum Suchen oder Hinzufügen",
"category_add": "Hinzufügen",
"note": "Notizen",
"note_placeholder": "Notiz hinzufügen...",
"gender": "Geschlecht",
+5 -1
View File
@@ -1495,6 +1495,9 @@
"title": "Contacts",
"search_placeholder": "Search contacts...",
"create_new": "New Contact",
"no_category": "No Category",
"category_added": "Contact added to {name}",
"category_added_plural": "{count} contacts added to {name}",
"empty_state": "No contacts yet",
"empty_state_title": "No contacts yet",
"empty_state_subtitle": "Create your first contact or import from a vCard file",
@@ -1638,7 +1641,8 @@
"level_low": "Low",
"categories": "Categories",
"categories_placeholder": "e.g., Family, Friends, Colleagues",
"categories_hint": "Separate with commas",
"categories_hint": "Type to search or add categories",
"category_add": "Add",
"note": "Notes",
"note_placeholder": "Add a note...",
"gender": "Gender",
+5 -1
View File
@@ -1482,6 +1482,9 @@
"title": "Contactos",
"search_placeholder": "Buscar contactos...",
"create_new": "Nuevo contacto",
"no_category": "Sin categoría",
"category_added": "Contacto añadido a {name}",
"category_added_plural": "{count} contactos añadidos a {name}",
"empty_state": "No hay contactos",
"empty_state_title": "Sin contactos",
"empty_state_subtitle": "Crea tu primer contacto o importa desde un archivo vCard",
@@ -1625,7 +1628,8 @@
"level_low": "Bajo",
"categories": "Categorías",
"categories_placeholder": "p. ej., Familia, Amigos, Colegas",
"categories_hint": "Separar con comas",
"categories_hint": "Escriba para buscar o añadir categorías",
"category_add": "Añadir",
"note": "Notas",
"note_placeholder": "Agregar una nota...",
"gender": "Género",
+5 -1
View File
@@ -1482,6 +1482,9 @@
"title": "Contacts",
"search_placeholder": "Rechercher des contacts...",
"create_new": "Nouveau contact",
"no_category": "Sans catégorie",
"category_added": "Contact ajouté à {name}",
"category_added_plural": "{count} contacts ajoutés à {name}",
"empty_state": "Aucun contact",
"empty_state_title": "Aucun contact",
"empty_state_subtitle": "Créez votre premier contact ou importez depuis un fichier vCard",
@@ -1625,7 +1628,8 @@
"level_low": "Faible",
"categories": "Catégories",
"categories_placeholder": "p. ex., Famille, Amis, Collègues",
"categories_hint": "Séparer par des virgules",
"categories_hint": "Tapez pour rechercher ou ajouter",
"category_add": "Ajouter",
"note": "Notes",
"note_placeholder": "Ajouter une note...",
"gender": "Genre",
+5 -1
View File
@@ -1482,6 +1482,9 @@
"title": "Contatti",
"search_placeholder": "Cerca contatti...",
"create_new": "Nuovo contatto",
"no_category": "Senza categoria",
"category_added": "Contatto aggiunto a {name}",
"category_added_plural": "{count} contatti aggiunti a {name}",
"empty_state": "Nessun contatto",
"empty_state_title": "Nessun contatto",
"empty_state_subtitle": "Crea il tuo primo contatto o importa da un file vCard",
@@ -1625,7 +1628,8 @@
"level_low": "Basso",
"categories": "Categorie",
"categories_placeholder": "es., Famiglia, Amici, Colleghi",
"categories_hint": "Separare con virgole",
"categories_hint": "Digita per cercare o aggiungere",
"category_add": "Aggiungi",
"note": "Note",
"note_placeholder": "Aggiungi una nota...",
"gender": "Genere",
+5 -1
View File
@@ -1482,6 +1482,9 @@
"title": "連絡先",
"search_placeholder": "連絡先を検索...",
"create_new": "新しい連絡先",
"no_category": "カテゴリなし",
"category_added": "{name} に連絡先を追加しました",
"category_added_plural": "{count} 件の連絡先を {name} に追加しました",
"empty_state": "連絡先がありません",
"empty_state_title": "連絡先がありません",
"empty_state_subtitle": "最初の連絡先を作成するか、vCardファイルからインポートしてください",
@@ -1625,7 +1628,8 @@
"level_low": "低",
"categories": "カテゴリー",
"categories_placeholder": "例:家族、友人、同僚",
"categories_hint": "カンマで区切ってください",
"categories_hint": "検索または追加するには入力",
"category_add": "追加",
"note": "メモ",
"note_placeholder": "メモを追加...",
"gender": "性別",
+5 -1
View File
@@ -1482,6 +1482,9 @@
"title": "Contacten",
"search_placeholder": "Contacten zoeken...",
"create_new": "Nieuw contact",
"no_category": "Geen categorie",
"category_added": "Contact toegevoegd aan {name}",
"category_added_plural": "{count} contacten toegevoegd aan {name}",
"empty_state": "Geen contacten",
"empty_state_title": "Geen contacten",
"empty_state_subtitle": "Maak uw eerste contact aan of importeer vanuit een vCard-bestand",
@@ -1625,7 +1628,8 @@
"level_low": "Laag",
"categories": "Categorieën",
"categories_placeholder": "bijv. Familie, Vrienden, Collega's",
"categories_hint": "Scheiden met komma's",
"categories_hint": "Typ om te zoeken of toe te voegen",
"category_add": "Toevoegen",
"note": "Notities",
"note_placeholder": "Notitie toevoegen...",
"gender": "Geslacht",
+5 -1
View File
@@ -1482,6 +1482,9 @@
"title": "Contatos",
"search_placeholder": "Pesquisar contatos...",
"create_new": "Novo contato",
"no_category": "Sem categoria",
"category_added": "Contato adicionado a {name}",
"category_added_plural": "{count} contatos adicionados a {name}",
"empty_state": "Nenhum contato",
"empty_state_title": "Sem contatos",
"empty_state_subtitle": "Crie seu primeiro contato ou importe de um arquivo vCard",
@@ -1625,7 +1628,8 @@
"level_low": "Baixo",
"categories": "Categorias",
"categories_placeholder": "ex., Família, Amigos, Colegas",
"categories_hint": "Separar com vírgulas",
"categories_hint": "Digite para pesquisar ou adicionar",
"category_add": "Adicionar",
"note": "Notas",
"note_placeholder": "Adicionar uma nota...",
"gender": "Gênero",