Workflow
Im Installationsverzeichnis unter Resources befindet sich der Visio Workflow ptpRequest_V1.vsdx.
Standard Workflow Steps
0Start10Manuelle Anlage11Nachbearbeitung (Ersteller)15Worflowstart
30Prüfung31Nachbearbeitung (Prüfer)
40Freigabe98Abgelehnt100Abgeschlossen
Zusätzliche Workflow Steps
Neben den Standard Workflow-Schritte können weitere Steps in der Visio angelegt werden. Um diese in der Benutzeroberfläche anzuzeigen, muss die Eigenschaft customWorkflowSteps im Portalskript ou.cust.ptpREQ.callbacks.settings verwendet werden.

Voraussetzung
Zum Aktivieren muss das Skript ou.tmpl.ptpREQ.callbacks.settings in ou.cust.ptpREQ.callbacks.settings umbenannt werden.
Erste Schritte
In der getSettings Funktion verwenden wir nun das customWorkflowSteps-Array und erweitern dies um folgende Einträge:
// ...
customWorkflowSteps: [
{
globalState: 50,
icon: "circled-plus",
label: "Erstellen",
tooltip: "Bestellung erstellen",
},
{
globalState: 55,
icon: "airplane",
label: "Versenden",
tooltip: "Bestellung versenden",
},
{
globalState: 80,
icon: "clock",
label: "Versendet",
tooltip: "Bestellung versendet",
},
],
// ...
Nach dem Speichern, sollte bei einer Neuanlage einer Bestellanforderung, die oben erstellten Workflow-Schritte angezeigt werden.

Im weiteren Verlauf wird der Status automatisch anhand des globalState in der Mappe angepasst. Der globalState der Mappe (80) stimmt mit dem letzten customWorkflowSteps-Eintrag (80) überein und wird entsprechend als aktueller Schritt dargestellt. Die vorherigen Schritte werden als "Erfolgreich Abgeschlossen" markiert.

Die Workflow-Schritte werden automatisch anhand der Eigenschaft globalState sortiert und können somit zwischen den Standard-Schritten platziert werden.
Optionen
Es müssen folgende Pflichtfelder befüllt sein:
globalState: Zur Sortierung und Überprüfung, ob es sich um den aktuellen Schritt handelt.icon: Aktuell werden nurEntypoIcons unterst ütztlabel: Beschriftungtooltip: Tooltip - Na was halt ein Tooltip so macht 😉
Weitere Felder sind:
visible: Siehe Sichtbarkeitstate: Siehe Status dynamisch bestimmen
Sichtbarkeit einstellen
Möchte man bestimmte Schritte dynamisch ein- bzw. ausblenden, so kann die Option visible verwendet werden.
// ...
customWorkflowSteps: [
{
globalState: 50,
icon: "circled-plus",
label: "Erstellen",
tooltip: "Bestellung erstellen",
visible: function (docFile) {
// Optional Step ausblenden, z.B. wenn für aktuelle kein Versand-Step vorgesehen ist.
return false;
},
},
],
// ...
Hier könnte man ein Screenshot anzeigen, der aber wiederum würde ja den Workflow-Schritt nicht anzeigen... Somit hat man sich den hier gespart.
Status dynamisch bestimmen
Die state Eigenschaft ermöglicht eine dynamische Anpassung des Status eines Workflow-Schrittes.

Erwartete Rückgabewerte:
"ongoing": Step wurde noch nicht erreicht, z.B. wenn MappenglobalStatekleiner ist als aktueller Step"current": Step ist gerade aktiv, z.B. wenn MappenglobalStategleich aktueller Step"success": Step wird als erfolgreich markiert"failed": Step wird als fehlgeschlagen markiert"skipped": Step wurde übersprungen (Hintergrundfarbe wird nicht befüllt, siehe Beispiel unten)
// ...
customWorkflowSteps: [
{
globalState: 50,
icon: "download",
label: "Einkaufen!",
tooltip: "Dann geh doch zu Netto",
state: function (docFile) {
// Optionale Rückgabewerte: "ongoing" | "current" | "success" | "failed" | "skipped"
// Wird kein Wert zurückgegeben, ist der Step noch nicht abgeschlossen und somit offen.
const globalState = +docFile.globalState;
if (globalState === 50) {
return "current";
} else if (globalState < 50) {
return "ongoing";
}
// Über das docFile können Felder abgefragt werden und nach deren Status reagiert werden.
const successState = docFile.getFieldValue("Eingekauft");
return successState ? "success": "skipped";
},
},
],
// ...
Erweitertes Beispiel
Durch die Verwendung der Eigenschaften visible und state können Workflow-Schritte dynamisch angezeigt werden, um alternative Schritte darzustellen. Ein Beispiel hierfür (Der Mann hat überlebt 😬):

Vollständiges Beispiel:
// ...
customWorkflowSteps: [
{
globalState: 50,
icon: "download",
label: "Einkaufen!",
tooltip: "Dann geh doch zu Netto",
state: function (docFile) {
const globalState = +docFile.globalState;
if (globalState === 50) {
return "current";
} else if (globalState < 50) {
return "ongoing";
}
const successState = docFile.getFieldValue("Eingekauft");
return successState ? "success": "skipped";
},
},
{
globalState: 52,
icon: "upload",
label: "Auspacken",
tooltip: "Und in den Kühlschrank damit",
state: function (docFile) {
const globalState = +docFile.globalState;
if (globalState === 50) {
return "current";
} else if (globalState < 50) {
return "ongoing";
}
const successState = docFile.getFieldValue("Eingekauft");
return successState ? "success": "skipped";
},
},
{
globalState: 53,
icon: "tools",
label: "Kochen",
tooltip: "Was der Kühlschrank her gibt",
state: function (docFile) {
const globalState = +docFile.globalState;
if (globalState === 50) {
return "current";
} else if (globalState < 50) {
return "ongoing";
}
const successState = docFile.getFieldValue("Eingekauft");
return successState ? "success": "skipped";
},
},
{
globalState: 55,
icon: "thumbs-up",
label: "Lieferando",
tooltip: "Bitte immer bei Lieblingspizzeria bestellen, der weiß dann schon Bescheid",
visible: function (docFile) {
const fallback = docFile.getFieldValue("LieferandoBestellNr");
return fallback && fallback.length > 0;
},
state: function (docFile) {
const globalState = +docFile.globalState;
if (globalState === 50) {
return "current";
} else if (globalState < 50) {
return "ongoing";
}
const fallback = docFile.getFieldValue("LieferandoBestellNr");
return fallback ? "success": "skipped";
},
},
{
globalState: 58,
icon: "light-up",
label: "Essen",
tooltip: "Hmmm lecker",
state: "success",
},
],
// ...