Merge branch 'module/messagebus' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m27s
Build Docker Image / Clean-Registry (push) Successful in 0s

This commit is contained in:
2026-01-20 20:22:09 +01:00
6 changed files with 91 additions and 30 deletions

View File

@@ -16,8 +16,8 @@ import java.util.Map;
public class ProjectEvent extends Event<Project>{ public class ProjectEvent extends Event<Project>{
private final UmbrellaUser newMember;
private UmbrellaUser newMember;
public ProjectEvent(UmbrellaUser initiator, Project project, EventType type){ public ProjectEvent(UmbrellaUser initiator, Project project, EventType type){
super(initiator, PROJECT, project, type); super(initiator, PROJECT, project, type);
newMember = null; newMember = null;
@@ -49,12 +49,12 @@ public class ProjectEvent extends Event<Project>{
} }
private Translatable describeCreate() { private Translatable describeCreate() {
var head = t("You have been added to the new project '{project}', created by {user}':\n\n{body}", Field.PROJECT, payload().name(), BODY, payload().description(), USER, initiator().name()); var head = t("You have been added to the new project '{project}', created by {user}:\n\n{body}", Field.PROJECT, payload().name(), BODY, payload().description(), USER, initiator().name());
return t("{head}\n\n{link}","head",head,"link",link()); return t("{head}\n\n{link}","head",head,"link",link());
} }
private Translatable describeMemberAdded() { private Translatable describeMemberAdded() {
var head = t("'{name}' has been added to '{project}' by '{user}'.",NAME,newMember.name(),Field.PROJECT,payload().name(),USER,initiator().name()); var head = t("'{name}' has been added to '{object}' by '{user}'.",NAME,newMember.name(),Field.OBJECT,payload().name(),USER,initiator().name());
return t("{head}\n\n{link}","head",head,"link",link()); return t("{head}\n\n{link}","head",head,"link",link());
} }
@@ -63,6 +63,11 @@ public class ProjectEvent extends Event<Project>{
return t("{head}\n\n{link}","head",head,"link",link()); return t("{head}\n\n{link}","head",head,"link",link());
} }
@Override
protected Map<String, Object> filter(Map<String, Object> map) {
map.remove(MEMBERS);
return super.filter(map);
}
@Override @Override
public boolean isIntendedFor(UmbrellaUser user) { public boolean isIntendedFor(UmbrellaUser user) {
@@ -76,9 +81,11 @@ public class ProjectEvent extends Event<Project>{
return t("You can view/edit this project at {base_url}/project/{id}/view",ID,payload().id()); return t("You can view/edit this project at {base_url}/project/{id}/view",ID,payload().id());
} }
@Override @Override
public Translatable subject() { public Translatable subject() {
return t("{user} edited {object}",USER,initiator(),OBJECT,payload().name()); return switch (eventType()){
} case CREATE -> t("The project '{project}' has been created", Field.PROJECT, payload().name());
} case DELETE -> t("The project '{project}' has been deleted",Field.PROJECT, payload().name());
case MEMBER_ADDED, UPDATE -> t("Project '{project}' was edited",Field.PROJECT,payload().name());
};
}}

View File

@@ -50,11 +50,6 @@ public class TaskEvent extends Event<Task>{
}; };
} }
private Translatable describeMemberAdded() {
var head = t("'{name}' has been added to '{task}' by '{user}'.",NAME,newMember.name(),Field.TASK,payload().name(),USER,initiator().name());
return t("{head}\n\n{link}","head",head,"link",link());
}
private Translatable describeCreate() { private Translatable describeCreate() {
String parentName = null; String parentName = null;
var pid = payload().parentTaskId(); var pid = payload().parentTaskId();
@@ -71,6 +66,11 @@ public class TaskEvent extends Event<Task>{
return t("{head}\n\n{link}","head",head,"link",link()); return t("{head}\n\n{link}","head",head,"link",link());
} }
private Translatable describeMemberAdded() {
var head = t("'{name}' has been added to '{object}' by '{user}'.",NAME,newMember.name(), OBJECT,payload().name(),USER,initiator().name());
return t("{head}\n\n{link}","head",head,"link",link());
}
private Translatable describeUpdate() { private Translatable describeUpdate() {
var head = t("Changes in task '{task}':\n\n{body}",Field.TASK,payload().name(),BODY,diff().orElse("")); var head = t("Changes in task '{task}':\n\n{body}",Field.TASK,payload().name(),BODY,diff().orElse(""));
return t("{head}\n\n{link}","head",head,"link",link()); return t("{head}\n\n{link}","head",head,"link",link());

View File

@@ -107,7 +107,7 @@
</script> </script>
<fieldset class="message settings"> <fieldset class="message settings">
<legend>{t('message settings')}</legend> <legend>{t('notification settings')}</legend>
<p>{t('When shall messages be delivered?')}</p> <p>{t('When shall messages be delivered?')}</p>
<table> <table>
<tbody> <tbody>
@@ -143,7 +143,7 @@
</td> </td>
<td> <td>
<label> <label>
<input type="checkbox" onchange={selectTime} bind:checked={at8} />{t('8 am')} <input type="checkbox" onchange={selectTime} bind:checked={at8} />{t('8:00 am')}
</label> </label>
<label> <label>
<input type="checkbox" onchange={selectTime} bind:checked={at9} />{t('9:00 am')} <input type="checkbox" onchange={selectTime} bind:checked={at9} />{t('9:00 am')}

View File

@@ -14,7 +14,7 @@
<legend> <legend>
{t('your_profile')} {t('your_profile')}
<button onclick={() => router.navigate(`/user/${user.id}/edit`)}>{t('edit')}</button> <button onclick={() => router.navigate(`/user/${user.id}/edit`)}>{t('edit')}</button>
<!-- <button onclick={() => router.navigate(`/message/settings`)}>{t('settings')}</button> --> <button onclick={() => router.navigate(`/message/settings`)}>{t('notification settings')}</button>
</legend> </legend>
<table> <table>

View File

@@ -1,4 +1,19 @@
{ {
"8:00 am": "8:00 Uhr",
"9:00 am": "9:00 Uhr",
"10:00 am": "10:00 Uhr",
"11:00 am": "11:00 Uhr",
"1:00 pm": "13:00 Uhr",
"2:00 pm": "14:00 Uhr",
"3:00 pm": "15:00 Uhr",
"4:00 pm": "16:00 Uhr",
"5:00 pm": "17:00 Uhr",
"6:00 pm": "18:00 Uhr",
"7:00 pm": "19:00 Uhr",
"8:00 pm": "20:00 Uhr",
"9:00 pm": "21:00 Uhr",
"10:00 pm": "22:00 Uhr",
"abort": "abbrechen", "abort": "abbrechen",
"actions": "Aktionen", "actions": "Aktionen",
"add_login_service": "Login-Service anlegen", "add_login_service": "Login-Service anlegen",
@@ -18,6 +33,7 @@
"by": "von", "by": "von",
"cancel": "abbrechen", "cancel": "abbrechen",
"Changes in project '{project}':\n\n{body}": "Änderungen an Projekt '{project}':\n\n{body}",
"Changes in task '{task}':\n\n{body}": "Änderungen an Aufgabe '{task}':\n\n{body}", "Changes in task '{task}':\n\n{body}": "Änderungen an Aufgabe '{task}':\n\n{body}",
"choose_type": "Typ wählen", "choose_type": "Typ wählen",
"click_to_edit": "Anklicken zum Bearbeiten", "click_to_edit": "Anklicken zum Bearbeiten",
@@ -25,6 +41,7 @@
"client_secret": "Client-Geheimnis", "client_secret": "Client-Geheimnis",
"close_settings": "Einstellungen schließen", "close_settings": "Einstellungen schließen",
"code": "Code", "code": "Code",
"collect messages and send them at": "Nachriten sammeln und zustellen um",
"color": "Farbe", "color": "Farbe",
"connect_service": "mit Service verbinden", "connect_service": "mit Service verbinden",
"connected_services": "verbundene Login-Services", "connected_services": "verbundene Login-Services",
@@ -153,9 +170,11 @@
"hours": "Stunden", "hours": "Stunden",
"id": "Id", "id": "Id",
"i don`t want to receive email notifications!": "Ich möchte keine Email-Benachrichtigungen!",
"impersonate": "zu Nutzer wechseln", "impersonate": "zu Nutzer wechseln",
"IMPERSONATE": "Nutzer wechseln", "IMPERSONATE": "Nutzer wechseln",
"index_page": "Aufgabenübersicht", "index_page": "Aufgabenübersicht",
"instantly": "sofort",
"invert_filter": "Filter umkehren", "invert_filter": "Filter umkehren",
"invoice": "Rechnung", "invoice": "Rechnung",
"item": "Artikel", "item": "Artikel",
@@ -189,7 +208,6 @@
"members": "Mitarbeiter", "members": "Mitarbeiter",
"message": "Nachricht", "message": "Nachricht",
"messages": "Benachrichtigungen", "messages": "Benachrichtigungen",
"message settings": "Benachrichtigungs-Einstellungen",
"miscellaneous_settings": "sonstige Einstellungen", "miscellaneous_settings": "sonstige Einstellungen",
"missing_new_item_id": "Alter Artikel-ID ({0}) wurde keine neue ID zugeordnet!", "missing_new_item_id": "Alter Artikel-ID ({0}) wurde keine neue ID zugeordnet!",
"mismatch": "ungleich", "mismatch": "ungleich",
@@ -228,11 +246,13 @@
"new_property": "neue Eigenschaft", "new_property": "neue Eigenschaft",
"no_bookmark_for_urlid": "Kein Lesezeichen zur URL-ID {0}", "no_bookmark_for_urlid": "Kein Lesezeichen zur URL-ID {0}",
"no_company": "keine Firma", "no_company": "keine Firma",
"noon": "12:00 Uhr",
"no_project_for_id": "Kein Projekt mit ID {0} gefunden!", "no_project_for_id": "Kein Projekt mit ID {0} gefunden!",
"no_task_for_id": "Keine Aufgabe mit ID {0} gefunden!", "no_task_for_id": "Keine Aufgabe mit ID {0} gefunden!",
"note": "Notiz", "note": "Notiz",
"note ({id})": "Notiz ({id})", "note ({id})": "Notiz ({id})",
"notes": "Notizen", "notes": "Notizen",
"notification settings": "Benachrichtigungs-Einstellungen",
"not_recent_version": "Die ist nicht die neuste Version dieser Seite!", "not_recent_version": "Die ist nicht die neuste Version dieser Seite!",
"number": "Nummer", "number": "Nummer",
@@ -266,6 +286,7 @@
"processing_code": "Code wird verarbeitet…", "processing_code": "Code wird verarbeitet…",
"project": "Projekt", "project": "Projekt",
"project ({id})": "Projekt ({id})", "project ({id})": "Projekt ({id})",
"Project '{project}' was edited": "Projekt '{project}' wurde bearbeitet",
"projects": "Projekte", "projects": "Projekte",
"properties": "Eigenschaften", "properties": "Eigenschaften",
"property": "Eigenschaft", "property": "Eigenschaft",
@@ -343,9 +364,12 @@
"tax_rate": "Steuersatz", "tax_rate": "Steuersatz",
"template": "Vorlage", "template": "Vorlage",
"theme": "Design", "theme": "Design",
"The project '{project}' has been created":"Das Projekt '{project}' wurde angelegt",
"The project '{project}' has been deleted": "Das Projekt '{project}' wurde gelöscht",
"The project '{project}' has been deleted by {user}": "Das Projekt '{project}' wurde von {user} gelöscht",
"The task '{task}' has been created": "Die Aufgabe '{task}' wurde angelegt", "The task '{task}' has been created": "Die Aufgabe '{task}' wurde angelegt",
"The task '{task}' has been deleted": "Die Aufgabe '{task}' wurde gelöscht", "The task '{task}' has been deleted": "Die Aufgabe '{task}' wurde gelöscht",
"The task '{task}' has been deleted by {user}": "Die Aufgabe '{task}' wurde von {user} bearbeitet", "The task '{task}' has been deleted by {user}": "Die Aufgabe '{task}' wurde von {user} gelöscht",
"time ({id})": "Zeit ({id})", "time ({id})": "Zeit ({id})",
"times": "Zeiten", "times": "Zeiten",
"timetracking": "Zeiterfassung", "timetracking": "Zeiterfassung",
@@ -378,21 +402,24 @@
"user_deleted_entity": "{user} hat \"{entity}\" gelöscht", "user_deleted_entity": "{user} hat \"{entity}\" gelöscht",
"user_updated_entity": "{user} hat \"{entity}\" bearbeitet", "user_updated_entity": "{user} hat \"{entity}\" bearbeitet",
"value": "Wert",
"version": "Version",
"version_of": "Version {version} von {element}",
"visible_to_guests": "Für Besucher sichtbar",
"website": "Website", "website": "Website",
"welcome" : "Willkommen, {0}", "welcome" : "Willkommen, {0}",
"When shall messages be delivered?": "Wann sollen Nachrichten zugestellt werden?",
"wiki": "Wiki", "wiki": "Wiki",
"wikis": "Wiki-Seiten", "wikis": "Wiki-Seiten",
"wiki page": "Wiki-Seite", "wiki page": "Wiki-Seite",
"wiki pages": "Wiki-Seiten", "wiki pages": "Wiki-Seiten",
"wiki_pages": "Wiki-Seiten", "wiki_pages": "Wiki-Seiten",
"value": "Wert",
"version": "Version",
"version_of": "Version {version} von {element}",
"visible_to_guests": "Für Besucher sichtbar",
"year": "Jahr", "year": "Jahr",
"You can view/edit this project at {base_url}/project/{id}/view": "Du kannst dieses Projekt unter {base_url}/project/{id}/view ansehen/bearbeiten.",
"You can view/edit this task at {base_url}/task/{id}/view": "Du kannst diese Aufgabe unter {base_url}/task/{id}/view ansehen/bearbeiten.", "You can view/edit this task at {base_url}/task/{id}/view": "Du kannst diese Aufgabe unter {base_url}/task/{id}/view ansehen/bearbeiten.",
"You have been added to the new project '{project}', created by {user}:\n\n{body}": "Du wurdest zum neuen Projekt '{project}', angelegt von {user}, hinzugefügt:\n\n{body}",
"Your token to create a new password" : "Ihr Token zum Erstellen eines neuen Passworts", "Your token to create a new password" : "Ihr Token zum Erstellen eines neuen Passworts",
"your_profile": "dein Profil" "your_profile": "dein Profil"
} }

View File

@@ -1,4 +1,19 @@
{ {
"8:00 am": "8:00 am",
"9:00 am": "9:00 am",
"10:00 am": "10:00 am",
"11:00 am": "11:00 am",
"1:00 pm": "1:00 pm",
"2:00 pm": "2:00 pm",
"3:00 pm": "3:00 pm",
"4:00 pm": "4:00 pm",
"5:00 pm": "5:00 pm",
"6:00 pm": "6:00 pm",
"7:00 pm": "7:00 pm",
"8:00 pm": "8:00 pm",
"9:00 pm": "9:00 pm",
"10:00 pm": "10:00 pm",
"abort": "abort", "abort": "abort",
"actions": "actions", "actions": "actions",
"add_login_service": "add login service", "add_login_service": "add login service",
@@ -18,6 +33,7 @@
"by": "by", "by": "by",
"cancel": "cancel", "cancel": "cancel",
"Changes in project '{project}':\n\n{body}": "Changes in project '{project}':\n\n{body}",
"Changes in task '{task}':\n\n{body}": "Changes in task '{task}':\n\n{body}", "Changes in task '{task}':\n\n{body}": "Changes in task '{task}':\n\n{body}",
"choose_type": "choose type", "choose_type": "choose type",
"click_to_edit": "click to edit", "click_to_edit": "click to edit",
@@ -25,6 +41,7 @@
"client_secret": "client secret", "client_secret": "client secret",
"close_settings": "close settings", "close_settings": "close settings",
"code": "code", "code": "code",
"collect messages and send them at": "collect messages and send them at",
"color": "color", "color": "color",
"connect_service": "connect with service", "connect_service": "connect with service",
"connected_services": "connected login services", "connected_services": "connected login services",
@@ -81,8 +98,8 @@
"do_login" : "do login", "do_login" : "do login",
"do_open" : "open", "do_open" : "open",
"do_send" : "send", "do_send" : "send",
"due_date": "due date",
"drag_n_drop": "drag & drop", "drag_n_drop": "drag & drop",
"due_date": "due date",
"duration": "duration", "duration": "duration",
"easy_list": "Easy List", "easy_list": "Easy List",
@@ -153,9 +170,11 @@
"hours": "hours", "hours": "hours",
"id": "ID", "id": "ID",
"i don`t want to receive email notifications!": "i don`t want to receive email notifications!",
"impersonate": "impersonate", "impersonate": "impersonate",
"IMPERSONATE": "impersonate", "IMPERSONATE": "impersonate",
"index_page": "task overview", "index_page": "task overview",
"instantly": "instantly",
"invert_filter": "Filter umkehren", "invert_filter": "Filter umkehren",
"invoice": "invoice", "invoice": "invoice",
"item": "Item", "item": "Item",
@@ -189,7 +208,6 @@
"members": "members", "members": "members",
"message": "message", "message": "message",
"messages": "messages", "messages": "messages",
"message settings": "message settings",
"miscellaneous_settings": "miscellaneous settings", "miscellaneous_settings": "miscellaneous settings",
"missing_new_item_id": "Old item id ({0}) has no new counterpart!", "missing_new_item_id": "Old item id ({0}) has no new counterpart!",
"mismatch": "mismatch", "mismatch": "mismatch",
@@ -219,7 +237,7 @@
"my files": "my files", "my files": "my files",
"name": "Name", "name": "Name",
"'{name}' has been added to '{task}' by '{user}'.": "'{name}' has been added to '{task}' by '{user}'.", "'{name}' has been added to '{object}' by '{user}'.": "'{name}' has been added to '{object}' by '{user}'.",
"net_price": "net price", "net_price": "net price",
"net_sum": "net sum", "net_sum": "net sum",
"new_contact": "new contact", "new_contact": "new contact",
@@ -228,11 +246,13 @@
"new_property": "new property", "new_property": "new property",
"no_bookmark_for_urlid": "No bookmark with urlId {0}", "no_bookmark_for_urlid": "No bookmark with urlId {0}",
"no_company": "no company", "no_company": "no company",
"noon": "noon",
"no_project_for_id": "No project found for id {0}", "no_project_for_id": "No project found for id {0}",
"no_task_for_id": "No task found for id {0}", "no_task_for_id": "No task found for id {0}",
"note": "note", "note": "note",
"note ({id})":"note ({id})", "note ({id})":"note ({id})",
"notes": "notes", "notes": "notes",
"notification settings": "notification settings",
"not_recent_version": "This is not the current version of this page!", "not_recent_version": "This is not the current version of this page!",
"number": "number", "number": "number",
@@ -266,6 +286,7 @@
"processing_code": "processing code…", "processing_code": "processing code…",
"project": "project", "project": "project",
"project ({id})": "project ({id})", "project ({id})": "project ({id})",
"Project '{project}' was edited": "Project '{project}' was edited",
"projects": "projects", "projects": "projects",
"properties": "properties", "properties": "properties",
"property": "property", "property": "property",
@@ -343,6 +364,9 @@
"tax_rate": "tax rate", "tax_rate": "tax rate",
"template": "template", "template": "template",
"theme": "design", "theme": "design",
"The project '{project}' has been created":"The project '{project}' has been created",
"The project '{project}' has been deleted": "The project '{project}' has been deleted",
"The project '{project}' has been deleted by {user}": "The project '{project}' has been deleted by {user}",
"The task '{task}' has been created": "The task '{task}' has been created", "The task '{task}' has been created": "The task '{task}' has been created",
"The task '{task}' has been deleted": "The task '{task}' has been deleted", "The task '{task}' has been deleted": "The task '{task}' has been deleted",
"The task '{task}' has been deleted by {user}": "The task '{task}' has been deleted by {user}", "The task '{task}' has been deleted by {user}": "The task '{task}' has been deleted by {user}",
@@ -378,21 +402,24 @@
"user_deleted_entity": "{user} deleted \"{entity}\"", "user_deleted_entity": "{user} deleted \"{entity}\"",
"user_updated_entity": "{user} updated \"{entity}\"", "user_updated_entity": "{user} updated \"{entity}\"",
"value": "value",
"version": "version",
"version_of": "version {version} of {element}",
"visible_to_guests": "visible to guests",
"website": "website", "website": "website",
"welcome" : "Welcome, {0}", "welcome" : "Welcome, {0}",
"When shall messages be delivered?": "When shall messages be delivered?",
"wiki": "Wiki", "wiki": "Wiki",
"wikis": "wiki pages", "wikis": "wiki pages",
"wiki page": "wiki page", "wiki page": "wiki page",
"wiki pages": "wiki pages", "wiki pages": "wiki pages",
"wiki_pages": "wiki pages", "wiki_pages": "wiki pages",
"value": "value",
"version": "version",
"version_of": "version {version} of {element}",
"visible_to_guests": "visible to guests",
"year": "year", "year": "year",
"You can view/edit this project at {base_url}/project/{id}/view": "You can view/edit this project at {base_url}/project/{id}/view",
"You can view/edit this task at {base_url}/task/{id}/view": "You can view/edit this task at {base_url}/task/{id}/view", "You can view/edit this task at {base_url}/task/{id}/view": "You can view/edit this task at {base_url}/task/{id}/view",
"You have been added to the new project '{project}', created by {user}:\n\n{body}": "You have been added to the new project '{project}', created by {user}:\n\n{body}",
"Your token to create a new password" : "Your token to create a new password", "Your token to create a new password" : "Your token to create a new password",
"your_profile": "your profile" "your_profile": "your profile"
} }