Hi,

 

I have a Freedom UI list where I can take a few actions after the user has selected one or more rows. The actions run as expected, but the records are kept selected after the actions run and the user has to manually clear the selection. What do I need to add to the custom code to clear the selection? 

Thanks,
Jose 

File attachments
Like 0

Like

4 comments

Hello,

Could you describe exactly what your custom logic performs for better understanding?

Malika,

 

It depends on the action. The Unlock one just clears the locked by field for the selected cases. The print generates letters and sends them to our print vendor for each case selected. Finally, the Assign one opens a window where the user can select the person to assign the cases to. Each one is calling the code below with the proper parameters.

I just need to know what I need to add to that code to clear the selection after the code that runs the business process.

 

Thanks,

Jose

        processSelectedRows: async function(request, processName, message, next) {
            var selectedRecords = await this.getSelectedRows(request.$context);
            var count = selectedRecords.count;
            var date = new Date();
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'PM' : 'AM';
            hours = hours > 12 ? hours - 12 : hours;
            var timeString = hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + " " + ampm;
            message = message + " on " + timeString + " for " +  count + " selected records.";
            request.$context.executeRequest({
                type: "crt.NotificationRequest",
                message:message
            });
            const handlerChain = sdk.HandlerChainService.instance;
            result = await handlerChain.process({
                type: 'crt.RunBusinessProcessRequest',
                processName: processName,
                processRunType: "RegardlessOfThePage",
                processParameters: {
                    "SelectedRecords": selectedRecords.selected
                },
                $context: request.$context
            });
            if (!result.success)  {
                var errorMsg = Ext.String.format(resources.localizableStrings.UnableToProcessSelectedRows, processName, result.errorInfo?.message);
                request.$context.executeRequest({
                    type: "crt.NotificationRequest",
                    message: errorMsg
                });                        
            }
            /* Call the next handler if it exists and return its result. */
            return next?.handle(request);
        }

I've not tried clearing the selections, but it might work to do this after you execute the process: 

request.$context.DataTable_SelectionState.selected = [];

Or it could be that you'll set SelectionState to null or {}?

Ryan

Ryan Farley,

Thanks Ryan. I tried that (and other variations like setting the type to 'clear') and the model gets cleared, but the GUI is not refreshed. In other worlds on the page the records are still showing as selected even though the model now has cleared the selection.

Show all comments

HI, 

 

How do I push or replace navigation history in freedom. In classic UI you were able to do it  using a sandbox message. 

 

Is it possible to be done in Freedom?

 

Thank you!

Like 1

Like

4 comments

Are you referring to pushing to navigation history (as far as going to the record/page itself)?

If so, this shows how to open a page (section or other page) https://customerfx.com/article/navigating-to-a-page-via-code-in-a-creatio-freedom-ui-page/

This shows how to open a record page in add or edit mode https://customerfx.com/article/opening-an-edit-page-to-add-or-edit-a-record-via-code-in-a-creatio-freedom-ui-page/

If I've misunderstood what you're after let me know. Hope this helps. 

Ryan

Hi Ryan, thank you for your answer.

No that's not what I'l looking for. What I want to do is what history.replaceState(state, unused, url) does in JS. change the shown url and the browser history, but not navigate. 

Javier Collazo,

Ah I see now. I've not noticed any equivalent of that in the devkit. I've seen a navigationservice and router classes as possibilities in the internal code, but they aren't exposed in devkit.

One possibility is to use the "crt.7XRequest" request. I've been able to use that for what would have been a sandbox.publish previously, a least for what I've tried with it so far. See https://customerfx.com/article/navigating-a-user-back-from-a-creatio-freedom-ui-page/

Might take a little playing with to figure out how to get the other params passed for stateObj, pageTitle, etc. Searching the source for "crt.7XRequest" would likely find some examples of similar requests.

Ryan

Javier Collazo,

I did find an example: 

await handlerChain.process({
    type: "crt.7XRequest",
    $context: null,
    action: "ReplaceHistoryState",
    hash: someHash,
    stateObj: obj,
    silent: isSilent
});

Ryan

Show all comments

Hi,

We have the Opportunities functionality with custom stages . We tested the transition between the stages and is not recording Stage History in Opportunities, is there somewhere to enable this for the new stages?

 

Like 0

Like

1 comments

Hi, Victoria!

Please turn to us via Creatio Support so we can examine the system behavior in further detail.

Show all comments

I am trying to add Virtual Detail that will contain records which don't exist in DataBase.

Now I have Detail connected to Object "Card" and After clicking Get card I am calling Get method which returns Data which I Parse in my Detail . But records exists in DataBase and i want to make it virtual.

 

I am following https://community.creatio.com/articles/add-virtual-detail-page,

1.I Created Virtual Object .

2. I did not created service while we are making API call which will returns Data. 

3. I Created virtual detail. 

4. I Insert virtual detail into Contact page.

Error: As we see in collection there is my data and thats fine but I can not read Column in virtual Object. 

 

Please help how can i solve this issue and how to add virtual detail in proper way

Like 0

Like

2 comments

Here is an example of code for the detail that will input values from the custom array into the detail. Please also note that this approach will only work if the detail contains at least 1 record (in case there are no records you will need to click the button twice for the array content to be displayed in the page). Also don't forget to add the LoadGridButtonCaption localizable string to your detail schema:

define("UsrSchema130af5ebDetail", [], function() {
	return {
		entitySchemaName: "UsrTestDetail",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: {
			IsGridEmpty: {
                    dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                    value: true
                }
		},
		diff: /**SCHEMA_DIFF*/[
			{
                "operation": "insert",
                "name": "LoadGridButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.LoadGridButtonCaption"},
                    "click": {"bindTo": "onLoadGridButtonClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
            }
		]/**SCHEMA_DIFF*/,
		methods: {
			onLoadGridButtonClick: function() {
				//object to load data from
				var object = [
					{
						UsrName: "1111",
						UsrIntColumn: 1
					},
					{
						UsrName: "Test2",
						UsrIntColumn: 24
					}
				];
				//create view model for the object items
				var newCollection = Ext.create("Terrasoft.Collection");
				Terrasoft.each(object, function(item, key) {
					var model = Ext.create("Terrasoft.BaseViewModel", {
						rowConfig: {
							Id: {
								columnPath: "Id",
								dataValueType: Terrasoft.DataValueType.GUID
							},
							UsrName: {
								columnPath: "UsrName",
								dataValueType: Terrasoft.DataValueType.TEXT
							},
							UsrIntColumn: {
								columnPath: "UsrIntColumn",
								dataValueType: Terrasoft.DataValueType.INTEGER
							}
						},
						values: {
							Id: Terrasoft.generateGUID(),
							UsrName: item.UsrName,
							UsrIntColumn: item.UsrIntColumn,
						}
					}, this);
					newCollection.add(model.get("Id"), model);
				});
				//add new collection items from the created model
 
 
				//get current Grid collection
				var collection = this.get("Collection");
				//empty current Grid collection
				collection.clear();
				//add Grid collection items from the new collection
				collection.loadAll(newCollection);
				//specify that Grid data is loaded
				this.set("IsGridEmpty", false);
			}
		}
	};
});

Oleg Drobina,

It works, Thanks a lot.

Show all comments

Hi everyone,

I hope you're all doing well. I'm currently working on exporting an Excel report of section data and its details in Creatio. I found a package named IntExcelExport in the Creatio marketplace, which seemed perfect for my needs.

However, I ran into an issue while trying to configure the report. Whenever I try to set it up, I get the following error:

"Cannot read properties of null (reading 'isTiled')"

I've tried several times, but I keep encountering the same problem. Has anyone else experienced this issue or have any insights on how to resolve it?

 

Any guidance or suggestions would be greatly appreciated!

Thank you in advance for your help.

Like 12608

Like

0 comments
Show all comments

Hi Creatio Community,

 

I am currently working on a project in Creatio Freedom UI and need to implement a tree view for a section or detail. This functionality is essential for displaying data hierarchically and enhancing user navigation.

Could anyone provide guidance or share any documentation, examples, or best practices on how to achieve this in Creatio Freedom UI? Your assistance would be greatly appreciated.

Thank you in advance for your help.

Like 0

Like

1 comments

Satyam, 

Have you checked the product selection in the order module ?

 

The object cannot be directly taken from the component in the Freedom UI designer but you can use it if you set as parent the "Base entity catalog page (BaseEntityCatalogPage)" page in your page. 

 

As restult you will get a hierarchy tree and then you can customize the page as needed. I tried it with the case object and using the account and contact in the hierarchy.

 

inherit from base entity catalog page

 

Set the option on the hierarchy tree

Show all comments

Hi guys,

Anyone knows whether it's possible to remove the default access right for "All employees" when creating a new Report?

Thank you in advance for the help

Like 1

Like

2 comments
Best reply

Hi Federica,

This process is assigning the access to all employees.

 

You can create a new version with appropriate access rights you want to apply.

 

I hope this helps!

Process

Hi Federica,

This process is assigning the access to all employees.

 

You can create a new version with appropriate access rights you want to apply.

 

I hope this helps!

Process

Thanks Franck! Smart idea :)

Show all comments

Hi

 

Somebody tried to enable Playbook areticles in a Freedom UI DCM's?

 

I tried, but they didn't appears

 

Some trick?

 

Thanks

Julio Falcón

Like 0

Like

2 comments
Best reply

Ryan Farley,

Thanks Ryan, I saw that it is a new component, I was looking for it in the DCM, as in Classic UI. :-)

Show all comments

Hi,

 

I have to implement validations on the editable detail of a section. For the purpose, I am using addRecord

But while I am trying to get the value of the lookup field which is connecting the records to the main section, it is returning undefined.

 

Please refer below code:

addRecord: function()

{

     this.DurationValidation();

     this.callParent(arguments);

}
DurationValidation : function()
            {
                var invalidMessage="";
                try
                {
                     var esqDuration = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                    rootSchemaName: "UsrPRDetail"
                });
                esqDuration.addColumn("UsrDurationmin");
                var groupFilters = this.Ext.create("Terrasoft.FilterGroup");
                var currentPR = this.get("UsrPR");
                console.log(currentPR);
                var filterId = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "UsrPR", currentPR);
                groupFilters.addItem(filterId);
                esqDuration.filters.add(groupFilters);
                esqDuration.getEntityCollection(function(result) {
                    if (!result.success) {
                        this.showInformationDialog("Request error");
                        return;
                    } else {
                        var totalDuration = 0;
                        result.collection.each(function(item) {
                            totalDuration += item.get("UsrDurationmin");
                        });
                        this.set("totalSessionDuration", totalDuration);
                        
                        console.log(totalDuration);
                        this.showInformationDialog(totalDuration);
                         invalidMessage = this.get('Resources.Strings.DurationLimitExceeded');
                        this.showInformationDialog(invalidMessage);
                    }
                }, this);
                }
                catch(e)
                {
                    console.log(e);
                }
                finally
                {
                    return {
                        invalidMessage: invalidMessage
                    };
                }   
            }

 

 

Due to this undefined value, I am not able to check the total duration of details elements in current section record. Please guide in this regard.

Like 0

Like

1 comments

Hello,

 

From the code I can suppose that the undefined value is in the UsrPR column and it happens because the addRecord method triggers before the record values are filled in and the record is actually added (the method is triggered once the + button to add a record is clicked).

 

In case you need to get the value for the lookup column that links the detail to the main section you can use

 

this.values.DefaultValues
 

to get the value for the main section record (in the screenshot below the detail is added to the CasePage and the main entity is Case, the lookup column to connect detail to the main section in the detail is UsrCase):

Show all comments

Congratulations. 

I have a task of filtering the reference field (Platform) by specific parameters in the page code.
Contact-Account-Licenses-Product-Platform.


In the SQL query, it looks like this:

select "Id", "Name" from "UsrPlatformList" as "platforms" 
	where 
		exists (select * from "Product" as "product" where  ("platforms"."Id") = ("product"."UsrPlatformId") and 
			exists (select * from "UsrLicenceClient" as "license" where ("product"."Id") = ("license"."UsrProductLicId") and 
			"license"."UsrAccountId" = '601cef3f-aa30-4fc0-b681-18d3e748ec65'
			)
		)

I'm trying to follow this instruction, but I can't.
I will be grateful for your help.

Like 1

Like

2 comments
Best reply

Ryan Farley,

I am sincerely grateful to you. With your help, other answers in the community and articles from the Academy, I learned and managed to write this complex filter. Thank you. The code currently looks like this:

attributes: {
	"UsrPlatform": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filter": function() {
				var platformFilter = this.Ext.create("Terrasoft.FilterGroup");
				var accountId = this.get("Account").value;
 
				var licenceFilter = Terrasoft.createExistsFilter(
					"[UsrLicenceClient:UsrProductLic].Id");
 
				licenceFilter.subFilters.addItem(
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL,
							"UsrAccount", accountId));
 
				var productFilter = Terrasoft.createExistsFilter(
					"[Product:UsrPlatform].Id", licenceFilter);
					platformFilter.addItem(productFilter);
				return platformFilter;
			}
		}
	}
}

I hope it helps someone and saves a lot of time.

 

You can create an exists filter by using something like the following. This example would get accounts where an activity exists with a particular owner.

// create the sub filter for the condition inside the exists
var subFilters = Terrasoft.createFilterGroup();
subFilters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Owner", "a6b4ea0c-420c-45ab-81e7-6e76c8cc15f7"));
 
// now create the exists filter and pass the sub filter conditions to it
// note, this second param of subFilters is optional if all you want is the exists without sub conditions
var existsFilter = Terrasoft.createExistsFilter("[Activity:Account].Id", subFilters);
esq.filters.addItem(existsFilter);

That is the equivalent to the following:

Ryan

Ryan Farley,

I am sincerely grateful to you. With your help, other answers in the community and articles from the Academy, I learned and managed to write this complex filter. Thank you. The code currently looks like this:

attributes: {
	"UsrPlatform": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filter": function() {
				var platformFilter = this.Ext.create("Terrasoft.FilterGroup");
				var accountId = this.get("Account").value;
 
				var licenceFilter = Terrasoft.createExistsFilter(
					"[UsrLicenceClient:UsrProductLic].Id");
 
				licenceFilter.subFilters.addItem(
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL,
							"UsrAccount", accountId));
 
				var productFilter = Terrasoft.createExistsFilter(
					"[Product:UsrPlatform].Id", licenceFilter);
					platformFilter.addItem(productFilter);
				return platformFilter;
			}
		}
	}
}

I hope it helps someone and saves a lot of time.

 

Show all comments