Polish | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Czym są akcje zdarzenioweAkcje reagujące na zdarzenia (inaczej akcje zdarzeniowe) to rodzaj komponentów integracyjnych które uruchamiane są w odpowiedzi na wystąpienie dowolnego zdarzenia na formularzu zadania. ZdarzenieIstnieją dwa źródła zdarzeń:
Każde zdarzenie posiada nazwę oraz dowolną liczbę właściwości (properties) o zdefiniowanym typie. Twórca akcji może ze swojej akcji wywołać dowolne zdarzenie, na które można będzie uruchomić dowolną inną akcje. Takie rozwiązanie daje więcej elastyczności podczas tworzenia procesów w stosunku do tradycyjnych akcji formularza. Twórca akcji ma całkowitą kontrolę nad momentem i kolejnością wykonywania akcji. Właściwości zdarzenia mogą być mapowane na parametry akcji w sposób analogiczny do "zmiennych kontekstowych" klasycznych akcji formularza. Akcje zdarzeniowe a akcje formularzaAkcje formularza same definiują zdarzenia w odpowiedzi na które zostaną uruchomione. Taki sposób uruchamiania akcji sprawia że nie są one tak elastyczne (np. wykonanie akcji na innym zdarzeniu wymaga zmiany implementacji). W przypadku akcji zdarzeniowych, to twórca procesu decyduje kiedy dana akcja ma się wywołać i z jakimi parametrami. Kolejność wykonywania akcji zdarzeniowychDiagram przedstawia kolejność wykonywania akcji w reakcji na zdarzenie change. Wszystkie 3 akcje (Action1, Action2, Action3) zdefiniowane są następujący sposób (w podanej kolejności):
Akcje są wywoływane w kolejności zdefiniowanej na mapie procesu w głąb czyli najpierw wywołane będą akcje zależne od zdarzeń już wywołanych akcji, dopiero po zakończeniu tego łańcucha wywoływana jest następna akcja zdefiniowana dla zdarzenia źródłowego:
Akcje asynchroniczneSzczególnym przypadkiem są akcje asynchroniczne czyli takie które przed zakończeniem wywołania wykonują dowolną asynchroniczną akcje (np. żądanie http). W takim przypadku wywoływane są wszystkie zdefiniowane akcje nawet jeżeli niektóre z nich przeszły w tryb asynchroniczny. Dopiero po zakończeniu wywłania asynchronicznego łąńcuch akcji jest wznawiany.
Zdarzenia systemoweSpis zdarzeń formularza zadania dla których mogą zostać podpięte akcje zdarzeniowe. Globalne
Zmienne procesuZmienna formularza, nie będąca częścią tabelki dynamicznej
Tabelki
PrzyciskiPrzyciski dostępne na formularzu
ImplementacjaW sposób analogiczny do klasycznych akcji formularza, akcje zdarzeniowe dostarczane są przez wtyczki.
Definicja akcjiDefinicja
Rejestracja implementacji akcji na formularzuRejestracja akcji odbywa się poprzez wywołanie PW.EventActions.register(name, function) gdzie: name: nazwa rejestrowanej akcji - musi być zgodna z nazwą akcji z definicji komponentu function(context, ...params): funkcja która zostanie wywołana w momencie wystąpienia zdarzenia, pod które została podpięta dana akcja, przyjmuje ona następujące parametry: context: pierwszy parametr to kontekst formularza, służący do efektywnego ustawiania wartości wszystich zmiennych formularza <params>: kolejne parametry to parametry wywołania akcji zgodnie z deklaracją, kolejność parametrów jest zgodna z kolejnością w deklaracji komponentu
Kontekst formularzaPierwszym parametrem każdej akcji jest context - kontekst formularza. Reprezentuje on aktualny stan formularza (wartości wszystkich zmiennych). Stan ten jest przekazywany do kolejnych akcji gdzie może być przez nie dowolnie modyfikowany. W momencie obsłużenia wszystkich akcji (w ramach jednego zdarzenia formularza), finalny stan porównywany jest z początkowym stanem formularza a wszystkie zmiany są na niego aplikowane. Takie rozwiązanie powoduje że zmiana wartości zmiennych formularza w momencie przetwarzania akcji jest bardzo szyba, ponieważ zmiany te nie są propagowane na formularz w momencie dokonania, a dopiero w momencie gdy wszystkie akcje z tzw. łańcucha akcji zostaną obsłużone. Zmiana wartości zmiennychAPI reference: Akcje reagujące na zdarzeniaContextAPI Zmiana zmiennych nagłówkowych:
Zmiana rekordów w tabeli:
HooksHook'i pozwalają na uruchomienie funkcji w momencie zajścia danego zdarzenia związanego z kontekstem formularza. Zarejestrowane funkcje wykonywane są w kolejności rejestracji. afterFlushHook afterFlush uruchamiany jest po zaaplikowaniu wszystkich zmian z kontekstu na formularz zadania. Przydatne np. w przypadku gdy używamy API które nie jest świadome kontekstu i wymaga aby wartości znalazły się już na formularzu. Przykładem takiego scenariusza jest zapis formularza - formularz zapisany zostanie jak wszystkie akcje związane z danym zdarzeniem zostaną wykonane.
Zmienne kontekstowe
Deklaracja zmiennych kontekstowych w komponencie:
W celu przekazania wartości zmiennych kontekstowych po stronie akcji należy podczas wywołania funkcji (zdefiniowanej jako parametr) dostarczyć wszystkie zdefiniowane zmienne kontekstowe:
Akcje asynchroniczne Akcje asynchroniczne to akcje w których zachodzi potrzeba wywołania asynchronicznego kodu (np. żądania http lub wyświetlenie modal'a z callbackiem). Aby taka akcja była w stanie zmieniać stan formularza i wyzwalać kolejne akcje w reakcji na zdarzenia wyemitowany poprzez this.fireEvent() niezbędne jest zwrócenie kontroli do framework'u akcji. Służy do tego funkcja this.async(function) która przyjmuje funkcje callback'u jaki będzie wywołany po powrocie z asynchronicznego wywołania oraz zwraca tą samą funkcję wzbogaconą o logikę wznowienia wykonywania akcji.
Przykład poprawnej i błędnej implementacji akcji asynchronicznej:
Context API
TroubleshootingLogowanie wywołania akcjiJeżeli potrzebujemy więcej informacji o wykonywanych akcjach, ich parametrach lub właściwościach zdarzeń możemy włączyć dokładne logowanie na poziomie Trace. W tym celu należy:
Znane błędy
Błąd oznacza próbę interakcji z akcją, jej context'em lub parametrami po wykonaniu akcji bądź w przypadku akcji asynchronicznych, bez wcześniejszego użycia funkcji this.async(). Patrz Akcje asynchroniczne
|
English | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
What are event actionsEvent-responsive actions (a.k.a. event actions) are a type of integration components that are triggered in response to the occurrence of any event on a task form. EventThere are two sources of events:
Each event has a name and any number of properties of a defined type. The creator of an action can call any event from its action, on which any other action can be triggered. This solution gives more flexibility when creating processes compared to traditional form actions. The action creator has complete control over the timing and order of action execution. The properties of an event can be mapped to action parameters in a manner analogous to the "context variables" of classic form actions. Event actions vs. form actionsForm actions themselves define events in response to which they will be triggered. This way of triggering actions makes them less flexible (e.g. executing an action on another event requires a change in the implementation). In the case of event actions, it is the process creator who decides when the action should be triggered and with what parameters. Order of execution of event actionsThe diagram shows the order in which actions are executed in response to a change event. All 3 actions (Action1, Action2, Action3) are defined as follows (in the order shown):
Actions are called in the order defined in the process map in depth, i.e. actions dependent on events of already called actions will be called first. Once this hierarchy is completed, the next action defined for the source event is called:
Asynchronous actionsAsynchronous actions are a special case, i.e. actions that perform any asynchronous action (e.g. http request) before the call is completed. In such a case, all defined actions are called even if some of them went into asynchronous mode. Only after the asynchronous call ends, the action chain is resumed.
System eventsAn overview of task form events for which event actions can be attached. Global
Process variablesA form variable that is not part of a dynamic table
Tabels
ButtonsButtons available on the form
ImplementationIn a similar way to classic form actions, event actions are provided by plugins.
Action definitionDefinition
Registration of action implementation on the formRegistration of the action is done by calling
PW.EventActions.register(name, function) where: name: name of the registered action - it must match the name of the action from the component definition function(context, ...params): function which will be called when an event occurs, to which the action is attached, it takes the following parameters: context: the first parameter is the context of the form, used to effectively set the values of all form variables <params>: subsequent parameters are the parameters for calling the action as declared, the order of the parameters follows the order in the component declaration
Form contextThe first parameter of each action is the context - the context of the form. It represents the current state of the form (values of all variables). This state is transferred to subsequent actions where it can be freely modified by them. When all actions are handled (within one form event), the final state is compared with the initial state of the form and all changes are applied to it. Such a solution makes it very fast to change the value of form variables when the action is processed, because these changes are not propagated to the form at the moment of execution, but only when all actions from the so-called action chain are handled. Changing values of variablesAPI reference: Akcje reagujące na zdarzeniaContextAPI Changing header variables:
Changing records in a table:
Asynchronous actionsAsynchronous actions are actions in which there is a need to call asynchronous code (e.g. http requests or displaying a modal with a callback). In order for such an action to be able to change the state of the form and trigger further actions in response to events emitted through this.fireEvent() it is necessary to return control to the action framework. This is done by the function this.async(function), which takes the function of the callback that will be called after returning from the asynchronous callback and returns the same function enriched with the logic for resuming the execution of the action.
An example of correct and incorrect implementation of an asynchronous action:
Context API
TroubleshootingAction call loggingIf we need more information about the actions performed, their parameters or event properties, we can enable accurate logging at the Trace level. To do this, we need to:
Known issues
An error indicates an attempt to interact with an action, its context or parameters after the action has been executed or, in the case of asynchronous actions, without first using the this async() function. See Asynchronous actions
|
Code Block | ||
---|---|---|
| ||
context.variableSet("t").updateRecordAt(1, {"var1": "value1", "var2": 2}); |