Release Notes


  • Filter set option was created in Dictionary control. Filters property appeared in the General tab of this control. You can specify a dynamic filter in [{"column":"column", "value": "value", "term":"="}] format. For example, we've got two Dictionary controls in the form, which are bound to TypeId and SubtypeId attributes. We want the list of possible SubtypeId to be limited when we choose TypeId. In this case it will be necessary to set the following filter for Dictionary in which SubtypeId was chosen: [{"column":"TypeId", "value": "{TypeId}", "term":"="}].
  • Resource editor was added into the admin panel. Now you can edit css and js files right from the admin panel.
  • TreePicker was added to be able to pick a value from the hierarchical dictionary.
  • Now you can specify triggers for collections in Mapping data model section. You can also select the AfterSelect trigger, which can be very useful if you are changing data in paging grids.
  • Validate trigger behavior was modified. Now this trigger will be executed every time for the whole form data set (main form + collections). It is very convenient to write server validation code in the trigger of this type. Validation result will be displayed in corresponding client controls. For example:
    public TriggerResult Validate(EntityModel model, List<dynamic> entities, TriggerExecutionContext context, dynamic options)
    var validationResult = new TriggerValidationResult();
    foreach (var entity in entities)
        //main entity validation
        if (entity.GetState() == DynamicEntityState.Insert || entity.GetState() == DynamicEntityState.Update)
            if (entity.a <= entity.b)
                validationResult.AddValidationError(entity, "a", "Must be greater or equal B");
        //collection validation
        if (entity.collection != null)
            foreach (var collectionItem in entity.collection)
                if (collectionItem.GetState() != DynamicEntityState.Insert && collectionItem.GetState() != DynamicEntityState.Update)
                if (collectionItem.a <= collectionItem.b)
                    validationResult.AddValidationError(collectionItem, "a", "Must be greater or equal B");
    if (validationResult.IsEmpty) //the form is valid
        return TriggerResult.Success();
    return TriggerResult.ValidationFailed(validationResult,"Server validation failed!"); //the form is not valid
  • 4 new trigger types were added: BeforeTransaction, BeforeBatch, AfterBatch, AfterTransaction. This trigger types will be executed every time for the whole form data set (main form + collections). They can be useful when organizing complex business logic.
  • In the trigger you can read entity state and see which operations have been or will be performed with it. For this use function entity.GetState(). Possible return values: Insert, Update, Delete, Undefined.
  • Method of result return from trigger was changed. There are 4 options available.
    • return TriggerResult.Success() - trigger action performed successfully, the trigger chain will be continued.
    • return TriggerResult.Terminate("Error message") - trigger chain will be terminated with throw of exception.
    • return TriggerResult.ValidationFailed(validationResult,"Server validation failed!") - trigger chain will be terminated, server validation result will be returned to the client.
    • return TriggerResult.Result(resultObj,terminate) - using this method you can transmit delta for global state of the client application to the client. Depending on the terminate setting, trigger chain execution can be either stopped, or continued. If several triggers in the chain returned result, these objects will be combined in one and applied to global state.
  • You can use TriggerExecutionContext to transmit settings between triggers during execution. This class instance is transmitted to every trigger. In it you can set value for any property context.SetParameter(name,value) and get value of any property context.GetParameter<T>(name).
  • Scripts for creating Docker containers were created for StarterPack and VacationRequest examples.
  • Validation added to Data Model and Mapping data model. Messages of errors in data mapping and Data Model are now displayed in the admin panel.
  • Messages of errors in compilation of CodeActions are now displayed in the admin panel.
  • Auto mapping algorithm in form data mapping was improved.
  • Two new functions added to DWKitApp.API - checkRole and checkPermission. You can use them to check current user's roles and permissions. It can be used to hide menu options.
  • Modifications of url constants are available in app.jsx. You can now change url access to backend and url constants for form and flow query.
  • was removed from global state of the client application
  • Visible Conditions for control containers error was fixed
  • Fixed: problem of IE 11+ compatibility in the admin panel
  • Pace library moved out of the optimajet-app

The following additional actions must be taken to upgrade to DWKit 2.5

  • Trigger functionality expansion led to DataController (DataController.cs) change. You can copy it from the StarterPack and VacationRequest projects.
  • Trigger functionality expansion led to their interface modification. Depending on whether you trigger code is defined in CodeActions or in the project code, you will have to do the following:
    • If your triggers are defined in the project code, you need to align your action providers with the modified interface IServerActionsProvider. ExecuteTrigger and ExecuteTriggerAsync method signatures were changed.
    • If your triggers are defined in the project code or in CodeActions, you need to change values which these triggers return in order for your triggers to return TriggerResult instance.
      • You need to replace return (null,false); or return (string.Empty,false); with return TriggerResult.Success()
      • replace return ("Error message",true); with return TriggerResult.Terminate("Error message")
  • If your wwwroot folder is in a custom location, you will have to set its path in resourcefolder setting, otherwise Resource editor will not be able to work correctly.


  • Building with .NET Core 2.1 instead of .NET Core 2.0
  • Full support of the primary key functionality which has been generated on the database side (for example, an identifier). Such attributes should be marked as Calculate = true. Be careful when you're working with the workflow functionality with a non-GUID primary key. At this moment, Business Flows work with a GUID primary key only.
  • Full support of column calculation. Such attributes should be marked as Calculate = true. If such attributes have been shown on a form then they will be refreshed after saving.
  • Added a custom client action - confirm. If you add this action to the action queue, a confirmation window will be shown with two buttons: OK and Cancel. If a user clicks on the OK button, the execution will be continued. If a user clicks on the Cancel button, the execution will be stopped.
  • Admin panel localization
  • Ability to use a custom URL for processing for loading and saving form data
  • Custom formatters were added to the GridView
  • FormBuilder's UI was improved
  • A pure Semantic-UI style as a default style of DWKIt's controls


  • A SignalR hub was added as to enable changing the Global Client State from the server. It is used to update the Inbox and Outbox counters in the Vacation Request sample.
  • Oracle provider was added.
  • The ability to create a column with the type "custom" was added to the Collection Editor control. You can drag any other control, such as Dropdown or Dictionary, to this column.
  • Server pagination for Dictionary control.
  • Server pagination for Users in Admin panel.
  • Workflow Engine was updated to version 3.3.
  • The ability to send APIKey in the request header was added to Integration API, see the updated swagger specification.

The following additional actions must be taken to upgrade to DWKit 2.3

  • Since the data interface for Dictionary Control has been changed, you need to update the DataController (DataController.cs). ou can get it from the Starter Pack or Vacation Request samples.
  • You need to update packages in OptimaJet.DWKit.StarterApplication and OptimaJet.DWKit.Application projects.
  • You need to update wwwroot\scripts folder of OptimaJet.DWKit.StarterApplication project with new versions of DWKIT and WFE scripts.


  • Integration API.
  • Client-side javascript API - DWKitApp.API.


  • Workflow Engine 3.
  • New controls: DatePicker, Dropzone, Breadcrumbs.
  • Form templates.
  • Using {ColumnsName} format for replacing string constaints in controls.
  • Set href-attribute for Menu and Breadcrumb controls.
  • JavaScript Client API for DWKitForm.
  • Customization Date Format.
  • External filters for GridView control.


  • The first release of DWKIT 2.0.