How can I open a section from a card and pass parameters to it, I try this

const config = {
						caption: caption,
						entitySchemaName: "Account",
						schemaName: "AccountSectionV2",
						moduleId: "SectionModuleV2_AccountSectionV2"
					};
					var newHash = "SectionModuleV2/AccountSectionV2";
					this.sandbox.publish("PushHistoryState", {
						hash: newHash,
						silent: true,
						stateObj: {
							caption: config.caption,
							entitySchemaName: config.entitySchemaName,
							schemaName: config.schemaName,
						}
				});
					this.sandbox.loadModule("SectionModuleV2", {
						renderTo: "centerPanel",
						id: config.moduleId,
						keepAlive: true,
						parameters: {
							"OBSWAccountFilterConfig": this.getFilters(),
						},
					});

The section opens but the parameters I cannot get. How to open a section and get the parameters passed?

Like 2

Like

2 comments

Dear Grigoriy, 

 

You can see the example of implementation of passing parameters in loadModule and then getting parameters in the method onContactEnrichmentPageVisibilityChanged in MainHeaderSchema: 

 

onContactEnrichmentPageVisibilityChanged: function(tag) {

                    var args = Ext.decode(tag);

                    var showEnrichmentPage = args.isVisible;

                    this.set("ContactEnrichmentPageVisible", showEnrichmentPage);

                    if (!showEnrichmentPage) {

                        return;

                    }

                    this.sandbox.loadModule("BaseSchemaModuleV2", {

                        renderTo: this.get("ContactEnrichmentModuleContainerId"),

                        instanceConfig: {

                            parameters: {

                                viewModelConfig: {

                                    ContactId: args.contactId,

                                    ContactName: args.contactName,

                                    EnrchTextDataId: args.enrchTextDataId,

                                    EnrchEmailDataId: args.enrchEmailDataId,

                                    CallerSource: args.source

                                }

                            },

                            schemaName: "ContactEnrichmentSchema",

                            isSchemaConfigInitialized: true,

                            useHistoryState: false

                        }

                    });

                }

 

After that, the parameters are accessed in BaseSchemaModuleV2 in the getViewModelConfig method: 



getViewModelConfig: function() {

            var viewModelConfig = {

                Ext: this.Ext,

                sandbox: this.sandbox,

                Terrasoft: this.Terrasoft

            };

            var parameters = this.parameters;

            if (this.Ext.isObject(parameters)) {

                viewModelConfig.values = parameters.viewModelConfig;

            }

            return viewModelConfig;

        }

 

Best regards, 

Dennis 

Dennis Hudson,

Thanks !
Show all comments

Hi,

I am using a select class to build a query where I have to compare date column "Net due date" with the current month.

var currentMonth = DateTime.Now.Month;

var select = new Select(UserConnection)

            .Column("Id")

            .From("UsrBeta")

            .Where("UsrDate").IsEqual(Column.Parameter(currentMonth)) as Select;

But I am getting this error : Operand type clash: date is incompatible with int

Like 0

Like

3 comments

Try this

.....

.Where(Func.Month("UsrDate")) .IsEqual(Column.Parameter(currentMonth));

Hi Grigoriy,

Thank you very much! It works

 

 

Hi Grigoriy,

I have to sum up the values of Column("Score") of several records so for this what should I use in place of Func.Month() .

Can you provide the reference for This Func method? 

Many Thanks.

Show all comments

I try to override in CommunicationPanel the index property but it doesn’t work :

define("CommunicationPanel", ["terrasoft", "CommunicationPanelHelper"],
	function(Terrasoft, CommunicationPanelHelper) {
		return {
			messages: {},
			attributes: {},
			methods: {	},
			diff: [
				{
					"operation": "merge",
					"name": "centerNotification",
					"index":  1,				
				}

How can I change the position of the icon?

Like 1

Like

1 comments

Hello Grigoriy,

 

You can only move elements defined in the "diff" of the CommunicationPanel schema, for instance to move esnFeed use:

{

    "operation": "move",

    "parentName": "communicationPanelContent",

    "propertyName": "items",

    "name": "esnFeed",

    "index": 6

}

 

Best regards, 

Olga. 

Show all comments

Hi All,

In case section,I am calling a process on save inside a popup.

The process is not triggering handleServerChannelMessage  on success of it.

The code is below.



            save: function() {this.openInputBox();

this.callParent(arguments);},



            openInputBox: function(obj) {

                    

                    var GetAnswerButton = this.Ext.create("Terrasoft.Button", {

                        returnCode: "GetAnswer",

                        className: "Terrasoft.Button",

                        caption: "Get Answer",

                        style: this.Terrasoft.controls.ButtonEnums.style.GREEN

                    });

                    

                    var SkipButton = this.Ext.create("Terrasoft.Button", {

                        returnCode: "Skip",

                        className: "Terrasoft.Button",

                        caption: "Skip",

                        style: this.Terrasoft.controls.ButtonEnums.style.Blue,

                        enabled: !obj.SBLCanSkip,

                    });

                    

                    var NextButton = this.Ext.create("Terrasoft.Button", {

                        returnCode: "Next",

                        className: "Terrasoft.Button",

                        caption: "Next",

                        style: this.Terrasoft.controls.ButtonEnums.style.Blue

                    });

                    

                    var controls = {

                        "UsrReference": {

                            dataValueType: Terrasoft.DataValueType.TEXT,

                            isRequired: obj.SBLCanSkip,

                            caption: this.get("UsrQuestion"),

                            value: {

                                layout: {

                                    "colSpan": 24,

                                    "rowSpan": 1,

                                    "column": 0,

                                    "row": 1

                                },

                                bindTo: "UsrReference",

                            },

                            customConfig: {

                                    enabled: false

                            }

                        },

                    };

 

                 Terrasoft.utils.inputBox("Call Center Question",

                    this.openInputBoxHandler, 

                    [GetAnswerButton, SkipButton, NextButton],

                    this,

                    controls

                );

                Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item) {

                    item.control.bind(this);

                }, this);

            },

             

            openInputBoxHandler: function(returnCode, controlData) {

if ("GetAnswer" === returnCode) {

                var args = {

                    sysProcessName: "SBLTestMessage",

                };

                ProcessModuleUtilities.executeProcess(args);

                Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.handleServerChannelMessage, this);

                }

             },

             

            handleServerChannelMessage: function(channel, message) {

                var messageSenderName = message && Terrasoft.ServerChannel.getSenderName(message);

                if (messageSenderName === "Answer") {

                    var data=message.Body;

                }

            },

 

Like 0

Like

5 comments

Hello Akshaya,

 

Firstly, you should subscribe on ServerChannel and after that execute your process. 

 

The best way how to use WebSocket (please, don't forget to unsubscribe on destroy):

methods: {

    init: function() {

        this.callParent(arguments);

        Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMessageReceived, this);

    },

    onMessageReceived: function(sender, message) {

        if (message && message.Header && message.Header.Sender === "MySenderName") {

            var result = this.Ext.decode(message.Body);

            /// TODO: your code

        }

    },

    destroy: function() {

        this.Terrasoft.ServerChannel.un(Terrasoft.EventName.ON_MESSAGE, this.onMessageReceived, this);

        this.callParent(arguments);

    }

}

 

Please, let us know in case any further information is required. 

 

Best regards,

Olga. 

Olga Avis,

Thanks Olga,



The ON_MESSAGE subscription is already done in process -> script task 

MsgChannelUtilities.PostMessage(UserConnection, "Answer","Answer");

 

But still its not hitting onMessageReceived method ON_MESSAGE  , is there anything to be done additionally?



And the same process calling from page is working completely fine in another Creatio instance.

 

 

Hello Akshaya,

 

As was mentioned in the previous post, please, make sure that you have subscribed on ServerChannel and only after that executed your process.

 

openInputBoxHandler: function(returnCode, controlData) {

                if ("GetAnswer" === returnCode) {

               Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMessageReceived, this);

                    var args = {

                        sysProcessName: "UsrTestProcess",

                    };

                    ProcessModuleUtilities.executeProcess(args);

                    

                }

            },

            onMessageReceived: function(sender, message) {

                if (message && message.Header && message.Header.Sender === "MySenderName") {

                    var result = this.Ext.decode(message.Body);

                    /// TODO: your code

                }

            }, 

 

Best regards, 

Olga. 

Olga Avis,

Ya even after i have subscribed on ServerChannel and only after that executed your process. Still the onMessageReceived is not hitting.

I even tried to subscribe on init() also , still same result.

Akshaya B M,

 

Please, find an example below:

 

example 

1. Create replacing schema for contactpagev2 and populate that schema with code below .

define("ContactPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities){

    return{

        entitySchemaName:"Contact",

        attributes:{

            

        },

        modules:/**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,

        messages: {

            

        },

        businessRules:/**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,

        methods:{

            

            save: function() {

                this.openInputBox();

                this.callParent(arguments);

                

            },

            openInputBox: function(obj) {

                    

                    var GetAnswerButton = this.Ext.create("Terrasoft.Button", {

                        returnCode: "GetAnswer",

                        className: "Terrasoft.Button",

                        caption: "Get Answer",

                        style: this.Terrasoft.controls.ButtonEnums.style.GREEN

                    });

                    

                    var SkipButton = this.Ext.create("Terrasoft.Button", {

                        returnCode: "Skip",

                        className: "Terrasoft.Button",

                        caption: "Skip",

                        style: this.Terrasoft.controls.ButtonEnums.style.Blue,

                        enabled: true,

                    });

                    

                    var NextButton = this.Ext.create("Terrasoft.Button", {

                        returnCode: "Next",

                        className: "Terrasoft.Button",

                        caption: "Next",

                        style: this.Terrasoft.controls.ButtonEnums.style.Blue

                    });

                    

                    var controls = {

                        "UsrReference": {

                            dataValueType: Terrasoft.DataValueType.TEXT,

                            isRequired: false,

                            caption: "TEST",

                            value: {

                                layout: {

                                    "colSpan": 24,

                                    "rowSpan": 1,

                                    "column": 0,

                                    "row": 1

                                },

                                bindTo: "Name",

                            },

                            customConfig: {

                                    enabled: true

                            }

                        },

                    };

 

                 Terrasoft.utils.inputBox("Call Center Question",

                    this.openInputBoxHandler, 

                    [GetAnswerButton, SkipButton, NextButton],

                    this,

                    controls

                );

                Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item) {

                    item.control.bind(this);

                }, this);

            },

             

            openInputBoxHandler: function(returnCode, controlData) {

                if ("GetAnswer" === returnCode) {

                    Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMessageReceived, this);

                    var args = {

                        sysProcessName: "UsrTestProcess",

                    };

                    ProcessModuleUtilities.executeProcess(args);

                    

                }

            },

            onMessageReceived: function(sender, message) {

                if (message && message.Header && message.Header.Sender === "MySenderName") {

                    var result = this.Ext.decode(message.Body);

                    /// TODO: your code

                }

            },

            destroy: function() {

                this.Terrasoft.ServerChannel.un(Terrasoft.EventName.ON_MESSAGE, this.onMessageReceived, this);

                this.callParent(arguments);

            }

        },

        dataModels:/**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,

        diff:/**SCHEMA_DIFF*/[

        ]/**SCHEMA_DIFF*/

    };

});

 

2. Create a business process which contains a simple signal and script task

Code of the process: UsrTestProcess

Populate such usings:

Terrasoft.Configuration

Terrasoft.Messaging.Common

Newtonsoft.Json

 

Populate script task with such code:

 

string senderName = "MySenderName";

// Example for message

string message = JsonConvert.SerializeObject(new {

    Name = "Some name"

});

// For all users

MsgChannelUtilities.PostMessageToAll(senderName, message);



return true;

 

Best regards,

Olga. 

Show all comments

When drilling into a detail record from an edit page, the URL shown for the page in the address bar does not update to match the record shown by default. Is there any way to make this happen in client-side code? Or perhaps a setting which can be enabled? An important part of the application I'm currently working on is the ability for users to share the links to pages externally, and being able to do so by copying the URL sometimes (e.g. when drilling into a Section record to get to the edit page) but not other times isn't good UX for the client.

 

We know we can add an action bar button to copy the link, but this also isn't what he client would like if avoidable, for the above reason (consistency).

Like 0

Like

1 comments

Hello Harvey,

 

Unfortunately, there is no way to retrieve a direct URL when opening a record from the detail since Creatio is a single-page application, the navigation is stored in operative memory and could not be obtained. This is done to enhance system speed.

 

We do have a problem registered for our R&D team in the "Accepted" status regarding the possibility to dynamically change the link once the record from the detail is opened and it is planned to modify the current logic in one of the future releases. As for now the only way to retrieve the direct link is to open the detail record in another tab by right-clicking on it and selecting the "Open in another tab" option.

 

Best regards,

Oscar

Show all comments

I tried setting up a load balancer and 2 app servers as Academy guided. The load balancer works well, but once I customize something, only one app server is being built. Therefore, the changes are not replicated in the other servers. How to make it replicated to other servers automatically?

Like 0

Like

8 comments

Dear Van,

 

Do you mean that changes made in the configuration are not reflecting on other nodes? 

 

Best regards,

Angela

Yes, I mean the javascript files are not changed on the other nodes. I tried compiling all and checked the log file. It seems that the build ran only on one node. I haven't checked the case of installing package yet.

Van Ly,

Currently, there is no functionality that synchronises those files. You can either change them manually on all nodes or use third-application tools to synchronise files. 

 

Best regards,

Angela

Hello,

 

I created a business process. But if a user is connecting to another server than the original server which the business process was created, that user cannot run that process until we manually restart that server (or call UnloadAppDomain).

 

In addition, the UnloadAppDomain service is affecting only a server reached by the user at that time. Other servers are not affected.

One more thing. I added some dialog. If 2 users are connecting to the same server, the task panel shows immediately the task assigned . However, if the user who triggers the process is connecting to a different server than the other, the task is not shown immediately. We have to refresh the page, or close/open the task panel to see it.

 

I see that this is the problem of Websocket/SignalR, which only announce to the users connecting to the same server. Is there any switch to make it push to other servers, through Redis for example?

 

I tried some ways to sync files among servers, but it seems to hurt performance a little bit, and it generates conflicts sometime. Is there any better mechanism?

Dear Van Ly,

 

Creatio webapp is stateful. The static content, js schemas and dll are stored in file system. Lets say there are 3 nodes. I changed some schema or updated the process on one of them. During the saving process, schema will appear in the file system. After publishing the process, the correspondent file will be also generated in the file system. It means that it is necessary to move these files to other nodes to reflect your changes. 

The only workaround -

1. the first node is being disabled in balancer. 

2. one performs necessary changes on it.

3. the first node is enabled in balancer

4. the second node is disabled to be deployed out of the 1st one.

5. the second node is enabled in balancer

6. the third node is disabled from balancer to be deployed out of the 1st or the 2nd one.

 

There are no other options since on the first stages of Creatio development, we did not expect that there might be demand in balancers. This idea only appeared in some time. That is why there are some complications.

 

Regards,

Dean

Finally I come up with a solution: put load balancer under active / passive mode.

backend creatio
    stick-table type integer size 1 nopurge
    stick on int(1)
 
    server node_1 x.x.x.x check check on-marked-down shutdown-sessions
    server node_2 x.x.x.x check backup on-marked-down shutdown-sessions

In this mode, the websocket messages will always work. The configuration changes will be sync via syncthing. 1 way sync will not introduce conflicts.

Show all comments

Anyone ever experience this error in Studio v7.15.4 postgresql ?

https://prnt.sc/stiflm



please check my share screen for detail information:

https://www.loom.com/share/4add5837ffc54d4fab35ccf9adaf6fa3

Like 3

Like

8 comments

Hello Romadan,

 

Please generate the source code for all items, compile all items in the app (make sure that there are no warnings or errors during the compilation and it was completed successfully) and test the process once again and let us know about the result.

 

Best regards,

Oscar

Oscar Dylan,

 

Generate All complete

Compile All complete, success and no error/warning

https://prnt.sc/su3fui

FYI:

In my environment I'm using SVN built-in creatio for development.

my .net core: https://prnt.sc/su3if0

connection string: https://prnt.sc/su3jyi

still error: https://prnt.sc/su3jes

What happen, am i wrong deployment or setup in my environment ?

Romadan Saputra,

 

And do you use any process parameters? Maybe this process is a sub-process in another process and the main process transfers the Date/Time parameter to it and it is done incorrectly so as a result you receive the error? Can you please provide us with the screenshot of your process parameters? And the screenshot of launch options of the process? What happens if you simply recreate the process from scratch?

 

Best regards.

Oscar

Every business process with contains "Read Data" always error like that

Romadan Saputra,

Can you please create a ticket to support regarding this issue? Everything works well on my 7.15.4 postgre application so I think it is better checking the backup of your application.

 

Best regards,

Angela

Angela Reyes,

Previously, I have already create a ticket "SR-0895625", you can check that.

But, I decide to close this ticket, cause I found the problem of the error. But, now the error appears again, so I ask in community, maybe others have same issue like me.

Romadan Saputra,

Hello Romadan,

 

The issue couldn't be reproduced on clean out-of-the-box binary files so the problem is somewhere in the binary files. Can you please tell us what was the reason in SR-0895625?

 

Best regards,

Oscar

Show all comments

Hi,

I need one clarity.

When the user clicks on the emojis in feedback email sent to customer, for displaying the "Feedback" page with provision to enter comments and submit, do one portal license need to be given to "SysPortalConnection" user? 

is this a mandatory thing? Any workarounds by not giving the portal license?

 

Thanks

Krishna

Like 0

Like

2 comments

Hello Krishna,

 

Yes, you should distribute a portal license to the SysPortalConnection Creatio portal user to set up the customer satisfaction evaluation. 

 

You can find more detailed instruction on how to configure Customer Satisfaction (CSAT) evaluation in the following Creatio Academy article: https://academy.creatio.com/documents/customer-center/7-15/customer-sat…

 

Please, let us know in case you have any further questions. 

 

Best regards, 

Olga Avis. 

Olga Avis,

Thanks Olga

Show all comments

Hi,

Is it possible to register multiple email ids for sending bulk emails, for e.g. marketing@domain.com and newsletters@domain.com.

Like 0

Like

2 comments

Hi Krishna,

 

Yes, it is possible. You need to simply add your @domain.com domain to the system, verify it (describe here) and then specify either marketing@domain.com or newsletters@domain.com as an email sender (see the "Sender's email" description here), verify the sender then (once you click on "Start sending" you will receive a notification that email address should be confirmed and you need to go to the mailbox which you've specified as a sender email and find a verification email from the provider and go via the link specified in that email) and as a result you will have two mailboxes for marketing mailing.

 

Best regards,

Oscar

Oscar Dylan,

Thanks Oscar for quick clarification.

Show all comments

Dear mates,

I would like to modifiy our timelines on differents pages.

I try to follow the guide: https://academy.creatio.com/documents/technic-sdk/7-13/timeline-tab

But i can not access the database to do the modifications.

How can we have an access to the database ?

Thanks,

Nicolas

Like 0

Like

1 comments

Hello Nicolas,

 

This method is only good for the development environments deployed on-site. Since the modifications are implemented directly in the database, they are not bound to any package. That is why the modifications will not be implemented in the database if the package with the view models and the tile view models is installed into another application. For the correct transfer of the developed functions, you need to bind the SQL-scripts that implement the corresponding modifications in the database when installing the package.

 

Best regards, 

Olga. 

Show all comments