From f6e4aaa2545e18a87b3be2f7c888c65531d7ae6b Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Wed, 28 Oct 2026 03:12:17 +0100 Subject: [PATCH] fix: start the new group with the selected contacts when Add to group finds no group --- .../contacts/__tests__/contacts-app.test.tsx | 16 ++++++++++ components/contacts/contacts-app.tsx | 30 +++++++++++++++++-- locales/ar/common.json | 1 + locales/ca/common.json | 1 + locales/cs/common.json | 1 + locales/da/common.json | 1 + locales/de/common.json | 1 + locales/en/common.json | 1 + locales/es/common.json | 1 + locales/et/common.json | 1 + locales/fa/common.json | 1 + locales/fr/common.json | 1 + locales/he/common.json | 1 + locales/hu/common.json | 1 + locales/it/common.json | 1 + locales/ja/common.json | 1 + locales/ko/common.json | 1 + locales/lv/common.json | 1 + locales/mn/common.json | 1 + locales/nb/common.json | 1 + locales/nl/common.json | 1 + locales/pl/common.json | 1 + locales/pt/common.json | 1 + locales/ro/common.json | 1 + locales/ru/common.json | 1 + locales/sk/common.json | 1 + locales/th/common.json | 1 + locales/tr/common.json | 1 + locales/uk/common.json | 1 + locales/zh-TW/common.json | 1 + locales/zh/common.json | 1 + 31 files changed, 72 insertions(+), 3 deletions(-) diff --git a/components/contacts/__tests__/contacts-app.test.tsx b/components/contacts/__tests__/contacts-app.test.tsx index 70ede99f9..92d85a53b 100644 --- a/components/contacts/__tests__/contacts-app.test.tsx +++ b/components/contacts/__tests__/contacts-app.test.tsx @@ -125,4 +125,20 @@ describe('ContactsApp', () => { expect(screen.queryByRole('alertdialog')).toBeNull(); expect(useContactStore.getState().selectedContactId).toBe('c-bob'); }); + + it('starts a new group with the contact when "Add to group" finds no group to add to', () => { + renderContacts(); + fireEvent.contextMenu(screen.getByText('Alice Smith')); + fireEvent.click(screen.getByText('context_menu.add_to_group')); + expect(screen.getByText('groups.members_label (1)')).toBeInTheDocument(); + }); + + it('offers a new group, with the selection in it, next to the existing groups', () => { + const team: ContactCard = { id: 'g-team', kind: 'group', addressBookIds: {}, name: { full: 'Team' }, members: {} }; + renderContacts([alice, bob, team]); + fireEvent.contextMenu(screen.getByText('Bob Jones')); + fireEvent.click(screen.getByText('context_menu.add_to_group')); + fireEvent.click(screen.getByText('bulk.new_group')); + expect(screen.getByText('groups.members_label (1)')).toBeInTheDocument(); + }); }); diff --git a/components/contacts/contacts-app.tsx b/components/contacts/contacts-app.tsx index 00022db5b..25246579b 100644 --- a/components/contacts/contacts-app.tsx +++ b/components/contacts/contacts-app.tsx @@ -4,7 +4,7 @@ import { Suspense, useState, useEffect, useCallback, useRef, useMemo } from "rea import { useTranslations } from "next-intl"; import { useSearchParams } from "next/navigation"; import { useRouter } from "@/i18n/navigation"; -import { ArrowLeft, Users, AlertTriangle } from "@/components/icons"; +import { ArrowLeft, Users, UsersRound, AlertTriangle } from "@/components/icons"; import { Button } from "@/components/ui/button"; import { ConfirmDialog } from "@/components/ui/confirm-dialog"; import { useConfirmDialog } from "@/hooks/use-confirm-dialog"; @@ -130,6 +130,8 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = const [returnToEmail, setReturnToEmail] = useState(false); const [renamingKeyword, setRenamingKeyword] = useState(null); const [selectedGroupId, setSelectedGroupId] = useState(null); + // Who a new group starts with: the selection when it came from "Add to group". + const [newGroupMemberIds, setNewGroupMemberIds] = useState([]); const [directorySelection, setDirectorySelection] = useState>(() => new Set()); const [openDirectoryKey, setOpenDirectoryKey] = useState(null); const directoryPrincipals = useContactStore((s) => s.directoryPrincipals); @@ -538,6 +540,8 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = clearSelection(); toggleContactSelection(id); if (groups.length === 0) { + // No group to add to yet: a new one, with the contact already in it. + setNewGroupMemberIds([id]); setView("group-create"); return; } @@ -630,6 +634,14 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = const handleCreateGroup = () => { setSelectedGroupId(null); + setNewGroupMemberIds([]); + setView("group-create"); + }; + + // "Add to group": a new group starting with the selected contacts. + const handleCreateGroupFromSelection = () => { + setSelectedGroupId(null); + setNewGroupMemberIds(Array.from(selectedContactIds)); setView("group-create"); }; @@ -769,9 +781,10 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = } else { await createGroup(jmapClient, name, memberIds); toast.success(t("toast.created")); + clearSelection(); setView("list"); } - }, [view, selectedGroup, selectedGroupMembers, supportsSync, client, createGroup, updateGroup, addMembersToGroup, removeMembersFromGroup, t]); + }, [view, selectedGroup, selectedGroupMembers, supportsSync, client, createGroup, updateGroup, addMembersToGroup, removeMembersFromGroup, clearSelection, t]); const handleRemoveGroupMember = async (memberId: string) => { if (!selectedGroup) return; @@ -815,7 +828,7 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = const handleBulkAddToGroup = () => { if (selectedContactIds.size === 0) return; if (groups.length === 0) { - setView("group-create"); + handleCreateGroupFromSelection(); return; } setView("bulk-add-to-group"); @@ -897,6 +910,7 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps = return (
+ {groups.map((group) => { const gName = getContactDisplayName(group); const memberCount = group.members diff --git a/locales/ar/common.json b/locales/ar/common.json index 2dde4daff..410902493 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {تم حذف جهة اتصال واحدة} other {تم حذف # جهة اتصال}}", "add_to_group": "إضافة إلى مجموعة", "choose_group": "اختر مجموعة", + "new_group": "مجموعة جديدة…", "adding_contacts": "جارٍ إضافة {count, plural, one {جهة اتصال واحدة} other {# جهة اتصال}}", "added_to_group": "تمت إضافة جهات الاتصال إلى المجموعة", "export": "تصدير", diff --git a/locales/ca/common.json b/locales/ca/common.json index 3c0e86170..d7d311832 100644 --- a/locales/ca/common.json +++ b/locales/ca/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {1 contacte suprimit} other {# contactes suprimits}}", "add_to_group": "Afegeix al grup", "choose_group": "Trieu un grup", + "new_group": "Grup nou…", "adding_contacts": "Afegint {count, plural, one {1 contacte} other {# contactes}}", "added_to_group": "Contactes afegits al grup", "export": "Exporta", diff --git a/locales/cs/common.json b/locales/cs/common.json index f65032b85..00f7e9aa6 100644 --- a/locales/cs/common.json +++ b/locales/cs/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {Odstraněn 1 kontakt} few {Odstraněny # kontakty} other {Odstraněno # kontaktů}}", "add_to_group": "Přidat do skupiny", "choose_group": "Vyberte skupinu", + "new_group": "Nová skupina…", "adding_contacts": "Přidávání {count, plural, one {1 kontaktu} few {# kontaktů} other {# kontaktů}}", "added_to_group": "Kontakty byly přidány do skupiny", "export": "Exportovat", diff --git a/locales/da/common.json b/locales/da/common.json index 91e8874d1..591d9e76b 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 kontakt slettet} other {# kontakter slettet}}", "add_to_group": "Tilføj til gruppe", "choose_group": "Vælg en gruppe", + "new_group": "Ny gruppe…", "adding_contacts": "Tilføjer {count, plural, one {1 kontakt} other {# kontakter}}", "added_to_group": "Kontakter tilføjet til gruppe", "export": "Eksportér", diff --git a/locales/de/common.json b/locales/de/common.json index ad3764a02..e2de15a86 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 Kontakt gelöscht} other {# Kontakte gelöscht}}", "add_to_group": "Zur Gruppe hinzufügen", "choose_group": "Gruppe wählen", + "new_group": "Neue Gruppe…", "adding_contacts": "{count, plural, one {1 Kontakt} other {# Kontakte}} hinzufügen", "added_to_group": "Kontakte zur Gruppe hinzugefügt", "export": "Exportieren", diff --git a/locales/en/common.json b/locales/en/common.json index ea600c9e0..c0eb53260 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {1 contact deleted} other {# contacts deleted}}", "add_to_group": "Add to group", "choose_group": "Choose a group", + "new_group": "New group…", "adding_contacts": "Adding {count, plural, one {1 contact} other {# contacts}}", "added_to_group": "Contacts added to group", "export": "Export", diff --git a/locales/es/common.json b/locales/es/common.json index 35ff19aa1..da13d2417 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 contacto eliminado} other {# contactos eliminados}}", "add_to_group": "Agregar al grupo", "choose_group": "Elegir un grupo", + "new_group": "Nuevo grupo…", "adding_contacts": "Agregando {count, plural, one {1 contacto} other {# contactos}}", "added_to_group": "Contactos agregados al grupo", "export": "Exportar", diff --git a/locales/et/common.json b/locales/et/common.json index 07d74c66d..81009d7ac 100644 --- a/locales/et/common.json +++ b/locales/et/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {Kustutati 1 kontakt} other {Kustutati # kontakti}}", "add_to_group": "Lisa gruppi", "choose_group": "Vali grupp", + "new_group": "Uus rühm…", "adding_contacts": "Lisamine: {count, plural, one {1 kontakt} other {# kontakti}}", "added_to_group": "Kontaktid lisati gruppi", "export": "Eksport", diff --git a/locales/fa/common.json b/locales/fa/common.json index 0f1a2348d..770449c16 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {۱ مخاطب حذف شد} other {# مخاطب حذف شد}}", "add_to_group": "افزودن به گروه", "choose_group": "انتخاب گروه", + "new_group": "گروه جدید…", "adding_contacts": "افزودن {count, plural, one {۱ مخاطب} other {# مخاطب}}", "added_to_group": "مخاطبین به گروه اضافه شدند", "export": "خروجی", diff --git a/locales/fr/common.json b/locales/fr/common.json index 10352f174..552692e53 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 contact supprimé} other {# contacts supprimés}}", "add_to_group": "Ajouter au groupe", "choose_group": "Choisir un groupe", + "new_group": "Nouveau groupe…", "adding_contacts": "Ajout de {count, plural, one {1 contact} other {# contacts}}", "added_to_group": "Contacts ajoutés au groupe", "export": "Exporter", diff --git a/locales/he/common.json b/locales/he/common.json index fdea729be..3424b6b38 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -3103,6 +3103,7 @@ "deleted": "{count, plural, one {נמחק איש קשר אחד} other {נמחקו # אנשי קשר}}", "add_to_group": "הוסף לקבוצה", "choose_group": "בחר קבוצה", + "new_group": "קבוצה חדשה…", "adding_contacts": "מוסיף {count, plural, one {איש קשר אחד} other {# אנשי קשר}}", "added_to_group": "אנשי קשר נוספו לקבוצה", "export": "ייצוא", diff --git a/locales/hu/common.json b/locales/hu/common.json index bf547c5be..a0a832fc2 100644 --- a/locales/hu/common.json +++ b/locales/hu/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {1 névjegy törölve} other {# névjegy törölve}}", "add_to_group": "Hozzáadás a csoporthoz", "choose_group": "Csoport kiválasztása", + "new_group": "Új csoport…", "adding_contacts": "{count, plural, one {1 névjegy} other {# névjegy}} hozzáadása", "added_to_group": "Névjegyek hozzáadva a csoporthoz", "export": "Exportálás", diff --git a/locales/it/common.json b/locales/it/common.json index 2382a6470..c35f604b8 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 contatto eliminato} other {# contatti eliminati}}", "add_to_group": "Aggiungi al gruppo", "choose_group": "Scegli un gruppo", + "new_group": "Nuovo gruppo…", "adding_contacts": "Aggiunta di {count, plural, one {1 contatto} other {# contatti}}", "added_to_group": "Contatti aggiunti al gruppo", "export": "Esporta", diff --git a/locales/ja/common.json b/locales/ja/common.json index d1531036b..84fa54ab4 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, other {#件の連絡先を削除しました}}", "add_to_group": "グループに追加", "choose_group": "グループを選択", + "new_group": "新しいグループ…", "adding_contacts": "{count, plural, other {#件の連絡先}}を追加", "added_to_group": "連絡先をグループに追加しました", "export": "エクスポート", diff --git a/locales/ko/common.json b/locales/ko/common.json index 3b89d6f4d..245b64877 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count}개의 연락처가 삭제되었어요", "add_to_group": "그룹에 추가", "choose_group": "그룹 선택", + "new_group": "새 그룹…", "adding_contacts": "{count}개의 연락처를 추가하는 중...", "added_to_group": "연락처가 그룹에 추가되었어요", "export": "내보내기", diff --git a/locales/lv/common.json b/locales/lv/common.json index 6c55c95d8..872662b14 100644 --- a/locales/lv/common.json +++ b/locales/lv/common.json @@ -3195,6 +3195,7 @@ "deleted": "Izdzēsts {count, plural, one {1 kontakts} other {# kontakti}}", "add_to_group": "Pievienot grupai", "choose_group": "Izvēlēties grupu", + "new_group": "Jauna grupa…", "adding_contacts": "Pievieno {count, plural, one {1 kontaktu} other {# kontaktus}}", "added_to_group": "Kontakti pievienoti grupai", "export": "Eksportēt", diff --git a/locales/mn/common.json b/locales/mn/common.json index b98ae1aef..f97187028 100644 --- a/locales/mn/common.json +++ b/locales/mn/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {1 контакт устгагдлаа} other {# контакт устгагдлаа}}", "add_to_group": "Бүлэгт нэмэх", "choose_group": "Бүлэг сонгох", + "new_group": "Шинэ бүлэг…", "adding_contacts": "{count, plural, one {1 контакт} other {# контакт}} нэмэж байна", "added_to_group": "Харилцагчдыг группт нэмсэн", "export": "Экспорт хийх", diff --git a/locales/nb/common.json b/locales/nb/common.json index 214c746da..f2e7815e8 100644 --- a/locales/nb/common.json +++ b/locales/nb/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {1 kontakt slettet} other {# kontakter slettet}}", "add_to_group": "Legg til i gruppe", "choose_group": "Velg en gruppe", + "new_group": "Ny gruppe…", "adding_contacts": "Legger til {count, plural, one {1 kontakt} other {# kontakter}}", "added_to_group": "Kontaktene er lagt til i gruppen", "export": "Eksporter", diff --git a/locales/nl/common.json b/locales/nl/common.json index 6d45cc3aa..26ae0a013 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 contact verwijderd} other {# contacten verwijderd}}", "add_to_group": "Aan groep toevoegen", "choose_group": "Kies een groep", + "new_group": "Nieuwe groep…", "adding_contacts": "{count, plural, one {1 contact} other {# contacten}} toevoegen", "added_to_group": "Contacten aan groep toegevoegd", "export": "Exporteren", diff --git a/locales/pl/common.json b/locales/pl/common.json index 38e9bf3ba..9f2997774 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {Usunięto 1 kontakt} other {Usunięto # kontaktów}}", "add_to_group": "Dodaj do grupy", "choose_group": "Wybierz grupę", + "new_group": "Nowa grupa…", "adding_contacts": "Dodawanie {count, plural, one {1 kontaktu} other {# kontaktów}}", "added_to_group": "Kontakty dodano do grupy", "export": "Eksportuj", diff --git a/locales/pt/common.json b/locales/pt/common.json index 03773275d..4103f555c 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 contato excluído} other {# contatos excluídos}}", "add_to_group": "Adicionar ao grupo", "choose_group": "Escolher um grupo", + "new_group": "Novo grupo…", "adding_contacts": "Adicionando {count, plural, one {1 contato} other {# contatos}}", "added_to_group": "Contatos adicionados ao grupo", "export": "Exportar", diff --git a/locales/ro/common.json b/locales/ro/common.json index 845fa30f1..de930ac9e 100644 --- a/locales/ro/common.json +++ b/locales/ro/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {1 contact șters} few {# contacte șterse} other {# de contacte șterse}}", "add_to_group": "Adaugă la grup", "choose_group": "Alegeți un grup", + "new_group": "Grup nou…", "adding_contacts": "Adăugare {count, plural, one {1 contact} few {# contacte} other {# de contacte}}", "added_to_group": "Contacte adăugate la grup", "export": "Export", diff --git a/locales/ru/common.json b/locales/ru/common.json index f17f8a319..62ecf9b74 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 контакт удалён} other {# контактов удалено}}", "add_to_group": "Добавить в группу", "choose_group": "Выбрать группу", + "new_group": "Новая группа…", "adding_contacts": "Добавляем {count, plural, one {1 контакт} other {# контактов}}", "added_to_group": "Контакты добавлены в группу", "export": "Экспорт", diff --git a/locales/sk/common.json b/locales/sk/common.json index 6da1abfc2..398dab1b6 100644 --- a/locales/sk/common.json +++ b/locales/sk/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {Odstránený 1 kontakt} other {Odstránených # kontaktov}}", "add_to_group": "Pridať do skupiny", "choose_group": "Vyberte skupinu", + "new_group": "Nová skupina…", "adding_contacts": "Pridávanie {count, plural, one {1 kontaktu} other {# kontaktov}}", "added_to_group": "Kontakty boli pridané do skupiny", "export": "Exportovať", diff --git a/locales/th/common.json b/locales/th/common.json index c6de555a0..862148dd9 100644 --- a/locales/th/common.json +++ b/locales/th/common.json @@ -2514,6 +2514,7 @@ "deleted": "{count, plural, one {ลบผู้ติดต่อแล้ว 1 รายการ} other {ลบผู้ติดต่อแล้ว # รายการ}}", "add_to_group": "เพิ่มในกลุ่ม", "choose_group": "เลือกกลุ่ม", + "new_group": "กลุ่มใหม่…", "adding_contacts": "กำลังเพิ่มผู้ติดต่อ {count, plural, one {1 รายการ} other {# รายการ}}", "added_to_group": "เพิ่มผู้ติดต่อในกลุ่มแล้ว", "export": "ส่งออก", diff --git a/locales/tr/common.json b/locales/tr/common.json index 74ef0a9bc..b84b1dd3a 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 kişi silindi} other {# kişi silindi}}", "add_to_group": "Gruba ekle", "choose_group": "Grup seçin", + "new_group": "Yeni grup…", "adding_contacts": "{count, plural, one {1 kişi} other {# kişi}} ekleniyor", "added_to_group": "Kişiler gruba eklendi", "export": "Dışa Aktar", diff --git a/locales/uk/common.json b/locales/uk/common.json index b71162b0f..6c62997c3 100644 --- a/locales/uk/common.json +++ b/locales/uk/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {1 контакт видалено} few {# контакти видалено} many {# контактів видалено} other {# контактів видалено}}", "add_to_group": "Додати до групи", "choose_group": "Виберіть групу", + "new_group": "Нова група…", "adding_contacts": "Додавання {count, plural, one {1 contact} other {# contacts}}", "added_to_group": "Контакти додано до групи", "export": "Експорт", diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index 64b09be7b..05dc7357c 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -3200,6 +3200,7 @@ "deleted": "{count, plural, one {已刪除 1 位聯絡人} other {已刪除 # 位聯絡人}}", "add_to_group": "新增至群組", "choose_group": "選擇群組", + "new_group": "新增群組…", "adding_contacts": "正在新增{count, plural, one {1 位聯絡人} other {# 位聯絡人}}", "added_to_group": "聯絡人已新增至群組", "export": "匯出", diff --git a/locales/zh/common.json b/locales/zh/common.json index 2894397fd..855122df2 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -3199,6 +3199,7 @@ "deleted": "{count, plural, one {已删除 1 位联系人} other {已删除 # 位联系人}}", "add_to_group": "添加到群组", "choose_group": "选择一个组", + "new_group": "新建群组…", "adding_contacts": "正在添加{count, plural, one {1 位联系人} other {# 位联系人}}", "added_to_group": "联系人已添加至群组", "export": "导出",