From 67d0ee282d4cc19a089e7f8105fbdab8ae983d8c Mon Sep 17 00:00:00 2001
From: Weblate <noreply@weblate.org>
Date: Wed, 24 May 2023 12:40:12 +0200
Subject: [PATCH 01/10] Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mobilizon/Frontend
Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/
---
 js/src/i18n/ar.json      | 1 -
 js/src/i18n/be.json      | 1 -
 js/src/i18n/bn.json      | 1 -
 js/src/i18n/ca.json      | 1 -
 js/src/i18n/cs.json      | 1 -
 js/src/i18n/cy.json      | 1 -
 js/src/i18n/de.json      | 1 -
 js/src/i18n/eo.json      | 1 -
 js/src/i18n/es.json      | 1 -
 js/src/i18n/eu.json      | 1 -
 js/src/i18n/fa.json      | 1 -
 js/src/i18n/fi.json      | 1 -
 js/src/i18n/gd.json      | 1 -
 js/src/i18n/gl.json      | 1 -
 js/src/i18n/he.json      | 1 -
 js/src/i18n/hr.json      | 1 -
 js/src/i18n/hu.json      | 1 -
 js/src/i18n/id.json      | 1 -
 js/src/i18n/it.json      | 1 -
 js/src/i18n/ja.json      | 1 -
 js/src/i18n/kab.json     | 1 -
 js/src/i18n/kn.json      | 1 -
 js/src/i18n/nl.json      | 1 -
 js/src/i18n/nn.json      | 1 -
 js/src/i18n/oc.json      | 1 -
 js/src/i18n/pl.json      | 1 -
 js/src/i18n/pt.json      | 1 -
 js/src/i18n/pt_BR.json   | 1 -
 js/src/i18n/ru.json      | 1 -
 js/src/i18n/sl.json      | 1 -
 js/src/i18n/sv.json      | 1 -
 js/src/i18n/zh_Hans.json | 1 -
 js/src/i18n/zh_Hant.json | 1 -
 33 files changed, 33 deletions(-)

diff --git a/js/src/i18n/ar.json b/js/src/i18n/ar.json
index d035acd36..f46cdbd26 100644
--- a/js/src/i18n/ar.json
+++ b/js/src/i18n/ar.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "لقد ألغيتَ مشاركتك",
diff --git a/js/src/i18n/be.json b/js/src/i18n/be.json
index 36d589722..cfb8b6a79 100644
--- a/js/src/i18n/be.json
+++ b/js/src/i18n/be.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/bn.json b/js/src/i18n/bn.json
index f403abed9..c839583c0 100644
--- a/js/src/i18n/bn.json
+++ b/js/src/i18n/bn.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/ca.json b/js/src/i18n/ca.json
index bd0f94750..5b81b05bb 100644
--- a/js/src/i18n/ca.json
+++ b/js/src/i18n/ca.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "Has exclòs el/la membre {member}.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "S'ha desconnectat la sessió",
   "You have been invited by {invitedBy} to the following group:": "{invitedBy} t'ha convidat a afegir-te al següent grup:",
   "You have been removed from this group's members.": "T'han tret d'aquest grup.",
   "You have cancelled your participation": "Has canceŀlat la teva participació",
diff --git a/js/src/i18n/cs.json b/js/src/i18n/cs.json
index 51cdd69e5..ab09773c0 100644
--- a/js/src/i18n/cs.json
+++ b/js/src/i18n/cs.json
@@ -1347,7 +1347,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "Nemáte žádné nadcházející události. Možná zkuste jiný filtr?",
   "You excluded member {member}.": "Vyloučili jste člena {member}.",
   "You have attended {count} events in the past.": "V minulosti jste se nezúčastnili žádné akce.|V minulosti jste se zúčastnili jedné akce.|V minulosti jste se zúčastnili {count} akcí.",
-  "You have been disconnected": "Byl jste odpojen",
   "You have been invited by {invitedBy} to the following group:": "Byli jste pozváni společností {invitedBy} do následující skupiny:",
   "You have been removed from this group's members.": "Byli jste odstraněni z členů této skupiny.",
   "You have cancelled your participation": "Zrušili jste svou účast",
diff --git a/js/src/i18n/cy.json b/js/src/i18n/cy.json
index d81dd9911..9cd7ae6b3 100644
--- a/js/src/i18n/cy.json
+++ b/js/src/i18n/cy.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/de.json b/js/src/i18n/de.json
index 101e0c056..765d03c39 100644
--- a/js/src/i18n/de.json
+++ b/js/src/i18n/de.json
@@ -1275,7 +1275,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "Sie haben keine anstehenden Veranstaltungen. Möglicherweise eine andere Filtereinstellung versuchen?",
   "You excluded member {member}.": "Sie haben {member} ausgeschlossen.",
   "You have attended {count} events in the past.": "Sie haben in der Vergangenheit keine Veranstaltungen besucht.|Sie haben in der Vergangenheit eine Veranstaltung besucht.|Sie haben in der Vergangenheit {count} Veranstaltungen besucht.",
-  "You have been disconnected": "Ihre Verbindung wurde getrennt",
   "You have been invited by {invitedBy} to the following group:": "Sie wurden von {invitedBy} zu dieser Gruppe eingeladen:",
   "You have been removed from this group's members.": "Sie wurden von diesen Gruppenmitgliedern entfernt.",
   "You have cancelled your participation": "Sie haben Ihre Teilnahme abgesagt",
diff --git a/js/src/i18n/eo.json b/js/src/i18n/eo.json
index f7191f8f6..f1e607b1e 100644
--- a/js/src/i18n/eo.json
+++ b/js/src/i18n/eo.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/es.json b/js/src/i18n/es.json
index f376da6e5..c8cae1f91 100644
--- a/js/src/i18n/es.json
+++ b/js/src/i18n/es.json
@@ -1226,7 +1226,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "No tienes ningún evento próximo. ¿Quizás probar con otro filtro?",
   "You excluded member {member}.": "Ha excluido al miembro {member}.",
   "You have attended {count} events in the past.": "No ha asistido a ningún evento en el pasado. |Ha asistido a un evento en el pasado. |Ha asistido a {count} eventos en el pasado.",
-  "You have been disconnected": "Has sido desconectado",
   "You have been invited by {invitedBy} to the following group:": "Usted ha sido invitado por {invitedBy} al siguiente grupo:",
   "You have been removed from this group's members.": "Ha sido eliminado de los miembros de este grupo.",
   "You have cancelled your participation": "Has cancelado tu participación",
diff --git a/js/src/i18n/eu.json b/js/src/i18n/eu.json
index 514c6f3e2..396990b27 100644
--- a/js/src/i18n/eu.json
+++ b/js/src/i18n/eu.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/fa.json b/js/src/i18n/fa.json
index c196dd3dd..ca7b12ec3 100644
--- a/js/src/i18n/fa.json
+++ b/js/src/i18n/fa.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/fi.json b/js/src/i18n/fi.json
index 10e234c7c..b87e44644 100644
--- a/js/src/i18n/fi.json
+++ b/js/src/i18n/fi.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "Jätit pois käyttäjän {member}.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Yhteytesi on katkaistu",
   "You have been invited by {invitedBy} to the following group:": "{invitedBy} on kutsunut sinut seuraaviin ryhmiin:",
   "You have been removed from this group's members.": "Sinut on poistettu ryhmän jäsenistä.",
   "You have cancelled your participation": "Olet perunut osallistumisesi",
diff --git a/js/src/i18n/gd.json b/js/src/i18n/gd.json
index b6510172f..d72e021cf 100644
--- a/js/src/i18n/gd.json
+++ b/js/src/i18n/gd.json
@@ -1145,7 +1145,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "Chan eil tachartas ri thighinn agad. Am feuch thu criathrag eile?",
   "You excluded member {member}.": "Dhùin thu am ball {member} a-mach.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Chaidh do cheangal a bhriseadh",
   "You have been invited by {invitedBy} to the following group:": "Thug {invitedBy} cuireadh dhut dhan bhuidheann seo:",
   "You have been removed from this group's members.": "Chaidh do thoirt air falbh o bhallrachd a’ bhuidhinn seo.",
   "You have cancelled your participation": "Sguir thu dhen chom-pàirteachadh agad",
diff --git a/js/src/i18n/gl.json b/js/src/i18n/gl.json
index e5bcbb838..587752476 100644
--- a/js/src/i18n/gl.json
+++ b/js/src/i18n/gl.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "Excluíches a {member}.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "A túa sesión rematou",
   "You have been invited by {invitedBy} to the following group:": "Foches convidada por {invitedBy} ó seguinte grupo:",
   "You have been removed from this group's members.": "Sacáronte deste grupo.",
   "You have cancelled your participation": "Cancelaches a túa participación",
diff --git a/js/src/i18n/he.json b/js/src/i18n/he.json
index 162021687..2456b23d2 100644
--- a/js/src/i18n/he.json
+++ b/js/src/i18n/he.json
@@ -367,7 +367,6 @@
   "You are participating in this event anonymously but didn't confirm participation": "את.ה משתתפ.ת באירוע זה באופן אנונימי אך טרם אישרת את השתתפותך",
   "You can add tags by hitting the Enter key or by adding a comma": "ניתן להוסיף תגיות על־ידי לחיצה על מקש Enter או על־ידי הוספת פסיק",
   "You can try another search term or drag and drop the marker on the map": "ניתן לנסות חיפוש נוסף או לגרור את הסמן שעל המפה",
-  "You have been disconnected": "נותקת",
   "You have cancelled your participation": "ביטלת את השתתפותך",
   "You have one event in {days} days.": "אין לך אירועים ב־{days} days | יש לך אירוע אחד ב־{days} ימים. | יש לך {count} אירועים ב־{days} ימים",
   "You have one event today.": "אין לך אירועים היום | יש לך אירוע אחד היום | יש לך {count} אירועים היום",
diff --git a/js/src/i18n/hr.json b/js/src/i18n/hr.json
index 4c3d45ead..bc05bae06 100644
--- a/js/src/i18n/hr.json
+++ b/js/src/i18n/hr.json
@@ -1186,7 +1186,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "Isključili ste člana {member}.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Isključeni ste",
   "You have been invited by {invitedBy} to the following group:": "{invitedBy} su vas pozvali u grupu:",
   "You have been removed from this group's members.": "Izbačeni ste iz ove grupe.",
   "You have cancelled your participation": "Otkazali ste svoje sudjelovanje",
diff --git a/js/src/i18n/hu.json b/js/src/i18n/hu.json
index c2dabfdee..b35a138cc 100644
--- a/js/src/i18n/hu.json
+++ b/js/src/i18n/hu.json
@@ -1234,7 +1234,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "Nincsenek közelgő eseményei. Esetleg megpróbál egy másik szűrőt?",
   "You excluded member {member}.": "Ön kizárta {member} tagot.",
   "You have attended {count} events in the past.": "Ön nem vett részt semmilyen eseményen a múltban.|Ön egy eseményen vett részt a múltban.|Ön {count} eseményen vett részt a múltban.",
-  "You have been disconnected": "A kapcsolata bontva lett",
   "You have been invited by {invitedBy} to the following group:": "{invitedBy} meghívta Önt a következő csoportba:",
   "You have been removed from this group's members.": "El lett távolítva a csoport tagjai közül.",
   "You have cancelled your participation": "Törölte a részvételét",
diff --git a/js/src/i18n/id.json b/js/src/i18n/id.json
index 54dfc9b78..b68cb6942 100644
--- a/js/src/i18n/id.json
+++ b/js/src/i18n/id.json
@@ -1080,7 +1080,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "Anda telah diundang oleh {invitedBy} ke kelompok berikut:",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "Anda telah membatalkan keikutsertaan Anda",
diff --git a/js/src/i18n/it.json b/js/src/i18n/it.json
index e05db4844..0f86d0434 100644
--- a/js/src/i18n/it.json
+++ b/js/src/i18n/it.json
@@ -1239,7 +1239,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "Non ci sono eventi imminenti. Forse si può provare con un altro filtro?",
   "You excluded member {member}.": "Hai escluso il membro {member}.",
   "You have attended {count} events in the past.": "Non hai ancora partecipato ad alcun evento.|Hai partecipato ad un evento.|Hai partecipato a {count} eventi.",
-  "You have been disconnected": "Sei stato disconnesso",
   "You have been invited by {invitedBy} to the following group:": "Sei stato invitato da {invitedBy} al seguente gruppo:",
   "You have been removed from this group's members.": "Sei stato rimosso dai membri di questo gruppo.",
   "You have cancelled your participation": "Hai cancellato la tua partecipazione",
diff --git a/js/src/i18n/ja.json b/js/src/i18n/ja.json
index cb6d0cb80..de59def4c 100644
--- a/js/src/i18n/ja.json
+++ b/js/src/i18n/ja.json
@@ -1100,7 +1100,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "あなたはこのグループのメンバーから除外されました。",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/kab.json b/js/src/i18n/kab.json
index 41744acaa..44e0e299c 100644
--- a/js/src/i18n/kab.json
+++ b/js/src/i18n/kab.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/kn.json b/js/src/i18n/kn.json
index bdeff5646..f9fb383a8 100644
--- a/js/src/i18n/kn.json
+++ b/js/src/i18n/kn.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/nl.json b/js/src/i18n/nl.json
index d0bda65d9..42b10c989 100644
--- a/js/src/i18n/nl.json
+++ b/js/src/i18n/nl.json
@@ -1080,7 +1080,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "U sloot lid {member} uit.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "De verbinding is verbroken",
   "You have been invited by {invitedBy} to the following group:": "U bent uitgenodigd door {invitedBy} voor deelname aan de volgende groep:",
   "You have been removed from this group's members.": "Je bent uitgeschreven als lid van deze groep.",
   "You have cancelled your participation": "U hebt uw deelname geannuleerd",
diff --git a/js/src/i18n/nn.json b/js/src/i18n/nn.json
index 043ed94bb..0a3a20611 100644
--- a/js/src/i18n/nn.json
+++ b/js/src/i18n/nn.json
@@ -1234,7 +1234,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "Du har ingen komande hendingar. Kanskje du kan prøva eit anna søk?",
   "You excluded member {member}.": "Du kasta ut medlemen {member}.",
   "You have attended {count} events in the past.": "Du har ikkje vore med på hendingar tidlegare.|Du har vore med på ei hending tidlegare.|Du har vore med på {count} hendingar tidlegare.",
-  "You have been disconnected": "Du er fråkopla",
   "You have been invited by {invitedBy} to the following group:": "{invitedBy} har invitert deg til denne gruppa:",
   "You have been removed from this group's members.": "Du er ikkje lenger medlem i denne gruppa.",
   "You have cancelled your participation": "Du har avlyst deltakinga di",
diff --git a/js/src/i18n/oc.json b/js/src/i18n/oc.json
index f91b195ad..c9df6e556 100644
--- a/js/src/i18n/oc.json
+++ b/js/src/i18n/oc.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Sètz estat desconnectat",
   "You have been invited by {invitedBy} to the following group:": "{invitedBy} vos a convidat a rejónher lo grop seguent :",
   "You have been removed from this group's members.": "Vos an mes defòra del grop.",
   "You have cancelled your participation": "Avètz anullada vòstra participacion",
diff --git a/js/src/i18n/pl.json b/js/src/i18n/pl.json
index 4c3b73599..aad9952ee 100644
--- a/js/src/i18n/pl.json
+++ b/js/src/i18n/pl.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Zostałeś(-aś) rozłączony(-a)",
   "You have been invited by {invitedBy} to the following group:": "Zostałeś zaproszony przez {invitedBy} do następującej grupy:",
   "You have been removed from this group's members.": "Zostałeś(-aś) usunięty(-a) z członków tej grupy.",
   "You have cancelled your participation": "Wycofałeś(-aś) swój udział",
diff --git a/js/src/i18n/pt.json b/js/src/i18n/pt.json
index 57c3435d9..517d2a84d 100644
--- a/js/src/i18n/pt.json
+++ b/js/src/i18n/pt.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",
diff --git a/js/src/i18n/pt_BR.json b/js/src/i18n/pt_BR.json
index 72483222b..227fae897 100644
--- a/js/src/i18n/pt_BR.json
+++ b/js/src/i18n/pt_BR.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Você foi desconectado",
   "You have been invited by {invitedBy} to the following group:": "Você foi convidado por {invitedBy} para o seguinte grupo:",
   "You have been removed from this group's members.": "Você foi removido dos membros deste grupo.",
   "You have cancelled your participation": "Você cancelou a sua participação",
diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json
index 9dae61daa..a610c8c40 100644
--- a/js/src/i18n/ru.json
+++ b/js/src/i18n/ru.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "Вы исключили участника {member}.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Вы были отключены",
   "You have been invited by {invitedBy} to the following group:": "Вы были приглашены пользователем {invitedBy} в следующую группу:",
   "You have been removed from this group's members.": "Вы были удалены из участников этой группы.",
   "You have cancelled your participation": "Вы отказались от участия",
diff --git a/js/src/i18n/sl.json b/js/src/i18n/sl.json
index 57bf0a7f9..933b18ea6 100644
--- a/js/src/i18n/sl.json
+++ b/js/src/i18n/sl.json
@@ -1070,7 +1070,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "Izključili ste člana {member}.",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Povezava je bila prekinjena",
   "You have been invited by {invitedBy} to the following group:": "{invitedBy} vas je povabil v naslednjo skupino:",
   "You have been removed from this group's members.": "Odstranjeni ste bili iz te skupine.",
   "You have cancelled your participation": "Odpovedali ste udeležbo",
diff --git a/js/src/i18n/sv.json b/js/src/i18n/sv.json
index 06ba7dbde..1a5d0ffc1 100644
--- a/js/src/i18n/sv.json
+++ b/js/src/i18n/sv.json
@@ -1071,7 +1071,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "Du har blivit frånkopplad",
   "You have been invited by {invitedBy} to the following group:": "Du har blivit inbjuden av {invitedBy} till följande grupp:",
   "You have been removed from this group's members.": "Du har blivit borttagen som gruppmedlem.",
   "You have cancelled your participation": "Du har avslutat ditt deltagande",
diff --git a/js/src/i18n/zh_Hans.json b/js/src/i18n/zh_Hans.json
index 573aa344f..9ecdc037e 100644
--- a/js/src/i18n/zh_Hans.json
+++ b/js/src/i18n/zh_Hans.json
@@ -1239,7 +1239,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "你没有任何即将发生的活动。也许可以尝试另一个过滤条件?",
   "You excluded member {member}.": "你排除了会员{member}。",
   "You have attended {count} events in the past.": "你在过去没有参加过任何活动。|你在过去参加过一次活动。|你在过去参加过{count}次活动。",
-  "You have been disconnected": "你已经离线",
   "You have been invited by {invitedBy} to the following group:": "您已被{invitedBy}邀请加入以下群组:",
   "You have been removed from this group's members.": "你已被从这个群组的成员中删除。",
   "You have cancelled your participation": "你已经取消了你的参与",
diff --git a/js/src/i18n/zh_Hant.json b/js/src/i18n/zh_Hant.json
index 9ec83939c..faf0062b6 100644
--- a/js/src/i18n/zh_Hant.json
+++ b/js/src/i18n/zh_Hant.json
@@ -1106,7 +1106,6 @@
   "You don't have any upcoming events. Maybe try another filter?": "",
   "You excluded member {member}.": "",
   "You have attended {count} events in the past.": "",
-  "You have been disconnected": "",
   "You have been invited by {invitedBy} to the following group:": "",
   "You have been removed from this group's members.": "",
   "You have cancelled your participation": "",

From 96129d2339133027220d3b5fcb1c52f84bcc5cbb Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Wed, 24 May 2023 15:29:26 +0200
Subject: [PATCH 02/10] feat(front): make profile members link to profile on
 group admin view and the reverse

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 js/src/views/Admin/AdminGroupProfile.vue | 58 +++++++++++++++++-------
 js/src/views/Admin/AdminProfile.vue      | 48 ++++++++++++++------
 2 files changed, 76 insertions(+), 30 deletions(-)

diff --git a/js/src/views/Admin/AdminGroupProfile.vue b/js/src/views/Admin/AdminGroupProfile.vue
index 422672e2a..a74050f2c 100644
--- a/js/src/views/Admin/AdminGroupProfile.vue
+++ b/js/src/views/Admin/AdminGroupProfile.vue
@@ -114,26 +114,52 @@
         >
           <article class="flex gap-1">
             <div class="flex-none">
-              <figure v-if="props.row.actor.avatar">
-                <img
-                  class="rounded"
-                  :src="props.row.actor.avatar.url"
-                  alt=""
-                  width="48"
-                  height="48"
-                />
-              </figure>
-              <AccountCircle :size="48" v-else />
+              <router-link
+                class="no-underline"
+                :to="{
+                  name: RouteName.ADMIN_PROFILE,
+                  params: { id: props.row.actor.id },
+                }"
+              >
+                <figure v-if="props.row.actor.avatar">
+                  <img
+                    class="rounded"
+                    :src="props.row.actor.avatar.url"
+                    alt=""
+                    width="48"
+                    height="48"
+                  />
+                </figure>
+                <AccountCircle :size="48" v-else />
+              </router-link>
             </div>
             <div>
               <div class="prose dark:prose-invert">
-                <span v-if="props.row.actor.name">{{
-                  props.row.actor.name
-                }}</span
-                ><span v-else>@{{ usernameWithDomain(props.row.actor) }}</span
+                <router-link
+                  class="no-underline"
+                  :to="{
+                    name: RouteName.ADMIN_PROFILE,
+                    params: { id: props.row.actor.id },
+                  }"
+                  v-if="props.row.actor.name"
+                  >{{ props.row.actor.name }}</router-link
+                ><router-link
+                  class="no-underline"
+                  :to="{
+                    name: RouteName.ADMIN_PROFILE,
+                    params: { id: props.row.actor.id },
+                  }"
+                  v-else
+                  >@{{ usernameWithDomain(props.row.actor) }}</router-link
                 ><br />
-                <span v-if="props.row.actor.name"
-                  >@{{ usernameWithDomain(props.row.actor) }}</span
+                <router-link
+                  class="no-underline"
+                  :to="{
+                    name: RouteName.ADMIN_PROFILE,
+                    params: { id: props.row.actor.id },
+                  }"
+                  v-if="props.row.actor.name"
+                  >@{{ usernameWithDomain(props.row.actor) }}</router-link
                 >
               </div>
             </div>
diff --git a/js/src/views/Admin/AdminProfile.vue b/js/src/views/Admin/AdminProfile.vue
index 32ecf05d4..9494ba99a 100644
--- a/js/src/views/Admin/AdminProfile.vue
+++ b/js/src/views/Admin/AdminProfile.vue
@@ -199,23 +199,43 @@
           v-slot="props"
         >
           <article class="flex gap-2">
-            <figure class="" v-if="props.row.parent.avatar">
-              <img
-                class="rounded-full"
-                :src="props.row.parent.avatar.url"
-                alt=""
-                width="48"
-                height="48"
-              />
-            </figure>
-            <AccountCircle v-else :size="48" />
+            <router-link
+              class="no-underline"
+              :to="{
+                name: RouteName.ADMIN_GROUP_PROFILE,
+                params: { id: props.row.parent.id },
+              }"
+            >
+              <figure class="" v-if="props.row.parent.avatar">
+                <img
+                  class="rounded-full"
+                  :src="props.row.parent.avatar.url"
+                  alt=""
+                  width="48"
+                  height="48"
+                />
+              </figure>
+              <AccountCircle v-else :size="48" />
+            </router-link>
             <div class="">
               <div class="prose dark:prose-invert">
-                <span v-if="props.row.parent.name">{{
-                  props.row.parent.name
-                }}</span
+                <router-link
+                  class="no-underline"
+                  :to="{
+                    name: RouteName.ADMIN_GROUP_PROFILE,
+                    params: { id: props.row.parent.id },
+                  }"
+                  v-if="props.row.parent.name"
+                  >{{ props.row.parent.name }}</router-link
                 ><br />
-                <span>@{{ usernameWithDomain(props.row.parent) }}</span>
+                <router-link
+                  class="no-underline"
+                  :to="{
+                    name: RouteName.ADMIN_GROUP_PROFILE,
+                    params: { id: props.row.parent.id },
+                  }"
+                  >@{{ usernameWithDomain(props.row.parent) }}</router-link
+                >
               </div>
             </div>
           </article>

From 2933ee06791a24dbf8c8b2a2eabc67f71e56f361 Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Wed, 24 May 2023 15:29:49 +0200
Subject: [PATCH 03/10] fix(graphql): fix calling GET_GROUP

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 js/src/graphql/group.ts | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/js/src/graphql/group.ts b/js/src/graphql/group.ts
index c68278b52..689288b65 100644
--- a/js/src/graphql/group.ts
+++ b/js/src/graphql/group.ts
@@ -1,5 +1,4 @@
 import gql from "graphql-tag";
-import { DISCUSSION_BASIC_FIELDS_FRAGMENT } from "./discussion";
 import { RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT } from "./resources";
 import { POST_BASIC_FIELDS } from "./post";
 import { ACTOR_FRAGMENT } from "./actor";
@@ -246,7 +245,6 @@ export const GROUP_FIELDS_FRAGMENTS = gql`
     }
   }
   ${GROUP_BASIC_FIELDS_FRAGMENTS}
-  ${DISCUSSION_BASIC_FIELDS_FRAGMENT}
   ${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
 `;
 
@@ -278,8 +276,6 @@ export const GET_GROUP = gql`
     $postsLimit: Int
     $membersPage: Int
     $membersLimit: Int
-    $discussionsPage: Int
-    $discussionsLimit: Int
   ) {
     getGroup(id: $id) {
       mediaSize
@@ -287,9 +283,6 @@ export const GET_GROUP = gql`
     }
   }
   ${GROUP_FIELDS_FRAGMENTS}
-  ${DISCUSSION_BASIC_FIELDS_FRAGMENT}
-  ${POST_BASIC_FIELDS}
-  ${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
 `;
 
 export const CREATE_GROUP = gql`

From 3e0324d36ec5a8aa388e6b5d598a6f9a0c596797 Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Wed, 24 May 2023 15:31:48 +0200
Subject: [PATCH 04/10] feat(front): make profiles and group admin views
 default to local

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 js/src/views/Admin/GroupProfiles.vue | 2 +-
 js/src/views/Admin/ProfilesView.vue  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/js/src/views/Admin/GroupProfiles.vue b/js/src/views/Admin/GroupProfiles.vue
index cd30e5875..dbd904eea 100644
--- a/js/src/views/Admin/GroupProfiles.vue
+++ b/js/src/views/Admin/GroupProfiles.vue
@@ -133,7 +133,7 @@ const preferredUsername = ref("");
 const name = ref("");
 const domain = ref("");
 
-const local = useRouteQuery("local", false, booleanTransformer);
+const local = useRouteQuery("local", true, booleanTransformer);
 const suspended = useRouteQuery("suspended", false, booleanTransformer);
 const page = useRouteQuery("page", 1, integerTransformer);
 
diff --git a/js/src/views/Admin/ProfilesView.vue b/js/src/views/Admin/ProfilesView.vue
index 9d51b9207..67bb16fb6 100644
--- a/js/src/views/Admin/ProfilesView.vue
+++ b/js/src/views/Admin/ProfilesView.vue
@@ -119,7 +119,7 @@ const preferredUsername = ref("");
 const name = ref("");
 const domain = ref("");
 
-const local = useRouteQuery("local", false, booleanTransformer);
+const local = useRouteQuery("local", true, booleanTransformer);
 const suspended = useRouteQuery("suspended", false, booleanTransformer);
 const page = useRouteQuery("page", 1, integerTransformer);
 

From 94f186ce5080316cd633e0344651b0050c2f14d4 Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Wed, 24 May 2023 15:36:38 +0200
Subject: [PATCH 05/10] fix(front): increase padding next to arrow down in
 <select> elements

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 js/src/assets/oruga-tailwindcss.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/js/src/assets/oruga-tailwindcss.css b/js/src/assets/oruga-tailwindcss.css
index f06833582..06e5fd8c2 100644
--- a/js/src/assets/oruga-tailwindcss.css
+++ b/js/src/assets/oruga-tailwindcss.css
@@ -193,7 +193,7 @@ body {
 
 /* Select */
 .select {
-  @apply dark:bg-zinc-600 dark:placeholder:text-zinc-400 dark:text-zinc-50 rounded pl-2 pr-6 border-2 border-transparent h-10 shadow-none border rounded;
+  @apply dark:bg-zinc-600 dark:placeholder:text-zinc-400 dark:text-zinc-50 rounded pl-2 pr-8 border-2 border-transparent h-10 shadow-none border rounded;
 }
 
 /* Radio */

From 7fa452d9e3f9bb2443e571c9a32eaed51e32480a Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Wed, 24 May 2023 15:41:13 +0200
Subject: [PATCH 06/10] feat(front): improve padding on event tags

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 js/src/views/Event/EventView.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/js/src/views/Event/EventView.vue b/js/src/views/Event/EventView.vue
index 2d5b2015d..73092ebab 100755
--- a/js/src/views/Event/EventView.vue
+++ b/js/src/views/Event/EventView.vue
@@ -108,7 +108,7 @@
                   <tag v-if="eventCategory" class="category" capitalize>{{
                     eventCategory
                   }}</tag>
-                  <router-link
+                  <router-link class="rounded-md truncate text-sm text-violet-title py-1 bg-purple-3 dark:text-violet-3 category"
                     v-for="tag in event?.tags ?? []"
                     :key="tag.title"
                     :to="{ name: RouteName.TAG, params: { tag: tag.title } }"

From dc3b93ffb5a4b072aec792533fd6e4b58ed7a893 Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Wed, 24 May 2023 16:14:19 +0200
Subject: [PATCH 07/10] feat(front): show skeleton content on event view until
 the event is loaded

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 .../Event/SkeletonDateCalendarIcon.vue        | 18 +++++
 js/src/views/Event/EventView.vue              | 71 ++++++++++++++++---
 2 files changed, 81 insertions(+), 8 deletions(-)
 create mode 100644 js/src/components/Event/SkeletonDateCalendarIcon.vue

diff --git a/js/src/components/Event/SkeletonDateCalendarIcon.vue b/js/src/components/Event/SkeletonDateCalendarIcon.vue
new file mode 100644
index 000000000..b31ad986d
--- /dev/null
+++ b/js/src/components/Event/SkeletonDateCalendarIcon.vue
@@ -0,0 +1,18 @@
+<template>
+  <div
+    class="datetime-container flex flex-col rounded-lg text-center justify-center overflow-hidden items-stretch bg-white dark:bg-gray-700 text-violet-3 dark:text-white"
+  >
+    <div class="datetime-container-content">
+      <div class="ml-2 h-8 bg-slate-200 w-16"></div>
+      <div class="ml-2 mt-2 h-4 bg-slate-200 w-16"></div>
+    </div>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+div.datetime-container {
+  width: calc(80px);
+  box-shadow: 0 0 12px rgba(0, 0, 0, 0.2);
+  height: calc(80px);
+}
+</style>
diff --git a/js/src/views/Event/EventView.vue b/js/src/views/Event/EventView.vue
index 73092ebab..8046344b9 100755
--- a/js/src/views/Event/EventView.vue
+++ b/js/src/views/Event/EventView.vue
@@ -7,7 +7,12 @@
         class="flex flex-col relative pb-2 bg-white dark:bg-zinc-700 my-2 rounded"
       >
         <div class="date-calendar-icon-wrapper relative" v-if="event?.beginsOn">
+          <skeleton-date-calendar-icon
+            v-if="eventLoading"
+            class="absolute left-3 -top-16"
+          />
           <date-calendar-icon
+            v-else
             :date="event.beginsOn.toString()"
             class="absolute left-3 -top-16"
           />
@@ -16,7 +21,12 @@
         <section class="intro px-2 pt-4" dir="auto">
           <div class="flex flex-wrap gap-2">
             <div class="flex-1 min-w-[300px]">
+              <div
+                v-if="eventLoading"
+                class="animate-pulse mb-2 h-12 bg-slate-200 w-3/4"
+              />
               <h1
+                v-else
                 class="text-4xl font-bold m-0"
                 dir="auto"
                 :lang="event?.language"
@@ -24,7 +34,11 @@
                 {{ event?.title }}
               </h1>
               <div class="organizer">
-                <div v-if="event?.organizerActor && !event?.attributedTo">
+                <div
+                  v-if="eventLoading"
+                  class="animate-pulse mb-2 h-6 space-y-6 bg-slate-200 w-64"
+                />
+                <div v-else-if="event?.organizerActor && !event?.attributedTo">
                   <popover-actor-card
                     :actor="event.organizerActor"
                     :inline="true"
@@ -71,7 +85,11 @@
                 </span>
               </div>
               <div class="flex flex-wrap items-center gap-2 gap-y-4 mt-2 my-3">
-                <p v-if="event?.status !== EventStatus.CONFIRMED">
+                <div
+                  v-if="eventLoading"
+                  class="animate-pulse mb-2 h-6 space-y-6 bg-slate-200 w-64"
+                />
+                <p v-else-if="event?.status !== EventStatus.CONFIRMED">
                   <tag
                     variant="warning"
                     v-if="event?.status === EventStatus.TENTATIVE"
@@ -83,7 +101,7 @@
                     >{{ t("Event cancelled") }}</tag
                   >
                 </p>
-                <template v-if="!event?.draft">
+                <template v-if="!eventLoading && !event?.draft">
                   <p
                     v-if="event?.visibility === EventVisibility.PUBLIC"
                     class="inline-flex gap-1"
@@ -104,11 +122,16 @@
                     <tag variant="info">{{ organizerDomain }}</tag>
                   </a>
                 </template>
-                <p class="flex flex-wrap gap-1 items-center" dir="auto">
+                <div
+                  v-if="eventLoading"
+                  class="animate-pulse mb-2 h-6 space-y-6 bg-slate-200 w-64"
+                />
+                <p v-else class="flex flex-wrap gap-1 items-center" dir="auto">
                   <tag v-if="eventCategory" class="category" capitalize>{{
                     eventCategory
                   }}</tag>
-                  <router-link class="rounded-md truncate text-sm text-violet-title py-1 bg-purple-3 dark:text-violet-3 category"
+                  <router-link
+                    class="rounded-md truncate text-sm text-violet-title py-1 bg-purple-3 dark:text-violet-3 category"
                     v-for="tag in event?.tags ?? []"
                     :key="tag.title"
                     :to="{ name: RouteName.TAG, params: { tag: tag.title } }"
@@ -122,8 +145,12 @@
               </div>
             </div>
 
+            <div v-if="eventLoading">
+              <div class="animate-pulse mb-2 h-6 bg-slate-200 w-64" />
+              <div class="animate-pulse mb-2 h-6 bg-slate-200 w-64" />
+            </div>
             <EventActionSection
-              v-if="event"
+              v-else-if="event"
               :event="event"
               :currentActor="currentActor"
               :participations="participations"
@@ -140,8 +167,23 @@
           class="rounded bg-white dark:bg-zinc-700 shadow-md h-min max-w-screen-sm"
         >
           <div class="sticky p-4">
+            <aside
+              v-if="eventLoading"
+              class="animate-pulse rounded bg-white dark:bg-zinc-700 h-min max-w-screen-sm"
+            >
+              <div class="mb-6 p-2" v-for="i in 3" :key="i">
+                <div class="mb-2 h-6 bg-slate-200 w-64" />
+                <div class="flex space-x-4 flex-row">
+                  <div class="rounded-full bg-slate-200 h-10 w-10"></div>
+                  <div class="flex flex-col flex-1 space-y-2">
+                    <div class="h-3 bg-slate-200"></div>
+                    <div class="h-3 bg-slate-200"></div>
+                  </div>
+                </div>
+              </div>
+            </aside>
             <event-metadata-sidebar
-              v-if="event"
+              v-else-if="event"
               :event="event"
               :user="loggedUser"
               @showMapModal="showMap = true"
@@ -153,7 +195,19 @@
             class="event-description bg-white dark:bg-zinc-700 px-3 pt-1 pb-3 rounded mb-4"
           >
             <h2 class="text-2xl">{{ t("About this event") }}</h2>
-            <p v-if="!event?.description">
+            <div
+              v-if="eventLoading"
+              class="animate-pulse mb-2 h-6 space-y-6 bg-slate-200 w-3/4"
+            />
+            <div
+              v-if="eventLoading"
+              class="animate-pulse mb-2 h-6 space-y-6 bg-slate-200 w-3/4"
+            />
+            <div
+              v-if="eventLoading"
+              class="animate-pulse mb-2 h-6 space-y-6 bg-slate-200 w-1/4"
+            />
+            <p v-else-if="!event?.description">
               {{ t("The event organizer didn't add any description.") }}
             </p>
             <div v-else>
@@ -235,6 +289,7 @@ import {
   usernameWithDomain,
 } from "@/types/actor";
 import DateCalendarIcon from "@/components/Event/DateCalendarIcon.vue";
+import SkeletonDateCalendarIcon from "@/components/Event/SkeletonDateCalendarIcon.vue";
 import Earth from "vue-material-design-icons/Earth.vue";
 import Link from "vue-material-design-icons/Link.vue";
 import MultiCard from "@/components/Event/MultiCard.vue";

From 927e95f387653c7d620e9051c30843ba49c2d65c Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Thu, 25 May 2023 12:07:28 +0200
Subject: [PATCH 08/10] fix(emails): make sure group notification emails are
 only sent once per email

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 lib/web/email/group.ex | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/web/email/group.ex b/lib/web/email/group.ex
index da29082b4..b4e5b03be 100644
--- a/lib/web/email/group.ex
+++ b/lib/web/email/group.ex
@@ -26,6 +26,7 @@ defmodule Mobilizon.Web.Email.Group do
         users ++ [Users.get_user_with_activity_settings!(actor.user_id)]
       end
     end)
+    |> Enum.uniq_by(& &1.email)
     |> Enum.each(&notify_follower(event, group, &1))
   end
 

From fe4fbc0bdf698c75227845096a3535f8580ad09b Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Thu, 25 May 2023 12:06:55 +0200
Subject: [PATCH 09/10] test(emails): add test for group notification emails

Add test for Mobilizon.Web.Email.Group

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 test/web/email/group_test.exs | 156 ++++++++++++++++++++++++++++++++++
 1 file changed, 156 insertions(+)
 create mode 100644 test/web/email/group_test.exs

diff --git a/test/web/email/group_test.exs b/test/web/email/group_test.exs
new file mode 100644
index 000000000..cbab2447f
--- /dev/null
+++ b/test/web/email/group_test.exs
@@ -0,0 +1,156 @@
+defmodule Mobilizon.Web.Email.GroupTest do
+  @moduledoc """
+  Test the Mobilizon.Web.Email.Group module
+  """
+
+  alias Mobilizon.Actors.Actor
+  alias Mobilizon.Events.Event
+  alias Mobilizon.Users
+  alias Mobilizon.Users.{ActivitySetting, Setting, User}
+  alias Mobilizon.Web.Email.Group
+
+  use Mobilizon.DataCase
+  import Swoosh.TestAssertions
+  import Mobilizon.Factory
+
+  describe "Notify of new event" do
+    test "members, followers, execept the ones that disabled it" do
+      {_user_creator, actor} = insert_user_with_settings("user@creator.com")
+      %Actor{} = group = insert(:group)
+      %Event{} = event = insert(:event, attributed_to: group, organizer_actor: actor)
+
+      insert(:member,
+        parent: group,
+        actor: actor,
+        role: :administrator,
+        member_since: DateTime.add(DateTime.utc_now(), -3600)
+      )
+
+      {_user_member, actor_member} = insert_user_with_settings("user@member.com")
+
+      insert(:member,
+        parent: group,
+        actor: actor_member,
+        role: :member,
+        member_since: DateTime.add(DateTime.utc_now(), -3600)
+      )
+
+      {_user_pending_member, actor_pending_member} =
+        insert_user_with_settings("user@pending.member.com")
+
+      insert(:member,
+        parent: group,
+        actor: actor_pending_member,
+        role: :not_approved
+      )
+
+      {_user_invited_member, actor_invited_member} =
+        insert_user_with_settings("user@invited.member.com")
+
+      insert(:member,
+        parent: group,
+        actor: actor_invited_member,
+        role: :invited,
+        member_since: DateTime.add(DateTime.utc_now(), -3600)
+      )
+
+      {_user_rejected_member, actor_rejected_member} =
+        insert_user_with_settings("user@rejected.member.com")
+
+      insert(:member,
+        parent: group,
+        actor: actor_rejected_member,
+        role: :rejected,
+        member_since: DateTime.add(DateTime.utc_now(), -3600)
+      )
+
+      {_user_approved_follower, actor_follower} =
+        insert_user_with_settings("user@approved.follower.com")
+
+      insert(:follower, actor: actor_follower, target_actor: group, approved: true)
+
+      {_user_no_notify_follower, actor_follower_no_notify} =
+        insert_user_with_settings("user@no-notify.follower.com")
+
+      insert(:follower,
+        actor: actor_follower_no_notify,
+        target_actor: group,
+        approved: true,
+        notify: false
+      )
+
+      {_user_unapproved_follower, actor_unapproved_follower} =
+        insert_user_with_settings("user@unapproved.follower.com")
+
+      insert(:follower, actor: actor_unapproved_follower, target_actor: group, approved: false)
+
+      # One profile has no notify, the other one has it
+      {user_still_notify_follower, actor_follower_still_notify} =
+        insert_user_with_settings("user@still-notify.follower.com")
+
+      insert(:follower,
+        actor: actor_follower_still_notify,
+        target_actor: group,
+        approved: true,
+        notify: false
+      )
+
+      %Actor{} = actor_follower_with_notify = insert(:actor, user: user_still_notify_follower)
+
+      insert(:follower,
+        actor: actor_follower_with_notify,
+        target_actor: group,
+        approved: true,
+        notify: true
+      )
+
+      %Actor{} = actor_remote_follower = insert(:actor, user: nil, domain: "some.remote.tld")
+
+      insert(:follower,
+        actor: actor_remote_follower,
+        target_actor: group,
+        approved: true,
+        notify: true
+      )
+
+      assert :ok == Group.notify_of_new_event(event)
+
+      refute_email_sent(to: "user@creator.com")
+      refute_email_sent(to: "user@pending.member.com")
+      refute_email_sent(to: "user@invited.member.com")
+      refute_email_sent(to: "user@rejected.member.com")
+      refute_email_sent(to: "user@unapproved.follower.com")
+      refute_email_sent(to: "user@no-notify.follower.com")
+
+      assert_email_sent(to: "user@member.com")
+      assert_email_sent(to: "user@approved.follower.com")
+      assert_email_sent(to: "user@still-notify.follower.com")
+    end
+  end
+
+  defp insert_user_with_settings(email) do
+    %User{} = user = insert(:user, email: email)
+
+    %Actor{} = actor = insert(:actor, user: user)
+
+    %Setting{} =
+      user_settings =
+      insert(:settings,
+        user: user,
+        user_id: user.id,
+        group_notifications: :one_day
+      )
+
+    %ActivitySetting{} =
+      activity_setting = insert(:mobilizon_activity_setting, user_id: user.id, user: user)
+
+    {:ok, user} =
+      Users.update_user(user, %{
+        settings: user_settings,
+        activity_settings: [activity_setting],
+        default_actor_id: actor.id
+      })
+
+    {user, actor}
+  end
+end

From 08ce7e26b73045279261ab87a14cb4f3dab5df1e Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Thu, 25 May 2023 12:08:13 +0200
Subject: [PATCH 10/10] feat(front): make admin profile view linkable directly
 with parameters

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 js/src/views/Admin/ProfilesView.vue | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/js/src/views/Admin/ProfilesView.vue b/js/src/views/Admin/ProfilesView.vue
index 67bb16fb6..f5fff8f38 100644
--- a/js/src/views/Admin/ProfilesView.vue
+++ b/js/src/views/Admin/ProfilesView.vue
@@ -115,9 +115,9 @@ import Account from "vue-material-design-icons/Account.vue";
 
 const PROFILES_PER_PAGE = 10;
 
-const preferredUsername = ref("");
-const name = ref("");
-const domain = ref("");
+const preferredUsername = useRouteQuery("preferredUsername", "");
+const name = useRouteQuery("name", "");
+const domain = useRouteQuery("domain", "");
 
 const local = useRouteQuery("local", true, booleanTransformer);
 const suspended = useRouteQuery("suspended", false, booleanTransformer);