How do you add a dashboard page as a section in Freedom UI? I have an existing dashboard page which I want users to be able to access as though it were its own section, but I can't add the existing page to the workplace as it doesn't exist in the lookup window. I had a look at creating a new section in the application hub, but this will either create a new entity or have to be based over an existing entity, but this dashboard isn't based over any one particular entity and presumably doing this would create a new Section page which I didn't want. Any info on how to turn an existing page into a Section in Freedom UI?

Like 1

Like

4 comments
Best reply

Hi Pavlo, Essentially I want to create a standalone section page, so one that isn't tied to a specific entity or have to be created using the section template in the application hub.

Yes, using Freedom UI exclusively.

And the page I have created is inherited from the Homepage exactly. Is it possible to register this page as a section page?

Hi Harvey!

Please confirm, am I understanding correctly that you want to replace the section ListPage with your own page containing dashboards?

Is your dashboard page implemented in FreedomUI?

Which page does this page inherit from? Is it the Homepage?

Hi Pavlo, Essentially I want to create a standalone section page, so one that isn't tied to a specific entity or have to be created using the section template in the application hub.

Yes, using Freedom UI exclusively.

And the page I have created is inherited from the Homepage exactly. Is it possible to register this page as a section page?

Hi,

 

In general, there isn't a built-in feature for this. However, for such usage, we have the option to set a Homepage for the workplace. You can set this page instead of the current one.

 

But if you need two of your dashboard pages to be on the same workplace and displayed as a section, you can create a new section in the Freedom UI and replace its SectionSchemaUId with the UId of your dashboard page schema.



update "SysModule" set "SectionSchemaUId" = 'UId of dashboard schema module' where "Id" =  'Id of the section you want to open with the dashboard'

 

For example, I successfully set the SalesEnterpriseHomePage to open from the test section.



Hope this helps!

Thanks Pavlo, we already have a page being used as the Home page of the workplace the additional dashboard needs to reside in, so we had to do the database editing you suggested to get it to work, which it now does - thank you! This would be a very useful option to be able to do without custom SQL, no code being the aim of Creatio config going forward!

Show all comments

How can you set the default values created for an Activity when clicking on the Calendar in Freedom UI? I can't see anything in the OOTB code for calendar setup that would pass default values into the calendar activity creation process, but presume there must be some JSON parameters that could be set to specify things like the Activity Type/Category for example. Any help appreciated.

Like 3

Like

3 comments

Hello,

Unfortunately, this logic is hardcoded and cannot be changed at the moment. We have raised an improvement for the development team to make it possible to configure the default Category for this element in future releases.

Thank you for reaching out!

Thanks Pavlo, so no properties in the JSON can be set for this currently at all then? And no overriding of any of the schema handlers would enable setting them either? We currently have a fair amount of handler code, so wouldn't be too worried about adding some more in for now until this is possible in no code.

Unfortunately, it is not possible to change this logic for this scheme at the moment, even using such handlers.

Show all comments

How do you set a specific user's Time Zone without logging in as that user? You can modify your own Time Zone in the Profile section, but I don't think you can access this page for users other than your own, and the user's Time Zone isn't shown in the OOTB User card, so I can't see how an admin could set the Time Zone for a specific user. Anybody know how this could be done?

Like 0

Like

2 comments

Hello,

 

The user's timezone is stored in the SysAdminUnit table, in the TimeZoneId column. However, please note that values in this column are stored not as references to time zones from the directory, but as Time Zone Codes.

You can verify the code in the "Time zones" lookup.

So, you can change this value for any user without logging in with a script in the database:

 

update "SysAdminUnit" set "TimeZoneId" = 'GMT Standard Time' where "Id" = '***User's Id***'

Thank you for reaching out.

Thanks Pavlo, in the end we added the Timezone field to the System user page (UserPageV2) so that we can change the timezone of users without executing SQL. For others wanting to do the same, we used the following code for the user page replacing schema:

define("UserPageV2", ["UserPageV2Resources"],
	function() {
		return {
			entitySchemaName: "VwSysAdminUnit",
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "TimeZone",
					"parentName": "Header",
					"propertyName": "items",
					"values": {
						"dataValueType": Terrasoft.DataValueType.ENUM,
						"value": {"bindTo": "TimeZone"},
						"layout": {"column": 13, "row": 2, "colSpan": 8}
					}
				}
			]/**SCHEMA_DIFF*/,
			attributes: {
				/**
				 * Time zone.
				 */
				"TimeZone": {
					dataValueType: Terrasoft.DataValueType.LOOKUP
				}
			}
		};
	}
);

 

Show all comments

In a Business Process, we are calling a Web Service using the Web Service Call element, but sometimes we will get a failure that we need to log to a custom table for action later. We really could do with as much information about the failure as possible, including being able to log out the parameters that the Web Service was passed so the support users can assess what happened without having to have trace logging turned on for the BP and digging into the BP log as well. I can't see any output on the web service call for that, but maybe someone else has found a way to get this info?

Like 2

Like

2 comments

Hi Harvey, we have similar needs, but no result, unfortunately. 

So, we log all parameters manualy before calling web service :(

Hello Harvey,



If you want to see the body of the request generated by the web service and the response that comes from the server - You can try to use Telerik Fiddler tool to capture requests that are being sent from the Creatio instance

 

But this advice is relevant only for local environments.

If the environment is on a local machine, you can connect Fiddler and test it.

 

In general, if you do not want to use data tracing for a process, we believe that this goal can be achieved through development. For example, a web service call will be made using a script task, in which you will process various responses from the server and write the information you need into a table using C# code.



Thank you.

Show all comments

Hello, 

Are the instructions below still apply to add a edit page to a lookup or is there an easy way to do this on Freedom UI version 8.1.1?

 

Adding lookup with edit page | Community Creatio

 

Thanks,

Jose

Like 0

Like

1 comments
Best reply

It is still the same since the Lookups area is still classic UI.

Also, BTW I have the instructions with Postgresql instructions here, if interested/needed: https://customerfx.com/article/creating-an-edit-page-for-a-lookup-in-cr…

It is still the same since the Lookups area is still classic UI.

Also, BTW I have the instructions with Postgresql instructions here, if interested/needed: https://customerfx.com/article/creating-an-edit-page-for-a-lookup-in-cr…

Show all comments

Is it possible to specify an extra column or 2 to be used for searching against when typing text into a combobox in Freedom UI? The use case is that users can select an Account in the ComboBox lookup, but should be able to search in that dropdown combobox using either the account's Name, or its Account Number.

 

I know it's possible to do this by opening up the modal lookup window when that's configured, but to save some clicks ideally it would be possible to just type/paste into the combobox to achieve this behaviour.

Like 1

Like

1 comments

Hello Harvey,

 

It's not possible for now, but we've registered it in our R&D team backlog for consideration and implementation in future application releases.

 

Thank you for helping us to improve our product. 

Show all comments

Hello,



Can anyone tell me How to merge duplicate contact records in freedom UI.

I tried using the classic UI but  can't find any duplicate rule or show duplicates in the action button



Thanks in advance.

Like 0

Like

3 comments

Hello,



To find duplicates in Freedom UI, you need to go to System Designer, then select Setup duplicates rules.



There you will be able to perform all the actions you need.

Malika,

Hi ,

Setup duplicates rules is not sowing under System setup. Is it due to the latest version??



Abhishek,

Is this a cloud or local system?

If it's local, you probably need to set up the deduplication components first to have it available.

Show all comments

I'm looking for the code/process that does the denormalisation of Account Address entity records created against an Account on to that Account, as well as the code/process that normalises data put on the Account record for address details that get made into Account Address records (or update the existing one, if that's what it does). I haven't been able to find it in event listeners or business processes yet, but I presume it must be in one of those. We need to add some additional new fields to follow the same process, and it would seem sensible to use the same code to do so. We're on 8.1.1.

Like 0

Like

4 comments
Best reply

If you're referring to the code that adds the primary address values to the account (or contact) columns, that is in C# BaseAddressSynchronizer. This code is triggered from the specific address objects (such as AccountAddress) subprocess (open AccountAddress object then click "open process").  

FYI in classic pages there was also code on the page that did this via sandbox messages iirc.

Ryan

If you're referring to the code that adds the primary address values to the account (or contact) columns, that is in C# BaseAddressSynchronizer. This code is triggered from the specific address objects (such as AccountAddress) subprocess (open AccountAddress object then click "open process").  

FYI in classic pages there was also code on the page that did this via sandbox messages iirc.

Ryan

Thanks Ryan, any idea what the correct way to add an additional field to the synchronization process would be? I'm expecting that it would require adding a new C# module that inherits from the BaseAddressSynchronizer class (or maybe the AcountAddressSynchronizer for Account Addresses specifically?) and adds columns to the GetSynchronizationColumnMappings method in the following way:

protected override ICollection<SynchronizationColumnMapping> GetSynchronizationColumnMappings() {
	SynchronizationColumnComparator stringEqualComparator = EqualComparatorProvider.GetStringEqualComparator();
	var baseColumnMappings = base.GetSynchronizationColumnMappings();
	baseColumnMappings.Add(new SynchronizationColumnMapping {
		SourceColumnName = "SrcColName",
		DestinationColumnName = "TgtColName",
		Comparator = stringEqualComparator
	});
	return baseColumnMappings;
}

With the Account Address entity's column name as the source column name and the Account entity's column name as the target column name. Does the entity's subprocess also need editing to make this logic work, or does the GetAddressSynchronizer method used in the existing subprocess automatically include the extra column mappings defined in the override? Can't see where that method comes from.

Harvey Adcock,

 

Hi!

Yes, you need to create a new source code schema, add a new class that inherits from the BaseAddressSynchronizer, and override the GetSynchronizationColumnMappings method.

You may use the AccountAddressSynchronizer class as an example.

To apply the changes to the entity, it is necessary to create a replacing object and update its process methods (to call the overridden method instead of the default one).

Natalia Kalynovska,

 

Hi Natalia, does that require recreating the Process that's attached to the OOTB Account Address entities? As the replacing object in our package doesn't have that process by default, so in order to change it, it seems like we would have to recreate the previous Process with those changes? And does a Process in a replacing object "overwrite" the Process in the replaced object, or do they both still operate? I'm not sure if there's much documentation on the Entity Processes.

 

Thanks,

Harvey

Show all comments

Hello,

 

I have a page with the progress bar (cases) on Studio 8.1.0.6827. To simplify the explanation, let's say there are two stages based on a status field: New Request and Completed and I have business rules stating that the request description is required if the status is Completed. 



If the 'Save record on stage change' is off, when I click on the Completed bar, the description field becomes require and I cannot save without entering. But of 'Save record on stage change' is on the record is saved and the status changes to Completed even if the description was not entered. 



Any ideas on how to make it work where the 'Save record on stage change' is on but the business rules are applied, and the record is not saved if the required fields for that status are missing?



Thanks,

Jose

 

Like 1

Like

1 comments

Hello!

 

To provide you with an answer, we need to investigate it deeper. Please contact the Support Team directly via support@creatio.com and provide all these details.

 

Best regards, Mariia

Show all comments

Is it possible to restrict the "Owner" filter for Timeline components to only show Contacts which match a specific filter condition? We are currently seeing every Contact as an option, but for us this should be restricted to only Contacts which have a User record associated with them, and ideally we'd want to add some more customisation to the filter options beyond this.

Like 0

Like

9 comments
Best reply

I've discovered that it's possible to add this using code. To do so, you need to override the crt.LoadDataRequest handler and use the following code:

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		// Filter Timeline's Owner filter to just Contacts with a User record
		if(request.dataSourceName === "ByOwnerQuickFilterInTimeline_xi3lpgm_ComboBox_List_DS") {
			const filter = new sdk.FilterGroup();
			await filter.addExistsFilter("[SysAdminUnit:Contact:Id].Id");
 
			// workaround for filters
			const newFilter = Object.assign({}, filter);
			newFilter.items = filter.items;
 
			request.parameters.push({
				type: "filter",
				value: newFilter
			});
		}
 
		return await next?.handle(request);
	}
},

You have to replace the name of the Timeline component in the above code from Timeline_xi3lpgm to whatever the component is called on your page.

Hello Harvey,



There is no such option for now, however, we've registered it in our R&D team backlog for consideration and implementation in future application releases.

 

Thank you for helping us to improve our product. 

Thanks Bogdan, it's definitely a feature that's needed - having every Contact show up in the Owner filter with no way to change this on a CRM platform isn't ideal.

I've discovered that it's possible to add this using code. To do so, you need to override the crt.LoadDataRequest handler and use the following code:

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		// Filter Timeline's Owner filter to just Contacts with a User record
		if(request.dataSourceName === "ByOwnerQuickFilterInTimeline_xi3lpgm_ComboBox_List_DS") {
			const filter = new sdk.FilterGroup();
			await filter.addExistsFilter("[SysAdminUnit:Contact:Id].Id");
 
			// workaround for filters
			const newFilter = Object.assign({}, filter);
			newFilter.items = filter.items;
 
			request.parameters.push({
				type: "filter",
				value: newFilter
			});
		}
 
		return await next?.handle(request);
	}
},

You have to replace the name of the Timeline component in the above code from Timeline_xi3lpgm to whatever the component is called on your page.

Harvey Adcock,

good find, thanks!

You should mark your own answer as solution ;)

Harvey Adcock,

Well done! Thanks for sharing this Harvey. 

Also, if you've moved to 8.1.1 you no longer need the filters workaround - it's finally working properly in 8.1.1, just thought I'd mention.

Ryan

Ryan Farley,

Ahh great to hear, thanks for the info Ryan - and thanks for spreading the info about that workaround in the first place!

I'd like to share my solution on lookup filtering.

We wanted to have only contacts from our company and in certain functional role.

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		if (request.dataSourceName !== "FbContact_List_DS") {
			return await next?.handle(request);
		}
 
		const ourCompanyFilter = new sdk.CompareFilter(
			sdk.ComparisonType.Equal, 
			new sdk.ColumnExpression({
				columnPath: "Account.Type"
			}), 
			new sdk.ParameterExpression({
				value: Constants.AccountType.OurCompany
			})
		);
 
		const funcRoleFilter = new sdk.CompareFilter(
			sdk.ComparisonType.Equal, 
			new sdk.ColumnExpression({
				columnPath: "[SysAdminUnit:Contact:Id].[SysUserInRole:SysUser:Id].SysRole.Id"
			}), 
			new sdk.ParameterExpression({
				value: Constants.FunctionalRole.MyCustomFunctionalRole
			})
		);
 
		request.parameters.push({
			type: sdk.ModelParameterType.Filter,
			value: ourCompanyFilter
		});
 
		request.parameters.push({
			type: sdk.ModelParameterType.Filter,
			value: funcRoleFilter
		});
 
		return await next?.handle(request);
	}
}

 

Alex Zaslavsky,

Interesting, it hadn't occurred to me to push multiple filters to the parameters. I've always added the multiple filters to a FilterGroup and then added the group to the parameters. I guess it's an array for a reason :) Nice to know it works that way as well.

Ryan

Hello , 

Can we set a current user as a default in timeline quickfilter ? 

Show all comments