Hi,


I would appreciate your help. I need to send an email that has to approve a request for an entire department. How is it correct to do it and extract all the emails of the contacts?

Like 0

Like

1 comments

Hi!

 

You can find an example of how to develop an Approval process, including sending email notifications in the following Creatio Academy: https://academy.creatio.com/docs/8.x/no-code-customization/bpm-tools/bpm-process-examples/configur-document-approval-process

 

Also, you can get more information about business processes in the following link tree:

https://academy.creatio.com/docs/user/bpm_tools/business_process_setup 

 

I hope this helps. Have a great day!

Show all comments

Hi Community,

Can you provide a snippet on how we can achieve the following?

For example in the 'Contacts' editable list

We want the field 'Full Job title' to be editable and the field 'Email' to be NOT editable (its values are populated via Business processes) so we dont want manual insertion from the user. How can this be achieved?

Sasor

Like 3

Like

3 comments

You could add a business rule at the object level to disable editing of the email, but then it would also be disabled at the page level (unless that is also what you want). Other than that, the only option is to turn off the editable list property (since, currently, you can't make certain fields editable and others not)

@sasori Great idea !

Try add a readonly flag to your column in crt.DataGrid for Contacts
After that try to restore default settings on the page for this detail if you added more columns to this grid. This functionality is kinda buggy.

Show all comments

Hello team,

I have question that there are 2 tabs and inside it there is available 3 fields. For example, we have MainTab and AdditionalTab and inside MainTab there is firstname, lastname, middlename. Inside AdditionalTab there is Phonenumber, email, birthdate. I need to put validation to this fields separately. If I put validation to firstname and Phonenumber, these two shouldn't affect each other. when Firstname and Phonenumber is not filled in and try to save record, if I am on Maintab, system should return Firstname validation. at the same time, when I change tab to AdditionalTab, system should return Phonenumber validation. in this case how can I put validation based on tabs?

Below I'll share written code for validation.
 
define("UsrExample1Page", ["ConfigurationConstants"], function(ConfigurationConstants) {
    return {
        entitySchemaName: "UsrExample",
        attributes: {
         "CurrentActiveTab": {
               dataValueType: Terrasoft.DataValueType.TEXT,
               type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
               value: "" // Initial value, empty by default
           }
       },
        details: /**SCHEMA_DETAILS*/{
            "Files": {
                "schemaName": "FileDetailV2",
                "entitySchemaName": "UsrExampleFile",
                "filter": {
                    "masterColumn": "Id",
                    "detailColumn": "UsrExample"
                }
            }
        },
        methods: {
           onActiveTabChange: function(activeTab) {
               // Store the active tab identifier
               this.set("CurrentActiveTab", activeTab);
           },
 
           setValidationConfig: function() {
               this.callParent(arguments);
               this.addColumnValidator("UsrName", this.nameFieldsValidator);
               //this.addColumnValidator("UsrLastName", this.nameFieldsValidator);
               this.addColumnValidator("UsrPhoneNumber", this.phoneFieldsValidator);
           },
           nameFieldsValidator: function(value, column) {
               var invalidMessage = "";
               var firstName = this.get("UsrName");
               console.log("Name:", firstName);
               if (Ext.isEmpty(firstName)) {
                   invalidMessage = this.get("Resources.Strings.InvalidNameMessage");
                   // Switch to the tab containing the first name field
                   console.log("Switching to name tab:", invalidMessage);
                   this.set("CurrentActiveTab", "Tabbfc229c0TabLabel"); // Assuming "NameTab" is the tab identifier
               }
               return { invalidMessage: invalidMessage };
           },
           phoneFieldsValidator: function(value, column) {
             var invalidMessage = "";
             var phoneNumber = this.get("UsrPhoneNumber");
             console.log("Phone number:", phoneNumber);
             if (Ext.isEmpty(phoneNumber)) {
                 invalidMessage = this.get("Resources.Strings.InvalidPhoneNumberMessage");
                 console.log("Switching to phone tab:", invalidMessage);
                 this.set("CurrentActiveTab", "Tab68b5b8f6TabLabel"); // Ensure this is correct
             }
             return { invalidMessage: invalidMessage };
         }
       },
        dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
        diff: /**SCHEMA_DIFF*/[
           {
               "operation": "insert",
               "name": "Tabs",
               "values": {
                   "tabs": [
                       {
                           "name": "MainTab",
                           "caption": { "bindTo": "Resources.Strings.MainTabCaption" },
                           "items": [],
                           "change": { "bindTo": "onActiveTabChange" }
                       },
                       {
                           "name": "AdditionalTab",
                           "caption": { "bindTo": "Resources.Strings.AdditionalTabCation" },
                           "items": [],
                           "change": { "bindTo": "onActiveTabChange" }
                       }
                   ]
               }
           }
        ]/**SCHEMA_DIFF*/
    };
});
Like 0

Like

1 comments

Hello Abbos,

To do so, you can replace the OnSaved method, where you make a check:

1) needed tab is active 

2) validation successful

If both are true - call this.callParent(arguments). Else - add needed conditions.

onSaved: function() {
	var activeTab = this.get("ActiveTab");
	var isActiveTabTab2 = activeTab == "Name of the tab"; //result true\false
	var isFirstColumnValid = this.validateFirstColumn(); //result true\false
	if (isActiveTabTab2 && isFirstColumnValid) {
		this.callParent(arguments)
	} elese if () {
		...
	} else if () {
		...
	} else {
		...
	}
},
 
validateFirstColumn: function() {
	var colValue = this.get("ColumnCodeHere");
	return colValue == "Test value" || colValue = "1" //add conditions here
}

P.S. This method will not work with the required fields, since disabling the requirement is impossible.

Show all comments

Hello,

how can we make column non/editable for portal users?

 

We have editable detail and column Requested amount, that should be editable for external users and non-editable for system users.

And column Confirmed amount, that should be editable for system users and non-editable for external users.

 

We use business rules based on calculated attribute (from Terrasoft.isCurrentUserSsp) for pages - it works perfectly. But it doesn't work in editable details

 

Any ideas?

Thank you!

Like 0

Like

4 comments

Hello,

Desired permission set up can be achieved via column permissions in the object permission settings. Step-by-step guide on the column permission set up available on Creatio Academy.

Best regards
Ivan

Ivan Savenko,

Thank you, it can be used, but it doesn't give visual 'lock' for column, only an error after saving.
Besides, column permissions requires to define each column of the object (at least, for the portal), that is not the best approach

I agree, visual locks would help a lot :)

Damien Collot,

especially on portal, where hundreds of users without experience should be provided with clear and easy UI

 

Kind regards,

Vladimir

Show all comments

Hello!
I have created a business process that must run after changes are made to the "Not allowed" field in the Activity. When I change this field manually and then save the activity, it runs as it should. However, I also wrote a very simple C# code in the saving event that changes this field in the activity when I move the activity in the calendar, but the process does not start despite the changes in the "Not allowed" field.

I am moving the activity in the calendar

Code: _entity.SetColumnValue("CHNotAllowed", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss")); 

Process:


 

Like 0

Like

2 comments

Hello,
If an Entity.Save() call occurs in the embedded process or listener, in this case, the signal to start the BP is not thrown.
Try using the EntitySchemaQuery, if I'm not mistaken, it should trigger the necessary Entity level.

Dmytro Vovchenko writes:

Hello,
If an Entity.Save() call occurs in the embedded process or listener, in this case, the signal to start the BP is not thrown.
Try using the EntitySchemaQuery, if I'm not mistaken, it should trigger the necessary Entity level.

It works everywhere except changes in the calendar

"Try using the EntitySchemaQuery" -what do you mean? plz give an example. 

Show all comments

Hi Community,
Can you provide a snippet example, on how we can hide a Detail (list) if the List contains no data (records)?

Thank you

Sasori

Like 4

Like

3 comments
Best reply

This can only be done with code. A combination of doing some model queries to check for records that would be in the list, then using an attribute bound to the visible property of the list to set as true/false based on the results of the query. 

Using the model to query data: https://customerfx.com/article/querying-data-using-filter-conditions-vi…

Using attributes: https://customerfx.com/article/using-custom-attributes-on-a-creatio-freedom-ui-page/

Using the init to execute the above code when the page loads: https://customerfx.com/article/waiting-for-model-to-be-ready-and-loaded…

Ryan

Hi Community,

Any remark on this one?

This can only be done with code. A combination of doing some model queries to check for records that would be in the list, then using an attribute bound to the visible property of the list to set as true/false based on the results of the query. 

Using the model to query data: https://customerfx.com/article/querying-data-using-filter-conditions-vi…

Using attributes: https://customerfx.com/article/using-custom-attributes-on-a-creatio-freedom-ui-page/

Using the init to execute the above code when the page loads: https://customerfx.com/article/waiting-for-model-to-be-ready-and-loaded…

Ryan

Hello,
 

Unfortunately, this task cannot be implemented using standard methods.

 Ryan has provided helpful recommendations that will assist you with implementation through development methods.
 

Additionally, we have registered a task for the development team to add such functionality in future releases.

Best regards,
Pavlo

Show all comments

Hi Community,

 

We have this requirement, where we need to have multiple signatures per outbound email. And selected them based on the case category lookup.

 

So for example:

 

Case 1 > Category A > Signature A

 

Case 2 > Category B > Signature B

 

But for the same outbound email.

 

https://academy.creatio.com/docs/8.x/no-code-customization/base-integrations/mailbox-setup/email-account-individual-settings#title-1953-3

 

We would like to know what is the best way to achieve such functionality? What schemas should we change?

 

Thank you.

 

Best Regards,

Pedro Pinheiro

Like 1

Like

1 comments

Hello,

 

Please note that there's no functionality to set up such logic in the system at the moment. However, we have registered this idea for our R&D team and they will review the possibility of adding it in future releases.

 

As a workaround, you could remove the personal signatures of the users and instead create the email templates and design the needed signature as part of the template itself. You can also set up automatic filling in of the sender's name with the help of a macro.

Show all comments

Hello,

I need the record registry on the sidebar page to automatically refresh when the page is opened. I'm trying to use crt.HandleSidebarOpenRequest (version 8.1.4). Here is my code:
 

   handlers: /**SCHEMA_HANDLERS*/[
   {
   request: "crt.HandleSidebarOpenRequest",
   handler: async (request, next) => {
   console.log("Обробник викликано");
   const result = await next?.handle(request);
   console.log("Після next.handle(request)");
   const handlerChain = sdk.HandlerChainService.instance;
   // Оновлюємо дані при відкритті сторінки
 
   await handlerChain.process({
       type: "crt.LoadDataRequest",
       $context: request.$context,
       params: {
           config: {
               loadType: "reload",
               useLastLoadParameters: true
           },
           dataSourceName: "DataGrid_69bg53fDS"
       }
   });
   console.log("вуцауца");
   return result;
}
   }

         

       ]/**SCHEMA_HANDLERS*/,

 

However, the handler is not triggering. Could you please help?

Like 0

Like

1 comments

Hello,

A developer can subscribe to sidebar open/close events in a remote module.

To subscribe to the open or close sidebar events in your code, follow these steps:

1. Create an Angular class in the project. To do this, run the ng g class my-sidebar-open.handler command at the command line terminal. Files of the MySidebarOpenHandler class will be added to the src/app/ project directory.

2. Implement the handler.

a. Open the my-sidebar-open.handler.ts file.

b.Define the class of request that inherits base type and contains sidebarCode property.

c. Inherit the BaseRequestHandler class with the new type (2.b.) from the @creatio-devkit/common library.

d. Specify the type of the handler.

e. Specify the type of the request as crt.HandleSidebarOpenRequest.

f. Implement the handle method with some custom logic.

    i. Since this handler will handle HandleSidebarOpenRequest requests from all sidebars, you should check the code of the sidebar before performing any custom actions.

    ii. Write your custom logic.

    iii. Call this.next?.handle(request) in order to process all other handlers of this request.

g. Save the file.

import { BaseRequestHandler } from "@creatio-devkit/common";
class SidebarEventRequest extends BaseRequest {
	public readonly sidebarCode!: string;
}
@CrtRequestHandler({
	type: `usr.MySidebarOpenHandler`,
	requestType: 'crt.HandleSidebarOpenRequest',
})
export class MySidebarOpenHandler extends BaseRequestHandler<SidebarEventRequest> {
	public async handle(request: SidebarEventRequest): Promise<void> {
		if (request.sidebarCode === 'UsrMyCustomSidebar') {
			//WRITE YOUR OWN LOGIC HERE
		}        
		await this.next?.handle(request);
	}
}

3. Build the project. To do this, run the npm run build command at the command line terminal.

Show all comments

We have setup our Google Workspace emails inside Creatio and we can send and receive emails from the platform.

 

When we click an email link inside a contact, a browser opens up with 'about:blank'.

 

I have downloaded a windows email app on my pc thinking that would solve it but still not able to get it to work

Like 0

Like

1 comments

Hello,
 

Thank you for your question. We recommend setting up a button on the page for such needs, which will trigger a business process. Configure this process to read the lead's email address and send an email with the "To" field pre-filled, which is extracted from the lead.

Unfortunately, we don't have ready-made examples of such a process.


Additionally, we have created a request for the development team to restore the functionality of sending an email by clicking on the Email field in future releases.
 

Thank you for reaching out.

Show all comments

Hi Community,

Im trying to download the Notes of a Classic Ui Section, to a Word printable.

The end result in the Word printable is together with the Html Tags. How can we fix this?

Sasori

Like 0

Like

1 comments

Dear Sasori,

 

As of now, it's not possible to correctly display the field with HTML formatting in the printable.  


We registered a query for our R&D team and await a fix in the upcoming versions. 

 

As a workaround suggestion, you can replace the Notes field with a simple text field. I understand that it's missing the format settings and cannot be applied to tables, but it should work for a sentence or two simple comments. 

 

Thank you for making Creatio better!

Show all comments