Hello,

There are fields that ONLY Admin users have the rights to modify.

 

Using a Business Rule, we can Identify WHO can Edit the field.

 

When I'm hardcoding the Email of the Admin...it works.

But If I try to use the Role (System Administrators)...it doesn't work.

 

Is this a limitation or something that is not properly configured in our roles ?

 

Like 0

Like

2 comments

Hello Francois,

 

As of now, the business rules don't work with roles. You can only use users instead of roles, but in this case, you'll have to create each business rule for each user. 

 

We already have a query registered for our responsible R&D team to implement the described functionality in the upcoming versions of the application. 

I will add this case to the query in order to increase its priority.

 

Best regards,

Anastasiia

 

Hello Francois,

 

The better way to achieve Your requirement is Object Permission settings (Use column permission). Have a look following printscreen as a example how to grand access to "All employees " to only read Account Name and for "System administrators" to read and edit.

https://ibb.co/n0TCVBP

 

Best regards,

Marcin

Show all comments

Hello everyone,

i got some trouble here and the message is :

Server Error in '/0' Application.
Instance of workspace item with type "Terrasoft.Configuration.TgAcceptanceCoverageAndObjectSchema" cannot be obtained from server metadata
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
 
Exception Details: Terrasoft.Common.NullOrEmptyException: Instance of workspace item with type "Terrasoft.Configuration.TgAcceptanceCoverageAndObjectSchema" cannot be obtained from server metadata
 
Source Error:
 
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
 
Stack Trace:
 
 
[NullOrEmptyException: Instance of workspace item with type "Terrasoft.Configuration.TgAcceptanceCoverageAndObjectSchema" cannot be obtained from server metadata]
   Terrasoft.Core.Entities.EntitySchemaManager.InitializeSchema(ISchemaManagerItem schemaManagerItem, Assembly assembly) +221
   Terrasoft.Core.SchemaManagerItem`1.get_Instance() +208
   Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid) +96
   Terrasoft.Configuration.ConfigurationSectionHelper.InnerGetEntitiesStructure(UserConnection userConnection, IEnumerable`1 entityNames) +4871
   Terrasoft.Configuration.ConfigurationSectionHelper.GetConfigurationStructuresScripts(UserConnection userConnection) +80
   Terrasoft.Configuration.ConfigurationSectionHelper.GetConfigurationScript(UserConnection userConnection) +202
   Terrasoft.WebApp.Nui.ViewModuleHelper.CreateModulesConfigScript(UserConnection userConnection, HttpResponseBase response) +160
   Terrasoft.WebApp.Nui.ViewModule.SetupModulesConfig() +76
   Terrasoft.WebApp.Nui.ViewModule.Page_Load(Object sender, EventArgs e) +171
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +154
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4082

Do you have any idea guys for solve this error? thank you

Like 5

Like

0 comments
Show all comments

Hi,

 

I am trying to set up a print template for [Contact section]. 

One of the details I want to print out is the phone number which is listed in the field 'communication option' of [Contact section]

I am trying to find that info in 'set up report data' in the printables reports but can not see the data

 

Any one can help please

 

Thanks

Like 0

Like

1 comments
Best reply

Hello Minh,



Try do not to use the "contact communication option" object.

You can find the phone number directly in the contact object:





Best regards,

Bogdan

Hello Minh,



Try do not to use the "contact communication option" object.

You can find the phone number directly in the contact object:





Best regards,

Bogdan

Show all comments

Hello, I created a lookup in the Contact section. I added data into it from the Lookups section. I got a foreign key error while selecting the data entered in the Contact section. I updated the table I created from the Configuration section. Again nothing happened. I deleted Lookup. I removed the relevant column from the contact table. I wanted to delete the relevant section in Configuration, but I got the error "Unable to delete item, because there are items that depend on it". I think I removed the relevant dependencies. How can I learn? Now the system is constantly logout.

Like 0

Like

3 comments

Hello, 

 

Please provide us with a screenshot of the full error message, so we'll be able to advise you accordingly. 

 

Best regards, 

Anastasiia

 When I try to open it or the update, it crashes and logout of the system. 

Aygen Ergen,

 

 

Please try to Update the DB structure for the object that has an error as shown on the screenshot below:

 

And after that generate the source code for all schemas and "Compile all" from the Configuration section. It should resolve the issue. 

Best regards, 

Anastasiia

Show all comments

 

Hi Team,

 

We are trying to configure the organisational structure and need to understand how the hierarchy [access] will be passed on in the structure, whether the access/configured from higher level to lower level in the organisational structure or the opposite needs to be set up.

 

For example, consider the below structure for a bank from higher level to lower level.

 

GM’s

BM’s

HOPO’s

HOCO’s

RM’s

RO’s

 

We would like to understand on how the structure needs to be designed in the Organisation role page, so that the GM’s can view all the activity performed below his role and similarly the role below the GM’s can only get access to the role below them.

 

GM’s

         BM’s

                  HOPO’s

                               HOCO’s

                                            RM’s

                                                     RO’s

 

Do we design it in the above way, were GM division/organisation is created followed by the other division within the others.

 

For example,  we assigned one workspace to RO role and another workplace to RM. Ideally, the workplace associated to RO should be accessible to RM as they’re higher in level to RO’s but the opposite happens. The RO is able to view his/her workplace associated and also the work place associated to RM’s. Whereas the RM’s are able to view only their workplace but not the work place associated to the RO’s who are below in the organisational structure.

 

Or for example, say Ro’s have access to 10 contacts and RM’s have access to 10 different contacts but based on the above structure, RM’s should be able to see the 10 contacts associated to RO’s but it is not viewable but instead the RO’s are able to view the 10 contact associated to RM’s.

 

So, our confusion here is then the organisation structure design needs to be from lower level to higher level as 

 

RO’s

         RM’s

                  HOCO’s

                                HOPO’s

                                              BM’s

                                                       GM’s

 

By the above design, the GM’s will be ale to view all the values/access provided to the other roles and accordingly the other roles are able to view the respective roles above them.

Like 0

Like

0 comments
Show all comments

Hi Team,

We have a business use-case like enabling the MiniPage (View Mode) in the activity section based on conditions. I have enabled the view mode of the MiniPage, now I am able to see the mini page for all the records. But I need to show it for the records based on some conditions like (Eg: Title = "Appointment").



How to achieve this kind of implementation?



Regards,

Adharsh S

Like 0

Like

5 comments
Best reply

Hi Adharsh,

 

The logic below will make a mini page in view mode not appear on the page in case the title of the activity contains the "Visit" word.

 

Create a replacing view model for the ActivitySectionV2 and add the following code there:

define("ActivitySectionV2", [],
	function() {
		return {
			entitySchemaName: "Activity",
			attributes: {
				"ResultGridSet": {
					"dataValueType": this.Terrasoft.DataValueType.TEXT,
					"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					"value": ""
				}
			},
			mixins: {},
			methods: {
				onGridDataLoaded: function(response){
					this.callParent(arguments);
					var subjectsToExclude = "";
					Terrasoft.each(response.collection.getItems(),function(item){
						var activityTitle = item.values.Title;
						var activityId = item.values.Id;
						if (activityTitle.indexOf("Visit")!= -1){
							subjectsToExclude = subjectsToExclude + activityId +",";
						}
					});
					subjectsToExclude = subjectsToExclude.substring(0, subjectsToExclude.length - 1);
					this.set("ResultGridSet", subjectsToExclude);
				},
				prepareMiniPageOpenParameters: function(options, entityInfo){
					var rowId = options.rowId;
					var gridSet = this.get("ResultGridSet");
					if (gridSet.indexOf(rowId)!=-1){
						return;
					}
					this.callParent(arguments);
				}
			},
			diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	}
);

The logic is simple:

 

1) onGridDataLoaded method is always called when the grid is loaded in the section. It contains the response argument which contains actual data that is stored in the grid (and we can use it).

 

2) Once onGridDataLoaded is called we take the response and check if the activity title contains the "Visit" word and perform this check for each item in the grid. If the activity title contains the "Visit" word we take an Id value for this activity and add it to the string subjectsToExclude parameter.

 

3) subjectsToExclude parameter result will be then passed to the ResultGridSet attribute that will be then used inside the prepareMiniPageOpenParameters method.

 

4) prepareMiniPageOpenParameters method is the method from base MiniPageUtilities mixin and we need to override its logic in the Activities section. prepareMiniPageOpenParameters has the options argument that is primary data regarding the activity on which the mouseover event was called. We can get the activity id from the options argument and use it further.

 

5) Inside the prepareMiniPageOpenParameters method we get the ResultGridSet attribute value and then check if the Id that was received from options can be found inside the ResultGridSet string. If it can be found the prepareMiniPageOpenParameters does nothing (and as a result the minipage is not opened), else - perform the parent method execution.

 

Feel free to create your own logic based on this example.

 

Best regards,

Oscar

Hi Adharsh,

 

The logic below will make a mini page in view mode not appear on the page in case the title of the activity contains the "Visit" word.

 

Create a replacing view model for the ActivitySectionV2 and add the following code there:

define("ActivitySectionV2", [],
	function() {
		return {
			entitySchemaName: "Activity",
			attributes: {
				"ResultGridSet": {
					"dataValueType": this.Terrasoft.DataValueType.TEXT,
					"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					"value": ""
				}
			},
			mixins: {},
			methods: {
				onGridDataLoaded: function(response){
					this.callParent(arguments);
					var subjectsToExclude = "";
					Terrasoft.each(response.collection.getItems(),function(item){
						var activityTitle = item.values.Title;
						var activityId = item.values.Id;
						if (activityTitle.indexOf("Visit")!= -1){
							subjectsToExclude = subjectsToExclude + activityId +",";
						}
					});
					subjectsToExclude = subjectsToExclude.substring(0, subjectsToExclude.length - 1);
					this.set("ResultGridSet", subjectsToExclude);
				},
				prepareMiniPageOpenParameters: function(options, entityInfo){
					var rowId = options.rowId;
					var gridSet = this.get("ResultGridSet");
					if (gridSet.indexOf(rowId)!=-1){
						return;
					}
					this.callParent(arguments);
				}
			},
			diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	}
);

The logic is simple:

 

1) onGridDataLoaded method is always called when the grid is loaded in the section. It contains the response argument which contains actual data that is stored in the grid (and we can use it).

 

2) Once onGridDataLoaded is called we take the response and check if the activity title contains the "Visit" word and perform this check for each item in the grid. If the activity title contains the "Visit" word we take an Id value for this activity and add it to the string subjectsToExclude parameter.

 

3) subjectsToExclude parameter result will be then passed to the ResultGridSet attribute that will be then used inside the prepareMiniPageOpenParameters method.

 

4) prepareMiniPageOpenParameters method is the method from base MiniPageUtilities mixin and we need to override its logic in the Activities section. prepareMiniPageOpenParameters has the options argument that is primary data regarding the activity on which the mouseover event was called. We can get the activity id from the options argument and use it further.

 

5) Inside the prepareMiniPageOpenParameters method we get the ResultGridSet attribute value and then check if the Id that was received from options can be found inside the ResultGridSet string. If it can be found the prepareMiniPageOpenParameters does nothing (and as a result the minipage is not opened), else - perform the parent method execution.

 

Feel free to create your own logic based on this example.

 

Best regards,

Oscar

Oscar Dylan,

Thanks for the reply.



One small change in the code,

Instead of , var rowId = options.rowId;

You can choose  var rowId = entityInfo.recordId;



Because, options.rowId returns "undefined".



Regards,

Adharsh S

Adharsh,

 

You are welcome.

 

This is strange, in my code options.rowId returned values and entityInfo was always undefined:

Maybe it behaves differently in different sections... Anyway, debugging will always provide a correct way to get the data needed:)

 

Best regards,

Oscar

Oscar Dylan,

 

It is interesting. Might be it behaves differently in different sections. But I see your screenshot, you have debugged in the ActivitySection right. I have implemented the functionality on the same schema page. It seems to be weird behaving different across instances!



Regards,

Adharsh S

Oleg Drobina,



Could you please share how did you debug the client code using IDE.

Creatio doesn't have an article for the de-bugging the JS files in realtime using IDE. If you could share the steps it would be of great help.



BR,

Bhoobalan Palanivelu.

Show all comments

Very strange occurance with our instance.  activities that were created during a 'make recurring' process are not visible in Schedule view when logged in and attempting to look at their own activities.  When others set the owner in the Schedule view in the activity section to the activity owner, the activities are visible.  Has anyone else seen this with this Marketplace add-on?

Like 0

Like

3 comments

Hello Stephen,

 

Kindly note that the add-on was developed for and tested on Creatio desktop.

 

That said, please send us the following details:

 

1. Creatio desktop product and version.

2. Mobile app version and operating system.

 

This information will help us to reproduce the issue and get back to you with feedback.

Thank you:

 

our desktop is Sales Creatio, enterprise edition Version 7.17.1.1363

Mobile OS and app version are Android and v7.18.5

Stephen J Fisher,

Hi Stephen!

Based on the symptoms, I recommend rechecking the ActivityParticipant Detail.

All out-of-the-box filters in the Activity section work with this detail because one activity can have several participants. Maybe there is a problem with the data in this detail.

 

We have also reviewed the add-on and tested it on our site. However, we were unable to reproduce the issue on our end.

 

Possible reasons for this:

1. Non-standard rights settings on ActivityParticipant Detail.

2. Customized Activity \ ActivityParticipant or Recurring Activities logic.

I recommend using the official version of the add-on.

 

Also, you may test your settings on a trial site to pinpoint the bottleneck.

 

Show all comments

Hi,

I am trying to update a lookup field linked to Owner field of Accounts (Lookup to Contacts) for multiple records using an input box, which is added as custom action. But, the list of records are not displaying either by typing in the field or clicking on magnifying glass icon.

 

I have tried multiple way to bind attributes and diff but no progress, therefore I have attached the code snippet of this custom action for reference.

 

I appreciate if you can suggest a way to tackle this issue.

Thanks,

 

File attachments
Like 0

Like

4 comments
Best reply

Hi Kavian,

 

The code below will do the trick:

define("AccountSectionV2", [], function() {
	return {
		entitySchemaName: "Account",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		attributes:{},
		methods: {
			updateAccount: function(callback, autoIds, selectedContact){
				var update = Ext.create("Terrasoft.UpdateQuery", {
                            rootSchemaName: "Account"
                        });
				var filters = Terrasoft.createFilterGroup();
				filters.logicalOperation = Terrasoft.LogicalOperatorType.OR;
				autoIds.forEach(function(item) {
					var accountIdFilter = update.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", item);
					filters.add("AccountIdFilter" + item, accountIdFilter);
				}, this);
				update.filters.add(filters);
				update.setParameterValue("Owner", selectedContact, Terrasoft.DataValueType.LOOKUP);
				update.execute(function(result) {
					callback.call(this, result);
				}, this);
			},
			getSectionActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getButtonMenuItem({
					"Caption": {bindTo: "Resources.Strings.MultiplyChangeAction"},
					"Click": {bindTo: "showOwnerInfo"}
				}));
				return actionMenuItems;
			},
			showOwnerInfo: function() {
                var caption = "Select an owner";
                var ContactList;
                this.set("ContactList", new Terrasoft.Collection());
                var controls = {
                    "Owner": {
                        dataValueType: Terrasoft.DataValueType.ENUM,
                        isRequired: true,
                        caption: "Owner",
                        value: {
                            bindTo: "Contact"
                        },
                        customConfig: {
                            list: {
                                bindTo: "ContactList"
                            },
                            prepareList: {
                                bindTo: "onPrepareContactList"
                            }
                        }
                    }
                };
                var ownerInputBoxHandler = this.ownerInputBoxHandler.bind(this);
                Terrasoft.utils.inputBox(caption, ownerInputBoxHandler, [
					{
						className: "Terrasoft.Button",
						caption: "ASSIGN",
						returnCode: "ok"
					}, "cancel"
				], this, controls);
                Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item){
                    item.control.bind(this);
                }, this);
            },
            onPrepareContactList: function(){
                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" });
                esq.addColumn("Id");
                esq.addColumn("Name");
                esq.getEntityCollection(function(result){
                    if (result.success){
                        var items = {};
                        result.collection.each(function(item) {
                            items[item.get("Id")] = { "value": item.get("Id"), "displayValue": item.get("Name") };
                        }, this);
                    }
                    var list = this.get("ContactList");
                    list.loadAll(items);
                }, this);
            },
            ownerInputBoxHandler: function(tag, data){
				var autoIds = this.getSelectedItems();
				var selectedContact = data.Owner.value;
                if (Terrasoft.MessageBoxButtons.OK.returnCode === tag){
                    if (Ext.isEmpty(selectedContact)){
                        this.showInformationDialog("Field is required", function(){
                            this.showOwnerInfo();
                        });
                    } else {
                        this.updateAccount(function(context, result){}, autoIds, selectedContact);
                    }
                }
            }
		}
	};
});

You will be able to select an owner from contacts:

and the selected records will be updated properly.

 

Best regards,

Oscar

Hi Kavian,

 

The code below will do the trick:

define("AccountSectionV2", [], function() {
	return {
		entitySchemaName: "Account",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		attributes:{},
		methods: {
			updateAccount: function(callback, autoIds, selectedContact){
				var update = Ext.create("Terrasoft.UpdateQuery", {
                            rootSchemaName: "Account"
                        });
				var filters = Terrasoft.createFilterGroup();
				filters.logicalOperation = Terrasoft.LogicalOperatorType.OR;
				autoIds.forEach(function(item) {
					var accountIdFilter = update.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", item);
					filters.add("AccountIdFilter" + item, accountIdFilter);
				}, this);
				update.filters.add(filters);
				update.setParameterValue("Owner", selectedContact, Terrasoft.DataValueType.LOOKUP);
				update.execute(function(result) {
					callback.call(this, result);
				}, this);
			},
			getSectionActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getButtonMenuItem({
					"Caption": {bindTo: "Resources.Strings.MultiplyChangeAction"},
					"Click": {bindTo: "showOwnerInfo"}
				}));
				return actionMenuItems;
			},
			showOwnerInfo: function() {
                var caption = "Select an owner";
                var ContactList;
                this.set("ContactList", new Terrasoft.Collection());
                var controls = {
                    "Owner": {
                        dataValueType: Terrasoft.DataValueType.ENUM,
                        isRequired: true,
                        caption: "Owner",
                        value: {
                            bindTo: "Contact"
                        },
                        customConfig: {
                            list: {
                                bindTo: "ContactList"
                            },
                            prepareList: {
                                bindTo: "onPrepareContactList"
                            }
                        }
                    }
                };
                var ownerInputBoxHandler = this.ownerInputBoxHandler.bind(this);
                Terrasoft.utils.inputBox(caption, ownerInputBoxHandler, [
					{
						className: "Terrasoft.Button",
						caption: "ASSIGN",
						returnCode: "ok"
					}, "cancel"
				], this, controls);
                Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item){
                    item.control.bind(this);
                }, this);
            },
            onPrepareContactList: function(){
                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" });
                esq.addColumn("Id");
                esq.addColumn("Name");
                esq.getEntityCollection(function(result){
                    if (result.success){
                        var items = {};
                        result.collection.each(function(item) {
                            items[item.get("Id")] = { "value": item.get("Id"), "displayValue": item.get("Name") };
                        }, this);
                    }
                    var list = this.get("ContactList");
                    list.loadAll(items);
                }, this);
            },
            ownerInputBoxHandler: function(tag, data){
				var autoIds = this.getSelectedItems();
				var selectedContact = data.Owner.value;
                if (Terrasoft.MessageBoxButtons.OK.returnCode === tag){
                    if (Ext.isEmpty(selectedContact)){
                        this.showInformationDialog("Field is required", function(){
                            this.showOwnerInfo();
                        });
                    } else {
                        this.updateAccount(function(context, result){}, autoIds, selectedContact);
                    }
                }
            }
		}
	};
});

You will be able to select an owner from contacts:

and the selected records will be updated properly.

 

Best regards,

Oscar

Oscar Dylan,

 

Thanks, the solution works perfectly.

Oleg Drobina,

Hi, 

The code works very well. I however need to display the list as a modal pop up instead of drop down. Could you please let me know what changes need to be done or point me to resources?

Hi 

how I could modify the code (onPrepareContactList) to add a filter to the contact list (only display who are users) !

Oleg Drobina,

Show all comments

Hello,

I'm setting up the Mobile App with VERY FEW sections (contact, accounts, activities)

 

Since we have areas with no connection....I need to set the OFFLINE mode (using 7.17).

 

When I first start the APP, it seems to be loading ALL objects (orders, products, etc...) which take a lot of time/resources.

 

Can we RESTRICT some objects to be loaded when I don't use the section in the App ?

 

Hope I'm clear enough.

Thanks

 

Like 0

Like

2 comments

Hi Francois,

 

This usually happens if there are more than 1 workplace set for the Mobile App. The best way is to check your Mobile wizard and see if any of those sections linked to any of the workplaces.

I double checked and nothing is refering to the order. (I only kept Account/Contact/Activity/Lead.  The data that I'm showing does not call ORDERs or Products in Orders) 



But I still see :  Importing data (OrderProduct) = over 2 Millions records.

 

Can we limit the amount of Order records  (Today's data ONLY) ?

 

Show all comments

I want to put button beside the group. Is the structure of groups and details different?

Like 0

Like

2 comments

I was only able to put the button inside the ControlGroup, but not in the "tools" container since ControlGroups have no "tools" container (like standard details). The result was as follows:

It seems that its impossible to put the button beside the group, but it's possible to put it inside the group using the code like below:

{
				"operation": "insert",
				"name": "ContactCategoriesControlGroup",
				"parentName": "GeneralInfoTab",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTROL_GROUP,
					"caption": {"bindTo": "Resources.Strings.ContactCategoriesControlGroupCaption"},
					"items": []
				},
				"index": 0
			},
			{
				"operation": "insert",
				"name": "ContactCategoriesControlGroupButton",
				"parentName": "ContactCategoriesControlGroup",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"caption": {bindTo: "Resources.Strings.ContactCategoriesControlGroupButtonCaption"},
					"style": Terrasoft.controls.ButtonEnums.style.BLUE
				}
			},
			{
				"operation": "insert",
				"name": "ContactCategoriesControlGroupContainer",
				"parentName": "ContactCategoriesControlGroup",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": []
				}
			},
			{
				"operation": "insert",
				"name": "RelatedContact",
				"parentName": "ContactCategoriesControlGroupContainer",
				"propertyName": "items",
				"values": {
					"bindTo": "UsrContact",
					"layout": {
						"column": 0,
						"row": 0,
						"colSpan": 12
					}
				}
			},

So either use this approach or add a button to the "Actions" menu or to the top of the page.

 

Best regards,

Oscar

Oscar Dylan,

 

I think for group and detail have the same environment. but apparently not.

Thanks for the answer Oscar!

Show all comments