Is it possible to set the default Date & time format for all users in the system? Or at least change the format connected with the language? (it is not possible to set format for the user you can select the language with the default format) 

 

Like 2

Like

2 comments

Yes please !

Hello Paulina, 

 

Thank you for your question!



Unfortunately, there is no basic system setting to change the time zone for already existing system users.



You can use the SQL script for this purpose. 



Please note that the DateTimeFormatId column value refers to the SysLanguage table and the TimezoneId value refers to the Code column in Timezone table so the SQL script will be the following: 



UPDATE SysAdminUnit SET DateTimeFormatId = 'value from SysLanguage', TimeZoneId = 'Code column value from TimeZone table' WHERE ContactID IS NOT NULL



All you need to do is to add the proper IDs you'd like to change the values to.  



For example, here is the script with values which will set Date and Time format for all users to English and timezone to GMT:



UPDATE SysAdminUnit SET DateTimeFormatId = '910eb38b-c00f-4d84-8e4a-853a62476b68', TimeZoneId = 'GMT Standard Time' WHERE ContactID IS NOT NULL 



Regards,

 

Orkhan

Show all comments

Is it possible to cancel a DCM transition from JS code? I believe it used to be possible in the classic UI, but I can't find any info on achieving it in Freedom UI. Trying to intercept the call with a handler for `crt.EntityStageProgressBarStageChangedHandlerRequest` allows "cancelling" it in a sense, as we can prevent the continuation of the handler chain by not performing the `return await next?.handle(request);` call, similar to how you would omit the `this.callParent(arguments)` when using classic UI, which does prevent the change from happening/further processing, but this leaves the selected stage highlighted instead of visually returning it back to the actually active stage. I'm currently using version 8.1.0

Like 0

Like

1 comments
Best reply

Hello!



In order to cancel a DCM transition you will have to add a handler for the system request crt.SaveRecordRequest, which is executed when you click the Save button on the record editing page.



In this example, we also added crt.HandleViewModelAttributeChangeRequest, which is executed whenever the value of an attribute changes, and an "IsStageChanged" attribute to control the Stage state. This way we check if a Stage attribute (LookupAttribute_ioghn6a) has been changed and prevent it from being saved. You can adjust this code according to your business needs:

 

...
	viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
			{
				"operation": "merge",
				"path": [
					"attributes"
				],
				"values": {
					...
					"IsStageChanged":{
						value: false
					}
				}
			},
 
		]/**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/,
 
		handlers: /**SCHEMA_HANDLERS*/[
			{
				request: "crt.SaveRecordRequest",
				handler: async (request, next) => {
 
					if(await request.$context.LookupAttribute_ioghn6a && await request.$context.IsStageChanged){
						request.$context._notifyService.show({message: 'Cannot set status'});
						return false;
					}
 
					const saveResult = await next.handle(request);
					if(saveResult){
						request.$context.IsStageChanged = false;
					}
 
					return saveResult;
				}
			}, 
			{
				request: "crt.HandleViewModelAttributeChangeRequest",
				handler: async (request, next) => {
 
					if (request.attributeName === 'LookupAttribute_ioghn6a' && request.value != request.oldValue && request.oldValue) {
						request.$context.IsStageChanged = true;
					}
					return next?.handle(request);
				},
			}
		]/**SCHEMA_HANDLERS*/,
...

 

Hello!



In order to cancel a DCM transition you will have to add a handler for the system request crt.SaveRecordRequest, which is executed when you click the Save button on the record editing page.



In this example, we also added crt.HandleViewModelAttributeChangeRequest, which is executed whenever the value of an attribute changes, and an "IsStageChanged" attribute to control the Stage state. This way we check if a Stage attribute (LookupAttribute_ioghn6a) has been changed and prevent it from being saved. You can adjust this code according to your business needs:

 

...
	viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
			{
				"operation": "merge",
				"path": [
					"attributes"
				],
				"values": {
					...
					"IsStageChanged":{
						value: false
					}
				}
			},
 
		]/**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/,
 
		handlers: /**SCHEMA_HANDLERS*/[
			{
				request: "crt.SaveRecordRequest",
				handler: async (request, next) => {
 
					if(await request.$context.LookupAttribute_ioghn6a && await request.$context.IsStageChanged){
						request.$context._notifyService.show({message: 'Cannot set status'});
						return false;
					}
 
					const saveResult = await next.handle(request);
					if(saveResult){
						request.$context.IsStageChanged = false;
					}
 
					return saveResult;
				}
			}, 
			{
				request: "crt.HandleViewModelAttributeChangeRequest",
				handler: async (request, next) => {
 
					if (request.attributeName === 'LookupAttribute_ioghn6a' && request.value != request.oldValue && request.oldValue) {
						request.$context.IsStageChanged = true;
					}
					return next?.handle(request);
				},
			}
		]/**SCHEMA_HANDLERS*/,
...

 

Show all comments

There is a requirement in which I have to make printable visible on the basis of data in the connected object. I followed this article https://customerfx.com/article/showing-or-hiding-printables-based-on-a-value-for-the-selected-record-in-creatio/.

 

It is working fine on the combined mode in edit page and only showing printable which is matching with the condition, but the same is not reflecting on the separate mode in edit page and showing the complete list of printable.

 

Is there something which I am missing or any other workaround ?

Methods which I have added on section is :

initQueryColumns: function(esq) {

                                                          this.callParent(arguments);

 

                                                          if (!esq.columns.contains("Id")) {

                                                                        esq.addColumn("Id");

                                                          }

                                           },

 

                                           GetDocumentCollection: function() {

                                                                        var recObj = [];

 

                                                                        var id =  this.get("GridData").get(this.get("ActiveRow")).get("Id");

                                                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Document" });

                                                                        esq.addColumn("UsrDocumentName.Name");

                                                                        esq.filters.add("UsrTransactions", Terrasoft.createColumnFilterWithParameter(

                                                                                      Terrasoft.ComparisonType.EQUAL, "UsrTransaction", id));

                                                                        esq.getEntityCollection(function(result) {

                                                                                      var response = result.collection;

                                                                                      var hasRecord = (response.collection.length !== 0);

                                                                                      if(hasRecord) {

                                                                                      result.collection.each(function(item) {

                                                                                                    recObj.push(item.get("UsrDocumentName.Name"));

                                                                                      });

                                                                                      }

                                                                        this.set("DocumentCollection",recObj);

                                                                                     

                                                                        }, this);

                                                         

                                           },

                                           initCardPrintForms: function() {

                                                          this.callParent(arguments);

                                                          var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName);

                                                          if (Ext.isEmpty(printMenuItems)) return;

                                                         

                                                          printMenuItems.each(function(item) {

                                                                        item.set("Visible", {bindTo: "getPrintMenuItemVisible"});

                                                          }, this);

                                           },

                                           getPrintMenuItemVisible: function(reportId) {

                                                          if (Ext.isEmpty(this.get("ActiveRow"))) return true;

                                                          var Id = this.get("GridData").get(this.get("ActiveRow")).get("Id"),

                                                                        printMenuItems = this.get(this.moduleCardPrintFormsCollectionName),

                                                                        item = printMenuItems.find(reportId);

                                                          this.GetDocumentCollection();

                                                          if (Ext.isEmpty(item)) return;

                                                          var ReportName = item.get("Caption");

                                                          var DocCollection = this.get("DocumentCollection");

                                                          if(DocCollection === undefined){

                                                                        return false;

                                                          }

                                                          else{

                                                                        if(DocCollection.includes(ReportName)){return true;}

                                                                        else{return false;}

                                                                                     

                                                          }

                            

                                           }

Methods which I have added on edit page is :

                                                         GetDocumentCollection: function() {

                                          

                                                                        var recObj = [];

                                                                        var id =  this.get("Id");

                                                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Document" });

                                                                        esq.addColumn("UsrDocumentName.Name");

                                                                        esq.filters.add("UsrTransactions", Terrasoft.createColumnFilterWithParameter(

                                                                                      Terrasoft.ComparisonType.EQUAL, "UsrTransaction", id));

                                                                        esq.getEntityCollection(function(result) {

                                                                                      var response = result.collection;

                                                                                      var hasRecord = (response.collection.length !== 0);

                                                                                      if(hasRecord) {

                                                                                      result.collection.each(function(item) {

                                                                                                    recObj.push(item.get("UsrDocumentName.Name"));

                                                                                      });

                                                                                      }

 

                                                                        this.set("DocumentCollection",recObj);

 

                                                                        }, this);

                                                         

                                           },

                                           initCardPrintForms: function() {

                                                          this.callParent(arguments);

 

                                                          var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName);

                                                          if (Ext.isEmpty(printMenuItems)) return;

 

                                                          printMenuItems.each(function(item) {

                                                                        item.set("Visible", {bindTo: "getPrintMenuItemVisible"});

                                                          }, this);

                                           },

                                                                                      getPrintMenuItemVisible: function(reportId) {

                                                          //this.GetDocumentCollection();

                                                          var Id = this.get("Id"),

                                                                        printMenuItems = this.get(this.moduleCardPrintFormsCollectionName),

                                                                        item = printMenuItems.find(reportId);

                                                          if (Ext.isEmpty(item)) return;

                                                          this.GetDocumentCollection();

                                                          var ReportName = item.get("Caption");

                                                          var DocCollection = this.get("DocumentCollection");

                                                          if(DocCollection === undefined){

                                                                        return false;

                                                          }

                                                          else{

                                                                        if(DocCollection.includes(ReportName)){return true;}

                                                                        else{return false;}

                                                                                     

                                                          }

                            

                                           }

Like 0

Like

1 comments

Hello,



In order to filter printables in edit mode, both in your page and section replacing schemas, you need to replace a method preparePrintFormsMenuCollection. Inside this method, you should leave base method as is (the code before and after comments below), and only change the code between the comments to create the logic that fits your business needs:

 

preparePrintFormsMenuCollection: function(printForms) {
    printForms.eachKey(function (key, item) {
        if (!item.get("Caption")) {
            item.set("Caption", item.get("NonLocalizedCaption"));
        }
        item.set("Tag", key);
        if (item.get("TypeColumnValue")) {
            item.set("Visible", { bindTo: "getPrintMenuItemVisible" });
        }
        //Here is your logic for filtering of printables
        /*************************************************************************/
        /* YOUR CODE, for example 
        var currentState = this.get("State");
        var currentStateDisplayValue = currentState.displayValue;
        var currentStateDisplayValueToLower = currentStateDisplayValue?.toLowerCase();
        var isStateEmpty = Ext.isEmpty(currentState);
        if (!isStateEmpty && currentStateDisplayValue && item.get("Caption").includes(currentStateDisplayValueToLower)) {
        item.set("Visible", true);
        }
        else {
        item.set("Visible", false);
        }
        */
        /*************************************************************************/
    }, this);
}

 

Show all comments

Hello,

 

I want to prevent users from deleting details once the status is not DRAFT anymore.

So, I'm thinking to remove the all of the buttons.

Does anyone know how to do this?

 

Thank you.

Like 1

Like

2 comments

Dear David,

 

This can be achieved by code implementation or by business rule.

 

For the business rule, you can turn on Object permissions for this object. Then the business process will be triggered by changing the record for example, and it will be removing right for editing and deleting this record.

 

Hope this helps.

 

Have a great day!

Dear Alina,

 

I notice about this method. 

Actually, I want to keep this method as a last resort.

 

Thank you for your reply.

 

Show all comments

Hi community,

 

I have this requirement where the client must be able to move one or more records from one detail to another through a business process. Following the steps shown in the image below:

 

1. The user must select one or more records from the "Product on Invoice" detail.

 

2. Next, the user executes the business process using the "Add" button. The process must receive the ids of the selected records.

 

3. Finally, all the selected records should then be added to the "Products in the Correction Invoice".

 

 

How can I achieve this requirement on the new Freedom UI?

 

If you need more information, feel free to ask.

 

Thanks in advance.

 

Best Regards,

Pedro Pinheiro

 

 

Like 2

Like

1 comments

Dear Pedro,

 

To execute this idea, you can do the following:

 

1) You can add the element that depends on user's choice in the "User's Action":

 

 

You can add an "Auto-generated/Pre-configured page" asking the user for an Id for example.

 

2) To achieve this, you can add the action on the button to start the business process in the page designer:

 

 

 

For the transfer, you can read the data from both objects, then use the modify data element.

 

You can read more about business process capabilities in the following article tree: https://academy.creatio.com/docs/8.x/no-code-customization/category/bus…

 

Have a great day!

Show all comments

Hi,

is there any way for clients to fill Creatio mini pages remotely by sending the link to access the mini page, fill data and save directly to the database ?

Like 1

Like

1 comments

Hello,



There is no such option. As a workaround, it could be achieved by additional development (for example API integration).

Show all comments

Hello all,

 

Is there a way that I can control what data Creatio binds automatically when I make saves in the section wizard? I'm trying to make edits to an application and Creatio keeps incorrectly binding a section to a workplace not included in that application meaning I have to always remove the binding before doing test installs, otherwise the install fails.

Like 1

Like

5 comments

Hi Kevin,



There is no such option 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. 

 

Hello,

 

I recommend checking the academy article on Automatic data binding to find more details on how this functionality works. 

Mira Dmitruk,

This link doesn't work.



And I would like to vote for making this functionality optional. We don't transfer Workplaces and binding to our customers - they used to organize workplaces by themselves, so deleting automatic binding is extra headache for us



Kind regards,

Vladimir

Vladimir Sokolov,

 

We are sending you the instructions once again: https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…. As you were informed earlier, there is currently no way to control what data Creatio binds automatically when making saves in the section wizard.



However, we have registered this idea to our R&D team backlog for consideration and implementation in future application releases.

 

Any updates on this? Creatio automatically adding dependencies and bindings without asking makes building applications extremely difficult.

Show all comments

Hi , 



By default in freedom, when adding a new task,  the whole list of categories appear, and do not filter on the "task" type. Eg: I see both "call" with type "call" & "task" appear. 

 

 





Thanks, 



Damien

Like 0

Like

1 comments

Dear Damien,

 

Thank you for your question!

 

You can achieve this behaviour by creating the following business rule for the mini page:

 

 

We have also created a task to implement this behaviour out-of-the-box.

 

Thank you for making Creatio better!

 

King regards,

Alina

Show all comments

Hello,



I was working on richtextbox and follow a post from customerfx on how to add one. Everything is working fine aside from when adding photos to richtext box.



I get an error:





and here was my diff codes:

 

			{
				"operation": "insert",
				"name": "STRING058fcc3b-20b0-4264-9dad-964e360f5012V2",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 3,
						"layoutName": "VehicleDescriptionsTabLabelGridLayout81318709"
					},
					"bindTo": "TCOverview",
					"enabled": true,
					"contentType": Terrasoft.ContentType.RICH_TEXT,
					"labelConfig": {
						"visible": false
					},
					"controlConfig": {
						"imageLoaded": {
							"bindTo": "insertImagesToNotes"
						},
						"images": {
							"bindTo": "NotesImagesCollection"
						}
					}
				},
				"parentName": "VehicleDescriptionsTabLabelGridLayout81318709",
				"propertyName": "items",
				"index": 0
			},



TCOverview's data type in Case schema is RichTextBox.



Any thoughts?

Like 0

Like

7 comments

RichTextBox is a different field type - that's for Freedom UI rich text fields. For classic pages, typically an unlimited text field is used. Not sure if that is the cause of your issue or not (probably not since it works other than for images), but maybe something to try changing.

Also, what type of page is this on? Is this a section's edit page or some other kind of page (like a detail page)? The collections for the images aren't added on detail pages so there's other items to add to the page as well as a mixin IIRC.

Ryan



It's on Case Edit Page.



I will try the unlimited text field as you suggest.



Also, I tried testing the Note's RichTextBox and it was not working.

We highly recommend that you upgrade to version 8.0.4. In this case, you will be able to display the Rich text column in the object builder. Then you can display the column added in the object using the wizard on the Classic UI page.

Artem Smyrnov,



I'm in 8.1.0.6716.

I made a video to show an extended problem I notice.



Explaination: https://www.awesomescreenshot.com/video/22860805?key=4352d87ffb94df03fb39f305284347fb

Solem Khan Abdusalam,

I have seen that issue where the image gets added to both rich text controls. That is an issue when there are more than one rich text on the same tab - it won't happen if you split them up onto different tabs. The problem is that they are all sharing the same collection for the images. I was able to work around this by duplicating all the page items such as the collection NotesImagesCollection and the related functions such as the insertImagesToNotes function, however it was a bit of work - far easier to just separate them onto separate tabs to avoid the issue.

Ryan

Ryan Farley,

 

NotesImagesCollection and insertImagesToNotes are both page items of BaseEditPage is that what you mean?

Show all comments

Greetings,



I have a campaign currently active (IMAGE 1) with an email tied to the campaign (IMAGE 2). As you can see, the run time for the campaign is 11:00 AM, while the email delivery time range is set from 11:00 AM - 12:00 PM.



IMAGE 1:





IMAGE 2:







Supposing I wanted to change the Email Delivery Time Range to 1:00 PM - 2:00 PM. Am I correct in assuming that the campaign will run itself at 11:00 AM, and the actual email would start sending at 1:00 PM? Thanks in advance.



Lucas

Like 0

Like

1 comments
Best reply

Hello, 

Thank you for your question. 

Yes, you're right, if the company is scheduled for 11:00 pm, it will start at 11, and the mailing will start at 1:00 pm. 

Hello, 

Thank you for your question. 

Yes, you're right, if the company is scheduled for 11:00 pm, it will start at 11, and the mailing will start at 1:00 pm. 

Show all comments