Skriptbasierte Autocomplete-Listen

Einleitung

Skriptbasierte Autocomplete-Listen können für Drop-down-Menüs mit dynamisch erzeugtem Inhalt verwendet werden. Die folgenden Beispiele vermitteln Ihnen einen ersten Eindruck davon.

Abbildung 378: Skriptbasierte Autocomplete-Liste, die statische Werte und das Ergebnis einer Suche nach Bearbeitern enthält

Abbildung 379: Skriptbasierte Autocomplete-Liste, die statische Werte und das Ergebnis einer Suche nach Kunden enthält

Abbildung 380: Skriptbasierte Autocomplete-Liste, die statische Werte und das Ergebnis einer Suche nach Ressourcen enthält

Diese Art von Liste kann sehr hilfreich sein, um dem Bearbeiter statt einer unübersichtlichen langen Liste ein Teilmenge der Liste anzuzeigen. In den obigen Beispielen sind skriptbasierte Autocomplete-Listen für folgende Anwendungsfälle implementiert: 

  1. In einem Ticket soll ein Bearbeiter außerhalb des Standardfeldes Bearbeiter (im oberen Bereich des Tickets) gesetzt werden, z. B. um eine Informations-E-Mail an diesen Bearbeiter zu senden. Ein anderer Anwendungsfall für eine Bearbeiterliste wäre ein ACF, in dem der nächste Bearbeiter in einer Prozesskette ausgewählt werden kann.
  2. Auf einer Kundenseite soll der verantwortliche Bearbeiter gesetzt werden.
  3. Auf einer Kundenseite sollen die Ressourcen/Assets, die am Standort des Kunden in Betrieb sind, erfasst werden. Eine ähnliche Liste kann in einem Vorfallticket hilfreich sein, in dem die Ressource bzw. das Asset, das das Problem hervorgerufen hat, verknüpft wird.

Die folgenden Objekttypen können als Einträge für skriptbasierte Autocomplete-Listen verwendet werden:

Die Einträge für Bearbeiter, Kunden und Ressourcen können auf Suchergebnissen basieren. Auf diese Weise können Sie CM anpassen, um die Einträge in den Drop-down-Menüs dynamisch zu erzeugen.

Die folgenden Templates werden für die Darstellung der Einträge in den Drop-down-Menüs verwendet:

Konfigurieren einer skriptbasierten Autocomplete-Liste mit dem Admin Tool

Konfiguration der Datenfelder

Die Implementierung einer skriptbasierten Autocomplete-Liste in einem String-Feld basiert auf einem Admin-Tool-Skript, Typ Text-Autovervollständigung. Das Skript muss mit dem entsprechenden Datenfeld, das zum Anzeigen der Liste im Web Client verwendet wird, verknüpft sein.

Das Datenfeld (String-Feld) kann Folgendes sein:

Das Datenfeld kann auf zwei Wegen konfiguriert werden:

Variante A:

Bei dieser Variante wird die Verknüpfung zwischen dem Datenfeld und dem Autocomplete-Skript implizit über die Verwendung eines Skriptnamens mit einer bestimmten Syntax hergestellt.

Abbildung 381: Admin-Tool-Konfiguration für ein Benutzerdefiniertes Feld, das eine skriptbasierte Autocomplete-Liste verwenden soll

Variante B:

Bei dieser Variante wird die Verknüpfung zwischen dem Datenfeld und der Autocomplete-Liste über die Verwendung eines bestimmten Skriptnamens hergestellt. Verwenden Sie diese Variante, wenn Sie ein Skript für mehrere Felder verwenden möchten.

Das Skript Text-Autovervollständigung

Ein Skript des Typs Text-Autovervollständigung muss die Methode onSearchInput implementieren. Wenn Sie ein neues Skript des Typs Text-Autovervollständigung erstellen, wird die Methode automatisch eingefügt und Sie müssen nur die "Intelligenz" des Skripts hinzufügen.

/**

* This method is called by web client when the user clicks or types into the auto-complete field

* @param pSearchStr the search String types or NULL if user clicked into field without typing

* @param pKey fieldKey

* @param pContext (Ticket/Unit/Resource) holder from editing form context.

*/

ScriptAutocompleteResult onSearchInput(String pSearchStr, FieldKey pKey, Context pContext) {

return ScriptAutoCompleteResult.noResults('No Results')

}

/**

* For custom-fields in ListFields row index is provided as well

*/

ScriptAutocompleteResult onSearchInput(String pSearchStr, FieldKey pKey, int pRowIndex, Context pContext) {

return ScriptAutoCompleteResult.noResults('No Results')

}

Code-Beispiel 60: Vorlage für Admin-Tool-Skript des Typs Text-Autovervollständigung

Sie müssen das Objekt ScriptAutoCompleteResult (in den folgenden Beispielen Resultset genannt) füllen, das zurückgegeben wird. Dieses Objekt bildet das Drop-down-Menü. Sie können Strings, Collections und Maps zum Resultset hinzufügen. Eine detaillierte Übersicht über die Methoden der Java-Klasse ScriptAutoCompleteResult finden Sie in der ConSol CM API Doc.

Zum Resultset können vier Arten von Objekten hinzugefügt werden:

Die Objekte, die zum Resultset hinzugefügt werden, können von internen CM-Daten (z.B. von einer Bearbeitersuche) abgeleitet werden oder aus einer Suche in externen Quellen stammen. Auf diese Weise können Sie zum Beispiel eine Suchliste mit Namen aus einer externen Datenbank anbieten.

Um mit der Eingabe des Bearbeiters arbeiten zu können, bevor diese gespeichert wurde (z.B. wenn der Bearbeiter mit der Eingabe eines Kundennamen in ein String-Feld beginnt), müssen Sie das Objekt pContext verwenden. Je nachdem, welche Seite geöffnet ist (d.h. je nach Kontext), enthält pContext unterschiedliche Daten und kann unterschiedliche Objekte zurückgeben:

Das folgende Beispielskript erstellt ein Resultset (d.h. ein Drop-down-Menü) mit drei statischen Strings, die verwendet werden, wenn keine Ergebnisse gefunden werden oder der Bearbeiter nicht genug Zeichen eingegeben hat, um die Suche zu starten. Zusätzlich enthält das Resultset die Ergebnisse der Bearbeitersuche. Im Prinzip kann das Skript für Listen mit Kunden (Units) und Bearbeitern verwendet werden. An dieser Stelle erklären wir die Bearbeiterlisten. Das entsprechende Resultset/Liste wird in der ersten Abbildung in diesem Abschnitt angezeigt.

import com.consol.cmas.common.model.autocomplete.script.*

/**

* This method is called by web client when the user clicks or types into the autocomplete field

* @param pSearchStr the search String types or NULL if user clicked into field without typing

* @param pKey fieldKey

* @param pContext (Ticket/Unit/Resource) holder. More about this later in the specification (Context section)

*/

log.info '##### Starting Autocomplete script ... #####'

ScriptAutocompleteResult onSearchInput(String pSearchStr, FieldKey pKey, Context pContext) {

ScriptAutocompleteResult resultset = new ScriptAutocompleteResult();

// Add fixed string result items

resultset.add("none","No entries")

resultset.add("unknown","Entries unknown")

resultset.add("confidential","Entries confidential")

def autotype

if (pContext.ticket) {

autotype = "TICKET"

}else if (pContext.unit) {

autotype = "UNIT"

}else if (pContext.resource){

autotype = "RESOURCE"

}

log.info 'autotype is now ' + autotype

// Add matching customer when entering more than 2 characters

if (pSearchStr.length() < 3) {

resultset.add("","NOTE: Please type at least 3 characters!");

 

// ########### UNITS #############

} else if (autotype.equals("UNIT")){

log.info ' Building UNIT criteria ...'

UnitCriteria criteria = new UnitCriteria();

criteria.setPattern("*"+pSearchStr+"*")

def units = unitService.getByCriteria(criteria)

if(units.size()<1){

resultset.add("","No results")

} else {

resultset.add(units);

}

// ########## TICKETS -> ENGINEERS ###########

} else if (autotype.equals("TICKET")) {

log.info ' Building ENGINEER criteria ...'

EngineerCriteria criteria = new EngineerCriteria();

criteria.setPattern("*"+pSearchStr+"*")

def engs = engineerService.getByCriteria(criteria)

if(engs.size()<1){

resultset.add("","No results")

} else {

resultset.add(engs);

}

}

// Add current engineer

// resultset.add(engineerService.getCurrent())

return resultset;

}

/**

* For custom-fields in ListFields row index is provided as well

*/

ScriptAutocompleteResult onSearchInput(String pSearchStr, FieldKey pKey, int pRowIndex, Context pContext) {

return ScriptAutocompleteResult.noResults('No Results')

}

Code-Beispiel 61: Beispiel für Admin-Tool-Skript des Typs Text-Autovervollständigen. Füllt das Resultset mit statischen Strings und dem Ergebnis einer Bearbeitersuche.

Wenn der Bearbeiter einen bestimmten Wert ausgewählt hat, wird ein String ins String-Feld eingefügt.

Beachten Sie, dass der String, der als Wert in das String-Feld eingetragen wird, komplett unabhängig vom Objekttyp ist! Sie als Skript-Entwickler müssen sich um die gesamte "Intelligenz" kümmern, bezüglich dem, was mit dem Eingabe-String geschehen soll!

Der String steht für folgende Daten und kann wie vorgeschlagen verarbeitet werden. Natürlich können auch andere Methoden implementiert werden.

Sie können steuern, wie viele Zeichen der Bearbeiter eingeben muss, bevor die Suche gestartet wird. Dazu wird folgender IF-Ausdruck verwendet, den Sie auch im obigen Beispiel sehen können.

if (pSearchStr.length() < 3) { }

In diesem Beispiel muss der Bearbeiter mindestens drei Zeichen in das String-Feld eingeben, bevor die Suche gestartet wird.