Data templates transforms Data templates transform the data model into text or HTML content. Templates are used in many areas in emakin like form controls or mail templates etc.
Templates basically consist on of xpath queries within {{ and }} qualifiers.
Assume you have a field named as "username" in the data model. Basic temple template example is:
Code Block |
---|
|
Hello {{ username }}! |
...
Because all xml values are string by default, no formatting is performed while generating the output. If you need to perform formatting for number or date values, you have to convert the data type or use a format function.
Culture Support
Data templates are culture sensitive and all formatting rules are derived from culture being used. Culture information is automatically derived from user preferences or you can explicitly specify it. If no culture is specified, invariant culture is used.
...
All text or string types are exactly transformed without any format formatting being performed.
Number formatting
Like Functions like "sumSum" or "countCount" functions already returns return number value values, therefore there is no need to convert but if need use data model field you have to wrap field with for number conversions, but in case it is necessary, number() function should be used. Ex: number(MyNumberField)
All number values are by default formatted with decimal rules.
Examples:
Template | Outputs | Culture |
---|
{{ 12345678912345 }} | 12345678912345 |
|
|
{{ 123456.78912345 }} | 123456.78912345 |
|
|
{{ number(123456.78912345678912345) }} | 123456.789123457 |
|
|
{{ format( number(123456.789) ) }} | 123456.789 |
|
|
{{ format( number(123456789) ) }} | 123456789 |
|
|
{{ format( number(123456789), 'n') }} | 123,456,789.00 |
|
|
{{ format( number(123456789), 'n') }} | 123.456.789,00 | tr-TR |
{{ format( number(123456789), 'n0') }} | 123,456,789 |
|
|
{{ format(number(123456789), 'c') }} | 123.456.789,00 ₺ | tr-TR |
Date formatting
Template system does automatically detects the xml date types in formatted with "YYYY-MM-DD-THH:MM:SSTZ". Emakin always use uses this format in data model for date values.
...
Examples:
Assume data model has an a MyDate field with 2014-01-31T09:00:00+02:00 value.
Template | Outputs | Culture |
---|
{{ MyDate }} | 01/31/2014 16:04:12 +02:00 |
|
|
{{ format(MyDate,'dd/MM/yyyy') }} | 31/01/2014 |
|
|
{{ format(MyDate) }} | 31.1.2014 09:00 | tr-TR |
{{ format(MyDate,'d') }} | 31/01/2014 |
|
{{ format(MyDate,'D') }} | Monday, June 15, 2009 | en-US |
{{ format(MyDate,'o') }} | 2014-01-31T09:00:00+02:00 |
|
Scripting example
Code Block |
---|
var myNode = $Xml.Parse("<Customer><Name>John</Name><BirthDate>2014-01-31T09:00:00+02:00</BirthDate></Customer");
var result = myNode.Format('<p>Birth date : {{Customer/BirthDate}}</p>');
// result : <p>Birth date : 01/31/2014 09:00:00 +02:00</p> |
Scripting example
A way to remove time from date node:
Code Block |
---|
$Xml.SetValue('Test/testdate', new DateTimeOffset()); // testdate will be saved to an XML as "2015-11-12T15:27:16.2568549+02:00"
$Xml.SetValue('Test/testdate2', $Xml.Format("{{ format(Test/testdate,'yyyy-MM-dd') }}")); // testdate2 will be saved to an XML as "2015-12-11"
// result : 2015-12-11 |
Format Function Options
Data Type | Format Option | Description | Sample Data | Output |
---|
String |
| Print string as automatically detection | <script>alert('hello')</script><div>hello</div> | <div>hello</div> |
String |
| Print string as automatically detection | 12.345 | 12.3 |
String |
| Print string as automatically detection | 12 | 12 |
String |
| Print string as automatically detection | 2022-05-07T00:00:00+03:00 | 07.05.2022 00:00 |
String |
| Print string as automatically detection | True / true | ✓ (U+2713) |
String |
| Print string as automatically detection | False / false | ✕ (U+2715) |
String | html | Print string as encoded html text | <script>alert('hello')</script><div>hello</div> | "<script>alert('hello')</script><div>hello</div>" |
String | safe | Print value as safe html with discarding dangerous tags | <script>alert('hello')</script><div>hello</div> | <div>hello</div> |
String | string | Print string without any encoding applied | <script>alert('hello')</script><div>hello</div> | <script>alert('hello')</script><div>hello</div> |
Number | n0 | Print number as integer without any decimal | 12.345 | 12 |
Number | n1 | Print number as decimal with 1 number after dot | 12.345 | 12.3 |
Boolean |
| Print value as unicode check mark | True / true | ✓ (U+2713) |
Boolean |
| Print value as unicode check mark | False / false | ✕ (U+2715) |
DateTime |
| Print date value in user's locale preference | 2022-05-07T00:00:00+03:00 | 07.05.2022 00:00 |
DateTime | o | Print date in ISO format | 2022-05-07T00:00:00+03:00 | 2022-05-07T00:00:00+03:00 |
DateTime | m | Print date in dynamic formatted format | 2022-05-07T00:00:00+03:00 | 2 days ago |
DateTime | dd/MM/yyyy | Print date in specified date format | 2022-05-07T00:00:00+03:00 | 07/05/2022 |
Conditional Formatting
If conditional rendering is needed, the format below can be used;:
Code Block |
---|
|
if XPathConditon then Template
if XPathConditon then Template else Template
|
...
If you need to apply template for multiples multiple nodes in a data model, you can use repeating template expression like following syntax:
Code Block |
---|
ItemXPath => Template
|
This format applies the same template for every matched element by ItemXPath.
Code Block |
---|
language | xml |
---|
title | Scripting Usage |
---|
|
var result = $Xml.Format('SAMPLE REPORT\{{ SAMPLE REPORT
<h1>{{Customer/Name}}</h1>\
<table>\
{{ Rows/Row =>>
<tr><td>{{Date}}</td><td>{{Description}}</td></tr> }}\
</table>', {
MyVariable : 'Long text'
});
|
result
Generates the following output:
Code Block |
---|
|
SAMPLE REPORT
<h1>John</h1>
<p>Long<table>
text</p> <table> <tr><td>2010-01-01</td><td>description</td></tr>
<tr><td>2015-01-01</td><td>other description</td></tr>
</table>
|
...
While generating HTML content some tags ( like table tag ) may become corrupted if {{ x => y}} template is used. As an alternative method, format function supports the x-repeat attribute to perform the repeating content.
Code Block |
var result = $Xml.Format('SAMPLE REPORT\
<h1>{{Customer/Name}}</h1>\
<table>\ |
---|
|
{{ SAMPLE REPORT
<table>
<tr x-repeat="Rows/Row">\
<td>{{Date}}</td><td>{{Description}}</td>\
</tr>\
</table>', {
MyVariable : 'Long text'
});
}} |
This attribute can be used with any element. For example, it can also be used with "li" tag also.
Code Block |
---|
var{{ result<ul>
= $Xml.Format('\ <ul>\ <li x-repeat="Rows/Row">\
<span>{{Date}}</span>\
</li>\
</ul>'); }} |
Recursive Repeating Template
If recursive repeating templates are being needed, format below can be used;:
Code Block |
---|
ItemXPath =>> Template
|
For each item at specified in ItemXPath, sub template is generated, and also the same template is repeated again for the Template content recursively.
Code Block |
var result = $Xml.Format(' |
---|
|
{{ <h1>SAMPLE REPORT</h1>\
<p>{{DocumentTitle}}</p>\
{{ Sections/Section =>>>>
<h2>{{Name}}</h2><p>h2>
<p>{{Body}}</p> }}');
}} |
result:
Code Block |
---|
|
<h1>SAMPLE REPORT</h1>
<h2>My Section</h2>
<p>Section content</p>
<h2>Sub Section</h2>
<p>Child section content</p> |
Template Variables
All of the custom defined process variables can be used in templates. Additionally, some of the system properties are automatically imported to the template engine. Because of the environment limits, client and server side variables use different variable contexts.
Client Template Variables
In scripts like form script, for the validation rules running on the client side environment, following variables are defined:
Variable Name | Description |
---|
$staticUrl | Static resources base address. (ex: https://static.emakin.com/ ) |
$applicationUrl | Application base address. (ex: https://mydomain.emakin.com/app/ ) |
$Process | Unique identifier of the current process. (ex: 71E8B187-C049-4ba1-AE5E-6B0BAD6B7F42 ) |
$FolderName | Name of the current folder in which the process is saved. (ex: Customer Relations ) |
$CustomVariable | Defined custom value. |
Server Template Variables
In process scripts like pre work, post work and other scripts that running on the server side environment, following variables are defined:
Variable Name | Description |
---|
$ApplicationName | Name of an application. (ex: emakin.com ) |
$ApplicationUrl | Base url of an application (ex: emakin.com ) |
$Domain.Name | Name of a domain (ex: mydomain) |
$Domain.Url | Url of a domain (ex: https://mydomain.emakin.com ) |
$Domain.LogoUrl | Logo image url of a domain (ex: https://mydomain.emakin.com/logo.png ) |
$CustomVariable | Defined custom value. |
Activity Notification Template
Activity notifications, like assigning a work item to a user or reminder notifications, use the same template context. Additionally to the server variables, the following variables can also be used:
Variable Name | Description |
---|
$Id | Id number of a work item |
$WorkItem | Instance of a WorkItem. You can use . (dot) qualifier to access object properties like "$WorkItem.Instance.Number" |
$Recipients | Comma qualified recipient names. (ex: Ertan Tike, Emel Sayın) |
$Url | Url of a work item. (ex: https://mydomain.emakin.com/app/?/workitem=1234 ) |
$AssignedTo | Comma qualified username of user to whom the work item is assigned. (ex: Ertan Tike) |
User Registration Template
Additionally to the server variables, user registration invitation defines the following variables:
Variable Name | Description |
---|
$Ticket | Defines the system generated authentication token to be embedded in a mail content. |
$DisplayName | Defines the display name of a user. |