Hi All, 

Are we able to change this text to our company brand please?

 

Thanks

Like 1

Like

3 comments

Hello,



Unfortunately, in Freedom UI there is no possibility to customize the logo on the loading screen. 



However, a task has already been registered in our R&D team to consider and implement such a feature in future releases. In case you would like to check what stage this task is at, I am sending you the task number: PR-28347. Please don't hesitate to share this number with us at any time and ask your questions.

FREEDOM UI LOGIN LOGO (CURRENTLY CREATIO- Any Article for this issue

Bala Koteswarareddy,


Hello, 

The request to implement this functionality on Freedom UI has been submitted to our Developer Team. 

Regards,
Orkhan

Show all comments

Hi,

I would like to know if there are any issues with creating a new application from the application hub, with a new page and section in Version 8.0.4? We are still in Classic UI but from the application hub I can only create Freedom UI sections. Will I run into issues or should I continue to create new sections using the Wizard until we have upgraded to Freedom UI?

Thank you!

Hayley

Like 0

Like

7 comments
Best reply

Hayley Paul,

We just continue to create and modify sections in Section wizards and still are using Classic UI. And we use Application hub only for installing package



Kind regards,

Vladimir

Hi 

 

The Application Hub only allows you to create Freedom UI sections. Sections created in the Application Hub that are not supported in Classic UI.

Hi Bogdan, thank you for the response. Therefore, I need to upgrade to Freedom UI in order to create these new sections from the application hub?

Hayley Paul,

 

The application hub (creating Freedom UI) is already available in your version. 



Please find more information here.

Hi Bogdan,

Thank you for your reply. I have read the documentation and I have created an application in the Application hub. Then I tried adding the section to a workplace but it does not get added (no error message, just never loads in the workplace). Is this what you meant by these sections are not supported in Classic UI? Could my users still access and work with this new Freedom UI section from "My Applications" workplace?

Hayley Paul,

 

You can add your new Freedom UI section to any workplace. 

If you have an error while adding please contact support team on this matter. 

OK that is good news. So just to confirm, this new section that I create in the Application hub will be Freedom UI. My Creatio instance is ALL classic UI but this one new section will be available in that workplace and when the user selects that section, it will open as Freedom UI. Correct?

Would that new section be fully functional in my system and live with the other classic UI sections? 

Hayley Paul,

We just continue to create and modify sections in Section wizards and still are using Classic UI. And we use Application hub only for installing package



Kind regards,

Vladimir

Show all comments

Hi everyone,



I am trying to add a custom button to the contacts section in the mobile application. I followed the steps provided in: https://community.creatio.com/articles/adding-custom-user-action-mobile… to create a custom button on the user actions list, but I was unsuccessful.



Alternatively, is there a way to add buttons to the section (list) page, or to add a button in the Freedom UI section of the mobile application?



Regards,

Ramya

Like 0

Like

3 comments

Hi Ramya,

 

Currently there is no way to add custom buttons in Freedom UI (the article you refer to will only work in classic UI). I've created a suggestion for our R&D team to make it possible to add buttons in Freedom UI using no-code capabilities and pointed them to your community question.

 

Thank you for helping us in making the app better!

Hi Oleg Drobina,

Thank you for the prompt response. In the Classic UI, is it possible to add a button somewhere other than the record's edit page, maybe in the section page or a common menu like the settings? Or is it possible to override the existing 'Add Contact' button?



Regards,

Ramya



Oleg Drobina,

Hello, Oleg 
I find it a little difficult to figure out how to implement the freedom ui component configuration in my page, even if Creatio documentation lists it all: https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…;

The "UsrMobileUsrLeaveRequestRecordPageSettingsWorkplace2" client module is attached to this mobile page for a custom section that I designed called "UsrLeaveRequest."
How do I proceed about adding a custom button to this edit page now?

[
   {
       "operation": "insert",
       "name": "settings",
       "values": {
           "entitySchemaName": "UsrLeaveRequest",
           "details": [],
           "columnSets": [],
           "localizableStrings": {
               "SocialMessageDetailCaptionUsrLeaveRequest_caption": "Feed",
               "AttachmentsDetailCaptionUsrLeaveRequest_caption": "Attachments",
               "primaryColumnSetUsrLeaveRequest_caption": "General information",
               "UsrEmployeV2_DetailStandardDetailUsrLeaveRequest_caption": "Employees detail"
           },
           "settingsType": "RecordPage",
           "operation": "insert",
 
       }
   },
   {
       "operation": "insert",
       "name": "SocialMessageDetailV2StandardDetail",
       "values": {
           "caption": "SocialMessageDetailCaptionUsrLeaveRequest_caption",
           "entitySchemaName": "SocialMessage",
           "showForVisibleModule": true,
           "filter": {
               "detailColumn": "EntityId",
               "masterColumn": "Id"
           },
           "operation": "insert"
       },
       "parentName": "settings",
       "propertyName": "details",
       "index": 0
   },
   {
       "operation": "insert",
       "name": "AttachmentsFlutterDetailStandardDetail",
       "values": {
           "caption": "AttachmentsDetailCaptionUsrLeaveRequest_caption",
           "entitySchemaName": "SysFile",
           "filter": {
               "detailColumn": "RecordId",
               "masterColumn": "Id"
           },
           "operation": "insert"
       },
       "parentName": "settings",
       "propertyName": "details",
       "index": 1
   },
   {
       "operation": "insert",
       "name": "UsrEmployeV2_DetailStandardDetail",
       "values": {
           "caption": "UsrEmployeV2_DetailStandardDetailUsrLeaveRequest_caption",
           "entitySchemaName": "Employee",
           "filter": {
               "detailColumn": "Manager",
               "masterColumn": "UsrApplicant"
           },
           "detailSchemaName": "UsrEmployeV2_Detail",
           "operation": "insert"
       },
       "parentName": "settings",
       "propertyName": "details",
       "index": 2
   },
   {
       "operation": "insert",
       "name": "primaryColumnSet",
       "values": {
           "items": [],
           "rows": 1,
           "entitySchemaName": "UsrLeaveRequest",
           "caption": "primaryColumnSetUsrLeaveRequest_caption",
           "position": 0,
           "operation": "insert"
       },
       "parentName": "settings",
       "propertyName": "columnSets",
       "index": 0
   },
   {
       "operation": "insert",
       "name": "42d4b33c-f361-44d4-92cd-07e8db664fca",
       "values": {
           "row": 0,
           "content": "Leave Request No.",
           "columnName": "UsrLeaveReaquestNo",
           "dataValueType": 1,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 0
   },
   {
       "operation": "insert",
       "name": "0d5ca981-1558-4e4d-b1a2-2b2b9dbd422c",
       "values": {
           "row": 1,
           "content": "End Date",
           "columnName": "UsrEndDate",
           "dataValueType": 8,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 1
   },
   {
       "operation": "insert",
       "name": "2013f978-c87f-4896-96be-5383cfd044e3",
       "values": {
           "row": 2,
           "content": "Start Date",
           "columnName": "UsrStartDate",
           "dataValueType": 8,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 2
   },
   {
       "operation": "insert",
       "name": "266417d3-f847-4386-af45-2674e9e779bb",
       "values": {
           "row": 3,
           "content": "Applicant",
           "columnName": "UsrApplicant",
           "dataValueType": 10,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 3
   },
   {
       "operation": "insert",
       "name": "1655829d-ce75-476c-9350-ce2696ecbf6d",
       "values": {
           "row": 5,
           "content": "Reason",
           "columnName": "UsrReason",
           "dataValueType": 1,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 4
   },
   {
       "operation": "insert",
       "name": "9f677f71-3322-4e75-9938-69ca4e1c650f",
       "values": {
           "row": 6,
           "content": "Status",
           "columnName": "UsrStatus",
           "dataValueType": 10,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 5
   },
   {
       "operation": "insert",
       "name": "3d874029-b467-4d7b-9eb0-d2ebfbe20403",
       "values": {
           "row": 7,
           "content": "Working Days Count",
           "columnName": "UsrWorkingDaysCount",
           "dataValueType": 4,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 6
   },
   {
       "operation": "insert",
       "name": "bc0d7d7e-ffdf-44a5-98b3-0a10094341e2",
       "values": {
           "row": 4,
           "content": "Applicant.Manager",
           "columnName": "UsrApplicant.Manager",
           "dataValueType": 10,
           "operation": "insert"
       },
       "parentName": "primaryColumnSet",
       "propertyName": "items",
       "index": 7
   }
]
Show all comments

You can register/apply validators to fields on the page using these instructions: https://academy.creatio.com/docs/developer/front_end_development_freedo…



But how can you apply a validator to an editable field within a list or a "collection" data source?



If you try to add a validator to the field as normal e.g.

 

viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
{
	"operation": "merge",
	"path": [
		"attributes"
	],
	"values": {
		"ContactCommunicationOptionsItems": {
		"isCollection": true,
		"modelConfig": {
			"path": "ContactCommunicationOptionsDS",
			"sortingConfig": {
				"default": [
					{
						"columnName": "CreatedOn",
						"direction": "asc"
					}
				]
			}
		},
		"viewModelConfig": {
			"attributes": {
				"ContactCommunicationOptionsDS_CreatedOn": {
					"modelConfig": {
						"path": "ContactCommunicationOptionsDS.CreatedOn"
					}
				},
				"ContactCommunicationOptionsDS_Number": {
					"modelConfig": {
						"path": "ContactCommunicationOptionsDS.Number"
					},
					"validators": {
						"TESTValidator": {
							"type": "q.TestValidator",
							"params": {}
						}
					}
				},
				.....



An error in the console is displayed: Error: Validator 'q.TestValidator' was not registered. 



How do I "register" a validator to work within a list?

Like 0

Like

1 comments
Best reply

Hi,

Currently, you cannot add the validator to an editable list.

Contacted the developers about the possibility of adding such an option and they confirmed that they are working on this logic, however, it will only be available in the future version. We will increase the priority of this task so it will be done quicker.

Hi,

Currently, you cannot add the validator to an editable list.

Contacted the developers about the possibility of adding such an option and they confirmed that they are working on this logic, however, it will only be available in the future version. We will increase the priority of this task so it will be done quicker.

Show all comments

Is it possible within Freedom UI to trigger a refresh of the Timeline/Feed/Next Steps components using JS? We seem to have an issue where the "Enable live data update" option does not seem to be working in Creatio CRM 8.1 for our Activities on certain pages, and while we've raised a support request for this, we were trying to find a workaround by manually updating the components from code for a specific use case, but we can't see what the data source is called for these types of components. Does anybody know what it would be? I presume refreshing the PDS would refresh them, but this seems heavy handed and might end up with data being lost on the main form page while the data actually being refreshed is just a child entity, so I would expect it to have its own data source.

Like 4

Like

3 comments

+1

Hello Harvey and Damien!

In Freedom UI Pages, the structure of the page is different and along with this a new way to refresh anything on the page. In this article you can find the way to achieve your goal:

https://customerfx.com/article/refreshing-reloading-page-or-list-data-on-a-creatio-freedom-ui-page/

Here's example of handler which you can use:

handlers: /**SCHEMA_HANDLERS*/[
 {
  request: "crt.HandleViewModelAttributeChangeRequest"/* The custom implementation of the system query handler. */
  handler: async (request, next) => {
   await next?.handle(request); 
   if (request.attributeName === 'Your Attribute Name' )
   {
    const handlerChain = sdk.HandlerChainService.instance;
    await handlerChain.process({
     type: 'crt.LoadDataRequest', $context: request.$context,
     config: { loadType: 'reload' },
    dataSourceName: 'Data Source Of Obj You Want To Refresh'
    });   
   }
  }
 },

You may also find this article useful:

https://customerfx.com/article/receiving-server-side-messages-in-a-creatio-freedom-ui-page/

 

Anhelina,

 

How can we find what the data source is for a component like a Timeline or Next Steps component though? The article suggests looking at the modelConfig elements in the page code, but none of these seem to relate to the timeline or timeline tiles. I expect there is some data source being created behind the scenes but finding out what it's called is the main problem for applying the theory of being able to reload anything on the page as is suggested.

 

Many thanks,

Harvey

Show all comments

How can we apply custom filters on Lookups in Freedom UI? I can see that there is some existence of a filtersConfig potential property for the object passed as the first parameter to executeRequest, but cannot find any examples or information on how this should be configured in Academy or on other Community questions. We are trying to use this to associate records to a parent record using the + button on a Freedom UI "detail" list, but we don't want any records already associated with any parent by foreign key to be eligible for association using the lookup, and also have some other conditions to apply based on the child entity. Our environment is currently on 8.1 Quantum.

 

Here is the relevant excerpt from the handler on our form page, without any filters applied and with the non-relevant logic applied in the afterClosed area removed for brevity:

request.$context.executeRequest({
	type: "crt.OpenLookupPageRequest",
	$context: request.$context,
	entitySchemaName: "Order",
	caption: "Select Quotes to associate with the Lead",
	features: {
		select: {
			multiple: true,
			selectAll: false,
			resultType: 'lookupValues'
		},
		create: {
			enabled: false
		}
	},
	afterClosed: async function(selectedItems) {
		// logic here
		return next?.handle(request)
	}
});

 

Like 0

Like

5 comments
Best reply

Hello,

Here is an example of OpenLookupPageRequest with a filtersConfig.

handlers: /**SCHEMA_HANDLERS*/[
			{
				request: "usr.OpenLookupRequest",
				handler: async (request, next) => {
					devkit.HandlerChainService.instance.process({
						type: "crt.OpenLookupPageRequest",
						scopes: [...request.scopes],
						$context: request.$context,
						entitySchemaName: "Contact",
						// caption: 'Responsible',
						schemaName: 'CustomLookupPage',
						itemAttributeName: 'LookupAttribute_2mnilrq',
						// itemsAttributeName: 'Contact_List',
						afterClosed: (result) => {
							alert(result?.displayValue ?? '');
						},
						filtersConfig: {
							filterAttributes: [
								{
									name: 'MyFilter',
									loadOnChange: false
								}
							],
							attributesConfig: {
								MyFilter: {
									value: {
										"items": {
											"29e16d42-36f1-4e04-9029-4321cbb2494d": {
												"filterType": 1,
												"comparisonType": 11,
												"isEnabled": true,
												"trimDateTimeParameterToDate": false,
												"leftExpression": {
													"expressionType": 0,
													"columnPath": "Name"
												},
												"isAggregative": false,
												"dataValueType": 1,
												"rightExpression": {
													"expressionType": 2,
													"parameter": {
														"dataValueType": 1,
														"value": "Super"
													}
												}
											}
										},
										"logicalOperation": 0,
										"isEnabled": true,
										"filterType": 6,
										"rootSchemaName": "Contact"
									}
								}
							}
						}
					});
					return next?.handle(request);
				}
			}
		]/**SCHEMA_HANDLERS*/,

If you don't know how to build a proper filter here is a small tip. On a Freedom UI page add a list with the object you want to filter. In this list add a static filter with a condition you want to apply to a OpenLookupPageRequest and save it. As a result, in the code of this page, you can find the full filter code, all you need to do is to replace "MyFilter" with it.

Hello,

Here is an example of OpenLookupPageRequest with a filtersConfig.

handlers: /**SCHEMA_HANDLERS*/[
			{
				request: "usr.OpenLookupRequest",
				handler: async (request, next) => {
					devkit.HandlerChainService.instance.process({
						type: "crt.OpenLookupPageRequest",
						scopes: [...request.scopes],
						$context: request.$context,
						entitySchemaName: "Contact",
						// caption: 'Responsible',
						schemaName: 'CustomLookupPage',
						itemAttributeName: 'LookupAttribute_2mnilrq',
						// itemsAttributeName: 'Contact_List',
						afterClosed: (result) => {
							alert(result?.displayValue ?? '');
						},
						filtersConfig: {
							filterAttributes: [
								{
									name: 'MyFilter',
									loadOnChange: false
								}
							],
							attributesConfig: {
								MyFilter: {
									value: {
										"items": {
											"29e16d42-36f1-4e04-9029-4321cbb2494d": {
												"filterType": 1,
												"comparisonType": 11,
												"isEnabled": true,
												"trimDateTimeParameterToDate": false,
												"leftExpression": {
													"expressionType": 0,
													"columnPath": "Name"
												},
												"isAggregative": false,
												"dataValueType": 1,
												"rightExpression": {
													"expressionType": 2,
													"parameter": {
														"dataValueType": 1,
														"value": "Super"
													}
												}
											}
										},
										"logicalOperation": 0,
										"isEnabled": true,
										"filterType": 6,
										"rootSchemaName": "Contact"
									}
								}
							}
						}
					});
					return next?.handle(request);
				}
			}
		]/**SCHEMA_HANDLERS*/,

If you don't know how to build a proper filter here is a small tip. On a Freedom UI page add a list with the object you want to filter. In this list add a static filter with a condition you want to apply to a OpenLookupPageRequest and save it. As a result, in the code of this page, you can find the full filter code, all you need to do is to replace "MyFilter" with it.

Question on OpenLookupPageRequest. In an edit scenario, could you pass the already selected options so that they appear already selected in the lookup list?

You can use the option selectionState to predefine selected rows, which will be pre-selected

type: "crt.OpenLookupPageRequest",
	...
	selectionState: {
		type: 'specific',
		selected: [
			'9d06bf9f-eb7a-4849-b83d-cbba994f185d',
			'49ba9a9e-2e28-48cb-b1bc-81b7871acb9d',
		],
	},

 

Dmytro Vovchenko,

 

Those are really useful, are there any other parameters that can be passed to the newly opened lookup page? I'm currently looking for a way to automatically set the initial search value of the lookup window, but I'm sure there are many other undocumented useful parameters like the selectionState that can be passed to a lookup page when opening it. A generic way to pass data into the page would be great!

 

I looked into passing a defaultSearchValue parameter into the request, but it didn't seem to affect the modal lookup.

Harvey Adcock,

 

Hello,

 

Here is all the available documentation we have:

 

Lookup window example:

In order to open the lookup window, you have to use crt.OpenSelectionWindowRequest

/**
 * @publicApi
 */
@CrtRequest({
    type: 'crt.OpenSelectionWindowRequest',
})
export class OpenSelectionWindowRequest extends BaseRequest {
    public itemAttributeName?: string;
    public itemsAttributeName?: string;
    /**
     * @publicApi
     */
    public entitySchemaName?: string;
    /**
     * @publicApi
     */
    public schemaName?: string;
    /**
     * @publicApi
     */
    public filtersConfig?: FiltersConfig;
    /**
     * @publicApi
     */
    public features?: PageLookupFeatures;
    /**
     * @publicApi
     */
    public selectionState?: SelectionState;
    /**
     * @publicApi
     */
    public afterClosed?: (result: SelectionWindowResult) => void;
    /**
     * @publicApi
     */
    public caption?: LocalizableString;
}

Add the following code to your custom handler:

handlers: /**SCHEMA_HANDLERS*/[
			{
				request: "usr.OpenLookupRequest",
				handler: async (request, next) => {
					devkit.HandlerChainService.instance.process({
						type: "crt.OpenSelectionWindowRequest",
						scopes: [...request.scopes],
						$context: request.$context,
						entitySchemaName: "Contact",
						// caption: 'Responsible',
						schemaName: 'CustomLookupPage',
						itemAttributeName: 'LookupAttribute_2mnilrq',
						// itemsAttributeName: 'Contact_List',
						afterClosed: async (result) => {
							if (!result.canceled) {
								const lookupValues = await result.getLookupValues();
								const value = lookupValues[0];
								if (value) {
									alert(value?.displayValue ?? '');
								}
							}
						},
						filtersConfig: {
							filterAttributes: [
								{
									name: 'MyFilter',
									loadOnChange: false
								}
							],
							attributesConfig: {
								MyFilter: {
									value: {
										"items": {
											"29e16d42-36f1-4e04-9029-4321cbb2494d": {
												"filterType": 1,
												"comparisonType": 11,
												"isEnabled": true,
												"trimDateTimeParameterToDate": false,
												"leftExpression": {
													"expressionType": 0,
													"columnPath": "Name"
												},
												"isAggregative": false,
												"dataValueType": 1,
												"rightExpression": {
													"expressionType": 2,
													"parameter": {
														"dataValueType": 1,
														"value": "Super"
													}
												}
											}
										},
										"logicalOperation": 0,
										"isEnabled": true,
										"filterType": 6,
										"rootSchemaName": "Contact"
									}
								}
							}
						}
					});
					return next?.handle(request);
				}
			}
		]/**SCHEMA_HANDLERS*/,

where

 

entitySchemaName - the name of the entity schema whose data is displayed in the lookup window. Optional parameter. If not specified, the data source is taken from the attribute specified in itemAttributeName

 

caption - optional parameter, displayed in the window title. If caption is not specified, the caption is taken from the attribute specified in the itemAttributeName parameter. If itemAttributeName is not specified, then from the entity schema.

 

schemaName - the name of the schema that is displayed in the lookup window. Optional parameter. Default is BaseLookupPageTemplate

 

itemAttributeName - the name of the attribute from which the title is taken, the name of the entity schema and in which the result of the selection in the window will be written. Optional parameter. As a rule, this is the attribute with which the Combobox control is associated.

 

itemsAttributeName - the name of the attribute from which the data source name is taken. Optional parameter.

 

afterClosed - callback function returning the result of the selection in the window. Optional parameter.

 

filtersConfig-  describes the filter to be applied to the data. Optional parameter

 

PageLookupFeatures

 

Additionally, the user can specify additional features for the selection window.

export interface PageLookupFeatures {
    create?: {
        enabled: boolean;                         // false by default
    };
    select: {
        multiple: boolean;                        // false by default
        selectAll: boolean;                       // false by default
    };
    showDeactivatedRecords?: boolean;
}

 

The user should provide the Create option as enabled to display the New button in the selection window (only for the FreedomUI host).

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	"features": {
		"create": {
            "enabled": true;
        }
	}
});

 

The New button in this window works best only in the Freedom UI shell. In the Classic UI, new record will be created, but the selection window will close after saving it without passing the created record selected value. If you want to use this window in the Classic UI, please consider it, or don’t show this button there.

 

SelectionWindowResult  type

export class SelectionWindowResult {
    canceled: boolean; // indicates whether selection window was canceled by user
    filter: FilterMetadata; // Filter 
    async getLookupValues(options?: { pagingConfig: DataSourcePagingConfig }): Promise<LookupValue[]>; // method to get lookup values
}

where DataSourcePagingConfig is 

interface DataSourcePagingConfig {
    rowsOffset: number;
    rowCount: number;
}

example

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	"features": {
		"select": {
            "multiple": true;
        }
	},
	afterClosed: async (selectionWindowResult) => {
		const filter = selectionWindowResult.filter // getting filter
		// or 
		const lookupValues = await selectionWindowResult.getLookupValues(); // getting lookupValues
	}
});

 

Multiselection mode

 

To enable multiselection mode user should add next feature to OpenPageLookupRequest

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	features: {
		select: {
            "multiple": true
        }
	}
});

So afterClosed will look like this 

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	features: {
		select: {
			multiple: true
		}
	},
	afterClosed: async (selectionWindowResult) => {
		const lookupValues = await selectionWindowResult.getLookupValues();
		// do something with lookup values
	}
});

 

Select all


To enable the ability to select all records, you should add the next features to OpenPageLookupRequest.

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	features: {
		select: {
            multiple: true,
            selectAll: true
        }
	}
});

 

Canceled
 

Handling cases when the user presses the cancels Selection window

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	features: {
		select: {
			multiple: true
		}
	},
	afterClosed: (selectionWindowResult) => {
		const canceled = selectionWindowResult.canceled;
		if (canceled) {
			// do some logic when user canceled selection window
		}
	}
});

 

Selecting a special set of values


getLookupValues could be called with paging config where user can specify rowsOffset and rowCount to get a specific list of values

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	features: {
		select: {
			multiple: true
		}
	},
	afterClosed: async (selectionWindowResult) => {
		const pagingConfig = {
			rowsOffset: 2,
			rowCount: 2
		}
		const lookupValues = await selectionWindowResult.getLookupValues({ pagingConfig });
		// do something with received lookup values
	}
});

Example of iterating through lookupValues. Getting pair of 2 lookupValues with step of 2

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	scopes: [...request.scopes],
	$context: request.$context,
	....
	features: {
		select: {
			multiple: true
		}
	},
	afterClosed: async (selectionWindowResult) => {
		let rowsOffset = 0;
        const rowCount = 2;
        const pagingConfig = { rowsOffset, rowCount };
        let lookupValues = await selectionWindowResult.getLookupValues({ pagingConfig });
        while (lookupValues.length) {
            /*
              fn(lookupValues); // do something with received lookupValues pair
            */
            rowsOffset += 2;
            lookupValues = await selectionWindowResult.getLookupValues({ pagingConfig: { rowsOffset, rowCount }});
        }
        if (!lookupValues.length) {
            /*
              Do some logic here on end of list - when there are no more lookupValues
            */
        }
	}
});

 

Selection state


and SelectionState is:

{
    type: 'specific';
    selected: unknown[]; // array of id's
}

 

So user can predefine selected rows, which will be pre-selected

devkit.HandlerChainService.instance.process({
	type: "crt.OpenSelectionWindowRequest",
	...
	selectionState: {
		type: 'specific',
		selected: [
			'9d06bf9f-eb7a-4849-b83d-cbba994f185d',
			'49ba9a9e-2e28-48cb-b1bc-81b7871acb9d',
		],
	},
});

 

showDeactivatedRecords


When set to true, deactivated entries of the object are shown.

 

This is all the information that we have on the lookup page handling cases, I hope it helps.

Show all comments

Hello Everyone,

I have a progress bar that changes its status based on approval status. However, it requires a manual page refresh to reflect the changes in the progress bar. To address this, I've added a refresh button. Now, I want this button to trigger automatically whenever the progress bar status changes. Can anyone provide guidance on how I can achieve this using a custom handler?

Currently, I've written this code with the assumption that the record is saved whenever the status changes.

    {

    request: "crt.SaveRecordRequest",

    handler: async (request, next) => {

        const schemaName = "UsrNewProductsOnboardingformpage";  

        const buttonId = "Button_qef55yg";

        const button = request.$record.$Model[schemaName].$Buttons[buttonId];

        if (button) {

            button.instance.execute();

            console.log("Button clicked");

        } else {

            console.log("Button not found");

        }

        return next?.handle(request);

    }

}

Like 1

Like

4 comments

Have you tried turning on "Enable Live Data Update" for the object? Turning that on should make it refresh automatically when the data changes with no code. 

See https://customerfx.com/article/automatically-refreshing-a-creatio-freed…

Alternatively, you could add code to refresh the page: https://customerfx.com/article/refreshing-reloading-page-or-list-data-o…

Ryan

Ryan Farley,

Hi Ryan,

I tried enabling "Live Data Updates" for the object, but it still didn't work out. Will try the alternate approach to see if it's work.



Thanks 

 

Abhishek,

 

Hello,

 

Try this handler in the page (don't forget to add creatio-devkit/common to  your page schema (example define("UsrTest_FormPage", /**SCHEMA_DEPS*/["@creatio-devkit/common"]/**SCHEMA_DEPS*/, function/**SCHEMA_ARGS*/(sdk)/**SCHEMA_ARGS*/ {):

{
				request: "crt.ApprovalActionHandlerRequest",
				handler: async (request, next) => {
					const result = await next?.handle(request);
					const handlerChain = sdk.HandlerChainService.instance;
					await handlerChain.process({
						$context: request.$context,
						type: 'crt.LoadDataRequest',
							config: {
								"loadType": "reload",
								"useLastLoadParameters": true
							},
							"dataSourceName": "PDS"
					});
				}
			}

Worked correctly in my demo.

Oleg Drobina,

Hello,

I tried, but it didn't work, nor did it even trigger after the changes. Do I need to change the request from "crt.ApprovalActionHandlerRequest" to any other request?

Show all comments

We're trying to create a chart to analyse Lead progression through the different Lead Stages, but the only sorting options are alphabetically by the grouping column or by the measure value. We want this to be sorted by an additional column on the Lead Stage that defines the order within the Lead progression rather than alphabetically or by the value to keep a consistent and logical order to the data, but cannot see an option for this unless there's a trick we're missing. Could someone please advise on how this might be done? We're mostly working with Freedom UI pages and therefore charts.

Like 2

Like

6 comments

Vladimir Sokolov,

it may be related, but that question is discussing combo boxes in pages, whereas I’m looking for chart sorting (e.g. in a bar graph) so I expect any solution would be fairly different.

Harvey Adcock,

 

Good day,

 

Could you please provide more details about your business task?



Perhaps you could take a screenshot with a description of your requirements so that we can better understand them and offer advice.

 

We are looking forward to your feedback.



Best regards,

Pavlo

Hi Pavlo,

 

Sure, what the business is asking for is to be able to sort a chart's columns by the lead stage through the process, rather than by the stage's name alphabetically or by the total number of leads in each stage as can be selected by default in the chart options. For example, see this chart available in the Home section of the Sales workplace in a clean CRM trial environment:

 

It is currently sorted by the stage name alphabetically, which doesn't align with the progression you actually get through the Opportunity stages. Looking at the sorting options, we can see that the only ones available are to sort by the grouping name alphabetically, or by the measure value:

 

So we are unable to sort by another field on the Lead Stage lookup that we've created - Stage Number - which would order it correctly. What we'd like is to be able to use that additional field for sorting without using it as the labels for the x axis.

 

If there are any workarounds for this besides numbering the stage names themselves, we'd love to hear about them!

 

Many thanks,

Harvey

Harvey Adcock,

Good day,

 

Unfortunately, it's not possible to implement this with the current basic functionality. However, we have registered the idea for our development team to consider implementing this feature.

Perhaps the "Full pipeline" dashboard type may work for you, where stages are grouped according to their placement in the DCM field?





 

Thank you for reaching out!

Hi Pavlo

 

Would you know if more advance sorting of dashboards has been enabled in any further Creatio releases? 

 

Thanks,

Jacek

Show all comments

Hello community,

I have a use case where I need to add a column in attachments for a section in freedom UI and it should only be visible for that particular section. Can anyone help with this?

 

Thanks in advance.

 

Regards,

Yasaswini

Like 0

Like

3 comments

I think you set up biz rule for that section, make it visible for that section only cheeky

Hi Yasaswini,

 

We recommend adding the column in configuration to the object nameOfSectionFile (for example: CaseFile), then go to page designer, open settings for attachments and make sure the view is list, rather than gallery and add the column you have previously added in configuration. 

This setting will only be applied to one sections, because CaseFile object is only used in Case section.

 

Best regards,

Alina

Alina Yakovlieva,

Thank you,

But my use case is that I will have to edit that field according to the attached files in the attachments, but we can't edit the attachment's detail. Is there any possibility of editing the column that we create in the attachments?

Show all comments

Hello, I added a new page on BP and open it using a pre-configured page element.



As a data source of the UI page, I use the Contact entity, but I can't specify or send the data source record to the element.

There is no option for that.



I can't use any BR logic as well.



Like 2

Like

1 comments

Hello,

 

From the configured 8x page, you can pass parameter values to the process. In this case, in the Member.

Show all comments