Öffne Kontextmenü

Ereignisaktion - Kurzfassung

Zweck: Öffnet ein eigens zu diesem Zweck definiertes Kontextmenü an der aktuellen Mauszeigerposition im Client, um eine Auswahl zu ermöglichen.

images/download/attachments/201664161/image-2025-3-21_11-15-54-version-1-modificationdate-1742566262192-api-v2.png

Die Ereignisaktion Öffne Kontextmenü öffnet an der aktuellen Mauszeigerposition im Client ein Kontextmenü ausgehend von einer - ggf. eigens generierten - "Liste" von Auswahlmöglichkeiten.

Die Auswahl des Benutzers kann mit einem der folgenden Modi verarbeitet werden:

  • Entweder die Auswahl wird synchron und serverseitig verarbeitet. Dann wird die Ereignisbehandlung unterbrochen, bis durch die Auswahl des Benutzers ein Rückgabeobjekt für die nachfolgenden Ereignisaktionen zur Verfügung steht. Verstreicht eine parametrierbare Wartezeit (>0 Sekunden) ohne Auswahl, schließt sich das Kontextmenü automatisch.

  • Alternativ wird die Auswahl wird asynchron und ausschließlich clientseitig verarbeitet. Dann definiert ein Client Workflow Ereignisaktionen, die der Client ausführt sobald ein Rückgabeobjekt ausgewählt ist, während der Server die Ereignisbehandlung sofort nach dem Öffnen des Kontextmenüs fortsetzt.

In beiden Fällen kann der Benutzer das Kontextmenü durch Drücken der Esc-Taste oder eine Interaktion im umgebenden Fenster (wie z. B. ein Mausklick außerhalb des Kontextmenüs) ohne Auswahl schließen.

Beim Schließen ohne Auswahl wird "kein Wert" ($null) als Rückgabeobjekt an die auszuführenden Ereignisaktionen weitergegeben. Diese werden also immer nach dem Schließen des Kontextmenüs ausgeführt, so dass der Sonderfall "keine Auswahl" z. B. durch eine Wenn Dann Sonst- oder Ausführen mit-Ereignisaktion oder im Client Workflow durch eine geeignete "Prüfende Regel" abgefangen werden sollte.

Konfiguration

Parameter

  • Der Wertauflöser für Elemente muss eine "Liste" zurückgeben, die simple Werte oder komplexe Datenobjekte enthalten kann. Auch ein einzelnes Element muss formal als Element einer Liste übergeben werden, damit er als einzige Option im Kontextmenü erscheint.

  • Der optionale Beschriftungsausdruck (s. Berechnungsausdruck) wird je Listenelement angewendet, um die Beschriftung der Kontextmenüoption zu definieren. Dabei gilt das komplette Listenelement als $input. Der Standardeintrag {label} verweist demnach auf den Wert der label-Felds in einem aufgelisteten Objekt. Ist der Beschriftungsausdruck leer, erscheinen alle Optionen ohne Beschriftung.

  • Der optionale Parameter Datenfeld der Kindknoten identifiziert ein Datenfeld des aufgelisteten Objekts, das eine Liste enthalten kann, die Einträge eines Untermenüs definiert. Auch die darin aufgelisteten Objekte werden anhand Beschriftungsausdruck und Icon Ausdruck als Menüpunkte visualisiert. Dieses Konzept kann kaskadierend, also für mehrere verschachtelte Menüebenen, angewendet werden. Menüeinträge gelten dabei nur dann als auswählbar, wenn sie keine "Kindknoten" enthalten.

  • Der optionale Icon Ausdruck (s. Berechnungsausdruck) wird je Listenelement angewendet, um den Pfad zu einem Icon zu definieren (s. Arbeiten mit Bildressourcen (Icons)). Dabei gilt das komplette Listenelement als $input. Der Standardeintrag {icon} verweist demnach auf den Wert des icon-Felds in einem aufgelisteten Objekt. Ist der Beschriftungsausdruck leer, erscheinen alle Optionen ohne Icon und das Kontextmenü ohne Icon-Spalte.

  • Die Option Suche aktivieren steuert, ob eine Suchfunktion für Kontextmenü-Einträge angeboten wird oder nicht (Standard).


images/download/attachments/201664161/image-2025-3-21_11-20-34-version-1-modificationdate-1742566262186-api-v2.png

Die weiteren Parameter betreffen das Verhalten des geöffneten Kontextmenüs in Bezug auf die Auswahl eines Eintrags durch den Benutzer. Abhängig vom ausgewählten Modus werden dabei unterschiedliche Konfigurationsmöglichkeiten angeboten:

Als Modus ist per Standard die Option Auswahl zurückliefern vorbelegt, mit der das Kontextmenü synchron geöffnet wird.

  • Der Parameter Variablenname des Rückgabeobjekts definiert über welche Variable die nachfolgenden Ereignisbehandlungen auf das Rückgabeobjekt zugreifen können, sobald das Kontextmenü (mit oder ohne Auswahl) geschlossen wird. Wählt der Benutzer einen Menüeintrag aus dem Kontextmenü, dann gilt das zugehörige Listenelement (aus der per Elemente definierten Liste) insgesamt als Rückgabeobjekt.

  • Die Wartezeit Wertrückgabe definiert die Dauer der Wartezeit (in Sekunden) bis zum automatischen Schließen des Kontextmenüs, falls der Benutzer keine Auswahl trifft und das Kontextmenü auch nicht ohne Auswahl schließt. Als Standardwert sind hier 30 Sekunden vorgegeben. Der Mindestwert ist 1 Sekunde. Die Wartezeit kann durch hohe Werte zwar "sehr lang" eingestellt aber nicht als "unbegrenzt" definiert werden.

images/download/attachments/201664161/image-2025-3-21_11-27-7-version-1-modificationdate-1742566262183-api-v2.png

Alternativ kann der Modus auf die Option Aktion im Client ausführen umgestellt werden, mit dem das Kontextmenü asynchron geöffnet wird, so dass die Ereignisbehandlung ohne eine Auswahl im geöffneten Kontextmenü abzuwarten unmittelbar fortgesetzt wird.

Als einzige Aktion bei Auswahl steht die Option Client Workflow zur Verfügung. Mit der Auswahl dieser Option kann ein Client Workflow definiert werden, den die Ereignisbehandlung zur Laufzeit an den Client zur Ausführung beim Schließen des Kontextmenüs übergibt. Für den Kontext des Client Workflows gilt dabei:

  • Das übergebene Eingabeobjekt ist das Rückgabeobjekt des Kontextmenüs. Wählt der Benutzer einen Menüeintrag aus dem Kontextmenü, dann gilt das zugehörige Listenelement (aus der per Elemente definierten Liste) insgesamt als Rückgabeobjekt. Wird das Kontextmenü ohne Auswahl geschlossen gilt das Rückgabeobjekt "kein Wert" ($null).

  • Der asynchron ausgelöste Client Workflow erhält keinen Zugriff auf im Kontext der Ereignisbehandlung definierte Variablen bzw. deren Inhalt. Das bedeutet auch, dass im ausgelösten Client Workflow normalerweise kein Zugriff auf das Eingabeobjekt aus dem aufrufenden Kontext besteht, sofern dieses nicht im Rückgabeobjekt enthalten oder damit identisch ist.

ANMERKUNG◄ In Verbindung mit dem Modus Aktion im Client ausführen bleibt das Kontextmenü grundsätzlich "unbegrenzt" geöffnet.

images/download/attachments/201664161/image-2025-3-21_11-28-3-version-1-modificationdate-1742566262180-api-v2.png

Definition von Einträgen für das Kontextmenü

Grundsätzlich kann jede Liste verwendet werden, um über den Wertauflöser für Elemente ein Kontextmenü zu erzeugen. Lobster Data Platform / Orchestration bietet vielfältige Möglichkeiten Listen über Wertauflöser zu erzeugen oder aus bestehenden Datenquellen zu gewinnen. Die folgenden Beispiele greifen ausgewählte Techniken aus einem umfangreichen Lösungsraum heraus.

Auf der Basis der Standardwerte für die Parameter Beschriftungsausdruck (label), Datenfeld der Kindknoten (children) und Icon Ausdruck (icon) könnte eine statische Definition für ein Kontextmenü im JSON-Format wie folgt aussehen:

[
{"label":"COMPASS","icon":"fa://fal-compass",
"children": [
{"label":"Nord","icon":"fa://fal-arrow-up"},
{"label":"Ost","icon":"fa://fal-arrow-right"},
{"label":"Süd","icon":"fa://fal-arrow-down"},
{"label":"West","icon":"fa://fal-arrow-left"}
]
},
{"label":"GPS","icon":"fa://fal-satellite"}
]

Über einen Objekt aus JSON erzeugen-Wertauflöser (s. a. Abschnitt "Beispiele" unten) kann aus der links abgebildeten JSON-Struktur eine "Liste" für den Parameter Elemente in einer Öffne Kontextmenü-Ereignisaktion erzeugt werden.

Laufzeitbeispiel: Das Kontextmenü wird beim Klick auf einen Button geöffnet, um das Ziel einer Tour mehr oder weniger präzise angeben zu können.

images/download/attachments/201664161/image-2025-3-21_11-37-40-version-1-modificationdate-1742566262178-api-v2.png

  • Zur Gliederung von Einträge in derselben Ebene eines Kontextmenüs kann eine horizontale Linie erzeugt werden, indem der Liste an der fraglichen Position ein Element hinzugefügt wird, das für ein Feld type den Wert hline angibt.
    HINWEIS◄ Die horizontale Linie ist per Definition nicht als Menüeintrag auswählbar.

  • Ein Eintrag im Kontextmenü erscheint deaktiviert, wenn das betreffende Element über ein Feld mit dem Namen disabled verfügt, dem der Wert true (als Boolescher Wert, nicht als Text!) zugeordnet ist.
    HINWEIS◄ Ein deaktivierter Eintrag mit Kindknoten zeigt zwar das ">" Symbol am rechten Rand, klappt aber die Kindknoten nicht auf. Eine Deaktivierung versteckt also ggf. einen kompletten Ast eines Menübaums.

Beide Möglichkeiten veranschaulicht die folgende Anpassung für das obige Beispiel:

[
{"label":"COMPASS","icon":"fa://fal-compass",
"children": [
{"label":"Nord","icon":"fa://fal-arrow-up"},
{"label":"Süd","icon":"fa://fal-arrow-down"},
{"type":"hline"},
{"label":"Ost","icon":"fa://fal-arrow-right"},
{"label":"West","icon":"fa://fal-arrow-left"}
]
},
{"label":"GPS","icon":"fa://fal-satellite","disabled":true}
]

images/download/attachments/201664161/image-2025-3-21_11-39-28-version-1-modificationdate-1742566262175-api-v2.png

  • Die Optionen unter "COMPASS" erscheinen nun durch eine horizontale Linie unterteilt nach Nord/Süd und Ost/West.

  • Die Option GPS erscheint nicht nur "inaktiv" (grau), sondern kann auch wirklich nicht ausgewählt werden.

ANMERKUNG◄ Zwecks einfacherer Darstellung verzichtet das Einführungsbeispiel auf zwei Aspekte in der Menüdefinition, die für die Praxis wichtig sein können: Die Beschriftung der Menüeinträge definiert statische Texte ohne Bezug zur Sprachverwaltung, sodass das Menü in allen Sprachen identisch erscheint. Außerdem bieten die auswählbaren Listenelemente kein Feld an, das ausschließlich der Identifikation des ausgewählten Eintrags dient. Die Auswahl des Benutzers müsste also anhand der Beschriftung oder des Icons im Rückgabeobjekt bzw. einer Kombination aus beiden Merkmalen identifiziert werden. Änderungen an diesen Merkmalen erzeugen dann auch Änderungsaufwand in den ausgelösten Ereignisbehandlungen. Das erste der folgenden Beispiele zeigt eine angemessenere Lösung für beide Aspekte auf.

Beispiele

Professionalisierung des Einführungsbeispiels

Zunächst soll gezeigt werden, wie die Konfiguration für das Einführungsbeispiel im Detail und "professioneller" umgesetzt werden kann, die einerseits eine sprachabhängige Beschriftung der Menüeinträge und andererseits eine unabhängige Identifikation der Auswahlmöglichkeiten sicherstellt.

Konfiguration:

Zunächst wird der statische Text für die Definition der Elemente wie unten links dargestellt angepasst. Dann werden die rechts gezeigten Einträge in der Sprachverwaltung angelegt.

[
{"key":"COMPASS","icon":"fa://fal-compass",
"children": [
{"key":"N","icon":"fa://fal-arrow-up"},
{"key":"E","icon":"fa://fal-arrow-right"},
{"key":"S","icon":"fa://fal-arrow-down"},
{"key":"W","icon":"fa://fal-arrow-left"}
]
},
{"key":"GPS","icon":"fa://fal-satellite"}
]

Anstelle des labels wird jetzt ein eindeutiges Feld key bereitgestellt, das gleichzeitig die eindeutige Identifikation und damit den Ansatzpunkt für eine Lokalisierung der Einträge über die Sprachverwaltung (s. rechts) gewährleistet.

images/download/attachments/201664161/image-2025-3-21_11-44-25-version-1-modificationdate-1742566262172-api-v2.png

  • Dem Kontextmenü wird ein eigenes Resource bundle gewidmet (contextHeading), was nicht zwingend notwendig ist aber wartungsfreundlich.

  • In der Spalte Resource name sollten alle Werte erscheinen, die in der JSON-Definition (links) als Wert für das Feld key erscheinen. Diese werden hier mit Übersetzungen für die Sprachen Deutsch und Englisch versehen.

  • Die Abkürzung GPS muss nicht übersetzt werden.

Die Implementierung des Kontextmenüs innerhalb einer Ereignisbehandlung oder in einem Client Workflow kann auf dieser Basis wie unten dargestellt umgesetzt werden:

  • Der Wert für den Parameter Elemente wird definiert, indem die JSON-Struktur zunächst als statischer Textwert (s. Statische Werte) definiert und dann per Verkettung an einen Wertauflöser vom Typ Objekt aus JSON erzeugen (mit Standardeinstellungen) weitergegeben wird.

  • Im Beschriftungsausdruck erfolgt der Zugriff auf die Sprachverwaltung über die Syntax [Bundle, Resource, Default], wobei das Feld key sowohl den "Resource Name" (Resource) als auch den Standardwert (Default) bestimmt, was z. B. bewirkt, dass der nicht übersetzte Eintrag für GPS als "GPS" beschriftet wird.

  • Für alle weiteren Parameter werden hier die Standardwerte beibehalten. Auf die Vorbelegung für Datenfeld der Kindknoten und Icon Ausdruck wurde der JSON-Text von Beginn an abgestimmt.

ANMERKUNGEN

  • Zusätzlich zu den Beschriftungen könnte man auch die Pfade für die Icons über Einträge der Sprachverwaltung definieren, um eine sprachspezifische Symbolik zu ermöglichen.

  • Alternativ könnte man auch einen einzigen Spracheintrag anlegen, der die JSON-Struktur für das Kontextmenü insgesamt je Sprache definiert. Wenn dasselbe Kontextmenü in unterschiedlichen Kontexten geöffnet werden soll, wäre dieser Ansatz besonders wartungsfreundlich, da damit die Menüstruktur für alle Kontexte zentral verwaltet werden kann.

images/download/attachments/201664161/image-2025-3-21_11-46-48-version-1-modificationdate-1742566262170-api-v2.png

Kontextmenü aus dem Ergebnis einer Tupel-Suche aufbauen

Anforderung:

Innerhalb einer Erfassungsmaske sollen bestimmte Benutzerkonten in einem Kontextmenü zur Auswahl angeboten, um über das mailto-Protokoll das Erstellen einer E-Mail-Nachricht an dessen Adresse anzustoßen.

Detailanforderungen:

  • Beim Klick auf einen Button soll ein Kontextmenü geöffnet werden, das relevante Benutzer (mit Name und Benutzername) alphabetisch aufsteigend sortiert auflistet und dabei per Icon auf die für deren Benutzerkonto ausgewählte "Sprache" hinweist.

  • Auswählbar sollen nur Benutzer sein, deren Benutzerkonto "Aktiv" gesetzt ist. "Inaktive" Benutzer sollen ebenfalls aufgelistet werden, aber nicht auswählbar sein.

Laufzeitbeispiel:

images/download/attachments/201664161/image-2025-3-21_14-7-13-version-1-modificationdate-1742566262167-api-v2.png

Konfiguration:

Der gewünschte Ablauf kann in den folgenden Schritten komplett als Client Workflow, z. B. in einem Verhalten für den Button, abgewickelt werden:

  • Als Prüfende Regel wird hier eine Statische Regel (mit dem Standardwert true) verwendet, da die Ausführung der folgenden Aktionen ohne einschränkende Bedingungen erfolgen soll.


  • Die Suche (Ereignisaktion) definiert eine Tupel-Suche für die Entität Benutzer, die - wie anschließend detaillierter ausgeführt - neben der reinen Auswahl der relevanten auch bestimmte Benutzerdaten für die Darstellung des Kontextmenüs aufbereitet.

  • Das Ergebnis der Suche wird per Variable an die Ereignisaktion Öffne Kontextmenü übergeben, die dem Benutzer die Auswahl überlässt, welcher Ansprechpartner angeschrieben werden soll. Auf eine Überprüfung, ob die Suchaktion überhaupt Ansprechpartner geliefert hat, wird dabei verzichtet. Ggf. erscheint das Kontextmenü daher leer.

  • Damit der E-Mail-Client nur adressiert wird, wenn der Benutzer einen der im Kontextmenü angebotenen Ansprechpartner ausgewählt hat, prüft die folgende Wenn Dann Sonst-Ereignisaktion, ob die zur Übergabe verwendete Variable leer ist.

images/download/attachments/201664161/image-2025-3-21_14-8-48-version-1-modificationdate-1742566262164-api-v2.png

Nachfolgend werden relevante Konfigurationen für jeden Schritt des Client Workflows erörtert:

Suchaktion

  • Der Parameter Ergebnis speichern als definiert den Namen der Variablen (hier: users), über die nach der Suchaktion auf deren Rückgabewert zugegriffen werden kann.

  • Die gesuchte Entität sind in unserem Beispiel Benutzer.

  • Unter Modus wurde der Suchwert ausgewählt, damit alle "Ergebniszeilen" direkt als Liste zurückgegeben werden.

  • Die Suche wird als Tupel-Suche definiert, da der Zugriff auf komplette Benutzerkonten einerseits nicht erfoderlich ist und andererseits Daten durch die Definition von Projektionen für das Kontextmenü aufbereitet werden sollen.


  • Die Felder "Benutzername" (username), "ID" (id) und Sprache (locale) werden direkt als Feldprojektion übernommen.

  • Für die Beschriftung (label) im Kontextmenü werden die Name-Felder aus der Adresse (adresse.name1/2/3) des Benutzers über je ein literales Leerzeichen per "Textverkettungsprojektion" verkettet.

  • Das Feld disabled, das im Kontextmenü steuert, ob ein Ansprechpartner auswählbar ist oder nicht, soll eine Negation des Booleschen Werts aus dem Feld "Aktiv" (active) im Benutzerkonto zugeordnet werden:

images/download/attachments/201664161/image-2025-3-21_14-11-9-version-1-modificationdate-1742566262157-api-v2.png

images/download/attachments/201664161/image-2025-3-21_14-13-39-version-1-modificationdate-1742566262150-api-v2.png

Die Negation kann hier nur über eine Wenn ( Case ) Projektion dargestellt werden, was etwas umständlich wirkt, aber mit wenigen Klicks konfiguriert werden kann.

Für das Kontextmenü ist wichtig, dass der als Literale Projektion zugewiesene Werte (true oder false) tatsächlich vom Datentyp Boolean sind und nicht etwa nur gleichlautende Textwerte.

ANMERKUNG◄ Abhängig von konkreten Anforderungen wären ggf. noch "Bedingungen" für die Suche (Ereignisaktion) festzulegen, da sonst alle "lesbaren" Benutzerkonten als Ansprechpartner erscheinen. Auf Details hierzu sei mangels Relevanz mit Blick auf das Kontextmenü verzichtet.

Öffne Kontextmenü

Die Suche (Ereignisaktion) speichert alle zurückgegebenen Ergebniszeilen als Liste in der Variablen users, die damit im Wertauflöser für die Elemente für das zu öffnende Kontextmenü direkt verwendet werden kann:

  • Obwohl die gewünschte alphabetische Sortierung nach dem Feld label auch innerhalb der Definition der Suche möglich wäre, soll hier zur Demonstration die Ergebnisliste nachträglich sortiert werden, indem ein Liste sortieren-Wertauflöser verkettet wird, der das Feld label als Vergleichswert verwendet.

  • Der Beschriftungsausdruck verbindet die Felder label und username mit etwas literaler Formatierung.

  • Ein Datenfeld für Kindknoten wird nicht spezifiziert.

  • Der Icon Ausdruck nutzt den Umstand, dass zum Standard von Lobster Data Platform / Orchestration eine Sammlung von Icons für Nationalflaggen gehört, deren Dateiname für viele Staaten zur internen Kennung für die auswählbare "Sprache" (locale) passt. Wie der Ausdruck vermittelt musste allerdings per $replace-Funktion eine Ausnahme definiert werden, damit das Icon für die Flagge von Großbritannien (gb.png) erscheint, wenn die Sprache "Englisch" gewählt ist.

  • Als Modus ist Auswahl zurückliefern gewählt, da das Kontextmenü synchron geöffnet und der aufrufende Client Workflow bis zum Schließen oder dem Ablauf der Wartezeit Wertrückgabe (30 Sekunden) unterbrochen werden soll.

  • Der Variablenname des Rückgabeobjekts legt fest, dass das vom Benutzer ausgewählte Element in der Variable selectedUser gespeichert wird.

images/download/attachments/201664161/image-2025-3-21_14-18-43-version-1-modificationdate-1742566262146-api-v2.png


Ausgewählten Ansprechpartner benachrichtigen ...

Nach dem Schließen des Kontextmenüs sollte dringend eine Prüfung erfolgen, ob ein Benutzer ausgewählt wurde oder nicht. Dazu kann eine Wenn Dann Sonst-Ereignisaktion wie rechts dargestellt konfiguriert werden:

  • Als einzige Bedingung reicht eine Objekt-Feld-Regel aus, mit der überprüft wird, ob die Variable selectedUser "nicht-leer" ist.

  • Im Dann-Block steuert die ausschlaggebende Ereignisaktion Externe URL öffnen das Erstellen einer E-Mail mit dem Standard-Mail-Client an, indem per Textverkettung eine URL aufgebaut wird, die mit dem mailto:-Präfix für das Protokoll beginnt und danach den Benutzernamen username mit einem statischen Text für den Domänennamen (@acme.org) verbindet.

Laufzeitbeispiel:

images/download/attachments/201664161/image2021-3-26_18-2-24-version-1-modificationdate-1742566262312-api-v2.png

ANMERKUNG◄ Die hier verwendete starre Aufbaustruktur für die E-Mail-Adresse ist natürlich nur dann legitim, wenn gesichert ist, dass alle im Kontextmenü aufgelisteten Benutzer über dieselbe Domäne erreichbar sind und deren Mail-Adresse dort immer ihrem Benutzernamen für die Lobster Data Platform entspricht. In einer realen Situation wäre sicher eine aufwändigere Logik für die Ermittlung der E-Mail-Adresse angebracht, die z. B. weitere Daten aus dem Benutzerkonto einbeziehen könnte.


images/download/attachments/201664161/image-2025-3-21_14-19-42-version-1-modificationdate-1742566262143-api-v2.png