Can I make details records editable based on conditions? For example, records with colA=1 can be modified, but records with colA<>1 cannot.

Like 0

Like

2 comments

Try to add async validators into the edit page linked to the detail. 

Please investigate the asyncValidate in the BaseEntityPage and the asyncValidate method in the AccountPageV2. 

You'll probably need "messages" to get information from the detail main page. 

https://academy.bpmonline.com/documents/technic-sdk/7-14/messages-messages-property

Show all comments
Question

I was successfully able to work a DevExpress Report. However, Im not sure how to link the report to a printable. How can I do so?

Like 0

Like

1 comments

Hello Zeinab!

To link your report with printable you need to find [Printables] lookup, open it and add a new one with [DevExpress] option. Fill all the required fields and select your report in [Template] field.

Show all comments

Hi everyone,

I'm facing a problem in the business process , when I try to save the business process element , the following message appears: ' Error occurred when saving : Collection item  with unique identifier not found '

Like 0

Like

0 comments
Show all comments

Hi;

After migration to higer verson one of process stop working

Here is part of trace.

 

{

"Element parameters": [

{

"Parameter": "GroupGuid_Out",

"Value": {

"Before execution": "00000000-0000-0000-0000-000000000000",

"After execution": "00000000-0000-0000-0000-000000000000"

}

},

{

"Parameter": "GroupName_IN",

"Value": {

"Before execution": null,

"After execution": null

}

}

],

the GroupName_In is null but in designt it is set

 

Thanks in advance

Tomek

 

 

Like 0

Like

0 comments
Show all comments

Hi;

What else should cause such error.

I have an edit page with detail.

I whould like to edit detil page but i get such error

Like 0

Like

8 comments

Dear Tomasz,

Please set up package dependencies for your Claim package. The package should depend on the following packages:

MarketingSoftkeyEnu

OrderInSales_OperatorSingleWindow_Softkey_ENU

SalesEnterprise_Marketing_ServiceEnterprise

SalesEnterpriseSoftkey_EN

ServiceEnterpriseSoftkey

Custom package should depend on your package.

Regards,

Anastasia

Anastasia Botezat,



thanks Anastasia

Claim Package is on the bottom of dependency schema (See second attachment). and all the entities are in ClaimEntities package which is up on schema. Others details i can edit but just this one rise an exeption



Regards

Tomek

tomasz.branicki,

Сustom package, should be the last one in dependency tree. After custom should be your package. Your package, should depend on the above mentioned packages. 

The detail, which gives you the error can have logic indicated in basic package, which your package "do not see", since it does not depend on it. 

Also, seems the second attachment was not linked to your post, I cannot find it.

Please double check that your package is second from the bottom.

In case everything is set up correctly, please write us an email support@bpmonline.com, so we could check on your side.

Regards,

Anastasia

Thanks

I send the dependencies scema as attachment now

 

Regards

Toek

Dear Anastasia Botezat,

​​​​​​What is the right technique I should follow in order to select the appropriate dependencies when creating a  new custom package?

Ricardo Bigio,

 

The technique is as follows:

 

1) Your package should depend on all the packages specified by Anastasia

2) The Custom package should depend on your package

3)  Make sure that there are no cyclic connections between packages (that could create a loop).

 

Also please take a look at this article that describes creating your own package for the development of new functionality and also this article about package dependencies.

 

Best regards,

Oscar

Oscar Dylan,

ok, but my question is how Anastasia has arrived to that list of dependencies. When I am creating a new package - any package - how do I know its dependencies ? is there a way I can do it by myself ? Or the right procedure is to add a post here for that ?

Best regards,

Ricardo Bigio,

 

The Anastasia's list of packages is the set of basic root packages that should be present in your package list of dependencies. These root packages depend on all other system packages and that's why your package should depend on these root packages. There is no standard technique here,  you need to explore the hierarchy tree and find root packages. Please see the "DEPENDENCIES AND PACKAGE HIERARCHY" paragraph in the article 

https://academy.creatio.com/documents/technic-sdk/7-15/package-dependencies?_ga=2.217093974.1997918667.1589385916-1029973157.1589363839 so to understand the basic logic of the packages hierarchy.

 

Best regards,

Oscar

Show all comments

we need to customize the modal box shown when we need to select for example Account lookup, by adding fixed filters on the top then the search button gets Accounts based on this filter.

Also can we hide the New Button here ?

will this customization affect other lookup selection modal box? 

if this is not applicable is there any other approach ? 

 

Like 0

Like

6 comments

Dear Ayman,

You can add a fixed filter to the lookup page, however, this requires development skills. Please see this article with instructions: 

https://academy.bpmonline.com/documents/technic-sdk/7-13/adding-quick-filter-block-section

The schema you would need to modify is LookupPageViewGenerator. Please note, that applied changes would be displayed for all sections and each place where you use lookup page.

In order to remove New button, you need to override the getSelectionControlsConfig and getEditionControlsConfig methods on LookupPageViewGenerator schema and remove add button from there.

As an alternative approach, you can apply business rule on the field and in this case lookup would be automatically filtered. 

Regards,

Anastasia

Hi Anastasia,

I can't create "replacing client module" with parent is LookupPageViewGenerator. How can I "modify" it as you said? I found lookup Brand and Category in ProductPageV2 which hide button "New" when open its lookup modal. How can I see their source code?

Thanks

Anastasia Botezat,

Please help

Toan Mai,

Hello!



If you want to hide 'NEW' button you can simply add  "hideActions": true to your lookuplistconfig property of the attribute correspondent to lookup field.



Please see snippet below:

define("OrderPageV2", [], function() {
	return {
		entitySchemaName: "Order",
		attributes: {
			"Opportunity": {
				"lookupListConfig": {
					"hideActions": true
				}
			}
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});



It will however also hide actions drop down, but this drop down is also connected to crud operations within lookup field.



See result here:

https://prnt.sc/px04je

 

 

Dmytro Smishchenko,

This solution seems to work on lookup object in Order section. How can we implement the same on the Detail ?

hi ayman ,  can you send me code for this model box

Show all comments
Question

In the out of the box functionality i can prevent the user from deleting contacts by configuring the object permissions.

Can we prevent deleting a specific type of contacts? Let us say those who are males?

Like 0

Like

1 comments

Dear Mortada,

You can add such logic on the client side of your application or add a trigger to the database. 

In case you decide to choose client side realization, than you need to create a replacing client module for ContactSectionV2 and override basic deleteRecords method. Add an if clause to check whether record meets requirements to be deleted. 

In case you want to choose database trigger, than draw your attention to the before delete triggers.

Regards,

Anastasia

Show all comments

When I prevent a specific user from deleting records of a specific section. Let us say, User A cannot delete contacts. After configuring this in object permission:

Login using User A, go to contact page, select a record, you will still be able to see the Delete button but you will not be able to delete.

Is there any settings to let the delete button be automatically hidden when there is insufficient permissions?

Like 0

Like

1 comments

Hello,

After denying access to delete records from a section - delete button won't disappear and user will be able to click it, but there will be a popup stating that this user has no rights to perform this action.

Unfortunately there is no system setting that declares button disappearing when denying access rights are configured for a record to be deleted and this logic can be achieved only via additional development. Here are community articles that describe how to hide a button on a page here, here, here, here and here. I will also create a suggestion to our R&D team so they could implement this login in out-of-the-box version in future.

Thank you for helping us to make our application better!

Best regards,

Oscar

Show all comments

Is it possible to create an editable list on section page, just like on details or in the lookup section? For small entities dealing with a list directly might be more user friendly than using the edit page.

Like 0

Like

5 comments

Dear Carlos, 

Please see the example below, hope you find it helpful:

define("ActivitySectionV2", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
    function() {
        return {
            entitySchemaName: "Activity",
            messages: {},
            mixins: {
                ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
            },
            attributes: {
                IsEditable: {
                    dataValueType: Terrasoft.DataValueType.BOOLEAN,
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    value: true
                }
            },
            methods: {
                edit: function() {
                    var procElId = this.getActiveRow().get("ProcessElementId");
                    var recordId = this.get("ActiveRow");
                    if (procElId &amp;&amp; !this.Terrasoft.isEmptyGUID(procElId)) {
                        this.sandbox.publish("ProcessExecDataChanged", {
                            procElUId: procElId,
                            recordId: recordId,
                            scope: this,
                            parentMethodArguments: null,
                            parentMethod: function() {
                                return false;
                            }
                        });
                        return true;
                    }
                    this.editRecord(recordId);
                },
                editRecord: function(primaryColumnValue) {
                    this.Terrasoft.chain(
                        function(next) {
                            var activeRow = this.findActiveRow();
                            this.saveRowChanges(activeRow, next);
                        },
                        function() {
                            var activeRow = this.getActiveRow();
                            var typeColumnValue = this.getTypeColumnValue(activeRow);
                            var schemaName = this.getEditPageSchemaName(typeColumnValue);
                            this.openCardInChain({
                                id: primaryColumnValue,
                                schemaName: schemaName,
                                operation: Terrasoft.ConfigurationEnums.CardOperation.EDIT,
                                moduleId: this.getChainCardModuleSandboxId(typeColumnValue)
                            });
                        }, this);
                },
                addRecord: function(typeColumnValue) {
                    if (!typeColumnValue) {
                        if (this.get("EditPages").getCount() &gt; 1) {
                            return false;
                        }
                        var tag = this.get("AddRecordButtonTag");
                        typeColumnValue = tag || this.Terrasoft.GUID_EMPTY;
                    }
                    this.addRow(typeColumnValue);
                },
                copyRecord: function(primaryColumnValue) {
                    this.copyRow(primaryColumnValue);
                },
                getGridRowViewModelConfig: function() {
                    var gridRowViewModelConfig =
                        this.mixins.GridUtilities.getGridRowViewModelConfig.apply(this, arguments);
                    Ext.apply(gridRowViewModelConfig, {entitySchema: this.entitySchema});
                    var editPages = this.get("EditPages");
                    this.Ext.apply(gridRowViewModelConfig.values, {HasEditPages: editPages &amp;&amp; !editPages.isEmpty()});
                    return gridRowViewModelConfig;
                },
                getGridRowViewModelClassName: function() {
                    return this.mixins.GridUtilities.getGridRowViewModelClassName.apply(this, arguments);
                },
                onRender: function() {
                    this.callParent(arguments);
                    if (!this.get("Restored")) {
                        this.reloadGridColumnsConfig(true);
                    }
                },
                getDefaultGridColumns: function() {
                    var systemColumns = this.systemColumns;
                    var allowedDataValueTypes = this.get("AllowedDataValueTypes");
                    var entitySchema = this.entitySchema;
                    var entitySchemaColumns = [];
                    Terrasoft.each(entitySchema.columns, function(column, columnName) {
                        if (Ext.Array.contains(systemColumns, columnName) ||
                            !Ext.Array.contains(allowedDataValueTypes, column.dataValueType)) {
                            return;
                        }
                        entitySchemaColumns.push(column);
                    }, this);
                    var primaryDisplayColumnName = entitySchema.primaryDisplayColumnName;
                    entitySchemaColumns.sort(function(a, b) {
                        if (a.name === primaryDisplayColumnName) {
                            return -1;
                        }
                        if (b.name === primaryDisplayColumnName) {
                            return 1;
                        }
                        return 0;
                    }, this);
                    return (entitySchemaColumns.length &gt; 4) ? entitySchemaColumns.slice(0, 4) : entitySchemaColumns;
                },
                onActiveRowAction: function() {
                    this.mixins.ConfigurationGridUtilities.onActiveRowAction.apply(this, arguments);
                    this.callParent(arguments);
                },
                onActiveRowAction: function(buttonTag, primaryColumnValue) {
                    switch (buttonTag) {
                        case "card":
                            this.edit();
                            break;
                        case "copy":
                            this.copyRecord(primaryColumnValue);
                            break;
                        case "remove":
                            this.deleteRecords();
                            break;
                        case "cancel":
                            this.discardChanges(primaryColumnValue);
                            break;
                        case "save":
                            this.onActiveRowSave(primaryColumnValue);
                            break;
                    }
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "DataGrid",
                    "values": {
                        "className": "Terrasoft.ConfigurationGrid",
                        "generator": "ConfigurationGridGenerator.generatePartial",
                        "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
                        "changeRow": {"bindTo": "changeRow"},
                        "unSelectRow": {"bindTo": "unSelectRow"},
                        "onGridClick": {"bindTo": "onGridClick"},
                        "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
                        "activeRowAction": {"bindTo": "onActiveRowAction"},
                        "multiSelect": {"bindTo": "MultiSelect"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionSave",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "save",
                        "markerValue": "save",
                        "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                    }
                },/*
                {
                    "operation": "insert",
                    "name": "activeRowActionCopy",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "copy",
                        "markerValue": "copy",
                        "imageConfig": {"bindTo": "Resources.Images.CopyIcon"}
                    }
                },*/
                {
                    "operation": "insert",
                    "name": "activeRowActionCard",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "card",
                        "markerValue": "card",
                        "visible": {"bindTo": "HasEditPages"},
                        "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionCancel",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "cancel",
                        "markerValue": "cancel",
                        "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionRemove",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "remove",
                        "markerValue": "remove",
                        "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                    }
                },
                {
                    "operation": "remove",
                    "name": "DataGridActiveRowOpenAction"
                },
                {
                    "operation": "remove",
                    "name": "DataGridActiveRowCopyAction"
                },
                {
                    "operation": "remove",
                    "name": "DataGridActiveRowDeleteAction"
                },
                {
                    "operation": "remove",
                    "name": "ProcessEntryPointGridRowButton"
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

Regards,

Anastasia

Anastasia Botezat,

Thank you

Anastasia Botezat,



Can we display a list in modal?

 

Best Regards,

Solem A,

Solem Khan Abdusalam,

 

Hard to say. There should be "ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities" modules added as dependencies to the module of your modal window and then the grid should be added to the modal box diff. But this approach should be tested.

 

Best regards,

Oscar 

Hi,

 

I've tested the code and it works ok, but I've noticed that if you open a page and after when you want to close it, you need to click twice on close button. Did someone faced similar behavior, or knows the reason why it happens?

 

Best regards,

Jelena

Show all comments

Hi team,

 

I need to transfer all the data bindings from custom to new package . 

Kindly provide your recommended steps .

 

regards,

sethuraghav N

Like 0

Like

1 comments

Hello!

Here is an article that explains how to transfer binding custom package data to the new package. Please pay attention to point #5 in this article.

Best regards, Anastasia

Show all comments