Grundlagen der GUI-Konfiguration
Konfigurationshierarchie
Alle Elemente der Benutzeroberfläche sind hierarchisch geordnet - analog des "Matroschka-Prinzips". Die Hierarchie ist zwingend einzuhalten, wenn Sie die Benutzeroberfläche konfigurieren. Die Hierarchie wird durch Verschachtelung der einzelnen SysConfig-Schlüssel erreicht. So sind die Formularfelder in den Formular-Dialogen (Neues Ticket, Ticket bearbeiten etc.) immer Kind-Elemente von Gruppen. Gruppen sind immer Kind-Elemente von Seiten. Seiten sind wiederum Kind-Elemente von Formularen usw. Demnach muss ein Dynamisches Feld in die Gruppe " eingebunden werden. Jede Seite muss immer eine Gruppe besitzen, um Formularfelder aufnehmen zu können. Parallel dazu sind die Widgets, Tabellen und Lanes im Frontend immer Kind-Elemente eines ConfiguredWidgets. Das ConfiguredWidget wiederum ist ein Kind-Element vom Kontext (Sidebar, Lane, Explorer etc.) Welcher Hierarchieebene ein SysConfig-Schlüssel angehört, können Sie der Spalte Metadaten in der Übersicht der SysConfig-Schlüssel entnehmen.
Aufbau der Hierarchie:
- Kontext - Widget - Tabellen-Widget - Tabellen Konfiguration - Konfiguration der Tabellenspalten - Objekt-Info-Widget - Widget Verknüpfte Objekte - Hilfe-Widget - Slider-Widget - Ticket Übersicht Widget - Tab-Widget - Asset Übersicht Widget - Hauptmenü - Formular - Seite - Gruppe - Feld - ...Feld

Abb.: Konfigurationshierarchie am Beispiel des Dialogs Neues Ticket
Context
Dreh- und Angelpunkt für die Seiten in der Oberfläche sind immer die Kontexte. Ein Kontext kann z. B. ein Dashboard, eine Detailseite oder ein Dialog sein. Diesem Kontext liegt immer eine Konfiguration zugrunde. Bestandteil dieser Konfiguration sind verschiedene Listen mit Widgets, welche dann in der Oberfläche entsprechend angezeigt werden. Die Listen teilen sich z. B. auf in:
sidebars
explorer
lanes
content
others
.....
Innerhalb dieser Listen befinden sich die jeweiligen Konfigurationen für die Sidebar, den Explorer, die Lanes, das Dashboard usw. Wenn Sie also ein weiteres Widget in die Sidebar integrieren möchten, so erfolgt das im jeweiligen Kontext (z. B. Ticketdetails) in der Liste sidebars
. Möchten Sie eine zusätzliche Tabelle im Ticketdashboard integrieren, so erfolgt das im Kontext "Ticket Dashboard" in der Liste content
usw.

Abb.: Konfiguration im Kontext Ticket-Details
ConfiguredWidget
In den Listen wird ein Object ConfiguredWidget
erwartet. Dieses bildet den Rahmen für das konkrete Widget, welches per configuration
gegeben ist.
Ein ConfiguredWidget hat folgende relevante Eigenschaften:
instanceId: Eindeutige Zeichenkette (kontextweit), welche zur Identifikation der konkreten Widget-Instanz benötigt wird
configurationId: Referenz-ID auf eine konkrete Widget-Konfiguration
configuration: Wird keine Referenz verwendet, dann kann die Konfiguration direkt hier angegeben werden.
permissions: Berechtigungen, die notwendig sind, damit das Widget in der Oberfläche angezeigt wird (z. B. READ auf /tickets)
size: Anzeigegröße des Widgets (large = großes Widget, small = kleines Widget)

Abb.: Konfiguration eines ConfiguredWidget
WidgetConfiguration
Diese configuration
widerum erwartet eine sogenannte WidgetConfiguration
. Mit dieser Konfiguration wird das Widget in seiner konkreten Ausprägung konfiguriert:
widgetId: ID des Widget, welches angezeigt werden soll
title: Der Titeltext des Widgets
icon: Das Icon, welches im Header angezeigt werden soll
actions: - Aktionen die im Widgetheader angezeigt werden sollen
minimized: - minimiert true/false
minimizable: - true/false
subConfigurationDefinition: - Referenz auf eine Subkonfiguration
configuration: - die konkrete Konfiguration des Widgets*
contextDependent (optional): abhängig vom Kontext
contextObjectDependent (optional): abhängig vom Objekt des Kontextes
formDependent (optional): abhängig von einem Formular
formDependencyProperties (optional): Formularwerte, von welchem das Widget abhängig ist

Abb.: WidgetConfiguration
Das Widget besitzt noch einmal eine eigene Konfiguration (subConfigurationDefinition
). Darin sind die individuellen Konfiguration en der einzelnen Widgets enthalten. So beinhaltet z. B. das Tabellen-Widget an dieser Stelle die konkrete Tabellenkonfiguration:
- Context (z. B. Sidebar, Lane, Explorer, etc.) - Content (Liste der Content Widgets) - ConfiguredWidget (Widget-Hülle) - table widget (z. B. Ticket-Tabelle, Empfohlene FAQ, etc.) - tableConfiguration (konkreter Widget-Inhalt) - Konfiguration der Tabellenspalten - object-information-card-widget (z. B. Widget "Kontakt Informationen, Lane "Ticket Informationen", Hilfe-Widget etc.) - Konfiguration des Avatars und der Rows - object-dialog-form-widget (z. B. Dialoge "Neues Ticket", "Ticket bearbeiten", etc.) - Formular - Seite - Gruppe - Feld - Feld - [Feld]...

Abb.: Tabellenkonfiguration
Tipp
Eine technische Beschreibung zur Konfiguration des KIX-Frontends finden Sie auch unter:https://github.com/kix-service-software/kix-frontend/tree/master/doc
Die HTML-Ansicht dieser Beschreibung können Sie sich unter https://github.com/kix-service-software/kix-frontend/blob/master/doc/doc.tar.gz herunterladen (Klick auf Download-Button).
Konfiguration von Widgets
Ein Widget besteht aus dem Widget selbst und dem darin anzuzeigenden Inhalt
. Beide besitzen einen eigenen Konfigurationsblock (
"configuration":{...}
). Der Konfigurationsblock des Widgets beinhaltet den Konfigurationsblock des Widget-Inhalts.

Abb.: Widget und Widget-Inhalt am Beispiel des objekt-info-widgets Kontakt Informationen
Im Konfigurationsblock des Widgets sind u. a. definiert:
die Eigenschaften und das Verhalten des Widgets
Widget-Titel und Widget-Typ
Konfiguration des Widget-Inhalts
Im Konfigurationsblock des Widget-Inhalts sind u. a. definiert
die im Widget anzuzeigenden Inhalte (Platzhalter, Tabellendefinitionen, Dynamische Felder etc.)
Bedingungen für die Anzeige der Inhalte
Verlinkungen und Routing-Informationen
u. a. m.
Grundkonfiguration eines Widgets
Das nachfolgende Codebeispiel zeigt die Grundstruktur in einem einfachen Objekt-Info-Widget.
{ //legt eine Instanz des Widgets an "instanceId": "name-der-widget-instanz" //Widgetkonfiguration "configuration":{ "id": "id-des-widgets", "name": "name des Widgets", "type": "Widget | TableWidget", "widgetId": "table-widget | object-information-card-widget", "title": "Translatable#übersetzbarer Widget-Titel", "actions": [], "subConfigurationDefinition": null, //Konfiguration des Widget-Inhalts "configuration": { //Konfiguration des Avatars "avatar": {string | ObjectIcon}, //Definiert, welche Inhalte pro Zeile angezeigt werden "rows": [ {... s. Widget-Inhalt...} ], } //Eigenschaften/Verhalten des Widgets "minimized": false, "minimizable": false, //Icon in der Titelzeile "icon": "kix-icon-man-house", "contextDependent": false }, "permissions": [], "size": "large" },
Allgemeine Widget-Attribute
Attribut | Beschreibung | Zum Beispiel |
---|---|---|
id | Eindeutige ID des Objekts im KIX | |
name | Name des Objekts bzw. Widgets | |
type | Typ des Objekts bzw. Widgets | Context | Widget | TabWidget | HelpWidget |
widgetID | Art des Widgets | object-information-card-widget | table-widget |
title | Widget-Titel im Widget-Header KIX Platzhalter sind möglich | "Kontakt Informationen" |
actions | Ticketaktionen, die initial verfügbar sein sollen Die Angabe ist optional | "Bearbeiten", "Duplizieren", "neuer Artikel", “CSV-Export” usw. |
subConfigurationDefinition | optionale Subkonfiguration | |
configuration | Widget-Inhalts |
|
minimized | Gibt an, ob das Widget minimiert (zusammengeklappt) angezeigt wird. | true | false |
minimable | Gibt an, ob das Widget minimiert werden kann. Wenn | true | false |
icon | optionale Konfiguration des Icons, welches neben dem Widget-Titel angezeigt wird |
|
contextDependent | Steuert die Abhängigkeit vom Kontext | true | false |
contextObjectDependent | Steuert die Abhängigkeit vom Objekt des Kontextes. Damit kann bspw. in Tabellen-Widgets gesteuert werden, dass das Laden der Tabelleninhalte nicht durch die Tabelle sondern durch den Kontext erfolgt | true | false |
formDependent | Steuert die Abhängigkeit vom Formular | true | false |
formDependencyPropertys | Formularwerte, von denen das Widget abhängig ist | "DynamicFields.myDynamicFieldName" |
Implementierungsarten von Widgets
Widgets können fest oder flexibel implementiert werden.
Diese Widgets sind fest in den entsprechenden Kontext implementiert. Sie besitzen keine zentrale Konfiguration. Ihre Konfiguration ist direkt im Widget angegeben und kann daher in jeder Instanz variieren.
Soll ein generelles Verhalten des Widgets geändert werden, so muss es in allen Instanzen geändert werden. Dadurch ist es aber bspw. auch möglich, in jedem Hilfe-Widget einen anderen Hilfetext anzugeben. Fest implementierte Widgets können jedoch
über die Konfiguration des Kontextes ein- oder ausgeblendet werden
Durch Kopieren und wieder Einfügen ihrer Instanz auch in andere Sidebars fest implementiert werden. Beispielsweise, um das Widget "Notizen" zusätzlich in den Ticketdetails anzuzeigen.
Ein fest implementiertes Widget ist bspw. das Sidebar-Widget Notizen im Home Dashboard oder das Sidebar-Widget Zeitbuchung.
Instanz eines fest implementierten Widgets (hier: Widget "Zeitbuchung" (KIX Pro)
{ "instanceId": "ticket-details-simple-time-accounting-widget", "configurationId": "ticket-details-simple-time-accounting-widget", "configuration": { "id": "ticket-details-simple-time-accounting-widget", "name": "Simple Time Accounting", "type": "Widget", "widgetId": "ticket-simple-time-accounting-widget", "title": "Translatable#Simple Time Accounting", "actions": [], "subConfigurationDefinition": null, "configuration": null, "minimized": false, "minimizable": true, "icon": "kix-icon-time", "contextDependent": false, "contextObjectDependent": false, "formDependent": false, "formDependencyProperties": [] }, "permissions": [], "size": "large" },
Flexibel implementierte Widgets besitzen eine zentrale Konfiguration in einem eigenen Konfigurationsschlüssel. Sie werden durch Referenz auf ihren Konfigurationsschlüssel implementiert. Dadurch können sie nicht nur in der Sidebar, sondern in nahezu allen Oberflächen flexibel eingebunden werden.
Da diese Widgets eine zentrale Konfiguration besitzen, werden Änderungen an der Konfiguration für alle Instanzen dieses Widgets übernommen - unabhängig vom Kontext , indem das Widget eingebunden ist. Sie besitzen demnach eine größere Konfigurationsvielfalt als fest implementierte Widgets.
Die im Widget anzuzeigenden Inhalte können durch Verwendung von Platzhaltern, Filtern und Bedingungen dynamisch gestaltet werden. Da die Inhalte auf Suchergebnissen basieren und lediglich die Ergebniswerte angezeigt werden, können nahezu alle Informationsarten - unabhängig vom Objekttyp - integriert werden. Es ist damit bspw. möglich:
ein Foto (Avatar) der Kontaktperson oder des Kunden anzuzeigen, sofern ein Bild zum Kontakt/zum Kunden hinterlegt ist)
die Kontaktadresse für die Anzeige in Online-Kartendiensten zu verlinken,
die Werte Dynamischer Felder - unabhängig vom Objekttyp - anzuzeigen
auf externe URLs zu verlinken (z. B. zu externen Webseiten, zu Inhalten in einem Web-CMS),
E-Mail-Adresse und Telefonnummer zu verlinken, um sie in einem externen Programm zu öffnen,
Schnellklicks auf interne Verlinkungen zu setzen (z. B. neues Asset anlegen, zum Kontakt wechseln, etc.)
zusätzliche Informationen anzuzeigen, wie die Anzahl zugeordneter Assets oder offener Tickets,
KIX-Platzhalter zu verwenden, um Inhalte dynamisch anzuzeigen,
bedingte Inhalte anzuzeigen, d. h. die Inhalte nur dann anzuzeigen, wenn bestimmte Eigenschaften am Kontakt- oder Kunden vorhanden sind,
u. v. a. m
Flexible Widgets sind bspw.:
Kontakt Informationen
Tickets zu Assets
Empfohlene FAQ
Tickets zu Kontakt
Offene Kind-Tickets
Beispiel: Flexibel implementierte Widgets in de Sidebar der Ticketdetails
{ ... //Sidebar in den Ticketdetails "sidebars": [ { //Instanz des Widgets Kontakt Informationen "instanceId": "ticket-details-contact-card-widget", "configurationId": "ticket-details-contact-card-widget", "permissions": [], "size": "large" }, { //Instanz des Widgets Empfohlene FAQ "instanceId": "ticket-details-suggested-faq-widget", "configurationId": "ticket-details-suggested-faq-widget", "permissions": [], "size": "large" }, { //Instanz des Widgets Tickets zu Assets "instanceId": "ticket-details-affected-asset-tickets", "configurationId": "ticket-details-affected-asset-tickets", "permissions": [], "size": "large" }, { //Instanz des Widgets Tickets zu Kontakt "instanceId": "ticket-details-contact-tickets", "configurationId": "ticket-details-contact-tickets", "permissions": [], "size": "large" } ],
Berechtigungen für Konfigurationen festlegen
Sie können eine Liste von berechtigten Rollen in Konfigurationen speichern, damit
bestimmte Informationen nur von autorisierten Mitarbeitern eingesehen werden können
Zum Beispiel: Anzeige von persönlichen Daten oder Gehaltsinformationen
Informationen ausgeblendet werden können, die für eine bestimmte Benutzergruppe nicht erforderlich sind
Wenn Berechtigungsrollen hinterlegt sind, muss der aufrufende Benutzer mindestens einer dieser Rollen zugeordnet sein, damit die Konfiguration verwendet werden kann. Sind keine Berechtigungsrollen angegeben, wird das Standardverhalten für die Anzeige verwendet.
Um Berechtigungsrollen zu definieren, geben Sie innerhalb der entsprechenden Konfiguration die IDs der zugriffsberechtigten Rollen im Parameter roleIds[]
an. Im folgenden Beispiel können nur Benutzergruppen mit den Rollen Ticket Reader (ID 4) und Ticket Agent (ID 5) die Informationen sehen
{ ... "roleIDs": [4,5], ... }
Berechtigungsrollen können in den folgenden Konfigurationen gespeichert werden:
In Kontextkonfigurationen und bei der Integration von Widgets
Zum Beispiel: content, lanes, sidebar usw.
Abb.: Verwendungsmöglichkeiten in den Ticketdetails
Abb.: Nur Benutzer mit den Rollen "Ticket Reader" und "Ticket Agent" können das Widget Kommunikationshistorie in den Ticketdetails sehen.
Hinweis
Widgets, die in einen Kontext integriert sind, haben den Parameter
permissions
. Mit diesem können Sie festlegen, welche Berechtigungen ein Benutzer haben muss, um das Widget sehen zu können.Der Parameter
roleIds
setzt diese Berechtigungen nicht außer Kraft, sondern ergänzt/spezifiziert sie.Das heißt, wenn ein Benutzer die in den
permissions
angegebene Rolle hat, kann er das Widget sehen. Wenn zusätzliche Berechtigungen (roleIds
) definiert sind, die dies verbieten, sieht der Benutzer das Widget nicht. Im Zweifelsfall müssen beide übereinstimmen.In Objekt-Info-Widgets
Abb.: Nur Benutzer mit der Rolle "Ticket Agent" sehen die Zeile Verantwortlichkeiten in den Ticketdetails.
Abb.: Nur Benutzer mit der Rolle "Ticket Agent" können bestimmte Werte sehen.
In Tabellen-Widgets
Abb.: Nur Benutzer mit den Rollen "Ticket Reader" und "Ticket Agent" können die Tabellenspalte sehen.