pivot
Studio_Creatio
8.0

Hi Everyone,

I’m setting up a pivot in the Dashboards section, and I noticed that under the Date part functions we currently have options like PartYear, PartMonth, PartWeek, PartDay, etc., but there’s no option to get the quarter of a date.

My use case is quite common: I’d like to group or report records by the quarter of the Created on date (e.g. Q1–Q4), similar to how months or weeks can be derived.

Is there a recommended workaround for this today (for example using formulas or logic), or is there a plan to introduce something like a PartQuarter function in future releases?

Any tips, best practices, or ideas would be much appreciated. Thanks in advance!

Like 0

Like

1 comments

Hello,

Unfortunately, it is not currently possible to add a quarter as one of the options in the Date part in the chart setup.

However, we have created a request for our R&D team to extend this functionality in future releases of the system.

Thank you for your question!

Show all comments

Hello colleagues,

I'm looking for a way to customize the email composer interface. Currently, the "To" field uses a Dropdown list view (simple listbox), but I would like to change it to a Selection window instead.

Current behavior: The "To" field displays a basic dropdown list with limited search capabilities. However, when the customer has thousands of contacts, this listbox format is not user-friendly and makes it difficult to find the right recipient.

Desired behavior: I want the "To" field to open a Selection window modal, which would allow me to:

  • Search freely across multiple fields
  • Add custom columns to the search grid
  • Have better filtering and selection options

Is there a configuration setting to change the lookup view type for this field? Can this be modified through the Section Wizard, page settings, or would it require development changes?

Any guidance on how to switch from Dropdown list to Selection window for the email composer "To" field would be greatly appreciated!

Thank you in advance.

Like 1

Like

1 comments

Greetings,

Unfortunately, currently there is no option to customize the To field in the message composer. It is a part of the component. 

We have registered the voice with our R&D team. The improvement will be available in one of the future releases.

Please let us know if you have other questions.

Thank you for reaching out!

Show all comments
Studio_Creatio
8.0

Hello,

I've been struggling to get the dockerized version of creatio running fully with no errors.

The first error is at the start of the container like below, the application runs fine after:



The second error is recurring too, also nothing happens when it shows in the container:

The third error happens after every app compilation, no errors in the compilation, but docker container stops with that error:

What I've tried so far:

• Recreating the containers.
• Regenerating the source code.
• Recompiling the environment.
• Restarting the containers.

None helped so far.

Thanks for helping me solve all three errors.

Like 2

Like

2 comments

According to the exception description you've got some trouble with passing UserConnection value to some method. This type of trouble may occur for example when you're trying to call some method, which uses UserConnection outside of the user context. Example - in some process you a calling manually OOTB method for MS Report generation 

data = GenerateMSWordReport(printableId.ToString(), recordId.ToString(), true);

located in the Terrasoft.Configuration.ReportService namespace. Everything will work nice launched from process by user, but fail when launched in the same process by event or timer. The reason for this is that in the second case the line inside the method

var openXmlUtility = new OpenXmlUtility(UserConnection);

will fail because the parent class itself can't retrieve a UserConnection value from the context. 

So, recommendation is the following: in you class ether add UserConnection declaration like

private HttpContextBase _httpContext;
protected virtual HttpContextBase CurrentHttpContext
	{
		get { return _httpContext ?? (_httpContext = new HttpContextWrapper(HttpContext.Current)); }
		set { _httpContext = value; }
	}

	private UserConnection _userConnection;
	protected UserConnection UserConnection {
		get {
			if (_userConnection != null) {
				return _userConnection;
			}
			_userConnection = CurrentHttpContext.Session["UserConnection"] as UserConnection;
			if (_userConnection != null) {
				return _userConnection;
			}
			var appConnection = (AppConnection)CurrentHttpContext.Application["AppConnection"];
			_userConnection = appConnection.SystemUserConnection;
			return _userConnection;
		}
	}

or you can modify the called method to pass UserConnection value directly. In this option UserConnection will be obtained in the process instance like UserConnection userConnection = Get<UserConnection>("UserConnection"); and then passed it's value into your method directly. In our example it will look like:

UserConnection _userConnection = Get<UserConnection>("UserConnection");
var data = UsrGenerateMSWordReport(_userConnection, printableId.ToString(), recordId.ToString(), true);

and in method will be added one new parameter:

public ReportData UsrGenerateMSWordReport(UserConnection _userConnection, string urlTemplateId, string urlRecordUId, bool convertInPDF) {
	var templateId = new Guid(urlTemplateId);
	var openXmlUtility = new OpenXmlUtility(_userConnection);
		

Hello,

The container will shut down if the application stops (which is expected upon completion of the compilation). However, the automatic restart of the container should be indicated upon its creation. To do so you need to add the --restart=always flag to the "docker run" command to make a persistent Docker container.

More details in this article.

 

Show all comments

While trying to create a new record for a custom object through a section list page button, the auto number field for the record gets incremented every time the new form page is loaded.

Similarly, if I switch to expanded view from compact view as well this happens.

Is this an expected behavior. Is there anything that could be done to make sure that the auto number increments only when the record is saved to database and not every time the page loads.

Like 0

Like

1 comments

This is expected behavior for how the auto-number fields work. 

If you're after a true sequential number without gaps, then you'd need to implement something custom to accomplish that. For a no-code approach, you could have a process with a signal of record added that gets a record count and then updates the newly added record with the result.

Ryan

Show all comments

When editing/deleting an existing inhereted data-model, has a compilation error:

This is a cloud Demo environment, so I can't troubleshoot the error from .cs file.

Like 0

Like

2 comments
Best reply

Hello.

Please generate the source code for all schemas and then run the Compile All action. After these steps, the issue should be resolved.

Best regards,
Antonii.

Hello.

Please generate the source code for all schemas and then run the Compile All action. After these steps, the issue should be resolved.

Best regards,
Antonii.

Hi, Antonii.

It worked! Thanks a lot, cheers.

Best Regards,
Ahmed.

Show all comments

So, in a new demo instance of Creatio, you can go to a message template and click the edit template button. When you do this, you will notice that a new tab is opened and a full page content panel is opened.  This is actually a classic module, but you will notice in the url for the page, that it's using the classic shell (/Nui instead of /shell).  Really, it opens without any shell at all.

I have a custom version of the same content editor, but when we open this module page the same way, you can see that it initially pops to the right url (similar to the demo instance), but it is immediately routed to a /shell url and stops there. 

I don't know if there's some internal router exception for the default editor module in Creatio that allows for it to open under the classic shell or if there's something else I'm missing.  In debugging the code, I open the page the same way, simply calling window.open and passing in the url with the same structure. 

For those familiar with this module, it's not entity bound, so you can add an exception in UI management. Wouldn't matter anyway, since the default creatio editor isn't doing this either (url would reflect the /shell path, instead of the /Nui classic path).

Anyone have any experience with this?

Jeremy

Like 0

Like

3 comments

In Creatio 8.3.2, classic UI Shell is officially deprecated. Probably causing some issues ? So although page is classic UI, if there's no more Classic UI shell, I guess that's the reason why it's not showing a shell ? (not ideal I know). I hope message templates will seen be migrated to a Freedom UI designer like bulk emails.

Couple things on this: although they are deprecating it, the classic shell is still available. Starting with 8.3.2, it will simply be turned on by default. We will actually be turning it off after the update for most of our clients, as we are not fully ready to migrate. 

Second, the out of the box editor works exactly like we needed to and like it has in the past, so I know the technology does in fact still support it. I'm guessing it's some sort of static route defined somewhere, that prevents it from being redirected to the freedom Shell. 

Just in case something like this comes up for anyone else, to prevent a page from redirecting to the Freedom UI Shell base url, you need to a the base url for your classic module to the Lookup "Blacklist of redirects from Classic UI". There are various modules that Creatio opens in a new tab, that must use the classic base (e.g content editor and BP designer) and this is how they allow for this. 

Show all comments
Studio_Creatio
8.0

I'm working in in a cloud-based dev environment. I've created a message template and I'm trying to move it to QA. I've created a package, and I've added the EmailTemplate data to that package. I've added SysImage to the package, too, but adding it or removing it makes no difference to my problem.

When I import the package into my QA environment and open the template in the designer, the panel with the controls for adding blocks, image, text, spacers, etc. are all missing and it views the entire email as one large HTML block.

A package I created yesterday and imported to QA (with a different version of the template)_works fine. I can open the designer with no issues, the individual blocks, images, and text are all individually editable. (I'd use the package I created yesterday, but I thought I no longer needed it so I created a new one.)

When I compare the contents of the exported zip files using Beyond Compare, the one that works has a JSON element like the below (I only include the first part...it's a long string).

"Value": "{\"ItemType\":\"sheet\",\"Caption\":\"Content designer\",\"Width\":600,\"BackgroundColor\":\"#ffffff\",\

I'm assuming the fact the JSON with Content Designer missing is a part of my problem (there are other differences in the package, too - a large number of references to .csproj files that my broken package doesn't have). But I can't figure out why one package included it and the other doesn't. Anyone have an idea?

Like 0

Like

2 comments
Best reply

Hello Jeff,

I suggest you to manually move the template from your dev-site to to your QA. You can easily download the template information and import it using OData.

  1. Copy the email template Id that you want to move
  2. Access the email template information in the EmailTemplate table:
    https://your-dev-site.creatio.com/0/odata/EmailTemplate(template_id)

    You will need to take this JSON and remove the lines that have "@odata." in the name (the first line the last 12 lines) as they are not needed for the import. If you have any fields with value "00000000-0000-0000-0000-000000000000", you will need to remove those lines too. For this example, the result parsed JSON would be:

    {
        "Id": "0dc0759c-80b3-48b3-a832-7e32925d748b",
        "CreatedOn": "2019-07-15T23:30:13.367747Z",
        "CreatedById": "410006e1-ca4e-4502-a9ec-e54d922d2c00",
        "ModifiedOn": "2025-12-16T20:55:28.568102Z",
        "ModifiedById": "410006e1-ca4e-4502-a9ec-e54d922d2c00",
        "ProcessListeners": 0,
        "Name": "Case assigned to group",
        "Subject": "Case #[#Number#] \"[#Subject#]\" assigned to group",
        "Body": "<div>\n\t<div>\n\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\">Case <strong>#[#Number#]</strong> \"[#Subject#]\" has been assigned to your group.</em></span></span></div>\n\t<div>\n\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Priority:</strong> [#Priority.Name#]</span></span></div>\n\t<div>\n\t\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Response deadline:</strong> [#ResponseDate#];</span></span></div>\n\t<div>\n\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Resolution deadline:</strong> [#SolutionDate#].</span></span></div>\n\t\t<div>\n\t\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Contact:</strong> [#Contact.Name#].</span></span></div>\n\t\t<div>\n\t\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Account:</strong> [#Account.Name#].</span></span></div>\n\t</div><div>&nbsp;</div>",
        "IsHtmlBody": false,
        "SendIndividualEmailId": "e75ac3fe-be9b-4a01-87db-c7dffd354f8c",
        "SaveAsActivity": false,
        "ShowBeforeSending": false,
        "TemplateConfig": "",
        "ConfigType": 0,
        "Notes": "",
        "TemplateTypeId": "74ff0cee-6593-482f-a62f-6dde6e17ab5e"
    }
  3. Send all this information to your QA site:
    1. If you want to update the existing template, send a PATCH request to https://your-qa-site.creatio.com/0/odata/EmailTemplate(template_id) with the parsed JSON in the body without the Id field
    2. If you want to re-create the template, remove it first and then send a POST request to https://your-qa-site.creatio.com/0/odata/EmailTemplate with the all the parsed JSON in the body.

I have moved a lot of templates from many sites using this method and it is by far the simplest for me when I want to have an exact copy between them. As you already moved the SysImage information, you won't need to migrate anything from that table using this method.

You can find more information about Creatio OData here:

 

Regards

Hello Jeff,

I suggest you to manually move the template from your dev-site to to your QA. You can easily download the template information and import it using OData.

  1. Copy the email template Id that you want to move
  2. Access the email template information in the EmailTemplate table:
    https://your-dev-site.creatio.com/0/odata/EmailTemplate(template_id)

    You will need to take this JSON and remove the lines that have "@odata." in the name (the first line the last 12 lines) as they are not needed for the import. If you have any fields with value "00000000-0000-0000-0000-000000000000", you will need to remove those lines too. For this example, the result parsed JSON would be:

    {
        "Id": "0dc0759c-80b3-48b3-a832-7e32925d748b",
        "CreatedOn": "2019-07-15T23:30:13.367747Z",
        "CreatedById": "410006e1-ca4e-4502-a9ec-e54d922d2c00",
        "ModifiedOn": "2025-12-16T20:55:28.568102Z",
        "ModifiedById": "410006e1-ca4e-4502-a9ec-e54d922d2c00",
        "ProcessListeners": 0,
        "Name": "Case assigned to group",
        "Subject": "Case #[#Number#] \"[#Subject#]\" assigned to group",
        "Body": "<div>\n\t<div>\n\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\">Case <strong>#[#Number#]</strong> \"[#Subject#]\" has been assigned to your group.</em></span></span></div>\n\t<div>\n\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Priority:</strong> [#Priority.Name#]</span></span></div>\n\t<div>\n\t\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Response deadline:</strong> [#ResponseDate#];</span></span></div>\n\t<div>\n\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Resolution deadline:</strong> [#SolutionDate#].</span></span></div>\n\t\t<div>\n\t\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Contact:</strong> [#Contact.Name#].</span></span></div>\n\t\t<div>\n\t\t\t&nbsp;</div>\n\t<div>\n\t\t\t<span style=\"font-size:12px;\"><span style=\"font-family:arial,helvetica,sans-serif;\"><strong>Account:</strong> [#Account.Name#].</span></span></div>\n\t</div><div>&nbsp;</div>",
        "IsHtmlBody": false,
        "SendIndividualEmailId": "e75ac3fe-be9b-4a01-87db-c7dffd354f8c",
        "SaveAsActivity": false,
        "ShowBeforeSending": false,
        "TemplateConfig": "",
        "ConfigType": 0,
        "Notes": "",
        "TemplateTypeId": "74ff0cee-6593-482f-a62f-6dde6e17ab5e"
    }
  3. Send all this information to your QA site:
    1. If you want to update the existing template, send a PATCH request to https://your-qa-site.creatio.com/0/odata/EmailTemplate(template_id) with the parsed JSON in the body without the Id field
    2. If you want to re-create the template, remove it first and then send a POST request to https://your-qa-site.creatio.com/0/odata/EmailTemplate with the all the parsed JSON in the body.

I have moved a lot of templates from many sites using this method and it is by far the simplest for me when I want to have an exact copy between them. As you already moved the SysImage information, you won't need to migrate anything from that table using this method.

You can find more information about Creatio OData here:

 

Regards

Alejandro González Momblán,

Thank you 100x!

I missed removing some of the odata on my first attempt at an insert but got past that pretty quickly.

Thanks again and I really appreciate this community!

Show all comments
Studio_Creatio
Sales_Creatio
Marketing_Creatio
Service_Creatio
8.0

Hello Community,


        I am developing a custom Angular component to be used in a Creatio instance. As shown in the screenshot, it directly prompts for “Open source code.” Instead, I want to pass inputs to the component in the same way standard components handle input parameters.

 

 

 

 

 

 

 

Currently, in the Angular code, the input is being passed as shown below:

@Input()
@CrtInput()
url: string = "";
 

Questions:

  1. What other approaches are available for passing input parameters to custom Angular components?
  2. Also, which JavaScript library would you recommend for working with fillable PDFs?

Regards,
Ajay Kuthe
(Creatio Developer)

Like 1

Like

2 comments

Hello Ajay,

In the current Freedom UI architecture, values defined inside an Angular custom component are never visible in the Freedom UI designer and cannot appear as configurable fields in the right-side settings panel(feature is under development). Freedom UI does not analyze Angular component metadata at design time, so decorators such as @Input() and @CrtInput() only enable runtime data binding, not visual configuration. As a result, the “Open source code” option is the expected and correct behavior for custom components. Input values can be passed only through page attributes and explicitly bound in the page schema (viewConfigDiff), where they are then delivered to the Angular component at runtime. Creating a custom settings panel or exposing Angular inputs visually, like standard components, is not supported at this time and is a known platform limitation.

 For working with fillable PDF files in Angular within Creatio, the recommended library is pdf-lib, as it supports form filling, runs in the browser, and integrates well with Angular-based Freedom UI components.

Jakub Wieczorek,

Thank you for the valuable information. Using pdf-lib, is it possible to save the modified, fillable PDF back into the Creatio database? Is there any documentation available for this?

Show all comments
system users
organizational roles
functional roles
Studio_Creatio
8.0

I have already created Organizational Roles and Functional Roles, and mapped them to multiple users.

Now I need to move this configuration to another sandbox environment.

My questions are:

  1. Is there a way to export Org Roles, Func Roles, and user mappings (include password, org role, and functional role together?
  2. Can the user–role mappings be directly imported into another sandbox, or do they need to be reconfigured manually?

I would appreciate any insights or best practices from anyone who has done this before. Thank you.

Like 0

Like

1 comments

Hello,

The transfer of organizational structure settings and access rights from one stand to another can be implemented using SQL scripts. To do this on the reference environment, you need to generate insert queries based on records from the following tables:

- SysAdminUnit (Administration object: users and roles)
- SysUserInRole (Direct user entries in roles)
- SysFuncRoleInOrgRole (Entry of a functional role into an organizational role)
- SysAdminOperation (System operations, if required)
- SysAdminOperationGrantee (Access to system operations, if required)
- SysEntitySchemaOperationRight (Access to objects)
- SysEntitySchemaRecordDefRight (Access to default records)
- SysEntitySchemaColumnRight (Access to object columns)
- SysAdminUnitGrantedRight (Delegation)
- SysWorkplace - (User Workplace)
- SysAdminUnitInWorkplace - (Users in Workplace)
- SysModuleInWorkplace - (Partition in Workplace)

You can use Microsoft SQL Server Database Publishing Wizard and similar tools to generate queries. The resulting SQL script must be attached to the package: "SQL script" type schema | Creatio Academy

Show all comments
FreedomUI
attachments
handlers
Studio_Creatio
8.0

Hello everyone, Is there a way to obtain the ID of the selected file in attachments in a Freedom UI section?

attachments files

Like 0

Like

5 comments
Best reply

I assume you could get it using the following (this works for lists, I assume it's the same for gallery mode)

const selectedId = await request.$context.TheListNameHere_ActiveRow;

See https://customerfx.com/article/responding-to-a-row-selected-event-in-a-creatio-freedom-ui-list/

Also, you could add the button/action as a menu item when you click the three-dots button, see https://customerfx.com/article/adding-row-action-menu-items-to-a-creatio-freedom-ui-list/ 

Ryan

I assume you could get it using the following (this works for lists, I assume it's the same for gallery mode)

const selectedId = await request.$context.TheListNameHere_ActiveRow;

See https://customerfx.com/article/responding-to-a-row-selected-event-in-a-creatio-freedom-ui-list/

Also, you could add the button/action as a menu item when you click the three-dots button, see https://customerfx.com/article/adding-row-action-menu-items-to-a-creatio-freedom-ui-list/ 

Ryan

Hello,

Basically there is no way to get the id when clicking, but maybe one of the options will be useful:

- you can create a list with files to write and display the id column
- when hovering over the file, the file id is displayed in the link

Ryan Farley,

Hi! Thanks for the suggestions.

I actually checked both approaches, but the AttachmentList  component seems to behave differently than a standard datagrid :

  1. The ActiveRow issue: I tried request.$context.AttachmentList_ActiveRow (and variations), but it appears the AttachmentList control does not populate the ActiveRow attribute in the ViewModel when you click on a file name. It seems the control handles the click event internally for downloading/previewing, without updating the page state.
  2. The Menu Items: Adding items via rowToolbarItems works visually, but there's a context issue. When using $Id as a parameter in a custom request within the AttachmentList, it returns the page Id  (the parent record) instead of the File Id . Unlike the DataGrid, the AttachmentList doesn't seem to "bridge" the row context to custom menu items easily.

Thanks!
Mario.

Mario Toro,

As for the selected row when clicked, you can try adding a change event handler and then output the change attributeName in the console, then click a row to see if it changes an attribute. 

As for the context menu, you can get the selected record Id, but its name won't be $Id. Somewhere in the page code you'll see the attributes for the data source for the attachments, you'll need to make sure you've wired it up correctly (I do know this works, I've added this for attachment lists before)

Ryan

Mario Toro,

If you look at the Attachment list on the Cases_FormPage you'll see it is named "AttachmentList" and has a an attribute for the primaryColumnName as "AttachmentListDS_Id" and it's Items collection is named "AttachmentList" (you can see this in the base page "PageWithTabsFreedomTemplate"). 

So, to wire up the menu, you'd use: 

{
	"operation": "merge",
	"name": "AttachmentList",
	"values": {
		"rowToolbarItems": [{
			"type": "crt.MenuItem",
			"caption": "Do something",
			"icon": "edit-row-action",
			"clicked": {
				"request": "cfx.doSomethingHandler",
				"params": {
					"itemsAttributeName": "AttachmentList",
					"recordId": "$AttachmentList.AttachmentListDS_Id"
				}
			}
		}]
	}
}

Then the event handler would be: 

{
	request: "cfx.doSomethingHandler",
	handler: async (request, next) => {
		const id = request.recordId;
			        
		// do something here with the id
			 
		return next?.handle(request);
	}
}

Ryan

Show all comments