Das Scripting im Infinity ist ähnlich wie das Scripting im Enterprise. Die Scriptsprache ist Typescript. Die Scripte werden in Scripting Projekten verwaltet, darin können beliebig viele Dateien erstellt werden. Außerdem kann pro Projekt ein Ressourcen Paket verwendet werden, in dem z.B. Konfigurationen in Form von Key Value Paaren hinterlegt sind. Im Script können die Ressourcen dann abgefragt werden. Möchte man Code zwischen verschiedenen Projekten wiederverwenden kann man eine Library erstellen und z.B. Funktionen exportieren. Alle Exporte aller im System erstellten Libraries sind in den Projekten verfügbar und können importiert werden. Wenn das Projekt fertig ist bzw. getestet werden soll kann es paketiert werden, dabei werden die Typescript Sourcen und alle Importe in ein Javascript Bundle überführt und am System als Package abgelegt. Dieses Package wird dann zur Laufzeit im Client abgerufen und ausgeführt.
Um ein Projekt zu verwenden muss es einem Businessobject Desktop zugeordnet werden. Immer wenn der Desktop angezeigt wird, wird auch das Paket 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.