Is it possible to put the "Perform later" button on pre-configured pages, so that it appears and works like on edit pages?

Like 0

Like

2 comments

Hello Carlos,



There is no such out of the box functionality.



However, you always are able to add some button on edit page and add some logic behind it. To explore how the desired button works on pre-configured pages I recommend to use devtools. Also, enabling the debug mode on the site can be useful since it disables bundles. 



Best regards,

Alex

Ok, thank you

Show all comments

bpm'online community,

I added a new source code that needs System.Net.Http. When I try to publish it, I get these errors:

The type or namespace name 'Http' does not exist in the namespace 'System.Net' (are you missing an assembly reference?)

The type or namespace name 'HttpClient' could not be found (are you missing a using directive or an assembly reference?)

In the Autogenerated code I see the reference to System.Net.Http and if I view it on the Object Browser I see the HttpClient class.

I'm on Version 7.12.0.2656 of bpm'online studio.

Any ideas on what is causing the compile error?

Thanks,

Jose

 

using System;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

using System.IO;

using System.Net.Http;

namespace Terrasoft.Configuration

{

    public static class UsrDownloadImageHelper {

        

        private static readonly UsrLimitedPool httpClientPool =

          new UsrLimitedPool(() => new HttpClient(), client => client.Dispose());

          

        public static async Task DownloadImageFromUcm(string imageId, string pathToSave, CancellationToken cancellationToken)

        {

....

}

Like 1

Like

1 comments

How you resolved this issue? I am facing with the same type of error "The type or namespace name 'Json' does not exist in the namespace 'System.Text' (are you missing an assembly reference?)"

Show all comments

Is it possible to translate this string, for example by setting it up manually from JavaScript?

Like 0

Like

3 comments

Hello Carlos,

Generally speaking, usually to translate some strings "Translation" section is used. You can read more about it in this article: https://academy.bpmonline.com/documents/base/7-13/how-identify-translat…



Other way to achieve it is to find the resource string in table  SysLocalizableValue and change it`s value directly in the database.



Also you can create a new replacing client module where change the element`s binding to new string. Example of such binding: http://prntscr.com/mqsibp



Best regards,

Alex

Alex_Tim,

Thanks. And what if the recommendation is set up by a formula and looks something like this?

"Number of something: " + [#Read number of something.First item of resulting collection.Number#]

 

Carlos Zaldivar Batista,

You can simply change the formula and save the business process as new version.

If the string is coming from the database you can change it by sql query or via business process element "modify data".

Regards,

Alex 

Show all comments

Hi!

Guided by   https://academy.bpmonline.com/documents/technic-sdk/7-11/authservicesvc…

I am trying to authenticate using fiddler as  client, but I get an error, please tell me what am I doing wrong.

user have access to OData.

what i receive:

HTTP/1.1 401 Unauthorized

Cache-Control: private

Content-Type: application/json; charset=utf-8

Server: Microsoft-IIS/8.5

jsonerror: true

X-Powered-By: ASP.NET

X-Frame-Options: SAMEORIGIN

X-Content-Type-Options: nosniff

Date: Sat, 23 Feb 2019 08:02:33 GMT

Content-Length: 91

{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}



 

 

Like 0

Like

1 comments

Dear Bellil,

Please see the article below on how to proceed with the authentication with bpm'online using OData protocol and Fiddler application 

https://academy.bpmonline.com/documents/technic-sdk/7-13/executing-odat…

Also, I would like to share the approach I use: I open the Fiddler --> start tracing all requests --> open login page and enter the credentials --> hit login and looking for this request in Fiddler --> drag the caught request into Fiddler Composer window. There I can see all the headers, and body sent to the system. This helps to understand what is needed, run same request with modified data (if needed for any testing).



Hope you will find it helpful,

Anastasia

Show all comments

I created a web service reference in GUI so I can call it from processes. I want to, depending on some settings, call a test version of this web service or a production version. Only their addresses differ. Is it possible to choose the address dynamically?

Like 0

Like

2 comments

Dear Carlos,

You can create two web services in the system, one with test version URL, other with productive version URL.

Create a system setting, based on which you will decide test or production. Other solution is to use an Exclusive Gateway element, which wold determine which pass to choose. Each of the passes would lead to one Web Services Call element. 

The diagram should look somewhat like this:

Regards,

Anastasia

Anastasia Botezat,

Thank you. I hoped that I could avoid adding two web services but if that's the only option then I'll have to do that.

Show all comments

Hi,

 

related to question https://community.bpmonline.com/questions/hide-run-process-button-side-panel-roles-1 ,

I would like to hide the run process button. https://prntscr.com/mmaait  

 

I tried by creating replacing client module but the result is not as expected:

1. create a replacing client module : https://prntscr.com/mma6zg

2. create the replacing client module with parent object "Upper menu module (NUI)" : 

https://prntscr.com/mma75s

3. copy all the source code and css from parent object "Upper menu module (NUI)"

source code : https://prntscr.com/mma7ah

Less tab : https://prntscr.com/mma7eq

4. however, the result is like this:

https://prntscr.com/mma7hv

 

what was wrong ? do you have any step-by-step process to hide the process button ? 

 

thank you

 

best regards,

 

Antonius

 

Like 0

Like

3 comments

Hello Antonius,



The issue you are facing is connected to missing schema resources. Most likely that you haven't indicated resource bindings in your replacing modlue "Upper menu module" . Please make sure that you have added LeftPanelTopMenuModuleResources" to module dependencies.

Basically,  "define" should look like this: define("LeftPanelTopMenuModule", ["LeftPanelTopMenuModuleResources"]



Best regards,

Alex

Alex_Tim,

Hi Alex,

 

thank you for your response.

I've added it as shown in this source code :  : https://prntscr.com/mma7ah

but, the result still like this : https://prntscr.com/mma7hv

 

regards,

Antonius

Antonius,

Hello Antonius,



Basically, step by step solution is:

1.Create replacing client module for "MainHeaderSchema"

2. Add attribute to it:

define("MainHeaderSchema", [], function() {

    return {

        attributes: {

            "isSysAdmin": {

            "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

            "dataValueType": Terrasoft.DataValueType.BOOLEAN,

            "value": false

        },

        }

    };

});



3. Create replacing client module for "LeftPanelTopMenu". Please note on getUserRights method and visible property of process menu item in loadMenu method.

4. Code of LeftPanelTopMenuModule:



define("LeftPanelTopMenuModule", ["LeftPanelTopMenuModuleResources", "LookupUtilities", "ConfigurationConstants",

"LeftPanelUtilitiesV2",

"HoverMenuButton", "CheckModuleDestroyMixin", "ProcessEntryPointUtilities",

"MaskHelper", "ProcessModuleUtilities",

"ServiceHelper", "MainMenuUtilities"], function(resources, LookupUtilities,

ConfigurationConstants, LeftPanelUtilities) {

    function createConstructor(context) {

        var Ext = context.Ext;

        var sandbox = context.sandbox;

        var Terrasoft = context.Terrasoft;

        

        /**

         * Left panel top menu module view model.

         */

        Ext.define("Terrasoft.LeftPanelTopMenuModuleViewModel", {

            extend: "Terrasoft.BaseViewModel",

            mixins: [

                "Terrasoft.CheckModuleDestroyMixin"

            ],

            Ext: null,

            Terrasoft: null,

            sandbox: null,

            

            

            getUserRights: function() {

                var scope = this;

                var currentUser = Terrasoft.SysValue.CURRENT_USER.value;

                var sysAdmins = ConfigurationConstants.SysAdminUnit.Id.SysAdministrators;

             var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "SysUserInRole" });

                esq.addColumn("SysRole");

                esq.addColumn("SysUser");

                esq.filters.add("SysUser", Terrasoft.createColumnFilterWithParameter(

                Terrasoft.ComparisonType.EQUAL, "SysUser", currentUser));

                esq.filters.add("SysRole", Terrasoft.createColumnFilterWithParameter(

                Terrasoft.ComparisonType.EQUAL, "SysRole", sysAdmins));

                esq.getEntityCollection(function(response) {

                    if (response && response.success) {

                        var result = response.collection;

                        var isSysAdmin = (result.collection.length !== 0);

                        scope.set("isSysAdmin", isSysAdmin);

                    }

                }, this);

            },

                            

            /**

             * @inheritdoc Terrasoft.BaseViewModel#init

             * @override

             */

            init: function(callback, scope) {

                this.getUserRights();

                this.loadMenu();

                this.setSystemDesignerVisible();

                LeftPanelUtilities.on("collapsedChanged", this.onSideBarCollapsedChanged, this);

                this.set("Collapsed", LeftPanelUtilities.getCollapsed());

                callback.call(scope);

            },

            /**

             * Sets based on the configuration of the property is responsible for the display panel buttons "System Designer".

             * Responsible for showing and hiding "System Designer" button on the toolbar.

             * @private

             */

            setSystemDesignerVisible: function() {

                var isSystemDesignerVisible = !this.get("IsSSP");

                Terrasoft.SysSettings.querySysSettings(["BuildType"], function(sysSettings) {

                    var buildType = sysSettings.BuildType;

                    if (buildType && (buildType.value === ConfigurationConstants.BuildType.Public)) {

                        isSystemDesignerVisible = false;

                    }

                    this.set("IsSystemDesignerVisible", isSystemDesignerVisible);

                }, this);

            },

            /**

             * Returns main menu item config.

             * @param {Object} entity Main menu lookup value.

             * @return {Object} Main menu item config.

             */

            getConfigMenuItem: function(entity) {

                var uId = entity.get("IntroPageUId");

                var name = entity.get("Name");

                var tag = entity.get("Tag");

                return {

                    Id: uId,

                    Caption: name,

                    Tag: tag,

                    Class: "menu-item",

                    Click: {bindTo: "goToIntroPageFromMenu"},

                    canExecute: {bindTo: "canBeDestroyed"}

                };

            },

            /**

             * Fills the collection of the main menu items.

             * @protected

             */

            loadItemsMainMenu: function() {

                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "ApplicationMainMenu",

                    isDistinct: true

                });

                esq.addColumn("Id");

                esq.addColumn("IntroPageUId");

                esq.addColumn("Name");

                esq.addColumn("[SysSchema:UId:IntroPageUId].Name", "Tag");

                esq.getEntityCollection(function(result) {

                    if (!result.success) {

                        return;

                    }

                    var menuCollection = this.Ext.create("Terrasoft.BaseViewModelCollection");

                    var entities = result.collection;

                    var mainMenuConfig = {

                        Id: "menu-menu-item",

                        Tag: "MainMenu",

                        Caption: resources.localizableStrings.mainManuMenuItemCaption,

                        Visible: {

                            bindTo: "IsSSP",

                            bindConfig: {

                                converter: function(value) {

                                    return !value;

                                }

                            }

                        }

                    };

                    var entitiesCount = entities.getCount();

                    if (entitiesCount === 0) {

                        mainMenuConfig.Class = "menu-item";

                        mainMenuConfig.Click = {bindTo: "goToFromMenu"};

                        menuCollection.add(mainMenuConfig.Id, this.Ext.create("Terrasoft.BaseViewModel", {

                            values: mainMenuConfig

                        }));

                    } else if (entitiesCount === 1) {

                        entities.each(function(entity) {

                            var menuItem = this.getConfigMenuItem(entity);

                            menuItem.Caption = mainMenuConfig.Caption;

                            menuCollection.add(menuItem.Id, this.Ext.create("Terrasoft.BaseViewModel", {

                                values: menuItem

                            }));

                        }, this);

                    } else {

                        mainMenuConfig.Type = "Terrasoft.MenuSeparator";

                        menuCollection.add(mainMenuConfig.Id, this.Ext.create("Terrasoft.BaseViewModel", {

                            values: mainMenuConfig

                        }));

                        entities.each(function(entity) {

                            var menuItem = this.getConfigMenuItem(entity);

                            menuCollection.add(menuItem.Id, this.Ext.create("Terrasoft.BaseViewModel", {

                                values: menuItem

                            }));

                        }, this);

                        var id = "end-menu-menu-item";

                        menuCollection.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                            values: {

                                Id: id,

                                Type: "Terrasoft.MenuSeparator"

                            }

                        }));

                    }

                    var mainMenuItems = this.get("MainMenuItems");

                    menuCollection.loadAll(mainMenuItems);

                    mainMenuItems.clear();

                    mainMenuItems.loadAll(menuCollection);

                }, this);

            },

            /**

             * Loads quick add menu items.

             * @protected

             */

            loadItemsQuickAddMenu: function() {

                var collection = this.get("quickAddMenu");

                collection.clear();

                var quickItems = Terrasoft.configuration.QuickAddMenu.QuickAddMenu;

                Terrasoft.each(quickItems, function(item) {

                    var id = item.itemId;

                    collection.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                        values: this.getItemQuickAddMenuConfig(id, item)

                    }));

                }, this);

            },

            /**

             * Gets config of the quick add menu item.

             * @private

             * @param {String} id Item id name.

             * @param {Object} item

             * @return {Object} Config of the quick add menu item.

             */

            getItemQuickAddMenuConfig: function(id, item) {

                var config = item.hasAddMiniPage ? {} : {

                    canExecute: {"bindTo": "canBeDestroyed"}

                };

                this.Ext.apply(config, {

                    Id: id,

                    Caption: item.name,

                    Click: {bindTo: "processQuickMenuClick"},

                    ModuleName: item.ModuleName,

                    Tag: id,

                    TypeColumnName: item.TypeColumnName,

                    TypeColumnValue: item.TypeColumnValue,

                    EditPageName: item.EditPageName,

                    EntitySchemaName: item.EntitySchemaName,

                    MiniPage: {

                        schemaName: item.miniPageSchema,

                        hasAddMiniPage: item.hasAddMiniPage

                    }

                });

                return config;

            },

            /**

             * Processes quick add menu item click.

             * @protected

             * @param {String} tag Tag value of quick add menu item.

             */

            processQuickMenuClick: function(tag) {

                var collection = this.get("quickAddMenu");

                var quickMenuItem = collection.get(tag);

                var moduleName = quickMenuItem.get("ModuleName") || "SysModuleEditManageModule";

                require([moduleName], function(module) {

                    if (module) {

                        module.Run({

                            sandbox: sandbox,

                            item: quickMenuItem

                        });

                    }

                });

            },

            /**

             * Returns query for reading available for running processes.

             * @private

             * @return {Terrasoft.EntitySchemaQuery} The Query to EntitySchema.

             **/

            _getRunProcessESQ: function() {

                var filters = [];

                filters.push(Terrasoft.createExistsFilter("[RunButtonProcessList:SysSchemaUId:UId].Id"));

                var esq;

                if (Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection()) {

                    esq = Terrasoft.ProcessModuleUtilities.createRunProcessESQ(filters);

                } else {

                    esq = Terrasoft.ProcessModuleUtilities.createRunProcessSelect(filters);

                }

                return esq;

            },

            /**

             * Return menu item view model.

             * @private

             * @param {Object} modelConfig Configuration object.

             **/

            _createMenuItem: function(modelConfig) {

                return this.Ext.create("Terrasoft.BaseViewModel", {

                    values: modelConfig

                });

            },

            /**

             * Fills caption to "Run process" menu.

             * @private

             * @param {Terrasoft.Collection} startProcessMenuItems Menu items collection.

             */

            _fillCaptionMenuItem: function(startProcessMenuItems) {

                var id = "caption-runprocess-menu-item";

                var modelConfig = {

                    Id: id,

                    Type: "Terrasoft.MenuSeparator",

                    Caption: resources.localizableStrings.RunProcessButtonMenuCaption

                };

                startProcessMenuItems.add(id, this._createMenuItem(modelConfig));

            },

            /**

             * Fills process record item to "Run process" menu.

             * @private

             * @param {Terrasoft.Collection} startProcessMenuItems Menu items collection.

             * @param {String} id Item id.

             * @param {String} caption Item caption.

             */

            _fillRunProcessMenuItem: function(startProcessMenuItems, id, caption) {

                var modelConfig = {

                    Id: id,

                    Caption: caption,

                    Click: {bindTo: "runProcess"},

                    canExecute: {bindTo: "canBeDestroyed"},

                    Tag: id,

                    MarkerValue: caption

                };

                startProcessMenuItems.add(id, this._createMenuItem(modelConfig));

            },

            /**

             * Fills separator to "Run process" menu.

             * @private

             * @param {Terrasoft.Collection} startProcessMenuItems Menu items collection.

             */

            _fillSeparatorMenuItem: function(startProcessMenuItems) {

                var id = "separator-runprocess-menu-item";

                var modelConfig = {

                    Id: id,

                    Type: "Terrasoft.MenuSeparator"

                };

                startProcessMenuItems.add(id, this._createMenuItem(modelConfig));

            },

            /**

             * Fills "open process page" item to "Run process" menu.

             * @private

             * @param {Terrasoft.Collection} startProcessMenuItems Menu items collection.

             */

            _fillOpenProcessPageMenuItem: function(startProcessMenuItems) {

                var id = "open-process-page";

                var modelConfig = {

                    Id: id,

                    Caption: resources.localizableStrings.AnotherProcessMenuItemCaption,

                    Click: {bindTo: "openProcessPage"},

                    Tag: id

                };

                startProcessMenuItems.add(id, this._createMenuItem(modelConfig));

            },

            /**

             * Returned clear startProcessMenu collection.

             * @private

             * @return {Terrasoft.Collection} Start process menu items.

             */

            _getClearedStartProcessMenuItems: function() {

                var startProcessMenuItems = this.get("startProcessMenu");

                startProcessMenuItems.clear();

                return startProcessMenuItems;

            },

            /**

             * Fills the collection menus global business process start button.

             */

            loadItemsStartProcessMenu: function() {

                var esq = this._getRunProcessESQ();

                esq.getEntityCollection(function(result) {

                    if (result.success) {

                        var startProcessMenuItems = this._getClearedStartProcessMenuItems();

                        var entities = result.collection;

                        if (!entities.isEmpty()) {

                            this._fillCaptionMenuItem(startProcessMenuItems);

                            var idColumnName = "Id";

                            var captionColumnName = "Caption";

                            entities.each(function(entity) {

                                var id = entity.get(idColumnName);

                                var caption = entity.get(captionColumnName);

                                this._fillRunProcessMenuItem(startProcessMenuItems, id, caption);

                            }, this);

                            this._fillSeparatorMenuItem(startProcessMenuItems);

                            this._fillOpenProcessPageMenuItem(startProcessMenuItems);

                        }

                        this.sandbox.publish("LoadedItemsStartProcessMenu");

                    } else {

                        throw new Terrasoft.QueryExecutionException();

                    }

                }, this);

            },

            /**

             * Returns view config.

             * @return {Object} View config.

             */

            getViewConfig: function() {

                var view = {

                    id: "side-bar-top-menu-module-container",

                    selectors: {

                        wrapEl: "#side-bar-top-menu-module-container"

                    },

                    classes: {

                        wrapClassName: ["top-menu-module-container"]

                    },

                    items: this.getTopMenuConfig()

                };

                return view;

            },

            /**

             * Returns menu object.

             * @return {Object}

             */

            loadMenu: function() {

                this.loadItemsStartProcessMenu();

                this.sandbox.subscribe("ResetStartProcessMenuItems", function() {

                    this.loadItemsStartProcessMenu();

                }, this);

                this.loadItemsQuickAddMenu();

                var menuCollection = this.Ext.create("Terrasoft.BaseViewModelCollection");

                var id = "process-menu-item";

                menuCollection.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        Id: id,

                        Tag: "ProcessExecute",

                        Caption: resources.localizableStrings.processMenuItemCaption,

                        Click: {bindTo: "openProcessPage"},

                        Visible: {

                            bindTo: "IsSSP",

                            bindConfig: {

                                converter: function(value) {

                                    debugger;

                                    return !value;

                                }

                            }

                        }

                    }

                }));

                id = "collapse-menu-item";

                menuCollection.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        Id: id,

                        Tag: "CollapseMenu",

                        Caption: this.getCollapseSideBarMenuItemCaptionConfig(),

                        Click: {bindTo: "collapseSideBar"}

                    }

                }));

                var workplaceMenu = this.getWorkplaceMenu();

                if (workplaceMenu.getCount() > 0) {

                    menuCollection.loadAll(workplaceMenu);

                }

                id = "system-designer-menu-item";

                menuCollection.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        Id: id,

                        Tag: "IntroPage/SystemDesigner",

                        Caption: resources.localizableStrings.systemDesignerMenuItemCaption,

                        Click: {bindTo: "goToFromMenu"},

                        Visible: {bindTo: "IsSystemDesignerVisible"},

                        canExecute: {bindTo: "canBeDestroyed"}

                    }

                }));

                id = "profile-menu-item";

                menuCollection.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        Id: id,

                        Tag: "UserProfile",

                        Caption: resources.localizableStrings.userProfileMenuItemCaption,

                        Click: {bindTo: "goToFromMenu"},

                        canExecute: {bindTo: "canBeDestroyed"}

                    }

                }));

                id = "exit-menu-item";

                menuCollection.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        Id: id,

                        Tag: "Exit",

                        ClassName: "Terrasoft.MenuItem",

                        Caption: resources.localizableStrings.exitMenuItemCaption,

                        Click: {bindTo: "exitClick"},

                        canExecute: {bindTo: "canBeDestroyed"}

                    }

                }));

                var mainMenuItems = this.get("MainMenuItems");

                mainMenuItems.loadAll(menuCollection);

                this.loadItemsMainMenu();

            },

            /**

             * Returns collection of workplace models for workplace menu.

             * @return {Terrasoft.BaseViewModelCollection} Workplace models collection.

             */

            getWorkplaceMenu: function() {

                var workplaceMenuItems = this.Ext.create("Terrasoft.BaseViewModelCollection");

                var workplaces = Terrasoft.deepClone(

                    Terrasoft.configuration.WorkplacesStructure.Workplaces);

                if (workplaces.length > 0) {

                    var id = "separator-top-menu-item";

                    workplaceMenuItems.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                        values: {

                            Id: id,

                            Type: "Terrasoft.MenuSeparator",

                            Caption: resources.localizableStrings.workPlaceMenuItemCaption

                        }

                    }));

                    workplaces.sort(function(a, b) {

                        if (a.name < b.name) {

                            return -1;

                        }

                        if (a.name > b.name) {

                            return 1;

                        }

                        return 0;

                    });

                    Terrasoft.each(workplaces, function(item) {

                        if (item.hide) {

                            return;

                        }

                        var menuItemConfig = {

                            Caption: item.name,

                            Tag: item.workplaceId,

                            Click: {

                                bindTo: "workPlaceMenuItemClick"

                            },

                            Id: "workspace-" + Terrasoft.formatGUID(item.workplaceId, "N") + "-menu-item"

                        };

                        workplaceMenuItems.add(this.Ext.create("Terrasoft.BaseViewModel", {

                            values: menuItemConfig

                        }));

                    }, this);

                    id = "separator-botom-menu-item";

                    workplaceMenuItems.add(id, this.Ext.create("Terrasoft.BaseViewModel", {

                        values: {

                            Id: id,

                            Type: "Terrasoft.MenuSeparator"

                        }

                    }));

                }

                return workplaceMenuItems;

            },

            /**

             * Returns the top menu configuration.

             * @return {Object}

             */

            getTopMenuConfig: function() {

                var menuConfig = [

                    {

                        id: "collapse-button",

                        tag: "CollapseMenu",

                        className: "Terrasoft.HoverMenuButton",

                        style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,

                        classes: {

                            imageClass: ["button-image-size"],

                            wrapperClass: ["collapse-button-wrapperEl"]

                        },

                        imageConfig: resources.localizableImages.collapseIconSvg,

                        click: {

                            bindTo: "collapseSideBar"

                        },

                        hint: this.getCollapseSideBarMenuItemCaptionConfig(),

                        markerValue: this.getCollapseSideBarMenuItemCaptionConfig()

                    },

                    {

                        id: "menu-button",

                        tag: "MainMenu",

                        className: "Terrasoft.HoverMenuButton",

                        style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,

                        hint: {bindTo: "getMenuButtonHint"},

                        markerValue: resources.localizableStrings.MenuButtonHint,

                        classes: {

                            imageClass: ["button-image-size"],

                            wrapperClass: ["menu-button-wrapperEl"]

                        },

                        imageConfig: resources.localizableImages.menuIconSvg,

                        menu: {

                            items: {bindTo: "MainMenuItems"},

                            "alignType": "tr?",

                            "ulClass": "position-fixed"

                        },

                        delayedShowEnabled: {

                            bindTo: "Collapsed"

                        },

                        showDelay: this.get("ShowDelay"),

                        hideDelay: this.get("HideDelay")

                    },

                    {

                        id: "menu-startprocess-button",

                        tag: "StartProcessMenu",

                        className: "Terrasoft.HoverMenuButton",

                        style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,

                        hint: {bindTo: "getStartProcessMenuButtonHint"},

                        markerValue: resources.localizableStrings.StartProcessButtonHint,

                        classes: {

                            imageClass: ["button-image-size"],

                            wrapperClass: ["menu-startprocess-button-wrapperEl"]

                        },

                        imageConfig: resources.localizableImages.processIconSvg,

                        menu: {

                            items: {bindTo: "startProcessMenu"},

                            "alignType": "tr?",

                            "ulClass": "position-fixed"

                        },

                        click: {

                            bindTo: "startProcessMenuButtonClick"

                        },

                        visible: {

                            bindTo: "isSysAdmin",

                            bindConfig: {

                                converter: function(value) {

                                    return value;

                                }

                            }

                        },

                        delayedShowEnabled: {

                            bindTo: "Collapsed"

                        },

                        showDelay: this.get("ShowDelay"),

                        hideDelay: this.get("HideDelay")

                    },

                    {

                        id: "menu-quickadd-button",

                        tag: "quickAddMenu",

                        className: "Terrasoft.HoverMenuButton",

                        style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,

                        classes: {

                            imageClass: ["button-image-size"],

                            wrapperClass: ["menu-quickadd-button-wrapperEl"]

                        },

                        hint: {

                            bindTo: "getQuickAddHint"

                        },

                        markerValue: resources.localizableStrings.AddButtonHint,

                        imageConfig: resources.localizableImages.quickaddIconSvg,

                        menu: {

                            items: {bindTo: "quickAddMenu"},

                            "alignType": "tr?",

                            "ulClass": "position-fixed"

                        },

                        visible: {

                            bindTo: "IsSSP",

                            bindConfig: {

                                converter: function(value) {

                                    return !value;

                                }

                            }

                        },

                        delayedShowEnabled: {

                            bindTo: "Collapsed"

                        },

                        showDelay: this.get("ShowDelay"),

                        hideDelay: this.get("HideDelay")

                    }

                ];

                return menuConfig;

            },

            /**

             * Handles start process button click.

             * @protected

             * @return {boolean} Returns false for preventing default click handler.

             */

            startProcessMenuButtonClick: function() {

                var startProcessMenu = this.get("startProcessMenu");

                if (startProcessMenu.getCount() > 0) {

                    return false;

                }

                this.openProcessPage();

            },

            /**

             * Returns quick add menu button hint.

             * @return {String} Quick add menu button hint text.

             */

            getQuickAddHint: function() {

                return this.getHint(resources.localizableStrings.AddButtonHint);

            },

            /**

             * Returns start process menu button hint.

             * @return {String} Start process menu button hint text.

             */

            getStartProcessMenuButtonHint: function() {

                return this.getHint(resources.localizableStrings.StartProcessButtonHint);

            },

            /**

             * Returns menu button hint.

             * @return {String} Menu button hint text.

             */

            getMenuButtonHint: function() {

                return this.getHint(resources.localizableStrings.MenuButtonHint);

            },

            /**

             * Returns hint text.

             * When left panel state is collapsed, returns null.

             * @param {String} hint Hint text.

             * @return {String|null} Hint text.

             */

            getHint: function(hint) {

                var collapsed = this.get("Collapsed");

                if (!collapsed) {

                    return hint;

                }

                return null;

            },

            /**

             * Returns the configuration of the switching element collapsed left panel.

             * @return {Object}

             */

            getCollapseSideBarMenuItemCaptionConfig: function() {

                return {

                    bindTo: "Collapsed",

                    bindConfig: {

                        converter: this.getCollapseSideBarMenuItemCaption

                    }

                };

            },

            /**

             * Run the business process from the list of global processes start button.

             * @param {Object} tag UId business Process diagrams.

             */

            runProcess: function(tag) {

                Terrasoft.ProcessModuleUtilities.executeProcess({

                    sysProcessId: tag

                });

            },

            goTo: function() {

                var tag = arguments[3];

                var currentModule = this.sandbox.publish("GetHistoryState").hash.historyState;

                if (currentModule !== tag) {

                    Terrasoft.MaskHelper.ShowBodyMask();

                    this.sandbox.publish("PushHistoryState", {hash: tag});

                }

            },

            /**

             * @deprecated

             */

            replaceWindowLocation: function(location) {

                window.location.replace(location);

            },

            /**

             * Handles exit menu item click.

             * @private

             */

            exitClick: function() {

                Terrasoft.MainMenuUtilities.logout();

            },

            goToFromMenu: function(tag) {

                var currentHistoryState = this.sandbox.publish("GetHistoryState").hash.historyState;

                if (currentHistoryState !== tag) {

                    Terrasoft.Mask.show();

                    this.sandbox.publish("PushHistoryState", {hash: tag});

                }

            },

            goToIntroPageFromMenu: function(tag) {

                var currentHistoryState = this.sandbox.publish("GetHistoryState").hash.historyState;

                if (currentHistoryState !== tag) {

                    var hash = "IntroPage/" + tag;

                    this.sandbox.publish("PushHistoryState", {hash: hash});

                }

            },

            openProcessPage: function() {

                var vwSysProcessFilters = Terrasoft.createFilterGroup();

                vwSysProcessFilters.name = "vwSysProcessFiler";

                var sysWorkspaceFilter = Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "SysWorkspace",

                    Terrasoft.SysValue.CURRENT_WORKSPACE.value);

                vwSysProcessFilters.addItem(sysWorkspaceFilter);

                var businessProcessTagFilter = Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "TagProperty",

                    ConfigurationConstants.SysProcess.BusinessProcessTag);

                vwSysProcessFilters.addItem(businessProcessTagFilter);

                var isMaxVersionFilter = Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "IsMaxVersion", true);

                vwSysProcessFilters.addItem(isMaxVersionFilter);

                var config = {

                    entitySchemaName: "VwSysProcess",

                    isRunProcessPage: true,

                    captionLookup: resources.localizableStrings.processLookupCaption,

                    multiSelect: false,

                    columnName: "Caption",

                    filters: vwSysProcessFilters,

                    hideActions: true

                };

                var handler = function(args) {

                    var activeItems = args.selectedRows.getItems();

                    if (!this.Ext.isEmpty(activeItems)) {

                        Terrasoft.ProcessModuleUtilities.executeProcess({

                            sysProcessId: activeItems[0].Id

                        });

                    }

                };

                LookupUtilities.Open(this.sandbox, config, handler, this, null, false, false);

            },

            collapseSideBar: function() {

                LeftPanelUtilities.changeCollapsed();

            },

            showESN: function() {

                var esnHash = "SectionModuleV2/ESNFeedSectionV2/";

                var currentModule = this.sandbox.publish("GetHistoryState").hash.historyState;

                if (currentModule !== esnHash) {

                    Terrasoft.MaskHelper.ShowBodyMask();

                    this.sandbox.publish("PushHistoryState", {hash: esnHash});

                }

            },

            /**

             * Returns the text for the switching element folding left panel.

             * @param {Boolean} isCollapsed Collapsed flag.

             * @return {String} The text for the switching element folding left panel.

             */

            getCollapseSideBarMenuItemCaption: function(isCollapsed) {

                if (this.Ext.isEmpty(isCollapsed)) {

                    isCollapsed = LeftPanelUtilities.getDefaultCollapsed();

                }

                if (isCollapsed) {

                    return resources.localizableStrings.expandSideBarMenuItemCaption;

                } else {

                    return resources.localizableStrings.collapseSideBarMenuItemCaption;

                }

            },

            workPlaceMenuItemClick: function(tag) {

                var workplaceItem = this.getWorkplaceData(tag);

                if (workplaceItem) {

                    this.sandbox.publish("ChangeCurrentWorkplace", tag);

                }

            },

            getWorkplaceData: function(workplaceId) {

                var workplaces = Terrasoft.configuration.WorkplacesStructure.Workplaces;

                var workplaceItem = null;

                if (workplaces.length > 0) {

                    Terrasoft.each(workplaces, function(item) {

                        if (item.workplaceId === workplaceId) {

                            workplaceItem = item;

                        }

                    }, this);

                }

                return workplaceItem;

            },

            /**

             * Handler of the changes Hide left panel.

             * @param {Boolean} isCollapsed Collapsed attribute.

             */

            onSideBarCollapsedChanged: function(isCollapsed) {

                this.sandbox.publish("ChangeSideBarCollapsed", isCollapsed);

                this.set("Collapsed", isCollapsed);

                this.sandbox.publish("ChangeGridUtilitiesContainerSize");

            }

        });

        Ext.define("Terrasoft.configuration.LeftPanelTopMenuModule", {

            extend: "Terrasoft.BaseModule",

            isAsync: false,

            viewModel: null,

            viewModelClassName: "Terrasoft.LeftPanelTopMenuModuleViewModel",

            render: function(renderTo) {

                this.generate(renderTo);

            },

            init: function(callback, scope) {

                var viewModel = this.viewModel = this.getViewModel();

                callback = callback || Ext.emptyFn;

                scope = scope || this;

                viewModel.init(function() {

                    callback.call(scope);

                }, this);

            },

            getViewModel: function() {

                return Ext.create(this.viewModelClassName, {

                    Terrasoft: Terrasoft,

                    Ext: Ext,

                    sandbox: sandbox,

                    values: {

                        Collapsed: false,

                        quickAddMenu: Ext.create("Terrasoft.BaseViewModelCollection"),

                        startProcessMenu: Ext.create("Terrasoft.BaseViewModelCollection"),

                        MainMenuItems: Ext.create("Terrasoft.BaseViewModelCollection"),

                        IsSystemDesignerVisible: true,

                        IsSSP: (Terrasoft.CurrentUser.userType === Terrasoft.UserType.SSP),

                        ShowDelay: 0,

                        HideDelay: 20

                    }

                });

            },

            generate: function(container) {

                var viewModel = this.viewModel;

                var view = this.view;

                if (!Ext.isEmpty(viewModel) && !Ext.isEmpty(view)) {

                    view.destroy();

                }

                var viewConfig = viewModel.getViewConfig();

                view = Ext.create("Terrasoft.Container", Terrasoft.deepClone(viewConfig));

                view.bind(viewModel);

                view.render(container);

                Terrasoft.MaskHelper.HideBodyMask();

            }

        });

        return Terrasoft.configuration.LeftPanelTopMenuModule;

    }

    return createConstructor;

});

 

 

Show all comments
Question

Hi, I create editable detail.

It contain two drop down list one depends on other.

is it posible to filter one based on other value?

 

Regards

Tomek

Like 0

Like

1 comments

Hello tomasz,



It can be achieved via triggering some method for filtering when the field is changing. You will need to create new attribute with dependencies properties where column and method should be specified. For example:

 

"OnColumnNameChange":{
    "dependencies":[
        {
         "columns":["columnName"],
         "methodName":"methodThatTriggersWhenColumnNameChanges"
         }]
}

Also please note on these articles: 

https://community.bpmonline.com/questions/filter-detail

https://community.bpmonline.com/articles/filtering-details-several-fiel…

Show all comments

Hello Community!

Is it possible to get all record in editable detail and set it to parent page column, when added new record or modified record in "Transportasi Perjalanan Dinas" detail.

is there any example how to do that using the javascript on parent page?

Regards,

Like 0

Like

1 comments

Details communicate with their main pages via "messages". Please read more about messages in the article by the link below. 

https://academy.bpmonline.com/documents/technic-sdk/7-13/messages-messa…

Show all comments

Hello all,

How to display Data List in Email Template ? i used bpm ver. 7.12

Thanks

Like 0

Like

8 comments

Dear Vidya,

Since templates are based on HTML you can use HTML coding to form the template as you want. Below you may find more information about tables and lists in HTML:

https://www.w3schools.com/html/html_tables.asp

https://www.w3schools.com/html/html_lists.asp

To add HTML code to your template go to template designer -> HTML code (http://prntscr.com/m1ir8g)

Best regards,

Angela

Dear Angela,

I means how to retrieve looping a data from multiple row data to email template, maybe this picture can describe what i want...

That section show 6 row data, and than i want to show that all data in email template.. and configuration email template :

But the result is only last record showed in email. please advise...

vidya.dharma,

Hello,

We can recommend you to setup a printable with the data from a detail and then send it with the help of a business process. The example of the implementation is described below:

https://community.bpmonline.com/articles/generate-printable-and-send-it…

You can modify the process ,so it meets your requirements.

Best regards,

Matt

Hi everyone,

Vidya question is very important to us... and for most of the cases, a printable it's not the solution. Can you give us some more tips on HTML?

@vidya.dharma - did you find another solution?

Thanks,

Luis

 

 

luis.goncalves@imdigital.pt,

 

You can implement you business task by the means of business process. The idea is to add read data elements, which would retrieve needed data from particular records. Afterwards, use “send email” business element to combine data into email and send it. You can add a button on the section, or action to trigger the process. 

 

Please see the following article. You can use this example to select needed records and pass this info to business process to send email.

 

https://academy.bpmonline.com/documents/technic-sdk/7-13/how-add-section-action-handling-selection-several-records

 

Regards, 

Anastasia

luis.goncalves@imdigital.pt,

One other way, although it's a bit more complicated, is by using a custom macro (https://academy.bpmonline.com/documents/technic-sdk/7-13/adding-macro-h…).

For example, I made this a while back to show a filtered list of products on an order; the HTML is very simple, as it was a demonstration, but that can easily be edited with CSS as necessary.  You can see that 'arguments' is passed the record ID if you link the template to a record; the macro is then called by including [#@Invoke.UsrEmailProducts#] in your template.

namespace Terrasoft.Configuration
{
	using System;
	using Terrasoft;
	using Terrasoft.Common;
	using Terrasoft.Core;
	using Terrasoft.Core.Entities;
	using Terrasoft.Core.DB;
	using Newtonsoft.Json;
 
	public class UsrEmailProducts : IMacrosInvokable
    {
        public UserConnection UserConnection {
            get;
            set;
        }
        public string GetMacrosValue(object arguments) {
        	var sjson = JsonConvert.SerializeObject(arguments);
        	var templ = new {Key = String.Empty, Value = String.Empty};
        	var args = JsonConvert.DeserializeAnonymousType(sjson, templ);
        	var orderId = args.Value;
        	var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "OrderProduct");
            var colCode = esq.AddColumn("Product.Code");
            var colDescription = esq.AddColumn("Product.Name");
            var colQty = esq.AddColumn("Quantity");
            var colSpecs = esq.AddColumn("UsrSpecifications");
            var colColour = esq.AddColumn("UsrColour");
            var OrderFilter = esq.CreateFilterWithParameters(
			    FilterComparisonType.Equal, "Order", orderId);
			var ModifiedFilter = esq.CreateFilterWithParameters(
			    FilterComparisonType.Equal, "UsrModified", true);
            esq.Filters.LogicalOperation = LogicalOperationStrict.And;
            esq.Filters.Add(OrderFilter);
            esq.Filters.Add(ModifiedFilter);
            EntityCollection entities = esq.GetEntityCollection(UserConnection);
            var html = "&lt;table&gt;&lt;tr&gt;&lt;td&gt;Code&lt;/td&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;Quantity&lt;/td&gt;&lt;td&gt;Specifications&lt;/td&gt;&lt;td&gt;Colour&lt;/td&gt;&lt;/tr&gt;";
            foreach (Entity entity in entities) {
            	html += "&lt;tr&gt;";
            	html += "&lt;td&gt;" + entity.GetColumnValue(colCode.Name).ToString() + "&lt;/td&gt;";
            	html += "&lt;td&gt;" + entity.GetColumnValue(colDescription.Name).ToString() + "&lt;/td&gt;";
            	html += "&lt;td&gt;" + entity.GetColumnValue(colQty.Name).ToString() + "&lt;/td&gt;";
            	html += "&lt;td&gt;" + entity.GetColumnValue(colSpecs.Name).ToString() + "&lt;/td&gt;";
            	html += "&lt;td&gt;" + entity.GetColumnValue(colColour.Name).ToString() + "&lt;/td&gt;";
            	html += "&lt;/tr&gt;";
            }
            html += "&lt;/table&gt;";
            return html;
        }
    }
}

Edit: All the &lt;/&gt; should be proper lt/gt characters, that's just the forum software replacing them.

Hi Darian Lewis,

I'm working together with Luis Gonçalves, and we finally had some time to test your sugestion.

It is actually working perfectly, the table is created in the email in the context of the record ID and there isn't even any need to replace the "&lt;/&gt".

Thank you very much.

I've got one more question for you: this works fine if I start an email from the Case and the ID is passed perfectly.

But if I try to reply to an email that was sent by a costumer and the email is linked with that same Case. Then the conection does not work and the recordID is not retrieved. Any idea how I could make the conection between the macro and the case that is linked with the email that I'm replying to?

 

Once again thanks for the help.

Luis

Luis Tinoco Azevedo,

I'm afraid that's more of a back-end BPM thing; to the best of my knowledge, the 'arguments' argument ought to hold the current record, but as I'm not a BPM employee, I don't know what the mechanics behind it are.  It may be that the 'current record' when you're replying to an email is the Activity object representing the email instead of the Case object, but that's just a guess.  I don't know to what extent you're comfortable with the code, but have you tried temporarily returning the contents of the arguments variable (instead of the table) to see what's being passed in?

Show all comments

I created a custom service following this guide: https://academy.bpmonline.com/documents/technic-sdk/7-12/how-create-custom-configuration-service. The GET method works as expected but when I created a POST endpoint, the only response I get is 403. Actually sending POST request to any endpoint ends up with this error. My class looks like this:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class UsrCustomService: BaseService
{
	[OperationContract]
	[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
	public bool PostTest()
	{
		return true;
	}
 
	[OperationContract]
	[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
	public string GetTest()
	{
		return "Hello world";
	}
}

Do you know how can I fix it?

Like 0

Like

7 comments

Dear Carlos,

This error indicated that you are forbidden to insert into the object. This usually happens, when the user, whose login details you are using to connect does not have rights to write to the indicated object.

Please double check the rights for the object per user you are authenticating with.

Regards,

Anastasia

Anastasia Botezat,

Hm, I'm not inserting into any objects here, the service just returns constant values (for now). I'm also authenticating with Supervisor account.

Carlos,

Please check the CSRF header in your request. Probably, you don't pass CSRF cookie and therefore get the error - https://academy.bpmonline.com/documents/technic-sdk/7-12/protection-csrf-attacks-during-integration-bpmonline

If this won't help. please contact our support at support@bpmonline.com, since it's hard to say what's wrong with the request as we don't see the request body and the request headers. Please, use Fiddler as a proxy and send us a full text of the request from Fiddler. This way we will be able to find the cause of issue.

Regards,

Anastasia

Carlos Zaldivar Batista,

How are you calling the configuration service? Is it from within a client schema or from externally using code or something like postman? 

Ryan 

Ryan Farley,

Postman. And before making request to UsrCustomService I first make a request to /ServiceModel/AuthService.svc/Login to obtain authentication cookies.

Carlos Zaldivar Batista,

Are you also copying the contents of the BPMCSRF cookie on the call to AuthService.svc/Login to the CSRF header for the request to the config service? 

This article in the academy outlines the steps for making this call via Postman https://academy.bpmonline.com/documents/technic-sdk/7-13/how-call-confi…

Ryan Farley,

Nope, that's what I was missing. Thanks!

Show all comments