From b238721563a6ead25d11fb74426641743ab0f1e3 Mon Sep 17 00:00:00 2001 From: Ida Date: Thu, 14 May 2026 10:39:53 +0200 Subject: [PATCH] fix: main UI fixes --- .../migration/seedData/ui_language_seed.json | 330 ++++++++++++++++++ modules/routes/routeWorkflowDashboard.py | 47 ++- 2 files changed, 364 insertions(+), 13 deletions(-) diff --git a/modules/migration/seedData/ui_language_seed.json b/modules/migration/seedData/ui_language_seed.json index 0f769074..060e6c51 100644 --- a/modules/migration/seedData/ui_language_seed.json +++ b/modules/migration/seedData/ui_language_seed.json @@ -3383,6 +3383,116 @@ "key": "Warnschwelle", "value": "" }, + { + "context": "ui", + "key": "Ansicht an Fenster anpassen", + "value": "" + }, + { + "context": "ui", + "key": "Ansicht zurücksetzen", + "value": "" + }, + { + "context": "ui", + "key": "Auswahl löschen", + "value": "" + }, + { + "context": "ui", + "key": "Canvas bearbeiten", + "value": "" + }, + { + "context": "ui", + "key": "Klicken Sie auf einen Ausgang, dann auf einen Eingang", + "value": "" + }, + { + "context": "ui", + "key": "Klicken Sie auf einen Eingang, um die Verbindung zu erstellen", + "value": "" + }, + { + "context": "ui", + "key": "Kommentar (optional)", + "value": "" + }, + { + "context": "ui", + "key": "Kommentar bearbeiten", + "value": "" + }, + { + "context": "ui", + "key": "Knoten duplizieren", + "value": "" + }, + { + "context": "ui", + "key": "Rückgängig", + "value": "" + }, + { + "context": "ui", + "key": "Verbindungen zeichnen", + "value": "" + }, + { + "context": "ui", + "key": "Vergrößern", + "value": "" + }, + { + "context": "ui", + "key": "Verkleinern", + "value": "" + }, + { + "context": "ui", + "key": "Wiederholen", + "value": "" + }, + { + "context": "ui", + "key": "Zoom-Voreinstellungen", + "value": "" + }, + { + "context": "ui", + "key": "Zoomstufe (Prozent)", + "value": "" + }, + { + "context": "ui", + "key": "Doppelklick zum Bearbeiten", + "value": "" + }, + { + "context": "ui", + "key": "Kommentar auf dem Canvas einfügen", + "value": "" + }, + { + "context": "ui", + "key": "Kommentar eingeben …", + "value": "" + }, + { + "context": "ui", + "key": "Canvas-Notiz verschieben", + "value": "" + }, + { + "context": "ui", + "key": "Notizfarbe", + "value": "" + }, + { + "context": "ui", + "key": "Notizgröße ändern", + "value": "" + }, { "context": "ui", "key": "✓ Mandat eingereicht", @@ -6776,6 +6886,116 @@ "key": "Warnschwelle", "value": "Warnschwelle" }, + { + "context": "ui", + "key": "Ansicht an Fenster anpassen", + "value": "Ansicht an Fenster anpassen" + }, + { + "context": "ui", + "key": "Ansicht zurücksetzen", + "value": "Ansicht zurücksetzen" + }, + { + "context": "ui", + "key": "Auswahl löschen", + "value": "Auswahl löschen" + }, + { + "context": "ui", + "key": "Canvas bearbeiten", + "value": "Canvas bearbeiten" + }, + { + "context": "ui", + "key": "Klicken Sie auf einen Ausgang, dann auf einen Eingang", + "value": "Klicken Sie auf einen Ausgang, dann auf einen Eingang" + }, + { + "context": "ui", + "key": "Klicken Sie auf einen Eingang, um die Verbindung zu erstellen", + "value": "Klicken Sie auf einen Eingang, um die Verbindung zu erstellen" + }, + { + "context": "ui", + "key": "Kommentar (optional)", + "value": "Kommentar (optional)" + }, + { + "context": "ui", + "key": "Kommentar bearbeiten", + "value": "Kommentar bearbeiten" + }, + { + "context": "ui", + "key": "Knoten duplizieren", + "value": "Knoten duplizieren" + }, + { + "context": "ui", + "key": "Rückgängig", + "value": "Rückgängig" + }, + { + "context": "ui", + "key": "Verbindungen zeichnen", + "value": "Verbindungen zeichnen" + }, + { + "context": "ui", + "key": "Vergrößern", + "value": "Vergrößern" + }, + { + "context": "ui", + "key": "Verkleinern", + "value": "Verkleinern" + }, + { + "context": "ui", + "key": "Wiederholen", + "value": "Wiederholen" + }, + { + "context": "ui", + "key": "Zoom-Voreinstellungen", + "value": "Zoom-Voreinstellungen" + }, + { + "context": "ui", + "key": "Zoomstufe (Prozent)", + "value": "Zoomstufe (Prozent)" + }, + { + "context": "ui", + "key": "Doppelklick zum Bearbeiten", + "value": "Doppelklick zum Bearbeiten" + }, + { + "context": "ui", + "key": "Kommentar auf dem Canvas einfügen", + "value": "Kommentar auf dem Canvas einfügen" + }, + { + "context": "ui", + "key": "Kommentar eingeben …", + "value": "Kommentar eingeben …" + }, + { + "context": "ui", + "key": "Canvas-Notiz verschieben", + "value": "Zum Verschieben greifen" + }, + { + "context": "ui", + "key": "Notizfarbe", + "value": "Notizfarbe" + }, + { + "context": "ui", + "key": "Notizgröße ändern", + "value": "Notizgröße ändern" + }, { "context": "ui", "key": "✓ Mandat eingereicht", @@ -9994,6 +10214,116 @@ "key": "Warnschwelle", "value": "Warning threshold" }, + { + "context": "ui", + "key": "Ansicht an Fenster anpassen", + "value": "Fit to window" + }, + { + "context": "ui", + "key": "Ansicht zurücksetzen", + "value": "Reset view" + }, + { + "context": "ui", + "key": "Auswahl löschen", + "value": "Delete selection" + }, + { + "context": "ui", + "key": "Canvas bearbeiten", + "value": "Edit canvas" + }, + { + "context": "ui", + "key": "Klicken Sie auf einen Ausgang, dann auf einen Eingang", + "value": "Click an output, then an input" + }, + { + "context": "ui", + "key": "Klicken Sie auf einen Eingang, um die Verbindung zu erstellen", + "value": "Click an input to create the connection" + }, + { + "context": "ui", + "key": "Kommentar (optional)", + "value": "Comment (optional)" + }, + { + "context": "ui", + "key": "Kommentar bearbeiten", + "value": "Edit comment" + }, + { + "context": "ui", + "key": "Knoten duplizieren", + "value": "Duplicate node" + }, + { + "context": "ui", + "key": "Rückgängig", + "value": "Undo" + }, + { + "context": "ui", + "key": "Verbindungen zeichnen", + "value": "Draw connections" + }, + { + "context": "ui", + "key": "Vergrößern", + "value": "Zoom in" + }, + { + "context": "ui", + "key": "Verkleinern", + "value": "Zoom out" + }, + { + "context": "ui", + "key": "Wiederholen", + "value": "Redo" + }, + { + "context": "ui", + "key": "Zoom-Voreinstellungen", + "value": "Zoom presets" + }, + { + "context": "ui", + "key": "Zoomstufe (Prozent)", + "value": "Zoom level (percent)" + }, + { + "context": "ui", + "key": "Doppelklick zum Bearbeiten", + "value": "Double-click to edit" + }, + { + "context": "ui", + "key": "Kommentar auf dem Canvas einfügen", + "value": "Add comment on canvas" + }, + { + "context": "ui", + "key": "Kommentar eingeben …", + "value": "Enter a comment…" + }, + { + "context": "ui", + "key": "Canvas-Notiz verschieben", + "value": "Drag to move note" + }, + { + "context": "ui", + "key": "Notizfarbe", + "value": "Note color" + }, + { + "context": "ui", + "key": "Notizgröße ändern", + "value": "Resize note" + }, { "context": "ui", "key": "✓ Mandat eingereicht", diff --git a/modules/routes/routeWorkflowDashboard.py b/modules/routes/routeWorkflowDashboard.py index d83ce1b2..8b0ae174 100644 --- a/modules/routes/routeWorkflowDashboard.py +++ b/modules/routes/routeWorkflowDashboard.py @@ -58,14 +58,32 @@ def _getUserMandateIds(userId: str) -> list[str]: def _getAdminMandateIds(userId: str, mandateIds: list) -> list: - """Batch-check which mandates the user is admin for (2 SQL queries total).""" + """Batch-check which mandates the user is admin for (UserMandate → UserMandateRole → Role).""" if not mandateIds: return [] rootIface = getRootInterface() - from modules.datamodels.datamodelMembership import UserMandateRole - allRoles = rootIface.db.getRecordset(UserMandateRole, recordFilter={ - "userId": userId, "mandateId": mandateIds, - }) + from modules.datamodels.datamodelMembership import UserMandate, UserMandateRole + + memberships = rootIface.db.getRecordset( + UserMandate, + recordFilter={"userId": userId, "mandateId": mandateIds, "enabled": True}, + ) + if not memberships: + return [] + + umIdToMandateId: dict[str, str] = {} + for m in memberships: + row = m if isinstance(m, dict) else m.__dict__ + um_id = row.get("id") + mid = row.get("mandateId") + if um_id and mid: + umIdToMandateId[str(um_id)] = str(mid) + + userMandateIds = list(umIdToMandateId.keys()) + allRoles = rootIface.db.getRecordset( + UserMandateRole, + recordFilter={"userMandateId": userMandateIds}, + ) if not allRoles: return [] @@ -74,23 +92,26 @@ def _getAdminMandateIds(userId: str, mandateIds: list) -> list: for r in allRoles: row = r if isinstance(r, dict) else r.__dict__ rid = row.get("roleId") - mid = row.get("mandateId") - if rid: + um_id = row.get("userMandateId") + mid = umIdToMandateId.get(str(um_id)) if um_id else None + if rid and mid: roleIds.add(rid) roleToMandate.setdefault(rid, set()).add(mid) if not roleIds: return [] - from modules.datamodels.datamodelRbac import MandateRole - roleRecords = rootIface.db.getRecordset(MandateRole, recordFilter={"id": list(roleIds)}) + from modules.datamodels.datamodelRbac import Role + roleRecords = rootIface.db.getRecordset(Role, recordFilter={"id": list(roleIds)}) adminMandates: set = set() for role in (roleRecords or []): row = role if isinstance(role, dict) else role.__dict__ - if row.get("isAdmin"): - rid = row.get("id") - if rid and rid in roleToMandate: - adminMandates.update(roleToMandate[rid]) + rid = row.get("id") + if not rid or rid not in roleToMandate: + continue + # Same rule as routeBilling._isAdminOfMandate / notifyMandateAdmins + if row.get("roleLabel") == "admin" and not row.get("featureInstanceId"): + adminMandates.update(roleToMandate[rid]) return [mid for mid in mandateIds if mid in adminMandates]