I have a web form created in wordpress using elementor plugin. I would like to upload a file to the via this wordpress form but I can't find documentation for this. Any help would be much appreciated.

Like 0

Like

2 comments

Hi!

We do not currently support file transfers, but we will register a request for a description of the documentation if possible.
 

If you have any further questions, please send them in response. We will be happy to help.
 

Thank you for contacting Creatio Support!
 

It's not very straight forward, but it is possible. Basically, you'd need to encode the file as a Base64 string, then transfer it as a string value to the webhook. Once received decode the Base64 string back to a file byte array to save as an attachment somewhere. 

If this is coming from a web form, you can use Javascript's FileReader to convert the file to a base64 string. See https://stackoverflow.com/questions/36280818/how-to-convert-file-to-base64-in-javascript

Then send the value as a string to the webhook. You could add a process to trigger on record added of your entity. Then decode the string to a byte array. See https://learn.microsoft.com/en-us/dotnet/api/system.convert.frombase64string

Then save the byte array as an attachment on the record. See https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platform/back-end-development/api-for-file-management/examples/file-management-examples

Ryan

Show all comments

Hello Community ,

 

how can we configure the home page as the default login instead of the Desktop page , as well as the workspace?

 

Thanks

Like 0

Like

1 comments

Hello,

Unfortunately, we do not currently have the option to specify a default Home page for all new users. As for now, you can only set a section (Dashboards, Contacts, Accounts, etc.) as the default value for the user. You can view this post:  https://community.creatio.com/questions/default-page-login

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

Show all comments

Hi all,

 

In our project we are producing with Creatio application some printable document (.pdf and .doc).

 

In these document we are inserting some Rich Text fields but in the document produced we are not able to visualize/report all the style changes done on the Rich Text field.

 

Do you have any suggestion?

 

Best Regards

 

Stefano

Like 0

Like

2 comments

Hello,

 

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


Our R&D team has already been informed and is currently working on the mentioned issue.


As a workaround suggestion, you can replace the rich text field with a simple text field. We 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 being an active part of the community and helping to make Creatio better!

Hello Hanna,

Thank you very much for your response

Regards

Stefano

Show all comments

Hi All,

I have two instances of Creatio and they are both fail to compile.

 

Old Instance 

New Instance 

I do have the c:\windows\system32\inetsrv\NuGet\Migrations folder created.  

 

Both logs show a variegation of the below error messages, 6 in the old and 12 in the new one.

 

2024-05-29 15:36:07,813 [99] INFO IIS APPPOOL\Studio_Assignment Build CaptureOutput - C:\Program Files\dotnet\sdk\8.0.100\NuGet.targets(156,5): error :   No such host is known. (api.nuget.org:443) [C:\Creatio\Studio_Softkey_MSSQL_assinment\Terrasoft.WebApp\Terrasoft.Configuration\Terrasoft.Configuration.ODataEntities.csproj]
2024-05-29 15:36:07,813 [99] INFO IIS APPPOOL\Studio_Assignment Build CaptureOutput - C:\Program Files\dotnet\sdk\8.0.100\NuGet.targets(156,5): error :   No such host is known. [C:\Creatio\Studio_Softkey_MSSQL_assinment\Terrasoft.WebApp\Terrasoft.Configuration\Terrasoft.Configuration.ODataEntities.csproj]

 

I installed sdk\8.0.100 but the problem persists.

 

While looking at the documentation i see that sdk\8.0.100 is not a requirment so I'm a bit confused as to why the logs show this error message. 

 

The old version worked up until yesterday, not sure what changed.

Any help is much appreciated,

Thanks,

Paddy 

 

 

File attachments
Like 1

Like

2 comments
Best reply

It’s working now (the next day), both compile. 

 

My network was filtering some Microsoft traffic, after I removed the network restriction it worked as expected. 

It’s working now (the next day), both compile. 

 

My network was filtering some Microsoft traffic, after I removed the network restriction it worked as expected. 

Hello,
 

We are glad to hear that you managed to solve the compilation issues.

Based on the errors, the dotnet components lacked the necessary files for the application to work correctly and an attempt was made to get the necessary files from the NuGet repository, but since there was no full access to the repository via the Internet, this error occurred.

Show all comments

Report does not generate:
Ideas missing expenses data

Like 0

Like

3 comments

Here is a sucessfull report launch result:

As this shows, the field COmment and Expenses amount is showing a "Null" result.

Have to start over again, any modifications to the original report makes the latest version STOP. It will not RUN.

Show all comments

Hello,

 

I am following this guide (https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…) and I am stuck in the step 2 where I have to register the custom channel in the database.

 

I assume that firstly I need to add a record in the previously created table where I define a specific Username and Token that the external client will need to use in order to authenticate the messages sent within my custom channel. Therefore, I understand that the Id of the created record must be used in the [MsgSettingsId] column of the Channel table. However, I don't know what I must introduce in the [Source] column. As stated in the article:

 

[Source]: The channel ID in the messenger, such as the Facebook page ID or Telegram client ID. Lets you identify the recipient by a messenger message.

 

I noticed that for Facebook, that field stores the Facebook user ID that will be resolved in the URL ">https://facebook.com/[user_id] which redirects to /">https://www.facebook.com/people/[user-name]/[other_id] and in WhatsApp the URL is ">https://wa.me/[phone_number] which redirects to &text&type=phone_number&app_absent=0">https://api.whatsapp.com/send/?phone=%2B[phone_number]&text&type=phone_number&app_absent=0.

 

If I set a random string for the [Source] column and I try to check the information in the ChatSettings I get the following error when I click on the channel name:

 

"invalid channel type"

test

 

But what is the channel type? What does that mean and how is it resolved by Creatio?

 

In my case, I want to setup the communication between Creatio and a external chatbot. What exact value should I set in the [Source] column for my custom channel provider?

 

Regards

Like 0

Like

2 comments

Hi Alejandro! How are you? I hope you're well. The guide you are referring to is related to creating a new integration (channel) with a third-party messaging platform such as Viber, WeChat, etc. For my part I was able to develop a new channel following the guide. If you have questions, feel free to send me a message and we'll get in touch. Another option is to detail your goal and I can give you some tips on how to move forward.

Hello, 
You're right, MsgSettingsId should contain an ID from the record you insert into the table TestMsgSettings created previously. As for the Source, you can find the article on how to get the page ID, for example, https://help.salesforce.com/s/articleView?id=000389501&type=1. As for the other sources like your chatbot, if I'm not mistaken, the Source can be just a simple string, the error appears due to the fact that custom channels weren't expected in code, they need to be configured directly in the DB.

openChannelDialogService(t, n) {
                this.zone.run(()=>{
                    switch (t.typeId) {
                    case v.FacebookMessenger:
                        this.dialogService.open(D, n).subscribe();
                        break;
                    case v.Telegram:
                        this.dialogService.open(K, n).subscribe();
                        break;
                    case v.WhatsApp:
                        this.dialogService.open(X, n).subscribe();
                        break;
                    default:
                        console.error("invalid channel type")
                    }
                }
                )
            }

 

Show all comments

It looks like in 8.1.3, when clicking the magnifying glass on a lookup field which is configured to show the lookup page modal popup, the handler crt.OpenSelectionWindowRequest is now called instead of crt.OpenLookupPageRequest. Is is the case that the old handler has been swapped for the new one? Why has this been done? And are there any important differences to be noted? It's broken some of our client's custom code in the upgrade, and from a surface view it looks like it works in much the same way as the old handler and that simply swapping the code to use the new handler instead of the old works, but don't want to make any assumptions on that. Anybody have any insight on this?

Like 2

Like

10 comments

Hmm. Good find. I’ll have some broken customizations as well. Hopefully we’ll get an official word about the change. This isn’t the first time I’ve had things break from changes to core Freedom UI things. I like using Freedom UI but at times it feels like a moving target. We need some commitment from Creatio about avoiding breaking changes. 
Ryan

Hi Harvey, 

I just tested this in an 8.1.3.6734 system and both "crt.OpenSelectionWindowRequest" and "crt.OpenLookupPageRequest" did open the selection/lookup window for me. However, using the results seemed to work differently depending on which request I used, it didn't work to just change the request name and leave the rest of the code as-is. So they do appear to possibly be slightly different requests, at least from my very limited tests so far 🤷🏼‍♂️

Ryan

Interesting, thanks for the additional info Ryan! For triggering the lookup page from code I think we'll stick with the original method for now then.

 

But a little PSA for anyone wondering why their code overriding the crt.OpenLookupPageRequest handler to intercept and add filters/perform other logic when a user triggers a lookup page on a lookup field configured to view as "Selection window" rather than dropdown list, they should now be overriding crt.OpenSelectionWindowRequest instead. Hopefully we'll get some clarification on why this has changed and any implications.

Harvey Adcock,

8.1.3 is the first release with this API published, and Creatio mentioned the API for Freedom UI selection window in the 8.1.3 release notes. At the same time, we left it without changes so as not to break possible customizations with the old unpublished API. However, the old API is effectively deprecated, and the new API should be used from now on.

The full article for the Academy is almost ready and will be officially published soon.
Here is part of main information (maybe some parts will be changed, that's why please follow the updates): 
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

P.S. Additionally, users can enable features and much more, which you're able to read from the article on the Academy in the near future.

 

Anhelina,

Thanks for this Anhelina. 

Anhelina, 

Hi!

How i can filter SelectionWindow by using value from lookup field on page? 

 

I try this: 

{
   request: "usr.AddSection",
   handler: async (request, next) => {
 
       const id = request.$context.PDS_Transport2_93i8xm8;
 
 
       request.$context.executeRequest({
           type: "crt.OpenLookupPageRequest",
           $context: request.$context,
           entitySchemaName: "Section",
           features: {
               select: {
                   multiple: true,
                   selectAll: false,
                   resultType: 'lookupValues'
               },
               create: {
                   enabled: false
               }
           },
           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": "Transport"
                                   },
                                   "isAggregative": false,
                                   "dataValueType": 1,
                                   "rightExpression": {
                                       "expressionType": 2,
                                       "parameter": {
                                           "dataValueType": 1,
                                           "value": id.value
                                       }
                                   }
                               }
                           },
                           "logicalOperation": 0,
                           "isEnabled": true,
                           "filterType": 6,
                           "rootSchemaName": "Section"
                       }
                   }
               }
           },
           afterClosed: function(selectedItems) {
               const textValues = Object.values(selectedItems).map(item => item.displayValue).join(', ');
               request.$context.PDS_SectionUpload_h11bk0p = textValues;
           }
       });
   }
}

but always get error: The data types nvarchar and uniqueidentifier are incompatible in the add operator.

Ryan Farley,

Maybe you can help?

 

Grygorii Synieok,

You forgot to await the value when getting the attribute. 

Change to this (note the added "await"): 

const id = await request.$context.PDS_Transport2_93i8xm8;

Ryan

Ryan Farley,

Thank you!

But another problem was with: "dataValueType":10 and  "comparisonType":3 with this parametrs works fine.

Full code:

{
    request: "usr.AddSection",
    handler: async (request, next) => {
 
        var autoId = await request.$context.PDS_UsrTransport2;
 
 
        request.$context.executeRequest({
            type: "crt.OpenLookupPageRequest",
            $context: request.$context,
            entitySchemaName: "SectionAuto",
            features: {
                select: {
                    multiple: true,
                    selectAll: false,
                    resultType: 'lookupValues'
                },
                create: {
                    enabled: false
                }
            },
            filtersConfig: {
                filterAttributes: [
                    {
                        name: 'MyFilter',
                        loadOnChange: false
                    }
                ],
                attributesConfig: {
                    MyFilter: {
                        value: {
                            "items": {
                                "29e16d42-36f1-4e04-9029-4321cbb2494d": {
                                    "filterType": 1,
                                    "comparisonType":3,
                                    "isEnabled": true,
                                    "trimDateTimeParameterToDate": false,
                                    "leftExpression": {
                                        "expressionType": 0,
                                        "columnPath": "Transport"
                                    },
                                    "isAggregative": false,
                                    //"dataValueType": 1,
                                    "rightExpression": {
                                        "expressionType": 2,
                                        "parameter": {
                                            "dataValueType": 10,
                                            "value":autoId.value
                                        }
                                    }
                                }
                            },
                            "logicalOperation": 0,
                            "isEnabled": true,
                            "filterType": 6,
                            "rootSchemaName": "SectionAuto"
                        }
                    }
                }
            },
            afterClosed: function(selectedItems) {
                const textValues = Object.values(selectedItems).map(item => item.displayValue).join(', ');
                request.$context.PDS_UsrSection = textValues;
            }
        });
    }
}

Hello Harvey,

 

I've a 8.1.3 environment and on some pages the crt.OpenLookupPageRequest works correctly  while on other pages it doesn't open the required lookup

Do you have the same issue ?

 

 

 

 

 

Show all comments

Hi,

 

I have a Freedom UI list where I can take a few actions after the user has selected one or more rows. The actions run as expected, but the records are kept selected after the actions run and the user has to manually clear the selection. What do I need to add to the custom code to clear the selection? 

Thanks,
Jose 

File attachments
Like 1

Like

7 comments
Best reply

Jose Hernandez,

 

You need to try

 

request.$context.GridDetail_tviz7gf_SelectionState = null
 

null is needed to remove the selection, but also change GridDetail_tviz7gf to your list attribute.

Hello,

Could you describe exactly what your custom logic performs for better understanding?

Malika,

 

It depends on the action. The Unlock one just clears the locked by field for the selected cases. The print generates letters and sends them to our print vendor for each case selected. Finally, the Assign one opens a window where the user can select the person to assign the cases to. Each one is calling the code below with the proper parameters.

I just need to know what I need to add to that code to clear the selection after the code that runs the business process.

 

Thanks,

Jose

        processSelectedRows: async function(request, processName, message, next) {
            var selectedRecords = await this.getSelectedRows(request.$context);
            var count = selectedRecords.count;
            var date = new Date();
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'PM' : 'AM';
            hours = hours > 12 ? hours - 12 : hours;
            var timeString = hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + " " + ampm;
            message = message + " on " + timeString + " for " +  count + " selected records.";
            request.$context.executeRequest({
                type: "crt.NotificationRequest",
                message:message
            });
            const handlerChain = sdk.HandlerChainService.instance;
            result = await handlerChain.process({
                type: 'crt.RunBusinessProcessRequest',
                processName: processName,
                processRunType: "RegardlessOfThePage",
                processParameters: {
                    "SelectedRecords": selectedRecords.selected
                },
                $context: request.$context
            });
            if (!result.success)  {
                var errorMsg = Ext.String.format(resources.localizableStrings.UnableToProcessSelectedRows, processName, result.errorInfo?.message);
                request.$context.executeRequest({
                    type: "crt.NotificationRequest",
                    message: errorMsg
                });                        
            }
            /* Call the next handler if it exists and return its result. */
            return next?.handle(request);
        }

I've not tried clearing the selections, but it might work to do this after you execute the process: 

request.$context.DataTable_SelectionState.selected = [];

Or it could be that you'll set SelectionState to null or {}?

Ryan

Ryan Farley,

Thanks Ryan. I tried that (and other variations like setting the type to 'clear') and the model gets cleared, but the GUI is not refreshed. In other worlds on the page the records are still showing as selected even though the model now has cleared the selection.

Jose Hernandez,

 

You need to try

 

request.$context.GridDetail_tviz7gf_SelectionState = null
 

null is needed to remove the selection, but also change GridDetail_tviz7gf to your list attribute.

Thanks Oleg. That worked. In my case I used  request.$context.DataTable_SelectionState = null; 

Viktoriia,

 

Hello,

 

It's 

 

request.$context.DataTable_SelectedRows
 

DataTable should be replaced with your list attribute name.

Show all comments

HI, 

 

How do I push or replace navigation history in freedom. In classic UI you were able to do it  using a sandbox message. 

 

Is it possible to be done in Freedom?

 

Thank you!

Like 1

Like

4 comments

Are you referring to pushing to navigation history (as far as going to the record/page itself)?

If so, this shows how to open a page (section or other page) https://customerfx.com/article/navigating-to-a-page-via-code-in-a-creatio-freedom-ui-page/

This shows how to open a record page in add or edit mode https://customerfx.com/article/opening-an-edit-page-to-add-or-edit-a-record-via-code-in-a-creatio-freedom-ui-page/

If I've misunderstood what you're after let me know. Hope this helps. 

Ryan

Hi Ryan, thank you for your answer.

No that's not what I'l looking for. What I want to do is what history.replaceState(state, unused, url) does in JS. change the shown url and the browser history, but not navigate. 

Javier Collazo,

Ah I see now. I've not noticed any equivalent of that in the devkit. I've seen a navigationservice and router classes as possibilities in the internal code, but they aren't exposed in devkit.

One possibility is to use the "crt.7XRequest" request. I've been able to use that for what would have been a sandbox.publish previously, a least for what I've tried with it so far. See https://customerfx.com/article/navigating-a-user-back-from-a-creatio-freedom-ui-page/

Might take a little playing with to figure out how to get the other params passed for stateObj, pageTitle, etc. Searching the source for "crt.7XRequest" would likely find some examples of similar requests.

Ryan

Javier Collazo,

I did find an example: 

await handlerChain.process({
    type: "crt.7XRequest",
    $context: null,
    action: "ReplaceHistoryState",
    hash: someHash,
    stateObj: obj,
    silent: isSilent
});

Ryan

Show all comments

Hi,

We have the Opportunities functionality with custom stages . We tested the transition between the stages and is not recording Stage History in Opportunities, is there somewhere to enable this for the new stages?

 

Like 0

Like

1 comments

Hi, Victoria!

Please turn to us via Creatio Support so we can examine the system behavior in further detail.

Show all comments