Hello

In Classic UI I've customized a section page (let me call it "Production Page") with 3 details that must be shown and filtered depending on the record selected in the previous detail.

Let me call "detail 1", "detail 2" and "detail 3" the three details.

Only "detail 1" is visible opening the Production Page.

When the user selects an item from the "detail 1", then "detail 2" becomes visible and is filtered based on the Id of the "detail 1" selectet item.

When the user selects an item from the "detail 2", then "detail 3" becomes visible and is filtered based on the Id of the "detail 2" selectet item.

 

I've implementd it with custom javascript code in my classic ui "Production Page" and works very well.

 

My customer wants to migrate its classic section to Freedom UI, then I must do the same thing in a Freedom UI FormPage using list or datagrid components.

I've not found any documntation or guide on handling list item selection events.

How can I do it?

Is there a way to hide the "Open, Copy and Delete" bullet point shown at the left of the rows of a freedom UI list component?

 

Thanks

Regards

Like 0

Like

1 comments

You can filter a list based on the selected record of another list all using no code in Freedom UI. See this post: https://community.creatio.com/questions/filtering-records-freedom-ui-expanded-list

If you also want to have code that gets the change of the selected row in a list see here: https://community.creatio.com/questions/list-bind-selected-record-or-add-custom-handler-selectionchange

For removing the row toolbar menu with add,copy,delete, see here: https://customerfx.com/article/removing-the-row-toolbar-from-a-creatio-freedom-ui-list-component/

Ryan

Show all comments

How do I change the sort order of the gallery component on a FreedomUI record page?

The current sort order seems to be created on date Newest first. I would like to be able to sort by a custom field on the page alphabetically (A-Z), if the gallery was using text, or numerically, if the field is a number field (smallest to largest).

Like 0

Like

1 comments

Hello!

The feature you're looking to implement is not achievable using a no-code approach but can be done with low-code customization. To create a custom ordering solution, you'll need to modify the page's code and configure the sorting settings as follows:
Locate the configuration:
1. Open the page's code and find the section with viewModelConfigDiff.
2. Add the sorting configuration:
3. Include the sorting attribute:
In the viewModelConfig  block, add this line to include the new config: "ItemsSorting": {},
Identify your Gallery component in the modelConfig block and add the following code
"sortingConfig": {
 "attributeName": "ItemsSorting",
 "default": [
   {
     "columnName": "Name",
     "direction": "asc" // Use "desc" for Z-A sorting
   }
 ]
}
4. Save your changes:
Once the code is updated, save the changes. The data should now be displayed in the correct order.

Show all comments

I have a list of logs, and I want to group them by the user's name. Is it possible to group data in a GridDetail?

Like 0

Like

7 comments

If this is a classic detail, this marketplace add-on will allow you to group the rows of any list: https://marketplace.creatio.com/app/tree-view-creatio

Ryan

Hi Ryan,

I intend to do something like that.

SELECT username
FROM logs
GROUP BY username

I’m not sure if it’s possible to list the grouped data.

Thanks

 

Cristiano Carvalho,

Yes, that is what that marketplace add-on allows you to do - the column you select (in your case the username) will group the rows by that column, so rows with that username will be grouped below it  and can be expanded. 

You can see an example of this out of the box on the classic project page, the structure tab (the project tasks) group this way as well (it is grouped by the ParentId column). You can analyze the "ProjectStructureDetailV2" schema to see how it is implemented. 

Ryan

Ryan Farley,

I am afraid, this addon allows to display parent-child tree, but not group by category. 

Hello, yes, that's true. 

Do you know of another option to group by name?

 

Thanks

 

Dear Cristiano,

Unfortunately, the option to group the list is not currently available.

 

As a workaround, you can add two separate lists to the page. In the first list, include users, and in the second, logs. Then, apply a filter to the logs based on the selection in the users' list.

This setup allows you to select one or more users in the first list, and the second list will automatically display logs related to the selected users.


You can also set up a pivot table in Classic UI dashboards, which allows grouping by a certain column, but pivot tables also have some restrictions. You can read more about it in this article.

Additionally, I created an idea for our R&D team.

Have a great day!

Cristiano Carvalho,

If you want to create read-only detail, you can create VIEW with ParentId field. Then you can use this add-on.

But editable detail is much more difficult

Another option is to create 2 details - Contacts and Logs. So, Logs detail is filtered by selected Contact

 

Kind regards,

Vladimir

Show all comments

Hello community!

 

I need an advice is there any solution (in Creatio itself or as third-party toolin Marketplace) for the following:

 

We have several regional marketing teams working in one instance. And while visibility of Contact records is bounded to regional contacts for each team, we have the one total amount of marketing contact licences for all teams. Can we split that total number of licences somehow between teams? It would help to balance the licences consumption, if one regional team will consume all licences allocated to it, other licences will remain available for other regional teams.

 

If there aren't any ready-made solutions, how can one achive that goal in the shortest way with help of custom development?  

Like 0

Like

2 comments

It seems nobody has any ideas.. maybe it is subject for Creatio R&D team?

Artem Evdokimenko,

It is impossible to make any customization in the marketing active contacts licenses mechanism. Any subject regarding the licenses should be directly discussed with the Creatio side.

Show all comments

Hello Community,

I’m working on creating a custom web service to delete a lead record, but I’ve run into an issue that I can’t seem to resolve. Whenever I attempt to delete a lead using its ContactId, I receive the following error:
"Error occurred while deleting: Item cannot be deleted because it is being used in a process."

Here’s what I’ve tried so far:

  1. Removing the Process Connection:
    The lead is connected to a business process (Lead Processing) through a "Connect process to object process element." I attempted to remove this connection from the base process, but doing so broke other functionalities that are dependent on this process.
  2. Calling the Process Cancel Execution Service:
    I attempted to call the CancelExecution service (ProcessEngineService.svc/CancelExecution) to cancel the execution of the process. However, this service requires processDataIds in the body, which I cannot retrieve within the delete contact web service.
  3. Deleting the Connected Record:
    I explored deleting the record connecting the process to the lead, but I couldn’t locate the object holding this connection.

Below is the source code for my delete operation. The logic works perfectly when I stop the "Lead Processing" business process, but that’s not a sustainable solution.

Source Code:
 using System;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using Terrasoft.Core;
using Terrasoft.Web.Common;
using Terrasoft.Core.Entities;
using System.Collections.Generic;
 
namespace Terrasoft.Configuration.UsrDeleteLeadNamespace
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrDeleteLead : BaseService
    {
        [OperationContract]
        [WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Json, 
                  BodyStyle = WebMessageBodyStyle.Wrapped,
                  ResponseFormat = WebMessageFormat.Json)]
        public string DeleteLead(string LeadId)
        {
            if (!Guid.TryParse(LeadId, out Guid parsedLeadId))
            {
                return "Invalid Lead ID format or Lead doesn't exist.";
            }
 
            UserConnection userConnection = GetUserConnection();
            EntitySchemaManager entitySchemaManager = userConnection.EntitySchemaManager;
 
            try
            {
                // First check and delete connected Lead Products
                EntitySchema leadProductSchema = entitySchemaManager.GetInstanceByName("LeadProduct");
                var leadProductEsq = new EntitySchemaQuery(leadProductSchema);
                leadProductEsq.AddAllSchemaColumns();
                leadProductEsq.Filters.Add(leadProductEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "Lead", parsedLeadId));
                var leadProductCollection = leadProductEsq.GetEntityCollection(userConnection);
 
                // Manually convert EntityCollection to a List
                var leadProductCollectionToDelete = new List<Entity>();
                foreach (var leadProductEntity in leadProductCollection)
                {
                    leadProductCollectionToDelete.Add(leadProductEntity);
                }
 
                // Delete the Lead Products
                foreach (var leadProductEntity in leadProductCollectionToDelete)
                {
                    leadProductEntity.Delete();
                }
 
                // First check and delete connected Activity
                EntitySchema activitySchema = entitySchemaManager.GetInstanceByName("Activity");
                var activityEsq = new EntitySchemaQuery(activitySchema);
                activityEsq.AddAllSchemaColumns();
                activityEsq.Filters.Add(activityEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "Lead", parsedLeadId));
                var activityCollection = activityEsq.GetEntityCollection(userConnection);
 
                // Manually convert EntityCollection to a List
                var activityCollectionToDelete = new List<Entity>();
                foreach (var activityEntity in activityCollection)
                {
                    activityCollectionToDelete.Add(activityEntity);
                }
 
                // Delete the Lead Products
                foreach (var activityEntity in activityCollectionToDelete)
                {
                    activityEntity.Delete();
                }
 
                // Now check and delete the Lead
                EntitySchema leadSchema = entitySchemaManager.GetInstanceByName("Lead");
                Entity leadEntity = leadSchema.CreateEntity(userConnection);
 
                if (!leadEntity.FetchFromDB("Id", parsedLeadId))
                {
                    return "Lead not found.";
                }
 
                if (leadEntity.Delete())
                {
                    return $"Lead and {leadProductCollection.Count} related product(s) have been deleted successfully.";
                }
                else
                {
                    return "Failed to delete Lead.";
                }
            }
            catch (Exception ex)
            {
                return $"Error occurred while deleting: {ex.Message}";
            }
        }
    }
}

I would greatly appreciate any suggestions or guidance on how to resolve this issue. Specifically:

  • Is there a way to identify and cancel the process dynamically before deleting the lead?
  • Can I identify and delete the connecting record that prevents the deletion?
  • Are there alternative approaches I should consider?
Like 0

Like

1 comments

Hello,
 

Thank you for the detailed explanation of the task.
You can reproduce this behavior through the UI by creating a new lead record and then trying to delete it - you get a message about related records, as shown in the screenshot.

create a lead and try to delete
 

In this case, blocking the deletion of the record occurs due to the running business process “Lead processing”, which creates an activity on the lead and, accordingly, an instance of the process.

According to your code, we see that you are already deleting the activities associated with this lead, so you just need to cancel the business process instance.

To implement this, the ProcessEngineService.svc/CancelExecution endpoint can be a good fit, where you need to pass the business process instance ID in the request body:

{“processDataIds”:“045ea1bc-f366-4837-994f-d229fc8a91d4”}


So, the question remains as to where you can find the instance ID of the business process that uses this record.
The “SysProcessEntity” table stores data about the relationship of the record with the business process instance. The important columns for you are:
1) EntityId - the identifier of the linked record. That is, in your case, the record ID of the lead to be deleted
2) SysProcessId - the identifier of the process instance that is associated with this record.
3) EntityDisplayValue - the value from the Display Value column for the Lead object. By default, this is the “LeadName” column.

Before calling the ProcessEngineService.svc/CancelExecution endpoint with the process ID, you can also check the business process name in the SysProcessLog table (Id = {id from SysProcessid column}).

SysProcessEntity table
SysProcessLog
 

Thank you.

Show all comments

Hi guys! We have issue with CaseRatingFeedbackPage - in page we have just 2 radio button, 1 text area and 1 submit button. But page performance is so slow.


its how page looks:



 

Like 1

Like

8 comments
Best reply

and it loads a lot of js files:

and it loads a lot of js files:

Hello!

Thank you for sharing the details. Based on the provided information, here are a few key theories about what could be causing the performance issues on the CaseRatingFeedbackPage:
 

  1. Number of Requests:
    A high number of requests being triggered when the page loads or during user interaction can significantly impact performance. This could be related to customizations or additional scripts implemented on the page, which might introduce extra requests.
     
  2. Network Speed or Connection Issues:
    The fact that a small file (e.g., 33 KB) takes 2 seconds to load strongly indicates potential problems with the internet connection or network conditions. This delay could result from low bandwidth, high latency, or temporary connectivity issues.

    Recommended Next Steps:
     
  3. Analyze Requests and Customizations: Use a network monitoring tool (e.g., Chrome DevTools) to identify unnecessary or excessive requests. Pay particular attention to requests introduced by custom scripts or third-party dependencies.
     
  4. Check Network Conditions: Test the page performance under different network conditions to confirm if the issue persists with stable and high-speed internet.

    Best regards,
    Anton

Anton Starikov,

Hi Anton, thanks for response. There is no any network/speed issue. In the network I see a lot of JS loading which initiator is "error-list-dialog.js". 
here is the added code to this page:
 

Kamran Mammadov,

The fact that the files are taking so long to download indicates a network problem. Could you please check this also?
Is the result the same with other networks?

Anton Starikov,

Yes, it comes as issue from business, so it tested in different environments/networks

For what it's worth, the CaseRatingFeedbackPage always loads horribly slow for me as well, even without customization to it. Even for cases with Creatio in their success portal, often the page doesn't even completely load.

Ryan

Yep, 

A couple pages still needs some code optimization for performance. In general, load time is also very very sensitive to wifi quality I noticed, a whole much more than any other of our web apps we use.  

Lots of improvements happened last year, hopefully this trend of performance improvements will continue :). 

 

Thanks to all!

Show all comments

Can anyone tell me what are the events that we can use to trigger a handler code other than "clicked" on a button? for example hover-over, dropdown clicked, etc.?

Please specify the events that are already supported by creatio or if they require some customization to make them work.

Like 0

Like

1 comments

Hello Ahmad,

There is no such official documentation. Each business task needs to be reviewed separately to find the perfect solution. 

As I understood from the question described, you may use dataSources to cover your task. Please check the article to find out more.

Additionally, you may read here about the Creatio front-end architecture. 

 

Show all comments

why i get this error. i use update
... 0/odata/Contact(guid'123') to change number value

Like 0

Like

1 comments

Hello, 

The error you encountered, according to the analysis, was caused by the fact that the OData protocol takes some time to initialize. During this time, requests via the protocol may return an error. However, within 5 minutes of the request, the system successfully initialized the protocol.


Best regards, 
Orkhan

Show all comments

Hello!

 

I am having trouble testing OAuth 2.0 token retrieval.

 

In the documentation for retrieving an access token, an Identity Service URL is required. Earlier it states that you do not need to deploy an identity service if you are using Creatio in the cloud, but I haven't had any luck finding what it should be in this case in documentation, our account, or in other community questions.

 

What is the Identity Service URL for Creatio accounts in the cloud?

Like 0

Like

2 comments

Posted a duplicate by refreshing the page - tried deleting this so hopefully it will be gone soon. Feel free to ignore.

Greetings!  
 

To work with OAuth 2.0, follow these steps:


1. Open the System Designer via settings.  

2. Navigate to the Import and Integration block → OAuth 2.0 Integrated Applications.  

3. Create a new record.  

4. After that, copy the following credentials:  
  - Client ID  
  - Client Secret  




5. Use Postman or any other platform convenient for working with APIs.  

6. Send a POST request to get tokens:  


POST https://website-is.creatio.com/connect/token




7. In the response, you will receive:  


{
 "access_token": "<TOKEN>",
 "expires_in": 3600,
 "token_type": "Bearer",
 "scope": "<SCOPE>"
}


  You will only need the access_token.  


8. Use the token to make the following request, for example:  


GET https://website.creatio.com/0/odata/Contact
Authorization: Bearer <TOKEN>


You will successfully retrieve the data.  


For more detailed information about working with OAuth, I recommend referring to the documentation:  
https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platform/integrations-and-api/authentication/oauth-2-0-authorization/identity-service-overview

Best regards, 
Orkhan

Show all comments

Hello! 

 

I am having trouble testing token retrieval via OAuth 2.0.

 

In the documentation for retrieving an access token, an Identity Service URL is required. Earlier, it states that you do not need to deploy an identity service if you are using Creatio in the cloud, but I see no reference to what the URL should be in this case and have had no luck finding it.

 

What is the Identity Service URL for Creatio in the cloud?

Like 0

Like

2 comments
Best reply

it is in the system settings. Generally it is https://[instanceName]-is.creatio.com/connect/token

 

For example, if my instance is autos.creatio.com, the url would be https://autos-is.creatio.com/connect/token

it is in the system settings. Generally it is https://[instanceName]-is.creatio.com/connect/token

 

For example, if my instance is autos.creatio.com, the url would be https://autos-is.creatio.com/connect/token

Thank you! That's exactly what we needed.

Show all comments