Symptoms

An error occurs while adding the "Feed" section to the new workplace in the mobile application wizard.

Solution

1. Add the following code in the schema settings of the "Feed" section grid (UsrMobileSocialMessageGridPageSettingsSupervisorworkplace):

{
    "operation": "insert",
    "name": "e0de54d7-b417-42b1-8081-36337aa344a1",
    "values": {
        "row": 0,
        "content": "Created by",
        "columnName": "CreatedBy",
        "dataValueType": 1,
        "operation": "insert"
    },
    "parentName": "settings",
    "propertyName": "items",
    "index": 1
}

2. Change the Message column proprety ("row") to "1" in the settings above. 

"row": 1,

 

Like 0

Like

Share

0 comments
Show all comments

Question

How can i hide the [Edit] button for portal users?

Answer

setIsEditTemplateButtonVisible: function(scope) {
var select = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "SysAdminUnit"
});
 
select.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "Id");
select.addColumn("ConnectionType");
 
var filters = Ext.create("Terrasoft.FilterGroup");
filters.addItem(select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id",
    scope.Terrasoft.SysValue.CURRENT_USER.value));
select.filters = filters;
 
select.execute(function(response) {
    if (response.success) {
        if (response.collection.getCount() > 0) {
            var connectionType = response.collection.getByIndex(0).get("ConnectionType");
            if(connectionType === 1){
                scope.set("isEditTemplateButtonVisible", false);
            }else{
                scope.set("isEditTemplateButtonVisible", true);
            }
        }
    }
}, this);

 

Like 0

Like

Share

1 comments

Hi S.Kobizka,

Please confirm where this code we can update?

also please guide, how to add custom button on customer portal dashboard, on click it should open create form of a oob/custom module

 

Regards

Show all comments

Question

How can I pass an account identifier from an order page to the "Product in the order" detail edit page via sandbox messages?

Answer

The code of the order page replacing schema:

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
    return {
        entitySchemaName: "Order",
        details: /**SCHEMA_DETAILS*/{
        }/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
        ]/**SCHEMA_DIFF*/,
        attributes: {},
        methods: {
            onEntityInitialized: function() {
                this.callParent(arguments);
                this.sandbox.subscribe("OrderProductPageAsksForData", function(arg) {
                    console.log("OrderProductPageV2 requests data immediately,");
                    console.log("по Id песочницы: " + arg.sandboxId);
                    // Sending data.
                    this.sendDataToOrderProductPage(arg.sandboxId);
                }, this, [this.sandbox.id]);
                console.log("Мы(OrderPageV2) subscribed to message: OrderProductPageAsksForData.");
                console.log("sandbox Id in this page(OrderPageV2) next:");
                console.log(this.sandbox.id);
            },
            sendDataToOrderProductPage: function(sandboxId) {
                this.sandbox.publish("DataToOrderProductPage", { accountId: this.get("Account").value }, [sandboxId]);
                console.log("AccountId sent as a message to OrderProductPageV2 по Id: " + sandboxId);
            }
        },
        rules: {},
        messages: {
            "DataToOrderProductPage": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            },
            "OrderProductPageAsksForData": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.SUBSCRIBE
            }
        },
        userCode: {}
    };
});

The code of the "Product in order" detail page replacing schema:

define("OrderProductPageV2", ["BusinessRuleModule", "OrderUtilities"],
    function(BusinessRuleModule) {
        return {
            entitySchemaName: "OrderProduct",
            mixins: {},
            attributes: {},
            methods: {
                onEntityInitialized: function() {
                    this.callParent(arguments);
                    this.sandbox.subscribe("DataToOrderProductPage", function(arg) {
                        console.log("OrderPageV2 passes the data over to us!");
                        alert("accountId: " + arg.accountId);
                    }, this, [this.sandbox.id]);
                    console.log("Мы(OrderProductPageV2) subscribed to message: DataToOrderProductPage.");
                    console.log("По нашему(OrderProductPageV2) sandbox Id:");
                    console.log(this.sandbox.id);
                    this.sandbox.publish("OrderProductPageAsksForData", {
                        sandboxId: this.sandbox.id
                    }, [this.getOrderPageSandboxId()]);
                    console.log("Requested data from OrderPageV2, as per its sandbox Id: " + this.getOrderPageSandboxId());
                },
                getOrderPageSandboxId: function() {
                    var index = this.sandbox.id.indexOf("_detail_ProductInProducts");
                    return this.sandbox.id.substring(0, index);
                }
            },
            messages: {
                "DataToOrderProductPage": {
                    mode: Terrasoft.MessageMode.PTP,
                    direction: Terrasoft.MessageDirectionType.SUBSCRIBE
                },
                "OrderProductPageAsksForData": {
                    mode: Terrasoft.MessageMode.PTP,
                    direction: Terrasoft.MessageDirectionType.PUBLISH
                }
            },
            diff: /**SCHEMA_DIFF*/[
            ]/**SCHEMA_DIFF*/,
            rules: {
            }
        };
    }
);

 

Like 0

Like

Share

0 comments
Show all comments

Add code below into methods section and bind openInputBox method.

Example: lookup fields to Contact and Account tables.

Pre-condition: add localizableStrings to your schema (UsrContactCaption, UsrAccountCaption, UsrInputBoxCaption).

openInputBox: function() {
    this.set("UsrContactCollection", new Terrasoft.Collection());
    this.set("UsrAccountCollection", new Terrasoft.Collection());
    this.set("UsrContact", null);
    this.set("UsrAccount", null);
    var controls = {
        "UsrContact": {
            dataValueType: Terrasoft.DataValueType.ENUM,
            isRequired: true,
            caption: resources.localizableStrings.UsrContactCaption,
            value: {
                bindTo: "UsrContact"
            },
            customConfig: {
                tag: "Contact",
                list: {
                    bindTo: "UsrContactCollection"
                },
                prepareList: {
                    bindTo: "getCollectionValues"
                },
                loadNextPage: {
                    bindTo: "loadCollectionNextPage"
                }
            }
        },
        "UsrAccount": {
            dataValueType: Terrasoft.DataValueType.ENUM,
            isRequired: true,
            caption: resources.localizableStrings.UsrAccountCaption,
            value: {
                bindTo: "UsrAccount"
            },
            customConfig: {
                tag: "Account",
                list: {
                    bindTo: "UsrAccountCollection"
                },
                prepareList: {
                    bindTo: "getCollectionValues"
                },
                loadNextPage: {
                    bindTo: "loadCollectionNextPage"
                }
            }
        }
    };
    Terrasoft.utils.inputBox(resources.localizableStrings.UsrInputBoxCaption,
        this.openInputBoxHandler,
        [Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL],
        this,
        controls
    );
    Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item) {
        item.control.bind(this);
    }, this);
},
getCollectionValues: function(filter, list, tag) {
    if (Ext.isEmpty(list)) {
        return;
    }
    list.clear();
    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: tag,
        isPageable: true,
        rowCount: 20
    });
    this.buildCollectionQuery(esq, list, filter, tag);
},
loadCollectionNextPage: function(listParams, tag) {
    if (!this.get("CanLoadMore" + tag)) {
        return;
    }
    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: tag,
        isPageable: true,
        rowCount: 20,
        rowsOffset: listParams.listView.collectionItemsCount
    });
    this.buildCollectionQuery(esq, listParams.list, listParams.filterValue, tag);
},
buildCollectionQuery: function(esq, list, filter, tag) {
    esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "value");
    var orderColumn = esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "displayValue");
    orderColumn.orderDirection = Terrasoft.OrderDirection.ASC;
    esq.filters.addItem(esq.createPrimaryDisplayColumnFilterWithParameter(
        Terrasoft.ComparisonType.START_WITH, filter, Terrasoft.DataValueType.TEXT));
    esq.getEntityCollection(function(response) {
        if (response && response.success) {
            var preObject = {};
            response.collection.each(function(item) {
                preObject[item.get("value")] = item.values;
            }, this);
            list.loadAll(preObject);
            this.set("CanLoadMore" + tag, response.collection.getCount() === 20);
        }
    }, this);
},
openInputBoxHandler: function(returnCode, controlData) {
    if (Terrasoft.MessageBoxButtons.OK.returnCode === returnCode) {
        // TODO: your code here
    }
}

 

Like 0

Like

Share

2 comments

Hi 

I am using [Country ] and [City] lookup in the input box, But I have to apply the filter on these lookup. 



How is it possible to apply filter on lookups fields in input box ?



Many Thanks.

Dear Akshit,

 

In order to apply filtration over a lookup field in the InputBox please add the following code to the “buildCollectionQuery” method:



            buildCollectionQuery: function(esq, list, filter, tag) {

               esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "value");

               var orderColumn = esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "displayValue");

               orderColumn.orderDirection = Terrasoft.OrderDirection.ASC;

               esq.filters.addItem(esq.createPrimaryDisplayColumnFilterWithParameter(

                   Terrasoft.ComparisonType.START_WITH, filter, Terrasoft.DataValueType.TEXT));

               esq.filters.addItem(esq.createColumnInFilterWithParameters("Name",

               ["Australia", "United States"]));


               esq.getEntityCollection(function(response) {

                   if (response.success) {

                       var preObject = {};

                       response.collection.each(function(item) {

                           preObject[item.get("value")] = item.values;

                       }, this);

                       list.loadAll(preObject);

                       this.set("CanLoadMore" + tag, response.collection.getCount() === 20);

                   }

               }, this);

            },



Please see the screenshot with the result https://prnt.sc/rtvqvm 



Additionally, please find more information about filtration in esq in the article by the link below:



https://academy.creatio.com/documents/technic-sdk/7-15/entityschemaquery-class-filters-handling

 

Best regards,

Norton

Show all comments

Case description

We want to show Printables (“PRINT” button with printables) for Portal user.

It looks like this:

In a page:

Algorithm of realization.

  1. Give portal user read access permissions to the objects:

1)      Printable (SysModuleReport)

2)      Tables of printable (SysModuleReportTable)

3)      Printable form type (SysModuleReportType)

4)      Section object (SysModuleEntity)

 

How to give read access permissions?

1)      In object you should set ON access by operations and publish object:

 

2) On “Objects permissions” tab in configuration add roles “All portal users” and “All employees” for this object and manage access level for them:

 

        2. In Lookups section find lookup “List of objects available for portal users” and add your objects:

The same operations you should to do for objects from step 1 (SysModuleReport, SysModuleReportTable, SysModuleReportType, SysModuleEntity).

After that clear redis and clear cache in the section and page where should show printables:

Like 0

Like

Share

2 comments

This was working for us till version 7.12.2.1728



Support states: "For now, printables are not yet compatible with the Creatio portal. Yes, they could be added to the portal but we cannot guarantee that they will work as expected."



So hoping it can be resolved soon.

in the latest version too we are unable to view the print option for the portal user though the object permission has been provided for SysModuleReport, SysModuleReportTable, SysModuleReportType, SysModuleEntity. any update from creatio?

 

Show all comments

Question

How can I hide the [Add] buttons for some section types?

Answer

Create the section replacing schema:

define("DocumentSectionV2", ["VisaHelper", "ConfigurationConstants", "BaseFiltersGenerateModule"],
    function(VisaHelper, ConfigurationConstants, BaseFiltersGenerateModule) {
        return {
            entitySchemaName: "Document",
            methods: {
                initEditPages: function() {
                    var enabledEditPages = new this.Terrasoft.Collection();
                    this.callParent(arguments);
                    var editPages = this.get("EditPages");
                    var items = editPages.getItems();
                    for (var i = 0; i < items.length; i++) {
                        if (items[i].values.Id !== "2015b538-40d0-4cbf-9301-fa8cae37ae94") {
                            enabledEditPages.add(items[i]);
                        }
                    }
                    this.set("EnabledEditPages", enabledEditPages);
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "SeparateModeAddRecordButton",
                    "parentName": "SeparateModeActionButtonsLeftContainer",
                    "propertyName": "items",
                    "values": {
                        "controlConfig": {
                            "menu": {
                                "items": {
                                    "bindTo": "EnabledEditPages",
                                    "bindConfig": {
                                        "converter": function(editPages) {
                                            if (editPages.getCount() > 1) {
                                                return editPages;
                                            } else {
                                                return null;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                {
                    "operation": "merge",
                    "name": "CombinedModeAddRecordButton",
                    "parentName": "CombinedModeActionButtonsSectionContainer",
                    "propertyName": "items",
                    "values": {
                        "controlConfig": {
                            "menu": {
                                "items": {
                                    "bindTo": "EnabledEditPages",
                                    "bindConfig": {
                                        "converter": function(editPages) {
                                            if (editPages.getCount() > 1) {
                                                return editPages;
                                            } else {
                                                return null;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

 

Like 0

Like

Share

0 comments
Show all comments

Question

How do I configure the frequency of automatic data synchronization in a mobile application?

Answer

The mobile application supports three types of synchronization:



Offline - to perform synchronization, you must click the sync button.

Offline synchronization in the background - starts when the bpm’online mobile application is minimized and only if the “Automatic synchronization” setting corresponds to the current status of the Internet connection.

Online - synchronization occurs during every interaction with a record in the mobile appication.

About filters that apply to displayed activities:

  • Activity must not be closed
  • Non-email activity
  • The user of the mobile application is in the activities.

Also, the filters of the mobile application interface are applied:

Activity date - depending on the filter set by date

"Display in schedule" checkbox

Like 0

Like

Share

0 comments
Show all comments

Question 

I have a problem with uploading images after adding the standard functionality of "Notes". Notes are added to a detail. A separate object is created for the detail. Notes are added to the detail page schema as follows: the text is saved, images are not even uploaded. The insertImagesToNotes  method is not executed. Why?

Answer

The base detail, which all the rest of details are inherited from, does not have the necessary attributes, methods and mixins. Unlike pages that are inherited from BaseModulePageV2.

You can fix this by viewing at what has been implemented in BaseModulePageV2 and reproducing it in your detail. Create the detail object based on Base object with notes (Base) and create a detail based on this object via the detail wizard.

Add the following in the configurator page schema:

1. Dependency of requirejs from NotesUtilities ;

2. The following attribute:

attributes: {
    "NotesImagesCollection": {dataValueType:Terrasoft.DataValueType.COLLECTION}
},

3. The mixin:

mixins: {
    NotesUtilities: "Terrasoft.NotesUtilities"
},

4. The methods:

methods: {
        onNotesImagesUploadComplete: function() {
                this.hideBodyMask();
                this.updateFileDetail();
        },
        onNotesImagesUpload: function() {
                this.showBodyMask();
        },
        init: function(callback, scope) {
                this.callParent(arguments);
               this.mixins.NotesUtilities.initNotesImagesCollection.call(this);
        }
},

5. The notes field in the diff property:

{
        "operation": "insert",
        "parentName": "Header",
        "propertyName": "items",
        "name": "Notes",
        "bindTo": "Notes",
        "values": {
                contentType: Terrasoft.ContentType.RICH_TEXT,
                "layout" : {column: 0, row: 1, colSpan: 24},
                "controlConfig": {
                        "imageLoaded": {
                                "bindTo": "insertImagesToNotes"
                        },
                        "images": {
                                "bindTo": "NotesImagesCollection"
                        }
                }
        },
        "index": 1
}

The test schema code for the detail edit page:

define("UsrUsrMyDetail1Page", ["NotesUtilities"], function() {
	return {
		entitySchemaName: "UsrMyDetail",
		details: {},
		attributes: {
			"NotesImagesCollection": {dataValueType: Terrasoft.DataValueType.COLLECTION}
		},
		mixins: {
			NotesUtilities: "Terrasoft.NotesUtilities"
		},
		diff: [{
			"operation": "insert",
			"name": "UsrIntbcb7788a-2890-4358-bff3-102e82ea7889",
			"values": {
				"layout": {
					"colSpan": 12,
					"rowSpan": 1,
					"column": 0,
					"row": 0,
					"layoutName": "Header"
				},
				"labelConfig": {},
				"enabled": true,
				"bindTo": "UsrInt"
			},
			"parentName": "Header",
			"propertyName": "items",
			"index": 0
		},
		{
			"operation": "insert",
			"parentName": "Header",
			"propertyName": "items",
			"name": "Notes",
			"bindTo": "Notes",
			"values": {
				contentType: Terrasoft.ContentType.RICH_TEXT,
				"layout" : {column: 0, row: 1, colSpan: 24},
				"controlConfig": {
					"imageLoaded": {
						"bindTo": "insertImagesToNotes"
					},
					"images": {
						"bindTo": "NotesImagesCollection"
					}
				}
			},
			"index": 1
		}],
		methods: {
			onNotesImagesUploadComplete: function() {
				this.hideBodyMask();
				this.updateFileDetail();
			},
			onNotesImagesUpload: function() {
				this.showBodyMask();
			},
			init: function(callback, scope) {
				this.callParent(arguments);
				this.mixins.NotesUtilities.initNotesImagesCollection.call(this);
			}
		},
		rules: {}
	};
});

 

Like 0

Like

Share

0 comments
Show all comments

Question

How can I filter a field by the "Exists " filter with a parameter (another field value)?

Answer

Example of implementation the "Exists " filter:

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
    "rootSchemaName": "Account"
});
// add the request columns
esq.addColumn("Id");
...
// filtering condition for using inside of "exists"
// searchValue - value for comparing with the SearchNumber column
var subFilters = Terrasoft.createFilterGroup();
subFilters.addItem(Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL, "SearchNumber", searchValue));
// add the exists-filter with a condition to the esq filter collection
var filters = esq.filters;
filters.add(Terrasoft.createExistsFilter("[AccountCommunication:Account:Id].Id", subFilters));
//receive the request value
esq.getEntityCollection(function(result) {
...
}, this);

As a result, the following request will be sent to the server:

SELECT Id, ... FROM Account
WHERE EXISTS 
(SELECT
[SubAccountCommunication].[Id] [Id]
FROM
[dbo].[AccountCommunication] [SubAccountCommunication] WITH(NOLOCK)
WHERE
[SubAccountCommunication].[AccountId] = [Account].[Id]
AND [SubAccountCommunication].[SearchNumber] = @P1
)

The @P1 parameter will store the searchValue value passed over to the filtering condition.

Like 1

Like

Share

0 comments
Show all comments

Question

How can I execute an SQL-query (reading, adding, deleting) in the database On-demand?

It can be useful if a user does not have access to database but needs to read or add some data in the table.

Answer

Import the schema from the attached file. Publish and run it.

File attachments
Like 0

Like

Share

0 comments
Show all comments