Hi community,

 

I need a way to sort the rows of a data grid according to the values present in a detail.

 

I have my detail in the candidate object like this:

 

Here is a small simplified diagram of the relationship between my lookup, my detail and my object:

I would like to run this sql query to filter the candidates :

SELECT c.* FROM technocandidats tc
RIGHT JOIN candidats c ON c.id = tc.candidat_id
WHERE tc.techno_id = n OR
tc.techno_id = n OR ...

where "n" will be the techno's id.

 

Is there a way to do this directly in the section's advanced filters?

 

Or better still, in a box on top of the section like the one in my candidat object where the detail appears? Or even better, make that in a preconfigured page ?

 

Best regards,

 

Julien Gunther

Like 0

Like

1 comments

Hello Julien,

 

I believe this should be possible as you have the connections between your objects. Could you please contact Creatio support team using support@creatio.com so we can help you with the filter setup in your system?

 

Thank you,

Bogdan S.

Show all comments

Hi there, when I setup a business process, I have to get the value from an element parameter like [#Get base currency rate.XXX#] where XXX is the value stored in a system parameter, say [#Base currency#]. Any suggestion? Thank you in advance!

Please refer to the following figure.

Like 0

Like

2 comments

Hi Andrew,

Just an idea, you could possibly use a formula to get the value you're after. It would be a big series of ?: statements to ultimately put the value into a process parameter. For example: 

(BaseCurrency == "TWD" ? [#Get base currency rate.TWD#] : (BaseCurrency == "USD ? [#Get base currency rate.USD#] :  ...you get the idea))

If you're only going to be handling the 5 currencies you have in your screenshot, you could put each in it's own process param and then would be easier to work with for the formula or in a script task.

Ryan

Ryan Farley,

Hi Ryan, thank you for your advise. Yes, your suggestion is a solution which I thought of previously. But I didn't find any "if then else" formula in the documentation from Creatio. Can you show me where to find this formula? Thank you very much!

Show all comments

I created a custom package working in file system mode on my PC.

The package is set to be "Compiled into a separate assembly".

When I compile it (selecting "Compile" in the dropdown menu near the package name and selecting "Compile all" in the Actions button) I see a popup error reporting syntax errors in all the Client modules of the package (see image below).

Creatio shouldn't compile Client modules since they are Javascript and not C# (the errors are syntax errors related to C# language).

I also "Generate for all schemas".. I tried almost everything without success.

The package works fine, even exported and installed in cloud production environment, but I cannot compile it in my development environment.

Why does Creatio try to compile in C# the Client modules?

 

 

Like 0

Like

0 comments
Show all comments

Dear,

Is it possible to join documents uploaded on Creatio to an email ?

We would like to store files in Creatio and use them into email attachments (without downloading them into computer).

Thank you !

Nicolas

Like 2

Like

0 comments
Show all comments

Hi,



I have a detail that has been added on an opportunity in code, so I cannot make it read-only with the opportunity designer. How do I set up the code so that make a decimal field in the detail read-only ?



Thanks,



Damien

Like 0

Like

1 comments

Hi Damien,

 

If this is a detail with an editable list simply add this code:

"enabled": false

to the definition of the column that you need to disable (should be added to the detail page schema, not detail schema). So it should look like this:

{
				"operation": "merge",
				"name": "columnName",
				"enabled": false
				}
			},

and refresh the page.

 

Best regards,

Oscar

Show all comments

Hi Team,

 

Do you know why this add-on is no longer supported?

Last update the : 27.10.2020 and compatible till the version 7.12.4 

https://marketplace.creatio.com/app/image-preview-creatio

 

Thank you in advance!

 

Like 0

Like

6 comments

Hello Thibaut, 

 

The add-on is no longer supported as this functionality has been already implemented directly in a system. So you can now, for example, see the preview of the image attached to the case directly on the case page by only clicking on it (without downloading it). 

 

Hope it clarifies!

Best regards,

Anastasiia

Anastasiia Zhuravel,

Hello Anastasiia,

 

With this old add-on, it was also possible to view a PDF file in a popup, the same way as an image. Now, this is not possible anymore. Will this be implemented in a next release? 

We have a customer who used this add-on very frequently and is now complaining that he needs to download each PDF...

 

Kind regards,

Vincent

Vincent Tahon,

 

This functionality has been already implemented directly in a system. So you can now, for example, see the preview of the image attached to the case directly on the case page by only clicking on it (without downloading it). 



Best regards,

Bogdan

Bogdan,

Hello Bogdan,

 

This works fine for images, but not for PDF-files.

The old add-on also showed a similar preview for PDF-files, which is very convenient for our customer who uses many PDF-files.

 

Kind regards,

Vincent

Hi Community

 

Any news on this point?

we have 2 potential projects that are pending on having this feature in Creatio exactly for the same reasons described by Vincent.

pdf preview is available in most of the competition and it would be a big plus to have in Creatio as an OOB feature

thanks

Luis

Luis Tinoco Azevedo,

did you find a solution ?

Show all comments

Hi,

Is there a way to add a notification in Communication panel to notify user when an initiated business process fails, indicating them to re-run the process or contact Sys admin?

Like 1

Like

2 comments
Best reply

Hello,



According to OOB logic, you cannot start a business process based on the SysProcessLog table. But there is a very simple workaround. You can create a view based on the SysProcessLog table and add this newly created object into your business process as a starting signal. Also, you can add different conditions for the records that can be added to your view so having it done you can manage the list of processes that will be added into your view.

You can find a way how to add a view on our Community.

 

Best regards,

Bogdan

Hello,



According to OOB logic, you cannot start a business process based on the SysProcessLog table. But there is a very simple workaround. You can create a view based on the SysProcessLog table and add this newly created object into your business process as a starting signal. Also, you can add different conditions for the records that can be added to your view so having it done you can manage the list of processes that will be added into your view.

You can find a way how to add a view on our Community.

 

Best regards,

Bogdan

Thanks, Bogdan! 

Show all comments

Hello,

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

 

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

 

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

 

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

 

Hope I'm clear enough.

Thanks

 

Like 0

Like

2 comments

Hi Francois,

 

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

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



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

 

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

 

Show all comments

Hi community,

 

What's the best way to filter records in a user friendly way ?

 

I have an object with details and lookups (simplified on this diagram).

Is there a more user-friendly way to filter ObjectSection records based on the lookupDetail value?

I thought of a workaround with a new object, then a detail in that new object that is filtered by a field above, but I don't know if this is the best way to do it. Because these are objects, it's clearly not a good way to filter records. I need these filters to be persistent for the logged in user, but several users will use this search "page" at the same time.

 

The global search is not a good solution either, I need to filter the records of a specific object according to the search values that are in the details of my object.

 

Do you have any idea how I can make this "search page"?

 

Best regards,

 

Julien

Like 0

Like

2 comments

Hello Julien,

I have implemented something like what you're referring to. I have a section where a client manages "areas" and zip codes are assigned to each area (in a detail in this section). This client didn't want to have to create a filter to locate the area for a zip each time they needed - they always locate an area by a zip code in the area. I implemented the ability to search for an area based on a zip code in the detail for the area. It turned out like this: 

Basically, I did the following in the section schema: 

1) Add a text attribute for the value being searched, you'll also want to add an onChange for the attribute so it triggers a change event method. Mine looks like this (note, all the updateSection function does is refresh the section - this is a function in the base section):

attributes: {
	"ZipSearchValue": {
		dataValueType: Terrasoft.DataValueType.TEXT,
		value: "",
		onChange: "updateSection"
	}
}

2) Add an element to the diff bound to the attribute in #1. You could add this with parentName "FiltersContainer" or "GridUtilsContainer", depending on where you want it, but you'll likely need to style it with some CSS to get it to look right. Mine looks like this: 

{
	"operation": "insert",
	"name": "ZipSearchText",
	"parentName": "FiltersContainer",
	"propertyName": "items",
	"index": 0,
	"values": {
		"layout": {
			"colSpan": 12,
			"rowSpan": 1,
			"column": 0,
			"row": 0,
			"layoutName": "FiltersContainer"
		},
		"hasClearIcon": true,
		"bindTo": "ZipSearchValue",
		"caption": "Find zip",
		"classes": {
			"wrapClassName": ["fx-zipsearch"]
		}
	}
}

3) When the user types in the textbox, it will trigger the onChange which just refreshes the section. When the section refreshes, it will call the getFilters method in the section code where you can append to the filters for the list. I have an article about that here: https://customerfx.com/article/programmatically-overriding-or-adding-fi… My filter method looks like this:

getFilters: function() {
	var filters = this.callParent(arguments);
 
	if (!Ext.isEmpty(this.get("ZipSearchValue"))) {
		var filter = Terrasoft.createFilterGroup(),
			subFilters = Terrasoft.createFilterGroup();
 
		subFilters.add("ZipValueFilter",
			Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrZipCodeValue", this.get("ZipSearchValue").trim())
		);
 
		filter.addItem(Terrasoft.createExistsFilter("[UsrZipCode:UsrDistributorArea].Id", subFilters));
		filters.add("ZipSearchFilter", filter);
	}
 
	return filters;
}

Hope this helps get you started.

Ryan

Ryan Farley,

Thank you for your contribution. It will be very useful.



In the "OperatorCustomerEngagementCenter" package there is a client module named "SearchAccountAndContactPage.js". You can find a screenshot here: https://community.creatio.com/questions/adding-button-search-contacts-a…

I will try to load a custom view like this and use your answer to create filters. I'll post how I did it once done so other people can do it too.

 

Best regards,

 

Julien

Show all comments

Hi community,

 

I try to display (or not) an element based on information found on the contact page of the connected user. I tried with a business rule but I only can choose the user connected and not its related objects and their attributes.

 

So I tried something like that in the methods :

		methods: {
			init: function() {
				this.callParent(arguments);
				this.mixins.MultiChoiceMixin.init.call(this, arguments);
				// console.log(this.checkIfInHR());
				},
			/** 
			* Check if connected user is in HR department
			* @param  {string} departmentId  The contact's department Id
			* @param  {string} contactTypeId The contact's type Id
			* @return {bool} 			true if user is in HR department, otherwise false
			*/
			checkIfInHR: function(departmentId = "", contactTypeId = ""){
 
				// if called without args, query connected contact
				if (departmentId == "" && contactTypeId == ""){
					var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Contact"});
 
					// query the contact's department and contact's type
					esq.addColumn("Department");
					esq.addColumn("Type");
 
					// Execute the query 
					esq.getEntity(Terrasoft.SysValue.CURRENT_USER_CONTACT.value, function(res) {
						if (res.success){
							// call checkIfHR again but with args this time
							this.checkIfHR(res.entity.values.Department.value, res.entity.values.Type.value);
						}}, this);
				} else {
					// if args are passed
					// console.log() will be removed in prod
					console.log("departmentId : ", departmentId);
					console.log("contactTypeId : ", contactTypeId);
					console.log("response : ", departmentId == "ca611978-6277-4576-8a96-22ae54fe4d79" && contactTypeId == "60733efc-f36b-1410-a883-16d83cab0980");
					// 1st Id : HR department, 2nd Id: Our company
					return departmentId == "ca611978-6277-4576-8a96-22ae54fe4d79" && contactTypeId == "60733efc-f36b-1410-a883-16d83cab0980";
				}
			}
		}

Then I tried to call this method in the DIFF part :

			{
				"operation": "insert",
				"name": "Tab0f271a37TabLabel",
				"values": {
					"caption": {
						"bindTo": "Resources.Strings.Tab0f271a37TabLabelTabCaption"
					},
					"items": [],
					"order": 11
				},
				"parentName": "Tabs",
				"propertyName": "tabs",
				"index": 10,
				"enabled": this.checkIfInHR()
			},

but it always gives me this error now:

Uncaught TypeError: this.checkIfInHR is not a function

 

Do you have a better way to hide a tab based on values in the user connected' contact page or a way to fix my error ?

 

Best regards,

 

Julien G.

Like 0

Like

3 comments
Best reply

Hi Julien,

 

I cannot see the checkIfInHR method call on the init method execution, but I suppose you wanted to call it inside the "enabled" property of the Tab0f271a37TabLabel object. Ok, but the problem is that you need to use:

"enabled": {"bindTo": "checkIfInHR"},

and also the "enabled" property should be initialized inside the "values" object. So the code should've been:

onEntityInitialized: function() {
				this.callParent(arguments);
				this.mixins.MultiChoiceMixin.init.call(this, arguments);
				this.checkIfInHR();
				},
 
....
 
{
				"operation": "insert",
				"name": "Tab0f271a37TabLabel",
				"values": {
					"enabled": {"bindTo": "checkIfInHR"},
					"caption": {
						"bindTo": "Resources.Strings.Tab0f271a37TabLabelTabCaption"
					},
					"items": [],
					"order": 11
				},
				"parentName": "Tabs",
				"propertyName": "tabs",
				"index": 10
			},

The next problem is that this approach won't work since there is no "enabled" property for tab labels. So the general approach should be modified.

 

I would suggest using this check in the onEntityInitialized method:

onEntityInitialized: function() {
				this.callParent(arguments);
				this.mixins.MultiChoiceMixin.init.call(this, arguments);
				this.reformTabsCollection();
			},
			reformTabsCollection: function(){
				this.checkIfInHR();
				var tabsCollection = this.get("TabsCollection");
				if (this.get("BooleanAttribute")==false) {
                        tabsCollection.removeByKey("TheTabYouNeedToBeNotVisible");
                    }
			}

Also you need to create some bool attribute where the result of the checkIfInHR method will be written (using this.set("BooleanAttribute", true) or this.set("BooleanAttribute", false) at the end of the checkIfInHR method execution based on the checkIfInHR method results). There is no need to store the tab on the page in case it should be non clickable.

 

Best regards,

Oscar

Change it from this:

"enabled": this.checkIfInHR()

To this (and move inside of "values"):

"enabled": { "bindTo": "checkIfInHR" }

Ryan

Hi Julien,

 

I cannot see the checkIfInHR method call on the init method execution, but I suppose you wanted to call it inside the "enabled" property of the Tab0f271a37TabLabel object. Ok, but the problem is that you need to use:

"enabled": {"bindTo": "checkIfInHR"},

and also the "enabled" property should be initialized inside the "values" object. So the code should've been:

onEntityInitialized: function() {
				this.callParent(arguments);
				this.mixins.MultiChoiceMixin.init.call(this, arguments);
				this.checkIfInHR();
				},
 
....
 
{
				"operation": "insert",
				"name": "Tab0f271a37TabLabel",
				"values": {
					"enabled": {"bindTo": "checkIfInHR"},
					"caption": {
						"bindTo": "Resources.Strings.Tab0f271a37TabLabelTabCaption"
					},
					"items": [],
					"order": 11
				},
				"parentName": "Tabs",
				"propertyName": "tabs",
				"index": 10
			},

The next problem is that this approach won't work since there is no "enabled" property for tab labels. So the general approach should be modified.

 

I would suggest using this check in the onEntityInitialized method:

onEntityInitialized: function() {
				this.callParent(arguments);
				this.mixins.MultiChoiceMixin.init.call(this, arguments);
				this.reformTabsCollection();
			},
			reformTabsCollection: function(){
				this.checkIfInHR();
				var tabsCollection = this.get("TabsCollection");
				if (this.get("BooleanAttribute")==false) {
                        tabsCollection.removeByKey("TheTabYouNeedToBeNotVisible");
                    }
			}

Also you need to create some bool attribute where the result of the checkIfInHR method will be written (using this.set("BooleanAttribute", true) or this.set("BooleanAttribute", false) at the end of the checkIfInHR method execution based on the checkIfInHR method results). There is no need to store the tab on the page in case it should be non clickable.

 

Best regards,

Oscar

Oscar Dylan,

 Thank you very much !

 

Best regards,

 

Julien

Show all comments