Scripting

 

Einführung

Das Scripting in Infinity ist ähnlich wie das Scripting in Enterprise. Die Skriptsprache ist Typescript. Die Scripts werden in Scripting-Projekten verwaltet, in denen beliebig viele Dateien angelegt werden können. Zusätzlich kann pro Projekt ein Resource Package verwendet werden, in dem z.B. Konfigurationen in Form von Key-Value-Paaren hinterlegt werden. Die Ressourcen können dann im Script abgefragt werden. Möchte man Code zwischen verschiedenen Projekten wiederverwenden, kann man eine Library anlegen und z.B. Funktionen exportieren. Alle Exporte aller im System erstellten Libraries stehen in den Projekten zur Verfügung und können importiert werden. Wenn das Projekt fertig ist oder getestet werden soll, kann es paketiert werden, dabei werden die Typescript Sourcen und alle Importe in ein Javascript Bundle überführt und als Package im System abgelegt. Dieses Package wird dann zur Laufzeit im Client aufgerufen und ausgeführt.

Um ein Projekt verwenden zu können, muss es einem Business Objekt Desktop zugeordnet werden. Immer wenn der Desktop angezeigt wird, wird auch das Package des Scripting-Projekts geladen und ausgeführt.

Das Scripting ist weiterhin eventbasiert, d.h. man kann nur in Reaktion auf Events am Client Code ausführen (z.B. OnStart zum Start der Anwendung). Um ein gültiges Script zu entwickeln muss am Entrypoint des Scriptprojekts ein default Export gemacht werden, der ein Objekt exportiert, das einen vordefinierten Aufbau hat: 

  OnExport: function () {      console.log("Hello World!");    },    Fields: {},  } as TccScripting.scriptResult; 

Über den Typ TccScripting.scriptResult kann der Aufbau kontrolliert werden. 

Auf der untersten Ebene werden die globalen Events definiert, deren Auslöser sind allgemein gültig in der gesamten Anwendung, die möglichen Eventnamen können in TccScripting.globalEventName eingesehen werden. 

Außerdem gibt es eine Property Fields, diese Property enthält ein Objekt, das die im Businessobjekt definierten Properties als Baum abbildet. Dabei werden die technischen Feldnamen als Keys für Properties verwendet. In diesen Properties können feldspezifische Events definiert werden, also Events, die von den Feldern selbst ausgelöst werden und nur dort ausgeführt werden sollen (OnEnter beim Fokussieren eines Feldes). Die möglichen Eventnamen können in TccScripting.fieldSpecificEventName eingesehen werden. Außerdem können diese Feldproperties weitere Properties haben, deren Namen die technischen Feldnamen ihrer direkten Kinder aus den Businessobjektproperties sind. Deren Inhalt ist dann wieder gleich aufgebaut mit feldspezifischen Events und ggfs. weiteren Kindproperties. Dadurch lassen sich die Felder als Baum abbilden. 

Eine Eventproperty muss immer eine Funktion sein, diese Funktion wird immer ausgeführt wenn das Event ausgelöst wird. Die Funktion hat keine Parameter und keine Rückgabe, Ausnahme sind die asynchronen Events. Die Events können entsprechend auch in anderen Dateien definiert werden, importiert werden und hier zugewiesen werden. 

Manche Eventtypen sind asynchron, d.h. als Rückgabe wird ein Observable<boolean> erwartet. Diese Events werden i.d.R. bevor etwas passiert ausgelöst und warten solange bis das hinterlegte Event abgeschlossen ist. Wenn das Ergebnis des Observable wahr ist, wird die Verarbeitung in der Anwendung fortgeführt, bei falsch wird der Auslöser des Events abgebrochen (z.B. OnUserexit wird ausgelöst bevor der Userexit ausgeführt wird und kann entsprechend noch abgebrochen werden). 

Bei den feldspezifischen Events kann das betroffene Feld über die Property CurrentField in ccApplication abgefragt werden. 

Um im Event mit der Anwendung und den Steuerungselementen darin zu interagieren gibt es wieder die bekannten Objekte ccFields, ccTable, ccApplication und ccScriptEngine. Diese werden automatisch aus einer internen Plugindatei importiert und können somit direkt verwendet werden, sollte man die Objekte auch in anderen Dateien benötigen, so kann man sie als Funktionsparameter übergeben oder wiederrum in der anderen Datei importieren (den richtigen Pfad beachten bei verschachtelten Projektdateien). Dazu kommen zwei neue Objekte ccRootField und ccFactory. 

Mit ccRootField kann man als Alternative zu ccFields und ccTable verstehen. Mit ccRootField hat man eine Instanz einer neuen Klasse TccField. Deren Properties und Funktionen bilden den Businessobjektproperty Baum ab, d.h. man kann durch die Kinder durchiterieren und bekommt zu jedem Feld ein eigenes TccField Objekt, mithilfe dessen man das Feld direkt steuern kann. 

BusinessObject Properties 

Die Businessobjects beschreiben eine bestimmte Dokumentenart. Entsprechend sind die Properties die Eigenschaften die auch auf dem Dokument zu finden sind. Diese Properties können in der Anwendung durch Eingabefelder repräsentiert werden, dazu müssen sie in einem Desktop dieses Businessobjektes zugeordnet werden. Durch die logische Verschachtelung von Properties durch die Complex Properties ergibt sich ein Baum, in dem einzelne Properties durch einen Pfad von aneinandergereihten Complex Property Namen identifiziert werden können.

Konfigurationsoptionen 

In den VSCode Einstellungen lassen sich unter Extensions -> CLARC Infinity Development folgende Einstellungen konfigurieren: 

ID

Beschreibung 

Standardwert 

clarc-infinity-development.Theme.Colorful 

Aktiviert den farbenfrohen Modus der Extension. Alle Icons der Tree-Views werden in blau und lila anstatt weiß angezeigt. 

Aktiviert 

clarc-infinity-development.Login.AskToStorePassword 

Der User wird nach erfolgreicher Anmeldung gefragt, ob das Password für diesen Account gespeichert werden soll. 

Aktiviert 

clarc-infinity-development.Config.ApiVersion 

Definiert die API Version. 

"v1" 

Die Konfiguration der Server URL sollte nicht manuell in den VSCode Einstellungen geändert werden, sondern nur über die Setting Tree-View. Es kann sonst zu Fehlern in der Extension kommen.