Studio_Creatio
sidebar
FreedomUI
creatio_v_8.3.3
Studio_Creatio
8.0

Hi,

I have a custom Freedom UI sidebar, that I open programmatically from a button on another page using crt.OpenSidebarRequest.

My requirement: every time the sidebar opens, I need to pass dynamic data (a record Id, a record number, etc. — different each time depending on what the user clicked) into the sidebar so it can pre-fill some fields.

What I've tried and confirmed does NOT work:

  1. crt.OpenSidebarRequest — only accepts type, sidebarCode, and $context. No params field.
  2. Mutating request.$context on the caller before opening, then reading it from the sidebar — turns out the sidebar's $context is a completely separate view-model instance, so changes never propagate across.
  3. crt.HandleViewModelResumeRequest / crt.HandleViewModelInitRequest inside the sidebar's inline schema — Init only fires once (the sidebar's view model is created once and never destroyed/recreated on subsequent opens, just hidden/shown), and Resume also only fired on the very first open in my testing, not on every reopen.
  4. crt.HandleSidebarOpenRequest — confirmed this only works from an Angular remote module. But even after building the remote module and confirming it fires reliably every single open cycle, the request object only contains { type, sidebarCode } — no $context, so there's no way to push data from the remote module into the sidebar's actual view model fields.

What does work : BroadcastChannel, sent from the caller page's click handler, received in the sidebar's crt.HandleViewModelInitRequest handler (registered once, stays alive for the sidebar's whole lifetime since the view model itself isn't destroyed/recreated). Combined with a "ready" handshake to fix a race condition on the very first open (sidebar's listener isn't registered yet by the time the caller sends, since async init takes a moment).

My question: is there a more "native"/supported way to do this that I'm missing, or is BroadcastChannel genuinely the only mechanism Creatio offers for this in Freedom UI sidebar today? Specifically interested in:

  • Whether crt.HandleSidebarOpenRequest's request payload can ever carry custom data (e.g. via some other request type chained before it)
  • Whether there's a documented way to get a live reference to the sidebar's own view model from the caller's side
  • Whether Creatio has any roadmap plans to add a params/data field to crt.OpenSidebarRequest

    Creatio Version - 8.3.3

    Thanks
Like 0

Like

2 comments

Hello Darshan Dev Prajapat,

You can use MessageChannelService instead of BroadcastChannel.

All you need to do is import the Creatio DevKit SDK, select the place to subscribe/unsubscribe (Pause/Resume or Init/Destroy events), and use the sdk.MessageChannelService. Available in version 8.2.0 and above.

Basic subscription example:

handlers: /**SCHEMA_HANDLERS*/[
	{
		request: "crt.HandleViewModelResumeRequest",
		handler: async function (request, next) {
			const messageChannelService = new sdk.MessageChannelService();

			request.$context.MySubscription = await messageChannelService.subscribe(
				"TestSender",
				(message) => console.log(message.body)
			);

			return next?.handle(request);
		}
	},
	{
		request: "crt.HandleViewModelPauseRequest",
		handler: async function (request, next) {
			const subscription = await request.$context.MySubscription;
			subscription.unsubscribe();

			return next?.handle(request);
		}
	}
]/**SCHEMA_HANDLERS*/

Basic sending example:

handlers: /**SCHEMA_HANDLERS*/[
	{
		request: "crt.HandleViewModelInitRequest",
		handler: async (request, next) => {
			const messageChannelService = new sdk.MessageChannelService();

			const body = {
				// Some data
			};

			await messageChannelService.sendMessage(
				"TestSender",
				body,
				sdk.MessageChannelType.PTP
			);

			return next?.handle(request);
		}
	}
]/**SCHEMA_HANDLERS*/

You can use the following channel types:

  • MessageChannelType.PTP: The message will be sent to the same user who sent that message (client-side).
  • MessageChannelType.BROADCAST: The message will be sent to all users (client-side).
  • MessageChannelType.SERVER: The message will be sent to the server. In this case, only the server-side subscription will receive this message.

Eduard Dovydovskyi,

Hello Eduard Dovydovskyi,

Thanks for the suggestion! I tried MessageChannelService with crt.HandleViewModelResumeRequest/crt.HandleViewModelPauseRequest as shown, but I'm hitting the same root issue I had before switching to it: crt.HandleViewModelResumeRequest only fires on the very first time the sidebar opens, not on subsequent opens.

In my testing, the sidebar's view model is created once and never destroyed — closing the sidebar just hides it, it doesn't tear down/recreate the page instance. So Resume/Pause don't actually fire again on reopen, the way they would for normal page navigation. I confirmed this independently with console logs on Init/Resume/Pause/Destroy before trying MessageChannelService — only Init and Resume fired once each, on the first open, and nothing fired again on close/reopen.

Since MessageChannelService.subscribe is set up inside Resume in your example, the subscription itself is also only ever created once — which actually works fine for receiving subsequent messages (since the subscription stays alive), but doesn't help if the goal is to refresh/re-trigger something specifically tied to the reopen event itself.

Is this a known difference in sidebar lifecycle vs. regular page lifecycle? Is there a Resume/Pause-equivalent that's specific to the sidebar's open/close state rather than the view model's attach state? Or is the expectation that we just send a new message each time (via PTP) to a subscription that was set up once on first init/resume, rather than relying on the subscribe step itself re-firing?

For context, my actual use case: I need to pass different data into the sidebar's fields every time it's reopened with a different source record. Right now I'm sending the message right after crt.OpenSidebarRequest resolves and the sidebar's subscription (set up once on first load) picks it up fine — so the data delivery itself works. The only remaining friction is the very first open, since the subscription isn't registered yet at the moment the first message is sent (timing race). Would love to know if there's a "ready" signal or queuing behavior built into MessageChannelService for that case, or if I should keep handling it manually with a short retry/handshake.

Thanks

Show all comments
Studio_Creatio
8.0

Hi all, 

In case page I have two lookup fields - Owner and Individuals both are lookups on contacts. 

Validation required - They should not accept same values. 

How can I achieve this. Please help.

 

Many thanks.

Like 0

Like

2 comments

Hello,

You can enforce this entirely on the client side in Freedom UI. The two most reliable approaches are a save handler (crt.SaveRecordRequest) and a custom validator (inline error message as the user fills the form). You can use either of these

Example - Save handler (blocks the save)

handlers: /**SCHEMA_HANDLERS*/[
    {
        request: "crt.SaveRecordRequest",
        handler: async (request, next) => {
            const owner = await request.$context.Owner;
            const individuals = await request.$context.Individuals;

            if (owner && individuals && owner.value === individuals.value) {
                request.$context.executeRequest({
                    type: "crt.ShowDialogRequest",
                    $context: request.$context,
                    dialogConfig: {
                        data: {
                            message: "Owner and Individuals cannot be the same contact.",
                            actions: [
                                { key: "ok", config: { color: "primary", caption: "OK" } }
                            ]
                        }
                    }
                });
                return; // stops the save
            }
            return next?.handle(request);
        }
    }
]/**SCHEMA_HANDLERS*/


Custom Validator: Define a custom validator on either field in the ViewModelConfig, then trigger it via the attribute change request whenever either field's value changes.

  • Using both is a common pattern: validator for live feedback, save handler as a safety net.

Hello,

As mentioned above, this functionality can be achieved by implementing custom logic within the crt.SaveRecordRequest handler, which allows you to prevent the data from being saved when necessary conditions are not met.

Alternatively, you may consider implementing a custom validator.
 

For your reference, the following articles may be helpful:

"handlers" schema section | Creatio Academy
Implement the validation of a field value on a page | Creatio Academy

Show all comments

Hi team,

I have created a campaign and added the target audience. When i started the campaign, the emails remain in the queue and are not being sent.

Has anyone experienced this issue before? Could you please help me understand what might be causing it and how to resolve it?

Like 0

Like

2 comments

Good day, Tanu,

The "Queued" status is not an outright sign of issues with delivery to the participant. 

Creatio sends emails to the addressee throught the ESP, but waits for an email response before changing the status.

The Queued status may mean one of the following:

- the delivery was completed, but the reply has not been returned by the provider

- the email was queued for delivery, but until it has been Delivered or "Bounced", it remains "Waiting to retry" on the ESP side. 
Seeing as "Waiting to retry" has no corresponding status on Creatio end, the recipient remains Queued.
Email Service Providers may retry delivery for up to 48 hours (ElasticEmail) and up to 72 hours (SendGrid).

- Longer periods of being Queued may point to complications with delivery or responses not being sent out by ESP.

Should you require a more in-depth analysis of Queued status, please contact us at support@creatio.com with an Id of the BulkEmail in question. 
It is best to do so no later than 7 days after the initial delivery, as this will allow us to examine the logs before they are overwritten.

Hope this helps!

How can we resolve this?

Show all comments
Studio_Creatio
8.0

Hi all, 

On case page we have - Target resolution date (DateTime), Registration date(DateTime) and SLA days (integer) fields. Formula for Target Resolution date = Registration Date + SLA days. 

But the target resolution date is correctly showing the date part but not the time part for time part it is always showing the 12:00 AM. I have tried using BP, writing script task, writing source code, but nothing is working. Can anyone please help.

Many thanks.

Like 0

Like

1 comments

Hello,

We reviewed the described behavior and found that the value is most likely being converted to a Date type at some point in the process. When this occurs, the time portion is removed, and the value is saved as 12:00 AM (midnight).

To preserve both the date and time, we recommend using a DateTime expression and adding the required number of days with the AddDays method instead of using date-only arithmetic.

Please try the following expression: [#Registration date#].AddDays(Convert.ToDouble([#SLA days#]))

This approach adds the SLA days to the original DateTime value while preserving the time component.

Show all comments
printables
report
MS_Word_report_in_Creatio
FreedomUI
Studio_Creatio
8.0

Hi,
I would like to know whether there is a way to both download a printable report and attach it to a record simultaneously in Creatio Freedom UI.

Currently, I am aware of two separate approaches:

  1. Using the default functionality to generate and download the printable report.
  2. Using a business process to generate the report and attach it to the record's Attachments section.

However, my requirement is to perform both actions at the same time—when the user generates the report, it should be automatically attached to the record while also being downloaded to the user's machine.

Has anyone implemented a similar solution or can suggest an approach to achieve this?

Any guidance would be greatly appreciated.

Thank you,

Like 0

Like

2 comments

Hi Satyam,

Yes, this can be achieved, but you need to handle both actions in one custom flow.

The recommended approach would be:

  1. Generate the printable report using a business process or custom backend service.
  2. Save/attach the generated report to the record’s attachment object, for example ContactFile, AccountFile, or the relevant {Object}File schema.
  3. After the file is created and you have the generated file record Id, trigger the browser download using FileService/Download/{EntityFileSchemaName}/{fileId}.

For uploading/attaching a file manually, Creatio provides POST /FileApiService/UploadFile, where you need to pass parameters such as entitySchemaName, parentColumnName, and parentColumnValue.

So the key point is: do not only call the download service directly. First generate/save the report as a file attachment, then use the generated file Id to download it for the user.

If this needs to happen from a Freedom UI button, the button can call a custom service or process, wait for the generated attachment file Id, and then open the download URL in the browser.

smit suthar,

Hi,

Thank you for the detailed explanation.

I understand the overall approach, but I'm still a bit unclear on some of the implementation details in Creatio.

Would it be possible for you to elaborate on the following points:

  1. In the case of a Freedom UI button, what would be the recommended way to wait for the file creation and then trigger the download automatically?
  2. If possible, could you provide a simple end-to-end example (Business Process or Freedom UI implementation) demonstrating the complete flow?

A more detailed example would help me understand how these pieces fit together in practice.

Thank you for your help.

Show all comments

Hi team,

In a Creatio 8.3.4, Freedom UI remote module setup panel ([@creatio/interface-designer](cci:9://file:///n:/InstanciasCreatio/XXXXXXX/@creatio/interface-designer:0:0-0:0)), I filter attributes to show only unlimited text fields.

For this attribute:

  • `attributeName`: `NcsJsonViewerTESTDS_NcsJsonField_7d0vlhs`
  • `dataSourceName`: `NcsJsonViewerTESTDS`
  • `dataSourceAttributePath`: `NcsJsonField`
  • `entitySchemaName`: `NcsJsonViewerTEST`

Debug says:

  • `Binding detectado ... NcsJsonField`
  • `Discarded: it is not a unlimited field... NcsJsonField`, but it is!

PostgreSQL confirmation: `NcsJsonViewerTEST.NcsJsonField` is `text` with `character_maximum_length = NULL`, so the field is unlimited-length at DB level.

SELECT
  c.table_schema,
  c.table_name,
  c.column_name,
  c.data_type,
  c.udt_name,
  c.character_maximum_length,
  c.is_nullable
FROM information_schema.columns c
WHERE c.table_schema = 'public'
  AND c.table_name = 'NcsJsonViewerTEST'
  AND c.column_name = 'NcsJsonField';

 

What is the recommended DesignTime API to reliably identify unlimited text in this case?

Thanks in advance

Best regards

Like 1

Like

1 comments

Hello,
Could you please provide the steps to reproduce the configuration of this filter? Additionally, could you specify which API you are using and how you received the following message:
Discarded: it is not a unlimited field... NcsJsonField?
Thank you in advance.

Show all comments
remote_module
Remote
module
Studio_Creatio
8.0

Is it possible to run the angular app locally for develpment? I am trying to tailor the component quickly without having to compile it in Creatio. When I run 'npm start' the app fails to load with the following error: 
'ERROR Error: Remote entry with name 'sdk_remote_module_package' does not exist
   at checkRemoteName (creatio-devkit-common.mjs:1713:15)
   at bootstrapCrtModule (creatio-devkit-common.mjs:1993:13)'

Like 0

Like

2 comments

Hi Grant

You’re hitting this because a Creatio remote module is not a fully standalone Angular app.

`npm start` tries to bootstrap modules that are normally provided by Creatio runtime (including `sdk_remote_module_package`), so outside Creatio you get:

`Remote entry with name 'sdk_remote_module_package' does not exist`.

Short answer:

  • Can you run it fully local without Creatio? Usually no (not in a practical way for real component behavior).
  • The component depends on Creatio runtime (`crt`, designer context, requests, etc.).

Fast development workflow
1. Run Angular build in watch mode:
  `npm run build -- --watch`
2. Auto-copy `dist/...` to your package `Files/src/js/<YourRemoteModule>`
3. Compile only your package (not full configuration):
  `clio compile-package <YourPackage> -e <YourEnv>`
4. Hard refresh Designer (`Ctrl+F5`)

This is the fastest stable loop today for remote module development.
 

Regards,

Julio Falcón

NCS.JulioFalcon,

Thank you :)

Show all comments
Studio_Creatio
8.0
mobile
remote_module

Hi, I’ve added a custom handler to the mobile view by following the article https://academy.creatio.com/docs/8.x/mobile/mobile-development/customiz…. Everything works great, but I’ve run into a few issues:

  • I would like to make web service requests. Unfortunately, I couldn't find any equivalent to sdk.HttpClientService (from the desktop @creatio-devkit/common) inside @creatio/mobile-common. At the same time, I’m not sure how-or if it's even possible-to access the user context so I can retrieve the instance credentials and construct an authenticated request to Creatio.
  • I’m trying to read a system setting value, but it always returns null. No amount of synchronization, cache clearing, etc., seems to help. Here is the code I'm using:
const sysSettings = new sdk.SysSettingsService();
const siteUrl = sysSettings.getValueByCode('SiteUrl');
  • What is the best way to handle error logging on iOS? I tried using Logger.console('test'), but it doesn't work at all.

 

Like 2

Like

2 comments

Hello,
In order to call your service inside the mobile handler, you need to use tools like XMLHttpRequest . With it, you can call any http link, including any service you need. It can also be used to get the system setting value if you configure a specific service that will return it.
As for logs inside the handler, I don't know if Logger.console is dependent on OS, but it definitely works on Android. Perhaps you are just searching the logs in the wrong place?
 

Hi, thanks for the reply.
Inside the handler I'm using the fetch API. Generally, making requests works - I can query the Creatio instance and the requests are visible in Request.log. The problem is that they are unauthenticated. No cookies are sent with the request, so the server has no way to identify the specific user. From within the handler itself, I was also unable to read any information about the current user. I tried hardcoding authentication as Supervisor, but it seems like the Cookie header is being ignored and I keep getting a 302 redirect to the login form.

Show all comments
Studio_Creatio
8.0

Newbie Creatio Admin here. We are going live with Creatio, leaving SF, next month and I am trying to find a few options for deep diving into report and dashboard creation but am coming up short. I would love to hear your go to sites for learning and inspiration! Thanks!

Like 0

Like

1 comments

Hello,

Our academy has excellent relevant articles on these topics. 
Leaving you the links for your convenience
Dashboards basics | Creatio Academy
Customize Word reports | Creatio Academy

Have a nice day!

Show all comments
k8S
install
cloud
Studio_Creatio
8.0

Hello team!

Was wondering if there is a way or any documentation to deploy Creatio application within a Kubernetes cluster. What would be the infra requirements , steps and how can we upgrade versions?

Thanks,

Ibrahim

Like 0

Like

1 comments

Hello,

At the moment, deployment of the Creatio application within a Kubernetes cluster is being reviewed by our R&D team.

Currently, official documentation for this deployment scenario is still in progress, and there is no confirmed timeline available for its publication yet.

Once additional information becomes available, we will be happy to share updates with you.

Show all comments