mobile
FreedomUI
local
storage
Studio_Creatio
8.0

Hi,
I'm adapting my Creatio mobile Freedom UI customizations to work correctly when there is no connection to the server. Is there something like local storage that I could use to save information between app launches?
I was thinking about creating a special "offline cache" object to store this data, and filtering it by the assigned user. However, this feels like a workaround.
Maybe there is already a built-in solution for this, or does Creatio plan to add something like this in the future?
Thank you in advance for your help!

Like 0

Like

4 comments

Hello Eryk,

Yes, we have native support of the offline mode. The offline mode requires an Internet connection only for the first imports and subsequent synchronizations. With this mode, the data is saved on your mobile device. Manually run a synchronization with the Creatio instance server to get the configuration changes and update the data.

You can use the following articles to get more information on how the offline mode works:
https://academy.creatio.com/docs/8.x/mobile/mobile-app-setup/classic-ui/synchronization
https://academy.creatio.com/docs/8.x/mobile/mobile-development/mobile-basics/architecture-mobile/overview-mobile

Have a great day!
 

Hi, thanks for the response.

I may have phrased my question a bit imprecisely - the need I'm describing is fairly specific. I'd like to be able to store some temporary technical information locally on the phone only, scoped to the currently logged-in user. I know I could do this by adding a dedicated object with a relation to the user and fields to hold this kind of data, setting that relation on record save, adding a filter on read, and possibly some security to prevent other users from reading it. But that feels somewhat overengineered, and on top of that, it unnecessarily writes this data to the database. It would be much simpler in this case if the SDK offered something like localStorage, where I could do:

localStorage.setItem('someSetting', { ... })

and later just read it back with:

const settingValue = localStorage.getItem('someSetting');

Hello,

At the moment, the Mobile Creatio Freedom UI SDK does not provide a public localStorage-like API for device-only data. Page attributes exist only within the ViewModel lifecycle, and custom logic runs in an embedded JS runtime rather than a browser, so the standard web localStorage is not available either.
The approach you described (a dedicated object filtered by the current user) is currently the supported way to persist such data. In offline and hybrid mode, records are stored in the local on-device database and transferred to the server only during synchronization, so it works without a connection: https://academy.creatio.com/docs/8.x/mobile/mobile-development/mobile-b…
You are right that the data will eventually reach the server database, and there is no supported way to keep it device-only. A local key-value storage in the mobile SDK is a reasonable suggestion, so please consider posting it in the Ideas section: https://community.creatio.com/?type=idea

Ok, thank you :)

Show all comments
mobile
FreedomUI
converters
validators
Studio_Creatio
8.0

Hi,
I know that in the browser version of Creatio, Freedom UI supports handlers, converters, and validators. I also know that for mobile, it's possible to define handlers through a remote module.
A couple of questions on this:
- Do mobile apps support converters and validators at all, or is this functionality limited to handlers only?
- If they are supported, is it possible to define them via a remote module as well, the same way as handlers?
- I'm aware that one workaround is to implement "validation" through a handler on record save (e.g. checking a field value and showing a message). However, what I'm really looking for is something that highlights the invalid field immediately, at the moment of input - similar to how validators behave in the browser UI, rather than only surfacing an error after attempting to save.

Has anyone managed to achieve this on mobile, or is this simply not supported yet?

Like 1

Like

3 comments

Hi, I think the links you sent are about the web version, but I clearly mentioned that I need the mobile version.

Just bumping this - any update would be appreciated. Thanks!

Show all comments
mobile
label
translation
Studio_Creatio
8.0

Hi,
Is there a way in Creatio mobile to reference translation labels via $context.Resources.Strings, the same way we do in JS on the Web version? I tried this, but unfortunately it doesn't work. It's possible to hardcode translations inside the mobile app, but that leaves the question of how to determine which language is currently active for the user. Is the user's active language/culture exposed anywhere in the mobile SDK?
 

Like 1

Like

3 comments
Best reply

Hello,

Yes, it is possible to reference translation labels in the Mobile application. You can retrieve them in the following ways:

1. const label = await ($context as any).getResourceString('MyResourceKey') ?? 'fallback';

This approach allows you to obtain the localized value for a specific resource key directly in code. If the resource is not found, the fallback value will be used.

2. #ResourceString(UsrName)# can be passed as title for dialog, label for button, etc via SDK. It will be resolved automatically.

 

 

Hello,

Yes, it is possible to reference translation labels in the Mobile application. You can retrieve them in the following ways:

1. const label = await ($context as any).getResourceString('MyResourceKey') ?? 'fallback';

This approach allows you to obtain the localized value for a specific resource key directly in code. If the resource is not found, the fallback value will be used.

2. #ResourceString(UsrName)# can be passed as title for dialog, label for button, etc via SDK. It will be resolved automatically.

 

 

Hi,

I checked both approaches and they work. Thanks!

Is there, however, any way to access information about the currently logged-in user and their language within the mobile app?

I just realized what my original problem actually was, and why your answer doesn't solve it :)

These solutions work when it's a label defined for the view, but they don't work at all when it's a label that refers to an object field.


[Example 1]

{
    "operation": "insert",
    "name": "TabContainer_gbg1csl",
    "values": {
        "type": "crt.TabContainer",
        "items": [],
        "caption": "#ResourceString(TabContainer_gbg1csl_caption)#",
        "iconPosition": "only-text",
        "visible": true
    },
    "parentName": "TabPanel_poiszvh",
    "propertyName": "items",
    "index": 6
},

Here we have a view label, and as you can see, it's assigned using the ResourceString macro. This works fine.

[Example 2]

{
    "operation": "insert",
    "name": "ComboBox_9ijhdyv",
    "values": {
        "layoutConfig": {
            "column": 1,
            "colSpan": 1,
            "row": 1,
            "rowSpan": 1
        },
        "type": "crt.ComboBox",
        "label": "$Resources.Strings.CaseDS_CreatedBy_lyopz5h",
        "ariaLabel": "",
        "isAddAllowed": true,
        "showValueAsLink": true,
        "labelPosition": "auto",
        "control": "$CaseDS_CreatedBy_lyopz5h"
    },
    "parentName": "GridContainer_945eip2",
    "propertyName": "items",
    "index": 0
},

Here the label is the column name. Unfortunately, in this case, none of the solutions work as expected.

Below is an example of the handler code:

await dbg($context, 'T1: ' + await $context.getResourceString('TabContainer_gbg1csl_caption')); // Correct label
await dbg($context, 'T2: ' + await $context.getResourceString('CaseDS_CreatedBy_lyopz5h')); // Incorrect label: null
await dbg($context, 'T3: #ResourceString(TabContainer_gbg1csl_caption)#'); // Correct label
await dbg($context, 'T4: #ResourceString(CaseDS_CreatedBy_lyopz5h)#'); // Incorrect label: #ResourceString(CaseDS_CreatedBy_lyopz5h)#
Show all comments
mobile
filter
quick-filter
list
Studio_Creatio
8.0

Hi,
Is it possible to manage quick filters on the list view in the Creatio Freedom UI mobile app the same way as in the browser version?
What I need:

  • Add custom filters
  • Multiselect filters
  • Restrict the static list of values available in a filter - for example, in the Owner field, show only contacts of the "Employee" type

I've noticed that the set of filters is tied to the set of columns displayed on the list tile, but this is limiting.

Like 1

Like

2 comments
Best reply

Hello,

You can add the Quick Filter component by selecting it in the Freedom UI Mobile Designer and dragging it onto your page layout. After adding the component, ensure that the filter is configured with the appropriate data type and is correctly linked to the corresponding list component.

Please refer to the screenshot below for reference on configuring Quick Filters in the new Freedom UI Mobile Designer.

image.png

I hope this helps.

Thank you for choosing Creatio!

Hello,

You can add the Quick Filter component by selecting it in the Freedom UI Mobile Designer and dragging it onto your page layout. After adding the component, ensure that the filter is configured with the appropriate data type and is correctly linked to the corresponding list component.

Please refer to the screenshot below for reference on configuring Quick Filters in the new Freedom UI Mobile Designer.

image.png

I hope this helps.

Thank you for choosing Creatio!

Thank you :)

Show all comments
Studio_Creatio

Hello

I'm working on a Creatio application with two sections:

  1. Application (Service Request)
  2. License

Each License belongs to a specific Application.

I have already created a Request Number lookup field in the License section, so each License is linked to its corresponding Application, and this relationship works correctly.

Now I want to achieve the reverse: on the Application page, I want to display the related License automatically.

To do this, I added a License Number lookup field to the Application section (lookup to the License object). However, I cannot get it to populate automatically with the related License.

I tried several approaches, including using a Business Process with Read Data and Modify Data, but I haven't been able to make it work.

What is the recommended or best-practice approach in Creatio for implementing a one-to-one relationship like this? Should I use:

  • A Business Process?
  • A Business Rule?
  • A Detail instead of a lookup?
  • Or is there another recommended configuration?

Any guidance or examples would be greatly appreciated. Thank you!

Like 0

Like

1 comments

Hi,

For a true one-to-one relationship, I would not recommend maintaining two independent lookup fields unless you really need to store the reverse reference for reporting/integration purposes.

The cleaner approach is to keep a single source of truth:

License.Request Number -> Application

Then, on the Application page, display the related License through the page configuration rather than trying to populate Application.License Number automatically.

If you are using Freedom UI, the best fit is usually Multiple data sources. Add License as an additional/secondary data source on the Application page and configure the relation criteria using the existing lookup:

License.Request Number = current Application

After that, you can place the needed License fields directly on the Application page. This is the closest match for a real 1:1 UI, because the user sees License data as part of the Application page without duplicating the relationship.

Documentation:
https://academy.creatio.com/docs/8.x/no-code-customization/customization-tools/ui-and-business-logic-customization/multiple-data-sources

A Business Rule is not the right tool for this. Business rules are mainly for UI behavior, visibility, required fields, validation, etc. They do not automatically query a related child record and populate a reverse lookup.

A Business Process can do it, but only if you intentionally want to denormalize the data. In that case, you would need to handle all scenarios: License creation, changing the Application on the License, deleting/unlinking the License, and preventing more than one License per Application. Otherwise the two lookup fields can become inconsistent.

Show all comments
audit
Studio_Creatio
8.0

Hello community,

does anyboty know how to get all event types which are really stored in Audit log if occured? I mean I can select all event type in the advanced filter but if it means that all event types I can select are really stored in the log even now I can't find at least one of them?

For example, I can select in the filter "Get enitity schema operation rights" value and don't see any records. Is this event in any case stored in the log if it occured? Or can the actual list be confugured somewhere?

Like 0

Like

3 comments

Hi Artem, 

in system settings you can turn on/off the logging for certain types of events - e.g. UseAdminSettingsLog, UseAdminEntitySchemaOperationLog...

I assume what you see is the possible Lookup Values for types of events, however if logging for them is turned off, then no records are created of this type you could see

Best, 
David

David Örnek,

thanks a lot! Does selected Default value checkbox mean that the event is included in the log, and if it isn't selected then vice versa?

Hi Artem,

The Audit log records themselves are stored in the SysOperationAudit table. The list of available audit event types is stored separately in the SysOperationType lookup/table.

This means that the values you see in the advanced filter are the available operation types from SysOperationType, but it does not necessarily mean that records for all of these types are currently being written to the audit log.

Whether a specific type of event is actually logged depends on the corresponding system setting.

Regarding the Default value checkbox in the system setting: if it is enabled, then this logging option is enabled and the corresponding event type should be included in the audit log when such an event occurs.

Show all comments
mobile
closepage
discard
Studio_Creatio
8.0

Hi, I'm trying to use crt.ClosePageRequest in the mobile app. If any field on the view has been previously changed, a popup appears asking me to confirm whether I really want to discard the current changes. Unfortunately, I'm unable to get rid of it in any way. In the browser version of Creatio, defining a handler for the crt.CanDiscardUnsavedDataRequest request helped, as described in this article: https://customerfx.com/article/suppressing-the-unsaved-data-prompt-when…
I've already tried many different things, including setting $context.HasUnsavedData = false, but unfortunately without success.
 

Like 2

Like

2 comments

Hello,

This functionality is currently not available in the mobile application. It can lead to unintended data loss caused by accidental swipes, taps, or navigation actions.

Additionally, overriding crt.ClosePageRequest would not address all navigation scenarios. For example, it would not be triggered when users navigate away from the page using device-level system buttons or gesture-based navigation, which are common on mobile devices.

Hi Krzysztof,
Thanks for the explanation, but I think this doesn't fully explain the limitation. The web app has the same risk (accidental clicks, closed tabs, etc.), but `crt.CanDiscardUnsavedDataRequest` still allows a developer to skip the prompt when needed. The idea isn't to change the default behavior for users, it's to give developers the same option that already exists on web.
The point about system-level gestures and buttons is fair, but it only means the hook wouldn't cover 100% of cases. On web, closing the browser with an OS shortcut isn't covered either, and the hook is still useful for the navigation paths that do go through the app logic.
 

Show all comments
Email
#Email_Signature
Studio_Creatio
8.0

Is it possible to add standard email signatures for all the users in Creatio?

Can we create any email signature template in Creatio and re-use it when we send an email?

From where can we send Email signature in the Creatio org? (I know about "Add signatures to outbound emails" in "Send emails from Creatio" option) Is there any other option we can configure emails?

Like 0

Like

1 comments

Hello,

Email signatures are configured individually for each mailbox and are not user-dependent by default. This means that if multiple users send emails from the same shared mailbox, the same signature will be applied regardless of which user sends the message.

At the moment, there is unfortunately no out-of-the-box functionality that allows signatures to be dynamically selected based on the user sending the email.

Regarding other ways of configuring emails. They can be sent using the "Send Email" element in a business process and dynamic case management. In such cas,e there are two possible ways regarding signatures:

  • When an email is sent manually, the configured mailbox signature will be added automatically.
  • When an email is sent automatically, the system sends the email template as configured, and the mailbox signature is not appended. If you would like a signature to appear in automatically sent emails, it should be included directly in the email template.
Show all comments
mobile
websocket
message
Studio_Creatio
8.0

Hi, is there any method to establish a WebSocket connection between the Creatio server and the Creatio mobile app (exactly as in the browser version)? At a minimum, the mobile app could poll the server in a loop, but unfortunately there is a problem with that too, since neither setTimeout nor setInterval are available (as I described in this post: https://community.creatio.com/questions/creatio-mobile-app-use-settimeout-or-setinterval).

Like 0

Like

3 comments

Hello,

This can be implemented using the MessageChannelService. To proceed, please import the Creatio DevKit SDK, choose the appropriate location in your code to handle subscription and unsubscription, and utilize the sdk.MessageChannelService accordingly.

Please note that this approach is supported starting from version 8.2.0 and later.

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*/

Hi, thanks for the reply, but I believe your example is for the Web Creatio, while my question was about the mobile app :)

Just bumping this - any update would be appreciated. Thanks!

Show all comments
mobile
timeout
sleep
delay
Studio_Creatio
8.0

Hi,
is it possible to use setTimeout or setInterval functionality in the remote module for the Creatio Freedom UI mobile app? Unfortunately, when trying to build the project, I get an error:

TS2304: Cannot find name 'setTimeout'

Like 1

Like

2 comments

Hello,

Regarding the TS2304: Cannot find name 'setTimeout' error you’re encountering, there are two possible solutions:

  • Install the @types/node package to include Node.js type definitions.
  • Alternatively, you can use (globalThis as any).setTimeout() in place of setTimeout().

Either approach should resolve the issue.

Hi, thanks for the reply. I already had the @types/node package installed before, but the (globalThis as any).setTimeout workaround did the trick, thank you! Interestingly, it seems like the setTimeout function was added intentionally, since it doesn't exist in JavaScriptCore natively. However, I don't see clearTimeout there.

Show all comments