# TIVITY Documentation

Your Guide to Low-Code App Development

![](/files/lvboPl2lNE85q14FGMq9)

### Welcome to TIVITY Documentation

TIVITY is a powerful low-code platform that enables you to build and launch fully functional web applications without writing code. Whether you're a seasoned developer or just starting out, TIVITY provides an intuitive interface and comprehensive tools to streamline your app development process.

Before diving into the details, let's take a quick tour of the TIVITY interface with the demo to guide you through the essential components of the platform. This includes key elements such as workspaces, apps, the activity stream, notifications, and how to access important areas like the configuration mode and your user profile. These foundational elements will form the basis of your interaction with TIVITY as you begin creating and managing your applications.

{% hint style="info" %}
Let's start by exploring the TIVITY interface, click on the hotspot below to start your journey:
{% endhint %}

{% @guideflow/guideflow-embed requestedUrl="<https://app.guideflow.com/player/zkj92l1sep>" %}

### Getting Started

New to TIVITY ? Start here to learn the basics:

* [Create Your First App](/overview/getting-started) - Build a simple app in just 10 minutes
* [Shortcuts ](/overview/shortcuts)- All the keyboard shortcuts supported by the platform
* [Data Modeling](/building-an-application/data/data-modelling) - Understand how to structure your app's data in TIVITY&#x20;

### Core Concepts

Get familiar with TIVITY 's fundamental concepts:

* [User interface design](/overview/user-interface) - Master the art of creating intuitive, responsive layouts
* [Workflow creation](/building-an-application/execution/workflows-and-application-logic) - Automate processes and define the logic of your application
* [Integration capabilities](/building-an-application/execution/scripting/functions/integrations) - Connect your app with external services and APIs seamlessly
* [User management and roles](/managing-users-and-collaboration/roles-and-permissions) - Set up secure, role-based access control for your applications

### Enterprise Search

TIVITY's Enterprise Search feature revolutionizes information retrieval across your organization:

* [Unified Search](#enterprise-search) - Find information across multiple applications and data sources
* [Semantic Query Expansion](#enterprise-search) - Get more relevant results with smart search algorithms
* [Customizable Personas](#enterprise-search) - Tailor search experiences for different user groups
* [Automatic Document Level Securit](#enterprise-search)y - Ensure users only see results they're authorized to access

<figure><img src="/files/KhgrYWSn2oYYqAw9QZOa" alt="Enterprise Search"><figcaption></figcaption></figure>

### Using the TIVITY Docs

TIVITY documentation is here to help you build, launch, maintain, and troubleshoot your apps. This section you're reading now is a great starting point — explore the links in the table of contents, or use the search feature to find something specific.

* [Getting Started](/overview/getting-started/creating-an-application): If you're new to TIVITY , start here to learn the basics and create your first app.
* [Application Setup](/building-an-application/application-setup)**:** Learn how to set up and configure your TIVITY applications.
* [Data](/building-an-application/data/data-modelling): Understand how to model, query, and manage data in your TIVITY apps.
* [Views](/building-an-application/views): Discover how to design user interfaces and create layouts for your apps.
* [Execution](/building-an-application/execution): Learn about functions, workflows, and scripting in TIVITY.
* [Expressions](/building-an-application/expressions): Explore how to use expressions in various contexts within TIVITY.
* [Platform](/administration/platform): Learn about platform-wide features, workspace management, and security settings.
* [REST API](broken://pages/-M8HhPI1z70UdcxHRJDQ): Understand how to integrate TIVITY with other systems using our REST API.
* [Enterprise Search](#enterprise-search): Master the advanced search capabilities to enhance information discovery across your TIVITY ecosystem.
* [Platform Overview](https://docs.tivity.one/administration/platform) - Learn about TIVITY's key features and concepts

***

Ready to start building? [Create a new app](/overview/getting-started/creating-an-application) or explore our[ template gallery](/building-an-application/views/design-ui/layout-templates) for inspiration!


# Getting Started

Learn the core concepts of the Tivity Platform by building a To Do Application

## Introduction

This tutorial is designed to teach you the core concepts you need to quickly get started with the TIVITY platform by building your first application.

In this tutorial we create a To Do application and demonstrate how to :

* create a basic structure of the application using the **Class Designer**
* retrieve specific data using the **Selection Designer**
* display data to the end-user using the **Layout Designer**
* build a customised **Object Page** which will allow us to attach files to the to do.

{% hint style="info" %}
An account on [dev.tivity.one](https://dev.tivity.one) is required for this tutorial. The To Do Application can be created in any workspace given the **Documents App** is also installed in that workspace.
{% endhint %}

## To Do Application Overview

We want to build a simple To Do application with the following features :&#x20;

* &#x20;Create a task
* &#x20;Assign a title
* &#x20;Assign an owner
* &#x20;Assign a priority&#x20;
* &#x20;Assign a due date&#x20;
* &#x20;Add notes&#x20;
* &#x20;Change the status to done

Our To Do application will have a **Start Page**,  which will display a pie chart of completed and open tasks, as well as allow us to see :

* All tasks
* Personal tasks
* Tasks due today
* Completed tasks

![To Do Application Start Page, List Layout and Details Page](/files/-M9wldv9RmVqrMSce-H1)

### Class Diagram

The following class diagram describes the structure of the model used to store our tasks along with the corresponding data types :&#x20;

![](/files/-M9wqcDjanpLFOY1wkfl)


# Creating A New Application

Steps to create a new application on the TIVITY Platform

To create a new application, switch to your workspace's **Configuration Mode** by clicking on the gear icon :gear:, then click on **Create New App**.

<div align="center"><img src="/files/-M9xo2gBOj3MEOSU_Q8L" alt="Going to Configuration Mode and Creating a new App"></div>

Next, give your application an **Application Name,** set the **Parent Application** dropdown menu to **No Parent Application,** and click **Execute**.

{% hint style="danger" %}
It is not possible to give URL as an application name.
{% endhint %}

![Naming the application](/files/-M9xvLIeeECEv4Zs1ESP)

Now on the **General Config** window, you can optionally configure your new application with a custom icon and colour theme, and filing in the author and version information.

![General Config Window](/files/-M9xxPLb1cjmFcreAbwf)

&#x20;Once done, close the window and you are ready to move to the next step!<br>


# Adding Basic Structure using Class Designer

Creating new classes and adding fields to it using the Class Designer.

The first step in building every application is to create a structure in the **Class Designer**.

{% hint style="info" %}
For in-depth documentation about data modelling, you can also check out the Data Modelling page.
{% endhint %}

{% content-ref url="/pages/-MAVBfh9UZcHTNc6Jnx-" %}
[Data Modelling](/building-an-application/data/data-modelling)
{% endcontent-ref %}

## Creating a new Class

To add a new class, while still being in the **Config Mode** of your application, click on **Classes**, then in the next window click on **New Class**.

![Creating a new class ](/files/-M9y6jVaZ__iSMc_a-BW)

We can now configure our new class in the new window.

### Common Tab

Choose a unique name for both the **Key** and **Name** fields, for example, "MyToDo". Under **Class Type**, we also need to check the **Is Independent** and **Auto-Save** checkboxes. We will refer to this class as the To Do Class in this tuitorial.

When **Auto-Save** is checked, user changes are saved automatically.

{% hint style="info" %}
**Key** is the name we use to this specific class on the TIVITY platform.

**Name** is what is displayed to the user.
{% endhint %}

![MyToDos Class Common Tab](/files/-MAX85RiBngNkQiPAGkm)

### Mapping Tab

The **Key** in the **Mapping Tab** represents the name of the table in the database.

![MyToDos Class Mapping Tab](/files/QqaXBlrkWVL2zKAReTyo)

{% hint style="warning" %}
It is important that the key with the table name does **not** already exist in the database. Otherwise you will get errors. See chapter: Write structure.
{% endhint %}

For this tutorial, no changes are required in the **Advanced Tab** or the **Permissions Tab**, so we can move on directly to the **Fields & Actions Tab**.

### **Fields & Action Tab**

As its name suggests, this tab allows us to create new fields and actions. Some fields and actions are already present by default.

![](/files/-M9yEbS55eok9ZRECcol)

## Adding New Fields to a Class

To start adding a field to our class, type your field name in the **Add new field** text box and press **Enter**.

![Adding New Fields to a Class](/files/-MA139w5sLcFSah9Inqw)

### **Common Tab**

Each field has a **Key**, an **Internal Key,** and a **Name**. They also have a **Data Type** to describe what kind of data is present in the field and a **Control Type** to define what kind of **Control** to use for data input.

### Mapping Tab

Settings on this tab are used to configure the mapping from our field to the database. Once again we need to define a **Key**.&#x20;

**Data Type** and **Length** describe the type of data and its size respectively when stored inside the database.                    &#x20;

{% hint style="info" %}
Assigning a value of **-1** to **Length** instructs the database to use the maximum length for the data type specified.
{% endhint %}

Finally, the **Is identity** checkbox indicates whether the database should auto increment the value of the field, and **Is nullable** indicates if this field can be null.

We will be adding the following fields to our class :&#x20;

* [Title](/overview/getting-started/adding-basic-structure-using-class-designer#title)&#x20;
* [Note](/overview/getting-started/adding-basic-structure-using-class-designer#notes)
* [Priority](/overview/getting-started/adding-basic-structure-using-class-designer#priority)
* [CreatedOn](/overview/getting-started/adding-basic-structure-using-class-designer#createdon)
* [DueDate](/overview/getting-started/adding-basic-structure-using-class-designer#duedate)
* [IsCompleted](/overview/getting-started/adding-basic-structure-using-class-designer#iscompleted)
* [ModifiedOn](/overview/getting-started/adding-basic-structure-using-class-designer#modifiedon)
* [CreatedBy](/overview/getting-started/adding-basic-structure-using-class-designer#createdby)
* [Owner](/overview/getting-started/adding-basic-structure-using-class-designer#owner)
* [ModifiedBy](/overview/getting-started/adding-basic-structure-using-class-designer#modifiedby)

### Title

The first field we are going to add to our class is the "Title" field which will store the title of the task.

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `Title`
* [ ] Set **Data Type** to `String`&#x20;
* [ ] Set **Control Type** to `TextBox`

In the **Mapping Tab**

* [ ] Set the **Key** to `Title`
* [ ] Set **Data Type** to `nvarchar`
* [ ] Set **Length** to `-1`

![Title Field Properties](/files/-MAXAUsXwa1G8rbP3zqx)

### Notes

The "Notes" field will store notes that we can attach to our tasks.&#x20;

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `Notes`
* [ ] Set **Data Type** to `String`&#x20;
* [ ] Set **Control Type** to `TextArea`

In the **Mapping Tab**

* [ ] Set the **Key** to `Notes`
* [ ] Set **Data Type** to `nvarchar`
* [ ] Set **Length** to `-1`

![Notes Field Properties](/files/-MAXBNnHSY0o8oFoatJO)

### Priority

In the "Priority" field, we will store the priority of the task. This time we want our field to have only 3 possible options: "Normal", "Medium" and "High". To achieve this, we will set the **Data Source Type** as **Options** and list our possible values.

We also want to use a slider to set the priority of the task, so we set the **Control Type** to **Slider**.

![Priority Slider, with predefined options](/files/-MA2KAimxHTJNbqANr8L)

We also want our task item to have a default priority "Normal" when created, so in the **Advanced Tab**, we set the **Default Mode** to "Creation" and the Default Expression to "Normal"

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `Priority`
* [ ] Set **Data Type** to `String`
* [ ] Set **Control Type** to `Slider`
* [ ] Set **Data Source Type** to `Option`
* [ ] Add the following **Options**, one option per line `Normal`, `Medium` and `High`

In the **Mapping Tab**

* [ ] Set the **Key** to `Priority`
* [ ] Set **Data Type** to `varchar`
* [ ] Set **Length** to `10`

In the **Advanced Tab**

* [ ] Set the **Default Mode** to `Creation`
* [ ] Set **Default Expression** to `Normal`

![Priority Field Properties](/files/-MAXDErf7yrMZ-k9q3_B)

### CreatedOn

The **CreatedOn** is a special field which the platform automatically detects it and is automatically set to the corresponding date and time when an object is created.

{% hint style="warning" %}
Make sure to spell "CreatedOn" correctly for this feature to work!
{% endhint %}

We also do not want anyone to modify this field, so we check the **Is Read Only** checkbox in the **Advanced Tab**.

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `CreatedOn`
* [ ] Set **Control Type** to `Calendar`
* [ ] Set **Data Type** to `DateTime`

In the **Mapping Tab**

* [ ] Set the **Key** to `CreatedOn`
* [ ] Set **Data Type** to `datetime`
* [ ] Set **Length** to `-1`

In the **Advanced Tab**

* [ ] Check the **Is Read Only** box

![CreatedOn Field Properties](/files/-MAXEx3NnGWByDVUFNK0)

### DueDate

The "DueDate" field will allow the user to input a due date for the task using the Calendar control.

<img src="/files/-MA2SUCCxR85bFsgfE24" alt="" data-size="original">&#x20;

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `DueDate`
* [ ] Set **Data Type** to `DateTime`
* [ ] Set **Control Type** to `Calendar`

In the **Mapping Tab**

* [ ] Set the **Key** to `DueDate`
* [ ] Set **Data Type** to `datetime`
* [ ] Set **Length** to `-1`

![DueDate Field Properties](/files/-MAXGQhbymBc_AL_ga2a)

### **IsCompleted**

The is completed field will indicate whether the task is completed or not.

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `IsCompleted`
* [ ] Set **Data Type** to `Boolean`
* [ ] Set **Control Type** to `CheckBox`

In the **Mapping Tab**

* [ ] Set the **Key** to `IsCompleted`
* [ ] Set **Data Type** to `bit`
* [ ] Set **Length** to `-1`

In the **Real Field**

* [ ] Set the **Default Mode** to `Creation`
* [ ] Set **Default Expression** to `0`

![IsCompleted Field Properties](/files/-MAXHdGB13Yx316bjdI0)

### ModifiedOn

**ModifiedOn** is a special field that is automatically detected by the platform and is automatically set to the date and time when an object is modified.

&#x20;We also want that field to be read-only.

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `ModifiedOn`
* [ ] Set **Data Type** to `DateTime`

In the **Mapping Tab**

* [ ] Set the **Key** to `ModifiedOn`
* [ ] Set **Data Type** to `datetime`
* [ ] Set **Length** to "-1"

In the **Advanced Tab**

* [ ] Check the **Is Read Only** box

![ModifiedOn](/files/-MAXIkVbQ7Sj8z-WQuZ9)

### CreatedBy

CreatedBy is a special field that is automatically detected by the platform and is automatically set to the unique identifier of the current user when an object is created.

This field is set to read-only.

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `CreatedBy`
* [ ] Set **Data Type** to `Guid`

In the **Option Source** :

* [ ] Set **Data Source** Type to `Controller`
* [ ] Set **Data Source Controller** to `OfficeUserIdSourceController`

In the **Mapping Tab**

* [ ] Set the **Key** to `CreatedBy`
* [ ] Set **Data Type** to `uniqueidentifier`
* [ ] Set **Length** to `-1`

In the **Advanced Tab**

* [ ] Check the **Is Read Only** box

![CreatedBy Field Properties](/files/-MAXV9ZS9qeka1anN_Z2)

### Owner

For this tab we want the user to be able to assign ownership of the task by picking any user in the workspace. The TIVITY platform has a predefined implementation for this kind of operation called a **Controller.**

For this field, we use the "Combo Box" **Control Type,** and to populate it with users of the workspace, we set the **Data Source Type** as Controller and the **Data Source Controller** as **OfficeUserIdSourceController**

When created, we also want the default owner to be the current user if no one user been specified.  To achieve we, we go head to the Advanced Tab and set the **Default Mode** to **Creation** and the **Default Expression** to `{CurrentUser.Id}`

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `CreatedBy`
* [ ] Set **Data Type** to `Guid`

In the **Mapping Tab**

* [ ] Set the **Key** to `CreateBy`
* [ ] Set **Data Type** to `uniqueidentifier`
* [ ] Set **Length** to `-1`

In the **Advanced Tab**

* [ ] Set the **Default Mode** to **Creation**
* [ ] Set **Default Expression** to `{CurrentUser.Id}`

![Owner Field Properties](/files/-MAXWROwAwsQHt55rmhy)

### ModifiedBy

ModifiedBy is a special field that is automatically detected by the platform and is automatically set to the unique identifier of the current user when an object is modified.

This field is set to read-only.

In the **Common Tab** :

* [ ] Set **Key**, **Internal Key,** and **Name** to `ModifiedBy`
* [ ] Set **Data Type** to `Guid`

In the **Mapping Tab**

* [ ] Set the **Key** to `ModifiedBy`
* [ ] Set **Data Type** to `uniqueidentifier`
* [ ] Set **Length** to `-1`

In the **Advanced Tab**

* [ ] Check the **Is Read Only** box

![ModifiedBy Field Properties](/files/-MA2bNZyFRGFguOiu6gB)

### Save class

Now having created all the fields, we can save our class by clicking on the **Save** button.&#x20;

![Saving the class](/files/-MA6Hdl1AszU7R701fhm)

{% hint style="info" %}
TIVITY will validate all fields and give out warnings if any errors are present in the class.
{% endhint %}

### Write structure

Now a physical structure of the newly created and configured class must be created. For example, in the case of an SQL database, a table is created in the database as a data source in which the instances of this class can later be stored.

The action to create the structure is located in the upper right corner of the designer. Open the menu there and select the action *Write Structure*.

![Class designer](/files/-MRf-WvCHs9hjcSiq2cs)

The action *Read Structure* executes the reverse way. The structure is transferred from the data source and the classes are updated or created in the Designer. For example, in SQL database as data source changes of a table (new column added) is transferred to the class model.

{% hint style="info" %}
If a newly created class already exists or fields are duplicated, a validation error occurs.
{% endhint %}

![Structure validation error](/files/-MRa1qXpX4Kwzpn7SCNS)


# Creating a link to the TIVITY File Class

Creating a link to the TIVITY File Class to add the ability to upload files to our tasks.

To attach files to our tasks, we make use of the TIVITY File class, which originates from the Documents App. Each task item can have multiple files attached, but each file is related to only one task item, which we describe as **One-To-Many relationship**.

To be able to use the TIVITY File class in our app we need to add the TIVITY File class to our application. For this, go to **General > Classes Tab** and select the class **TIVITY File**.

![Adding Tivity File Class to our application](/files/-MA6LUJK5_t5OZ0wFk73)

Now we can link the TIVITY File class to the class we previously created. We go back to **Classes**, expand our class and expand **Links** and select **TIVITY File** and click the plus icon:heavy\_plus\_sign:.

![Creating a link to the TIVITY File](/files/-MA6O4vX2rMf57Ralc9G)

On the next window in the **Common Tab**, we need to set the Field for the Tivity File to **Instance (Ref) and** the link between the two classes is represented by **YourClass.Id ↔ TIVITY File.Instance (Ref)**. Since we want the link to be bidirectional, we check **Is Source** for both classes.

In the **Advanced Tab**, we set the **Controller** as **Default** and the **Type** as **OneToMany**

![TiIVITY File link Properties](/files/-MAX_7zj-eBotD51bq4O)

With this part done, we can move on to the next chapter!


# Setting Rights

Setting up rights and permissions for the Editor and Viewer groups of our application.

In this section, we will go through setting the proper rights for our To Do & TIVITY File classes.

For in-depth documentation about Rights, you can check out the following documentation page :

{% content-ref url="/pages/-M8Hj\_UaVWiMHpDIqtPC" %}
[Roles & Permissions (Team app)](/managing-users-and-collaboration/roles-and-permissions)
{% endcontent-ref %}

Each application has two predefined groups: **Editor** and **Viewer**. Like their name suggest, users in the **Editor** have both **Read & Write** rights, and users in the Viewer have only **Read** rights.

First to click on **Right** to access all groups for the application.&#x20;

![Accessing Rights](/files/-MA7Eax1XD4KSmYvyu4h)

### Setting up Editor Group

Click on **Editor** and head to the **Permissions Tab** and select **"Read + Write"** for both your To Do class and the TIVITY File class.

After setting the permissions, you must set yourself as a member of the **Editor** group. Head on to the Members Tab, click the plus icon :heavy\_plus\_sign:  and find your user.&#x20;

You will also notice going to the **Member Of Tab** that **Editor** is a member of the **Viewer** group.

![Editor Group Properties](/files/-MAXdPwv2TUX13rieLVL)

### Setting up Viewer Group

In the **Rights** window, click **Viewer**, head to the **Permissions Tab** and select **Read** for both your To Do class and the TIVITY File class.

As mentioned before you will notice that **Editor** is a member of the **Viewer** group in the **Members Tab**.

![Viewer Group Properties](/files/-MAXgrjYVddlSwPgDzzC)


# Creating Queries

Creating queries to retrieve to dos from our database  using the Query Desinger

In this section, we will create different queries to retrieve specific tasks from the database, namely :&#x20;

* [All Tasks](/overview/getting-started/creating-queries#all-tasks-query)
* [My Tasks](/overview/getting-started/creating-queries#my-tasks-query)
* [Tasks Due Today](/overview/getting-started/creating-queries#due-today-query)
* [Completed Tasks](/overview/getting-started/creating-queries#completed-tasks)

For in-depth documentation about Queries, you can check out the corresponding documentation page :

{% content-ref url="/pages/-M8HjWmJKLSXJ8bKprqX" %}
[Query Designer](/building-an-application/data/query-data)
{% endcontent-ref %}

### Creating a new **Query**

To create a new query, click on **Query** then click on **New Query**

![Creating a new query](/files/-MA7PPGDeka10-ew1gla)

### **All Tasks Query**

For this query, we simply want to retrieve all todos. We also give access to the **Viewer** group to run this query and access to the **Editor** group to modify this query.

In the **Common Tab** :&#x20;

* [ ] Set the **Source** to the To Do class
* [ ] Set **Run Credentials** to **Viewer**
* [ ] Set **Edit Credentials** to **Editor**
* [ ] Set the **Name** to `All Tasks`

In the **Fields Tab** we can select which fields we want the query to return. For this tutorial, we will retrieve all the fields. Check the **All** checkbox on the right and click on **Add Fields.** This will populate our query with all the available fields in our To Do class.

We also want to sort the results of this query by having the latest task created first, so we sort the **CreatedOn** field in descending order by clicking on the Order By Descending Button<img src="/files/-MA7VYJ3JtZNzAAkWr7Y" alt="" data-size="line">.

In the **Fields Tab** :&#x20;

* [ ] Add all fields
* [ ] Order the **CreatedOn** field by Descending Order

![All Tasks Query Properties](/files/-MAXjnTcpvnWaoIqyq_f)

When done, click the **Save** button to save the query.

### My Tasks Query

This query will only return tasks of which we are the owner and make use of **Conditions.**

In the **Common Tab** :&#x20;

* [ ] Set the **Source** to the To Do class
* [ ] Set **Run Credentials** to **Viewer**
* [ ] Set **Edit Credentials** to **Editor**
* [ ] Set the **Name** to `My Tasks`

In the **Fields Tab** :&#x20;

* [ ] Add all fields
* [ ] Order the **CreatedOn** field by Descending Order

![My Tasks Query Properties](/files/-MAXkqTJmCucsamVjsMp)

Now we want to compare our user ID to the Owner field of the To Do class to determine if it should be retrieved or not. To add a new condition to our query, switch to the **Conditions Tab,** and click **Add Condition.**

&#x20;On the right-hand side, choose the Owner field of your class. Click on the gear icon :gear:  to open the **Condition Properties** window. Set **Compare To** to **Expression** and **Value** to `{CurrentUser.ID}`

![My Task Query Condition Properties](/files/-MAXlYF4LMy7MYRymcnH)

### Due Today Query

We want this query to return all to incomplete task due today. This means that we will once again make use of conditions to check both the IsCompleted and the DueDate fields of our To Do class.

In the **Common Tab** :&#x20;

* [ ] Set the **Source** to the To Do class
* [ ] Set **Run Credentials** to **Viewer**
* [ ] Set **Edit Credentials** to **Editor**
* [ ] Set the **Name** to `Due Today`

In the **Fields Tab** :&#x20;

* [ ] Add all fields
* [ ] Order the **CreatedOn** field by Descending Order

![Due Today Query Properties](/files/-MABeL71hTMv2zR8qdAX)

In the **Conditions Tab**, we click on **Add Condition.** Our first condition we want to check is  `MyToDos.IsCompleted = 0`.

We now want to check if the due date is less or equal to today's date, which is denoted by `MyToDos.DueDate <= {DateTime.Now.Date}`.&#x20;

To add a second condition, click on **Add Condition** and make sure to choose **AND** as the first connector  Set the Field column to the  `MyToDos.DueDate` field of your class set the middle **Operator** to  **`<=`**.

Click on the gear icon :gear:to open the **Condition Properties** window. Set **Compare To** to **Expression** and **Value** to `{DateTime.Now.Date}`

![Due Today Condition Properties](/files/-MAXmPRNxeUFwIcjS5Yk)

### Completed Tasks

For this last query we simply want to return completed queries.

In the **Common Tab** :&#x20;

* [ ] Set the **Source** to the to do class
* [ ] Set **Run Credentials** to **Viewer**
* [ ] Set **Edit Credentials** to **Editor**
* [ ] Set the **Name** to `Completed Tasks`

In the **Fields Tab** :&#x20;

* [ ] Add all fields
* [ ] Order the **CreatedOn** field by Descending Order

![Completed Tasks Quey Properties](/files/-MABdqcG6BKtsD0ac0WI)

In the **Conditions Tab**, we click on **Add Condition** set the condition to `MyToDos.IsCompleted = 1`

![Completed Tasks Conditions Properties](/files/-MAXnBF8nz_zYRZcS3DJ)


# Building The Layout

Using the Query Designer to create the user interface of our application.

Now that we have the data set up, it's time to create the user interface described in [Getting Started](/overview/getting-started) by making use of the **Layout Designer.**

In this two-part guide we will go through :

* creating an **App Page** which will be the default page the user will see when opening the To Do Application.
* creating an **Object Page** which will allow users to create and modify a task.

For in-depth documentation about building User-Interfaces (UI), you can check out the corresponding documentation page:&#x20;

{% content-ref url="/pages/-M8Hk3JzXVnt7-dFBYjg" %}
[Layout Designer](/building-an-application/views/design-ui)
{% endcontent-ref %}

## Layout Designer

The Layout Designer allows us to create user interfaces for different functionalities of an application. It has different kinds of pages, but this tutorial will only be looking at the **App Page** and **Object Page**.&#x20;

To open the Layout Designer, click on **Views > Layouts** while being in configuration mode.

![Opening Layouts](/files/-MAqx-h7Iack8SK9OoJ2)

Now let get started creating some pages with the Layout Designer


# Creating an App Page

Creating a Start Page in the Layout Designer using the App Page

As mentioned before, the App page will the main page the user will see when entering the application. To create a new App Page, click in the:heavy\_plus\_sign:**New Page** in the Layouts windows and click on **App Page.**

![Creating an App Page](/files/-MAqz87SpRG53r-QIkba)

This brings us directly to our new page's **Page Configuration** window. On the left will be a list of different **Templates** and **Controls.**

**Templates** are prebuilt layouts that are commonly used and which you can take advantage of to speed up the construction of your application's user interface.

You can also make use of the various **Controls** available to customise how the user interacts with your application, which we will be having a closer look at in the upcoming section of this guide.

Firstly, we want to name this new page `Start Page`. Click on **Page Settings**:gear:on top, and in the Page Properties enter `Start Page` in the **Name** field.&#x20;

We are now ready to move to the next sections and start building the user interface.

## Layout Container

Usually, when designing a page, we want to split it into a  Header, Body and Footer sections. The **Layout Container** achieves just that and will give us a base to work with when creating our user interface.

To add a control to our application, simply find it in the list then click and drag it to the designer are. You can filter through controls by typing its name in the **Filter** box.&#x20;

![Adding a Layout Container Control](/files/-MArDxGCC09B2dWbpNl5)

The **Layout Container** will be divided into 3 distinct sections, in which we can nest  **Controls** to build the user interface.&#x20;

## Header Control

Now it's time to add a header our application to nicely display its name. We will go through the basics of working with Controls by manipulating the Header Component. Just like we did in Layout Container, filter through the components to find the **Header Control,** and drag and drop it to the topmost slot of the **Layout Container.**

![Adding the Header Control](/files/-MArEdGzvTmYKIMxNvSa)

To interact with controls in the Layout Designer, click on the control which will reveal the following buttons :&#x20;

![Interacting with Controls](/files/-MArGzgAWukykQprqlBl)

1. Move Control
2. Control Properties
3. Focus on current element
4. Delete Control

To change the text in our header, click on the **Control Properties Button** and enter the application name in the **Text** field, for example, "My ToDos". Now our header looks like this : &#x20;

![Customised header](/files/-MArJ7ZkNTssoOo8a1nG)

## Scroll Panel and Actions Control

The body will be where the bulk of the interaction between the user and the application will happen and in this section, we will be working we will be building the actual content of the start page.

### **Scroll Panel**

As this part of the application will contain a lot of content, which depending on screen size might not fit in a single page, we start by adding a Scroll Panel which we will later nest other Controls and as its name suggest will allow the user to scroll through them. &#x20;

&#x20;Filter the list and find Scroll Panel, then click and drag it into the middle/body section of the Layout Container

Next, we will be adding components to visualise the following.

* Due Today
* My Tasks
* All Tasks
* Completed Tasks

Note that those match the queries we created in the[ Creating Queries](/overview/getting-started/creating-queries) section of the tutorial and we will be essentially visualising the result of those queries using the **Action Control** and also the **Chart Control.**

### Action Control

To view the result of the **Due Today** query we created earlier, we need to add an **Action Control** to our Scroll Panel.

Filter the controls and find the **Action Control**, click and drag it to our Scroll Panel.

In its properties, we change the **Text** to`Due Today`and we can also change the **Icon** to **Calendar**. This is optional but improves the look of our application.

Down under **Action**, we choose **Show result list,** and in **Type of data Source,** we select our **Due Today** query.

![Due Today Action Properties.](/files/-MAz0SR0oez-GfaplP08)

Repeat the steps above for the **My Tasks,** setting the **Text**, **Icon** and **Selection Data** accordingly.

Before adding the rest of the Actions, we add a **Horizontal Line Control** to create group our selections into two sections and make the design cleaner. Search for `Horizontal Line`, click and drag it underneath the My Todos Action.

At this point, this is what  Scroll Panel should look like:

![Scroll Panel Progress](/files/-MAz6dGsscNiRqFRB434)

Now we can add our **All Tasks** and **Completed Tasks** Actions following the same steps as above.

{% hint style="info" %}
To preview the look the application, you can click on the **Preview Button** at the top of the designer.
{% endhint %}

If all was done correctly, this is what the preview should look like :

![Preview of current progress](/files/-MAz7fL18skWMyowU85V)

## Charts using the List Control

In this last part of creating our App page, we will add a pie chart to display a comparison between the completed and outstanding tasks, and for this, we will make use of the **List Control.**

To start, we add a **List Context Control**, and then proceed to add a **List Control** inside. For this tutorial, we will not be diving too deep into setting up the **List Context Control**, but it is good practice to include one.

![List Context & List Controls added to the Designer](/files/-MBA3hGJXamzt0kR4DDz)

Let's start configuring out **List Control.** Like **Action Control** we want to retrieve our data from the **Completed Tasks** query. In the **List Control Properties** window, under Data Source :

* [ ] Set **Type Of Data Source** to **Selection**
* [ ] Set **Selection Data** to our **`All Tasks`**  query
* [ ] Set the **Initial View Mode** to **Charting**

![All Tasks Action Properties](/files/-MBA5jVFMJ1bUqO2zhh0)

After setting up our Data Source, we can now start customising our chart by clicking on Chart Options under the List Control in the designer.

![Chart Options located under the List Control](/files/-MAzLxVSsIuhIj--KZ07)

For the **X-AXIS** we want the`isCompleted`field. We set the **Title** to `Completed`. And be sure to set the **Display Type** to **Pie**.

In the Chart Options :

* [ ] Set the **X-Axis** to the **`isCompleted`** field
* [ ] Set the **Title** to `Completed`
* [ ] Set the **Display Type** to **Pie**

![Chart Options](/files/-MBA5dc0usLB4Zy9pYS8)

Click on **Apply** and our Pie chart is all set up!

## Final App page

After adding some data, this is what our App Page should look like

![Final Preview of the App Page](/files/-MBA9Y7p1BsJ8UCa9c3y)

We can now move on to learn how to create an Object Page


# Creating an Object Page

Creating an object page to that we will use for a detailed view and edit tasks.

For this part of the tutorial, we will be using Object Pages to build a detailed page to view and edit specific tasks.  To create a new Object Page, click in the:heavy\_plus\_sign:**New Page** in the Layouts windows and click on **Object Page.**

![Creating a new Object Page](/files/-MBAB_ybkMoNZqrsdPMC)

Next,  we want to name this new page. Click on **Page Settings**:gear:on top, and in the Page Properties enter `Details` in the **Name** field.

### Header

Just like we did for the[ App Page](/overview/getting-started/building-the-layout-1-2/the-app-page), we add a Layout Container and a Header to our new Object page, by finding them in the list and dragging them to the designer area.&#x20;

We want our Header to be dynamic, and the title to reflect the name of the current task the user is looking at. Go the header's **Properties window** set the **Text** field to "Details - {{instance.name}}"

![Heeader Properties for a dynamic title](/files/-MBADQaiwvnZmFQFC7Bb)

The `{{instance.name}}` token will be replaced by the name of the task that we click on.

### Toolbar

Next, we want to add a toolbar which will allow users to refresh the details of the current task item. Find the Toolbar Control and drag it underneath the header. Inside the Toolbar, we then add an Action Control.

Time to configure the Action. In its Properties windows :

* [ ] Check the Align Right box
* [ ] Set the icon as `refresh`
* [ ] Set the Action as **Refresh Page**

{% hint style="warning" %}
Note that for this Action Control, we did not provide anything to the Text field. This is because we only want the icon to be displayed.
{% endhint %}

![Refresh Action Control Properties](/files/-MBAE3AIxuLbdfxzV3tn)

## Designing the Page

We can now proceed to add the main controls of the page which will allow the user to view and modify a task. &#x20;

Firstly, we add a **Scroll Panel** to the middle part of our Layout Container. Inside it proceed to insert a **Collapse Panel.**&#x20;

**Collapse Panels** can expand or collapse to reveal or hide other controls. This is a great way to group multiple controls while keeping the interface uncluttered. In the properties window of this panel, set the **Text** to `General`&#x20;

In this panel, we can now add the fields of our task that we want to display. In the leftmost list in the Object page will be a list of fields from out To Do class. We select the **Title**, **Is Completed**, and **Notes** fields and place them under each other in the General Collapse Panel.

![Collapse Panel with Fields added](/files/-MBAFgNHOvZ2r2e4IV8H)

Next, we want to have 3 fields displayed next to each other horizontally. To achieve this, we make use of the **Horizontal Panel**.  We and now add our next three fields **Owner**, **Due Date** and **Priority** to it. The **Horizontal Panel Control** makes use of a 12-column responsive grid system.

This system divides a row into 12 columns. Controls can be allocated multiple of those 12 columns depending on the width you want it to occupy. The Horizontal Panel is also able to display content differently depending on the screen size by allocating a different amount of columns to the control in the Small and Normal Fields. For example, on a Normal screen, we might have a particular control displayed in 3 columns, but on a small screen, we only want 6 columns.&#x20;

For our 3 fields, we want columns to always be evenly distributed, we go into the **Properties windows** and set the width for each element to **4** (12 columns divided by 3 fields).

![Horizontal Panel Properties](/files/-MBAGGt_hVNUEjCQMn8d)

{% hint style="info" %}
Alternatively, the **Flex Panel** can be used. While the **Horizontal Panel** has fixed divisions of 12 columns, the **Flex Panel** allows you to define percentage values and minimum and maximum widths, which allows a much more dynamic layout but is also more complex.
{% endhint %}

## TIVITY File Integration

After having added all the fields for our class, we want to be able to view and attach TIVITY Files to our task.&#x20;

To start, let's add a second **Collapse Panel** to keep the page organised and in its **Properties**, we are going to name it `TIVITY File`.

![TIVITY File location in the list](/files/-MBAHU_6vIrJjsEZyaUQ)

Now in the leftmost list, under **Links - Main > Links**, find the TIVITY File component, drag it and drop into our Collapse Panel.

![TIVITY File Integrated into a Collapse Panel](/files/-MBAHxGTIiqlMo9ctH3V)

The Controls inside the TIVITY File integration are already preconfigured, and without any further changes, we can now proceed to finish up this page.

## Footer Actions

Now to complete our Detail Page we want to add **Save** and **Delete Actions** at the bottom of our page.

Let's start by adding a **Toolbar Control** to the bottom/footer section of our **Layout Container**

### Save Button

The save functionality is not always available, for instance, if Read Only. For this reason, we do not want to show the save button. To achieve this, we make use of the **Conditional Panel**. &#x20;

The Conditional Panel's content is visible only of some particular requirements are met. To add a Conditional Panel, search for it in the list of Controls and drag it to Toolbar. Then in its Properties windows :

* [ ] Set the **Condition** to `{{instance.options.readOnly}}`
* [ ] Set **Compare Operation** to **=**
* [ ] Set **Compare to Value** to **False**

The expression "{{instance.options.readOnly}} = False"checks if the object is Read Only. If that’s the case, it won’t display the Save Button.

![Conditional Panel Control Properties](/files/-MBAISS0T6IYLBBipynf)

{% hint style="warning" %}
In case a **Conditional Panel** is not added, the save button simply will not work on Read Only objects
{% endhint %}

Now that our **Conditional Panel** is all set up, we can add an **Action Control** to it to act as save button. In its properties :

* [ ] Set the **Text** to "Save"
* [ ] Check the **Align Right** box
* [ ] Under **Icon** the "save" icon  &#x20;
* [ ] Set the **Action** to **Save Instance**&#x20;

![Save Action Control Properties](/files/-MBAMqKmWSCHgSfyFVbS)

### Delete Button

For the Delete Button, we configure the **Conditional Panel** to cater for Read Only objects the same way as for the Save Button, then add an **Action Control** to it.

The Action Control Properties this time is set as such:&#x20;

* [ ] Set the **Text** to `Delete`
* [ ] Check the **Align Right** box
* [ ] Under **Icon** the `trash`icon  &#x20;
* [ ] Set the **Action** to **Delete**

![Delete Action Control Properties](/files/-MBAMjbxw6SeinQHTr-d)

## **Final Page**

Finally, our page looks like this :

![View of the final Object Page](/files/-MBAOBVGgCc54nRkDP-L)

We can now proceed to create our last page for this tutorial.


# Creating a List Item Layout

Creating a List Item Layout to customise the results list of the queries.

In this section, we will go through customising the results of our queries using the List Item Layout to make it easy to keep track of tasks.

To create a new List Item Layout, click on the **New Page** :heavy\_plus\_sign:in the Layouts windows and click on List Item Layou&#x74;**.**

![Creating a new List Item Layout](/files/-MBARA_REAyLrBWtEhYy)

After creating the page, jump into its **Page Settings** and set the **Name** to "Todo Item Layout", and under **Layout For Class**, set the dropdown to your To Do class.

### Creating the layout.

Firstly, we place a **Horizontal Panel**, then add the fields **Title**, **Owner** and **IsCompleted** to it. We also want to set the proportions of the fields in the **Horizontal Panel** as such :

| Field       | Proportion |
| ----------- | ---------- |
| Title       | 8/12       |
| Owner       | 3/12       |
| IsCompleted | 1/12       |

![Horizontal Panel Control Properties](/files/-MBASbKetj4vWXKhsnIa)

Finally, we want to show the label of the **Owner** field to quickly identify the column's meaning when looking at the list. We go into the **Owner Field Properties** and check the **Show Label Checkbox**.

Finally in **Preview Mode**, our work should look like this :&#x20;

![List Item Layout Preview](/files/-MBATC12FX07Lg-74xYK)

## Wrapping Up

And this brings us to the end of the tutorial. We learned to build a To Do Application from scratch and learnt some core concepts such as the Class Designer, Rights, Query Designer and Layout Designer.\
You can follow the links below for in-depth documentation of those concepts and learn more about the TIVITY Platform!

{% content-ref url="/pages/-MAVBfh9UZcHTNc6Jnx-" %}
[Data Modelling](/building-an-application/data/data-modelling)
{% endcontent-ref %}

{% content-ref url="/pages/-M8Hj\_UaVWiMHpDIqtPC" %}
[Roles & Permissions (Team app)](/managing-users-and-collaboration/roles-and-permissions)
{% endcontent-ref %}

{% content-ref url="/pages/-M8HjWmJKLSXJ8bKprqX" %}
[Query Designer](/building-an-application/data/query-data)
{% endcontent-ref %}


# User-Interface

## Default view

The default view of the platform is always displayed immediately after logging in. It is also the view of the end users (e.g. customers) of the applications, who then only have this view available.

![Default View](/files/-MW0DISxykYA9KkLCk7q)

1. User settings
2. Notifications
3. Chat
4. Search
5. Activity log
6. Apps
7. Workspaces
8. User area
9. Button to switch to edit mode (see [Edit Mode](#edit-mode))
10. Install published apps in this workspace (see [Publishing the Application](/building-an-application/application-setup/publishing-the-application))

### User settings

The user's account is managed in the user settings, for example the password, the photo, working time, the look of the interface and the background of the platform, the mode of delivery of notifications, etc.

{% hint style="info" %}
In the Profile Settings you can also set your language, date and time format, time zone and number format.&#x20;
{% endhint %}

<figure><img src="/files/uCypph0OMPUrqN0EimEK" alt=""><figcaption><p>Profile Settings Sample</p></figcaption></figure>

\
Not only the settings of your profile can be made in the User settings, but also other useful actions:

* Remove auth token: the authentication token is removed
* Restart application: restart the platform
* Clear repository cache: the serversite repository cache is cleared
* Account: the profile settings
* Notifications: opens the notification list
* Full screen modus
* Logout: log out from the platform&#x20;

### Notifications

This opens the notifications list, in which the latest notifications for the logged on user are shown, for example

* a task has been assigned to the user.
* another person has shared information with the user.

As per the user settings selected, notifications are also sent via email and as browser pop-up, if configured accordingly. Notifications are also displayed with a small red mark on the notification symbol.

### Chat

Via Chat, the notified user can communicate with other platform users of the same organisation in real time. Chats can be organised in self-defined channels (=topics) or into files. The user, who has created a channel or a file chat, can decide which other users or user groups should be allowed to participate in that.

### Search

The database of the platform can be searched by entering a text. With a click on the input line, the search area can be determined as:

* either **All elements**: all data of files/terms/contacts etc. is searched, but not via full text search in the documents.
* or **Documents**: a full text search is executed in the documents.

![Search panel](/files/-MTHEEO6Ng9B5UtnProm)

There is no differentiation between upper case and lower case in both instances.

In both cases, several search terms can be specified, separated by spaces. The platform only provides those results in which all search terms appear.

It is also possible to explicitly exclude terms during search. This is done with a prefixed minus (-).

Example: The search text `Alpha Bravo -Charlie` searches for joint appearance of the words Alpha and Bravo, in which Charlie does not appear.

### Activity log

If the *Activity logs* has been enabled in the Admin Center, you can see here who has made which changes and when.

### Apps

All applications of the selected workspace are listed in the app area. Active apps that are also visible are highlighted in color.

#### App Pages

When you click on one of the apps to open it, the app landing/start page is shown. Opening another page from the landing page or another app while the already opened page(s) is/are pinned will order opened pages from left to right.

<figure><img src="/files/rpu6fGCNr0gBHrnm6BvU" alt=""><figcaption><p>Page Order</p></figcaption></figure>

You can reorder the pages by drag and drop of the page tabs.

<figure><img src="/files/OD5lxqy1VPj1ydQNYKft" alt=""><figcaption><p>Page Reordering by Drag and Drop</p></figcaption></figure>

### Workspaces

The vertical panel on the far left shows the workspaces that the logged-in user has access to. The active workspace is highlighted in color.

{% hint style="warning" %}
Workspace name cannot contain an URL.
{% endhint %}

### User area

In the user area all users assigned to the active workspace are listed. Users can also be invited here for their own workspaces.

### Edit mode

In this mode all applications are listed vertically.&#x20;

<figure><img src="/files/VkZzI1XCLdI1IBi4Ge7N" alt=""><figcaption><p>Edit Mode with Configurable Apps</p></figcaption></figure>

Right to the configurable apps (green frame) there are actions represented by toothed wheels ![](/files/MPqc4Ku9ZeRmVQKNnKU1). In dependance of for which app you want to do the configuration, you can get into the [Config Mode](/overview/user-interface#config-view) of the particular app by clicking on the toothed wheel next to it.&#x20;

#### Export Multiple Apps

On the top right corner of the Edit Mode there is an option ![](/files/lYyiHHsS36bMDzrX0qd8) to export multiple apps. Clicking on it opens new page where you can select apps which you want to export.

<figure><img src="/files/Kn7pGVLUjicp4PDhupR6" alt=""><figcaption><p>Apps Selection for Export</p></figcaption></figure>

The versions of multiple applications in the same workspace can be set together and multiple applications can be downloaded in one archive.

When the version of multiple applications is to be set, then the new version is validated for each chosen application (with the existing validation).

When multiple applications are to be downloaded, then the chosen applications are downloaded as an archive.

## Config view

In the config view, apps are created and configured. This is done in different areas and with different designers.

{% hint style="info" %}
To switch to Config mode, press the button with the gear icon in the Default View (#9 in [screen above](/overview/user-interface#default-view)).
{% endhint %}

![edit view](/files/-MTl26tYKD0GXXiDO42_)

1. Displayed when you are in **Config Mode**
2. **Name** of the application you are currently in
3. **App** section: General settings of the app are made here
4. **Data** section: Configuration of the sources, the structures and the access of data
5. **Views** section: Creating the app layouts and templates
6. **Execution** section: Executable elements such as functions, workflows or triggers can be created and edited here
7. Button to **leave the Config Mode**

### App

App settings and configuration are made in the **App** section.In addition to managing the life cycle of the application, you can create documentation for the app. More details in [Application Setup](/building-an-application/application-setup).

These options are available in the section:

* **General**: General settings of the application
* **Documentation**: Editor for creating documentation for this app. This is published together with the app
* **Licence**: Managing the licensing for this app (see [License management](/building-an-application/application-setup/license-management))
* **Advanced configuration**: Special configurations can be entered here directly as text in an editor (see [Advanced Settings](/building-an-application/application-setup/advanced-settings))

### Data

In the section **Data** everything that has to do with data can be configured and edited. The data sources can be set up, data structures created and queries configured. The access to the data can be controlled here in detail. More details in [Data](/building-an-application/data).

These options are available in the section:

* **Data source**: View the available data sources
* **Sources**: Adding and renaming adapter (sources)
* **Classes**: Designer for modelling the data structure (see [Data Modelling](/building-an-application/data/data-modelling))
* **Queries**: Designer to manage queries and define the data selection (see [Query Data](/building-an-application/data/query-data))
* **Rights**: Allows to granularity specify the access rights of single users on specific data fields (see [Roles & Permissions](/managing-users-and-collaboration/roles-and-permissions))
* **ACL**: Access Control Lists, regulates the access to objects of a class (see [Access Control Lists](/managing-users-and-collaboration/access-control-lists-acl))

### Views

Interface design on the platform is done in section **Views**.

These options are available in the section:

* **Layouts**: Designer to create graphical user interfaces (or layouts) for your application (see [Design UI](/building-an-application/views/design-ui))
* **Templates**: Designer to create standardized documents like letters or reports and fill them dynamically with information (see [Document Templates](/building-an-application/views/document-templates))

### Execution

The **Execution** section contains all elements that can be executed at runtime. This includes functions, workflows and triggers. The settings can be made comfortably in the respective designers. It should also be mentioned that there is a certain hierarchical dependence. Workflows can be executed in triggers. And functions can be executed in workflows.

These options are available in the section:

* **Functions**: Designer to add custom functionality to your app (see [Scripting](/building-an-application/execution/scripting))
* **Workflows**: Used on the platform to define more complex and dynamic actions in your application (see [Workflows](/building-an-application/execution/workflows-and-application-logic))
* **Trigger**: Designer for define temporal or level (hooks) triggering of a workflow


# Shortcuts

This section lists all the keyboard shortcuts supported by the platform.

Are you a power user who needs everything accessible within a few key strokes? \
This section provides a complete list of the various keyboard shortcuts to help you navigate the platform without leaving your keyboard.

### Global Shortcuts

| Shortcut              | Action                                 |
| --------------------- | -------------------------------------- |
| Ctrl + Shift + Left   | Move focus to the next left page       |
| Ctrl + Shift + Right  | Move focus to the next right page      |
| Ctrl + Shift + H      | Open the global activity stream        |
| Ctrl + Shift + F      | Focus on the global search input field |
| Ctrl + Shift + C      | Open the global create button          |
| Ctrl + Shift + J      | Open the **Jump-To** overlay           |
| Ctrl + Shift + \[1-9] | Expand the team in the left side-bar   |

### Active Page

| Shortcut  | Action                                                                   |
| --------- | ------------------------------------------------------------------------ |
| Shift + P | Pin/Unpin the current page                                               |
| Shift + W | Close the current page                                                   |
| Shift + F | Open the search box on the active page (if available)                    |
| Shift + R | Refresh the current page (if available)                                  |
| Shift + H | Open the activity stream for the currently display object (if available) |

### Object Pages

| Shortcut  | Action                                           |
| --------- | ------------------------------------------------ |
| Shift + L | Open/Close the object links panel (if available) |
| K         | Jump to previous item                            |
| J         | Jump to next item                                |

### Pages Containing Lists

| Shortcut  | Action                                  |
| --------- | --------------------------------------- |
| Shift + 1 | Switch to List mode                     |
| Shift + 2 | Switch to Chart mode                    |
| Shift + 3 | Switch to Timeline mode                 |
| Shift + 4 | Switch to Kanban mode                   |
| Shift + 5 | Switch to Grid mode                     |
| Shift + 6 | Switch to Gantt mode                    |
| S         | Change the list sorting                 |
| Shift + N | Create a new object                     |
| Shift + E | Download the current list in CSV-format |

#### List-Display Mode Shortcuts

| Shortcut | Action                                              |
| -------- | --------------------------------------------------- |
| B        | Enable/Disable the bulk editing mode (if available) |

#### Chart-Display-Mode Shortcuts

| Shortcut | Action                                 |
| -------- | -------------------------------------- |
| C        | Open/Close the **Chart configuration** |

#### Kanban-Display-Mode Shortcuts

| Shortcut | Action                                             |
| -------- | -------------------------------------------------- |
| C        | Open/Close the **Kanban configuration**            |
| 0-9      | If Kanban is grouped, open the corresponding group |
| N        | Go to next day in historical mode                  |
| P        | Go to previous day in historical mode              |
| H        | Switch between normal and historical mode          |

#### Gantt-Display-Mode Shortcuts

| Shortcut | Action                                 |
| -------- | -------------------------------------- |
| C        | Open/Close the **Gantt configuration** |
| D        | Display Gantt in day mode              |
| W        | Display Gantt in week mode             |
| M        | Display Gantt in month mode            |
| Y        | Display Gantt in year mode             |

### Activity Page

| Shortcut | Action         |
| -------- | -------------- |
| D        | Group by day   |
| W        | Group by week  |
| M        | Group by month |

### Search Result Page

| Shortcut | Action                                        |
| -------- | --------------------------------------------- |
| C        | Open/Close the **Filter configuration** panel |

### Dropdown Box

| Shortcut     | Action                                              |
| ------------ | --------------------------------------------------- |
| Alt + \[1-9] | Select the nth visible item in an open dropdown box |


# Architecture

## 1. Components View

![](/files/-MA24BCpaj7AO_aAbCHu)

### 1.1 UI / UX

The TIVITY platform is designed as a mobile-first single page application. The requirements of a SPA were implemented on client-side using the libraries require.js, knockoutjs and crossroads.js. The implementation was developed with the architecture pattern MVVM. The UI has been implemented on the server side with the ASP.NET MVC framework. It uses the MVC Views (almost) not at all, because the task of presentation is done with the client-side MVVM contents. Communication between client and server takes place using AJAX requests. The parameters in query objects and data in the response object are transmitted over the network in form of JSON objects.

Requests are forwarded from the routing engine of the MVCs to the correct actions in the controllers and processed there. The actions instantiate a worker, from whom the action knows the type. This means that the action does not have to worry about the actual work but serves only as a interface to arbitrary clients. Therefore this interface is easily exchangeable. With the worker classes the accesses to the business logic are made possible by different adapters.

### 1.2 API Service

API Service is the  programmer interface of the TIVITY platform and serves to connect external systems to the platform. The API is available as REST service. Components are the ApiController that process requests and send the results back.The API providers access the business logic.

### 1.3 Logic adapter

The adapter and all inherited adapters (from AdapterBase) are the interface between the source framework (data access layer) and the presentation layer. These adapters are part of the business logic (BusinessLogic/Application Layer).

### 1.4 Package manager

The Package Manager handles the export and import of app packages (as PACK files), for later installation, update and uninstallation of apps. For all functions, the package and the individual components in the package are validated. During installation, migrations are performed so that old packages can be installed in new platform versions.

### 1.5 Source framework

The source framework is a component in the data access layer that encapsulates access to the source (persistent data / information sources) and the techniques used. The framework includes the source adapters and the query processing (processor) as well as the capability operations

### 1.6 Query engine

The query engine is a TIVITY platform component that expects a query as input. This query is translated into the target data source that supports the query. The fields in the query hold the required columns/properties that were retrieved from the target data source. Conditions provide the filter criteria to get the desired results from the target source.&#x20;

For example, the target data source is a database (e.g. MSSQL Server). In this case the query is translated into SQL (for MSSQL Server T-SQL). The data source executes the translated query and returns a list of models as a result. Finally, the models are edited in the selection engine - by pagination and enrichment of meta information.

### 1.6 SourceAdapter

The Source Adapter is a component for generalized access to information sources, such as databases (MSSQL), objects (Exchange) or documents. In addition, a generalized result is returned by the respective adapter (Key-Value Format). The individual adapters can be used for several data sources of the same type, i.e. one adapter insert per data source.

The Source Adapter analyses a data source and returns available structures of the data source. The available structures allow a user of an adapter to query or manipulate instances. This is achieved by basic operations of persistent storage (CRUD - Create, Read, Update, Delete), e.g. you can query a table at a database source and delete entries. The available structure of a data source can display possible actions in the presentation layer for Business Logic.

## 2. Technical Infrastructure

### 2.1 Technology stack

![](/files/-MA24XZm8-bHpUMccIaA)

The implementation was based on a Microsoft .NET Technology Stack. The OS used is Windows Server 2012. The platform is hosted on an Internet Information Server (IIS). An MS SQL Server is used as a persistent data storage. Builds and deploys are then performed using Azure DevOps services. On the client side, knockout and bootstrap are used. Kendo JS is used for various UI components. Markup Language of the SPA (Single Page Application) is HTML5 and stylesheets are used in the version CSS3.

### 2.2 Server infrastructure

There are currently two physical servers. The release candidate and development server is the Dev / Stage Server. The production environment is the Productive Server

![](/files/-MA20pXHKp_6G-bzpOCF)

The apps are configured centrally via a master database. On the one hand, so-called "Migration Steps" are used to import Config-Master-DB extensions that affect the code and app configuration. On the other hand, apps can be developed via the admin interface of the (master) platform. These configurations of the Config-Master DB are synchronized/adjusted with the Stage-Config DB the staging platform is going to. When deploying to the production platform, the StageConfig DB is synchronized. The current configurations of master and staging are located there. At the same time the website is published on Production.

![](/files/-MA21QxnBmFj5AKxkLQs)


# Application Setup

## Home panel

The Home panel is the main navigation within the platform. The area is located on the left side of the browser window and is visible at all times. Additionally, the area can also be collapsed to enlarge the workspace area.

### View mode

An overview of the custom home panel can be found in [Default view](/overview/user-interface#default-view).

### Edit mode

An overview of the edit mode home panel can be found in [Config view](/overview/user-interface#config-view).

## Visibility of an application

If a user has neither roles nor features assigned to an app via groups or licenses, that app is not displayed. Floating licenses are considered assigned - for display purposes. How to create and configure licenses is explained [here](/building-an-application/application-setup/license-management).

Users in the Administrators group see all apps.

To assign a role to an app, this must be configured by the workspace administrator. This is done using the Teams app (standard application). Under the heading Groups you can set the rights (type custom) for each role.\
If custom roles is set and no app is selected, the user will not be able to see the app.

![Team App -Groups](/files/-MSd0g0cEFKEv9C3qLl7)


# General

All common application properties are grouped under General.

Navigate to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your applications. Next, click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the application you wish to configure. In the **App** section you click on **General** to access the App Properties.

## General

The General tab contains the properties of the app. These are divided into the sections General, Access and Application Signing. The Info section can only be read.

When you create a new app, the first thing you need to do is enter the **key**, which must be unique, and the **name** of the app. Where the name supports multilingualism. A **description** text field is available to describe the app in more detail.

![General tab](/files/-M_v77EdDcXDp9ausxy9)

To be able to publish this application later, **author** and **version** must be entered. The version must be specified in the semantics versioning scheme using a three-part version number: major version; minor version; and patch (e.g. 2.1.3).

In the **Access** section you can control who can use the app. If `Application is public` is enabled, the app can be installed in other workspaces. Also through the publishing process also cross-platform. For more details see [Publishing the Application](/building-an-application/application-setup/publishing-the-application)

The **Application Signing** section is also needed for publishing. Here you can create a signature for the app. More information about this can be found in [Publishing the Application](/building-an-application/application-setup/publishing-the-application)..

{% content-ref url="/pages/-MVbP5lB73iWGWI7-El6" %}
[Publishing the Application](/building-an-application/application-setup/publishing-the-application)
{% endcontent-ref %}

When the app is subscribed or installed, all changes to the following fields are updated in the derived apps as well:

* Key (NameID)
* Name\*
* Description\*
* Info\*
* Color
* App Icon
* Version
* Author
* IsLicenseRequired

## Classes

If you go to the classes tab, all classes of added and created apps of this workspace are displayed. You can select the classes you need for your app. When you select the class, it will be available to the app. The classes you have configured for this app are already selected by default.

![Classes](/files/-Ma-OyzRhp8EXbw5Z-jO)

## Plugins

A plugin on the platform is a widget or a component that can be displayed in the side bar. The plugins respond to user input, which can be different for each plugin.

All available plugins can be activated and set up in the Plugins tab. Since plugins can have different settings, there is a separate section for each plugin type. Currently, only the Time Tracker plugin exists for the platform.

### Time Tracker plugin

The Time Tracker plugin is designed to track times. Because the plugin is located in the side bar, the time tracker can be conveniently operated at any time. The plugin serves as a basis for apps that can process and display recorded times. How the app looks or is operated, is up to the app editor.

![Time Tracker configuration](/files/-Ma4RmVQTqqTaEA3BLZS)

To activate the Time Tracker plugin, select `plugin enabled` at the beginning of the section. Next, the **class** must be selected for the instances of the time tracking. Then a **workflow** should be selected, which processes the data that the plugin transfers. \
In the workflow, for example, instances of the previously selected class could be created. The available parameters serve as values (see description in the section). In addition, instances from the parameter list of the workflow can be linked to the Time instance.

#### Restrictions

When running the time tracker (more precisely, when stopping), instances can be added in the appearing overlay, which are available to the workflow in the form of a list (see image below).\
Now you would like a certain number of instances of a certain class to be added (linked) to the time tracking instance. Or there must be at least one instance.

This is made possible with the restrictions. A restriction is a class with a minimum and maximum number of instances that can or must be added. The class can be selected from a list of all available classes in this workspace.

![Restrictions](/files/-Ma9Yr3N_RBABxgQjUjw)

Several restrictions can be configured. Of course, existing entries can also be deleted.

After all settings have been made, you can save. If you want to undo the settings you made, you can do it by pressing the button `Delete Settings`.

#### Appearance and functionality

After activating the plugin and leaving the edit mode, the time tracker appears in the side bar after a reload of the platform.

<div align="center"><img src="/files/-MaEXayzrJ5FrDbym8K8" alt="Time Tracker"></div>

The time tracker can be started and stopped at this point. After the start, the timer runs. You can now continue working as usual. Even if you log out, for example, the timer continues to run. When you stop the timer, an overlay pops up. The times are already entered there automatically. Now you can still edit the times and add links of instances. Here the restrictions are taken into account.

![Time Tacker overlay](/files/-MaE_m8ZYHBFUVqlvlrO)

Now you have the possibility to delete the timer or to stop the timer. If you want the timer to continue, simply close the window. When the timer is stopped, the workflow configured in the settings is executed. \
The timer values are transferred to the workflow as parameters. As explained above, the workflow can now prepare the data or directly create and save an instance of a timer class.

## Search

The Search tab shows a list of classes that are integrated into the search (side bar search). Here you can exclude or add specific classes.

![Search tab](/files/-MaEe19GeqHApMOpK2xR)


# Documentation Management Tool

This section describes how to create documentation for an application and provide it to an app user.

## Overview

Sometimes it is necessary or desirable to provide a description of how an application works and how to use it. The user of this app can then read this published text at any time.

![Help App in workspace](/files/-MZE1ySPCZXordeeZk03)

## Getting started

Navigate to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your applications. Next, click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the application you wish to configure. In the **App** section you click on **Documentation** to access the documentation management window.

![Documentation overview](/files/-MZE3vAlAFoLWpAQUWKs)

## Manage documents

The documentation management window gives you a good overview of the pages already created and the structure of this document. You can filter, expand ![](/files/reNTlonXBXqXketLtcWI)or collapse ![](/files/jC6RHKOV5foR6bQVdRrs) all existing pages, use the Import/Export buttons to download a CSV file and upload it again after editing and add new pages.

<figure><img src="/files/vDwWo5Ef5Za4ENaKvOTA" alt=""><figcaption><p>Pages Management</p></figcaption></figure>

In addition, it is possible to reorder the pages by drag and drop:

<figure><img src="/files/SptaT2vlijoIvPYw1oJQ" alt=""><figcaption><p>Reordering Pages</p></figcaption></figure>

Pages can be reordered into the root and can be reordered into other parents (as a child). If the page has children, when the page is reordered, then all children are reordered with it.

## Edit pages

To edit a page, select a page from the overview. The **Documentation Designer** will open. The previously created content appears in three different views.

Content views sections:

* Editors (1) - WYSIWYG HTML editor with toolbox and markdown editor
* Preview (2) - view that the app user also sees
* Contents (3) - table of contents of this page

![WYSIWYG Editor](/files/-MZJ6ZO6k9E1LCmvG-rH)

### Editors

Two editors are offered for editing the content. The first one is the **WYSIWYG editor** (tab Easy Editor), with which the direct editing of the text formatting is possible. With the help of the toolbox you can easily select the styles. You will see the changes immediately in the preview. In addition, images can be added to the page (toolbox: Insert->Image).

As an alternative there is a **Raw Editor**. This is located in the second tab in the editor section (1). With this editor Markdown text can be entered or copied. Of course, the changes are also changed immediately in the preview.

![Raw Editor](/files/-MZJFfBvx6IB_RYUBukZ)

### Attachments

Attachments can be added to each page. For this purpose, there is an area at the bottom of the editor to fold up. There appears an upload button with which you can attach all possible files. See next picture under # 1 (Documentation Designer).

## Save and publish

To **save** the changes made to the page press the button on the right in the footer (4). You can also **delete** the page. To do that use the 'Delete Page' button in the footer on the left (2).

![Documentation Designer](/files/-MZTF51rvTUwJ70gmjLo)

After the page is saved, it is not yet available to the user of this workspace. He cannot see it. To do this, the page must first be published.\
To see immediately if the edited page is published, there is an indicator in the footer (3). If *not published* is displayed there, the page is not yet published. Otherwise, the date when the page was last published is there.

To **publish**, the action *Publish Page* must be selected in the context menu at the top right.

## Using documentation

After the content is published, a user of this workspace (view mode) can also read the created documentation. The standard app **Help** is provided for this purpose.\
After opening this app, all created documents of this workspace will be displayed. This means that the documents from all workspace apps are listed one below the other in the **Help** app.

![Help application](/files/-MZE1ySPCZXordeeZk03)


# License Management

Creating and activating licenses.

Licensing an application means that you control the access to an app or certain parts of it with a license. Without a valid license, these apps can no longer be opened or actions executed. Access is then limited to a certain period of time and to so-called features. How a license is created and then used is explained below.

{% hint style="info" %}
Only the **app creator** can create licenses. They are then used by the user of this app (app viewer) e.g. a customer.
{% endhint %}

Steps of the licensing process:

* [ ] **Creator**: [Signing application (App configuration -> General)](/building-an-application/application-setup/license-management#signing-application)
* [ ] **Creator**: [Require a license for an application (App configuration -> License)](/building-an-application/application-setup/license-management#licensing-the-application)
* [ ] **Creator**: [Creating license features (App configuration -> License)](/building-an-application/application-setup/license-management#creating-common-feature)
* [ ] **Creator**: [Creating license (License App)](/building-an-application/application-setup/license-management#creating-license)
* [ ] **Viewer**:[ Activate license (Team App)](/building-an-application/application-setup/license-management#activate-application-with-a-license)&#x20;

## Signing application

The first step is to create a certificate key pair. This certificate will later be used to encrypt the license.\
The Application Signing section is located under the **General** app configuration. If no key exists yet, the *Create Application Signing Pair* button will appear in the section below. By pressing the button a new key pair will be created.

![General Config](/files/-MS9EYSirZEpCjT0lrZZ)

## Licensing the application

To require a license for an application, this must be enabled in the app settings.Open the configuration of the licenses in the Config Mode of the application. Under **General** enable 'License required to use...'. But since no feature has been created yet, you can still run the app.

![](/files/-MYGCTMvPYBe2crediz6)

### Creating common feature

First we create a feature with a general license. This allows general access to the app. With a click on the '**+**' button under Features an overlay opens. There you can enter a name for the feature. The checkbox 'floating license' is not taken into account. First we want to create a general license.

![Add a new feature](/files/-MMWeEl3KbrlhbSNb1V2)

Run 'Execute' and the feature will be created. The detail view of the feature opens.

![Feature details](/files/-MMWgB6XNLxHA7_X_ugT)

Now you can add a description and change the name. We want to create a feature that only controls the access to the application in general. For this we just need to select the checkbox 'This feature allows to use...'. Save the setting and we are done.

The licensed app can now be published. How this works is described in chapter *Publishing the Application*.

{% content-ref url="/pages/-MVbP5lB73iWGWI7-El6" %}
[Publishing the Application](/building-an-application/application-setup/publishing-the-application)
{% endcontent-ref %}

If you call the application after published, an error message will appear. The app must now be licensed before it can be used.

![](/files/-MYGDX858S0NPSN96Zpv)

### Creating feature with permissions

More features can now be added. Next we would like to limit certain parts of this application for access. Let's assume we don't want to have a certain workflow executed without a license anymore.&#x20;

For this purpose we create a new feature. In the details of the feature the setting for 'feature allows to use...' must not be enabled. Otherwise the whole application will be locked again and further settings in the permissions are unnecessary.

If you open the Tap Permissions, the permissions settings for overall will be shown first. After that follows a list of classes the application uses. As an example we want to restrict the access to the workflow *Sub2* (see picture). For this you expand the class *ToDo* and it opens the parts which can be provided with rights. After expanding the Workflow entry the available workflows of this class are listed. Select *Sub2* for the workflow from the *Grant* dropdown. This workflow is now activated for these licenses.

![Feature permissions](/files/-MMacMDZgtZNomrmBUJg)

Available Permissions Settings

* **Not Set**: this item is not considered (access always)
* **Grant**: access is only granted with this license
* **Deny**: access is denied for this item

If a license has been uploaded for the application, the workflow will appear in the menu. Otherwise the workflow will not be offered in the menu.

![](/files/-MMaiZqomAvRl7l_Q1h4)

{% hint style="warning" %}
It should be ensured that the viewer of an app without a license does not have access to the feature (workflow, class etc.). See [Roles & Permissions](/managing-users-and-collaboration/roles-and-permissions).
{% endhint %}

### Floating feature

For a floating feature only the checkbox 'Feature is by floating...' has to be checked.

![Floating feature](/files/-MSE7YD45GTnpaqHzkUP)

## Creating license

After setting up the license with the features for the application we can create a license. For this purpose there is a standard application called **License**. This can be found on the right side where all apps are listed. If you open the app, an overview of the already created licenses for this workspace appears.

![License App main view](/files/-MMvDwNxvph90WgkSI0a)

There are four different groupings of licenses in each tab.

* **Drafts**: The licenses already set up, but no license file has been generated yet.
* **Current**: The listed licenses are active, i.e. start date is before and end date is after the current date.
* **Future**: Licenses become active only in the future, i.e. start date is after the current date.
* **Expired**: Licenses have expired, i.e. End Date is before the current date.

To create a new license we click on the '+' button or directly enter a name and press return. The detail view of a license will open.

<figure><img src="/files/dUa8GUjECzF064zxZHCr" alt=""><figcaption><p>License Details</p></figcaption></figure>

After a name has been assigned to this new license, a description can be added. Both name and description can be translated by clicking on the <img src="/files/HKKLJ5gTKKH51ujmOyUf" alt="" data-size="line">(available languages are English and German). In the **Status** panel right basic settings can be made. At the top you can see the state of the license (1). In our case, because we created the license from scratch, the state is *Draft*. After that you have to enter a start (2) and end date (3). The dates determine how long the license is active or usable.

In the **License Mode** panel (4) you can activate 'use global license type' first. That means this license can be used globally (for all features). With the selection list the type can be further limited. The following types are available:

* **Unlimited**: no limitations (default)
* **Named User**: (4) Only a limited number of users can use this license.
* **Floating**: For explanation see next chapter about [floating licenses](/building-an-application/application-setup/license-management#floating-license).

{% hint style="warning" %}
With the type *Named User* the office administrator must select specific users who are allowed to use this license.
{% endhint %}

After we have selected the type and duration of the license, the features have to be added (5). Without feature the license is 'empty' and has no effect when you assign it.

![Add feature to license](/files/-MN-Kj09hTXL34J9cIWZ)

Now two features we created before are added. One [feature is *ToDo Common*](/building-an-application/application-setup/license-management#creating-common-feature) which controls the general access to the app. The second [feature is *ToDo Workflow* ](/building-an-application/application-setup/license-management#creating-feature-with-permissions)which controls the execution of a specific workflow.

Now we are done with the settings and could generate a license (as one file). To summarize this license is

1. Not limited to a fixed number of users / licenses (license type)
2. Full access to the application is possible with the license (common feature) and a certain workflow can be executed (workflow feature)

Before we generate a license we will further refine the access to an app.

#### Disable global license type

We have the possibility to extend the license types to the features by unchecking the checkbox 'Use global license type'. If we do that, the license types disappear under the checkbox. For this purpose the types can now be selected in the features.

![Add types to feature](/files/-MN-UJsbxhGoc1DWakvr)

Now we have created a license in the example that has the following characteristics:

1. Time limitation: 11/18 - 12/182020
2. Feature Common: Full access to the app is not limited to the number of users or licenses.
3. Feature Workflow: the workflow can only be executed by 2 users (named user type) These users are defined by the administrator.

Since all settings are done we can save the license. Now a draft of the license is available. You can reopen and modify the draft at any time. However, once a license file has been generated from the draft of this license, this license can no longer be changed.

{% hint style="danger" %}
After the license has been generated, it can not be modified or deleted afterwards anymore!
{% endhint %}

![create license](/files/-MRLbcxOqy6k1G-CD1WD)

## Activate Application with a license

The generated license can now be delivered to a customer. To activate the locked app, the license must be imported into the customer's workspace.

As a reminder, the app has been licensed. Described at the beginning of the chapter. If you now open the app, an error message appears. To activate the app, the previously created license must be imported. This is done with the **Team App**. After opening the app, select from the selection of licenses. An overview of the recorded licenses of this workspace opens.

![Upload license](/files/-MRQnH9-dRuVdpZ7WXKn)

After the license has been uploaded, it will appear in the Team Licenses overview.

![](/files/-MRuhupd3wnUb07llpIG)

After clicking on the entry, the details view of the license opens. All relevant settings of the license are displayed. But cannot be changed anymore.

![](/files/-MRuil0NyU-Mglf4ZGxp)

For a named feature, the workspace administrator must now configure the users who can use this license. To do this, click on the gear icon in the feature section for the type *NamedUser*. A list of the users of this workspace opens.\
No more users can be selected than the number of named users entered in the license.

![Add users to license](/files/-MRzhnRi0AInLRx6A7hg)

Now we are ready. The app can now be launched with the new license. There is no error message like when starting the app before.

![](/files/-MRznR9_Ji04y9aDzWDA)

With the *ToDo Workflow* feature from the example, the workflow *Sub2* is now displayed for the added user. For the user who has not been added, the workflow is not visible and therefore cannot be executed.

![Menus from different users](/files/-MS3utqyp4_u4QiEEVOk)

{% hint style="info" %}
If the rights of the workflow have not been restricted in advance, this license feature has no influence on the visibility.
{% endhint %}

## Remove license

The license is deleted again in the **Team App**. When the license to be deleted is opened there, the action *Remove* must be executed in the menu.

![Remove license](/files/-MSE23EX8f5TS7r3XqBk)

## Floating license

To limit the use of an application to a certain number of licenses, the **floating license** is suitable.

To create this license, the license app must be started again. Then, as described above, create a new license.The type *Floating* is selected for the license mode and the number of limited licenses is entered in *Quantity*.

![Floating type and quantity](/files/-MSEBK5OS-JiKHcWRRS1)

When this is done a new feature can be added. This time, however, a floating feature is selected. None-floating features cannot be added to a floating license.

![Add floating feature](/files/-MSYbe4AEKrouj2poB5r)

If everything is fine and no errors are displayed, the license can be saved. It now appears under the overview in Drafts.

Now the steps described above can be repeated:

* [Creating the license and download](/building-an-application/application-setup/license-management#creating-license)
* [Activate Application with this license](/building-an-application/application-setup/license-management#activate-application-with-a-license)

After the app has been activated with this license, only one user can run the application in our example. We had previously limited the number of licenses to 1. As soon as a second user tries to start the app now, an error message appears.

![Error message when stating the application](/files/-MSYgWJ1ZJIhUGLvY1G0)

When the first user logs out the license is no longer used.The second user can now start and use the app because the license is currently only used by him.\
For simplicity, we have limited the number to 1. In practice, for example, you would limit the number to 100. Thus, only 100 users could use the application at the same time. In contrast to the *named user* it is not relevant who the user is. This user is called *floating user* in this context.


# Publishing the Application

Self-built apps can be published on other platforms or workspaces (e.g. public). Versioning is available to manage the publishing process.

## Export Application

In order to publish an application, a package of the app must first be built and downloaded. To do this, go into the configuration mode of the app you want to publish. Open the Publish app and then export the application. You will receive a \*.pack file which contains all the information of this app.

![](/files/-MVqsQObsR6DyyPkolmA)

{% hint style="info" %}
To be able to execute an export, the version and the author must be entered in the settings of this application.
{% endhint %}

## Import Application

The app packages are installed by the administrator in the **Admin Center**. The apps are then available platform-wide.

To do this, open the **App Management**. A list of the published apps of the platform will appear. These are divided into tabs. When you open it for the first time, the available apps are displayed. In further tabs, the installed and the update-able apps are listed.\
The `Import` button is located in the upper right corner. The previously generated pack file can now be uploaded. Once this is done, the app is available to the platform.

![App Management](/files/-MVqz0m0YzuBCuLxKyLY)

However, this does not mean that the app is installed. In the overview list, you can recognize the installed apps by the green icon. The installation can be done in the **App Details**

### Import Application in bulk

&#x20;When the user executes `Import Packages`, he can now upload multiple files at once.

![](/files/-M_fTth9aJtUFuBgzim9)

## Install Application

If you select an app from the list, a new map opens with the information of the app.

The first section **General** contains the information about the status of the app on the platform and related actions. The currently installed version of the app appears first. As an action for this information an uninstall can be executed. Below this there is a checkbox with the versions that are available. Here you can update to a higher version or downgrade to a lower version. \
The second section **Description** contains the metadata of the currently installed app. Additionally the dependencies on other apps etc. are displayed.

![](/files/-MW04ddygTg9x-zJFjWm)

### Multi update applications

There are 2 ways to update the app. First of all in the details view of the application. With the `Install` button a version can be specifically updated.\
In addition, it is possible to update several (or all) available apps to the latest version in the App Management in the `Updateable` tab.

![](/files/-M_fU17sb7xrbXgjwVk_)

In the header of the list there is a checkbox on the left. Selecting this will select all apps from the list. You can also select individual apps with the checkbox on the left in each entry of the list.\
After selecting several apps (or only one), these selected entries can be updated at once. Press the `Update` button in the upper right corner. Progress is shown throughout installation. Each error will displayed at the end of the installation with the package ID (in a message box to confirm).

## Add Application to workspace

There are two different ways to add an app to the workspace. Firstly, in the **Admin Center** in the Workspace section and secondly, apps can be added directly in the **Workspace**.

To install an app in **Admin Center**, open a workspace. With the '**+**' button apps can be selected for installation.

![Workspace apps](/files/-MW07QEkCXj70S6kTTf8)

An overlay opens with a selection list from which you can choose an app.

![App selection list](/files/-MW08pn_5FGeelN1NDgg)

{% hint style="info" %}
Only apps that have been previously installed are listed.
{% endhint %}

However, the **Workspace Admin** can also install apps. This can be done in the workspace overview with the `Add App` button (see pic below #10). This action opens the Install-Overlay in the same way as in the Admin Center. Now you can choose the app you want to install.

![](/files/-MW0DISxykYA9KkLCk7q)

## Remove Application

Removing an app is again done in the **Admin Center** under Workspace Administration.

![Uninstall App](/files/-MW0HaqjSd01lTcUWGuw)

Select an app from the list of this workspace. In the context menu of the detail card, the uninstall action can be selected. After the action is performed, the app is removed from this workspace. But it is still available on the platform.

## Uninstall Application

To completely remove a previously published app from the platform, it must be uninstalled.

This is again done in **App Management**. Just as described above [how to install an app](/building-an-application/application-setup/publishing-the-application#install-application), you can also uninstall it at this point.

{% hint style="warning" %}
Uninstalled apps are automatically removed from the workspaces as well.
{% endhint %}

## Remove packages&#x20;

In the course of a publishing life cycle, many package versions may be imported. To keep the system clean, it is possible to remove package versions that are no longer used. This is again done in **App Management**. \
Select a package from the available apps. You will be taken to the details page. There you can select one of the available (installed) versions. With the button 'Remove package' you can remove the package from the platform.

![](/files/-M_fUdA6QSyfBauNUDEv)

{% hint style="info" %}
Currently installed app versions cannot be removed. These must be uninstalled beforehand.
{% endhint %}


# Advanced Settings

Within the Advanced Settings designer, you can adjust the behavior of the platform while doing specific tasks

## Advanced Settings

With the Advanced Settings Designer, you can adjust the behavior of certain parts of the application which don't have a dedicated designer.

The advanced configuration is a list of category keys and each key can contain a configuration specified using the YAML-file format. &#x20;

Each key has a different set of options you can specify.&#x20;


# Document-MailEditor

This configuration allows you to adjust the behavior of the mail editor for each document class.

## Basic configuration

The configuration must start with a version specification. You specify the version like this:

```yaml
version: 1.0
```

### Save and Send

You can specify a workflow which should be executed if a user presses the action `Save and Send` within the Mail Editor. If a workflow is specified, the `Save and Send` action will be visible for the user, otherwise the user won't see the action.

For each document class within your application, you can specify a separate workflow. A configuration looks like this

```yaml
version: 1.0
config: 
- class: Document
  sendWorkflow: Test
```

The config contains a list of elements, each of them starting with the `class` specification.&#x20;

* `class`: with this option you define which class you want to configure the workflow for. The value is the key of the class.
* `sendWorkflow`: this value specifies the workflow which executes the send process. You specify the workflow by entering the workflow key.

{% hint style="info" %}
You can specify more than one class in the configuration.&#x20;
{% endhint %}

## Application Hierarchy

If you have an application hierarchy, all configurations are evaluated. The priority is always:&#x20;

1. Current Application
2. Parent Application
3. Parent Parent Application
4. ....

### Examples

* You are in the application `App1`, which is a child of the application `AppParent`
* You have two workflows, `Workflow1` and `Workflow2`, both living in `AppParent`
* In `AppParent`, you have specified that `Workflow1` is used for your document class `Documents`

#### Overwriting the specified workflow

To use `Workflow2` in your App `App1`, you simply add a configuration inside `App1`saying that `Workflow2`is the sendWorkflow for your document class. If a user now uses your app, `Workflow2` is used. If a user uses `AppParent` directly, the application will use `Workflow1` as the sendWorkflow

#### Un-setting the workflow

If you don't want to use any sendWorkflow for your document class, you simply add a configuration inside `App1` , add your document class and don't specify any workflow. This would look like this:

```yaml
version: 1.0
config:
- class: Document
```

With this setting, you are removing the configuration any parent app might have specified before.&#x20;

#### Use the same workflow

If you don't want to overwrite the configuration, simply don't add an entry with the corresponding class key.


# Data


# Sources

The Source Designer displays the list of all existing sources (not adapter). If another source has been set up, only the default source (such as an MS SQL Server in the screen shot) is displayed.This is generated automatically when creating a new app.

![](/files/-MUKAwJsEFLRQTlStRPv)

## Add source

There is also a button to create new sources. If you create a new source, a new window opens in which you can select an available adapter with which you want to create a source. Next, the name can be set. This is useful because you can create multiple data sources for one app.

![Add data source](/files/-MUF-y1FmxWtmy_IcUF5)

## Create data source class

Once the source is added, classes can be created for that data source. This is done in the class designer. In the header of the designer, on the left side, there is a selection field with which you can select a data source.

![](/files/-MUK7uUaju8gSFv5wSP7)

If you now select the newly added source, all classes you create are assigned to this source. I.e. the actions of this class are executed on the data source and the fields of an instance of this class are stored or read in this data source. This applies however only if CRUD capabilities (create, read, update, delete) are supported by the source.

{% hint style="warning" %}
**Actions** of a class can only be executed if the data source also supports them.
{% endhint %}

For more information on class creation see chapter [Data Modelling](/building-an-application/data/data-modelling).

## Configure source

After a new class has been created and you want to save, the message "Source not configured" appears. But only if this source is not already used for other apps and has already been configured.

![Team app](/files/-MUK8NparX_IFTavh668)

The configuration of the source is done in the default app **Team**. There is the entry *Sources*. When you open this page, all sources that are assigned to at least one class appear. These are divided into configured and non-configured sources.

Sources listed in the *Not Configured* tab can now be configured. Clicking on a source opens another page with the button *Configurate Adapter*. Clicking on the button displays the individual configuration of this adapter. After all required information has been filled in and no errors are displayed, the configuration can be saved.

![](/files/-MUK90_l2YfwBZr0PWCa)


# Data Modelling

Data Modelling on the platform makes use of the Class Designer allowing a user to manage classes, fields, actions and links. It is closely related to the database as well.

## Introduction

The Class Designer is the central unit to build a new application. It is used to define the classes that model data in an application. A class typically consists of fields, actions and links - each of which can be thoroughly configured using the class designer.

![Class designer window](/files/-MAwrEz-oVcdFylQ8Szh)

## Manage Classes

You can edit (by selecting details), delete, clone or export existing classes for use in another application easily from the dropdown menu for your class. More options are available in the toolbar as well.

### Editing a class

The class editor can be opened by selecting **Details** from its dropdown menu.

![Class designer: Edit a class](/files/-MBJbyJJKnFXEUOwmgeR)

The class editor allows you to modify the configurations of your class. More details about the different sections and attributes that help you customize you class can be found [here](/building-an-application/data/data-modelling/class).

### Deleting a class

A class can be deleted simply by selecting the **Delete** option from its dropdown menu.

{% hint style="danger" %}
Important: The system does not prompt for confirmation during deletion.
{% endhint %}

![Class designer: Deleting a class](/files/-MBG7Rb9WsLy08e94dGs)

### Cloning a class

A class can be cloned by selecting the **Clone** option from its dropdown menu. A new class with the same properties as the original class is created in your application.

The `- Copy` suffix is added to the class name to prevent conflicts with the original class.

![Class designer: Cloning a class](/files/-MBG7YSaqYIaFDeEk_gv)

{% hint style="danger" %}
Note that when cloning a class, unique properties such as the [Common Key](/building-an-application/data/data-modelling/class#key) and [Mapping Key](/building-an-application/data/data-modelling/class#key-1) also retain the same values as the original class, rendering the clone as invalid.

Make sure to modify all unique properties of the class to allow saving your cloned class.
{% endhint %}

## Class Diagram

A class diagram can easily be generated and viewed in the class designer itself by selecting your classes from the left panel. Alternately, you can select **Show All Classes** (from the toolbar) to generate a diagram with all the classes in your application.

![Class designer: Creating class diagrams](/files/-MBG7hdnG4qv3-Q53CfA)

#### Alignments

By selecting the **Align Elements** option, you can select to display your class diagram in different layouts. The options include **Circle**, **Square** and **Columns**.

![Class designer: Elements aligned in circular layout](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M8HTRblOKav_qm4KEx6-887967055%2Fuploads%2FWsxrJGJQQgUTznuXi0yR%2Ffile.jpeg?alt=media)

## Import and Export

Individual classes can be exported by selecting **Export** from their dropdown menus.

Alternately, you can choose to click on the general **Export** option in the toolbar and select all the classes you wish to export. Click on **Execute** to complete the operation.

Both methods result in a your class definitions compiled to JSON files being downloaded as a ZIP file.\
The default file name is `classes.zip`.

{% hint style="info" %}
The generated ZIP file may be password-protected.
{% endhint %}

![Class designer: Exporting classes](/files/-MBG7rhBFQOobwznwLmf)

Similarly, classes can be imported in an application by selecting **Import** from the toolbar and selecting your class definition JSON files. Click on **Execute** to complete the operation.

## Validate and Save

You can also check the validity of your classes by selecting the **Validate** option or save your current classes by selecting **Save** from the bottom menu.

![Class designer: Validate and save class](/files/-MBG83YJ0ZTn9NW3-Xwe)

All validation errors are displayed in the collapsible log at the bottom.

{% hint style="danger" %}
In case your class is invalid, the system will not allow the class to be saved.
{% endhint %}


# Class

The class editor within the class designer allows the user to customize their classes and database structures. This section dives into how to properly set up your class in your application.

## Getting Started

Navigate to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your applications. Next, click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the application you wish to configure. In the **Data** section you click on **Classes** to access the Class Designer.

![Class designer: Accessing the class designer](/files/-MBG8CzKXvvk_94qzMgo)

Next, select **New Class** in the toolbar of the Class Designer and choose a **Base Class** for the new class.

{% hint style="info" %}
Base classes allow your class to be preconfigured with some properties through inheritance. Custom base classes can be created by defining a class as an [Abstract Class](/building-an-application/data/data-modelling/class#class-type).
{% endhint %}

![Class designer: Creating a class](/files/-MBG8QcNW084nEdQM2iA)

A class contains **Common**, **Mapping**, **Advanced** and **Permissions** configurations. These properties are used to define how the class is stored and how it can be used in your application.

## Common Attributes

The Common section contains general properties of a class. In this section, you can specify how the class is presented in your application by setting the name, description and icon. The class type can also be defined based on how the class will be used in the application.

![Common attributes for a class](/files/-MBFf3shrCnKFiq8Cx9s)

### Key

The class key acts as a unique identifier for the class in your application. This allows the class to be identified by other designers on the platform - e.g. the [Query Designer](/building-an-application/data/query-data).

{% hint style="info" %}
The **Key** field is compulsory when creating a class.
{% endhint %}

### Name

The class name is a user-friendly name to help users easily identify a class. It can be defined in several languages by selecting the globe icon (on the right side of the text box).

{% hint style="info" %}
The **Name** field is compulsory when creating a class.
{% endhint %}

### Description

The class description provides additional information that can be used as help text.

### Icon

An image can be assigned to the class to further customize it.

### Color

This defines the color assigned to the class icon in the class designer.

![Different class icon colors in class designer](/files/-MBIkIPk8ad8AMIMMJVc)

### Class Type

The class type specifies how the application should treat the class. The options available to customize the class type are **Is Abstract**, **Is Independent** and **Autosave**.

**Is Abstract**

An abstract class is one that cannot be instantiated. It can be used as a **Base Class** when during class creation, allowing the new class to inherit all its properties.

{% hint style="success" %}
Example: An abstract class can be created for new classes to use as Base Class - inheriting preconfigured fields such as **Created Date**, **Modified Date** and **Deleted Date**.
{% endhint %}

**Is Independent**

An independent class can exist on its own without any dependency on other classes in the application. This is closely related to how links work on the platform.

**Autosave**

By activating autosave, objects of the class are automatically saved to the database by the application when created or edited.

{% hint style="danger" %}
In case a class is not defined as **Autosave**, the application layouts should include a button to manually ensure that data is being saved to the database.
{% endhint %}

## Mapping Attributes

Classes are stored as tables in the database. The Mapping section defines how the class is identified on a database level by the platform and your application.

![Mapping attributes for a class](/files/-MBFfFP4265f76PycYOK)

### **Key**

The mapping key specifies the name of the table for your class in the database. The platform caters for two different scenarios when mapping a class.

**Creating applications from scratch**

In this scenario, a new application with new classes is being created. The tables are generated when the classes are defined and saved in the Class Designer.

**Legacy systems**

In this scenario, an application is using a class that reads data from an existing database. This approach allows you to model existing (legacy) systems on the platform.

## Advanced Attributes

The Advanced section allows you to control how the platform and the application uses the class.

![Advanced attributes for a class](/files/-MBFfUc4we82zup_I8AU)

### Controller

This field allows you to specify additional logic related to your class by linking it to a controller file that contains the required code.

{% hint style="danger" %}
Generally, the controller should be left as **Default** and only customized in unique circumstances.
{% endhint %}

### Document Source

Classes can be initialized from a document on the platform by specifying a document source.

### Default Sorting Field

This field defines which class field should be used to sort the elements of the class in a list.

### Sorting Direction

The elements can be sorted in **ascending** or **descending** order based on this configuration.

## Permissions

This section allows you to specify which users or user groups can access the elements of this class or its data fields for reading or manipulating.


# Field

The field editor within the class designer allows the user to customize their field. This section introduces the process to create a field, and provides in-depth information about its properties.

## Getting Started

Starting in the **Class Designer,** click on the down arrow on the left side of the class you wish to work on. Next, expand the **Fields** for the class. Go to **Add a new field** and enter the name of your field. Press **Enter** to open the field editor.

{% hint style="info" %}
Clicking on an existing field opens it in the field editor to allow changing its configurations.
{% endhint %}

![Class designer: Creating a new field](/files/-MBG9YZqF4ooO1Lu3B8h)

## Common Attributes

The Common section contains general properties of a field. In this section, you can specify how the field is presented in your application by setting the name, description and other information.

![Common attributes for a field](/files/-MBFg2L4KjU-iTblJnoS)

### Key

The field key is an internal label for the field in your application.

Field keys are typically used when querying data to define which information to output from a particular query. More information about data queries can be found [here](/building-an-application/data/query-data).

{% hint style="info" %}
The **Key** field is compulsory when creating a field.
{% endhint %}

### Internal Key

The internal key is a unique identifier for your field and defines your field name in the database.

{% hint style="info" %}
The **Internal Key** field is compulsory when creating a field.
{% endhint %}

### Name

This is the name that is displayed in the application. By clicking on the globe icon, you can define a name for every language.

{% hint style="info" %}
The **Name** field is compulsory when creating a field.
{% endhint %}

### Description

The field description provides additional information to help the user navigate through your application. It can also be used as a hover text.

### Data Type

This field determines what type of data is allowed by the field and saved in the database.

{% hint style="info" %}
The **Data Type** field is compulsory when creating a field.
{% endhint %}

![List of datatypes in field editor](/files/-MBFgWLmSyL_SCoYIDFi)

Based on the data type, different [control type](/building-an-application/data/data-modelling/field#control-type) options are made available for the user to enter a value for the field.

| **Any**       | Label, Html                                                                                                                      |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| **Guid**      | Label, TextBox, ComboBox, Slider, Html                                                                                           |
| **Boolean**   | Checkbox                                                                                                                         |
| **String**    | Label, TextBox, ComboBox, EditComboBox, Slider, Password, TextArea, Email, Phone, Address, Url, HtmlEditor, MarkdownEditor, Html |
| **DateTime**  | Label, TextBox, Calendar, DatePicker, TimePicker, Html                                                                           |
| **Integer**   | Label, TextBox, ComboBox, EditComboBox, Slider, Html                                                                             |
| **Byte**      | Label, TextBox, ComboBox, EditComboBox, Slider, Html                                                                             |
| **Short**     | Label, TextBox, ComboBox, EditComboBox, Slider, Html                                                                             |
| **Long**      | Label, TextBox, ComboBox, EditComboBox, Slider, DurationPicker, Html                                                             |
| **Float**     | Label, TextBox, ComboBox, EditComboBox, Slider, Html                                                                             |
| **Double**    | Label, TextBox, ComboBox, EditComboBox, Slider, Html                                                                             |
| **Numeric**   | Label, TextBox, ComboBox, EditComboBox, Slider, Html                                                                             |
| **ByteArray** | Preview                                                                                                                          |
| **Char**      | Label, TextBox, ComboBox, EditComboBox, Slider                                                                                   |
| **Xml**       | Label, TextBox, TextArea, Content, ComboBox, Slider, Html                                                                        |

### Control Type

The field control type defines the editor with which a user can interact with the field. Control type options vary based on the data type selected for the field. Below is a list of different control types and how they can be used.

#### **Label**

Labels are used to present a single line of text. The control type 'Label' (or item appearance 'Label') shows the value of the field without the possibility to edit it. The field is visualized like a read-only field without the effects.

{% hint style="info" %}
Supported data types:\
Any, Guid, String, DateTime, Integer, Byte, Short, Long, Float, Double, Numeric, Char, Xml
{% endhint %}

![Sample label control](/files/-MT6bMQ4W26liJXod6Fy)

**TextBox**

Textboxes allows the user to enter a single line of text.

{% hint style="info" %}
Supported data types:\
Guid, String, DateTime, Integer, Byte, Short, Long, Float, Double, Numeric, Char, Xml
{% endhint %}

![Sample textbox control](/files/-MBJKtC9uGCI36sMpLc0)

#### Calendar

The calendar control is a combination of a Date Picker and a Time Picker to allow the user to select both a date and a time as input.

{% hint style="info" %}
Supported data type: DateTime
{% endhint %}

![Sample calendar control](/files/-MBJ1OQ3wTBr9SfR7vH6)

#### DatePicker

The date picker control is a textbox that is equipped with a calendar for easier date input.

{% hint style="info" %}
Supported data type: DateTime
{% endhint %}

![Sample Date Picker control](/files/-MBJ-pbyKv2nkLQzj4aj)

#### TimePicker

The time picker control is a textbox that is customized for easier input of time value.

{% hint style="info" %}
Supported data type: DateTime
{% endhint %}

![Sample Time Picker control](/files/-MBJ1c_2cXpaHum80yE2)

#### **ComboBox**

Combo-boxes are used to select a single value from a given set of options. By choosing this control type, additional configurations are presented to the user to configure the combo-box set of options.

{% hint style="info" %}
Supported data types:\
Guid, String, Integer, Byte, Short, Long, Float, Double, Numeric, Char, Xml
{% endhint %}

![Sample combo-box control](/files/-MBJIB1yCAA0juN0fTHL)

Based on the **Data Source Type** selected, different fields are presented to finalize the source of combo-box options.

1. **None**\
   No data source defined for the option list leaving it blank.\
   &#x20;<img src="/files/-MBJHOk94U2_jxtdJmUC" alt="" data-size="original"> <br>
2. **Class**\
   The user can set which class and field to read from to populate the combo-box options.\
   &#x20;<img src="/files/-MBJHclaiTtGcU0RNEqh" alt="" data-size="original"> <br>
3. **Controller**\
   The user can use code from a controller to determine how the options list should be built.\
   &#x20;<img src="/files/-MBJHkHFh1wDkk8YiEsb" alt="" data-size="original"> <br>
4. **Option**\
   The user can manually add possible options in a multi-line textbox (one option per line).\
   &#x20;<img src="/files/-MBJHo_82qdTiUh3V9jo" alt="" data-size="original">&#x20;

For Combo-boxes an automatic pagination mechanism is implemented. So even if there are dozens of options there won't be any performance issues when user is searching through the options.

{% hint style="info" %}
An alternate version of the combo-box is the **EditComboBox** control type which has the same configuration options as a normal combo-box.

However, input values for an edit-combo-box is not limited to the option set provided. Users can enter custom values in the input box.
{% endhint %}

#### **Slider**

Sliders allow the user to choose a value graphically. Additional **Options Source** configurations are provided to the user when this control type is selected. These configurations define which options are made available when using the slider.

{% hint style="info" %}
Supported data types:\
Guid, String, Integer, Byte, Short, Long, Float, Double, Numeric, Char, Xml
{% endhint %}

![Sample slider control type](/files/-MBJUBR3-cR6nTdPROAf)

With your data source configurations set, your slider will be ready for use in your application.

#### Password

Password fields are displayed with a single line of escaped text. By default, the password is masked using dots. Selecting the eye icon on the right of the textbox allows the password to be viewed as plain text.

{% hint style="info" %}
Supported data type: String
{% endhint %}

![Sample password control - hidden](/files/-MBJEfv8FKhDDX88Spc-)

![Sample password control - visible](/files/-MBJEr9eabZZDl-tKqfJ)

#### TextArea

This allowed the user to input multiple lines of text. In the bottom right corner of the input box, a resize option is provided allowing you to increase the height of the text area.

{% hint style="info" %}
Supported data types: String, Xml
{% endhint %}

![Sample text area control](/files/-MBJ9UBIoKCIk3OOGnju)

#### URL

URL control types allows a single line of text to be entered. The input box is customized for adding hyperlinks. An option on the right of the input box allows you to open the hyperlink in a new tab.

{% hint style="info" %}
Supported data type: String
{% endhint %}

![Sample URL control](/files/-MBJ8Q41EY_XZafzP7yL)

#### HtmlEditor

Html Editors allows the user to create and edit content in html format - allowing for easier combinations of multimedia and text.

<figure><img src="/files/caMT7ZQYxGUK1RTp7GJt" alt=""><figcaption><p>Field Control Type HtmlEditor</p></figcaption></figure>

{% hint style="info" %}
Supported data type: String
{% endhint %}

<figure><img src="/files/fn34xbDb1eoxAnbupRAz" alt=""><figcaption><p>HtmlEditor field in the Layout Designer</p></figcaption></figure>

![Sample HtmlEditor on the Page](/files/-MBJ8g8f7PJIIKPRcC5w)

#### Html

Displays the value of the field as HTML in non-editable format.&#x20;

{% hint style="info" %}
Supported data type:&#x20;

Any, Guid, String, DateTime, Integer, Byte, Short, Long, Float, Double, Numeric, Xml
{% endhint %}

#### MarkdownEditor

Markdown Editors allows the user to create and edit content in markdown format - allowing for content consisting of text and multimedia to be created while reducing the complexity of content creation compared to HTML.

{% hint style="info" %}
Supported data type: String
{% endhint %}

#### Email

Email control types allows a single line of text to be entered. The input box is customized for email input.

{% hint style="info" %}
Supported data type: String
{% endhint %}

![Sample email control](/files/-MBJ55lkbvfmhsSP6etV)

#### Phone

Phone control types allows a single line of text to be entered. The input box is customized for phone entry.

{% hint style="info" %}
Supported data type: String
{% endhint %}

![Sample phone control](/files/-MBJ3fMZ66UCgLhDqk1q)

#### Address

Address control types allows a single line of text to be entered. The input box is equipped with an option to open your address on Google Maps so you can confirm the location.

{% hint style="info" %}
Supported data type: String
{% endhint %}

#### Preview

The preview control type works with images stored as byte arrays. Using this control, the byte-array is rendered into the original image in your application.

{% hint style="info" %}
Supported data type: ByteArray
{% endhint %}

![Sample preview control](/files/-MBJOdK7SBoEWNsueizV)

#### Content

The content control type can be used with XML content. Similar to text-areas, it allows the user to increase the height by using a resizer at the bottom right corner of the input box.

{% hint style="info" %}
Supported data type: Xml
{% endhint %}

![Sample content control](/files/-MBJPlInJrx7lUiCakBG)

#### DurationPicker

The control type gets ticks and displays them as a duration (TimeSpan). Upon changing the duration, the new value gets saved as ticks (Long). The DurationPicker can be configured (in layout designer) to only display some of the different parts (days, hours, minutes and seconds).

Ticks are defined as 10,000 ticks per millisecond.

{% hint style="info" %}
Supported data type: Long
{% endhint %}

![Sample duration picker control](/files/-MSmlbzYAj4ZKPnlgayp)

### Data Source Type

#### Class

Data Source Type Class is selectable for control types ComboBox, EditComboBox and Slider.

<figure><img src="/files/huoyha1Y2PbW2rPDNAFh" alt=""><figcaption><p>Data Source Type Class Usage Sample</p></figcaption></figure>

Selection of Data Source Type Class requires additionaly selection of the class which will serve as a data source and the field of the chosen class.

#### Selection

Data Source Type Selection can be chosen for the Control Types ComboBox, EditComboBox and Slider.

In data source type “Selection” a selection can be selected to be used when a field value is to be selected.

<figure><img src="/files/Q800h1a2LWYovXNXbHvV" alt=""><figcaption><p>Data Source Type Selection Usage Sample</p></figcaption></figure>

Is the data source type Selection chosen, the following fields can be filled:

* Selection (required): A selection to choose from. All selections without a context or selections with a context matching the context of the parameter. For Field, Action-Parameter, Template-Parameter and Workflow-Parameter of the configured class is the matching context. For Selection-Parameter the context class is the matching context.
* Key field (required): A field of the selection to use as identification of each entry. The value will be used to store in a class field or parameter. Only fields of the same selection source can be selected.
* Name field (required): A field of the selection to use to display each entry. This can be the same as the key field. Only fields of the same selection source can be selected.

| Field                             | Required | Remarks                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| --------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Data Source Type                  | Yes      | The type of data source. Must be “Selection”.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| Selection                         | Yes      | The selection that is used as the data source.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| Key Field                         | Yes      | The field of the selection used as the key field. The value of the key field is saved in the field that is being configured.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| Name Field                        | Yes      | The field of the selection used as the name field. The value of the name field is displayed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| Parameter Default Values (Script) | No       | <p></p><p>A script executed before parameters of the chosen selection are evaluated. The script should fill variables named after parameters used in the selection. The script gets to following variables passed:</p><ul><li>Context.OfficeId (Guid): The ID of the office/ workspace the selection will be executed in.</li><li>Context.ApplicationId (Guid): The ID of the app the selection will be executed in.</li><li>Context.ClassId (Guid): The ID of the source class of the selection.</li><li>Query.ContextLinkId (Guid): The ID of the link between the class of the field and the class of the selection class (when applicable).</li><li>Query.ContextClassId (Guid): The ID of the class of the field.</li><li>Query.ContextInstanceId: The ID of the instance which field value is to be changed.</li></ul> |

#### Controller

Controllers Data Source Type can be chosen for the Control Types ComboBox, EditComboBox and Slider. You get a selection of controllers for different tasks.

![Field details](/files/-MSmw60YTEUKTQdas22p)

#### Option

Data Source Type Option can be chosen for the Control Types ComboBox, EditComboBox and Slider. With this type you can enter the selection possibilities manually.

<figure><img src="/files/GwrHkswWCvNmygleDPdw" alt=""><figcaption><p>Data Source Type Option with Sample Options</p></figcaption></figure>

Data source option can include translations for the name part of an option. Translations are optional and separated through the ':' character. Supported translations are:

* de - German language
* en - English language
* fr - French language

The following data source option definitions are supported:

**ID-only**

* Definition: \<ID>\[;\<ID>]
* Example: id1;id2;id3
* Only IDs with no names are shown
* ID and name are the same
* ID is saved as the field value

**ID-Name**

* Definition: \<ID>:\<Name>\[;\<ID>:\<Name>]
* Example: id1:name1;id2:name2;id3:name3
* Names are shown
* ID and name are separated
* ID is saved as the field value

**ID-Name-Translations**

* Definition: \<ID>:\<Name>\[:\<Language>:\<Translation>]\[;\<ID>:\<Name>\[:\<Language>:\<Translation>]]
* Translation for the language of the current user\
  or name if no translation found is shown
* ID, name, language and translation are separated
* ID is saved as the field value

Sample image above shows Data Source Type Option with sample of manually entered dummy options in two languages.&#x20;

## Mapping Attributes&#x20;

Field data is stored as table columns in the database. The Mapping section defines how the fields are identified and used on a database level by the platform and your application.

![Mapping attributes for a field](/files/-MBIv8Gv3DJxHcnMJbX1)

### Key

The mapping key defines the exact name of the column that is saved in the database.

{% hint style="info" %}
The **Key** field is compulsory when creating a field.
{% endhint %}

### Data type

The mapping data type specifies the database data type for this field. Below is a table relating some field common data types with their corresponding database mapping data types.

| Common Data Type | Mapping Data Type |
| ---------------- | ----------------- |
| Guid             | uniqueidentifier  |
| Boolean          | bit               |
| String           | nvarchar          |
| DateTime         | datetime          |
| Integer          | integer           |
| Byte             | tinyint           |
| Short            | smallint          |
| Long             | bigint            |
| Float            | float             |
| Double           | float             |
| Numeric          | decimal           |
| ByteArray        | binary            |
| Char             | char              |
| Xml              | xml               |

{% hint style="info" %}
For additional information on the mapping data types, click on [this link](https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-2017).
{% endhint %}

### Length

Mapping length defines the maximum length of a field.

{% hint style="info" %}
Default value for length is -1. This defines the length as unlimited.
{% endhint %}

### Is Identity

This checkbox determines whether the current field is a primary key in the database or not.

### Is Nullable

This checkbox defines whether this field can have a **null** value in the database.

## Advanced Attributes

The Advanced section allows you to control how the platform and the application uses the field.

{% hint style="danger" %}
Advanced configurations are changed only in unique cases. During normal use, these configurations are already done by the system and should not be changed.
{% endhint %}

![Advanced attributes for a field](/files/-MBIvW1bxy4trZMeN47r)

### Quick Search Field

Defines whether a field should be shown when using the Quick Search functionality on the platform.

### Include Data Source in Quick Search

This field option is only available if the field has a class as a data source.

<figure><img src="/files/q3rCZvr6ag2ZvvUwvhQr" alt=""><figcaption><p>Include Data Source in Quick Search Option</p></figcaption></figure>

Enabling it, the name field of the class of the data source is included in a quick search or ad hoc query.

### Kind

The platform currently supports two types of fields.

**Real**: A real field has a corresponding entry in the database.\
**Virtual**: A virtual field does not exist in the database. It is instead used to display results calculated or derived from other values.

### Is Required

Defines if the field needs to have a value when a new instance of that class is created.

### Is Read Only

Defines whether the field can be edited.

{% hint style="success" %}
Example: If a field is a unique identifier or a primary key, it may be marked as **Read Only** to prevent users from modifying it.
{% endhint %}

### Is Invisible

This setting defines whether the field is visible in your application.

{% hint style="success" %}
This is especially useful in cases where the user does not need to see or interact directly with a field in the application while the field is still useful in other use-cases (e.g. generating statistics).
{% endhint %}

### Exclude from number formatting

With this option fields with a number data type (Integer, Byte, Short, Long, Float, Double, Numeric) can be configured to be excluded from being formatted.

<figure><img src="/files/4EGY4wsmeUZYmgfgqv7o" alt=""><figcaption><p>Sample number Field with the Option</p></figcaption></figure>

If a field is excluded from being formatted, when the value of the field is displayed or modified, then the default format of the chosen language without group separators is used.

For example, you can see below a Double data type field which is formatted (left box) and which is excluded from number formatting by this option (right box).

<div><figure><img src="/files/AxgsgdaVrLjAHOh9UaGy" alt=""><figcaption><p>Formatted</p></figcaption></figure> <figure><img src="/files/CUIH2EKDUQVEyXTf9Ft8" alt=""><figcaption><p>Excluded from Formatting</p></figcaption></figure></div>

### Default Mode

The default mode defines for the field kind Real or Language at what point should a field be saved to the database.&#x20;

* **None**\
  The [default expression](/building-an-application/data/data-modelling/field#default-expression) will not be used.<br>
* **Creation** \
  The field is saved when the class object is created.<br>
* **Insertion**\
  The field is saved when the class object is saved.

### Default Expression

This configuration allows you to generate a default value for a field when an object of the class is created.

{% hint style="success" %}
This is particularly useful when the field value is being automatically generated via a method.
{% endhint %}

### Virtual Field

#### Get Expression Type

For the Virtual field kind it is possible to choose between two expression types:

* Expression
* Script

As the name implies, for the type Expression it is possible to write an expression and for the type Script it is possible to write a script with the [Script Designer](/building-an-application/execution/scripting) to provide the value of the virtual field.

<figure><img src="/files/Zu7xR9zPuOwBc31bszBe" alt=""><figcaption><p>Virtual Field Expression Types</p></figcaption></figure>

#### Get Expression

Option for the expression type Expression to write an expression to provide a value for the field kind Virtual.

#### Create and open expression script

Option for expression type Script to write a script with the [Script Designer](/building-an-application/execution/scripting) which provides the value for the field kind Virtual.

### Store

In the Store section of the Advanced options it is possible to set an expression or write a script which are set during the field saving process.

#### Get Expression Type

Two expression types are available:

* Expression
* Script

<figure><img src="/files/muEO3PseUZ5mwCq3VfOx" alt=""><figcaption><p>Store Expression Types</p></figcaption></figure>

#### Get Expression

Option for the expression type Expression to write an expression to provide a store value.

#### Create and open expression script

Option for expression type Script to write a script with the [Script Designer](/building-an-application/execution/scripting) which provides the store value.

## Permissions

This section deals with specific read and write permissions of the field for single users or user groups.

{% hint style="info" %}
More information about permissions can be found in the Rights Designer.
{% endhint %}


# Action

The action editor within the class designer allows the user to customize their actions. This section introduces the process to create an action, and provides in-depth information about its properties.

## Getting Started

An action defines what kind of activity a user can execute on a class or an instance of a class.

Starting in the **Class Designer,** click on the down arrow on the left side of the class you wish to work on. Next, expand the **Actions** for the class. Go to **Add new action** and enter the name of your action. Press **Enter** to open the action editor.

{% hint style="info" %}
Clicking on an existing action opens it in the action editor to allow changing its configurations.
{% endhint %}

![Class designer: Creating an action](/files/-MBG9slmHS0CXe3yAmUi)

## Common Attributes

The Common section contains general properties of an action. In this section, you can specify how the action is presented in your application by setting the name, description and other information.

![Common attributes for actions](/files/-MBFgt_1zDb0TeZwJjnK)

### Internal Key

The internal key is a unique identifier for your action and defines the name for your action in the database.

{% hint style="info" %}
The **Internal Key** field is compulsory when creating a class.
{% endhint %}

### Name

The action name is a user-friendly name to help users easily identify an action.

{% hint style="info" %}
The **Name** field is compulsory when creating a class.
{% endhint %}

### Description

The action description provides additional information that can be used as help text.

### Valid On

An action can be defined as valid in two scenarios only.

**Class**: The action can be executed outside an instance of the class (e.g. Filter operation)\
**Instance**: The action can only be executed within a concrete instance (e.g. Save operation)

### Is Invisible

This setting defines whether the action is visible in your application or not.

## Mapping Attributes

Similar to classes and fields, action configurations and data are stored in the database. The Mapping section defines how actions are identified and used on a database level by the platform and your application.

![Mapping attributes for actions](/files/-MBFhqTED_Zio513pjEN)

### Key

The mapping key defines the exact name under which your action is saved in the database.

{% hint style="info" %}
The **Key** field is compulsory when creating a class.
{% endhint %}

### Result Data Type

The result data type defines the type of the return value. It mainly describes the value of an action that the source adapter can perform.

{% hint style="success" %}
For instance, a **Download** action would have the **File** result data type.
{% endhint %}

Furthermore, the action can return a list of values by setting the **Result Is List** checkbox to true.

{% hint style="info" %}
This feature is used especially in the context of source adapters. For more information on Result Data Types, see our Source Adapter documentation.
{% endhint %}

### Parameters

Parameters can be used to request information for direct storage in the corresponding class fields when the **NEW** action is executed.

{% hint style="danger" %}
It is important that the parameters have the same key as the respective field.
{% endhint %}

## Advanced Attributes

In the advanced section of an action, you can further customize the flow of an action by defining what happens before and/or after the action is executed.

![Advanced attributes for actions](/files/-MBFizz-p7oNSq0SKP56)

### Before Execute Question

This property allows you to specify a confirmation question that will be displayed to the user before the action is executed. The user has to confirm the dialog for the action to proceed.

{% hint style="success" %}
For instance, on a **Delete** operation, it would make sense to set the Before Execute Question to a confirmation message like: **Are you sure you want to delete this object?**
{% endhint %}

### Post Action

In some cases, an action flow may require it to be followed by **other actions** after execution. This can be specified in the **Post Action** property.

{% hint style="success" %}
For instance, **Open** an instance automatically after the **Create** action has executed.
{% endhint %}

### Scripts

In this section, you can define an additional business logic that must be executed before or after the execution of an action. This is done by creating new scripts.

**Create and Open Pre-Execute Script**: Allows the creation of a script that runs before the action.\
**Create and Open Post-Execute Script**: Allows the creation of a script that runs after the action.

![Pre-request and Post-request Scripts](/files/-MBFjY_drfNkqLR0wVsl)

{% hint style="info" %}
Scripts can be written using the script designer by clicking on the create script button.
{% endhint %}

## Permissions

This section deals with specific action read and write permissions for single users or user groups.

{% hint style="info" %}
More information about permissions can be found in the Rights Designer
{% endhint %}


# Link

Links within an application represent the relationship between its classes. This section introduces the process of creating a new link, and provides a detailed breakdown of its customization options.

## Getting Started

Relationships between classes are defined by creating links in the class designer.

Starting in the **Class Designer,** click on the down arrow on the left side of the class you wish to work on. Next, expand the **Links** for the class. Click on **Please select** to choose the target class for the link. Click on the plus icon on the right of the textbox to create your link.

![Class designer: Creating a link](/files/-MBGA2-l_I0tUARHksaE)

There are different types of links.

**One-To-One**\
Class A can only have one instance of Class B and vice-versa.

**One-To-Many**\
Class A has several instances of Class B, but Class B can only be related to a single instance of Class A.

**Many-To-Many**\
Class A has several instances of Class B and Class B is related to several instances of Class A as well.

## Common Attributes

The Common section contains general properties of a link. In this section, you can specify how the link is presented in your application by setting the name, description and other information.

![Common attributes for links](/files/-MBFkOUqgdyWFv6IbKZV)

### Key

{% hint style="danger" %}
Currently disabled as this feature is still in development
{% endhint %}

### Parent Link

The parent link is used to specify the inheritance of abstract classes.

### Name

The link name is a user-friendly name that is normally generated automatically and set to the target class by default. This value usually does not require modifications.

{% hint style="info" %}
Changing the value for the **name** causes the link will be called the same in both classes.\
The **Name** field is compulsory when creating a link.
{% endhint %}

### Description

The description is a short help text that could potentially be used as hover text for the link.

### Link Setup

In the Link setup, you can configure the type and specifics of the link between the two classes.

{% hint style="success" %}
By checking **Use Link Service** in this section, several aspects of your link is handled by the platform and allows you to have a simpler configuration.

The following options are disabled when Link Service is being used:

* NM Class in **Common > Link Setup**
* Controller in **Advanced > Advanced**
* Type in **Advanced > Advanced**
  {% endhint %}

Normally, **Class 1** defines the origin class, while **Class 2** defines the target class.

**Field 1** identifies the field from **Class 1** that should be used as a distinct identifier (foreign key) and normally should be set to the primary key of that class. Similarly, **Field 2** specifies the distinct identifier (foreign key) for **Class 2** and should be set to the primary key of that class.

#### Is Source

The source setting defines the direction of a link. By selecting Is Source for a class, you can allow a user to navigate from that class to the other one.

{% hint style="info" %}
By selecting **Is Source** for both classes, the user is allowed to navigate in both directions.
{% endhint %}

#### NM Class

When configuring Many-To-Many link types, an extra intermediary table is required to cater for the complex relationship between both classes. The NM Class allows you to specify which table to use from the database. This table will be used to lookup the relations between the linked classes.

{% hint style="info" %}
For more information about many-to-many data models, click on [this link](https://en.wikipedia.org/wiki/Many-to-many_\(data_model\)).
{% endhint %}

## Advanced Attributes

In the advanced section of a link, you can further customize the how the link is processed by the platform by linking it to additional code and configuring additional options.

<figure><img src="/files/toclhSAxbM08z7Rg3CVB" alt=""><figcaption><p>Advanced attributes for links</p></figcaption></figure>

### Controller

The controller specifies additional code pertaining to the link that is running in the background.

{% hint style="danger" %}
This setting normally comes preconfigured as **Default**, which caters for most use cases and should only be modified to accommodate unique scenarios.
{% endhint %}

### Constraint

Link constraints refers to the restriction of links.

{% hint style="success" %}
For example, Constraints will allow you to define a link as a **one-to-many** link type, despite having the **NM Class** - which defines it as a **many-to-many** link type.

This can be relevant if the target class does not contain a field that can be used to define a normal **one-to-many** link.
{% endhint %}

### Direction

The link direction can be used to differentiate between two links.&#x20;

{% hint style="success" %}
For instance, if a class needs to be linked to itself, you can use **Direction** to define a parent and child in the link.
{% endhint %}

### Type

The class designer takes care of setting up most properties of your link. However, in this property, you can explicitly define a link type as **one-to-many** or **many-to-many**.

However, using the **NM Class** in the **Common Attributes** of a link instead can greatly simplify the configuration when creating your classes.

#### OneToMany

In the link type “OneToMany” a real relationship between one to many instances can be configured.

<figure><img src="/files/sz05dZtlTRKdyT1v5g9b" alt=""><figcaption></figcaption></figure>

| Field   | Required | Remarks                                                                       |
| ------- | -------- | ----------------------------------------------------------------------------- |
| Type    | Yes      | The type of link. Must be “OneToMany”.                                        |
| Class 1 | Yes      | The One class in One-To-Many. This is usually a main class.                   |
| Class 2 | Yes      | The Many class in One-To-Many. This is usually a dependent class.             |
| Field 1 | Yes      | The identifying field of class 1 in class 1. This is usually the primary key. |
| Field 2 | Yes      | The identifying field of class1 in class 2. This is usually a foreign key.    |

#### ManyToMany

In the link type “ManyToMany” a real relationship between many to many instances over a third class can be configured.

<figure><img src="/files/KXyvhzN5QxJaiAguVe8b" alt=""><figcaption></figcaption></figure>

| Field      | Required | Remarks                                                                                                                                                                                                                                                  |
| ---------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Type       | Yes      | The type of link. Must be “ManyToMany”.                                                                                                                                                                                                                  |
| Direction  | Yes      | <p></p><p>The direction of the relation:</p><ul><li>None: No specific direction is given.</li><li>Children: The direction is from class 1 (left) to class 2 (right).</li><li>Parents: The direction is from class 2 (right) to class 1 (left).</li></ul> |
| Class 1    | Yes      | The left hand Many class in Many-To-Many. This is usually a main class.                                                                                                                                                                                  |
| Field 1    | Yes      | The identifying field of class 1 in class 1. This is usually the primary key.                                                                                                                                                                            |
| NM Class   | Yes      | The relating class in Many-To-Many. This is usually a class only used for the relationship.                                                                                                                                                              |
| NM Field 1 | Yes      | The identifying field of class 1 in nm class. This is usually a foreign key.                                                                                                                                                                             |
| NM Field 2 | Yes      | The identifying field of class 2 in nm class. This is usually a foreign key.                                                                                                                                                                             |
| Class 2    | Yes      | The right hand Many class in Many-To-Many. This is usually a main class.                                                                                                                                                                                 |
| Field 2    | Yes      | The identifying field of class 2 in class 2. This is usually a primary key.                                                                                                                                                                              |

#### Service

In the link type “ManyToMany” a virtual relationship between many to many instances over a integrated service can be configured.

<figure><img src="/files/zu9JydnHqXbHX87xVGsK" alt=""><figcaption></figcaption></figure>

| Field   | Required | Remarks                                                                       |
| ------- | -------- | ----------------------------------------------------------------------------- |
| Type    | Yes      | The type of link. Must be “Service”.                                          |
| Class 1 | Yes      | The left hand Many class in Many-To-Many. This is usually a main class.       |
| Field 1 | Yes      | The identifying field of class 1 in class 1. This is usually the primary key. |
| Class 2 | Yes      | The right hand Many class in Many-To-Many. This is usually a main class.      |
| Field 2 | Yes      | The identifying field of class 2 in class 2. This is usually a primary key.   |

### Delete Behavior

Class-Designer option to not delete linked instances when deleting an instance. Following delete behavior options are available:

* Delete (default): Deletes all linked instances.
* Retain: Does not delete linked instances.

## Conditions

{% hint style="danger" %}
This feature is still in development at this time.
{% endhint %}


# Query Designer

Query Designer in TIVITY is similar to a visual data retrieval tool you might use with a relational database model or NoSQL instance.

## Introduction

Query Designer enables you to manage queries and define the data selection from your database. Queries are composed of a data source (what you're inspecting), a field selection (what information you want to see) and conditions (what you're looking for). In this article we will introduce you to the flexible features of the Query Designer.

## Manage Queries

You can edit, delete, and clone queries, or export your query definition for use in another app. Head to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your apps. Next, navigate to the app you want to configure and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line">. In the **Data** section you click on **Queries** to access the list of existing queries.

![Access the Query Designer in your apps](/files/-MBDJm-NfgMV2SP-3eaM)

### Create a Query

Click on **New Query** to create a new definition of how to select and display data in your application. [Get Started with Query Designer](/building-an-application/data/query-data/get-started-with-query-designer) describes the process of creating a query in detail.

### Edit a Query

Click on the query name from the list to open the query designer. The remaining functionality is identical to creating a new query, as described in [Get Started with Query Designer](/building-an-application/data/query-data/get-started-with-query-designer).

![Edit a query and validate before saving](/files/-MBDJm-LX3_YLP-L83F1)

Modify your existing query as needed, optionally **Validate** the current definition, and click **Save** to store your changes.

### Delete a Query

Either you open the drop-down menu on the right-hand side to the query name and choose **Delete** or you click on the query name from the list and click on **Delete** to remove the query.

![Delete a query from your application](/files/-MBDJm-KR4gFhiU86YpP)

Confirm to delete the selected query with a click on **Yes, delete it**.

### Clone a Query

In scenarios where you need the same query with minimal variations you don't have to create each query from scratch but you can duplicate an existing one. Open the drop-down menu on the right-hand side to the query name from the list and choose **Clone**.

![Duplicate an existing query to speed up multiple configurations](/files/-MBDJm-59J4SoUySTcO2)

After a short while a new query with a `- Copy` suffix will be added to the list of queries. You can create multiple copies of the same query.

{% hint style="info" %}
Prior to be able to clone a query it has to be validated successfully. If the copying process fails, open the query for review and validate it.
{% endhint %}

## Used By

Apart from being able to create and manage queries it is interesting to know whether and how a particular query is used in an application. Open the drop-down menu on the right-hand side to the query name in the list and choose **Used By**.

The Query Designer shows you in which Layouts, Classes, Functions, Selections, Templates, and Workflows the selected query is used.

![Used By provides you information where a query has been used](/files/-MBDYLb3GWEMTsy9iEdj)

Click on **Close** to return back to the list of queries.

## Export queries

To save your queries for backup or to transfer queries between applications and workspaces you would export them. Open the drop-down menu on the right-hand side to the query name in the list and choose **Export**.&#x20;

![Export your queries for backup or for use in other applications](/files/-MBDjCiCUo29voC3jc62)

The platform is going to assemble a ZIP archive and will offer you to download it to your system. The default file name is `queries.zip`.

{% hint style="info" %}
The generated ZIP archive is potentially password-protected.
{% endhint %}

## Import Queries

{% hint style="danger" %}
ToDo: Import fails due to invalid format of previously exported queries file.
{% endhint %}

Navigate to your **Workspace > Apps** and click on the gear icon to activate the configuration mode of your apps. Next, click on the gear icon of the app you want to configure. In the **Data** section you click on **Queries** to access the Query Designer. Click **Import Queries**.

Next, either drop an exported file from your system into the designated area or click on one of the available options to import your queries. Click **Execute** after the file has been uploaded completely.

![Import of queries to transfer definitions between apps](/files/-MBEPDVsEjwDY2uIP5u5)

After successful import the queries either have been created as new entries based on their original name or the suffix `- Copy` has been added to any existing query to avoid name conflicts.

## Grouping of Queries

Depending on the amount of queries the overview might become a crowded place with lots of entries. The Grouping feature enables you to organise your queries by a specific criteria, e.g. by First Letter (default) or by Last Modified date.

To change a grouping of queries click on the **Actions** <img src="/files/-MBCnllzlzaz9n1FnXzP" alt="" data-size="line"> menu at the top right of the list and choose an option. The list will be arranged immediately.

![Various options to display the list of queries](/files/-MBDJm-MO7gNqVEHg8qV)

## Return to the Workspace

After you completed your changes in the Query Designer you scroll down to the bottom of the **Config Mode** in the left-hand side Workspace pane and click on **Leave Config Mode**. Then you click on the tick next to the **Apps** caption to return to your Workspace.

## More on Query Designer

Query Designer is a powerful tool to level up your apps, and with such power comes complexity. Take a look at some of our other articles about the different sections in the Query Designer for even more help.

* Query Designer's [Common](/building-an-application/data/query-data/query-designer-common) attributes, [Fields](/building-an-application/data/query-data/query-designer-fields), [Conditions](/building-an-application/data/query-data/query-designer-conditions) and [Default Values](/building-an-application/data/query-data/query-designer-default-values) provide you with an insight into the detailed definition of your queries.
* [Query Designer Preview](/building-an-application/data/query-data/query-designer-preview) offers the resulting data of your query to verify the expected information.
* [Script Configuration](/building-an-application/execution/scripting) has further details on built-in functions and how to create and manage your own scripts.


# Get Started with Query Designer

The article gives a brief tutorial about how to create a query using the Query Designer.

## Create a Query

Navigate to your **Workspace > Apps** and click on the gear icon <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your apps. Next, click on the gear icon <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the app you want to configure. In the **Data** section you click on **Queries** to access the Query Designer. Click **New Query**.

![Create a new query in the Query Designer](/files/-MA7PPGDeka10-ew1gla)

A query contains [*Common*](/building-an-application/data/query-data/query-designer-common) attribute&#x73;*,* [*Fields*](/building-an-application/data/query-data/query-designer-fields)*,* [*Conditions*](/building-an-application/data/query-data/query-designer-conditions)*,* and [*Default Values*](/building-an-application/data/query-data/query-designer-default-values). Use those properties to create data selections in order to provide information in your apps and reports.

## Common attributes

Every query needs some general information in the system. It is defined in the **Common** tab of the Query Designer.

1. Give your query a name and an optional description in the **Name** section of the designer. You can enter language-specific information for your query. In our example, we are creating a query to retrieve log entries.
2. Choose a **Source** to query data from and provide an optional **Query Context** in case you need to handle relations between multiple entities.
3. Select a value for **Run Credential** to define who will be able to see the result of the query. In comparison **Edit Credential** specifies who will be allowed to edit this query.
4. Optionally, you can specify whether the query is only used in other configurations and therefore **Invisible for users** and tick the option **Use as report** to limit access to the query.
5. In addition, you can use a **Pre-Script Configuration** to create a values in it's **script** which can be used for setting the condition of the query, before it has been executed.

![Specify the Common properties of a newly created query](/files/-MBDs1UGNXRPeV82uU21)

## Fields selection

To display relevant information in your query you have to specify at least one field from the selected Source on the Common tab. Change to the tab **Fields**.

1. On the right-hand side you see the **Main Query Class** with a list of available entities to choose fields from.
2. Expand an entity to access a list of available fields to choose from. You can either choose to select *All* fields or tick individual fields from the entity. When done click on **Add fields**.
3. You can specify more properties of each field, ie. position, title, sort order, and handling of undefined values, in the list of Fields.
4. Optionally, you can add so-called **Virtual Fields** to your Query. Virtual fields are defined based on a **Script** and offer you a wide range of built-in functions to work with your data sources.

![Add Fields to a query and position them](/files/-MBDs1UOpS3XDFmYCgRT)

{% hint style="info" %}
You need to have at least one field to validate the query. You can add any number of fields to your query definition.
{% endhint %}

## Validate and Save a Query

Finally, click on **Validate** to verify that your selection of criteria is accepted by the Query Designer. Click on **Save** to store your query and return back to the list of queries in your app.


# Common

Query Designer is divided into several sections - Common, Fields, Conditions, Default Values and Preview. This article provides detailed information about the Common section.

## Overview

The Common section contains general properties of a query. In this section you can specify the name of the query as shown on the list of queries, the data context from which the query retrieves any information needed, and the credentials which are necessary to edit and run the query in your app. Here you would also specify whether the query is visible to other users or bound to reporting.

![Common attributes and values of a query](/files/-MBE5yhJJm64mCSK7QEJ)

## Key

Optionally, you can give your query a Key or match code. This property can be helpful in other drop-down or selection menus in your app to quickly access and choose a query. In the list of queries the value of Key is shown in parentheses behind the name of the query.

{% hint style="info" %}
The Key is a unique distinction between queries which is displayed in the Query Designer, but will not be visible to the end user in the finished app
{% endhint %}

## Source

The Source of a query specifies the data source or in our context the Class of an entity in the app. &#x20;

Open the selection control by clicking on the icon <img src="/files/-MBEACmVckVy-uZ1eKqH" alt="" data-size="line"> and either scroll the list for an entry or type the name of the class in the Search field at the top of the selection to choose a Source for your query.

{% hint style="info" %}
The selection of a Source is compulsory in a query.
{% endhint %}

## Query Context

The Query Context defines the relationship that applies to the Source of a query. It is needed in case that you want to retrieve data from a certain type of Class (as specified as Source) only.

A Query Context represents a grouping of records provided by the Source and is defined as a Class.

Open the selection control by clicking on the icon <img src="/files/-MBEACmVckVy-uZ1eKqH" alt="" data-size="line"> and either scroll the list for an entry or type the name of the class in the Search field at the top of the selection to choose a Query Context for your query.

### One-to-Many relationship

Commonly an app is based on more than one Class and there are relationships between those classes. An often used approach is the representation of data in a one-to-many relationship, e.g. a `ToDo` entry (Class) can have many `Documents` (Class) allocated to it. Or otherwise a document is connected to a ToDo entry.

A document however does not necessarily have to be assigned to a ToDo record but could either be linked to another Class, e.g. a Reminder, or could be stored in the app as standalone.

![One-to-many relationship based on primary/foreign keys in a relational database schema](/files/-MBEJOUsExp-UHOfosXg)

By providing a Query Context of class ToDo in your query the result will show data from documents that are associated to a ToDo entry only. Other records of class document will be ignored.

## Run Credential

Launching a query and seeing the result in your app requires permissions. The Run Credential provides access to either a group of users or a single user in your app.

Usually the choice of the Run Credential would be an entry with low permissions, e.g. a viewer account or group, only.

Open the selection control by clicking on the icon <img src="/files/-MBEACmVckVy-uZ1eKqH" alt="" data-size="line"> and either scroll the list for an entry or type the name of the class in the Search field at the top of the selection to choose a Run Credential entry for your query. If there are multiple entries of the same name the app is shown as suffix in parenthesis.

{% hint style="info" %}
The selection of Run Credential is compulsory for a query. You should consider the principle of least privileges to assign to your users in order to access and run a query.
{% endhint %}

## Edit Credential

Permissions to edit a query are separate from the ability to see the result. The Edit Credential grants permissions to either a group of users or an individual user in your app to modify a query.

The selection of your Edit Credential would be a role of an editor with slightly more permissions than a viewer but not as much as an administrator.

Open the selection control by clicking on the icon <img src="/files/-MBEACmVckVy-uZ1eKqH" alt="" data-size="line"> and either scroll the list for an entry or type the name of the class in the Search field at the top of the selection to choose a Edit Credential entry for your query. If there are multiple entries of the same name the app is shown as suffix in parenthesis.

{% hint style="info" %}
The choice of Edit Credential is compulsory for a query.
{% endhint %}

## Invisible for users

The checkbox `Invisible for users` allows you to hide queries while they are still in development and to remove a query from menus and selections available to the user directly. An invisible query is marked with a crossed-out eye icon <img src="/files/-MBDvgrhhoGT7nV0vt22" alt="" data-size="line"> in the list of Queries.

An invisible query can still be used in other areas of the app, e.g. the Layout Designer.

## Use as report

If the checkbox `Use as report` is selected the query is automatically available in the Reporting App and displayed in the section called `Reports provided by Apps`.

## Name

The common Name as well as a Description of a query can be given in multiple languages.  The localised information is displayed in compliance with the accepted language in the web browser of a user.

## Pre-Script Configuration

Pre-Script Configuration gives you the possibility to write a script, within which you can set values for the purpose of using them in the 'Conditions' tab of the designer. This enables you to use these values for condition(s) before the execution of the query.

![Creating a new script within Pre-Script Configuration](/files/zJMLKNMgAHIqezvxlQnf)

![Example of using a value of the Pre-Configuration script to set a condition](/files/jdRPw6BR88ZTtVquz0Pt)

Each condition value with the expression format {Parameter.} will be replaced by a parameter value defined in the script (with the variable name ).

The context of the script is passed to the script as well:

* Context.ApplicationId (ID of the application the selection is executed in)
* Context.ClassId (ID of the class of the selection or the selection is executed with)
* Context.OfficeId (ID of the office the selection is executed in)
* Query.ContextLinkId (the link ID from the context class to the source class of the selection)
* Query.ContextInstanceId (ID of the instance of the selection context)
* Query.ContextClassId (ID of the class used in the selection context)

<figure><img src="/files/t3PfPXjuvRMt1DvkqB1k" alt=""><figcaption><p>Script Context Variables</p></figcaption></figure>

Variables Query.ContextLinkId, Query.ContextInstanceId and Query.ContextClassId are only available if the Query Context for the Source has been set, as visible in the following sample image:

<figure><img src="/files/WDx0doosU9VZDLWhiOU6" alt=""><figcaption><p>Sample Query Context</p></figcaption></figure>

{% hint style="info" %}
Currently supported languages are English, German and French.
{% endhint %}


# Fields

Query Designer is divided into several sections - Common, Fields, Conditions, Default Values and Preview. This article provides detailed information about the Fields section.

## Overview&#x20;

In the Fields section you can define and manage the information that you want to see as result of a query. This section is divided into two areas - List of selected fields and collections of fields to add.&#x20;

![Definition of Fields in a query](/files/-MBE_eTaLheXurd6OSfc)

On the left-hand side is a list of selected fields from your Source and Query Context. Each entry is identified by its original **Field** name. You can define the **Position** - top to bottom means left to right in the result -, give the entry a **Title** and specify the **Order** about how the matching records should be sorted in the result. The column **Actions** offers you to edit, to delete and to position each entry in the list.

The right-hand side offers you collections of fields based on the **Main Query Class** definition selected by the Source and optionally based on the **Linked Class** definition selected by the Query Context in the Common attributes of the query. Lastly, the **Virtual Fields** section gives you access to the Script Configuration and any kind of constructed information you would need in the query result.

## Add a Field

To create the result of your query you need to add at least one field to the list of fields. Whether you choose a field of the Main Query Class, select a field of the Linked Class, or create a Virtual Field is equivalent. To add a field to your list of fields open the Class drop-down on the right-hand side. You can either tick the `All` checkbox at the top to choose all available fields in the Class or select multiple entities of the Class by setting a tick in front of the list element. Finally, click on **Add fields** to add them to the list of fields on the left-hand side.

![Adding a collection of fields from the Source](/files/-MBDs1UOpS3XDFmYCgRT)

Repeat this process until all requested fields have been added to the query. You can choose fields from the Main Query Class, the Linked Class or any Virtual Fields alike. More information on Virtual Fields is described in the [Scripting](/building-an-application/execution/scripting) article.

![Adding individual fields from Source and Query Context](/files/-MBEUz_VlslzhftdGYUX)

## Edit a Field

Under **Actions** of each field you have the ability to **Edit** <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> , **Delete** <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> , and **Position** <img src="/files/-MBEACmVckVy-uZ1eKqH" alt="" data-size="line"> the selected row.&#x20;

Click on the **Edit** icon <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to open a details view of the properties of the field.

<figure><img src="/files/lbWZ1Pj6unWa3raIi8mr" alt=""><figcaption><p>Editing Query Field</p></figcaption></figure>

On the **Query Field Properties** view you can enter and modify values for the field **Alias** (Title), Name (for translations in English and German language), choose the sorting order of records, and define where records with `NULL` (undefined) value should be located in the result.

{% hint style="info" %}
A query contains of at least one Field entry. This is compulsory to verify and validate the query.
{% endhint %}

## Edit a Linked Class

Despite same appearance of **Actions** of a Linked Class record in the list of fields a click on the **Edit** icon <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> opens the **Field Group Properties** view. Here you can define advanced features like *aggregation or inline* display of information of the field group.

![Review and edit properties of a Context](/files/-MBXE_gASBA8EXhB0LYH)

The section **Place** provides you with a drop-down to define the functionality of the Field Group. You can choose one of the following features:

* Aggregate
* Inline

Each functionality has additional, individual configuration options.

### Aggregate

A selection of most commonly used aggregate functions are available. Following options in the **Aggregation** drop-down are available.

* Sum
* Count
* Average
* Min
* Max

You can choose one option.&#x20;

![Available options of an aggregation](/files/-MBXFe3EBQuKciDh9sXZ)

Commonly an aggregation would be used to retrieve an information based on a numeric value, e.g. age of person, number of days, products in stock, etc.

### Inline

The Inline functionality offers you to display the record values of one or multiple fields of a Linked Class. Those records of a field are separated by semicolon.

![Multiple fields of the context are used as inline information in the result](/files/-MBXIahzEKUeQelyC3TP)

Several fields of a Linked Class are shown separated by comma within the record while multiple records are separated by semicolon.

## Delete a Field

To remove a row from the list of fields click on the **Delete** icon <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> in the column Actions. Repeat to remove more than one row from the list.


# Conditions

Query Designer is divided into several sections - Common, Fields, Conditions, Default Values and Preview. This article provides detailed information about the Conditions section.

## Overview

Under Conditions you can define a list of constraints and criteria to filter records in the result of the query.

![Definition of Conditions in a query](/files/-MBWopKQfjb2PDqX8csb)

You can either add an individual condition or a group (of conditions) to the list. Complex scenarios using multiple conditions and multiple groups are possible.

## Add a Condition

To retrieve only data that adheres to certain criteria you add one or more conditions to your query. Click on **Add condition** at the top of the list to get started.

![Adding conditions to filter records of a query](/files/-MBWtrdbcJzGY1-_2WDE)

The newly created row the selection of a field from the available classes - Source and Query Context -, and how the field values should be evaluated against the comparison operator and an optional value.

{% hint style="info" %}
The default type of a value is a Constant. More about value types in the next paragraph.

When you choose a logical comparison operator, e.g. `Is empty` then it is not necessary (and possible) to specify a value.
{% endhint %}

## Edit a Condition

In the **Actions** columns you have the ability to **Edit** <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> , **Delete** <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> , and **Position** <img src="/files/-MBEACmVckVy-uZ1eKqH" alt="" data-size="line"> the selected row.

Click on the **Edit** icon <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to open a detailed view of the properties of the condition.

![Review and edit properties of a condition](/files/-MBWwHyYuowkJneXKaG_)

The **Condition Properties** view lets you choose a Field and how it compares to a certain constraint. Analogue to the Field selection in the list of conditions you can choose any entity from the available classes provided by Source and Query Context.

Next, you specify the comparison operator by choosing an option from the drop-down list. Ticking the **Not** checkbox negates the operation.

### Comparison Operators

To compare your Field against a certain information you have to specify the comparison operator.

![Choose a comparison operator to specify the condition to filter values](/files/-MBXKFz0pemtiCLpUyBl)

By default it is the *is equal to* operator `=`. The list of comparison operators is given below.

* Is equal to `=`&#x20;
* Is not equal to `<>`&#x20;
* Is less than `<`&#x20;
* Is less than or equal to `<=`&#x20;
* Is greater than `>`&#x20;
* Is greater than or equal to `>=`&#x20;
* `Begins with`&#x20;
* `Contains`&#x20;
* `Ends with`&#x20;
* `In`&#x20;
* `Is Null`&#x20;
* `Is Not Null`
* `Is Empty`&#x20;
* `Is Not Empty`&#x20;
* `Is Null or Empty`&#x20;

The comparison operators describing a state of a field value, e.g. `Is Empty`, do not require a value to compare against.

![Using a state-based comparison operator, here: \`Not Null\`](/files/-MBWuzHpZYXKP6McS9xO)

### Types of Comparison

Then you select the type of value against which the field records should be compared to. The following types are available.

* Constant
* Expression

Each type has its individual detail to complete the condition.

#### Constant

A constant lets you define a fixed value against which the field values are compared to. A common scenario would be to check for non-negative numbers (e.g. greater than or equal zero) or whether a certain string is present (e.g. contains value).

![Comparing records to multiple, constant values in a query](/files/-MBWyEwrZujlJRGpeBXQ)

Enter multiple values as comma-separated list when using the `In` comparison operator.

#### Expression

An expression offers more flexibility compared to a constant and its value is evaluated during the execution of the query. Specify an expression by writing the reference in curly brackets, e.g. {CurrentUser.Id}.&#x20;

![Using an expression provides flexibility as the value is evaluated at execution of a query](/files/-MBWy_uGvQLd03X-nRrg)

A sample condition to display records which have been created by the current user only, you would select a field like `Source.Created By` and check whether its values are equal (`=`) to the current user, represented by the expression `{CurrentUser.Id}` .

Expressions are a feature of the [Scripting](/building-an-application/execution/scripting) capabilities of the platform. You can find out more about [Expressions here](/building-an-application/views/document-templates/expressions-in-template).

## Add a Group

Combining multiple conditions into a logical unit is called a group. You can define your list of conditions with any number of groups together with individual conditions. In logical terms, a group acts as a set of parentheses around your conditions.

![Add a group of conditions to a query](/files/-MBX4fo9Zv6C6MFX-F8u)

The use of a group gives priority to a certain set of conditions in regards to the sequence of they are evaluated against the Source of your query. A group allows you define a more complex list of conditions, e.g. to filter records by certain constraint A but not following criteria B or C.

## Logical Operators

When working with multiple conditions to filter your data you have to provide information of how those criteria are to be combined. Logical operators are used to link those conditions.

![Combine multiple conditions with logical operators](/files/-MBX6_rnHTTjdjS0hOJL)

Following operators are available to create more versatile conditions.

* `And` - both criteria must be met to accept any value as result
* `Or` - any criteria must be met to accept a value in the result&#x20;
* `None` - is a construct which stands for `And Not` when combining multiple criteria&#x20;

## Delete a Condition

To remove a single condition or a group from the list of conditions click on the **Delete** icon <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> in the column Actions. Repeat to remove more than one row from the list.

{% hint style="info" %}
Deleting a group removes all conditions inside that group.
{% endhint %}


# Default Values

Query Designer is divided into several sections - Common, Fields, Conditions, Default Values and Preview. This article provides detailed information about the Default Values section.

## Overview

Working with data often leaves you with undefined or incomplete information in your records, especially when dealing with optional data entry fields. The Default Values section lets you specify how to handle those undefined values in your result.

![Definition of Default Values in a query](/files/-MBWqHDZAUj6by6Z_FtK)

You can define a default value for each field of your Source.

{% hint style="info" %}
Default Values are limited to fields of the Source class only.

A default value is applied to undefined values of a field only. An empty value is not replaced by the default value.
{% endhint %}

## Add a Default Value

You start with an empty list of default values. Click on **Add Field** at the top of the list.

![Specify default values for various fields of a query](/files/-MBEYDV5hMLcLJZ9DAFo)

In the newly created record you open the drop-down selection in the column Field to choose a field from your classes. You can use the Search feature to narrow down the selection.

In the column Value you enter the information shown in the result for any undefined value of the chosen field.

Repeat this step until all optional fields have been assigned default values to.

## Delete a Default Value

To remove a row from the list of default values click on the **Delete** icon <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> in the column Actions. Repeat to remove more than one row from the list.


# Preview

Query Designer is divided into several sections - Common, Fields, Conditions, Default Values and Preview. This article provides detailed information about the Preview section.

## Overview

The Preview displays the result of the query as defined by the list of Fields after Conditions have been met and Default Values have been applied to.

![The Preview provides an ad hoc impression of how the result of a query looks](/files/-MBWmuM871j8Q0Pa6o9W)

Although the resulting grid in the Preview area provides you a feature-rich experience to further group information, select or deselect certain columns and apply additional filters to the result those changes have no impact on the query definitions in the sections Fields or Conditions. In case that you want to make those adjustments permanent you have to apply those modifications in the corresponding lists.

{% hint style="info" %}
Preview currently does not support queries with Context classes.
{% endhint %}


# Views


# Layout Designer

Interface design on the platform is done via the Layout Designer - a tool specifically created to help build clean graphical layouts for your users to interact with your application.

## Overview

The Layout Designer is the main tool offered by the platform to create graphical user interfaces (or layouts) for your application.

{% hint style="info" %}
Prior to creating your layout, it is helpful to have already defined the underlying components of the **entire** application - such as creation of the required classes and actions.

You can then build your layout to allow users to interact with the underlying components with ease.
{% endhint %}

![Layout Designer Overview](/files/-MEOEym8Gnd6pYHwRR6Y)

{% hint style="info" %}
For a more hands-on guide to the Layout Designer, see the [tutorial provided](/overview/getting-started/building-the-layout-1-2#layout-designer).
{% endhint %}

## Getting Started

Navigate to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your applications. Next, click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the application you wish to configure. In the **Views** section, you can select **Layouts** to access the Layout Designer.

![Opening Layout Designer](/files/-MEOMj5fIsghKiW7qcBi)

At this stage, you will encounter the layouts management section of the designer - allowing you to view your existing layouts, create new ones and import/export layouts.

## Layout Management

The layouts management window presents all the layouts created for your application categorized by the Page Type.

![Layouts Management](/files/-MEOFY0In8TaoxsHkF4g)

{% hint style="info" %}
Learn more about [Layout Designer Page Types](/building-an-application/views/design-ui/page-types)
{% endhint %}

### Role Filtering

By selecting the right **Role** value, you can browse through the list of layouts created for users with **Viewer** or **Editor** rights accordingly.

{% hint style="info" %}
Learn more about roles and permissions in the [Rights Designer](/managing-users-and-collaboration/roles-and-permissions/rights-designer) section.
{% endhint %}

### Grouping

Selecting the menu icon on the right of the Role filter, you can select further grouping options from a dropdown menu.

The options include:

* No Grouping
* Group By Class
* Group By First Letter
* Group By Last Modified

Based on the grouping method selected, each page type category is further broken down into grouping sub-categories where the layouts are listed accordingly.

![Layout Grouping Options](/files/-MEOG7PvxESrKmw1SARi)

### Layout options

An existing layout can be opened for editing by selecting it from the list of layouts.

More management options are available for each individual layout by selecting the dropdown on their right.

![Layout Context Menu](/files/-MEOGzk5eO7K7uLOYYib)

#### Cloning a layout

The clone option is available from the dropdown menu for your layout item. It creates a copy of the layout with the suffix `- Copy` added to its name.

#### Exporting a layout

The export option is available from the dropdown menu for your layout item. This results in the platform compiling your layout as a JSON file, which is then bundled and downloaded to your device as a ZIP file. The default file name is `layouts.zip`.

{% hint style="danger" %}
Exporting your layout saves it as a ZIP compiled file that may be password protected.
{% endhint %}

#### Usage of layout

You can easily verify which components (such as classes or workflows) of your application is using your layout by selecting the **Used By** option from the layout dropdown menu.

#### Delete a layout

The delete option is available from the dropdown menu for the layout item. You will be prompted with a confirmation message, following which your layout will be deleted from your application.

### Import/Export Texts

The platform provides an import and export mechanism for all text content within your layout. This is particularly helpful when the application is being translated to provide multilingual support.

{% hint style="info" %}
Exporting the text even allows the use of external translation services without compromising on access to your application.
{% endhint %}

![Import and Export Texts](/files/-MEOIXJ7F7OChQUc5UOp)

Configurations of the layouts in your application can be exported by selecting the **Export Texts** option. This generates a Microsoft Excel file which can either be viewed in your browser, or saved locally to your device.

Similarly, the exported Microsoft Excel file can be imported back to the application by using the **Import Texts** option.

{% hint style="danger" %}
You can only import texts back into the **same application** from which it was exported, which will cause your existing configurations to be overridden.
{% endhint %}

### Filtering and Search

Using the filter box on the top left corner of the window allows you to filter the list of layouts by name.

![Layouts Filtering](/files/-MEOL7JPhyq-E_prmrHc)

Clearing the filter box resets the layout list to its original items.

### Importing Layouts

The **Import Layouts** option allows you to import your previously exported layouts back into the application.

{% hint style="danger" %}
Layouts can only be imported back into the same application from which they were exported.
{% endhint %}

### Creating a new layout

A new layout can be creating simply by clicking on the **New Page** option from the top action toolbar in the layouts management window.

First, you need to select your layout page type.

{% hint style="info" %}
Learn more about the [Layout Designer Page Types](/building-an-application/views/design-ui/page-types)
{% endhint %}

Next, you will be directed to the Page Configuration screen where you can further customize your layout page settings and functionality.

## Layout Designing

After creating your page, you can customize the page layout via the layout designer canvas. You can browse the variety of layout controls offered by the platform as well as templates to help kickstart your design. On top of the designer, you can see several options offered to improve your layout designing experience.

![Layout Designer](/files/-MHlKQNZe99NWHksqkYU)

### Layout Controls

The layout controls are listed on the left of the designer categorized as [Fields](/building-an-application/views/design-ui/fields-and-links#fields), [Links](/building-an-application/views/design-ui/fields-and-links#links), [Controls ](/building-an-application/views/design-ui/layout-controls)and [Templates](/building-an-application/views/design-ui/layout-templates). These elements are the building blocks of your layout in the designer.

{% hint style="info" %}
[Fields and Links](/building-an-application/views/design-ui/fields-and-links) are available only when using class-bound pages such as [Object Page](/building-an-application/views/design-ui/page-types#object-page).
{% endhint %}

### Design Options

More options are available in the action toolbar on top of the designer to help your with your layout designing process.

#### Page Settings

Allows you to access the configurations of your current page.

{% hint style="info" %}
More information about page configurations can be found in [Page Types](/building-an-application/views/design-ui/page-types).
{% endhint %}

#### Preview

Allows you to preview what your design will look like as a user interface.

#### Expand (todo: square-plus icon)

Expands all the elements on your designer to view their content.

#### Collapse (todo: square-minus icon)

Collapses all the elements on your designer to hide their content.

#### Debug

Allows you to view your layout in JSON format.

* **Modify**\
  When in debug mode, you can select this option to modify your layout as a JSON directly.<br>
* **Toggle View**\
  Allows you to toggle between the fully expanded JSON view with all the control properties and a categorized list of items based on their status on the canvas.\
  *Item status: Deleted, Moved, Updated, Added.*

#### Visualize Indentation

Displays indentation markers on the canvas to help keep track of nested controls in your layout.

![Layout Designer with Indentation](/files/-MHlKlikpfZUL_7cMIWd)

#### Run Intro Tour

The platform presents an informative guide to the various features available on the layout designer in the form of an interactive onboarding.

#### Attachments

Allows you to upload files (such as images) for use within your layout.


# Page Types

The Layout Designer provides support for different page types that are designed to cater for different needs that your application may have. This section explores each page type individually.

## Overview

The first step to creating your new layout is selecting your **Page Type**. The platform supports several page types each catering for different types of user interfaces.

#### Page Types

* [App Page](/building-an-application/views/design-ui/page-types#app-page)
* [Object Page](/building-an-application/views/design-ui/page-types#object-page)
* [Object Section](/building-an-application/views/design-ui/page-types#object-section)
* [Object Links Page](/building-an-application/views/design-ui/page-types#object-links-page)
* [List-Result Page](/building-an-application/views/design-ui/page-types#list-result-page)
* [List Item Layout](/building-an-application/views/design-ui/page-types#list-item-layout)
* [Dashboard Widget](/building-an-application/views/design-ui/page-types#dashboard-widget)
* [App Dashboard](/building-an-application/views/design-ui/page-types#app-dashboard)
* [Base Layout](/building-an-application/views/design-ui/page-types#base-layout)

After selecting your page type, the page settings can be configured by selecting <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> Page Settings option in the action toolbar (located at the top of the layout designer).

![Accessing Page Properties](/files/-MFX45FznzTgheYH8LXD)

## App Page

The **app page** is a page is one that is not bound to any objects or object context. It is mostly used to display general information and other content related to your application.

{% hint style="info" %}
The first **app page** created is used as the default landing page of your application.
{% endhint %}

![App Page Configuration](/files/-MFX4hmLd-o4KGqLneTv)

### Name

The name property is used to define a unique name for the page.

### Description

The description field can be used to describe the purposes of your page for the users.

### Page Size

The size determines the dimensions of the page to be displayed.

Supported values for **Page Size**:\
Very Small, Small, Regular, Very Large, Extra Wide and Full Width

## Object Page

The **object page** displays information retrieved for a specific object instance. Hence, it must be bound to a particular object in order to be used.

{% hint style="info" %}
Special information related only to a particular object can be displayed using this page.
{% endhint %}

![Object Page Configuration](/files/-MFX5AixB0jYF0u0L7Tj)

### Name

The name property for an **object page** is used to define a unique name for the page.

### Description

The description field can be used to describe the purposes of your **object page** to the users.

### Page Size

The size determines the dimensions of the page to be displayed.

Supported values for **Page Size**:\
Very Small, Small, Regular, Very Large, Extra Wide and Full Width

### Layout for Class

The **object page** needs to be created for use within the context of a particular class. This field allows you to set which class should be associated to your page.

## Object Section

The Object Section page type acts as a custom component bound to a class. This can be used to embed your component within other class-bound page layouts by using the Object Section control.

## Object Links Page

The Object Links Page is a special page that displays all the links and linked instances for the current object instance. This page can be opened by the user if it is placed within an Instance Links Panel on your layout.

## List-Result Page

The **list-result page** is a unique page used when creating layouts to display lists of items, such as search results. The page can be used with

* Classes - to display a list of objects of the same class
* Queries - to display results from a query

Regardless of where the query is called in your application, the associated **list-result page** is always used to display the results.

{% hint style="info" %}
**List-Result Pages** can be displayed as the result of an action in the layout as well.
{% endhint %}

![List-Result Page Configuration](/files/-MFX5vEOD3dY2W3uRBlH)

### Name

The name property for a **list-result page** is used to define a unique name for the page.

### Description

The description field can be used to describe the purposes of your **list-result page** to the users.

### Page Size

The size determines the dimensions of the page to be displayed.

Supported values for **Page Size**:\
Very Small, Small, Regular, Very Large, Extra Wide and Full Width

### Layout Config

The layout config allows you to determine for which classes/queries should this **list-result page** be used.

* **Use for classes:** Select the classes that will use this page
* **Use for selections:** Select the queries that will use this page
* **Use for links:** Select which class links will use this page

## List Item Layout

The **list item layout** page can be used to define how an individual item (for instance from a set of search results) should appear in Represents List, Timelines or Kanban Cards.

{% hint style="info" %}
List Item Layout is prioritized and will always be used to display your items when used, overriding alternate display layouts such as HTML layouts.
{% endhint %}

![List Item Layout Configuration](/files/-MFX6qNOvLVzAonCu4GV)

### Name

The name property for a **list item layout** is used to define a unique name for the page.

### Description

The description field can be used to describe the purposes of your **list item layout** to the users.

### Page Size

The size determines the dimensions of the page to be displayed.

Supported values for **Page Size**:\
Very Small, Small, Regular, Very Large, Extra Wide and Full Width

### Layout for Class

The **list item layout** needs to be created for use within the context of a particular class. This field allows you to set which class should be associated to your page.

## Dashboard Widget

The **dashboard widget** is a small layout element which can users can pin on their dashboards.

![Dashboard Widget Configurations](/files/-MHqmixV8ISVwTjt84mx)

### Name

The name property for a **dashboard widget** is used to define a unique name for the page.

### Description

The description field can be used to describe the purposes of your **dashboard widget** to the users.

### Widget Size

You can determine the size of your widget for dashboards.

* **Widget Size-X:** Size of widget horizontally (x-axis)
* **Widget Size-Y:** Size of widget vertically (y-axis)

{% hint style="info" %}
Widget size values (both horizontally and vertically) vary between 1 to 4, where 4 takes the most space possible for a widget on the dashboard.
{% endhint %}

## App Dashboard

Instead of creating a single widget layout using the **dashboard widget** page type, a complete dashboard can be defined using **app dashboard**.

When adding new dashboard tabs, an end user can select your **app dashboard** page to add a full pre-configured dashboard layout to their tabs.

![App Dashboard Configuration](/files/-MFX7QFRDkZ3Azq0w0Ia)

### Name

The name property for an **app dashboard** is used to define a unique name for the page.

### Description

The description field can be used to describe the purposes of your **app dashboard** to the users.

## Base Layout

The Base Layout is a special layout that is used for instances where no custom object page layout has been defined yet.

{% hint style="info" %}
When no base layouts are specified, the platform will generate one for you.\
Alternately, if a base layout has been created, the platform will use it as the fallback item.
{% endhint %}


# Fields and Links

Layouts are closely related to class definitions. This section explores how application classes and its properties can be integrated into a layout for further interaction from the end user.

## Overview

Based on the selected page type, the layout designer provides special controls to display object fields and links on the layout.

{% hint style="info" %}
Fields and links are supported on pages that are bound to a class only, such as [Object Page](/building-an-application/views/design-ui/page-types#object-page).
{% endhint %}

In order to access the list of fields and links, select your page from the layouts manager and expand the **Fields** or **Links** list in the layout elements panel on the left.

![](/files/-MJ3cYEh5cy6Ji82ER8x)

Fields and/or Links can be added to your layout by dragging the selected item and dropping it in the main designer canvas.

![Adding a Field Element to your Layout](/files/-MHl_AiLYNSHnb2WrseD)

Each field control can be customized by selecting the control in the main designer canvas and clicking on the gear icon to access its properties.

## Fields

Based on the class definition bound to the page, field controls are available for every field in the linked class. The controls can be added to your layout to display the field value for the currently selected object.

![Field Elements in Layout Designer](/files/-MHlPIqWZ0FBB68rL547)

{% hint style="info" %}
Field controls are categorized to help you find your required fields easier.

* **All**: Displays all the fields in the class
* **Id**: Displays standard fields that help identify the class
* **Main**: Displays content fields that you added to the class
  {% endhint %}

### General

General properties define the basic format of your field control in your layout.

<figure><img src="/files/iUW015Ts909ByVSwYLiw" alt=""><figcaption><p>General Properties</p></figcaption></figure>

#### Force Read-Only

Enabling this options prevents the field value to be modified by any user.

{% hint style="danger" %}
Even users with administrator rights cannot modify a **read-only** field.
{% endhint %}

#### Item Appearance

Defines which control should be used to display the field.

{% hint style="info" %}
The controls available are based on the field type. More information about field types and controls can be found in [Data Modelling](/building-an-application/data/data-modelling/field#control-type).
{% endhint %}

#### Full Size

Enables setting the full size of the field.

### Label

Label properties allows you to customize the appearance of your field label.

<figure><img src="/files/poPDXv05kbLLm1YHe3SE" alt=""><figcaption><p>Label Properties</p></figcaption></figure>

#### Show Label

Determines whether the field label should be visible or not.

#### Use Custom Label

Enabling this option allows you to overwrite the field label derived from the field's name in its class definition. This option requires further configuration when activated.

* **Custom Label Text**\
  Determines the text that should be displayed as the field label.

#### Icon

Allows you to select an icon from a pre-defined list to appear alongside your field label.

* **Icon Display Options**\
  Allows you to manipulate the icon displayed.\
  *Options: Rotate 45°, Rotate 90°, Rotate 135°, Rotate 180°, Rotate 225°, Rotate 270°, Rotate 315°, Flip Horizontal, Flip Vertical, Spin, Pulse-Spin*

#### Label Position

Determines where the label should be place relative to the field value.\
*Options: Top, Left.*

### Html Editor Settings

*Available only if the field is using a **HtmlEditor** as display control.*

Html Editor Settings allows you to set the appearance and complexity of the Html toolbar for the user.

<figure><img src="/files/gq6kCBlYtXVkp02oZZ91" alt=""><figcaption><p>Html Editor Settings</p></figcaption></figure>

Same set of options Display Inline and Single Line Toolbar is available for usage of the Html Editor on the desktop and mobile devices (represented here with Desktop and Mobile tabs).

Display Inline enables showing of the Html Editor toolbar supplementary, just in time when user selects the area for data input.

<figure><img src="/files/QXMRzCCn6imcle0BpI1f" alt=""><figcaption><p>Display Inline</p></figcaption></figure>

If Display Inline is not selected, then Html Editor toolbar is shown fixed above the input area.

<figure><img src="/files/GpDxOZ6EpUcwwKrVRUao" alt=""><figcaption><p>Html Editor Fixed Toolbar</p></figcaption></figure>

Within Predefined Presence two options can be chosen:

* Medium
* Minimal

Each of the options sets number of buttons to invisible, where Minimal disables less buttons visible in the toolbar than the Medium option.

In addition, in the section Disabled Buttons user is able to mark the buttons which shall be disabled/not shown in the HtmlEditor toolbar also manually

### Html Inline Images

*Available only if the field is using a **HtmlEditor** as display control.*

<figure><img src="/files/QzOuAfV77ICTv8hClU7i" alt=""><figcaption><p>Sample Use of Section Html Inline Images</p></figcaption></figure>

Html Inline Images allows you to define a linked class that is used to retrieve and display inline images. When a inline image specification is found, then the image document of the linked class with the given Image-ID is displayed. When no document is found, then the standard missing image notification is displayed.

Independent of the Desktop or Mobile choice you can configure:

* Inline Images Link: The link to a document supporting class (direct).
* Inline Image Match Field: The ID field of the linked class to identify an instance with (with the Image-ID).

### Text Box Settings

*Available only if the field is using a **TextBox** as display control.*\
Text Box Settings allows you to customize your textbox design for the field.

#### Formatter

Determines how your field values should be formatted when displayed.

* **None**\
  No formatting is applied.<br>
* **Integer - File Size**\
  Field value is displayed as a user-friendly file size string (e.g. 24.5MB)<br>
* **Numeric - Percent**\
  Field value is displayed as a percentage.

### Text Area Settings

*Available only if the field is using **TextArea** as display control.*\
Text Area Settings allow you to customize how your text area control should appear on the layout.

#### Text Area Height

Determines the number of rows (between 1 to 6) that should be provided for the Text Area control.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contain help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your control.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text tooltip should be displayed relative to your control.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

### Date or Time Settings

Available only if the field is using **Calendar**, **TimePicker** or **DatePicker**.\
No icons are shown when 'Show Calendar Icon' is unchecked.The picker drop down is displayed on input focus if 'Show Calendar Icon' is unchecked.

## Links

Based on the class definition bound to the page, controls are provided for every class link defined in the class designer.

![Link Elements in Layout Designer](/files/-MHlPpwfPWzy2ZGfdib1)

{% hint style="info" %}
Read more about class links in [Data Modelling](/building-an-application/data/data-modelling/link).
{% endhint %}

Similar to [field controls](/building-an-application/views/design-ui/fields-and-links#fields), the appearance of link controls can be customized in their configuration settings.


# Layout Controls

Layouts created in the Layout Designer require visual elements to provide the best application experience. This section covers the different components available on the platform for this purpose.

## Overview

The platform supports various layout elements for different types of inputs and controls you wish to present to the user.

{% hint style="info" %}
Layout controls can be browsed and used only after the page has been created.
{% endhint %}

In order to access the list of layout controls, select your page from the layouts manager and expand the **Controls** list in the layout elements panel on the left.

![Accessing Layout Controls](/files/-MHHew2mSeFguZP7Mmgr)

Layout controls are categorized as Actions, Panels, Sections, Lists and Input.

| Category | Purpose                                                            |
| -------- | ------------------------------------------------------------------ |
| Actions  | Executes the configured action on click (e.g. start a workflow)    |
| Panels   | Grouping of elements for more control over the layout design       |
| Sections | Provides components to further style the layout (e.g. page header) |
| Lists    | Grouping multiple objects of the same type as an ordered list      |
| Input    | Independent input fields to support other functional elements      |

## Adding Layout Controls

Controls can be added to your layout by dragging your selected control and dropping it in the main designer canvas.

![Adding a Control to the Layout](/files/-MHHgO4zv_KxLOzGrNTr)

Some layouts allows you to add nested controls, which can be done by dragging the control into the drop area for your layout and releasing it.

![Adding a Nested Control](/files/-MHHjF5w9yl8a-rkmOcB)

Multiple controls can be added to a single layout by dragging the next selected control over an existing one on the main designer canvas. The control can either be added above the existing one or below.

Dragging a control and dropping it on the left side of an existing control adds it above the existing one. Similarly, dropping the control on the right side of an existing control adds it below the existing one.

## Customizing Layout Controls

Customization options for layout controls can be accessed by clicking on the control name in the main designer canvas. This reveals an options ribbon that allow you to:

* Move your control's position in the layout
* Open control properties for further configurations
* Open control in a separate tab in the layout designer
* Delete control from your layout permanently

![Layout Control Customization Options](/files/-MHHl9hL_pnZK72zsUV1)

In case you have multiple controls in your layout, additional options are provided to help move your control above or below the others.

![Moving a Control on the Layout](/files/-MJ3d_QX1oURXuTuslbZ)

## Supported Layout Controls

* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)
  * [Action List](/building-an-application/views/design-ui/layout-controls/actions#action-list)
  * [Execute Command Box](/building-an-application/views/design-ui/layout-controls/actions#execute-command-box)
  * [View Changer](/building-an-application/views/design-ui/layout-controls/actions#view-changer)
* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Collapse Panel](/building-an-application/views/design-ui/layout-controls/panels#collapse-panel)
  * [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
  * [Dashboard Panel](/building-an-application/views/design-ui/layout-controls/panels#dashboard-panel)
  * [Docking Container](/building-an-application/views/design-ui/layout-controls/panels#docking-container)
  * [Docking Item](/building-an-application/views/design-ui/layout-controls/panels#docking-item)
  * [Field List Panel](/building-an-application/views/design-ui/layout-controls/panels#field-list-panel)
  * [Flex Panel](/building-an-application/views/design-ui/layout-controls/panels#flex-panel)
  * [For Each Class](/building-an-application/views/design-ui/layout-controls/panels#for-each-class)
  * [Horizontal Panel](/building-an-application/views/design-ui/layout-controls/panels#horizontal-panel)
  * [Html Panel](/building-an-application/views/design-ui/layout-controls/panels#html-panel)
  * [Instance Details](/building-an-application/views/design-ui/layout-controls/panels#instance-details)
  * [Instance Links Panel](/building-an-application/views/design-ui/layout-controls/panels#instance-links-panel)
  * [Layout Container](/building-an-application/views/design-ui/layout-controls/panels#layout-container)
  * [Menu Context](/building-an-application/views/design-ui/layout-controls/panels#menu-context)
  * [Panel](/building-an-application/views/design-ui/layout-controls/panels#panel)
  * [Popout Panel](/building-an-application/views/design-ui/layout-controls/panels#popout-panel)
  * [Quota Display](/building-an-application/views/design-ui/layout-controls/panels#quota-display)
  * [Scroll Panel](/building-an-application/views/design-ui/layout-controls/panels#scroll-panel)
  * [Slide Down Panel](/building-an-application/views/design-ui/layout-controls/panels#slide-down-panel)
  * [Tab List Panel](/building-an-application/views/design-ui/layout-controls/panels#tab-list-panel)
  * [Tab Panel](/building-an-application/views/design-ui/layout-controls/panels#tab-panel)
  * [Toolbar](/building-an-application/views/design-ui/layout-controls/panels#toolbar)
  * [View Dependent Panel](/building-an-application/views/design-ui/layout-controls/panels#view-dependent-panel)
* [Sections](/building-an-application/views/design-ui/layout-controls/sections)
  * [Horizontal Line](/building-an-application/views/design-ui/layout-controls/sections#horizontal-line)
  * [Info Box](/building-an-application/views/design-ui/layout-controls/sections#info-box)
  * [Label](/building-an-application/views/design-ui/layout-controls/sections#label)
  * [Page Header](/building-an-application/views/design-ui/layout-controls/sections#page-header)
  * [Picture Box](/building-an-application/views/design-ui/layout-controls/sections#picture-box)
* [Lists](/building-an-application/views/design-ui/layout-controls/lists)
  * [Canvas List](/building-an-application/views/design-ui/layout-controls/lists#canvas-list)
  * [Instance Context](/building-an-application/views/design-ui/layout-controls/lists#instance-context)
  * [Instance Frame](/building-an-application/views/design-ui/layout-controls/lists#instance-frame)
  * [List](/building-an-application/views/design-ui/layout-controls/lists#list)
  * [List Context](/building-an-application/views/design-ui/layout-controls/lists#list-context)
* [Input](/building-an-application/views/design-ui/layout-controls/input)
  * [Filter Input](/building-an-application/views/design-ui/layout-controls/input#filter-input)


# Actions

This section covers action controls that consist of components allowing the user to trigger commands when interacting with the application.

## Overview

Action controls allows the user to execute a command with a single click. Each action control can be customized by selecting the control in the main designer canvas and clicking on the gear icon to access its properties.

![Accessing Action Control Properties](/files/-MHHmWhvB17w8i4Ld5Iq)

The platform supports different types of action controls.

* [Action](/building-an-application/views/design-ui/layout-controls/actions#action)
* [Action List](/building-an-application/views/design-ui/layout-controls/actions#action-list)
* [Execute Command Box](/building-an-application/views/design-ui/layout-controls/actions#execute-command-box)
* [View Changer](/building-an-application/views/design-ui/layout-controls/actions#view-changer)

## Action

The **Action** control allows the user to run a specific command on click. This can be configured via the control properties in the layout designer.

![Sample Action Control](/files/-MHSEmm-xTSv6C5otFeN)

### Appearance

Appearance properties allows you to customize how your action control is rendered on the user interface.

#### Text

The text property defines what is displayed on the user interface to represent your action control.

{% hint style="info" %}
**Text** supports multiple languages.
{% endhint %}

#### Hint

The hint property defines a help text that allows the user to easily understand the purpose of the control.

{% hint style="info" %}
**Hint** supports multiple languages.
{% endhint %}

#### Small Display

Enabling this option allows the control to adapt to smaller display sizes.

#### Align Right

Enabling this options allows the action control to be positioned to the right of the display.

{% hint style="info" %}
By default, all controls are positioned on the left of the screen.
{% endhint %}

#### Content Full Left

All content related to the action control are aligned to the left of the display.

#### Display Style

Setting the display style allows the action control to be styled as a button.

Supported styles:

* Normal
* Green Button
* Red Button
* Blue Button
* Dark Blue Button
* Cyan Button
* Grey Button
* Light Button

### Icon

Icon properties allows you customize an icon associated to your control.

#### Icon

The icon property allows you to set an icon (from a predefined list) to your action control.

#### Align Icon Right

Enabling this option causes the icon to be displayed on the right of your control.

{% hint style="info" %}
By default, icons are displayed to the left of your control.
{% endhint %}

### Style

Style properties allows you to further customize the look of your control using CSS notations such as hex codes for color.

#### CSS Color

Defines the font color of your element.

#### CSS Size

Defines the font size of your element.

#### CSS Font Weight

Defines the font weight (e.g. bold) of your element.

#### Custom CSS Attributes

Allows you to set CSS rules to further style the element.

#### Custom CSS Attributes - Bright Themes

Allows you to set CSS rules that apply to your element only when the application is used in Bright Theme.

#### Custom CSS Attributes - Dark Themes

Allows you to set CSS rules that apply to your element only when the application is used in Dark Theme.

### Action

The action property allows you to define which command must be executed when the button is clicked. Each of the predefined commands are further documented below.

![Action Property in an Action Control](/files/-MHHoitOQPe1xVSgTWgx)

#### No Action

No commands are executed.

#### Clear Filters

Clears filters applied for the list .(e.g., control 'Filter Input' or column filters) inside a List Context.

<figure><img src="/files/Ave9bMcynwXdidINd18I" alt=""><figcaption><p>Clear Filters Action with Behaviours Options</p></figcaption></figure>

Clear filters Action has following behaviours:

* Default - Action is always displayed.
* Hide - Action is not displayed when a filter is not applied.
* Disable - Action is disabled when a filter is not applied.

<figure><img src="/files/J9LURnjvxFtsWN71QZII" alt=""><figcaption><p>Clear Filters Action with Disable Behaviour</p></figcaption></figure>

#### Discard Changes

Discards any changes made to the current instance of a class.

#### Show Tab

Opens a defined tab.

#### Open New Page

Opens a defined page from your application as a new page.\
*This option requires further configuration.*

![Open New Page Action Configuration](/files/-MHHqL73_f60gqwev9gF)

* **Page To Open**\
  Select the page that should be opened when the command is executed.

#### Open Object

Opens an object of the class associated to your page.\
*This option requires further configuration.*

![Open Object Action Configuration](/files/-MHHttSfTuzwdFlvOsSj)

* **Open Object Kind**\
  Select what type of object should be opened when the command is executed.

#### Delete Instance

Delete the current class instance opened in your page.

#### Save Instance

Save the current instance of a class opened in your page.

#### Refresh Page

Reload your application page.

#### Open Object Links

Open the links related to the current object instance loaded on your page.

#### Show Result List

Open a list of results based on the query assigned to your action.\
*This option requires further configuration.*

![Show Result List Action Configuration](/files/-MHHuAtlNyi6L2OhQ-pn)

* **Type of Data Source**\
  Allows you to define the items source for your query (supports: dynamic, selection, class).<br>
* **Selection Data**\
  *(Available only when Type of Data Source is set to Selection)*\
  Allows you to define which selection query should supply the result list items.<br>
* **Class Data**\
  *(Available only when Type of Data Source is set to Class)*\
  Allows you to define which class items should be loaded as the result list.

#### Change List Sorting

Change the sorting order of the a list on your page.

#### Expand All List Items

Expand all categories in your current list to reveal all list items.

#### Collapse All List Items

Collapse all categories in your current list to hide all list items.

#### Create New Instance (List)

Create a new instance of the current list on your page.

#### Execute Action

Allows an class action to be executed.\
*This option requires further configuration.*

![Execute Action Configuration](/files/-MHHuxWCHmlCEj2nR8bw)

* **Class containing the action**\
  Sets which class actions should be allowed to run when this control is clicked.<br>
* **Class action to execute**\
  *(Option is available only after the Class Containing The Action property is set)*\
  Sets the exact class action from the selected class that is executed when this control is clicked.<br>
* **Secondary Action**\
  Follow-up action executed when the main action is completed successfully.

#### Execute Instance Action

{% hint style="info" %}
This is allowed only in **Object Pages** as [documented here](/building-an-application/views/design-ui/page-types#object-page).
{% endhint %}

Allows a class instance action to be executed on the current instance of a class loaded in the page.\
This option requires further configuration.

![Execute Instance Action Configuration](/files/-MHHvMKftKlnk_BjxEft)

* **Class containing the action**\
  Sets which class actions should be allowed to run when this control is clicked.<br>
* **Class action to execute**\
  *(Option is available only after the Class Containing The Action property is set)*\
  Sets the exact class action from the selected class that is executed when this control is clicked.<br>
* **Secondary Action**\
  Follow-up action executed when the main action is completed successfully.

#### Execute Workflow

Allows a class workflow to be executed.\
This option requires further configuration.

![Execute Workflow Action Configuration](/files/-MHHwiElUhrNF1Enf0vo)

* **Class containing the workflow**\
  Sets which class workflows should be allowed to run when this control is clicked.<br>
* **Class workflow to execute**\
  *(Option is available only after the Class Containing The Workflow property is set)*\
  Sets the exact workflow from the selected class that is executed when this control is clicked.<br>
* **Secondary Action**

  Follow-up action executed when the main action is completed successfully.

#### Execute Instance Workflow

{% hint style="info" %}
This is allowed only in **Object Pages** as [documented here](/building-an-application/views/design-ui/page-types#object-page).
{% endhint %}

Allows a class workflow to be executed on the current instance of a class loaded in the page.\
This option requires further configuration.

![Execute Instance Workflow Configuration](/files/-MHHwxXb1qKwh58WQoLi)

* **Class containing the workflow**\
  Sets which class workflows should be allowed to run when this control is clicked.<br>
* **Class workflow to execute**\
  *(Option is available only after the Class Containing The Workflow property is set)*\
  Sets the exact workflow from the selected class that is executed when this control is clicked.<br>
* **Secondary Action**\
  Alternate action command executed should the class workflow be unavailable.

#### Open NM-Target Instance

Opens the object related (if any) to the current object loaded on your page.

#### Expand/Collapse Link Panel

Control is used as a toggle button to either show or hide all items in the link panel.

#### Open Data-Source Config

Opens the class data source configuration.

#### Jump to Previous Item

Opens the previous object instance from the list - from which the current object instance was loaded.

#### Jump to Next Item

Opens the next object instance in the list - from which the current object instance was loaded.

#### Show/Hide Popup Panel

Toggles the visibility of a popup panel.\
This option requires further configuration.

* **Panel Name**\
  Name of the panel that should be displayed or hidden.<br>
* **Popout Position**\
  Determines the position where the panel should appear.\
  Supported positions: Left, Right

#### Change Object Section

Changes the displayed content within the control object section to another value.

{% hint style="info" %}
An object section is similar to a custom component where you can build a small layout for a specific area of an object layout. These components are normally placed within the Object Section layout control.
{% endhint %}

#### Open Instance Chat

Opens the chat window and creates a chat group linked to the current instance.

{% hint style="info" %}
If a chat group for the instance already exists, it is opened instead.
{% endhint %}

#### Open Overlay with Section

Displays the object section as an overlay to the layout rather that within the layout itself.

#### Share Current Instance

Opens an overlay that allows you to share the current instance.

{% hint style="info" %}
Instances can only be shared to other members of your team. The selected member will receive a notification about the instance shared.
{% endhint %}

#### Open Activity

Opens a page to display the change history for the currently loaded instance.

#### Maximize Page

Resizes the current page to take the maximum screen space possible.

#### Restore Page

Re-opens a previously closed page.

#### Close Page

Closes the current page.

#### Pin Page

Allows the user to pin the current page to their workspace.

#### Unpin Page

Allows the user to unpin a previously pinned page from their workspace.

#### Run List Export

Choosing Run List Export action opens up a dialogue that requests in which format the data of the list control should be exported: CSV or Excel. All data is exported regardless of pagination and filters.

<figure><img src="/files/WQ3UMnFn8bs4IB5h4g4I" alt=""><figcaption></figcaption></figure>

If data is exported to Excel, the fields having the date or time type are formatted according to the following rules:

* Given the data type of a field is DateTime and the control type is neither Calendar, DatePicker, nor TimePicker, when the data of that field is exported to Excel, then the format of the cell is Date and Time.
* Given the control type of a field is Calendar, when the data of that field is exported to Excel, then the format of the cell is Date and Time.
* Given the control type of a field is DatePicker, when the data of that field is exported to Excel, then the format of the cell is Date.
* Given the control type of a field is TimePicker, when the data of that field is exported to Excel, then the format of the cell is Time.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your element.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text tooltip should be displayed relative to your control.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Action List

The action list control enables the user to run any actions from a class or selection query. The options available to the user can be customized in the control properties.

### General

General properties define which options should be made available to the user.

#### Show Classes (Yes/No)

Setting this to yes allows a list of all classes in your application to be displayed to the user.

#### Show Queries (Yes/No)

Setting this to yes allows a list of all selection queries in your application to be displayed to the user.

### Appearance

Appearance properties define how the items in your action list are displayed on the layout.

#### Class Icon

Defines an icon applied to each class displayed in your action list.

* **Icon Display Options**\
  Allows you to manipulate the icon displayed.\
  *Options: Rotate 45°, Rotate 90°, Rotate 135°, Rotate 180°, Rotate 225°, Rotate 270°, Rotate 315°, Flip Horizontal, Flip Vertical, Spin, Pulse-Spin*

#### Selection Icon

Defines an icon applied to each selection query displayed in your action list.

* **Icon Display Options**\
  Allows you to manipulate the icon displayed.

  *Options: Rotate 45°, Rotate 90°, Rotate 135°, Rotate 180°, Rotate 225°, Rotate 270°, Rotate 315°, Flip Horizontal, Flip Vertical, Spin, Pulse-Spin*

#### Separate Action Lists (Yes/No)

Setting this to yes separates your classes and selection queries into different lists on the layout.

## Execute Command Box

The Execute Command Box control allows the user to select a workflow from a list of all workflows available to the user within the current instance. The workflow can be selected from a dropdown list or by typing its name in the search box.

## View Changer

The platform allows you to define more than **one** layout for a single class. The View Changer action allows you to switch between your multiple possible layouts for your class dynamically.

{% hint style="info" %}
By default, the layout with the smallest **Layout Tab Index** is used for your class. This index value can be set in the [Page Settings](/building-an-application/views/design-ui/page-types).
{% endhint %}

### Appearance

Appearance properties allows you to customize how your control is rendered on the user interface.

#### Text

The text property defines what is displayed on the user interface to represent your control.

{% hint style="info" %}
**Text** supports multiple languages.
{% endhint %}

#### Hint

The hint property defines a help text that allows the user to easily understand the purpose of the control.

{% hint style="info" %}
**Hint** supports multiple languages.
{% endhint %}

#### Small Display

Enabling this option allows the control to adapt to smaller display sizes.

#### Align Right

Enabling this options allows the control to be positioned to the right of the display.

{% hint style="info" %}
By default, all controls are positioned on the left of the screen.
{% endhint %}

#### Content Full Left

All content related to the control are aligned to the left of the display.

#### Display Style

Setting the display style allows the control to be styled as a button.

Supported styles:

* Normal
* Green Button
* Red Button
* Blue Button
* Dark Blue Button
* Cyan Button
* Grey Button
* Light Button

### Icon

Icon properties allows you customize an icon associated to your control.

#### Icon

The icon property allows you to set an icon (from a predefined list) to your action control.

#### Align Icon Right

Enabling this option causes the icon to be displayed on the right of your control.

{% hint style="info" %}
By default, icons are displayed to the left of your control.
{% endhint %}

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your element.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text tooltip should be displayed relative to your control.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}


# Panels

This section covers panel controls that allows layouts to be graphically designed in various and flexible ways to provide for a great user experience when using an application.

## Overview

Panels allows the similar or related control elements to be regrouped in your layout. Each panel control can be customized by selecting the control in the main designer canvas and clicking on the gear icon to access its properties.

![Accessing Panel Properties](/files/-MHSUI9Tg4dRtPmvNfPf)

The platform supports different types of panels.

* [Collapse Panel](/building-an-application/views/design-ui/layout-controls/panels#collapse-panel)
* [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
* [Dashboard Panel](/building-an-application/views/design-ui/layout-controls/panels#dashboard-panel)
* [Docking Container](/building-an-application/views/design-ui/layout-controls/panels#docking-container)
* [Docking Item](/building-an-application/views/design-ui/layout-controls/panels#docking-item)
* [Field List Panel](/building-an-application/views/design-ui/layout-controls/panels#field-list-panel)
* [Flex Panel](/building-an-application/views/design-ui/layout-controls/panels#flex-panel)
* [For Each Class](/building-an-application/views/design-ui/layout-controls/panels#for-each-class)
* [Horizontal Panel](/building-an-application/views/design-ui/layout-controls/panels#horizontal-panel)
* [Html Panel](/building-an-application/views/design-ui/layout-controls/panels#html-panel)
* [Instance Details](/building-an-application/views/design-ui/layout-controls/panels#instance-details)
* [Instance Links Panel](/building-an-application/views/design-ui/layout-controls/panels#instance-links-panel)
* [Layout Container](/building-an-application/views/design-ui/layout-controls/panels#layout-container)
* [Menu Context](/building-an-application/views/design-ui/layout-controls/panels#menu-context)
* [Panel](/building-an-application/views/design-ui/layout-controls/panels#panel)
* [Popout Panel](/building-an-application/views/design-ui/layout-controls/panels#popout-panel)
* [Quota Display](/building-an-application/views/design-ui/layout-controls/panels#quota-display)
* [Scroll Panel](/building-an-application/views/design-ui/layout-controls/panels#scroll-panel)
* [Slide Down Panel](/building-an-application/views/design-ui/layout-controls/panels#slide-down-panel)
* [Tab List Panel](/building-an-application/views/design-ui/layout-controls/panels#tab-list-panel)
* [Tab Panel](/building-an-application/views/design-ui/layout-controls/panels#tab-panel)
* [Toolbar](/building-an-application/views/design-ui/layout-controls/panels#toolbar)
* [View Dependent Panel](/building-an-application/views/design-ui/layout-controls/panels#view-dependent-panel)

## Collapse Panel

The collapse panel allows other layout elements to be regrouped in a collapsible pane that can be expanded to reveal its contents or collapsed to hide its contents and show only the panel title.

![Sample Collapse Panel](/files/-MHSHnCNEXibfxMnAsyC)

### General

General properties define the basic format of the panel.

#### Text

Defines the panel title that is always visible (whether expanded or collapsed).

{% hint style="info" %}
Supports multiple languages
{% endhint %}

#### Icon

Defines an optional icon that can be set to appear alongside the panel title.

* **Icon Display Options** *(Available only when a panel icon has been set)*\
  Allows you to manipulate the panel icon.

  *Options: Rotate 45°, Rotate 90°, Rotate 135°, Rotate 180°, Rotate 225°, Rotate 270°, Rotate 315°, Flip Horizontal, Flip Vertical, Spin, Pulse-Spin*

#### Collapsed

Enabling this option allows the panel to be collapsed by default.

#### Draw Bottom Border

Enabling this option draws a line between the panel header (title section) and the panel content.

#### Display App Color

Enabling this option displays the app color alongside the panel title.

![Sample Collapse Panel Header with App Color](/files/-MHN07JG9a_Ed7b1qZHn)

#### Display Without Border

Renders the panel with a minimalistic look without any borders or shadows

### **Style**

Style properties allows you to further customize the look of your panel using CSS notations.

#### Background Type

Select a background shade from the list for your panel.

#### CSS Header Background

Set the CSS code to define the panel header background.

#### CSS Margin

Set the panel margin using CSS notation for margins.

{% hint style="info" %}
CSS margins can be set as a shorthand as `top right bottom left` (e.g. 10px 5px 5px 10px).
{% endhint %}

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Conditional Panel

The conditional panel is one that is displayed only when a specific condition is met.

### General

General properties define the basic properties of the panel.

#### Condition

Define the statement that needs to be compared to determine whether the condition is met.

{% hint style="success" %}
The conditional statement can include expressions from the **Expression List** provided to also make use of application properties (such as application name) and other configuration values.

Expressions:

* {{!app.id}}: Application Id
* {{!app.name}}: Application name
* {{!page.name}}: Application page
* {{!team.id}}: Team Id
* {{!team.name}}: Team name
* {{controller}}: Selected controller
* classId: Id of current class
* className: Name of current class
* instanceId: Id of current instance
* name: Name of current instance
* nmTargetInstance: Id of the NM target instance
* options.autoSave: Is Auto-Save enabled in the class designer
* options.hasActions: Element has defined actions
  {% endhint %}

#### Compare Operation

Defines the comparison method that will be used to determine whether the condition is met.

Supported operations:

* Equals (=)
* Not equals (!=)
* Less than (<)
* Less than or equals (<=)
* Greater than (>)
* Greater than or equals (>=)
* Contains (used for text comparisons)
* Empty

#### Compare To Value

Determines what the conditional statement should be compared to using the above compare operation.

Supported values:

* True
* False
* Null
* Value *(allows use of custom values)*

## Conditional Panel2

The conditional panel2 is displayed only when a specific condition is met.

### General

In the collapse panel General it is possible to choose the condition type for which the condition parameters can be set.

Following condition types can be chosen:

* Expression
* Feature
* Selection
* Source

### Expression

Section for setting expression, compare operation and compare to value as condition parameters.

#### Expression

The conditional statement can include expressions from the **Expression List.**&#x20;

Possible expressions:

* {{!app.id}}: Application Id
* {{!app.name}}: Application name
* {{!page.name}}: Application page
* {{!team.id}}: Team Id
* {{!team.name}}: Team name
* {{controller}}: Selected controller

#### Compare Operation

Defines the comparison method that will be used to determine whether the condition is met.

Supported operations:

* Contains (used for text comparisons)
* Not contains
* Equals (=)
* Not equals (!=)
* Greater than or equals (>=)
* Greater than (>)
* Less than or equals (<=)
* Less than (<)
* Empty

#### Compare To Value

Determines what the conditional statement should be compared to using the compare operation.

Supported values:

* Value *(allows use of custom values)*
* Null
* False
* True

### Feature

Section for choosing feature, feature value, compare operation and compare to value.

#### Feature

Choose a feature that can be used in the context of the layout (the app or all parent apps).

#### Feature Value

Choose a feature value to compare with. Possible Feature Values are:

* User has access (saved as 'UserHasAccess'): Returns a Boolean value on whether the user has access to the chosen feature.

#### Compare Operation

Defines the comparison method that will be used to determine whether the condition is met.

Supported operations:

* Contains (used for text comparisons)
* Not contains
* Equals (=)
* Not equals (!=)
* Greater than or equals (>=)
* Greater than (>)
* Less than or equals (<=)
* Less than (<)
* Empty

#### Compare To Value

Determines what the conditional statement should be compared to using the compare operation.

Supported values:

* Value *(allows use of custom values)*
* Null
* False
* True

### Selection

Section for choosing selection, operator and, in the cases where operator allows it, the value to compare to.

#### Selection

The selection for which the number of result items is taken as a condition parameter.

#### Operator

Defines the comparison method that will be used to determine whether the condition is met.

Supported operations:

* No Entries
* Has Entries
* Count = (Equals)
* Count != (Not equals)
* Count < (Less than)
* Count <= (Less than or equals)
* Count > (Greater than)
* Count >= (Greater than or equals)

#### Value

Is a custom value to which the selection output is compared to with the chosen operator. Not available for operators *No Entries* and *Has Entries.*&#x20;

### Source

Section for setting source, source value, compare operation and compare to value as condition parameters.

#### Source

Source that can be used in the context of the layout (the app or all parent apps).

#### Source value

Source value to compare with:

* Is configured (saved as 'IsConfigured'): Returns a Boolean value on whether the chosen source is configured.

#### Compare Operation

Defines the comparison method that will be used to determine whether the condition is met.

Supported operations:

* Contains (used for text comparisons)
* Not contains
* Equals (=)
* Not equals (!=)
* Greater than or equals (>=)
* Greater than (>)
* Less than or equals (<=)
* Less than (<)
* Empty

#### Compare To Value

Determines what the conditional statement should be compared to using the above compare operation.

Supported values:

* Value *(allows use of custom values)*
* Null
* False
* True

## Dashboard Panel

A dashboard panel is a special panel that can be used alone on a page without the need for a layout container or other panel prerequisites. Once added to your main designer canvas, a series of options are available to tweak the look and functionality of your dashboard panel.

{% hint style="danger" %}
It is currently not possible to integrate the dashboard panel into other layouts.
{% endhint %}

![Dashboard Panel Layout Preview](/files/-MHN0lYb7Tzoya00CpWS)

The dashboard panel consists of a tabbed view that can regroup different types of widgets.

### Panel Design

On the top bar of the dashboard panel (design mode), a few options are available to provide general design options to customize your panel.

#### Reset (todo: add fa-close icon)

Discards all changes made in the dashboard panel.

#### Settings (todo: add gear icon)

Provides designer options to further customize the dashboard panel

#### Save and Close (todo: add fa-check icon)

Saves the changes made to the design of the dashboard panel and exits the design mode.

#### Add Widget (todo: add fa-plus icon)

Opens the widget configuration window to assist in creating a widget in the current dashboard tab.

### Manage Tabs

Dashboard panels can consist of several tabs which can be customized individually. The options available can be found on the tab bar itself when in design mode (see [Settings ](/building-an-application/views/design-ui/layout-controls/panels#settings-todo-add-gear-icon)above).

#### Edit Tab&#x20;

Press Edit Tab ![](/files/DCnSEPaFYWECTPdd21eC) to change the tab title and choose for which users or groups the dashboard tab will be visible. Setting the dashboard tab to be visible only for certain users or groups avoid overloading of information for users/groups for whom these information are not useful or required. If no users or groups have been selected then the dashboard tab is shown for everyone.&#x20;

<div><figure><img src="/files/Prc7Aw1fbxYICaeVcW5U" alt=""><figcaption><p>Edit Tab Users Selection</p></figcaption></figure> <figure><img src="/files/jgKayYUWJxVZsE72uGlm" alt=""><figcaption><p>Edit Tab Groups Selection</p></figcaption></figure></div>

#### Delete Tab (todo: add fa-delete icon)

Deletes the tab permanently *(available only for 2nd tab and upwards)*.

#### Create New Tab (todo: add fa-square-plus icon)

Creates a new tab for your dashboard panel.

### Create Widgets

The main content of your dashboard panel consists of widgets.&#x20;

{% hint style="info" %}
See [how to create widgets](/building-an-application/views/design-ui/layout-controls/panels#add-widget-todo-add-fa-plus-icon) above.
{% endhint %}

The widget creation wizard consists of multiple steps.

#### Select a Widget Type

The first step is to select the kind of widget that you wish to add to the dashboard.

Supported options:

* **Option 1: Display a List**\
  This widget shows a list of items or chart derived from a data source set in the next step.<br>
* **Option 2: Display a Count**\
  This widget shows a simple count determined from a list of item set in the next step.<br>
* **Option 3: Pre-defined Widget**\
  Widgets composed externally and specially prepared for dashboards.\
  Choosing this option leads you to select a widget template (predefined in your application) to complete the widget creation process.

#### Select your List Type

*Available only when Options 1 or 2 have been selected in the first step.*\
The next step is to select the type of list which should be used in your widget.

Options available:

* **Option 1: List of All Items**\
  This list will select all items of the kind you choose in the next step.<br>
* **Option 2: Pre-defined Query**\
  Select from a list of pre-defined selection queries in the next step.

#### Select List

Based on the previous step, you will be able to select an item from a list of classes or selection queries (categorized by application) in this step. This will determine exactly what items will be fed to the widget.

#### Customization

The last step allows you to customize some optional appearance settings.

* **Options**\
  Additional options to determine how the widget content must be displayed.

  * Don't group the items: Enabling this prevents items to be categorized as subentries.

* **Header Content**\
  Defines what is displayed in the widget header.<br>

* **Footer Content**\
  Defines what is displayed in the widget footer.

Once your widget is created, a preview is loaded on the designer to help visualize your final layout.

### Customize Widgets

Selecting a widget in your dashboard design reveals the widget customization options at the top of the widget in design mode.

#### Expand To Fit

Allows the widget to expand and take the maximum space available in the dashboard panel both horizontally and vertically.

#### Horizontal Width

Controls how much space (from 1 to 4) should the widget take horizontally.

#### Vertical Height

Controls how much space (from 1 to 4) should the widget take vertically.

#### Settings

Allows you to modify the widget appearance settings previously [defined at creation time](/building-an-application/views/design-ui/layout-controls/panels#customization).

#### Delete Widget

Deletes the widget from your dashboard panel.

### Panel Properties

Similar to other panels, the dashboard panel has classic properties that can be accessed via the configuration ribbon (appears when the panel is selected).

#### General

General properties define the basic format of the panel.

* **Dashboard Not Editable**\
  Prevents users from editing their dashboard design on their own.<br>
* **Disable Close Button**\
  Prevents the user from being able to close the dashboard panel.

## Docking Container

{% hint style="warning" %}
Need more information
{% endhint %}

## Docking Item

{% hint style="warning" %}
Need more information
{% endhint %}

## Field List Panel

The Field List Panel is a special panel that is only available for class-bound pages such as [Object Page](/building-an-application/views/design-ui/page-types#object-page). The panel is used to display all fields in the object as a list.

![Field List Panel Properties](/files/-MHN1H0foaO-AYEu030G)

### General

General properties define the basic layout of your panel.

#### Draw Lines on Hover

Enabling this options allows your panel content to be underlined on hover.

#### Margin

Defines the margin around your panel, offsetting it from the edges of its parent element.

{% hint style="info" %}
The margin value is set using CSS notation.
{% endhint %}

#### Padding

Defines a padding inside your panel, offsetting your elements from the panel edges.

{% hint style="info" %}
The padding value is set using CSS notation.
{% endhint %}

#### Background Type

Defines the background shade of the panel from a predefined list of colors.

## Flex Panel

Flex panels are special panels that provide flex properties to control how the panel content is positioned horizontally and vertically.

{% hint style="info" %}
Flex positioning is closely related to flexboxes used in web design.
{% endhint %}

![Sample Flex Panel allowing content wrapping](/files/-MHSWiF61GS5en3RQz72)

### Container Configuration

Container configuration properties allows you to set the basic flex properties for your panel.

#### Item Wrap

Determines whether items should follow wrap-around ordering or overflow beyond the panel width.\
*Available options: No Wrap (default), Wrap, Wrap - Reverse*

**Content Justify**

Determines how the content should be positioned in the flex direction (see below).\
*Available options: Stretch (default), Start, End, Center, Space Between, Space Around, Space Evenly*

#### Direction

Determines the flex direction for your panel\
*Available options: Horizontal (default), Vertical*

#### Full Size

Enabling this option allows your panel to take the maximum space it requires for its contents.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## For Each Class

The For Each Class panel is designed specially to work with classes. The content of this panel consists of all the actions in a specific class from your application.

![For Each Class Panel Properties](/files/-MHN2ddrA_TE3Xyf4G1I)

### Appearance

Appearance properties allows you to customize how your panel is rendered on the user interface.

#### Generate Action Link

Enabling this option provides a link to a particular action.

#### Action Icon

Defines the icon displayed alongside each class shown in the panel.

* **Icon Display Options** *(Available only when a panel icon has been set)*\
  Allows you to manipulate the panel icon.

  *Options: Rotate 45°, Rotate 90°, Rotate 135°, Rotate 180°, Rotate 225°, Rotate 270°, Rotate 315°, Flip Horizontal, Flip Vertical, Spin, Pulse-Spin*

#### Base Class

Specifies the class for which all actions are displayed.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Horizontal Panel

By default, panels are designed to position elements vertically (stacked on top of each other). The horizontal panel allows you to group layout elements horizontally - next to each other.

![Sample Horizontal Panel](/files/-MHSVAE9HNQQVM4wW7XF)

### General

General properties define the basic format of the panel. Each element added to your panel adds a new row to allow for configuration of the width allocated to the element.

The size configuration is provided for **Small** and **Normal** sized displays to cater for responsive resizing on both mobile phones and standard monitors.

{% hint style="info" %}
The width of each element on both small and normal displays are defined as a ratio by 12 - whereby 12 takes up the entire screen width.

**Important:** The size allocation must not exceed 12 for any element in the configurations.
{% endhint %}

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Html Panel

HTML Panels allow you to design your panel using HTML5 expressions. It provides more design flexibility than the other panels but requires manual coding in order to be used.

### General

General properties allows you to customize the basic format of your panel.

#### Html

Defines the HTML5 code that is rendered when your panel is used.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Instance Details

The instance details panel can only be used in pages bound to a class, such as [Object Page](/building-an-application/views/design-ui/page-types#object-page). It allows you to display all details of the object currently loaded on the page in one concise panel.

{% hint style="info" %}
This panel does not have any additional configurations.
{% endhint %}

## Instance Links Panel

The instance links panel can only be used in pages bound to a class, such as [Object Page](/building-an-application/views/design-ui/page-types#object-page). It allows you to display all class links found in the object currently loaded on the application page. It consists of an expander which, when clicked, toggles the visibility of all class links.

![Instance Links Panel Properties](/files/-MHN497PGFSrsnMrEFGX)

### General

General properties define the basic configurations of your panel.

#### Expander Text

Defines the text that is displayed as the expander.

{% hint style="info" %}
This property supports multiple languages.
{% endhint %}

#### Number of Links to Display

Defines the number of class links that should be shown in your panel.

{% hint style="info" %}
Setting the Number of Links to Display to **0** causes all class links to be shown.
{% endhint %}

#### Initially Expanded

Enabling this causes the expander to be in the expanded state, hence allowing the class links to be visible by default.

#### Display "Parent Item"

Enabling this ensures that the parent element is shown on your panel.

#### Display "All Links"

Enabling this ensures that all class links are displayed.

#### Display With Padding

Enabling this causes your panel elements to be offset in all directions from the edge of the panel.

#### Show Tree-Link

Enabling this displays the link tree belonging to the element for all connected links.

## Layout Container

The Layout Container is used to open layouts as separate application windows rather than in the same parent window. It makes use of panels for the header, the main content area and the footer.

{% hint style="success" %}
It is recommended to use this Layout Template for every object and application page.
{% endhint %}

![Sample Layout Container showing the drop areas](/files/-MHN4fqQTj0nOgzGnd6-)

The Layout Container has few configuration requirements as the content is loaded as separate panels.

![Layout Container Configuration](/files/-MHN6iD5OxYpxJRYUNNV)

### General

General properties define the basic format of your container.

#### Has West Panel

Enabling this adds a panel on the left side of your container along with the default header, main and footer panels. This requires additional configurations to define how the west panel should be used.

* **Mobile Has West Panel**\
  Enabling this ensures that the west panel is shown on mobile devices and small displays as well.

#### Has East Panel

Enabling this adds a panel on the right side of your container along with the default header, main and footer panels. This requires additional configurations to define how the east panel should be used.

* **Mobile Has East Panel**\
  Enabling this ensures that the east panel is shown on mobile devices and small displays as well.

### West

The west configuration section is available only when **Has West Panel** is enabled.

#### West Width (In Pixel)

Defines the width of the west panel by pixels.

{% hint style="info" %}
Default width is set to 200px.
{% endhint %}

#### Is Closable

Allows the user to close the west panel manually.

### East

The east configuration section is available only when **Has East Panel** is enabled.

#### East Width (In Pixel)

Defines the width of the east panel by pixels.

{% hint style="info" %}
Default width is set to 200px.
{% endhint %}

#### Is Closable

Allows the user to close the east panel manually.

## Menu Context

{% hint style="warning" %}
Need more information
{% endhint %}

## Panel

The Panel is the simplest form of panels that serves to regroup any number of element.

![Panel Properties](/files/-MHN6xcVqBzFNbccodrc)

### General

General properties define the basic format of the panel element.

#### Margin

Defines the margin around the panel, offsetting the panel from its parent element.

#### Padding

Defines the padding inside the panel, offsetting the panel elements from the panel edges.

#### Background Type

Defines the background shade of the panel from a predefined list of colors.

#### Background Image

Defines the background image from images in your application.

### Style

Style properties allow for further customization of the panel interface.

#### Other Custom Styles

Defines additional style commands written in CSS notation.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Popout Panel

Popout panels allows your content to be presented in a popout window that can be triggered manually. Once added to your layout, additional layout elements can be added to the popout panel similar to regular panels.

![Popout Panel Properties](/files/-MHN7BtDjFObZX5j7QKn)

### General

General properties define the basic design of the panel.

#### Docking Title

Defines the title for your popout window.

#### Control Name

Defines the name for your layout control.

#### Initially Closed

Enabling this option causes the popout panel to be closed by default.

### Style

Style properties allow further customization of your panel design.

#### Other Custom Styles

Defines additional style commands written in CSS notation.

#### Margin

Defines the margin around your panel, offsetting it from the edges of its parent element.

{% hint style="info" %}
The margin value is set using CSS notation.
{% endhint %}

#### Padding

Defines a padding inside your panel, offsetting your elements from the panel edges.

{% hint style="info" %}
The padding value is set using CSS notation.
{% endhint %}

#### Background Type

Defines the background shade of the panel from a predefined list of colors.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Quota Display

Quota Display is a special panel that spans across the width of its parent element displaying some statistical information about your application, such as amount of space used and remaining.

{% hint style="info" %}
Quota Display does not have additional configurations.
{% endhint %}

## Scroll Panel

Scroll panels regroup elements similar to a basic [Panel](/building-an-application/views/design-ui/layout-controls/panels#panel), with the added functionality of allowing users to scroll through the panel. This is especially useful in content-intensive applications and when using lists.

![Scroll Panel Properties](/files/-MHN7Y6BLwMdRXncvsmi)

### General

General properties define the basic format of the scroll panel.

#### Full Size

Enables the scroll panel to take up the maximum screen space available to it.

#### Vertical Scroll Bar

Enabling this ensures that a vertical scroll bar is made available to the user.

#### Horizontal Scroll Bar

Enabling this ensures that a horizontal scroll bar is made available to the user.

#### Background Type

Defines the background shade of the panel from a predefined list of colors.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Slide Down Panel

The slide down panel is a basic collapsible panel. It allows its layout elements to be shown or hidden as the panel is expanded or collapsed. This is particularly useful to provide some control over the amount of space used by your content.

The slide down panel provides an expander that is always visible and controls the visibility of its contents when clicked.

![Sample Slide Down Panel](/files/-MHSL_epihoD7z8fL56b)

### General

General properties define the basic design of your slide down panel.

#### Text

Defines the panel title that is always visible on the panel slider.

{% hint style="info" %}
Supports multiple languages
{% endhint %}

#### Expanded

Enabling this causes your panel to be in the expanded state by default - allowing the content to visible.

#### Slide From Top

Enabling this allows the panel slider to remain on top of your content, which is then loaded underneath it.

{% hint style="info" %}
By default, the Slide Down Panel uses a bottom slider which stays at the bottom of your content at all times, including in the expanded state.
{% endhint %}

#### Large Display

This option is available only when **Slide From Top** is enabled. Enabling this allows your panel slider to be slightly enlarged to be more visible.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Tab List Panel

The Tab List Panel allows different tabs to be displayed as sub-windows in your application. Each tab can be configured to use one of your application layouts.

{% hint style="info" %}
Only **ONE** tab can be displayed at a time.
{% endhint %}

Once your tabs have been defined using the Tab List Panel configurations, the layout designer will automatically display your created tabs in the designer. The Tab List Panel is typically used along with the object section control.

{% hint style="info" %}
Contrary to the [Tab Panel](/building-an-application/views/design-ui/layout-controls/panels#tab-panel),

1. The tabs in Tab List Panel use other layouts in your application to define their content.
2. The position of the tab list is not bound with respect to the tab content placement.
   {% endhint %}

### General

General properties define the basic design of your tab list panel.

#### Full Size

Enabling this allows your panel to fill the application page.

#### Tab List Position

Specified where the tabs should be displayed on the page.\
*Options: Top, Left*

#### Use Smaller Fonts for Tabs

Enabling this allows your tab titles to use a smaller font size.

#### Target Section Name

Name of the section in your layout targeted by the Tab List Panel.

### Tabs

Tabs properties allows you to configure the tabs in your Tab Panel.

#### Startup Tab Index

Selects the name of the tab that should be opened by default.

#### Manage Tabs

Your tabs can be managed in the configuration itself

* **Create Tab (todo: add fa-plus icon)**\
  Selecting this button creates a new tab for your tab panel. Each tab consist of a name *(supports multiple languages)* that is used to identify the tab. Once created, the tab also requires you to specify which layout should be used for as its content.<br>
* **Delete Tab (todo: add fa-remove icon)**\
  A tab can be deleted by selecting this option.<br>
* **Reordering (todo: add arrow up and down icons)**\
  Reorder arrow buttons can be used to reorganize the ordering of your tab, moving it further down or higher up the list. This ordering indicates the order in which the tabs will be displayed on your final layout as well.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Tab Panel

The Tab Panel allows different tabs to be displayed as sub-windows in your application window. Each tab can be individually designed with layout elements.

{% hint style="info" %}
Only **ONE** tab can be displayed at a time.
{% endhint %}

![Sample Tab Panel](/files/-MHSOJ2ktsKgy3XyUXcR)

Once your tabs have been defined using the Tab Panel configurations, the layout designer will automatically display your created tabs in design mode. Each tab will consist of a [basic panel](/building-an-application/views/design-ui/layout-controls/panels#panel) to which you can add more layout elements and build your tab interface.

### General

General properties define the basic design of your tab panel.

#### Full Size

Enabling this allows your panel to fill the application page.

#### Tab List Position

Specified where the tabs should be displayed on the page.\
*Options: Top, Left*

#### Use Smaller Fonts for Tabs

Enabling this allows your tab titles to use a smaller font size.

### Tabs

Tabs properties allows you to configure the tabs in your Tab Panel.

#### Startup Tab Index

Selects the name of the tab that should be opened by default.

#### Manage Tabs

Your tabs can be managed in the configuration itself

* **Create Tab (todo: add fa-plus icon)**\
  Selecting this button creates a new tab for your tab panel. Each tab consist of a name *(supports multiple languages)* that is used to identify the tab. Once created, the tab will be accessible from the main layout designer canvas for further customization.<br>
* **Delete Tab (todo: add fa-remove icon)**\
  A tab can be deleted by selecting this option.<br>
* **Reordering (todo: add arrow up and down icons)**\
  Reorder arrow buttons can be used to reorganize the ordering of your tab, moving it further down or higher up the list. This ordering indicates the order in which the tabs will be displayed on your final layout as well.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Tag Panel

Tag Panel enables the user to manage tags of an instance. With Tag Panel end user can create new tag of the type user or team, list applied tags, assign or change existing tags.

<figure><img src="/files/wXEYUg1Z3V23QZtaENNk" alt=""><figcaption><p>Creating new Tag Panel</p></figcaption></figure>

Tag panel configurations offers three options:

<figure><img src="/files/VoNSeR1GCp3JdBEImGi1" alt=""><figcaption><p>Tag Panel configuration</p></figcaption></figure>

* Enable assigning: enables the end user to assign tags to the instance
* Enable creating: enables the end user to create new tags
* Enable removing: end user has the possibility to delete assigned tags

Default value for all three options is *true.*

For more details about Tag Panel features from the end user perspective visit [Tag Panel page](#tag-panel).

## Toolbar

The toolbar serves as a special design element that consists of a collection of layout elements such as actions. Unlike other panels, it is colored to give more structure to the page.

![Toolbar Panel Preview](/files/-MHqr_4hArDNUHKexJVo)

The toolbar does not require extensive configurations, and is used primarily as a container for the actual toolbar content.

### General

General properties define the basic design of your toolbar.

#### View Mode

Determines the shade of your toolbar.\
*Options: Normal (default), Light, Transparent, Custom*

### Style

Style properties are available only when the **View Mode** is set to **Custom**.

#### CSS Background

Defines the toolbar background using CSS notation.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your panel.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your panel.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## View Dependent Panel

The view dependent panel allows custom views to be designed for different devices. For instance, the layout of a page can be adapted differently for smaller screens or devices with touch capability.

![View Dependent Panel Properties](/files/-MHqrws_8eUHPOw5igoD)

### Screen Size

Screen Size properties determine the visibility of your view dependent panel based on screen size.

#### Visible on Small Screen

Enabling this ensures your panel is displayed on devices with small screens.

#### Visible on Medium Screen

Enabling this ensures your panel is displayed on devices with medium-sized screens.

#### Visible on Large Screen

Enabling this ensures your panel is displayed on devices with larger screens.

### Input Type

Input Type properties define whether your panel can be accessed and used based on the input capabilities of devices.

#### Visible on Touch Devices

Enabling this ensures your panel is displayed on touch-enabled devices.

#### Visible on Mouse Devices

Enabling this ensures your panel is displayed on devices that support using a mouse.


# Sections

This section covers section controls provided by the platform as graphical components that enhances the esthetics of an application layout or page.

## Overview

Section controls provides predesigned components that can be added to your layout for specific purposes. Each section control can be customized by selecting the control in the main designer canvas and clicking on the gear icon to access its properties.

![Accessing Section Properties](/files/-MHSXUxPbslg9N8s2SOM)

The platform offers several section elements.

* [Horizontal Line](/building-an-application/views/design-ui/layout-controls/sections#horizontal-line)
* [Info Box](/building-an-application/views/design-ui/layout-controls/sections#info-box)
* [Label](/building-an-application/views/design-ui/layout-controls/sections#label)
* [Page Header](/building-an-application/views/design-ui/layout-controls/sections#page-header)
* [Picture Box](/building-an-application/views/design-ui/layout-controls/sections#picture-box)

## Horizontal Line

The horizontal line section introduces a gray horizontal line that spans across the full width of its parent element to your layout.

{% hint style="info" %}
This control does not have further configurations.
{% endhint %}

## Info Box

The info box section provides a layout element that spans across the full width of its parent element by default. Configuring the info box allows you to display a message in that element.

![Sample Info Box](/files/-MHSELVDPmoyBeN4SXUV)

### General

General properties allow you to define the basic design of the info box.

#### Text

Defines the text that appears inside the info box.

{% hint style="info" %}
Supports multiple languages
{% endhint %}

#### Kind

Defines the theme and color scheme of the box.\
*Options: Info (default), Success, Warning, Danger, Info-Left, Success-Left, Warning-Left, Danger-Left*

| Theme   | Color Scheme |
| ------- | ------------ |
| Info    | Blue         |
| Success | Green        |
| Warning | Yellow       |
| Danger  | Red          |

{% hint style="info" %}
By using the normal themes (Info, Success, Warning, Danger), the entire info box makes use of the theme background color. Setting the **Kind** to a theme with the **-Left** suffix enables you to override this behavior and only show the theme color on the left side of the box.
{% endhint %}

![Info Box with Info-Left Kind](/files/-MHSSbiX0hN8y5x1rbMA)

### Appearance

Appearance properties enable you to further style the design of your element.

#### Visible

Enabling this option ensures that your info box is displayed on the layout.\
*It is enabled by default.*

#### Margin

Defines the margin around your panel, offsetting it from the edges of its parent element.

{% hint style="info" %}
The margin value is set using CSS notation.
{% endhint %}

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your section.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your application window.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Label

The Label section allows you to display an independent line of text on your layout.

![Sample Label](/files/-MHSSteELx7Bua6o__G9)

### General

General properties define the basic design of your element.

#### Text

Defines the label text content.

{% hint style="info" %}
Supports multiple languages
{% endhint %}

#### Icon

Defines an optional icon that will appear alongside the label.

* **Icon Display Options** *(Available only when an icon has been set)*\
  Allows you to manipulate the selected icon.\
  *Options: Rotate 45°, Rotate 90°, Rotate 135°, Rotate 180°, Rotate 225°, Rotate 270°, Rotate 315°, Flip Horizontal, Flip Vertical, Spin, Pulse-Spin*

#### Display As Link

Enabling this option converts the label into a hyperlink

* **Link URL** *(Available only when **Display As Link** is active)*\
  Defines the web address that the hyperlink should open when selected.\
  *Supports multiple languages*

### Style

Style properties allow you to further customize the design of your section using CSS rules.

#### CSS Color

Defines the font color of your element.

#### CSS Size

Defines the font size of your element.

#### CSS Text Align

Defines the text alignment of your label.\
*Options: Left, Right, Center, Justify*

#### CSS Font Weight

Defines the font weight (e.g. bold) of your element.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your section.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your application window.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Page Header

The Page Header section allows you to create a customized title bar in your application.

{% hint style="info" %}
It is highly recommended to place your page header onto a page. This provides for the basic page interactions such as closing or pinning a page.
{% endhint %}

![Sample Page Header ](/files/-MHSPLXXRdiVkPq4Kulm)

### General

General properties allow you to define the basic design of your page header.

#### Text

Defines the page header title.

{% hint style="info" %}
Supports multiple languages
{% endhint %}

#### Show Down Menu

Enabling this option allows additional actions to be accessed as a dropdown menu by clicking on the page name in the page header. This can be particularly useful to switch contexts quickly within the same layout.

{% hint style="info" %}
This option can only be used when the page header is placed in a [List Result](/building-an-application/views/design-ui/page-types#list-result-page) page.
{% endhint %}

### Advanced

Advanced properties provide further control over the design and functionality of the header.

#### Show Close Button

Enabling this option adds a close button to your page header.

#### Show Pin Button

Enabling this option adds a button to your page header, allowing the current page to be pinned.

#### Show Page Name

Enabling this option ensures that the page title is displayed in the header.

#### Color Covers Entire Background

Enabling this option transforms your header so that it is colored completely.

{% hint style="info" %}
By default, only a small icon box is colored next to the page title in the header
{% endhint %}

#### Height

Defines a custom height in pixels for your page header.

{% hint style="info" %}
Setting the value to empty causes the default header height to be used.
{% endhint %}

#### Icon Size

Defines a custom size in pixels for your page header icon displayed next to your page title.

{% hint style="info" %}
Setting the value to empty causes the default header height to be used.
{% endhint %}

#### Custom Background Color

Defines a background color for your page header.

{% hint style="info" %}
Setting the value to empty causes the default header height to be used.
{% endhint %}

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your section.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your application window.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Picture Box

The picture box section enables you to add an image component to your layout.

![Sample Picture Box with caption](/files/-MHSPlBCh5X-MeIETIv9)

### General

General properties defines the basic content of your picture box.

#### URL

Defines the hyperlink to your image file.

#### Data Source

Allows you to use an image from your application in your picture box.

### Appearance

Appearance properties allow you to further customize the design of your picture box.

#### Text

Defines a text that is displayed on top of your image.

{% hint style="info" %}
Supports multiple languages
{% endhint %}

#### Responsive (Yes/No)

Activating this option ensures that your image is scaled responsively based on the screen size.

#### Align Center (Yes/No)

Activating this option aligns your picture box to be centralized horizontally.

#### Max Height

Defines the maximum height of your picture box.

{% hint style="info" %}
Setting this to **0** or **Empty** allows the maximum height to be unlimited.
{% endhint %}

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your section.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your application window.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}


# Lists

This section covers list controls that are particularly useful when a large amount of information needs to be presented to the user in an easily consumable format.

## Overview

List controls allows you to display repetitive content as a comprehensive ordered set of information. Each list control can be customized by selecting the control in the main designer canvas and clicking on the gear icon to access its properties.

![Accessing List Properties](/files/-MHlR2SmtWU0pZ8ER2Gk)

## Canvas List

The Canvas List control allows you to display your list as an editable canvas on your layout.

<figure><img src="/files/gZFaa7SIJu6RbObDB6cO" alt=""><figcaption><p>Canvas List Control Properties</p></figcaption></figure>

### Data Source

Data Source properties determines the origin of the list contents.

#### Type of Data Source

Defines what kind of data source is being used to help better configure the list.\
*Based on the **Type of Data Source**, further configurations can be made available.*

* **Dynamic**\
  The list content is not derived from predefined sources and is created when using the layout instead.<br>
* **Selection**\
  The list content is derived from a [Selection Query](/building-an-application/data/query-data).\
  Using this option requires you to set the **Selection Data** property to identify which query is being used to populate the list.<br>
* **Class**\
  The list content consists of all objects of a specific class type.\
  Using this options requires you to set the **Class Data** property to identify which class objects are being used to populate the list.

#### Field, Position Info Is Stored In

Determines which class field (if any) is used to define the field value and its position on the canvas.

### Open Item Execution

Non-mandatory option to select a layout to open the items by double-click. Layouts of the class of the data source can be selected.

### Item Appearance

Sets the appearance of the item.

#### Background color source

Specifies how the background color for the items is evaluated:

* Default - Uses the default background color (defined by the system).
* Fixed - Uses a defined background color (defined by the app creator in hex-colors).
* Field - Uses a field for the source of the background color. Selected field represents the data source class that defines the background color for the items (in hex-colors).

#### Background opacity

Sets the background opacity by selecting a value from a value range 0% - 100% in increments of ten.

#### Border Color Source

Specifies how the border color for the items is evaluated:

* Default - Uses the default border color (defined by the system).
* Fixed - Uses a defined border color (defined by the app creator in hex-colors).
* Field - Uses a field for the source of the border color. Selected field represents the data source class that defines the background color for the items (in hex-colors).

## Instance Context

Instance Context defines the context of an Instance Frame. It expands the scope of the control to include additional functions.

{% hint style="success" %}
It is recommended to always have an **Instance Frame** within an **Instance Context**.
{% endhint %}

### General

General properties of an instance context determines the behavior of the **Instance Frame** on your layout.

#### Handle Actions

Determines that actions can be performed within the list control.

#### Handle Refresh

Determines that performing refreshes is allowed in the list control.

#### Handle Expressions

Determines that expressions can be used in the list control.

#### Handle Sort Change

Determines that the sorting order of the list can be changed.

#### Handle Filtering

Determines that list items or results can be filtered.

#### Handle Expand/Collapse

Determines that sub-elements in the list can be expanded or collapsed.

## Instance Frame

The Instance Frame control allows object instances to be opened directly in the layout instead of a new page. It is normally used in sync with the [List Context](/building-an-application/views/design-ui/layout-controls/lists#list-context) and [List](/building-an-application/views/design-ui/layout-controls/lists#list) elements.

{% hint style="info" %}
When an item is selected from the **List**, the **List Context** is notified. Subsequently, the **List Context** locates the **Instance Frame** among its child elements and loads the selected list item in the frame.

This requires that the **List** and **Instance** **Frame** exist within the same **List** **Context**.
{% endhint %}

{% hint style="success" %}
Sample use-case:

The Instance Frame can be used as an item viewer with a List on the left side of the layout and the frame in the center panel. This creates a typical user experience where when an item is selected from the list, the content is immediately loaded in the center viewer.
{% endhint %}

## List

The List control is a basic control of the type that allows you to display a number of objects of the same type in order. The list content can be defined by retrieving all objects of a class or dynamically by using queries defined in the [Query Designer](/building-an-application/data/query-data).

<figure><img src="/files/RjlpuAP1aahVhc4PHqel" alt=""><figcaption><p>List Data Source</p></figcaption></figure>

{% hint style="info" %}
List controls support several display modes: **List**, **Timeline**, **Kanban**, **Chart**, **Grid** or **Gantt Chart**.
{% endhint %}

If a list view mode has been saved for an user and that mode has been set as unavailable in the List control, the user's list view mode will be reset to the initial view mode.

### Data Source

Data Source properties determines the origin of the list contents.

#### Type of Data Source

Defines what kind of data source is being used to help better configure the list.\
*Based on the **Type of Data Source**, further configurations can be made available.*

* **Dynamic**\
  The list content is not derived from predefined sources and is created when using the layout instead.<br>
* **Selection**\
  The list content is derived from a [Selection Query](/building-an-application/data/query-data).\
  Using this option requires you to set the **Selection Data** property to identify which query is being used to populate the list.<br>
* **Class**\
  The list content consists of all objects of a specific class type.\
  Using this options requires you to set the **Class Data** property to identify which class objects are being used to populate the list.

#### Custom Page Size

Enabling this option allows you to configure the pagination behavior of the list.

* **Page Size**\
  Defines the number of items that should be loaded on each list page.<br>
* **Disable Loading Further Pages**\
  Enabling this option removes the pagination behavior whereby only the first page with the number of items defined as **Page Size** are loading.

#### Possible View Modes

Choose here possible view modes of your list. This is especially useful as not all list support all view modes. Possible view modes are *List, Timeline, Charting, Kanban, Grid and Gannt*.

If a particular view mode is selected to be the initial view mode (as explained in the chapter below), when that view mode is deselected as possible view mode, then the initial view mode is change to the next possible view mode.

If you choose *All* when selecting view modes, any future view modes added will be automatically included. However, if you manually select all available view modes without using the *All* option, only currently available view modes will be selected and any future modes added will not be automatically included.

#### Initial View Mode

Specifies which mode is used by default when loading the list. Same options possible as for selection the possible view modes for you list (see above Possible View Modes)<br>

### User Interaction

User interaction properties help customize the user experience with regards to the list content.

#### Continuous Scrolling

Enabling this option changes the list behavior so that the list items are loaded as the user scrolls through the list.

#### Live-Update If New Items Available

Enabling this option allows the list to receive new updates dynamically without the need for a page refresh.

#### Refresh If Object Refreshes

Enabling this option allows the list to be refreshed when an object is refreshed.

#### Clickable

Enabling this option allows users to click on the list item, for instance to open an object item.

#### Auto-Open NM-Target

Enabling this option enables related classes (NM-Target) to be opened automatically.

#### Display NM-Instance Link

Enabling this option allows linked classes to be displayed as part of the list content.

### List Actions

List actions properties allows you to customize how the user can interact with the list directly.

#### View Mode Changeable

Enabling this option allows the user to change the display mode of the list.

#### Show "Change Sort" in Action Menu

Enabling this property provides the option to change the list sorting order to the user.

#### Show "Refresh" in Action Menu

Enabling this property provides the option to refresh the list to the user.

#### Display Instance Actions dropdown

Activation of this option provides the end user the possibility of executing number of in-built actions for each list item of the respective list. In addition, the instance workflows visible to the end user are shown and can be executed.

<figure><img src="/files/gRxwvsJpYf2OlJzSrRWf" alt=""><figcaption><p>Instance Actions dropdown with Workflow Sample</p></figcaption></figure>

#### Load all instance information (slow)

Enabling this option all information for all instances are loaded. Leads to performance losses.

### Instance Creation

Instance creation properties allows you to customize the options to create new list items.

#### Disable Inline Create

Enabling this option prevents the user from creating items dynamically when using the list. Instead, the user should use a dedicated create option (if available) to generate new items.

#### Disable Bulk Create

Enabling this option prevents the user from creating multiple new items at once.

#### Disable Create Action in Menu

Enabling this property removes the dedicated create option in the list context menu.

#### Instance Create Execution

Specifies which action should be executed when the user attempts to create a new list item.

### Open Item Execution

*Available only if the **Data Source** is set to **Selection** or **Class**.*\
Open Item Execution properties determine how the list should behave when a user opens a list item.

This property set allows you to specify which layout should be used based on the link being opened.

{% hint style="info" %}
If there are two lists with the same Data Sources and for one list a custom layout and for the other one no layout has been defined, when an instance is opened from a list that did not have a custom layout, then the default layout is used.&#x20;
{% endhint %}

### List Mode

List mode properties determines the design of the list when in **List Mode**.

#### Enable Bulk Editing

Enabling this option allows multiple items to be edited simultaneously.

#### Hide bulk editing default toolbar

Only available if checkmark for 'Enable Bulk Editing' is set. Enabling this option will hide bulk editing default toolbar in the bulk editing mode.

#### Bulk editing always on

Only available if a checkmark for 'Enable Bulk Editing' is set. When this option is enabled, then the list will always be displayed in a bulk edit mode. The mode cannot be started or ended through the left click-area, menu or toolbar action. A toolbar action 'Select all' selects and deselect all visible instances. The mode does not end when executing an action or workflow.&#x20;

#### Left Click-Area to Start Bulk Editing

This option is only available if 'Enable Bulk Editing' is enabled and 'Bulk editing always on' is disabled. Enabling 'Left Click-Area to Start Bulk Editing' allows you to select multiple items for editing by clicking on the selector located on the left side of each list item.

<figure><img src="/files/5uMDDUHI0irgk16Ei6AQ" alt=""><figcaption><p>Left Click-Area to Start Bulk Editing</p></figcaption></figure>

#### Hierarchical List

Enabling this option determines whether the list should be organized in a hierarchical manner.

### Charting Mode

Charting mode properties determines the design of the list when in **Charting Mode**.

#### Chart Config Changeable

Enabling this option allows users to change the view when in **Chart Mode**.

### Kanban Mode

Kanban mode properties determines the design of the list when in **Kanban Mode**.

#### Floating Kanban Cells

Enabling this option allows the user to move the list items (represented as Kanban elements).

### Grid Mode

Grid mode properties determines the design of the list when in **Grid Mode**.

<figure><img src="/files/jMJVhP9NTsKxTSCcwDwV" alt=""><figcaption><p>Grid Mode</p></figcaption></figure>

<figure><img src="/files/WS4lalvzz9fXopxMDNQj" alt=""><figcaption><p>Sample of Grid Column with Background</p></figcaption></figure>

#### Allow Column Filtering

Activating this property provides the options for the user to change the filter settings of your grid.

#### Allow Column Grouping

Enabling this property allows list columns to be grouped as a single column in the grid.

#### Show Create in Grid-Header

Activating this property provides the create item option in the grid header on top of the grid.

#### Instance Action

Specifies the action to be executed when an item is selected from the grid.

* **Icon**\
  Determines which icon should be used to represent the instance action on the layout.\
  *Available only when an **Instance Action** is defined.*

{% hint style="info" %}
To display the inline instance action, the action and an icon needs to be specified.
{% endhint %}

#### Setup Grid Column

This option opens the grid column configuration wizard to help you determine your grid columns.

For columns which are special you can choose a background color in order to emphasize it.

<figure><img src="/files/oFq9ydxe9B6V6FMBGn7D" alt=""><figcaption><p>Background Color for Columns</p></figcaption></figure>

### Item Appearance

Item appearance properties determine how the list items are displayed on your layout.

#### Row Template

Defines the graphical layout of a list item.

{% hint style="info" %}
HTML tags can be used for individual designs. This is applied only when the list is in **List Mode** or **Kanban Mode**.
{% endhint %}

#### Header Template

Defines the graphical layout of the list header

#### Content if List Is Empty

Defines what should be displayed if the list contains no items.

#### Row Alternating

Determines whether the design should be applied to alternating rows only.

#### No Horizontal Separation Line

Enabling this option removes the horizontal separator between list items.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your control.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text tooltip should be displayed relative to your control.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## List Context

List Context defines the context of a list. It expands the scope of lists to include certain functions.

{% hint style="success" %}
It is recommended to always have a **List** within a **List Context**.
{% endhint %}

### General

General properties of a list context determines the behavior of the list on your layout.

#### Handle Actions

Determines that actions can be performed within the list.

#### Handle Refresh

Determines that performing refreshes is allowed in the list.

#### Handle Expressions

Determines that expressions can be used in the list.

#### Handle Sort Change

Determines that the sorting order of the list can be changed.

#### Handle Filtering

Determines that list items or results can be filtered.

#### Handle Expand/Collapse

Determines that sub-elements in the list can be expanded or collapsed.


# Input

This section covers input controls that allows the user to enter data in order to provide parameter values for further interaction with an application.

## Overview

Input controls are independent entry fields that are usually used to support other features on the layout. Input controls can be customized by selecting the control in the main designer canvas and clicking on the gear icon to access its properties.

{% hint style="info" %}
For instance, an input control can be used as a filter for a list element.
{% endhint %}

![Accessing Input Control Properties](/files/-MHbWRSohgkBt0uxqFIU)

Supported input controls:

* [Annotation List](/building-an-application/views/design-ui/layout-controls/input#annotation-list)
* [Filter Input](/building-an-application/views/design-ui/layout-controls/input#filter-input)

## Annotation List

Annotation lists are used in [Object Pages](/building-an-application/views/design-ui/page-types#object-page) consisting of document instances. The Annotation List control attempts to load all bookmarks and an outline of the current document loading in the layout.

## Filter Input

Filter inputs are mainly used in the context of lists to provide a means for filtering the list.

![Sample Filter Input](/files/-MHbWrOrQH9zgPnTTuWu)

### Appearance

Appearance properties allows you to further customize the design of your control.

#### Margin CSS

Defines the margin around your control, offsetting it from the edges of its parent element.

{% hint style="info" %}
The margin value is set using CSS notation.
{% endhint %}

#### Padding CSS

Defines a padding inside your control, offsetting your control content from its edges.

{% hint style="info" %}
The padding value is set using CSS notation.
{% endhint %}

#### Placeholder

Defines a text that is displayed in a muted style by default when the control is not being used.

{% hint style="info" %}
Supports multiple languages
{% endhint %}

### If Placed In Page Header

The properties provided in this section allows you to customize the design of your input control when it is used in a page header.

#### Align Right

Enabling this option ensures your input control and its content are aligned to the right.

{% hint style="info" %}
By default, the control and its content are aligned to the left.
{% endhint %}

#### Display As Action

Enabling this option causes your filter input control to be rendered as an action link.

### Help

Help properties allows you to customize the information displayed in the intro tour of your page. The intro tour typically goes through each item that contains help information.

#### Help Html

Allows you to write Html code that is rendered as help text for your element.

{% hint style="info" %}
Supports multiple languages.
{% endhint %}

#### Position

Allows you to define where the help text should be displayed relative to your application window.

*Supported positions:*\
*Auto, Top, Left, Right, Bottom, Bottom-Left, Bottom-Middle, Bottom-Right*

#### Step Order Index (Number)

Allows you to define the order within the intro tour.

{% hint style="info" %}
The tab-index refers to the order in which elements are focused on using the **Tab** key on your keyboard. This is an essential feature to enhance the accessibility and usability of your application by any user.
{% endhint %}

## Tag filter

Tag filter is used in the list context to provide to the end user a means for filtering the tags.

<figure><img src="/files/lCCuTAGoSG5ws71KLZ4d" alt=""><figcaption><p>Adding Tag Filter in the List Context</p></figcaption></figure>

Tag Filter has one configuration option which sets it's visual appearance in the final layout visible to the end users.

<figure><img src="/files/kFXEHDYUwAqlnBrXAzqD" alt=""><figcaption><p>Tag Filter configuration</p></figcaption></figure>

If *Display as an action* is kept with the default value *false,* the end user will see a button ![](/files/C26yYLd6VayKpxTBPrFg) and the list of already chosen Tags for results filtering.

In the case *Display as an action* is set to true, the Filter Tag button&#x20;

* is shown in gray color ![](/files/MnSfFeewUZIKQxYfPYaQ)if no Tag Filter has been applied by the end user or
* is shown with the glowing effect  ![](/files/HdNdvQziZjqtd4jzfJYO) if tags have been chosen by the end user for list filtering.&#x20;

{% hint style="info" %}
In this last variant of the tag filter, the selected tags are not displayed. This can be useful in situations where there is not enough space to show all selected tags, or for aesthetic reasons. This variant of the tag filter allows you to filter the list or board without cluttering the interface with the selected tags.
{% endhint %}


# Layout Templates

This section covers a series of templates provided by the platform to allow a quick and easy configuration of layouts commonly used in applications.

## Overview

Layout templates are a collection of layout controls preconfigured to some extent by the system. Templates allow you to quickly setup a particular type of layout to ease your layout designing experience.

In order to access the list of layout templates, select your page from the layouts manager and expand the **Templates** list in the layout elements panel on the left.

![Adding Layout Templates to a Layout](/files/-MHlSG4_DUeSE8g0Z5sa)

Each template makes use of traditional layout controls and elements which can be further customized by selecting the control in the layout designer canvas and clicking on the gear icon to access its properties.

The templates are categorized by type:

* [Pages](/building-an-application/views/design-ui/layout-templates#page-templates)
  * [App Page](/building-an-application/views/design-ui/layout-templates#app-page)
  * [Object Links Page](/building-an-application/views/design-ui/layout-templates#object-links-page)
  * [Object Page](/building-an-application/views/design-ui/layout-templates#object-page)
  * [Result List Page](/building-an-application/views/design-ui/layout-templates#result-list-page)
* [Sections](/building-an-application/views/design-ui/layout-templates#section-templates)
  * [Change List Sort Action](/building-an-application/views/design-ui/layout-templates#change-list-sort-action)
  * [Field Container](/building-an-application/views/design-ui/layout-templates#field-container)
  * [Page Menu](/building-an-application/views/design-ui/layout-templates#page-menu)
  * [Show List Actions](/building-an-application/views/design-ui/layout-templates#show-list-actions)
  * [Show Object Actions](/building-an-application/views/design-ui/layout-templates#show-object-actions)
  * [Toggle Object Links](/building-an-application/views/design-ui/layout-templates#toggle-object-links)
* [List](/building-an-application/views/design-ui/layout-templates#list-templates)
  * [List with Context](/building-an-application/views/design-ui/layout-templates#list-with-context)

## Page Templates

Page templates refer to a set of templates that supply a basic page layout using panels and other elements. This allows you to quickly get your layout page up and running.

### App Page

The **App Page** template can be used as a basis for all [App Pages](/building-an-application/views/design-ui/page-types#app-page). It makes use of all standard elements and functions, giving users a consistent look and feel.

{% hint style="success" %}
The template abides by best practices to make sure your application is consistent throughout.
{% endhint %}

![App Page Template](/files/-MHlSnXY0LN15vDzMGqi)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Layout Container](/building-an-application/views/design-ui/layout-controls/panels#layout-container)
  * [Panel](/building-an-application/views/design-ui/layout-controls/panels#panel)
  * [Scroll Panel](/building-an-application/views/design-ui/layout-controls/panels#scroll-panel)
* [Sections](/building-an-application/views/design-ui/layout-controls/sections)
  * [Page Header](/building-an-application/views/design-ui/layout-controls/sections#page-header)

### Object Links Page

The **Object Links Page** template can be used as a basis for all [Object Links Pages](/building-an-application/views/design-ui/page-types#object-links-page). It makes use of the recommended layout elements to display all object links information.

![Object Links Page Template](/files/-MHlSx8aAtsfk79fodpc)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Layout Container](/building-an-application/views/design-ui/layout-controls/panels#layout-container)
  * [Panel](/building-an-application/views/design-ui/layout-controls/panels#panel)
  * [Scroll Panel](/building-an-application/views/design-ui/layout-controls/panels#scroll-panel)
* [Sections](/building-an-application/views/design-ui/layout-controls/sections)
  * [Page Header](/building-an-application/views/design-ui/layout-controls/sections#page-header)
* Context Tree

### Object Page

The **Object Page** template can be used as a basis for all [Object Pages](/building-an-application/views/design-ui/page-types#object-page). It makes use of the best fitting layout control to provide a clean interface to browse and access objects in your application.

![Object Page Template](/files/-MHlT5YDTSMCHXbU6kSV)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Layout Container](/building-an-application/views/design-ui/layout-controls/panels#layout-container)
  * [Panel](/building-an-application/views/design-ui/layout-controls/panels#panel)
  * [Scroll Panel](/building-an-application/views/design-ui/layout-controls/panels#scroll-panel)
  * [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
  * [Instance Links Panel](/building-an-application/views/design-ui/layout-controls/panels#instance-links-panel)
  * [Collapse Panel](/building-an-application/views/design-ui/layout-controls/panels#collapse-panel)
  * [Field List Panel](/building-an-application/views/design-ui/layout-controls/panels#field-list-panel)
  * [Horizontal Panel](/building-an-application/views/design-ui/layout-controls/panels#horizontal-panel)
  * [Toolbar](/building-an-application/views/design-ui/layout-controls/panels#toolbar)
* [Sections](/building-an-application/views/design-ui/layout-controls/sections)
  * [Page Header](/building-an-application/views/design-ui/layout-controls/sections#page-header)
* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)
  * [View Changer](/building-an-application/views/design-ui/layout-controls/actions#view-changer)

### Result List Page

The **Result List Page** template can be used as a basis for all [Result List Pages](/building-an-application/views/design-ui/page-types#list-result-page). It contains all the elements to provide a clean layout for list-based operations such as searching or filtering.

![Result List Page Template](/files/-MHlTDX1K0GxFB8UlWw2)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Layout Container](/building-an-application/views/design-ui/layout-controls/panels#layout-container)
  * [Panel](/building-an-application/views/design-ui/layout-controls/panels#panel)
  * [Scroll Panel](/building-an-application/views/design-ui/layout-controls/panels#scroll-panel)
  * [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
  * [Sections](/building-an-application/views/design-ui/layout-controls/sections)
  * [Page Header](/building-an-application/views/design-ui/layout-controls/sections#page-header)
* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)
  * [View Changer](/building-an-application/views/design-ui/layout-controls/actions#view-changer)
* [Lists](/building-an-application/views/design-ui/layout-controls/lists)
  * [List Context](/building-an-application/views/design-ui/layout-controls/lists#list-context)
  * [List](/building-an-application/views/design-ui/layout-controls/lists#list)
* [Inputs](/building-an-application/views/design-ui/layout-controls/input)
  * [Filter Input](/building-an-application/views/design-ui/layout-controls/input#filter-input)

## Section Templates

Section templates are a collection of templates that consist of layout controls to make the best use of section components under different circumstances.

### Change List Sort Action

The **Change List Sort Action** template provides an [Action](/building-an-application/views/design-ui/layout-controls/actions#action) control that is designed to provide sorting options to the user.

![Change List Sort Action Template](/files/-MHlTRDHxvmha4UqA0eJ)

#### Template Elements

* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)

### Field Container

The **Field Container** template is used to insert a horizontally arrange field list panel into a collapse panel.

![Field Container Section Template](/files/-MHlTcAUXopwrUpk2aBf)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Collapse Panel](/building-an-application/views/design-ui/layout-controls/panels#collapse-panel)
  * [Field List Panel](/building-an-application/views/design-ui/layout-controls/panels#field-list-panel)
  * [Horizontal Panel](/building-an-application/views/design-ui/layout-controls/panels#horizontal-panel)

### Page Menu

The **Page Menu** template is used to provide a basic design for a page context menu.

![Page Menu Section Template](/files/-MHlTlHVkjF7SMiAQZGy)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Menu Context](/building-an-application/views/design-ui/layout-controls/panels#menu-context)
  * [Scroll Panel](/building-an-application/views/design-ui/layout-controls/panels#scroll-panel)
  * Context Tree

### Show List Actions

The **Show List Actions** template is designed for use in lists and list contexts. This allows users to change the view of the list, for instance when using Kanban, List or Timeline view.

![Show List Actions Template](/files/-MHlTuOuh8giGuxpoIjq)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)

### Show Object Actions

The **Show Object Actions** template is designed for use in lists and list contexts. This allows users to access specific actions that can be applied to objects.

![Show Object Actions Template](/files/-MHlU38fNQIPFghNEBW9)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)

### Toggle Object Links

The **Toggle Object Links** template is designed to allow the user to retrieve the links of an object.

![Toggle Object Links Tempalte](/files/-MHlUBJ3mZ0DWsE-1WUU)

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)

## List Templates

List templates are a collection of templates using layout controls to provide an easy way to design layouts centered around lists.

### List with Context

The **List With Context** template creates a list embedded in a **List Context** element with a predefined toolbar for additional list actions.

{% hint style="success" %}
It is recommended to use this template whenever lists are used.
{% endhint %}

![List With Context Template](/files/-MHlUQikZTZmfLCaHgna)

Predefined toolbar consists of:

#### Filter Input

Filter input is described in the [Layout Controls, section Input](https://docs.tivity.one/building-an-application/views/design-ui/layout-controls/input#filter-input).

<figure><img src="/files/Bk4ratU3icQjHBzvJGN9" alt=""><figcaption><p>Filter Input</p></figcaption></figure>

#### Action with Menu (ellipsis-h/three dots)

Action with Menu represented by the ellipsis-h icon/three dots provides you the menu of available list actions in the form of a drop down.

<figure><img src="/files/ijDBVHW3DoPLH7amo6lV" alt=""><figcaption><p>Action Menu</p></figcaption></figure>

Depending on the settings, it can contain options: Change sorting (of the list), Refresh (list), Open (list) in new window, (Tracker of user) Activity, Export (of the list).

Clicking on *Export* opens a new page with selection of the Export format.

<figure><img src="/files/jZ8L1Kle93w19atuytjR" alt=""><figcaption><p>Export Options</p></figcaption></figure>

Here you can choose between CSV (Comma-Separated Values) and Excel file format.

If there are images in the list it is about to be exported, they are sized and positioned within one cell each in the exported table. Images are centered within the cell and their aspect ratio is considered (corresponds to Excel picture formatting functionality *Lock aspect ratio* and *Move and size with cells*).

#### Refresh action

Refreshing a list is also available as a one-click action within the toolbar. This action is described in the [Layout Controls, section Actions.](https://docs.tivity.one/building-an-application/views/design-ui/layout-controls/actions#refresh-page)

<figure><img src="/files/ZQSwP7qrWzoxI0iDVCnG" alt=""><figcaption><p>Refresh Action</p></figcaption></figure>

#### Sorting action

Integrates the option accessible for the users by one-click to change a list sorting. Sorting is described in the Layout Controls, section Action, [Change List Sorting](https://docs.tivity.one/building-an-application/views/design-ui/layout-controls/actions).

<figure><img src="/files/0dqOrUWHXGEpYw7yGGIw" alt=""><figcaption><p>Sorting Action </p></figcaption></figure>

### List Bulk Editing Toolbar

List Bulk Editing Toolbar gives you the possibility to insert and configure custom actions which will be executed on the selected list item of the list for which the toolbar has been inserted.

The control is only visible in a List Context if the list of the context is visible (in 'List' mode) and the bulk editing is started. The toolbar is comprised of actions like instance actions or workflows which  you can configure and execute for the class of the List for the List Context and particularly for each selected instance.&#x20;

<figure><img src="/files/2b11kmWPqy1ocBtPAlag" alt=""><figcaption><p>Bulk Editing Toolbar</p></figcaption></figure>

The toolbar and actions are by default displayed like the bulk editing default toolbar and actions. Selected actions of the in the toolbar inserted control type actions like instance actions and workflows are only displayed if all selected instances can execute the action.

<figure><img src="/files/7okh1aU4W6pft3e8h6le" alt=""><figcaption><p>Action Selection in the Control Type Action Configuration Menu</p></figcaption></figure>

Following special actions for the purpose of bulk editing and customizing the bulk editing toolbar are available:

* Start bulk editing -the action is only visible in a List Context if the List of the context is visible (in 'List' mode) and the bulk editing is not started. The bulk editing will be started if the action is executed.
* End bulk editing - the action is only visible in a List Context if the List of the context is visible (in 'List' mode) and the bulk editing is started. The bulk editing will be ended if the action is executed.
* Select all (bulk editing) - the action is only visible in a List Context if the List of the context is visible (in 'List' mode), the bulk editing is started and not all instances are already selected. All instances are selected if the action is executed.
* Deselect all (bulk editing) - the action is only visible in a List Context if the List of the context is visible (in 'List' mode), the bulk editing is started and all instances are already selected. All instances are deselected if the action is executed.
* Menu (bulk editing) - displays all the instance actions, workflows and templates the selected instances can execute. The bulk editing default toolbar displays the name new menu.
* Execute bulk action - within the action the configurator can select the instance action to execute when the bulk execution gets executed by the end user. The action is only visible in a List context if the List of the context is visible (in 'List' mode), the bulk editing is started, at least one instance is selected and all selected instances support the configured action.
* Execute bulk workflow - within the action the configurator can select the instance workflow to execute when the bulk execution gets executed by the end user. The action is only visible in a List context if the List of the context is visible (in 'List' mode), the bulk editing is started, at least one instance is selected and all selected instances support the configured workflow.

<figure><img src="/files/BrSAHpjdOND4PLw8O6cg" alt=""><figcaption><p>Selectable Actions</p></figcaption></figure>

#### Template Elements

* [Panels](/building-an-application/views/design-ui/layout-controls/panels)
  * [Conditional Panel](/building-an-application/views/design-ui/layout-controls/panels#conditional-panel)
  * [Toolbar](/building-an-application/views/design-ui/layout-controls/panels#toolbar)
* [Actions](/building-an-application/views/design-ui/layout-controls/actions)
  * [Action](/building-an-application/views/design-ui/layout-controls/actions#action)
* [Lists](/building-an-application/views/design-ui/layout-controls/lists)
  * [List Context](/building-an-application/views/design-ui/layout-controls/lists#list-context)
  * [List](/building-an-application/views/design-ui/layout-controls/lists#list)
* [Inputs](/building-an-application/views/design-ui/layout-controls/input)
  * [Filter Input](/building-an-application/views/design-ui/layout-controls/input#filter-input)


# Document Templates

The TIVITY platform enables you to generate documents and emails using templates the easy way.

## Introduction

The Template Designer allows users to create standardized documents like letters or reports and fill them dynamically with information. So, repeatedly reports or personalized letters to a variety of receivers can be created with ease.

In this article we will introduce you to the versatile features of the Template Designer.

## Manage Templates

You can edit, delete, and clone templates, or export your template definition as well as texts for use in another app. Head to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your apps. Next, navigate to the app you want to configure and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line">. In the **Views** section you click on **Templates** to access the list of existing templates.

![Access the Template Designer in your apps](/files/-MJ1m_KiHMbgbOy5eoD5)

### Create a Template

Click on **New Template** to create a new template definition to use in your application. [Get Started with Template Designer](/building-an-application/views/document-templates/get-started-with-template-designer) describes the process of creating a document template in detail.

### Edit a Template

Click on the template name from the list to open the template designer. The remaining functionality is identical to creating a new template, as described in [Get Started with Template Designer](/building-an-application/views/document-templates/get-started-with-template-designer).

![Edit a template and validate before saving](/files/-MJ1p6kE4CqkqOTYOqwt)

Modify your existing template as needed, optionally **Validate** the current definition, and click **Save** to store your changes.

### Delete a Template

Either you open the drop-down menu on the right-hand side to the template name and choose **Delete** or you click on the template name from the list and click on **Delete** to remove the template.

![Delete a template from your application](/files/-MJ1qFsY5bMXVe2Syxyn)

Confirm to delete the selected template with a click on **Yes, delete it**.

### Clone a Template

In scenarios where you need the same template with minimal variations you don't have to create each template from scratch but you can duplicate an existing one. Open the drop-down menu on the right-hand side to the template name from the list and choose **Clone**.

![Duplicate an existing template to speed up multiple configurations](/files/-MJ1sLGQrZi-MqEKt-bH)

After a short while a new template with a `- Copy` suffix will be added to the list of templates. You can create multiple copies of the same template.

{% hint style="info" %}
Prior to be able to clone a template it has to be validated successfully. If the copying process fails, open the template for review and validate it.
{% endhint %}

## Used By

Apart from being able to create and manage templates it is interesting to know whether and how a particular template is used in an application. Open the drop-down menu on the right-hand side to the template name in the list and choose **Used By**.

The Template Designer shows you in which Layouts, Classes, Functions, Selections, Templates, and Workflows the selected template is used.

![Used By provides you information where a template has been used](/files/-MJ1t7L4YeOgRY8k6hbI)

Click on **Close** to return back to the list of templates.

## Export Templates

To save your templates for backup or to transfer templates between applications and workspaces you would export them. Open the drop-down menu on the right-hand side to the template name in the list and choose **Export**.

![Export your templates for backup or for use in other applications](/files/-MJ1uKcX27xcnbJptfxR)

The platform is going to assemble a ZIP archive and will offer you to download it to your system. The default file name is `templates.zip`.

{% hint style="info" %}
The generated ZIP archive is potentially password-protected.
{% endhint %}

## Import Templates

{% hint style="danger" %}
ToDo: Import fails due to invalid format of previously exported templates file.
{% endhint %}

Navigate to your **Workspace > Apps** and click on the gear icon to activate the configuration mode of your apps. Next, click on the gear icon of the app you want to configure. In the **Views** section you click on **Templates** to access the Template Designer. Click **Import Templates**.

Next, either drop an exported file from your system into the designated area or click on one of the available options to import your templates. Click **Execute** after the file has been uploaded completely.

![Import of templates to transfer definitions between apps](/files/-MJ1vfGW1gTo40e2Mew7)

After successful import the templates either have been created as new entries based on their original name or the suffix `- Copy` has been added to any existing template to avoid name conflicts.

## Export Texts

{% hint style="danger" %}
Functionality is broken at the moment.
{% endhint %}

![](/files/-MJ1wk-1NKDi39ZdhBSW)

...

## Import Texts

{% hint style="danger" %}
Functionality is broken at the moment.
{% endhint %}

![](/files/-MJ1xf10-iScpFhKWfM6)

...

## Return to the Workspace

After you completed your changes in the Template Designer you scroll down to the bottom of the **Config Mode** in the left-hand side Workspace pane and click on **Leave Config Mode**. Then you click on the tick next to the **Apps** caption to return to your Workspace.

## More on Template Designer

Working with document templates...


# Get started with Template Designer

The article gives a brief tutorial about how to create a document template using the Template Designer.

## Create a Template

Navigate to your **Workspace > Apps** and click on the gear icon <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your apps. Next, click on the gear icon <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the app you want to configure. In the **Views** section you click on **Templates** to access the Template Designer. Click **New Template**.

![Create a new template in the Template Designer](/files/-MJ20GQbv4hLczMx4UPD)

A template contains various sections to detail the purpose and content of the document. The following paragraphs describe each section in details.

## General

Every template needs some general information about its purpose. Those properties are defined in the **General** section of a template.

### Key

Optionally, you can give your query a Key or match code. This property can be helpful in other drop-down or selection menus in your app to quickly access and choose a template. In the list of templates the value of Key is shown in parentheses behind the name of the template.

{% hint style="info" %}
The Key is a unique distinction between templates which is displayed in the Template Designer, but will not be visible to the end user in the finished app.
{% endhint %}

### Name

The name of the template with that it is represented.

![Templates can be given a language-specific name](/files/-MJ38Y-TIHW9wQ3LvFHK)

Using the globe symbol <img src="/files/-MJ25re9x9fYnQmQ2O6J" alt="" data-size="line"> on the right-hand side allows you to add or modify language-specific values of the property. Click again on the globe symbol <img src="/files/-MJ25re9x9fYnQmQ2O6J" alt="" data-size="line"> to collapse the section.

### Description

Provide fellow users a description of the template to explain what the template is designed for.

![Description of a template in multiple languages](/files/-MJ391iwcxSPbN8V6tG2)

Using the globe symbol <img src="/files/-MJ25re9x9fYnQmQ2O6J" alt="" data-size="line">on the right-hand side allows you to add or modify language-specific values of the property. Click again on the globe symbol <img src="/files/-MJ25re9x9fYnQmQ2O6J" alt="" data-size="line"> to collapse the section.

## Template

### Class

A template is valid for one class. Choose for which one.

![Choose a Class to assign to the template](/files/-MJ3A7enLiZWyvn-Cb4D)

{% hint style="info" %}
You have to specify a Class to validate your template.
{% endhint %}

### Valid On

A template can be applied on a class, which means on all instances at once or on one instance only.

### Template Script

To create an individualized template, the Template Designer allows users to specify scripts that create and enable the template execution. For more information on how to work with scripts on TIVITY see the documentation for the [Script Designer](/building-an-application/execution/scripting).

In the Script for the template the variable that are replacing the placeholders in the document must be defined. Therefore, they must be named and spelled exactly the same way. Within this script, it must be defined how these data fields are filed.&#x20;

For example, which data is used for the variables. As explained in the documentation on the Script Designer, different data inputs can be used and expressions for calculating and evaluating variables can be defined. This way a sophisticated report or form letter can be created.

## Document

A template can be classified based on the following three types: Internal Document, External Document, or External Placeholder.

![Specify the document type used in the template](/files/-MJ3JADpWtVQvbdw7We6)

### Internal Document

Create a document as template within the TIVITY platform by using a Script.

**Internal Documents** are created within the TIVITY platform. Use this type if only a script is used to return the needed Information. You don’t need to upload a document with placeholder instead create a script and the return of the script will automatically convert to a PDF.

### External Document

Upload a Word document as template. Therefore add placeholders in this document, so the designer can fill them out with data entries from the platform.

**External Documents** are Word documents that can be created outside of the platform and then be uploaded in the Template Designer. When the Template Designer is executed, it then automatically checks the document for placeholders and replaces them with the related data in the platform. Then, a new Word document is created with the new data inside.

![Attach an external document to the template](/files/-MJ3MV0eP2vn6VOqRKiM)

Click on the <img src="/files/-MJ3NxozowxJb3_etueu" alt="" data-size="line"> Upload icon to upload a new external document. To check the document of a template, click on the <img src="/files/-MJ3O1o-bbcE5GVZt_KN" alt="" data-size="line">  Download icon to download it.

### External Placeholder

Upload a PDF document with form fields and fill this fields with values from an Instance. Using a script to match PDF form fields with internal fields.

Use **External Placeholder** if there is a PDF document with form fields which should be filled with values from an instance. Upload a document with form fields, after that click on <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> Open script icon. The form fields of the PDF documents will be displayed as variables in the script. Inside the script fill these variables with internal values. After that you can use the template and the platform will file the form fields with the values according to the instance and create a PDF document.&#x20;

![Assign external placeholders via a document to the template](/files/-MJ3Oc0GZGKfw4Npi56v)

Click on the <img src="/files/-MJ3NxozowxJb3_etueu" alt="" data-size="line"> Upload icon to upload a new external placeholder document. To check the placeholder document of a template, click on the <img src="/files/-MJ3O1o-bbcE5GVZt_KN" alt="" data-size="line">  Download icon to download it.

## Advanced

### Parent Template

To enable the inheritance of templates, a parent template can be chosen among the existing templates within the app.

![Templates can be derived from another template](/files/-MJ3SauarcPWjp3D0KKb)

{% hint style="danger" %}
Inheritance is not available for External Placeholder templates.
{% endhint %}

## Parameters

Add Parameters that will requested when the Template is used. You can use parameters to hand over variables to a workflow/function that is used in the template.

Every template can have assigned specific parameters. These are variables that can be utilized within the template script. Here, different input or output variables for executing the template can be defined.

![Use parameters to customise your template](/files/-MJ6MS46yf6yWtqseMDr)

In the properties of a parameter, various points can be defined. Next to the name and description the variable type can be defined or whether this field is required before execution, its default value and what error message is prompted otherwise.

![Edit properties of a template parameter with more details](/files/-MJ6O4-CBlbcU7k8KpqW)

### Control type

The available types are described in more detail in [Data Modelling](/building-an-application/data/data-modelling) under page [Field](/building-an-application/data/data-modelling/field).

{% content-ref url="/pages/-MAoq-21KoHvoqAvxXCX" %}
[Field](/building-an-application/data/data-modelling/field)
{% endcontent-ref %}

## Validate and Save a Template

The validation automatically checks whether the settings of the template are valid and provides notifications when there are errors.

Finally, click on **Validate** to verify that your selection of criteria is accepted by the Template Designer. Click on **Save** to store your template and return back to the list of templates in your app.


# Expressions in Templates

Complete reference of built-in expressions in Templates of the TIVITY platform.

Expressions are used in various locations to recognize the places where which data from the TIVITY platform shall be inserted.

## Work with Placeholders and External Documents

In a document expressions must be surrounded with “**{ }**”. So for example, an expression with the name “placeholder” must be defined as {placeholder}. The name for the expression must be named in the same way as the variable is named in the TIVITY platform. Therefore, see the [Class Designer](/building-an-application/data/data-modelling).

Next to the simple expressions, context depending expressions can be used. Therefore “Context.” must be added, as shown in the example.

Other additional parameters are:

* Context.\<Field-Key> {Context.FieldName}
  * Context: The actual object instance
  * \<Field-Key>: A data field of the actual instance
* Function.\<Function-Key> {Function.GetRelation}
  * Function: A function
  * \<Function-Key>: A function with its key
  * All parameters of the function are filled with variables from the context or with parameters defined in the template details respectively in the function itself.
* Workflow.\<Workflow-Key> {Workflow\.GetRelation}
  * Workflow: A Workflow
  * \<Workflow-Key>: A workflow with its key
  * All parameters of the workflow are filled with variables from the context or with parameters defined in the template details respectively in the workflow itself.
* Template.\<Template-Key> {Template.Signature}
  * Template: A template
  * \<Template-Key>: A template with its key

### Example **of using context-specific expressions in a template**

#### **Template**

![](/files/-MJ6R6FNiN-owo_mkUjv)

#### **Instance**

![](file:///C:/Users/joki/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)

![](/files/-MJ6RAaJe6_dDytqyKEE)

#### **Result**

![](/files/-MJ6RDVZIRbyY1Axu5s-)

### Fields of objects initialized in scripts

Fields of objects initialized in scripts can be accessed  in 'External Document' templates via expressions:&#x20;

```
{<VariableName>.<FieldName>}
```

VariableName must point to a variable with a value of type Object.\
FieldName must be the key or names of a field of the Object class.

Resolving happens right after resolving the script. The resolve is not successful if the variable is not found or not of type Object or no field with the key or name exists.

## DateTime Formatting

For date values a build-in formatting is done based on the control types of a variable. This is done wherever you can specify control types and data types (for example template parameters, class fields).

As an example, let's take a class field with the name 'Done On' and with the Data Type *DateTime*. In the class designer we have the choice between the control types Calendar, TimePicker or DatePicker. Now, depending on the selection of the control type, a different formatting takes place. The following is entered in the template:

```
{Context.DoneOn}
```

Class field buld-in formatting:

| Control type | Format                              |
| ------------ | ----------------------------------- |
| Calendar     | DateTime (e.g. 2020/11/23 11:45:33) |
| TimePicker   | Time (e.g. 11.45.33)                |
| DatePicker   | Date (e.g. 2020/11/23)              |

Template parameter build-in formatting (configured in template designer):

| Control type | Format                              |
| ------------ | ----------------------------------- |
| Date + Time  | DateTime (e.g. 2020/11/23 11:45:33) |
| Time         | Time (e.g. 11:45:33)                |
| Date         | Date (e.g. 2020/11/23)              |

## Custom Formatting

Custom formatting expression formats are separated with ':'. Everything on the left is to identify the value (e.g. context fields or script variables). \
Everything on the right is the format to use. NULL values for expressions with formats ignore formatting (an empty text is displayed). Formats for unknown formats can cause errors. The error includes the identifier and the format.

**Syntax**

```
{DateTimePlaceholder:yyyy-mm-dd}
```

**Context specific expressions**

```
{Context.IntegerField:c}
{Function.NameOfFunc:yyyy-MM}
{Workflow.NameOfWorkflow:d}
```

The following data types are supported:

| Type                                                                                        | Format documentation                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p>Integer, </p><p>Long,</p><p>Double, </p><p>Float, </p><p>Short, </p><p>Byte, Numeric</p> | <p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings"><https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings></a></p><p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings"><https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings></a></p>                         |
| DateTime                                                                                    | <p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings"><https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings></a></p><p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings"><https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings></a></p> |
| TimeSpan                                                                                    | <p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings"><https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings></a></p><p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-timespan-format-strings"><https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-timespan-format-strings></a></p>                     |

## Xml escape

Expression format 'xmlescape' replaces invalid XML characters with their valid XML equivalent: `'\"&<>` to `&apos;&quote;&amp;&lt;&gt;`

#### Syntax

```
{StringPlaceholder:xmlescape}
```

## List of built-in Expressions

### {DateTime.Now}

Returns the current date and time.

#### Syntax

```
{DateTime.Now}
```

### {DateTime.Now\.Date}

Returns the current date.

#### Syntax

```
{DateTime.Now.Date}
```

### {DateTime.Now\.Add(\<Parameters>)}

Returns the time calculated based on the current time (the span to be added is passed as a parameter(s)). You can add either years or days or hours or minutes. If the value is negative the resulting time will be in the past.

#### Syntax

```
{DateTime.Now.Add(YEARS, 1)}
{DateTime.Now.Add(DAYS, -7)}
{DateTime.Now.Add(HOURS, 12)}
```

#### Parameters

* YEARS,\<years> or
* DAYS,\<days> or
* HOURS,\<hours> or
* MINUTES,\<minutes>

### {NewGuid()}

Returns a new generated value of the universally unique identifier.

#### Syntax

```
{NewGuid()}
```

### {CurrentUser.\<Property>}

Returns the specified property of the current user.&#x20;

The value of a DefaultTemplate, an Expression or a Condition Value can be a mix of a text and one or more expressions enclosed in the curly brackets. The resulting value is concatenated after evaluation of the expressions. For example if the expression for the virtual field FullName is "{FirstName} {LastName}", the FirstName="John" and the LastName="Brown", the value of the field FullName is "John Brown".

#### Syntax

```
{CurrentUser.Id}
{CurrentUser.FirstName}
{CurrentUser.Nickname}
```

#### Properties

Possible properties:

* Id
* LanguageId
* LoginName
* FirstName
* LastName
* Nickname

### {CurrentOffice.Id}

Returns the id of the current workspace.

#### Syntax

```
{CurrentOffice.Id}
```

### {CurrentApplication.Id}

Returns the id of the current application.

#### Syntax

```
{CurrentApplication.Id}
```

### {ParentObject.\<Property>}

Returns the specified field of the parent object (relevant if the object is created as a link of some other object - its parent).

#### Syntax

```
{ParentObject.\<Property\>}
```

### {LinkPath\["\<ClassName>"].\<FieldName>}

Returns the value of the specified field of the parent object with the specified class name (relevant for indirectly linked objects).

#### Syntax

```
{LinkPath["<ClassName>"].<FieldName>}
```

### {UserSortValue(\<Parameters>)}

Returns the next order number. Used with properties with the internal key "UserSort" in order to define whether the new object will be placed on top of the list (parameter = MinValue) or on bottom (parameter = MaxValue).

#### Syntax

```
{UserSortValue(MaxValue)}
```

#### Parameters

* MaxValue or
* MinValue

### {LastInput()}

Returns the same value which the current user set the last time. The properties with the internal keys CreatedOn and CreatedBy must be defined for the class in order this expression takes effect.

#### Syntax

```
{LastInput()}
```


# Execution


# Functions

This section covers how functions can be created and customized on the platform to cater for operations in an application.

## Overview

Functions are used on the platform to define dynamic actions in your application. They are scripts with input parameters which in turn can be called in scripts. The Function Designer provides an interface for creating and managing functions.

On the start page of the Designer, all available functions are listed. In addition, new functions can be created. In the context menu of an instance these actions can be performed:

* **Clone**: an exact copy of this instance is created and added to the list
* **Used By**: Listed all class, function, layout, selection, workflow, template who use this instance
* **Delete**: delete this instance

![Function Designer](/files/-MW53ZpQWfFLX19XA6Lw)

## Settings

The interface of the function settings are divided into three sections. In **General** the function name and description of the function are entered. In addition, a unique key must be assigned. With this key the function can be called at another place.\
In the **Function** section, the underlying script can be created or opened. How scripts are built you can [see in Scripting](/building-an-application/execution/scripting). The return type of the function is also set at this point. \
Finally, under **Parameter** the input parameters can be configured. How to add and configure parameters is described in the next chapter.

![Function settings](/files/-MW59cxv8nHQKOWhh08G)

{% hint style="info" %}
The **Key** property is compulsory when creating a function.
{% endhint %}

## Parameter

It is possible to add parameters to a function. These are queried in the interface when the function is executed.

![Parameter configuration](/files/-MW5HQnnB_UHJK_Lc652)

The **Key** is the parameter name with which you can access it in the script context. The **Type**  property defines the layout control with which the parameter query will be displayed later during execution. If **Required** is enabled, an input is forced. The **Actions** offered deleting and moving (changing the order) of a parameter.

{% hint style="info" %}
&#x20;The **Key** property is compulsory when creating a parameter.
{% endhint %}

## Executing

After the function is created and a script is built, this function is available to the app. In each script in the different contexts, this function can now be called. These includes Workflow Designer, Template Designer and of course in another function.\
To execute the function in the script, the action *ExecuteFunction* is offered. When this action is added in the designer, you can choose from a list of available functions.

![ExecuteFunction action](/files/-MYAwvVptFk9zjctqhgA)


# Workflows

This section covers how workflows can be created and customized on the platform to cater for complex operations in an application

## Overview

Workflows are used on the platform to define more complex and dynamic actions in your application.

{% hint style="success" %}
For instance, your application could contain a workflow to send notifications to a user when an action is triggered.
{% endhint %}

The workflow designer provides an intuitive interface to easily manage your workflows and customize each of them with a graphical user-interactive approach.

![Workflow designer](/files/-MCB9eLjeNSmuES0zBaC)

{% hint style="info" %}
Workflow designer works closely with the [Scripts Designer](/building-an-application/execution/scripting) which can define logic behind specific steps in the workflow.
{% endhint %}

## Getting Started

Navigate to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your applications. Next, click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the application you wish to configure. In the **Execution** section you click on **Workflows** to access the Workflow Designer.

![Opening Workflow Designer](/files/-MCBcIVT1K233ahy9kaE)

At this stage, you will encounter the workflow management section of the designer.

## Manage Workflows

Using the workflow management window, you can edit, clone or delete existing workflows or create new ones for your application. Additionally, you can use the import/export options to quickly replicate workflows across applications.

### Create new workflow

To create a new workflow, select the **New Workflow** option from the actions toolbar.

![Creating a new workflow](/files/-MCBcSTOqbXaBEc6bFCU)

This will lead you to the [Workflow Configuration](/building-an-application/execution/workflows-and-application-logic#workflow-configuration) window where you can define your workflow.

### Edit a workflow

To edit an existing workflow, click on the workflow name in your list of workflows.

![Editing a workflow](/files/-MCBcZMwOXFlCuQTv05W)

Your configurations will be loaded and ready for editing.

### Clone a workflow

In case you wish to replicate an existing workflow (for instance to use as a base for a different scenario), you can easily clone a workflow.

Select the **dropdown** on the right of your existing workflow to reveal additional options and click on **Clone**.

![Cloning a workflow](/files/-MCBcf6o9dpXHn_pEyE9)

A duplicate of your existing workflow will be created with the suffix `- Copy` added to the name.\
You can customize your cloned workflow by click on it in your list of workflows.

### Delete a workflow

A workflow can be deleted by selecting the **dropdown** on its right in the workflow list and clicking on the **Delete** option. A message prompt will be presented for you to confirm your action.

![Deleting a workflow](/files/-MCBcmdwmNX6a9NEFfqo)

{% hint style="danger" %}
Deleting a workflow is permanent and cannot be reversed.
{% endhint %}

## Import and Export

The workflow designer provides the capacity to import and export your workflows. This feature can be used as a manual backup mechanism, among other uses.

{% hint style="danger" %}
You can only import workflows back into the **same application** from which it was exported.
{% endhint %}

### Export workflow

You can export a single workflow from your list by selecting the **dropdown** option on its right, and clicking on the **Export** option.

![Exporting a workflow](/files/-MCBctjBsol-OeM3xL7W)

The export method results in the platform compiling your workflow as a JSON file, which is then bundled as a ZIP file and downloaded. The default file name is `workflows.zip`.

{% hint style="info" %}
The generated ZIP file may be password-protected
{% endhint %}

### Import workflow

You can import workflows from your various sources to your application by selecting the **Import Workflows** option in the actions toolbar. Choose the source of your workflow file and finally, select your file and click on **Execute** at the bottom of the window to complete your import.

{% hint style="info" %}
The platform currently supports importing workflows from **your device** and **Dropbox**.
{% endhint %}

### Export texts

Exporting your workflow texts allows you to export the basic configurations (Key, Name and Description) of your workflows as a spreadsheet from your application.

To use this feature, select the **Export Texts** option from the actions toolbar.\
You have the option to either download it to your device or view it online.

![Exporting workflow texts](/files/-MCBczoV7a40Yw671ADV)

{% hint style="info" %}
By default, your exported workflows are compiled as Microsoft Excel (**.xlsx**) files.
{% endhint %}

### Import texts

Workflows exported as texts can be imported back into your application. This allows you to override your existing basic workflow configurations as a batch (Key, Name, Description).

Select the **Import Texts** option from the actions toolbar, followed by the source of your workflow file. Finally, click on **Execute** at the bottom of the window to complete your import.

{% hint style="danger" %}
Workflows can only be imported if they already exist in your application.\
Your existing configuration values **will be overridden** by the imported texts.
{% endhint %}

## Workflow Configuration

The workflow configuration window is divided in two sections: the workflow properties fields and an interactive canvas to design your workflow.

![Workflow Configuration](/files/-MCB9eLjeNSmuES0zBaC)

This section explores the configuration of your workflow properties accessible on the left in the workflow designer window in detail.

### General

General workflow configurations define the basic properties of your workflow with some descriptive information such as name and description, as well as more technical information such as the related class and its runtime settings.

![Workflow General Configurations](/files/-MCBH2K-KgrBn2IfXZ6a)

#### Key

The key is an internal identifier for your workflow. It should be unique for each workflow in your application.

{% hint style="info" %}
The **Key** property is compulsory when creating a workflow.
{% endhint %}

#### Name

This is the workflow name that is displayed in your application. By clicking on the globe icon, you can define a name for different languages.

{% hint style="info" %}
The **Name** property is compulsory when creating a workflow.\
Good practice: Use a name that describes the result of the workflow.
{% endhint %}

#### Description

The description field can be used to provide a quick overview of the workflow - which can be particularly helpful when you have to manage a significant number of workflows. This property can be displayed as help text in other parts of your application.

#### Info

The info field allows you to provide additional information to better describe the workflow. Contrary to the description field, this information is not displayed is other parts of your application.

#### Class

The workflow class field specifies **exactly one** class that is associated with your workflow.

{% hint style="info" %}
The **Class** property is compulsory when creating a workflow.
{% endhint %}

#### Run As

The workflow can be configured to run in one of two modes: Viewer or Editor.

* Viewer\
  Workflow be run by normal users of the application.<br>
* Editor\
  Workflow can be run by users with edit privileges in the application.

#### Valid On

The workflow can be configured to be runnable on a class, an instance of the class or even to be invisible entirely to users (for instance if the workflow is used internally only).

* Class\
  Workflow runs directly on its class and does not require the class to be initialized as an object to run.\
  For instance, a workflow that validates data and creates an object does not require the object to already exist to be used.<br>
* Instance\
  Workflow can run on an instance of its class.\
  For instance, a workflow that deletes an item would require that the item exists already to be usable.<br>
* Invisible for users\
  Workflow is not accessible by users directly. This is useful when defining internal workflows that should not be triggered by external users.

### Rights

This section deals with the read and write permissions of the workflow for single users or user groups.

{% hint style="danger" %}
Workflow rights can only be set up if your workflow has been saved at least once.
{% endhint %}

You can edit the permissions to your workflow in a window directly in the designer by selecting the **Workflow Rights** option.

![Workflow Rights Configurations](/files/-MCBHQtgso0dwflAFsBG)

{% hint style="info" %}
More information about rights and permissions can be found in the [Rights Designer](/managing-users-and-collaboration/roles-and-permissions).
{% endhint %}

### Parameters

The parameter section controls the integration of values as variables read from your scripts into your workflow. Each parameter has a set of properties that needs to be set up.

{% hint style="info" %}
When running your workflow, you will be prompted to enter the values for each of your parameters. This is **compulsory** in order for the workflow to be executed.
{% endhint %}

![Create a workflow parameter](/files/-MCBd9KakMet-fBbOz6d)

#### Key

The parameter key is the name of your variable as defined in your scripts.

{% hint style="info" %}
The **Key** property is compulsory when creating a parameter for your workflow.
{% endhint %}

#### Name

The name is the one displayed in your application workflow for your parameter. By clicking on the globe icon, you can define a name for different languages.

{% hint style="info" %}
The **Name** property is compulsory when creating a parameter for your workflow.
{% endhint %}

#### Description

The parameter description allows you to specify more information and better describe the parameter in your workflow. It can be used as a help text or overview to quickly understand the purpose of your parameter.

#### Control Type

The control type specifies the type of editor with which a user can insert values for the parameter.

For detailed description of the types see page [Control Types](/building-an-application/execution/workflows-and-application-logic/control-types).

{% content-ref url="/pages/-MaiZYUzsu7LSW4RLGRP" %}
[Control Types](/building-an-application/execution/workflows-and-application-logic/control-types)
{% endcontent-ref %}

#### Default Value

The default value property allows you to set a predefined value that is used unless edited by the user.

#### Length

The length property allows you to set a limit on the number of characters allowed for this parameter.

#### Is Required

The parameter can be marked as a prerequisite to use your workflow by activating this checkbox.

#### Do Not Show If Default Value Is Set

The parameter can be hidden to prevent the editing if the default value should always be used as its actual value in the workflow.

### Triggers

The workflow designer lists all triggers that reference the opened workflow. Next to the trigger name is the type of the trigger shown. When the user clicks on a trigger, then the trigger is opened.&#x20;

<figure><img src="/files/hu3wZNJXhLLUAWOr1Etn" alt=""><figcaption><p>Trigger in Sample Workflow Configuration</p></figcaption></figure>

## Building your workflow

A workflow is a sequence of activities or steps that are executed based user-defined rules to lead to different possible outcomes. Workflows are defined by **transition** and **step** components on the platform.

![Basic workflow with a single step](/files/-MCBJ2VPHA1Iak8SbaxI)

| Component  | Purpose                                                                                                                                                     |
| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Start      | All workflows are preconfigured with an initial **Start** step that acts as the starting point of execution for your workflow.                              |
| Transition | Steps are connected by transitions through which scripts can be executed to modify parameters and values in your workflow before reaching the next step.    |
| Step       | Steps will define particular points of importance in your workflow. Each step can be connected to scripts to allow the workflow data to evolve accordingly. |

### Construct a workflow

The starting point is always from the **Start** node for any workflows. Click and drag from the green indicator in the top right corner of the start node and drop it anywhere on the canvas to create a transition and step connection.

Similarly, more complex workflows can be created by selecting and dragging the highlighted indicator in the top right corner of any node and dropping it on the canvas.

![Building a workflow](/files/-MCBdKEpRLe_NSBVzjKD)

{% hint style="info" %}
When a node does not have any highlighted indicator in its top right corner, this implies that the node cannot be used to create new steps in your workflow.

This can happen if for instance, a transition is already connected to a source and target node - and therefore cannot support any further connections.
{% endhint %}

#### Arrange Elements

The workflow designer allows you to rearrange your elements in a single column tree structure by selecting the **Arrange Elements** option from the actions toolbar on the canvas.

### Workflow transitions

Each step in a workflow has a preceding transition. A workflow transition allows you to determine dynamically (during the workflow execution) whether the next step is executed or not.

A custom script can be linked to your transition to process this condition based on what the script returns as follows:

* **True**: The next step is executed.
* **False**: The next step is not executed.

{% hint style="info" %}
Transitions can be used to define which steps in your workflow should be executed based on the current state of the workflow.
{% endhint %}

Selecting a workflow transition opens a properties panel to the right of the designer that allows you to customize your transition properties.

![Opening transition properties](/files/-MCBh-NB0iFVpeZcU_4F)

#### Name

The name property defines the name of your transition as displayed in the designer By clicking on the globe icon, you can define a name for different languages.

{% hint style="info" %}
The **Name** property is compulsory when creating a transition.
{% endhint %}

#### Description

The description property allows you to specify more information and better describe the purpose of a transition in your workflow.

#### Deleting a transition

Clicking on the **Delete Transition** option in the properties, instantly deletes the selected transition.

{% hint style="danger" %}
The system does not prompt for confirmation during deletion.\
Deleting a transition between two steps essentially breaks the link between them. All connections between the different steps **must consist of** a transition.
{% endhint %}

#### Connect scripts to your transition

In case your transition has not been linked to any logic yet, you can do so by selecting the **Create And Open Script** option in the properties. This causes the [Script Designer](/building-an-application/execution/scripting) to load in a separate window.

{% hint style="info" %}
Your workflow is validated and saved before the Script Designer is opened.
{% endhint %}

![Creating a transition script](/files/-MCBhr9fb6iV_6eqHVY3)

Alternately, if you already have a script connected to the transition, you can choose between two options.

* **Open Script**: Opens the script in a separate window for editing.
* **Delete Script**: Unlink the script from your transition and delete the script file.

{% hint style="danger" %}
The system does not prompt for confirmation during deletion.
{% endhint %}

### Workflow steps

Steps in your workflow represent important activities or stages that make up the entire workflow. They are interconnected by [transitions](/building-an-application/execution/workflows-and-application-logic#workflow-transitions). You can link an execution script to a workflow step to determine how your workflow data should evolve at each stage.

![Open workflow step configurations](/files/-MCBi0CrJPHhTKZ6y81F)

Selecting a workflow step opens a properties panel to the right of the designer that allows you to customize your step properties.

#### Name

The name property defines the name of your step as displayed in the designer By clicking on the globe icon, you can define a name for different languages.

{% hint style="info" %}
The **Name** property is compulsory when creating a workflow step.
{% endhint %}

#### Description

The description property allows you to specify more information and better describe the purpose of a step in your workflow.

#### Deleting a step

Clicking on the **Delete Step** option in the properties, instantly deletes the selected step.

{% hint style="danger" %}
The system does not prompt for confirmation during deletion.\
Deleting a step connected by two transitions essentially breaks the link between them.
{% endhint %}

#### Connect scripts to your step

In case your step has not been linked to any logic yet, you can do so by selecting the **Create And Open Script** option in the properties. This causes the [Script Designer](/building-an-application/execution/scripting) to load in a separate window.

{% hint style="info" %}
Your workflow is validated and saved before the Script Designer is opened.
{% endhint %}

![Creating a workflow step script](/files/-MCBiA2E6XMGQ73ySh8n)

Alternately, if you already have a script connected to the step, you can open the script in a separate window for editing by selecting the **Open Script** option.

## Validate and Save

You can also check the validity of your workflow by selecting the **Validate** option or save your current classes by selecting **Save** from the bottom menu.

![Validate and save workflow](/files/-MCBiHTK9-t-sy2dXoYd)

Validation errors are displayed as toast notifications at the top of the platform interface.

{% hint style="danger" %}
In case your workflow is invalid, the system will not allow it to be saved.
{% endhint %}


# Control Types

The control type specifies the type of editor with which a user can insert values for the parameter.

{% hint style="info" %}
A detailed breakdown of all supported control types in class designer can be found [here](/building-an-application/data/data-modelling/field#control-type).
{% endhint %}

## Multi Select

A Multi Select is a control that allows you to select multiple items from a list. The list comes from a data source that can be selected in the configuration.

![Default view Multi Select](/files/-MaicL8UwBc4q7nR5Gtu)

### Configuration

When Multi Select is selected as the control type, additional configuration fields appear in the Parameter Configuration panel. In the **Columns** the number of columns for displaying the entries is set. A maximum of 4 columns can be displayed. The **Dropdown if...** input field is used to enter the number of lines that must be exceeded for the list to be displayed in a dropdown.

![Multi Select configuration](/files/-MaifOyzp8xxFAp4kg01)

A Multi Select parameter is displayed as a dropdown if more than X rows are displayed:

* more than X instances and 1 column
* more than X\*2 instances and 2 columns
* more than X\*3 instances and 3 columns
* etc.

X = Number of rows that can be configured.

#### Data source configuration

With a Multi Selection it is necessary to select the data source. There are 3 types of sources available: Class, Controller and Option.\
With the type *Class* the class can be selected from a list and optionally also a field of the class. As default the name of the class is displayed. When you select the *Controller* type, a list of all available controllers is available. When selecting *Option*, the options can be entered as free text.

![Data source](/files/-MbMdP-2Tif7l-0pDcM-)

### View of the control

![Multi Select collapsed](/files/-MaihgGAQ0wUlcWet60g)

![Multi Select expanded with selected items](/files/-MaiiSPus3HcICFkWzHu)

## Object

Workflow parameter with the control type Object enables action creator to request complex data in a single parameter.

An Object is composed of sub-parameters, each presenting one field. Fields can be filled like regular parameters (or table cells). Each cell or field can contain another sub-object to input.&#x20;

<figure><img src="/files/ZSaouSqvTIxX6MYOwjNe" alt=""><figcaption><p>Choosing Control Type Object in a Workflow</p></figcaption></figure>

The field order is determined by the order of the sub-parameters.

If the Object parameter is not required then filling of Object fields can be skipped. If it is not skipped or is set 'Options' -> 'Is required' then all required fields must be filled.

Filled Object data is passed to the script as \<Dictionary, Any> or  if skipped (not filled) as NULL.

## Table

Once Table is set as a control type, it is possible to request tabular data in parameters, so that an user can input multiple, complex rows to be used in the scripts.

<figure><img src="/files/9Zwpx7mGAcVWeUCptOmg" alt=""><figcaption><p>Choosing control type table in the configuration of the workflow parameter</p></figcaption></figure>

A table is composed of sub-parameters, each presenting one column. An unlimited number of rows can be entered by filling cells. Rows can be added, deleted and re-arranged. The column order is determined by the order of the sub-parameters.

#### Configuration of table columns

Table column or sub-parameter has its own configuration menu divided into sections. Section  'Common' is always shown, while 'Options' and a third section are shown depending on the chosen table column control type. Following fields are available in the column configuration menu:

* Key: the key to identify the column
* Name: the header of the column (in English, German or French)
* Data type: is calculated from the chosen control type
* Control type: a list of control types to change the input method for the column (TextBox by default)
* *Default value* (optional): The default value for a new row (when added by the user)
* *Length* (optional): the maximal length of text input
* Is required (required): determines whether an column input must be given or not (false by default)

![Table Columns configuration menu](/files/OexyacMbeuu7sU0ZAkig)

Following fileds are shown for Control types ComboBox, Edit-ComboBox, Add-ComboBox and Multi Select:

* Data source class (required if Data source type is Class): the class where to choose the value from
* Data source field (required if Data source type is Class): the field of the class that is passed as the value of the selection
* Data source controller (required if Data source type is Controller): the controller where to choose the value from
* Data source options (required if Data source type is Option): the options input set (one line per option) which values can be chosen by the user

Table column configuration for the control type 'Table' has the same fields as already described above.

If the table parameter is not required an empty table will suffice. If the table has any rows all required columns must be filled.

## UploadMultiple

Control type UploadMultiple enables the upload of multiple files per drag and drop or by uploading the files by selection within particular folder.

<figure><img src="/files/iGJWV6eivLvV3ZHC9d7l" alt=""><figcaption><p>Control Type UploadMultiple</p></figcaption></figure>

The overall upload progress for all files as well as the individual file upload progress is displayed within the corresponding entry. The multi file upload allows the user to delete individual, already uploaded files.

<figure><img src="/files/e4LZsYzF4QS8T5oF9X3i" alt=""><figcaption><p>View of the Control UploadMultiple</p></figcaption></figure>


# Trigger

This section covers how trigger can be created and customized on the platform to trigger for operations in an application.

## Overview

Trigger is a mechanism that initiates an action when an event occurs such as reaching a certain time or date or upon receiving some type of input. A trigger generally causes a workflow to be executed.

{% hint style="info" %}
For instance, your application could execute a workflow at a specific time.
{% endhint %}

## Getting started

Navigate to your **Workspace > Apps** and click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> to activate the configuration mode of your applications. Next, click on the gear icon<img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line"> of the application you wish to configure. In the **Execution** section you click on **Trigger** to access the Trigger Designer. When you open the designer, as in other designers, the management window opens with the list of all created triggers.

![Trigger Designer](/files/-MYQOSwZ9U6F25_oH8bm)

Using the trigger management window, you can clone or delete existing trigger or create new trigger for your application.

## Trigger configuration

The trigger configuration window is divided in two sections, the trigger property fields and a section to configure the trigger.

![Trigger configuration](/files/-MYeeWQFkoVIi5Ka4Gd1)

### General

General configuration define the basic properties of your trigger with some descriptive information such as name and description.

### Trigger

In the trigger section, the kind of trigger is defined and the class assigned to the trigger is selected. The available trigger kinds are:

* Hook
* Time

{% hint style="info" %}
The **class** selection is compulsory when creating a trigger.
{% endhint %}

## Building your trigger

As mentioned before, there are two types of triggers that differ in the configuration settings.

### Hook

With a hook as a trigger, an insertion method, or specifically a workflow is executed (triggered) on a particular action.

![Trigger hooks](/files/-MYekDpiSk0sE81D5Niw)

Multiple hooks can be added to each trigger. A hook consists of the properties hook kind and a list of conditions. The **kind** of the hook is the action that will trigger this trigger when executed. Possible actions are create, update and delete.\
In the list of **conditions**, the conditions are entered that must be fulfilled when the action is executed. If the conditions are not fulfilled, the configured workflow will not be executed either.

### Time

If Time is selected as the type of hook, the **start time** for execution of a workflow can be selected. Also several times can be added.

![Trigger time](/files/-MYeoXNvOOwAIjfKm62b)

### Workflow

In the workflow tab, a workflow of the previously configured class can be selected. This workflow will be executed whenever this trigger is released.\
From the context menu on the right side of the selection field you can create a new workflow, edit the selected workflow and reload the list.

![Trigger workflow](/files/-MYesV4Q1tbxATGJ3HXr)

## Validate and save

You can also check the validity of your trigger configuration by selecting the **Validate** option or save your current configuration by selecting **Save** from the bottom menu.

![Validation error](/files/-MYeuNAkbUURJUEF2l4n)

Validation errors are displayed as toast notification at the top of the platform interface.

{% hint style="danger" %}
In case your trigger is invalid, the system will not allow it to be saved.
{% endhint %}


# Scripting

The Script Designer of the TIVITY platform adds custom functionality to your app. Scripts are used to process your data in workflows.

## Introduction

The Script Designer or Scripting feature gives you the ability to extend and customise your apps with the functionalities and procedures you would rely on in your business activities.&#x20;

The Script Designer lets you create, edit and manage your app's business logic from a bird's eye view. A typical script is built using a couple of predefined Actions and optionally a set of Variables. If needed, user-defined actions can be created in the [Function Designer](broken://pages/-M8HkRswHNU8w4K_rCqe) and then used in a script.

{% hint style="info" %}
Although the functionality of the Script Designer is always the same independent of the calling context, there are differences in regards to the available options.
{% endhint %}

On the TIVITY platform the Script Designer is accessible at different locations. Refer to the article [Accessing the Script Designer](/building-an-application/execution/scripting/accessing-the-script-designer) to learn more about the various options to add scripts in your app.

## Overview

The Script Designer is divided into multiple areas.&#x20;

|                                                                 | Area Designation |
| :-------------------------------------------------------------: | ---------------- |
| <img src="/files/-MCiJ7FG3XlWZAj85tDO" alt="" data-size="line"> | Actions Menu     |
| <img src="/files/-MCiJ7FH_SohM-9R5_TU" alt="" data-size="line"> | Script Area      |
| <img src="/files/-MCiJ7FIe0j_7ZvQqMUW" alt="" data-size="line"> | Variables Menu   |

![Advanced Mode of the Script Designer](/files/-MBjrqDkK91OoI4eacMO)

Each area provides different features and might have additional areas. Each section of the Script Designer is described in more details below.

### Actions Menu

The Actions Menu contains all available actions to create a script. Because of the large number actions are organised in groups based on their core functionality.&#x20;

The return type of an action is displayed on the right-hand side of each entry.

![The Actions Menu provides functionality for a script](/files/-MCG6WDVJEHzo0F255SZ)

{% hint style="info" %}
An Action always has a return type. If no value is returned the return type is `Void`.
{% endhint %}

Any available, built-in action with its parameters and return type is documented in the [Reference: Actions](/building-an-application/execution/scripting/functions) article.

#### Action documentation area

When you click on an action is open the Action documentation area at the bottom. This shows you the details of the action like its description and purpose, the expected Parameters and the Return Type provided.

![Detailed information about the signature of an action](/files/-MCGBm0p-1jOiReAnlMt)

#### Quick access an Action

The Filter input field allows you to quickly access an action based on its name.

![Use the Filter to access an action quickly](/files/-MCqA5XE0Twhs7B3NE4h)

### Script Area

This area contains the actual statements and instructions of a script. It is the editor where actions are added to and where the functionality of the script can be configured.

#### Script Navigation bar

The navigation bar of a script is located at the top of the Script area. There you can either expand or collapse all items in the active scope of the script, you can navigate between focused scopes, and switch between different view modes.

![Script navigation bar to access scoped parts](/files/-MCGcMqpLrAvxw4Aw3BG)

The two buttons <img src="/files/-MCpyoPl7o_Zy1cUAJkd" alt="" data-size="line"> and <img src="/files/-MCpyrqeab68ZES-APNl" alt="" data-size="line"> on the left-hand side allow you to expand and collapse all script elements. The <img src="/files/-MBk-2G5WRw9YyrFXxa3" alt="" data-size="line"> eye icon on the right-hand side lets you [change the View Mode](/building-an-application/execution/scripting#switch-the-view-mode) of the Script Designer.

#### Validation area

Validation is located at the bottom of the Script area. It provides information about the current state of a script, i.e. whether it contains severe Errors, Warnings, or general Info.

![Validation area provides information regarding errors](/files/-MCpx-aMeNo3FVDsBFXK)

When you click on **Save** <img src="/files/-MClDaYdEzIPwhhdfszN" alt="" data-size="line"> the script is validated and any unresolved issues will be shown in the Validation area. More information about [Handling of Validation issues](/building-an-application/execution/scripting#handling-of-validation-issues) is described at the end of this article.

{% hint style="info" %}
It is good practice to resolve any errors and optionally warnings before closing a script and leaving the Script Designer.
{% endhint %}

### Variables Menu

The Variables Menu provides access to all available variables. The number of variables varies depending on the calling context, i.e. [Workflow Designer](/building-an-application/execution/workflows-and-application-logic) or [Function Designer](broken://pages/-M8HkRswHNU8w4K_rCqe), etc.

![The Variables Menu offers a list of variables available in the context](/files/-MCk_h3UEf9OH6egsekG)

A variable can be added into the script via drag and drop.

#### Quick access a Variable

Here, the Filter input field also allows you to quickly access a variable based on its name.

{% hint style="info" %}
Both Filter controls - Actions and Variables - search the available entries using the `Contains` comparison operator and are case-insensitive.
{% endhint %}

## Switch the View Mode

Depending on the selected view mode different features are available. The following matrix shows the details of each view mode.

| Feature shown in ... |      Simple Mode     |     Advanced Mode    |
| -------------------- | :------------------: | :------------------: |
| **Actions Menu**     | :white\_check\_mark: | :white\_check\_mark: |
| **Script Area**      | :white\_check\_mark: | :white\_check\_mark: |
| **Variables Menu**   |          :x:         | :white\_check\_mark: |

To change between Simple and Advanced view mode, click on the View Mode icon <img src="/files/-MBk-2G5WRw9YyrFXxa3" alt="" data-size="line"> in the Script navigation bar and choose an option.

![Switch between view modes](/files/-MCq0M594AgcDWmANcXo)

### Simple Mode

The Simple view mode provides access to a reduced number of Actions and shows the Script area only. This view allows you to focus on the script content and might be a good choice for simple functionalities.

### Advanced Mode

In Advanced view mode the platform provides you with all available Actions and Variables. While writing a sophisticated or complex script this view mode might offer best options to work efficiently.

## Architecture of a Script

Following section provides suggestions and good practices on how to organise and structure a script.

### The Problem

A script can be of different length or complexity and might appear confusing. There are numerous statements to assign values to variables, to process data from various data sources, and possibly interactions with other systems in regards to integration and interactions.&#x20;

![Scripts can grow quickly and contain complexity](/files/-MCvBiWXDyNxX0UQLyDb)

On first sight the above sample looks overloaded and confusing. Let's see how it would be possible to give a cleaner appearance and a better approach to organise a script.

### A common Approach: Use of Block elements

The **Block** action&#x20;can be used to create groupings of multiple statements and to separate the script into logical scopes. Therefore it is common practice to split a script into multiple blocks of statements. Additionally, use the [<img src="/files/-MCGg2M_LjK5W6zLGfFc" alt="" data-size="line"> Rename](/building-an-application/execution/scripting/using-the-script-designer#rename-a-statement) feature to give your block elements relatable names.

A typical structure of a script would work with at least two scopes.

1. Definition of variables
2. Operations

![Clean script architecture using multiple Block elements](/files/-MCuh-Dmu-9fVFyISv-l)

{% hint style="info" %}
You can use any number of Block elements to structure a script, even in a nested hierarchy.
{% endhint %}

This is related to the separation of concerns or any other kind of criteria to provide you with a better overview and focused areas of functionality.

Using multiple block elements enables you to make use of the [<img src="/files/-MCGHukV5vBqiEyjAckJ" alt="" data-size="line"> Focus](/building-an-application/execution/scripting/using-the-script-designer#focus-on-a-scope) quick action. Narrow down the visible content of a script and only work on the most relevant parts at a certain time. This approach shall give you a better experience editing your scripts.


# Accessing the Script Designer

The Script Designer is a central feature in the TIVITY platform and the Scripting functionality is available in various areas.

## Class Designer

Switch your app into Config Mode and navigate to the [Class Designer](/building-an-application/data/data-modelling). Navigate to **Data** > **Classes** to access the classes of the app.&#x20;

​‌Select a class, if already available, and expand the **Fields** node to reveal the fields collections.

### Real Field

Either you enter a field name in the **Add new field** data entry and hit *Enter* or you click an existing field to open the configuration view. Next, choose the `Advanced` section and in the `Real field` area you can either click on <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Create and open default script** to add functionality to the field or click on <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open default script** to modify existing functionality

<div align="center"><img src="/files/-MCiBuUgbTpJ4k0TH4-r" alt="Specify a default script of a field"></div>

### Virtual Field

Any field which is marked with the <img src="/files/-MCi8p81Gb0V4_jDoMUE" alt="" data-size="line"> code-fork icon on the right-hand side is a virtual field. Open the configuration view and switch to the `Advanced` section. Make sure the **Get Expression Type** in the `Virtual Field` section is set to `Script` and then click on either <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Create and open expression script** or <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open expression script** to access the script definition.

![Scripting the value of a virtual field](/files/-MCiAQo90wBPiCJmxyhr)

To remove an existing script from a Virtual field click on <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> **Delete expression script**.

### Pre-Script and Post-Script of an Action

Expand a class and open the **Actions** node to see the available functionalities. Open the configuration view to create or edit an Action. In the `Advanced` section you click on <img src="https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M8HTRblOKav_qm4KEx6%2F-MBjhTlYxxRF8b7FkWx_%2F-MBjrqDntQEvPrUZw3N9%2Ffa-cubes.png?alt=media&#x26;token=765845d9-1d21-4fe4-ab77-df971c11b8eb" alt="" data-size="line"> **Create and open Pre-Execute-Script** to define a script that is launched before the action is executed or <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open Pre-Execute-Script** to amend an existing script. Similarly, you click on <img src="https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M8HTRblOKav_qm4KEx6%2F-MBjhTlYxxRF8b7FkWx_%2F-MBjrqDntQEvPrUZw3N9%2Ffa-cubes.png?alt=media&#x26;token=765845d9-1d21-4fe4-ab77-df971c11b8eb" alt="" data-size="line"> **Create and open Post-Execute-Script** or <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open Post-Execute Script** to specify operations needed after the action has run.

![Define pre-execution or post-execution script for an action of a class](/files/-MCi3BMGSCOI4xxoC_nc)

A click on <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> **Delete Pre-/Post-Execute Script** removes the script from your action.

## Query Designer

Launch the [Query Designer](/building-an-application/data/query-data) to create a new query or edit an existing query, and move to the [Fields](/building-an-application/data/query-data/query-designer-fields) register. In the `Virtual fields` section you click on either <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Create and open script** to add a new script to the query or <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open script** to modify an existing script.

![Access the Script Designer in the Query Designer](/files/-MCFvbH4QC-g1r8uCYcn)

## Template Designer

Activate the Config Mode in your workspace and choose an application to configure. Navigate to the [Template Designer](/building-an-application/views/document-templates) under **Views** > **Templates** and create a new document template or edit an existing one. In the `Template` section you click on either <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Create and open script** to add a new script to the template or <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open script** to modify an existing script.

![Document templates can be extended using Scripts](/files/-MEg8-NQNSY6t5Ff1pgy)

## Function Designer

Navigate to your app [Functions](broken://pages/-M8HkRswHNU8w4K_rCqe) and create or edit a function. Click on either <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Create and open script** to add a new script to the function or <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open script** to modify an existing script.

![Functions are defined by scripts](/files/-MCFyCVX7T4CLnt2gHIJ)

Scripts defined under Functions allow you to specify the **Return Type** of the value processed.

## Workflow Designer

Open the Config Mode of your app and navigate to **Execution** > **Workflows** to access the list of [Workflows](/building-an-application/execution/workflows-and-application-logic). Either create a new workflow or edit an existing one. In the Element Diagram select a Transition or a Step, and access the Script Designer in the `Script` section.

Click on either <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Create and open script** to add a new script to the workflow element or <img src="/files/-MBjrqDntQEvPrUZw3N9" alt="" data-size="line"> **Open script** to modify an existing script.

![Individual workflow elements can have a script each](/files/-MCFzz3yTeHP4cE-3cZo)

##


# Using the Script Designer

Tailor-made functionalities for your app are quite common. In this article we cover the use of the Script Designer to create such features.

## Manage script statements

A script is defined as a sequence of multiple statements. A statement is described as an Action or defines a Variable.&#x20;

The Script Area contains the statements needed to implement your functionality. A statement has a data entry area, if parameters are needed, and several options in the Quick Action Menu at the top right corner.

![](/files/-MblQoGmEncHNIwP0nOD)

The following operations for a statement are offered in the Quick Action Menu.

|                                                                 | Functionality                        |
| :-------------------------------------------------------------: | ------------------------------------ |
| <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> | Delete                               |
| <img src="/files/-MCGHuk_9W70X8YeOF45" alt="" data-size="line"> | Move Up                              |
| <img src="/files/-MCGHukaaZhQZsC99D2R" alt="" data-size="line"> | Move Down                            |
| <img src="/files/-MCGHukZdjE-AjeocvlU" alt="" data-size="line"> | Filter                               |
| <img src="/files/-MCGHukV5vBqiEyjAckJ" alt="" data-size="line"> | Focus                                |
| <img src="/files/-MblT1luTixwk0XK1Hdb" alt="" data-size="line"> | Copy the action and all its children |
| <img src="/files/-MCGHukbmFiu3h2Fg4IB" alt="" data-size="line"> | Position                             |

The availability of the <img src="/files/-MCGHuk_9W70X8YeOF45" alt="" data-size="line"> Move up and <img src="/files/-MCGHukaaZhQZsC99D2R" alt="" data-size="line"> Move down action depends on the position of the statement, i.e. the first statement cannot be moved further up, similar the last statement cannot be moved further down.

### Action numbers, expand/collapse and error handling

![action numbers](/files/-MbgPCLjPJvmgZsTXXIS)

The script designer actions are numbered by the order of appearance, beginning by 1. The first filled parameter of an action with the number 1 would have the number 2. The second parameter would have the number 3 (if filled). The action after action number 1 would have the number 4. Constant parameter do not include an action and do not have a number.

The script designer allows to search for a number. Is an action with the number found the action is focused (visible through expanding parents and scrolled to. Additionally it flashes blue twice). The search input can be focused through the short cut 'G'.

![Expand and collapse items in the scope](/files/ixRJZ60LYhKN1U0sVtKr)

Pressing the "Plus" button on the top left expands all elements in the script, while pressing the "Minus" button does collapse all items in the scope. These actions do not apply for the String constant.&#x20;

![Expanded and collapsed view for the String constant ](/files/gYDXpjHlk5qiEdLQbptd)

The "Plus" button on the String constant expands the value text box so there is an overview of the content in the multiple lines format. The "Minus" button collapses back to the text box format.

Any errors in scripts are send as debug feedback messages with the following format:

* With action name: Error in \<Script-Location> at action \<Action-Number> \<Action-Type> '\<Action-Name>'
* Without action name: Error in \<Script-Location> at action \<Action-Number> \<Action-Type>

Script locations are dependent one the occurrence:

* Action-Pre: action '\<Action-Name>' \<Action-Key> pre
* Action-Post: action '\<Action-Name>' \<Action-Key> post
* Field-Default: field '\<Field-Name>' \<Field-Key> default
* Field-Virtual-Get: field '\<Field-Name>' \<Field-Key> virtual get
* Function: function '\<Function-Name>' \<Function-Key>
* Selection: selection '\<Selection-Name>' \<Selection-Key>
* SAML-Authorization: SAML authorization
* Workflow-Step: workflow '\<Workflow-Name>' \<Workflow-Key> step '\<Step-Name>'
* Workflow-Transition: workflow '\<Workflow-Name>' \<Workflow-Key> transition '\<Transition-Name>'
* Template: template '\<Template-Name>' \<Template-Key>
* Installer Application: installation '\<Application Id>'
* Execute script from script: execute script '\<Script Id>'
* ScriptController: script '\<Script Id>'

![Script error message](/files/-MbgQeKi1yl_x65fCyMV)

### Add an Action

There are two ways to add an action to the script. You click into **Drop statement here** and it opens the statement menu that contains both Actions and Variables. Click on a menu item and it will be added to the script.

![Add a statement in the script directly](/files/-MCq7MwlsWky_jfI7Z6f)

Alternatively you choose and drag an Action or Variable from the corresponding menu and drop it in the **Drop statement here** area.

![Drag an action and drop it into the script](/files/-MCq8WKd_ZH4-r8TF2sh)

Statements can be nested and therefore create a hierarchy structure within a script.

#### User-defined function

The TIVITY platform provides an extensive collection of built-in Actions. However there are scenarios that would require a specialised functionality, a certain type of feature which is not offered by the TIVITY platform, or easy use of frequently used blocks of actions.

Such a scenario would be defined as a user-defined function in the [Functions Designer](broken://pages/-M8HkRswHNU8w4K_rCqe).&#x20;

To add a user-defined function to your script, use the **ExecuteFunction** action in the Actions Menu and choose the desired functionality in the drop-down menu.&#x20;

![Using a user-defined function](/files/-MCqHLiA4It5MHvfyD18)

A statement based on a user-defined function can be handled like any other built-in action.

### Copy and paste actions

A script action and all its children can be **copied** to the clipboard through the *Quick Action Menu* (see topic on top [Manage script statements](/building-an-application/execution/scripting/using-the-script-designer#manage-script-statements)). To the right of the filter input is the copy button

![Copy actions](/files/-Mbq_QK3A28echJ8AWHI)

The script action and all its children can be **pasted** from the clipboard to a statement or expression placement through the overlay script action filter. The insert button is located in the upper right corner next to the filter input.&#x20;

If the script action is valid but cannot be copied (e.g. invalid content or due to missing script action types) an error is shown. If only children actions are invalid, only parents actions will be inserted. A message appears with the list of actions (statements and parameters) that could not be inserted.

![Paste actions](/files/-MbqZ_PPNy7Vg_in2v7H)

### &#xD;Rename a statement and check creator / modifier

The name of any statement in the script can be changed by either click on the <img src="/files/4zNtPGdchJIOSX7oJDqE" alt="" data-size="line"> info icon or click on the title. This opens the info and rename action view and allows you to enter a custom name for the action and see who created and modified the statement.

![Info and rename action view](/files/CaIEiWy1sVwdCXTZnXmt)

Click on <img src="/files/-MCGgt5RINvvesu53Fj7" alt="" data-size="line"> **Execute** to confirm the new name of the action.

{% hint style="info" %}
Renaming statements can be helpful to organise the structure of a script.
{% endhint %}

### Specify a statement

Depending on the definition of an action you would have to provide more information in the statement. Primarily you would enter necessary values for the parameters of the action.

![Specify detail information in a statement](/files/-MCqJa3wRA62PV6_ybeX)

A parameter value can be provided by the return value of another action.

{% hint style="info" %}
The return type of an action has to match the expected type of value used in a parameter.
{% endhint %}

### Delete a statement

To remove a statement from the script click on the <img src="/files/-MBERLm_rQfmOyoGQJFV" alt="" data-size="line"> Delete icon. All statements contained inside the deleted element will be removed, too.

![Remove a block of statements from the script](/files/-MCq4nzYqVjgOUvJ6kzv)

{% hint style="danger" %}
Deleting a statement happens without confirmation and cannot be undone.
{% endhint %}

### Position a statement

A statement can shifted around in the script. The buttons <img src="/files/-MCGHuk_9W70X8YeOF45" alt="" data-size="line"> Move up, <img src="/files/-MCGHukaaZhQZsC99D2R" alt="" data-size="line"> Move down, and <img src="/files/-MCGHukbmFiu3h2Fg4IB" alt="" data-size="line"> Position can be used to change the location and the order of statements. Moving a statement up or down happens at the same level of hierarchy.

![Move or position a statement within the script](/files/-MCqCoHE7OErbvjpC0a3)

The <img src="/files/-MCGHukbmFiu3h2Fg4IB" alt="" data-size="line"> Position statement feature allows you to move the statement freely. Therefore it can also be moved to a different hierarchy level.

### Define a Filter for a statement

Setting a filter on a statement is used for conditional execution of the action. Only if the expression of the condition evaluates to `true` the action runs as part of the script.

![Conditional execution of a statement based on a filter](/files/-MDoO9h_jVLQj9pbFq1x)

For example, this could be used to run additional steps in the script based on certain information in an associated field only.

### Focus on a scope

A script can consist of numerous statements and therefore might have a certain length and complexity. The <img src="/files/-MCGHukV5vBqiEyjAckJ" alt="" data-size="line"> Focus feature allows you to change the scope of the script. It narrows the visible content down to a certain block of statements.

![Focus a particular scope in a script](/files/-MCqG65RmQw3D0dNAc9b)

When you click on the <img src="/files/-MCGHukV5vBqiEyjAckJ" alt="" data-size="line"> Focus icon of any statement a new scope based on the name of the statement is added to the Navigation bar and the content of the Script area is reduced to the content of the statement.

Click on **Script** restores the normal view and shows all statements in the Script area.

### Setting time out

In order to make sure that scripts do not run indefinitely there is a possibility to set a time out in minutes for the script in the lower left corner of the script designer. Newly created scripts have a default timeout of 5 minutes.

![Setting a time out in the script](/files/bAi1FJuiv3xy0IAb3WfR)

If time out occurs error message is shown.

## Handling of Validation issues

During the process of creating or editing a script you make a number of changes to your statements, like i.e. adding new actions and code blocks. With growing length and complexity of a script the probability to encounter any error is increasing.

When you click on **Save** <img src="/files/-MClDaYdEzIPwhhdfszN" alt="" data-size="line"> to store the current state of a script the TIVITY platform performs a validation check and, if necessary, reports back any problems in the Validation area below the script.

A solid approach to handle such errors is to refer to the specification of the action. Navigate to the Action menu on the right-hand side and look for the action in question based on its name. Then click on the entry to show the Action Documentation. Check the list of required parameters and amend your script statement accordingly.

The example below adds a new variable to the script. Validation however reports that the `Name` parameter of the variable has to be set, otherwise validation will fail. Once a name has been given the error disappears and the script can be saved successfully. The second parameter `Expression` is optional and therefore does not do any harm.

![Run validation and handle any issues](/files/-MCqPR_RYKTDKvQrTeih)

Validation of scripts is important to guarantee carefree execution of functionality in your app. Always resolve any validation issues before closing a script.


# Commonly used Actions

Actions are the backbone of the scripting capability in the TIVITY platform. This article lists and described a few commonly used Actions and provides examples of use.

Block

The Block action allows the grouping of elements in logical units. It is usually used to assign a list of the same operation to a higher-level unit.

![Use of Block statements to separate a script into logical units](/files/-MEX1S90jTR0nQw3VvLH)

The example above has a Block element in which variables are assigned and another Block element in which operations are performed with those variables.&#x20;See also [Architecture of a Script](/building-an-application/execution/scripting#architecture-of-a-script) for more explanation.

Variables

Variables are commonly used to handle flexible script execution. A variable can be defined as a constant value or might hold the return of a called function. During script execution variables can be used in other actions.

### Example 1: Create a variable and assign a constant&#xD; value

In the Scripting Area click into the *Drop statement here* block and enter `variable` in the appearing search box. The Action menu is going to show you the *Variable* action. Select the Action to add it to the script.

Next, enter a *Name* for the newly created statement, e.g. `FY2021Begin` to indicate the begin of the financial year 2020/21. That name value is going to be listed in the Variables Menu and allows easy reference and use at a later stage in the script.

Then click into the *Expression (Any)* area to specify the data type of the variable, e.g. `DateTime`. The search feature assists you to find and choose the data type.&#x20;

Last, provide a value for the variable to complete the statement, e.g. `01.07.2020`.&#x20;

![Create a constant variable in the Script Designer](/files/-MEWlvJjx2S-yKGIQSc6)

The newly created variable appears in the Variable Menu on the right-hand side of the Script Designer as soon as the data type in the Expression field has been specified.&#x20;The variable can be used for other operations in the script.

### Example 2: Create a variable and assign an object&#xD;

In the Scripting Area click into the *Drop statement here* block and enter `variable` in the appearing search box. The Action menu is going to show you the *Variable* action. Select the Action to add it to the script.

Next, enter a *Name* for the newly created statement, e.g. `Context` to indicate the runtime context of the script. The variable is going to be listed in the Variables Menu and allows easy reference and use at a later stage in the script.

Then click into the *Expression (Any)* area and enter `getinstance` in the appearing search box. The result list is going to show you the *GetInstance* action which has a return type of `Object`. The GetInstance action is normally used in an instance workflow. As a reminder: “An instance workflow is a workflow that is called-up for a specific object.” The “Context” part refers to this object.

Finally, drag and drop the corresponding, built-in variables from the Variables Menu into the properties of the GetInstance expression to complete the newly created variable.

![Create a variable using the GetInstance action in the Script Designer](/files/-MEWs7U1wrvFYBGIJ898)

An Object returned by GetInstance action is identified by the following fields.

| Property             | Description                                                                                                     |
| -------------------- | --------------------------------------------------------------------------------------------------------------- |
| OfficeId (Guid)      | Indicates the ID of the workspace in which the application is located and for which a workflow is created.&#xD; |
| ApplicationId (Guid) | Indicates the ID of the application located in the selected workspace.&#xD;                                     |
| ClassId (Guid)       | Indicates the ID of the class that identifies the object.&#xD;                                                  |
| InstanceId (Any)     | Each object has a unique ID. To reference a specific object, the specific ID can be entered here.&#xD;          |
| LinkPath (LinkPath)  | The LinkPath is the navigation path to an object. It describes the steps that led to the object.                |

### Example 3: Reference a variable&#xD;

After creating variables and assigning values or objects to them, it is time to work with those variables. To illustrate this, take the subtraction of two numbers.

First define two variables `Number 1` and `Number 2` as described in [Example 1: Create a variable](/building-an-application/execution/scripting/commonly-used-actions#example-1-create-a-variable-and-assign-a-constant-value).&#x20;

Then add the *Subtract* action to the script and drag the two variables from the Variables Menu on the right-hand side to the desired place in the statement.

![Get values of variables in an action](/files/-MEXCLhJRyWq3WBwydT1)

{% hint style="info" %}
The choice of `Get` or `Set` operation defines how the value of a variable is used in a script (see green boxes above).
{% endhint %}

GetCurrentUser

Many scripts require information from the user who initiated the script, i.e within a workflow. In order to interact with the user on the TIVITY platform get the user object using the *GetCurrentUser* action and save it in a variable called `User`.&#x20;

{% hint style="info" %}
A user is uniquely identified by an office. \
Therefore select the *Context.OfficeId* variable from the Variables Menu.
{% endhint %}

![Get the current user and store it in a variable](/files/-MEXOGb2urxvnqZQCgKh)

Now, it is possible to work with the user object just like with any other object and, i.e. use the *GetValue* action to read out a user’s ID.

## Working with Values

Compared to variables Values are associated with an object. The two actions `GetValue` and `SetValue` allow you to read a field of an object and to define a new value for a field.

### GetValue&#xD;

The *GetValue* action allows to read a value from a field of an object.&#x20;The action has two parameters. *Object (Object)* identifies the object from which the value is to be read. *Field (String)* is the property of the object which holds the value. The terms in parentheses indicate the expected data type.

![Read the Field (Id) of an object](/files/-MEXGqwJm-ZENqKl1jdE)

The example above uses the *GetValue* action from the Actions Menu. Then, drag the “Object” object previously defined from the Variables Menu into the *Get Variable* area. Next, enter the word “Id” in the text box next or under Field.

{% hint style="info" %}
Field is case-sensitive, i.e. upper case and lower case are important here.
{% endhint %}

Field denotes the field of an object. This means that it is possible to look up the key of a field in an object in the class designer. An alternative way to access a Field is described under [GetSystemName](/building-an-application/execution/scripting/commonly-used-actions#getsystemname).

### SetValue&#xD;

In comparison the *SetValue* action allows values to be set in a field of an object. The two parameters *Object* and *Field* are equivalent to the GetValue action. The third parameter *Value* is the actual value to be stored in the field.

In order to be able to set a value to an object you need to hold a reference to it. The action *GetInstance* provides you access to such an object reference, as described in [Example 2: Create a variable and assign an object](/building-an-application/execution/scripting/commonly-used-actions#example-2-create-a-variable-and-assign-an-object).

![Set or update the value in a field (Description) of an object (Note)](/files/-MEXLKl0vVs38Pv1JKX6)

In the example above you get a reference of an *Object* of type `Note` using a variable. Next, the script is going to update the *Field* `Description` with the information provided in the *Value* expression.

{% hint style="info" %}
This example was greatly simplified. In a real scenario, the user should be able to enter a value on the UI, and the script should represent the logic to store this value.
{% endhint %}

GetSystemName

The *GetSystemName* action allows you to look up the names of fields of a class directly in the Script Designer. This eliminates the need to go into the [Class Designer](/building-an-application/data/data-modelling) just to look up the name of a field.

<figure><img src="/files/pdmzmbSYkSIGkDK9piBW" alt=""><figcaption><p>Use GetSystemName to reference a field and set a new value</p></figcaption></figure>

The example shows how to set a value to a variable `Note` of type Object. It uses the *GetSystemName* action to reference the field `Description` of an object (here: Unit).

## GetSystemId

Just as with the *GetSystemName* action, the GetSystemId action allows you to fetch the Ids. A list of available classes, fields, actions, workflows etc. can be used to search for a specific name. If you don't know the name, you can also search for the type, e.g. with the search word 'class' all classes are listed.\
In addition, if you enter e.g. 'controller', all controllers will be listed.

![Script helper GetSystemId](/files/PyucCW0ydTd7dJa0pJG4)

#### Available ID lists

* Class
* Field
* Action
* Workflow
* Layout
* Query
* Script
* Template
* Function
* Link
* LinkServiceType
* Controller
* Group
* Office
* Feature


# Reference: Actions

Complete reference of built-in actions in the TIVITY platform.

## [Math](/building-an-application/execution/scripting/functions/math-actions)

* Add
* Ceil
* Divide
* Increment
* Modulo
* Multiply
* Pow
* Round
* Square Root
* Subtract

## [System](/building-an-application/execution/scripting/functions/system-actions)

* ActionResult
* AddItem
* CheckoutDocument
* Close
* Condition
* Convert
* CopyContent
* CountDocumentPages
* CreateAndExecuteTemplate
* CreateInstance
* CreateLinkedInstance
* CreateLinkPath
* CreateSiblingInstance
* DataSourceOptionEscape
* DataSourceOptionObject
* DataSourceOptionWriter
* DeleteInstance
* Deprecated!ExecuteScript
* Deprecated!ExecuteSection
* Deprecated!Lock
* Dictionary
* Download
* DownloadFromInstance
* Entry
* ExecuteClassAction
* ExecuteClassWorkflow
* ExecuteFunction
* ExecuteInstanceAction
* ExecuteInstanceWorkflow
* ExecuteSection2
* ExecuteTemplate
* ExecuteTemplate2
* FinalizeDocument
* GetActionValue
* GetApplicationIdByKey
* GetBosLoginValue
* GetClassId
* GetClassValue
* GetClassValue
* GetCurrentInstance
* GetCurrentInstances
* GetCurrentUser
* GetCurrentUserLanguage
* GetDocument
* GetDocumentAsString
* GetDocumentValue
* GetDocumentAsByteArray
* GetEntry
* GetFieldName
* GetFieldNames
* GetFieldValue
* GetGroupRoles
* GetGroupUsers
* GetHtml
* GetInstance
* GetInstances
* GetKeys
* GetLanguage
* GetLinkedInstances
* GetLinkId
* GetLinkPath
* GetMainInstance
* GetOfficeUsers
* GetOldInstance
* GetRoleChildRoles
* GetRoleParentRoles
* GetRoleUsers
* GetTargetClassId
* GetTemplates
* GetTemplatesByClassId
* GetUser
* GetUser
* GetValue
* GetValues
* IdentityTable
* Input
* Inputs
* Layout
* LinkInstances
* List
* LoadNew
* Message
* ObjectDefaultValue
* ObjectOptions
* Open
* PackZip
* Parameter
* Parameter2
* ReduceLinkPath
* Refresh
* Reload
* RunSelection
* RunSelection
* SaveInstance
* Selection
* SetEntry
* SetValue
* StatusFeedback
* TableDefaultValue
* TableOptions
* UnpackZip
* UploadDocument
* Variable
* Variable2

## [Date](/building-an-application/execution/scripting/functions/date-actions)

* AddToDateTime
* AddToTimeSpan
* Now
* PartOfDateTime
* PartOfTimeSpan
* ToBeginOfMonth
* ToEndOfMonth

## [Collection](/building-an-application/execution/scripting/functions/collection-actions)

* All
* Any
* Count
* Distinct
* ElementAt
* First
* GetGroupKey
* GroupBy
* Last
* Many
* None
* One
* OrderAscending
* OrderDescending
* Reverse
* Select
* Single
* Skip
* Take
* Where

## [Logical Operators](/building-an-application/execution/scripting/functions/logicaloperators)

* And
* Not
* Or

## [Web](/building-an-application/execution/scripting/functions/web)

* AsJsonHttpResult
* DeserializeFromJson
* ExecuteHttpRequest
* HttpRequest
* JsonHttpContent
* SerializeToJson

## [Structure](/building-an-application/execution/scripting/functions/structure) <a href="#pragma-line-3754" id="pragma-line-3754"></a>

* Block
* Case
* Comment
* DoWhile
* Error
* ForEach
* IfThenElse
* Return
* Switch
* TryCatch
* While

## [Constants](/building-an-application/execution/scripting/functions/constants) <a href="#pragma-line-4020" id="pragma-line-4020"></a>

* Byte
* Char
* DateTime
* DateTime2
* DateTime3
* Double
* False
* Float
* Guid
* Int
* Language
* Long
* Null
* Short
* String
* TimeSpan
* TimeSpan2
* TimeSpan3
* True

## [Converters](/building-an-application/execution/scripting/functions/converters) <a href="#pragma-line-4471" id="pragma-line-4471"></a>

* CanBeDateTime
* CanBeInt
* ToDateTime
* ToDouble
* ToFloat
* ToGuid
* ToInt
* ToString
* ToTimeSpan

## [Commands](/building-an-application/execution/scripting/functions/commands) <a href="#pragma-line-4723" id="pragma-line-4723"></a>

* CloseCommand
* DownloadCommand
* DownloadFromInstanceCommand
* ExecuteCommands
* LoadNewCommand
* MessageCommand
* OpenCommand
* RefreshCommand
* ReloadApplicationCommand
* ReloadCommand

## [Text](/building-an-application/execution/scripting/functions/text) <a href="#pragma-line-5367" id="pragma-line-5367"></a>

* Concat
* Empty
* EndString
* Format
* FormatExpression
* IndexOf
* Join
* Length
* Match
* Matches
* MatchesCapture
* PadLeft
* PadRight
* Replace
* RestString
* Split
* StartString
* StripHtml
* SubString
* ToLower
* ToUpper
* Translate
* Translation
* Trim
* TrimLeft
* TrimRight

## [Operators](/building-an-application/execution/scripting/functions/operators) <a href="#pragma-line-6034" id="pragma-line-6034"></a>

* Contains
* EndsWith
* EqualsTo
* IsBigger
* IsBiggerEqualsTo
* IsEmpty
* IsInList
* IsMatch
* IsNull
* IsNullOrEmpty
* IsNullOrWhiteSpace
* IsSmaller
* IsSmallerEqualsTo
* StartsWith

## [PowerPoint](/building-an-application/execution/scripting/functions/powerpoint) <a href="#pragma-line-6384" id="pragma-line-6384"></a>

* CountSlides
* GetSlideThumbnail
* RemoveAllSlides
* RemoveAllSlidesExceptFor

## [QR-/Barcode](/building-an-application/execution/scripting/functions/qr-barcode) <a href="#pragma-line-6490" id="pragma-line-6490"></a>

* CreateBarcode
* ReadBarcode

## [Messaging](/building-an-application/execution/scripting/functions/messaging) <a href="#pragma-line-6560" id="pragma-line-6560"></a>

* CreateMsgDocument
* CreateMsgDocumentFromWord
* GetMailInstance
* GetMsgProperties
* Notify
* SendMessage
* SendMsgDocument
* SetMsgProperties
* SharedLinkInstance
* TransformMsgDocument

## [Cells](/building-an-application/execution/scripting/functions/cells)

* CalculateWorkbookFormula
* CalculateWorksheetFormula
* CalculateCellFormula
* CreateWorkspace
* LoadWorkbook
* SaveWorkbook
* InsertWorksheets
* GetWorksheetByIndex
* GetWorksheetByName
* RemoveWorksheets
* CellsStyle
* CellsBorder
* GetCellByIndex
* GetCellByName
* ReadColumn
* ReadRow
* ReadWorksheet
* MergeCells
* UnmergeCells

## [Xml](/building-an-application/execution/scripting/functions/xml) <a href="#pragma-line-6862" id="pragma-line-6862"></a>

* DictionaryToXml&#x20;
* InstanceToXml&#x20;
* XmlEscape
* XmlSelectNode
* XmlSelectNodes&#x20;
* XmlSelectNodeValue&#x20;
* XmlSelectNodeValues&#x20;
* XmlSetNodeValue&#x20;
* XmlToDictionary

## [Admin](/building-an-application/execution/scripting/functions/admin)

* AddUserToGroup
* AddUserToOffice
* DeleteUserFromGroup
* DeleteUserFromOffice

## [Integrations](/building-an-application/execution/scripting/functions/integrations) <a href="#pragma-line-7038" id="pragma-line-7038"></a>

* ScanBusinessCardWithAbbyy

### &#x20;<a href="#pragma-line-7040" id="pragma-line-7040"></a>


# Math

## Add

Takes two values as input and performs an addition. No specification of the data type in order to work for multiple data types (Integer, Float, Double, etc.).

#### Syntax <a href="#pragma-line-2691" id="pragma-line-2691"></a>

```
Add ( Augend , Addend )
```

#### Parameters <a href="#pragma-line-2697" id="pragma-line-2697"></a>

***Augend***\
&#x20;First part of the addition.\
&#x20;Type: Any

***Addend***\
&#x20;Second part of the addition.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2708" id="pragma-line-2708"></a>

Any

## Ceil

This element always rounds up a number, even when used on a negative number

#### Syntax <a href="#pragma-line-2717" id="pragma-line-2717"></a>

```
Ceil ( X )
```

#### Parameters <a href="#pragma-line-2723" id="pragma-line-2723"></a>

***X***\
&#x20;This value receives a double or decimal type\
&#x20;Type: Double

#### Return Type <a href="#pragma-line-2730" id="pragma-line-2730"></a>

Double

## Divide

Divides the Dividend value with the Divisor value No specification of the data type in order to work for multiple data types (Integer, Float, Double, ..).

#### Syntax <a href="#pragma-line-2739" id="pragma-line-2739"></a>

```
Divide ( Dividend , Divisor )
```

#### Parameters <a href="#pragma-line-2745" id="pragma-line-2745"></a>

***Dividend***\
&#x20;First part of the division.\
&#x20;Type: Any

***Divisor***\
&#x20;Second part of the division. Mustn't be zero.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2756" id="pragma-line-2756"></a>

Any

## Increment

Increments the value of a Variable with the given Name.

#### Syntax <a href="#pragma-line-2765" id="pragma-line-2765"></a>

```
Increment ( Name )
```

#### Parameters <a href="#pragma-line-2771" id="pragma-line-2771"></a>

***Name***\
&#x20;Name of the variable which will be incremented.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-2778" id="pragma-line-2778"></a>

Int

## Modulo

Returns the reminder of the division. No specification of the data type in order to work for multiple data types (Integer, Float, Double, ..).

#### Syntax <a href="#pragma-line-2787" id="pragma-line-2787"></a>

```
Modulo ( Dividend , Divisor )
```

#### Parameters <a href="#pragma-line-2793" id="pragma-line-2793"></a>

***Dividend***\
&#x20;First part of the division.\
&#x20;Type: Any

***Divisor***\
&#x20;Second part of the division. Mustn't be zero.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2804" id="pragma-line-2804"></a>

Int

## Multiply

Multiplies two values.

#### Syntax <a href="#pragma-line-2813" id="pragma-line-2813"></a>

```
Multiply ( Multiplicand , Multiplier )
```

#### Parameters <a href="#pragma-line-2819" id="pragma-line-2819"></a>

***Multiplicand***\
&#x20;First factor of the multiplication.\
&#x20;Type: Any

***Multiplier***\
&#x20;Second factor of the multiplication.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2830" id="pragma-line-2830"></a>

Any

## Pow

Returns a specified number raised to the specified power.

#### Syntax <a href="#pragma-line-2839" id="pragma-line-2839"></a>

```
Pow ( X , Y )
```

#### Parameters <a href="#pragma-line-2845" id="pragma-line-2845"></a>

***X***\
&#x20;A double-precision floating-point number to be raised to a power.\
&#x20;Type: Double

***Y***\
&#x20;A double-precision floating-point number that specifies a power.\
&#x20;Type: Double

#### Return Type <a href="#pragma-line-2856" id="pragma-line-2856"></a>

Double

## Round

Rounds a Double or Numeric value to the nearest integer or to the specified number of fractional digits.

#### Syntax

```
Round ( Value [, Digits] [, MidpointRounding] )
```

#### Parameters

***Value***\
A Double or Numeric to be rounded.\
Type: Any

***Digits*** (optional)\
The number of fractional digits in the return value.\
Type: Integer

***MidpointRounding*** (optional)\
The rounding strategy:

* 'ToEven' (default): Rounds to the nearest number, and when a number is halfway between two others, it is rounded toward the nearest even number (IEEE 754).
* 'AwayFromZero': Rounds to the nearest number, and when a number is halfway between two others, it is rounded toward the nearest number that is away from zero (DIN 1333).\
  Type: String

#### Return Type

Double

## Square Root

Returns the square root of a specified number.

#### Syntax <a href="#pragma-line-2891" id="pragma-line-2891"></a>

```
Square Root ( X )
```

#### Parameters <a href="#pragma-line-2897" id="pragma-line-2897"></a>

***X***\
&#x20;The number whose square root is to be found.\
&#x20;Type: Double

#### Return Type <a href="#pragma-line-2904" id="pragma-line-2904"></a>

Double

## Subtract

Takes two values as input and performs a subtraction. No specification of the data type in order to work for multiple data types (Integer, Float, Double, ..).

#### Syntax <a href="#pragma-line-2913" id="pragma-line-2913"></a>

```
Subtract ( Minuend , Subtrahend )
```

#### Parameters <a href="#pragma-line-2919" id="pragma-line-2919"></a>

***Minuend***\
&#x20;First part of the subtraction.\
&#x20;Type: Any

***Subtrahend***\
&#x20;Second part of the subtraction.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2930" id="pragma-line-2930"></a>

Any

## &#x20;<a href="#pragma-line-2935" id="pragma-line-2935"></a>


# System

## ActionResult

Creates an Action Result

#### Syntax <a href="#pragma-line-8" id="pragma-line-8"></a>

```
ActionResult ( [ExecutionResult] [, Message] )
```

#### Parameters <a href="#pragma-line-14" id="pragma-line-14"></a>

***ExecutionResult*** (optional)\
&#x20;The result type ('Success', 'Cancelled', 'NeedsInput', 'Error').\
&#x20;Type: String

***Message*** (optional)\
&#x20;The Message to display to the User.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-25" id="pragma-line-25"></a>

ActionResult

## AddItem

Takes a list of any type and an item of the same type and appends the item to the list.

#### Syntax <a href="#pragma-line-34" id="pragma-line-34"></a>

```
AddItem ( List , Item )
```

#### Parameters <a href="#pragma-line-40" id="pragma-line-40"></a>

**List**\
&#x20;The list which the element is added to.\
&#x20;Type: List\<Any>

**Item**\
&#x20;The element which is be added to the list.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-51" id="pragma-line-51"></a>

List\<Any>

## AddUserToLicense

Adds a user to a license or license item. Throws an error if the license or license item does not support user assignments.

#### Syntax

```
AddUserToLicense ( LicenseId [, ItemId] , OfficeId, UserId )
```

#### Parameters

**LicenseId**\
The ID of the license the user should get assigned to.\
Type: Guid

***ItemId*** (optional)\
&#x20;The ID of the license item the user should get assigned to.\
&#x20;Type: Guid

**OfficeId**\
The office to filter the features (the current office if left empty).\
Type: Guid

**UserId**\
The ID of the user to assign the license to.\
Type: Guid

#### Return Type

Void

## CheckoutDocument

Checks out the document associated to the given Object.

#### Syntax <a href="#pragma-line-60" id="pragma-line-60"></a>

```
CheckoutDocument ( Object )
```

#### Parameters <a href="#pragma-line-66" id="pragma-line-66"></a>

***Object***\
&#x20;The Object which document will be checked out.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-73" id="pragma-line-73"></a>

Void

## Close

Closes the Layout associated to the given Object.

#### Syntax <a href="#pragma-line-82" id="pragma-line-82"></a>

```
Close ( Object )
```

#### Parameters <a href="#pragma-line-88" id="pragma-line-88"></a>

***Object***\
&#x20;The Object which Layout to close.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-95" id="pragma-line-95"></a>

Exit

## Condition

Represents a Condition in a Selection.

#### Syntax <a href="#pragma-line-104" id="pragma-line-104"></a>

```
Condition ( [LeftParenthesis] , FieldId [, IsNegated] , Operator , Value [, RightParenthesis] [, LogicalOperator] )
```

#### Parameters <a href="#pragma-line-110" id="pragma-line-110"></a>

***LeftParenthesis*** (optional)\
&#x20;The left parenthesis to use for the Condition (e. g. '(').\
&#x20;Type: String

***FieldId***\
&#x20;The ID of the Field to compare to.\
&#x20;Type: Guid

***IsNegated*** (optional)\
&#x20;Determines whether the Condition is negated or not (default: false).\
&#x20;Type: Boolean

***Operator***\
&#x20;The Operator used for the comparison ('Equal', 'NotEqual', 'Smaller', 'SmallerOrEqual', 'Greater', 'GreaterOrEqual', 'BeginsWith', 'Contains', 'EndsWith', 'IsNull', 'IsNotNull', 'IsEmpty', 'IsNullOrEmpty', 'IsNotEmpty', 'In').\
&#x20;Type: String

***Value***\
&#x20;The Value to compare to (or NULL for 'IsNull', 'IsEmpty').\
&#x20;Type: String

Converts a Source document to a Target Format. The following conversions are supported:

doc, docm, docx, dot, dotm, dotx, htm, html, log, mht, mhtml, odt, ott, rtf, txt, xhtml, xml to doc, docm, docx, dot, dotm, dotx, htm, html, log, mht, mhtml, odt, ott, rtf, txt, xhtml, xml - eml, msg to eml, msg - csv, doc, docm, docx, dot, dotm, dotx, eml, emlx, epub, fo, htm, html, ics, latex, log, mbox, mht, mhtml, msg, odp, ods, odt, oft, otp, ots, ott, pcl, pdf, pot, potm, potx, pps, ppsm, ppsx, ppt, pptm, pptx, rtf, tnef, txt, vcf, vdw, vdx, vsd, vsdx, vss, vst, vsx, vtx, xhtml, xls, xlsb, xlsm, xlsx, xltm, xltx, xml, xps to pdf

***RightParenthesis*** (optional)\
&#x20;The right parenthesis to use for the Condition (')').\
&#x20;Type: String

***LogicalOperator*** (optional)\
&#x20;The logical Operator combining this and the next Condition ('And', 'Or', 'None').\
&#x20;Type: String

#### Return Type <a href="#pragma-line-141" id="pragma-line-141"></a>

Condition

## Convert

Converts a Source document to a Target Format.

{% hint style="info" %}
The following conversions are supported:

* doc, docm, docx, dot, dotm, dotx, htm, html, log, mht, mhtml, odt, ott, rtf, txt, xhtml, xml **to** doc, docm, docx, dot, dotm, dotx, htm, html, log, mht, mhtml, odt, ott, rtf, txt, xhtml, xml
* eml, msg **to** eml, msg
* bmp, csv, doc, docm, docx, dot, dotm, dotx, emf, eml, emlx, epub, exif, fo, gif, htm, html, icon, ics, jpeg, jpg, latex, log, mbox, mht, mhtml, msg, odp, ods, odt, oft, otp, ots, ott, pcl, pdf, png, pot, potm, potx, pps, ppsm, ppsx, ppt, pptm, pptx, rtf, tiff, tnef, txt, vcf, vdw, vdx, vsd, vsdx, vss, vst, vsx, vtx, wmf, xhtml, xls, xlsb, xlsm, xlsx, xltm, xltx, xml, xps **to** pdf
  {% endhint %}

#### Syntax <a href="#pragma-line-150" id="pragma-line-150"></a>

```
Convert ( Source [, SourceFormat] , TargetFormat )
```

#### Parameters <a href="#pragma-line-156" id="pragma-line-156"></a>

**Source**\
&#x20;The Source document to convert.\
&#x20;Type: Document

***SourceFormat*** (optional)\
&#x20;The Source Format of the document. Analyses the given source if format is omitted.\
&#x20;Type: String

**TargetFormat**\
&#x20;The Target Format to convert to.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-167" id="pragma-line-167"></a>

Document

## CopyContent

Copied Content of the SourceObject to TargetObject. Optional with FieldNameList and Parameters.

#### Syntax <a href="#pragma-line-176" id="pragma-line-176"></a>

```
CopyContent ( SourceObject , TargetObject [, FieldValues] [, Parameters] )
```

#### Parameters <a href="#pragma-line-182" id="pragma-line-182"></a>

***SourceObject***\
&#x20;The Source Object to copy from.\
&#x20;Type: Object

***TargetObject***\
&#x20;Target Object to copy to.\
&#x20;Type: Object

***FieldValues*** (optional)\
&#x20;The values to set (does not copy the Source fields if this is set).\
&#x20;Type: Dictionary\<Any,Any>

***Parameters*** (optional)\
&#x20;The values to set (does copy the Source fields if this is set).\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-201" id="pragma-line-201"></a>

Object

## CopyValues

Copies values from the source to the target while including or excluding specific keys.

#### Syntax

```
CopyValues ( Source , Target [, Include ] [, Exclude ] )
```

#### Parameters <a href="#pragma-line-182" id="pragma-line-182"></a>

**Source**\
&#x20;The source Object or Dictionary\<String,Any> to copy from.\
&#x20;Type: Any

**Target**\
&#x20;The target Object or Dictionary\<String,Any> to copy to.\
&#x20;Type: Any

***Include*** (optional)\
&#x20;A list of keys to include (all by default).\
&#x20;Type: List\<String>

***Exclude*** (optional)\
&#x20;A list of keys to exclude (none by default).\
&#x20;Type: List\<String>

#### Return Type

Void

## CountDocumentPages

Returns the number of pages from a PDF or Word document.

#### Syntax <a href="#pragma-line-210" id="pragma-line-210"></a>

```
CountDocumentPages ( Document )
```

#### Parameters <a href="#pragma-line-216" id="pragma-line-216"></a>

***Document***\
&#x20;The PDF or Word document.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-223" id="pragma-line-223"></a>

Int

## CreateAndExecuteTemplate

Creates a temporary document template and execute the template.

#### Syntax <a href="#pragma-line-232" id="pragma-line-232"></a>

```
CreateAndExecuteTemplate ( Object , Document [, Parameters] )
```

#### Parameters <a href="#pragma-line-238" id="pragma-line-238"></a>

***Object***\
&#x20;The object which the template is performed on.\
&#x20;Type: Any

***Document***\
&#x20;The template document.\
&#x20;Type: Any

***Parameters*** (optional)\
&#x20;List of Replacing Parameters (key: replace tag, value: replacing text).\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-253" id="pragma-line-253"></a>

Document

## **CreateDocumentFromBase64String**

Creates a document from a Base64 encoded String and returns it.

#### Syntax

```
CreateDocumentFromBase64String ( Content , FileName [, MimeType] ) 
```

#### Parameters

**Content**\
&#x20;The Base64 encoded document content.\
&#x20;Type: String

**Filename**\
&#x20;The file name of the document.\
&#x20;Type: String

***MimeType*** (optional)\
&#x20;The MIME type of the document. Analyses the FileName extension if left empty.\
&#x20;Type: String

#### Return Type

Document

## CreateInstance

Takes OfficeId, ApplicationId, ClassId, Parameters, LinkPath as input, which are used to create an instance. OfficeId, ApplicationId identify the space in which the instance is created. ClassId defines the type of the instance created. Link Path can specify a specific navigation path to the instance. Parameters represent a Dictionary which is a list of Key-Value-Pairs. (see Dictionary)

#### Syntax <a href="#pragma-line-262" id="pragma-line-262"></a>

```
CreateInstance ( OfficeId , ApplicationId , ClassId [, Parameters] [, LinkPath] )
```

#### Parameters <a href="#pragma-line-268" id="pragma-line-268"></a>

***OfficeId***\
&#x20;This ID identifies the Workspace / Office in which the instance is created.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;This ID identifies the Application in which the instance is created.\
&#x20;Type: Guid

***ClassId***\
&#x20;This ID identifies the Class of which the instance is created.\
&#x20;Type: Guid

***Parameters*** (optional)\
&#x20;This is a set of Key-Value-Pairs which is used as parameters for the creation of an object.\
&#x20;Type: Dictionary\<Any,Any>

***LinkPath*** (optional)\
&#x20;Navigation path to the object.\
&#x20;Type: LinkPath

#### Return Type <a href="#pragma-line-291" id="pragma-line-291"></a>

Object

## CreateLinkedInstance

Takes Object, LinkId, Parameters as input, which are used to create a linked instance. The LinkId is used to specify a link which was created in the Class Designer. Parameters represent a Dictionary which is a list of Key-Value-Pairs. (see Dictionary)

#### Syntax <a href="#pragma-line-300" id="pragma-line-300"></a>

```
CreateLinkedInstance ( Object , LinkId [, Parameters] )
```

#### Parameters <a href="#pragma-line-306" id="pragma-line-306"></a>

***Object***\
&#x20;Object which is used as basis of the link.\
&#x20;Type: Object

***LinkId***\
&#x20;The ID of the Link which has been specified in the Class Designer.\
&#x20;Type: Guid

***Parameters*** (optional)\
&#x20;This is a set of Key-Value-Pairs which is used as parameters for the creation of an object.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-321" id="pragma-line-321"></a>

Object

## CreateLinkPath

Creates a Link Path.

#### Syntax <a href="#pragma-line-330" id="pragma-line-330"></a>

```
CreateLinkPath ( [OfficeId] [, ClassId] [, InstanceId] )
```

#### Parameters <a href="#pragma-line-336" id="pragma-line-336"></a>

***OfficeId*** (optional)\
&#x20;The ID of the Office of the Link Path.\
&#x20;Type: Guid

***ClassId*** (optional)\
&#x20;The ID of the Class of the Link Path.\
&#x20;Type: Guid

***InstanceId*** (optional)\
&#x20;The ID of the Instance of the Link Path.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-351" id="pragma-line-351"></a>

Link

## CreateSiblingInstance

Creates an object having the same parent and the same type as the current object.

#### Syntax <a href="#pragma-line-360" id="pragma-line-360"></a>

```
CreateSiblingInstance ( Object [, Parameters] )
```

#### Parameters <a href="#pragma-line-366" id="pragma-line-366"></a>

***Object***\
&#x20;The object a sibling created for.\
&#x20;Type: Object

***Parameters*** (optional)\
&#x20;This is a set of Key-Value-Pairs which is used as parameters for the creation of an object.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-377" id="pragma-line-377"></a>

Object

## DataSourceOptionEscape

Escapes characters used in a data source option.

#### Syntax <a href="#pragma-line-386" id="pragma-line-386"></a>

```
DataSourceOptionEscape ( Value )
```

#### Parameters <a href="#pragma-line-392" id="pragma-line-392"></a>

***Value***\
&#x20;The value that contains the characters to escape.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-399" id="pragma-line-399"></a>

String

## DataSourceOptionObject

Represents an object used in a data source option.

#### Syntax <a href="#pragma-line-408" id="pragma-line-408"></a>

```
DataSourceOptionObject ( Id [, Name] [, Translations] )
```

#### Parameters <a href="#pragma-line-414" id="pragma-line-414"></a>

**Id**\
&#x20;The ID of the option object (must not be escaped).\
&#x20;Type: String

***Name*** (optional)\
&#x20;The name of the option object (must not be escaped). ID is used if the name is not provided.\
&#x20;Type: String

***Translations*** (optional)\
&#x20;The translations of the option name (texts must not be escaped).\
&#x20;Type: List\<Translation>

#### Return Type <a href="#pragma-line-425" id="pragma-line-425"></a>

DataSourceOptionObject

## DataSourceOptionWriter

Creates an escaped data source option string using DataSourceOptionObjects.

#### Syntax <a href="#pragma-line-434" id="pragma-line-434"></a>

```
DataSourceOptionWriter ( Objects )
```

#### Parameters <a href="#pragma-line-440" id="pragma-line-440"></a>

***Objects***\
&#x20;The data source option objects to use to create the option string.\
&#x20;Type: List\<DataSourceOptionObject>

#### Return Type <a href="#pragma-line-447" id="pragma-line-447"></a>

String

## DeleteInstance

Deletes an instance of an object.

#### Syntax <a href="#pragma-line-456" id="pragma-line-456"></a>

```
DeleteInstance ( [Object] )
```

#### Parameters <a href="#pragma-line-462" id="pragma-line-462"></a>

***Object*** (optional)\
&#x20;The Object that will be deleted.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-469" id="pragma-line-469"></a>

Void

## Deprecated!ExecuteScript

Deprecated! Executes a script identified by its ID.

#### Syntax <a href="#pragma-line-478" id="pragma-line-478"></a>

```
Deprecated!ExecuteScript ( ScriptId )
```

#### Parameters <a href="#pragma-line-484" id="pragma-line-484"></a>

***ScriptId***\
&#x20;ID identifying the Script which will be executed.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-491" id="pragma-line-491"></a>

Any

## Deprecated!ExecuteSection

Deprecated! Executes a Template as a Section (usable in other Templates) and returns the result.

#### Syntax <a href="#pragma-line-500" id="pragma-line-500"></a>

```
Deprecated!ExecuteSection ( TemplateId , Language [, OfficeId] [, ApplicationId] [, LinkPath] [, InstanceId] [, Parameters] )
```

#### Parameters <a href="#pragma-line-506" id="pragma-line-506"></a>

***TemplateId***\
&#x20;The ID of the Template to execute.\
&#x20;Type: Guid

***Language***\
&#x20;Not used: The Language of the Template.\
&#x20;Type: Language

***OfficeId*** (optional)\
&#x20;The ID of the Office to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;The ID of the Application to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;The Link Path of the Instance to execute the Template with.\
&#x20;Type: LinkPath

***InstanceId*** (optional)\
&#x20;The ID of the Instance to execute the Template with.\
&#x20;Type: Any

***Parameters*** (optional)\
&#x20;The required Parameters of the Template.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-537" id="pragma-line-537"></a>

Any

## Deprecated!Lock

Deprecated! Locks the execution of a group of statements.

#### Syntax <a href="#pragma-line-546" id="pragma-line-546"></a>

```
Deprecated!Lock ( Block )
```

#### Parameters <a href="#pragma-line-552" id="pragma-line-552"></a>

***Block***\
&#x20;Represents the list of statements.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-559" id="pragma-line-559"></a>

Void

## Dictionary

Creates an empty list of key value pairs.

#### Syntax <a href="#pragma-line-568" id="pragma-line-568"></a>

```
Dictionary ( [Entries] )
```

#### Parameters <a href="#pragma-line-574" id="pragma-line-574"></a>

***Entries*** (optional)\
&#x20;The Entries to set initially.\
&#x20;Type: Entry

#### Return Type <a href="#pragma-line-581" id="pragma-line-581"></a>

Dictionary\<Any,Any>

## Download

Downloads a Document.

#### Syntax <a href="#pragma-line-590" id="pragma-line-590"></a>

```
Download ( Document )
```

#### Parameters <a href="#pragma-line-596" id="pragma-line-596"></a>

***Document***\
&#x20;The Document to download.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-603" id="pragma-line-603"></a>

Exit

## DownloadFromInstance

Downloads a Document associated with an Object.

#### Syntax <a href="#pragma-line-612" id="pragma-line-612"></a>

```
DownloadFromInstance ( Object )
```

#### Parameters <a href="#pragma-line-618" id="pragma-line-618"></a>

***Object***\
&#x20;The Object with the associated Document.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-625" id="pragma-line-625"></a>

Exit

## Entry

Represents an Entry in a Dictionary.

#### Syntax <a href="#pragma-line-634" id="pragma-line-634"></a>

```
Entry ( Key [, Value] )
```

#### Parameters <a href="#pragma-line-640" id="pragma-line-640"></a>

***Key***\
&#x20;The Key of the Entry.\
&#x20;Type: Any

***Value*** (optional)\
&#x20;The Value of the Entry\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-651" id="pragma-line-651"></a>

Entry

## ExecuteClassAction

Executes an action for a specific class in a specific Office and Application, with specific parameters and LinkPath.

#### Syntax <a href="#pragma-line-660" id="pragma-line-660"></a>

```
ExecuteClassAction ( OfficeId , ApplicationId , ClassId , ActionId [, LinkPath] [, Parameters] )
```

#### Parameters <a href="#pragma-line-666" id="pragma-line-666"></a>

***OfficeId***\
&#x20;This ID identifies the Workspace / Office of the class for which the action should be executed.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;This ID identifies the Application of the class for which the action should be executed.\
&#x20;Type: Guid

***ClassId***\
&#x20;This ID identifies the Class for which the action should be executed.\
&#x20;Type: Guid

***ActionId***\
&#x20;This ID identifies the Action which will be executed.\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;Navigation path to the object. Optional and can be null.\
&#x20;Type: LinkPath

***Parameters*** (optional)\
&#x20;This is a set of Key-Value-Pairs which is used as parameters for a class execution.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-693" id="pragma-line-693"></a>

Any

## ExecuteClassWorkflow

Executes a workflow for a specific class in a specific Office and Application, with specific parameters and LinkPath.

#### Syntax <a href="#pragma-line-702" id="pragma-line-702"></a>

```
ExecuteClassWorkflow ( [OfficeId] [, ApplicationId] , ClassId , WorkflowId [, LinkPath] [, Parameters] )
```

#### Parameters <a href="#pragma-line-708" id="pragma-line-708"></a>

***OfficeId*** (optional)\
&#x20;This ID identifies the Workspace / Office of the class for which the workflow should be executed.\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;This ID identifies the Application of the class for which the workflow should be executed.\
&#x20;Type: Guid

***ClassId***\
&#x20;This ID identifies the Class for which the workflow should be executed.\
&#x20;Type: Guid

***WorkflowId***\
&#x20;This ID identifies the Workflow which will be executed.\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;Navigation path to the object. Optional and can be null.\
&#x20;Type: LinkPath

***Parameters*** (optional)\
&#x20;This is a set of Key-Value-Pairs which is used as parameters for a class execution.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-735" id="pragma-line-735"></a>

Any

## ExecuteFunction

Executes a Function and returns the result.

#### Syntax <a href="#pragma-line-744" id="pragma-line-744"></a>

```
ExecuteFunction ( [FunctionId] [, Parameters] )
```

#### Parameters <a href="#pragma-line-750" id="pragma-line-750"></a>

***FunctionId*** (optional)\
&#x20;The ID of the Function to execute.\
&#x20;Type: Guid

***Parameters*** (optional)\
&#x20;The Parameters required by the Function.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-761" id="pragma-line-761"></a>

Any

## ExecuteInstanceAction

Takes an object, an ActionId and Dictionary of Parameters as input and executes an action on that object.

#### Syntax <a href="#pragma-line-770" id="pragma-line-770"></a>

```
ExecuteInstanceAction ( Object , ActionId [, Parameters] )
```

#### Parameters <a href="#pragma-line-776" id="pragma-line-776"></a>

***Object***\
&#x20;The object which the action is performed on.\
&#x20;Type: Object

***ActionId***\
&#x20;ID identifying the Action which will be executed.\
&#x20;Type: Guid

***Parameters*** (optional)\
&#x20;This is a set of Key-Value-Pairs which is used as parameters for an instance execution.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-791" id="pragma-line-791"></a>

Any

## ExecuteInstanceWorkflow

Takes an object, an WorkflowId and Dictionary of Parameters as input and executes a workflow on that object.

#### Syntax <a href="#pragma-line-800" id="pragma-line-800"></a>

```
ExecuteInstanceWorkflow ( Object , WorkflowId [, Parameters] )
```

#### Parameters <a href="#pragma-line-806" id="pragma-line-806"></a>

***Object***\
&#x20;The object which the workflow is performed on.\
&#x20;Type: Any

***WorkflowId***\
&#x20;ID identifying the Workflow which will be executed.\
&#x20;Type: Any

***Parameters*** (optional)\
&#x20;This is a set of Key-Value-Pairs which is used as parameters for an instance execution.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-821" id="pragma-line-821"></a>

Any

## ExecuteSection2

Executes a Template as a Section (usable in other Templates) and returns the result.

#### Syntax <a href="#pragma-line-830" id="pragma-line-830"></a>

```
ExecuteSection2 ( TemplateId [, TemplateDocument] [, ParentId] [, ParentDocument] [, Language] [, OfficeId] [, ApplicationId] [, LinkPath] [, InstanceId] [, Parameters] )
```

#### Parameters <a href="#pragma-line-836" id="pragma-line-836"></a>

**TemplateId**\
&#x20;The ID of the Template to execute.\
&#x20;Type: Guid

***TemplateDocument*** (optional)\
&#x20;The document to use (instead of the document of the Template with the given ID).\
&#x20;Type: Document

***ParentId*** (optional)\
&#x20;The ID of the Parent Template to use if no parent is defined.\
&#x20;Type: Guid

***ParentDocument*** (optional)\
&#x20;The parent document to use (instead of the document of the Template parent or the Parent with the given ID).\
&#x20;Type: Document

***Language*** (optional)\
&#x20;Not used: The Language of the Template.\
&#x20;Type: Language

***OfficeId*** (optional)\
&#x20;The ID of the Office to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;The ID of the Application to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;The Link Path of the Instance to execute the Template with.\
&#x20;Type: LinkPath

***InstanceId*** (optional)\
&#x20;The ID of the Instance to execute the Template with.\
&#x20;Type: Any

***Parameters*** (optional)\
&#x20;The required Parameters of the Template.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-871" id="pragma-line-871"></a>

Any

## ExecuteTemplate

Executes a Template and returns the Document result.

#### Syntax <a href="#pragma-line-880" id="pragma-line-880"></a>

```
ExecuteTemplate ( TemplateId [, Language] [, OfficeId] [, ApplicationId] [, LinkPath] [, InstanceId] [, Parameters] )
```

#### Parameters <a href="#pragma-line-886" id="pragma-line-886"></a>

***TemplateId***\
&#x20;The ID of the Template to execute.\
&#x20;Type: Guid

***Language*** (optional)\
&#x20;Not used: The Language of the Template.\
&#x20;Type: Language

***OfficeId*** (optional)\
&#x20;The ID of the Office to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;The ID of the Application to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;The Link Path of the Instance to execute the Template with.\
&#x20;Type: LinkPath

***InstanceId*** (optional)\
&#x20;The ID of the Instance to execute the Template with.\
&#x20;Type: Any

***Parameters*** (optional)\
&#x20;The required Parameters of the Template.\
&#x20;Type: Dictionary

#### Return Type <a href="#pragma-line-917" id="pragma-line-917"></a>

Document

## ExecuteTemplate2

Executes a Template and returns the Document result.

#### Syntax <a href="#pragma-line-926" id="pragma-line-926"></a>

```
ExecuteTemplate2 ( TemplateId [, TemplateDocument] [, ParentId] [, ParentDocument] [, Language] [, OfficeId] [, ApplicationId] [, LinkPath] [, InstanceId] [, Parameters] )
```

#### Parameters <a href="#pragma-line-932" id="pragma-line-932"></a>

**TemplateId**\
&#x20;The ID of the Template to execute.\
&#x20;Type: Guid

***TemplateDocument*** (optional)\
&#x20;The document to use (instead of the document of the Template with the given ID).\
&#x20;Type: Document

***ParentId*** (optional)\
&#x20;The ID of the Parent Template to use if no parent is defined.\
&#x20;Type: Guid

***ParentDocument** (optional)*\
&#x20;The parent document to use (instead of the document of the Template parent or the Parent with the given ID).\
&#x20;Type: Document

***Language*** (optional)\
&#x20;Not used: The Language of the Template.\
&#x20;Type: Language

***OfficeId*** (optional)\
&#x20;The ID of the Office to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;The ID of the Application to execute the Template in (used for the Instance).\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;The Link Path of the Instance to execute the Template with.\
&#x20;Type: LinkPath

***InstanceId*** (optional)\
&#x20;The ID of the Instance to execute the Template with.\
&#x20;Type: Any

***Parameters*** (optional)\
&#x20;The required Parameters of the Template.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-967" id="pragma-line-967"></a>

Document

## FinalizeDocument

Finalize the document

#### Syntax <a href="#pragma-line-976" id="pragma-line-976"></a>

```
FinalizeDocument ( Object [, FinalizedOn] [, FinalizedBy] )
```

#### Parameters <a href="#pragma-line-982" id="pragma-line-982"></a>

***Object***\
&#x20;Object which document will be finalized.\
&#x20;Type: Object

***FinalizedOn*** (optional)\
&#x20;Time when the document is finalized. Optional parameter: if not set the current time will be taken.\
&#x20;Type: DateTime

***FinalizedBy*** (optional)\
&#x20;The parameter specifies who is finalizing document. Optional parameter: if not set the current user will be taken.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-997" id="pragma-line-997"></a>

Void

## GetActionValue

Returns a property value of an Action.

#### Syntax <a href="#pragma-line-1006" id="pragma-line-1006"></a>

```
GetActionValue ( OfficeId , ApplicationId , ClassId , ActionKey , ActionPropertyName )
```

#### Parameters <a href="#pragma-line-1012" id="pragma-line-1012"></a>

***OfficeId***\
&#x20;The ID of the Office that contains the Action.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;The ID of the Application that contains the Action.\
&#x20;Type: Guid

***ClassId***\
&#x20;The ID of the Class that contains the Action.\
&#x20;Type: Guid

***ActionKey***\
&#x20;The Key of the Action.\
&#x20;Type: String

***ActionPropertyName***\
&#x20;The Name of the Property to get the value from.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1035" id="pragma-line-1035"></a>

Object

## GetApplicationIdByKey

Gets the Application ID installed in the Office identified by the Key.

#### Syntax <a href="#pragma-line-1044" id="pragma-line-1044"></a>

```
GetApplicationIdByKey ( [OfficeId] , Key )
```

#### Parameters <a href="#pragma-line-1050" id="pragma-line-1050"></a>

***OfficeId*** (optional)\
&#x20;The ID of the Office where the Application is installed.\
&#x20;Type: Guid

***Key***\
&#x20;The Key of the Application (or its Parent Application).\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1061" id="pragma-line-1061"></a>

Guid

## GetBosLoginValue

Gets the value of a Source Login identified by the Source Key and Key of the value.

#### Syntax <a href="#pragma-line-1070" id="pragma-line-1070"></a>

```
GetBosLoginValue ( BosKey , Key [, OfficeId] [, ApplicationId] )
```

#### Parameters <a href="#pragma-line-1076" id="pragma-line-1076"></a>

***BosKey***\
&#x20;The Key of the Source.\
&#x20;Type: String

***Key***\
&#x20;The Key of the Login value.\
&#x20;Type: String

***OfficeId*** (optional)\
&#x20;The ID of the Office for which the Login were created.\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;The ID of the Application for which the Login were created.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-1095" id="pragma-line-1095"></a>

Object

## GetClassFields

Returns fields of a class. Each field contains the following fields (which can be accessed through GetValue):

Id (Guid), Key (String), InternalKey (String), Name (String), Description (String), Info (String), DataType (String), ControlType (String), IsIdentity (Boolean), IsNullable (Boolean), IsReadOnly (Boolean), IsRequired (Boolean), Length (Integer), IsVirtual (Boolean), IsMultilanguage (Boolean), DataSourceClassId (Guid), DataSourceSelectionId (Guid), DataSourceFieldId (Guid), DataSourceNameFieldId (Guid), DataSourceOption (String).

#### Syntax

```
GetClassFields ( ClassID )
```

#### Parameters

**ClassId**\
&#x20;The class to get the fields from.\
&#x20;Type: Guid

#### Return type

Guid

## GetClassId

Gets the ID of a Class identified Key (Model Name).

#### Syntax <a href="#pragma-line-1104" id="pragma-line-1104"></a>

```
GetClassId ( OfficeId , ApplicationId , ModelName )
```

#### Parameters <a href="#pragma-line-1110" id="pragma-line-1110"></a>

***OfficeId***\
&#x20;This ID identifies the Workspace / Office which the instances are associated with.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;This ID identifies the Application which the instances are associated with.\
&#x20;Type: Guid

***ModelName***\
&#x20;The Key of the Class (Model Name).\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1125" id="pragma-line-1125"></a>

Guid

## GetClassValue

Gets a property value of a Class associated with a given Object.

#### Syntax <a href="#pragma-line-1134" id="pragma-line-1134"></a>

```
GetClassValue ( Object , ClassFieldName )
```

#### Parameters <a href="#pragma-line-1140" id="pragma-line-1140"></a>

***Object***\
&#x20;The Object with the associated Class.\
&#x20;Type: Object

***ClassFieldName***\
&#x20;The Name of the Property to get.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1151" id="pragma-line-1151"></a>

Object

## GetClassValue

Gets a property value of a Class identified by ID of the Class and name of the property.

#### Syntax <a href="#pragma-line-1160" id="pragma-line-1160"></a>

```
GetClassValue ( OfficeId , ApplicationId , ClassId , ClassFieldName )
```

#### Parameters <a href="#pragma-line-1166" id="pragma-line-1166"></a>

***OfficeId***\
&#x20;The ID of the Office that contains the Class.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;The ID of the Application that contains the Class.\
&#x20;Type: Guid

***ClassId***\
&#x20;The ID of the Class to get the value from.\
&#x20;Type: Guid

***ClassFieldName***\
&#x20;The Name of the Property to get.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1185" id="pragma-line-1185"></a>

Any

## GetCurrentInstance

Gets the Object of the current context (e.g. for Instance Workflow).

#### Syntax <a href="#pragma-line-1194" id="pragma-line-1194"></a>

```
GetCurrentInstance (  )
```

#### Parameters <a href="#pragma-line-1200" id="pragma-line-1200"></a>

No parameters

#### Return Type <a href="#pragma-line-1204" id="pragma-line-1204"></a>

Object

## GetCurrentInstances2

Gets the Objects of the current context. If the current list is filtered only filtered Objects are returned. If the current list is bulk editing mode only selected Objects are returned.

#### Syntax

```
GetCurrentInstances2 ( Pagination )
```

#### Parameters

**Pagination** \
&#x20;The pagination to use when getting the Objects.\
&#x20;Type: Pagination

#### Return Type

Page \<Object>

## GetCurrentUser

Returns the current user executing the script as an object.

#### Syntax <a href="#pragma-line-1232" id="pragma-line-1232"></a>

```
GetCurrentUser ( [OfficeId] )
```

#### Parameters <a href="#pragma-line-1238" id="pragma-line-1238"></a>

***OfficeId*** (optional)\
&#x20;This ID identifies the Workspace / Office which the user is working on when the code is executed.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-1245" id="pragma-line-1245"></a>

Object

## GetCurrentUserLanguage

Returns the language of the current user executing the script.

#### Syntax <a href="#pragma-line-1572" id="pragma-line-1572"></a>

```
GetCurrentUserLanguage ( [OfficeId] )
```

#### Parameters <a href="#pragma-line-1578" id="pragma-line-1578"></a>

***OfficeId*** (optional)\
This ID identifies the Workspace / Office which the user is working on when the code is executed.\
*Type: Guid*

#### Return Type <a href="#pragma-line-1585" id="pragma-line-1585"></a>

Language

## GetDocument

Gets the Document from a given Object.

#### Syntax <a href="#pragma-line-1254" id="pragma-line-1254"></a>

```
GetDocument ( Object )
```

#### Parameters <a href="#pragma-line-1260" id="pragma-line-1260"></a>

***Object***\
&#x20;The Object to get Document from.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-1267" id="pragma-line-1267"></a>

Document

## GetDocumentAsBase64String

Gets the content of a document and returns Base64 encoded String

#### Syntax

```
GetDocumentAsBase64String ( Document )
```

#### Parameters

**Document**\
&#x20;The Document to get the content from.\
&#x20;Type: Document

#### Return Type

String

## GetDocumentAsString

Gets the Document XML content as a String.

#### Syntax <a href="#pragma-line-1276" id="pragma-line-1276"></a>

```
GetDocumentAsString ( Document , EncodingCodePage )
```

#### Parameters <a href="#pragma-line-1282" id="pragma-line-1282"></a>

**Document**\
&#x20;The Document to get the content from.\
&#x20;Type: Document

**EncodingCodePage**\
&#x20;The Encoding of the Document.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-1293" id="pragma-line-1293"></a>

String

## GetDocumentText

Gets the text of a Word or PDF document.

#### Syntax <a href="#pragma-line-1276" id="pragma-line-1276"></a>

```
GetDocumentText ( Document [, Format] )
```

#### Parameters <a href="#pragma-line-1282" id="pragma-line-1282"></a>

***Document***\
&#x20;The Document to get the text from.\
&#x20;Type: Document

**Format as String (optional):**\
&#x20;The format of the document: Doc, Docx, Pdf. Analyses the given document if format is omitted.

#### Return Type <a href="#pragma-line-1293" id="pragma-line-1293"></a>

String

## GetDocumentDates

Gets the creation and modification dates of a document. The dates are retrieved from the document-specific metadata (not through filesystem-specific metadata).

#### Syntax

```
GetDocumentDates ( Source [, SourceFormat] )
```

#### Parameters

**Source**\
&#x20;The source document to get the dates from..\
&#x20;Type: Document

***SourceFormat*** (optional)\
&#x20;The source format of the document. Analyses the given document if format is omitted.\
&#x20;Type: String

#### Return type

Dictionary\<String,DateTime>

## GetDocumentText

Gets the text of a Word or PDF document.

#### Syntax

```
GetDocumentText ( Document [, Format ] )
```

#### Parameters

**Document**\
&#x20;The Document to get the content from.\
&#x20;Type: Document

***Format*** (optional)\
&#x20;The format of the document. Analyses the given document, if format is omitted.\
&#x20;Type: String

#### Return type

String

## GetDocumentValue

Gets a Document property value from a given Document.

#### Syntax <a href="#pragma-line-1302" id="pragma-line-1302"></a>

```
GetDocumentValue ( Document , PropertyName )
```

#### Parameters <a href="#pragma-line-1308" id="pragma-line-1308"></a>

***Document***\
&#x20;The Document to get the property value from.\
&#x20;Type: Document

***PropertyName***\
&#x20;The Name of the Property value to get.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1319" id="pragma-line-1319"></a>

Object

## GetDocumentAsByteArray

Gets the Document content as a ByteArray.

#### Syntax

```
ByteArray GetDocumentAsByteArray( Document Document )
```

#### Parameters

***Document*** \
The Document to get the content from. \
Type: Document

#### Return Type

ByteArray

## GetEntry

Takes a Dictionary and returns the value identified by a specified Key or NULL if no value exists.

#### Syntax <a href="#pragma-line-1328" id="pragma-line-1328"></a>

```
GetEntry ( Dictionary , Key )
```

#### Parameters <a href="#pragma-line-1334" id="pragma-line-1334"></a>

***Dictionary***\
&#x20;The dictionary of which the entry is read.\
&#x20;Type: Dictionary\<Any,Any>

***Key***\
&#x20;The name of the field.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-1345" id="pragma-line-1345"></a>

Any

## GetFieldName

Gets field key by fieldId and classId from list of classIds, forInstance (without ModelName) and forValue (without \_\_RESOLVED).

#### Syntax <a href="#pragma-line-1354" id="pragma-line-1354"></a>

```
GetFieldName ( FieldId , ClassIdList [, OfficeId] [, ApplicationId] [, ForInstance] [, ForValue] )
```

#### Parameters <a href="#pragma-line-1360" id="pragma-line-1360"></a>

***FieldId***\
&#x20;The ID of the Field to get the Name from.\
&#x20;Type: Guid

***ClassIdList***\
&#x20;A list of Class IDs with the Field.\
&#x20;Type: List\<Guid>

***OfficeId*** (optional)\
&#x20;The ID of the Office that contains the Field.\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;The ID of the Application that contains the Field.\
&#x20;Type: Guid

***ForInstance*** (optional)\
&#x20;When value True is, should be got FieldName without ModelName.\
&#x20;Type: Boolean

***ForValue*** (optional)\
&#x20;When 'ForValue' true is, should be got value without \_\_RESOLVED construct.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-1387" id="pragma-line-1387"></a>

String

## GetFieldNames

Gets a list of Field Names associated with a given Object.

#### Syntax <a href="#pragma-line-1396" id="pragma-line-1396"></a>

```
GetFieldNames ( Object )
```

#### Parameters <a href="#pragma-line-1402" id="pragma-line-1402"></a>

***Object***\
&#x20;The Object to get the Field Names from.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-1409" id="pragma-line-1409"></a>

List\<String>

## GetFieldValue

Gets the property value of a Field.

#### Syntax <a href="#pragma-line-1418" id="pragma-line-1418"></a>

```
GetFieldValue ( OfficeId , ApplicationId , ClassId , FieldName , PropertyName )
```

#### Parameters <a href="#pragma-line-1424" id="pragma-line-1424"></a>

***OfficeId***\
&#x20;The ID of the Office that contains the Field.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;The ID of the Application that contains the Field.\
&#x20;Type: Guid

***ClassId***\
&#x20;The ID of the Class that contains the Field.\
&#x20;Type: Guid

***FieldName***\
&#x20;The Key of the Field to get the property value from.\
&#x20;Type: String

***PropertyName***\
&#x20;The Name of the Property\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1447" id="pragma-line-1447"></a>

Any

## GetGroupRoles

Returns roles for a group. Each role contains the 'Id' and 'Name' (which can be accessed through GetValue).

```
List<Object> GetGroupRoles(Guid GroupId)
```

**Parameters**

* **GroupId**\
  The group to filter the roles.\
  Type: Guid

**Return Type**

List\<Object>

## GetGroupUsers

Returns users for a group. Each user contains the 'Id' and 'Name' (which can be accessed through GetValue).

```
List<Object> GetGroupUsers(Guid GroupId)
```

**Parameters**

* **GroupId**\
  The group to filter the users.\
  Type: Guid

**Return Type**

List\<Object>

## GetHtml

Gets the content of a given Document as HTML.

#### Syntax <a href="#pragma-line-1456" id="pragma-line-1456"></a>

```
GetHtml ( Document )
```

#### Parameters <a href="#pragma-line-1462" id="pragma-line-1462"></a>

***Document***\
&#x20;The Document to get the HTML from.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-1469" id="pragma-line-1469"></a>

String

## GetInstance

Takes OfficeId, ApplicationId, ClassId, InstanceId and LinkPath as input and returns the object identified by the InstanceId.

#### Syntax <a href="#pragma-line-1478" id="pragma-line-1478"></a>

```
GetInstance ( OfficeId , ApplicationId , ClassId [, LinkPath] , InstanceId )
```

#### Parameters <a href="#pragma-line-1484" id="pragma-line-1484"></a>

***OfficeId***\
&#x20;This ID identifies the Workspace / Office which the instance is associated with.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;This ID identifies the Application which the instance is associated with.\
&#x20;Type: Guid

***ClassId***\
&#x20;This ID identifies the Class of the instance.\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;Navigation path to the object.\
&#x20;Type: LinkPath

***InstanceId***\
&#x20;The ID of the specific instance.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-1507" id="pragma-line-1507"></a>

Object

## GetInstances

Takes OfficeId, ApplicationId, ClassId and LinkPath as input and returns a list of Objects of the given class.

#### Syntax <a href="#pragma-line-1516" id="pragma-line-1516"></a>

```
GetInstances ( OfficeId , ApplicationId , ClassId [, LinkPath] )
```

#### Parameters <a href="#pragma-line-1522" id="pragma-line-1522"></a>

***OfficeId***\
&#x20;This ID identifies the Workspace / Office which the instances are associated with.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;This ID identifies the Application which the instances are associated with.\
&#x20;Type: Guid

***ClassId***\
&#x20;This ID identifies the Class of the instances.\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;Navigation path to the object.\
&#x20;Type: LinkPath

#### Return Type <a href="#pragma-line-1541" id="pragma-line-1541"></a>

List\<Object>

## GetKeys

Gets the Keys of a given Dictionary.

#### Syntax <a href="#pragma-line-1550" id="pragma-line-1550"></a>

```
GetKeys ( Dictionary )
```

#### Parameters <a href="#pragma-line-1556" id="pragma-line-1556"></a>

***Dictionary***\
&#x20;The Dictionary to get the Keys from.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-1563" id="pragma-line-1563"></a>

List\<Any>

## GetLanguage

Takes an ID of a language as input and returns the language of that specific instance.

#### Syntax <a href="#pragma-line-1572" id="pragma-line-1572"></a>

```
GetLanguage ( InstanceId )
```

#### Parameters <a href="#pragma-line-1578" id="pragma-line-1578"></a>

***InstanceId***\
&#x20;The ID of the language to get (e. g. LanguageId field of user instance).\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-1585" id="pragma-line-1585"></a>

Language

## GetLinkedInstances

Takes an Object and a LinkId as input and returns a list of all Objects which are linked to that instance. In case of a N:M relation, the function can return the lookup table or the target class. If "target=false" the N:M class is returned. If "target=true", the target class is returned.

#### Syntax <a href="#pragma-line-1594" id="pragma-line-1594"></a>

```
GetLinkedInstances ( Object , LinkId [, Target] )
```

#### Parameters <a href="#pragma-line-1600" id="pragma-line-1600"></a>

***Object***\
&#x20;The object for which the linked instances will be loaded.\
&#x20;Type: Object

***LinkId***\
&#x20;The ID of the Link which has been specified in the Class Designer.\
&#x20;Type: Guid

***Target*** (optional)\
&#x20;In case of a N:M relation, the function can return the lookup table or the target class. If target=false the N:M class is returned. If target=true, the target class is returned.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-1615" id="pragma-line-1615"></a>

List\<Object>

## GetLinkId

Gets the ID of a Link between a given Object and a target Class identified by a Name.

#### Syntax <a href="#pragma-line-1624" id="pragma-line-1624"></a>

```
GetLinkId ( Object , ClassName , Direction [, NmClassName] )
```

#### Parameters <a href="#pragma-line-1630" id="pragma-line-1630"></a>

***Object***\
&#x20;The source Object of the Link.\
&#x20;Type: Object

***ClassName***\
&#x20;The Name of the target Class of the Link.\
&#x20;Type: String

***Direction***\
&#x20;The Direction of the Link ('None', 'Parents', 'Children').\
&#x20;Type: String

***NmClassName*** (optional)\
&#x20;The Name of the NM Class of the Link.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1649" id="pragma-line-1649"></a>

Guid

## GetLinkPath

Gets the Link Path of a given Object.

#### Syntax <a href="#pragma-line-1658" id="pragma-line-1658"></a>

```
GetLinkPath ( Object )
```

#### Parameters <a href="#pragma-line-1664" id="pragma-line-1664"></a>

***Object***\
&#x20;The Object to get the Link Path from.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-1671" id="pragma-line-1671"></a>

LinkPath

## GetMainInstance

Gets the Main Instance by using a given Link Path.

#### Syntax <a href="#pragma-line-1680" id="pragma-line-1680"></a>

```
GetMainInstance ( OfficeId , ApplicationId , LinkPath )
```

#### Parameters <a href="#pragma-line-1686" id="pragma-line-1686"></a>

***OfficeId***\
&#x20;The ID of the Office of the the Main Instance.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;The ID of the Application of the Main Instance.\
&#x20;Type: Guid

***LinkPath***\
&#x20;The Link Path to use to get the Main Instance.\
&#x20;Type: LinkPath

#### Return Type <a href="#pragma-line-1701" id="pragma-line-1701"></a>

Object

## GetOfficeGroups

Returns groups for an office. Each group contains the 'Id' and 'Name' (which can be accessed through GetValue).

#### Syntax

```
GetOfficeGroups(
     [OfficeId]
)
```

#### Parameters

***OfficeId** (optional)*\
The office to filter the groups (the current office if left empty).\
Type: Guid

#### Return Type

List\<Object>

## GetOfficeLicenses

Returns licenses an office has access to.&#x20;

#### Syntax

```
GetOfficeLicenses( [OfficeId] )
```

#### Parameters

***OfficeId*** (optional)\
&#x20;The office to filter the users (the current office if left empty).\
&#x20;Type: Guid

#### Return Type

List\<Object>

## GetOfficeUsers

Returns users for an office. Each user contains the 'Id' and 'Name' (which can be accessed through GetValue).

#### Syntax <a href="#pragma-line-1710" id="pragma-line-1710"></a>

```
GetOfficeUsers ( [OfficeId] )
```

#### Parameters <a href="#pragma-line-1716" id="pragma-line-1716"></a>

***OfficeId*** (optional)\
&#x20;The office to filter the users (the current office if left empty).\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-1723" id="pragma-line-1723"></a>

List\<Object>

## GetOldInstance

Gets the old Object available in a triggered Workflow (Delete or Update).

#### Syntax <a href="#pragma-line-1732" id="pragma-line-1732"></a>

```
GetOldInstance (  )
```

#### Parameters <a href="#pragma-line-1738" id="pragma-line-1738"></a>

No parameters

#### Return Type <a href="#pragma-line-1742" id="pragma-line-1742"></a>

Object

## GetRoleChildRoles

Returns child roles for a role. Each role contains the 'Id' and 'Name' (which can be accessed through GetValue).

#### Syntax

```
List<Object> GetRoleChildRoles(
    Guid RoleId,
    Guid [ApplicationId]
)
```

#### **Parameters**

***RoleId***\
The role to filter the roles.\
Type: Guid

***ApplicationId** (optional)*\
The application to filter the roles (current app if left empty).\
Type: Guid

#### Return Type

List\<Object>

## GetRoleParentRoles

Returns parent roles for a role. Each role contains the 'Id' and 'Name' (which can be accessed through GetValue).

#### Syntax

```
List<Object> GetRoleParentRoles(
    Guid RoleId,
    Guid [ApplicationId]
)
```

#### Parameters

***RoleId***\
The role to filter the roles.\
Type: Guid

***ApplicationId** (optional)*\
The application to filter the roles (current app if left empty).\
Type: Guid

#### Return Type

List\<Object>

## GetRoleUsers

Returns users for a role. Each user contains the 'Id' and 'Name' (which can be accessed through GetValue).

#### Syntax

```
List<Object> GetRoleUsers(
    Guid RoleId,
    Guid [AppId]
)
```

#### Parameters

***RoleId***\
The role to filter the users.\
Type: Guid

***AppId** (optional)*\
The app to filter the users (current app if left empty).\
Type: Guid

#### Return Type

List\<Object>

## GetTargetClassId

Gets the ID of the target Class of a Link.

#### Syntax <a href="#pragma-line-1751" id="pragma-line-1751"></a>

```
GetTargetClassId ( Object , LinkId [, Target] )
```

#### Parameters <a href="#pragma-line-1757" id="pragma-line-1757"></a>

***Object***\
&#x20;The source Object of the Link.\
&#x20;Type: Object

***LinkId***\
&#x20;The ID of the Link to get the target Class from.\
&#x20;Type: Guid

***Target*** (optional)\
&#x20;Defines whether to get the Target or the NM Class (if a NM Link has been chosen).\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-1772" id="pragma-line-1772"></a>

Guid

## GetTemplates

Returns all Templates of the Office and Application (each instances has a Id, Key, Name, ClassId and Type).

#### Syntax <a href="#pragma-line-1781" id="pragma-line-1781"></a>

```
GetTemplates ( [OfficeId] [, ApplicationId] )
```

#### Parameters <a href="#pragma-line-1787" id="pragma-line-1787"></a>

***OfficeId*** (optional)\
&#x20;This ID identifies the Workspace / Office which the templates are associated with.\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;This ID identifies the Application which the templates are associated with.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-1798" id="pragma-line-1798"></a>

List\<Object>

## GetTemplatesByClassId

Returns all Templates of the Office and Application (each instances has a Id, Key, Name, ClassId and Type) executable for a Class.

#### Syntax <a href="#pragma-line-1807" id="pragma-line-1807"></a>

```
GetTemplatesByClassId ( [OfficeId] [, ApplicationId] , ClassId )
```

#### Parameters <a href="#pragma-line-1813" id="pragma-line-1813"></a>

***OfficeId*** (optional)\
&#x20;This ID identifies the Workspace / Office which the templates are associated with.\
&#x20;Type: Guid

***ApplicationId*** (optional)\
&#x20;This ID identifies the Application which the templates are associated with.\
&#x20;Type: Guid

***ClassId***\
&#x20;This ID identifies the Class for which the Templates must be executable (includes abstract Classes).\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-1828" id="pragma-line-1828"></a>

List\<Object>

## GetUser

Takes an OfficeId, and an InstanceId as input and returns the corresponding user object.

#### Syntax <a href="#pragma-line-1837" id="pragma-line-1837"></a>

```
GetUser ( OfficeId , InstanceId )
```

#### Parameters <a href="#pragma-line-1843" id="pragma-line-1843"></a>

**OfficeId**\
&#x20;The ID of the office the user is associated with.\
&#x20;Type: Guid

**InstanceId**\
&#x20;This ID which identifies the user.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-1854" id="pragma-line-1854"></a>

Object

## GetUser2

Takes an OfficeId, and an propertyName, and value as input and returns the corresponding user object.

#### Syntax <a href="#pragma-line-1863" id="pragma-line-1863"></a>

```
GetUser2 ( OfficeId , PropertyName , Value )
```

#### Parameters <a href="#pragma-line-1869" id="pragma-line-1869"></a>

**OfficeId**\
&#x20;The ID of the Office to get the User from.\
&#x20;Type: Guid

**PropertyName**\
&#x20;The Property Name to identify the User.\
&#x20;Type: String

**Value**\
&#x20;The Value to identify the User.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1884" id="pragma-line-1884"></a>

Object

## GetUserFeatures

Returns features a user has access to. Each feature contains the 'Id' and 'Name' (which can be accessed through [GetValue](#getvalue)).

#### Syntax

```
List<Object> GetUserFeatures(
    Guid [UserId],
    Guid [OfficeId]
)
```

#### Parameters

***UserId** (optional)*\
The user to filter the features (the current user if left empty).\
Type: Guid

***OfficeId** (optional)*\
The office to filter the features (the current office if left empty).\
Type: Guid

#### Return type

List\<Object>

## GetUserGroups

Returns groups for an user. Each group contains the 'Id' and 'Name' (which can be accessed through GetValue).

#### Syntax

```
List<Object> GetUserGroups(
    Guid [UserId],
    Guid [OfficeId]
)
```

#### Parameters

***UserId** (optional)*\
The user to filter the groups (the current user if left empty).\
Type: Guid

***OfficeId** (optional)*\
The office to filter the groups (the current office if left empty).\
Type: Guid

#### Return Type

List\<Object>

## GetUserRoles

Returns roles for an user. Each role contains the 'Id' and 'Name' (which can be accessed through GetValue).

#### Syntax

```
List<Object> GetUserRoles(
    Guid [UserId],
    Guid [AppId]
)
```

**Parameters**

***UserId** (optional)*\
The user to filter the roles (the current user if left empty).\
Type: Guid

***AppId** (optional)*\
The app to filter the roles (the current app if left empty).\
Type: Guid

**Return Type**

List\<Object>

## GetValue

Return the value of the given Field of an Object.

#### Syntax <a href="#pragma-line-1893" id="pragma-line-1893"></a>

```
GetValue ( Object , Field )
```

#### Parameters <a href="#pragma-line-1899" id="pragma-line-1899"></a>

***Object***\
&#x20;The object which contains the value.\
&#x20;Type: Object

***Field***\
&#x20;The name of the field which identifies the value.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1910" id="pragma-line-1910"></a>

Any

## GetValues

Returns the values of the given fields of an object separated by a given String.

#### Syntax <a href="#pragma-line-1919" id="pragma-line-1919"></a>

```
GetValues ( Object , FieldNameList , Separator )
```

#### Parameters <a href="#pragma-line-1925" id="pragma-line-1925"></a>

***Object***\
&#x20;The Object to get the Field Values from.\
&#x20;Type: Object

***FieldNameList***\
&#x20;A list of Field Names to get the values from.\
&#x20;Type: List\<String>

***Separator***\
&#x20;The Separator of the values.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1940" id="pragma-line-1940"></a>

List\<String>

## HasEntry

Checks whether the given Dictionary has an entry identified by a key.

#### Syntax

```
HasEntry ( Dictionary<Any,Any> , Key )
```

#### Parameters

**Dictionary**\
&#x20;The dictionary to check whether an entry identified by a key exists.\
&#x20;Type: Dictionary\<Any,Any>

**Key**\
&#x20;The key to identify the entry.\
&#x20;Type: Any

#### Return Type

Boolean

## IdentityTable

Increases an Identity value and returns the result.

#### Syntax <a href="#pragma-line-1949" id="pragma-line-1949"></a>

```
IdentityTable ( OfficeId , ApplicationId [, LinkPath] , SelectionId [, Parameters] , Field )
```

#### Parameters <a href="#pragma-line-1955" id="pragma-line-1955"></a>

***OfficeId***\
&#x20;The ID of the Office where the Identity Table can be accessed.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;The ID of the Application where the Identity Table can be accessed.\
&#x20;Type: Guid

***LinkPath*** (optional)\
&#x20;Navigation path to the object. Optional and can be null.\
&#x20;Type: LinkPath

***SelectionId***\
&#x20;The ID of the Selection which is used to get an Identity Object.\
&#x20;Type: Guid

***Parameters*** (optional)\
&#x20;The Parameters of the Selection.\
&#x20;Type: Dictionary\<Any,Any>

***Field***\
&#x20;The Key of the Field where the Identity value is stored.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-1982" id="pragma-line-1982"></a>

Int

## Input

Represents a request for input.

#### Syntax <a href="#pragma-line-1991" id="pragma-line-1991"></a>

```
Input ( Name , Order , Key , Description , DataType , DefaultValue [, DataSourceClassId] [, DataSourceController] , DataSourceOption [, DataSourceFieldId] , ControlType [, Length] )
```

#### Parameters <a href="#pragma-line-1997" id="pragma-line-1997"></a>

***Name***\
&#x20;Name which will be displayed.\
&#x20;Type: String

***Order***\
&#x20;Order Element\
&#x20;Type: Int

***Key***\
&#x20;The key which is used as internal reference.\
&#x20;Type: String

***Description***\
&#x20;Description of the Input.\
&#x20;Type: String

***DataType***\
&#x20;The Data type of the Input\
&#x20;Type: String

***DefaultValue***\
&#x20;Default\
&#x20;Type: String

***DataSourceClassId*** (optional)\
&#x20;Specifies the class of the input.\
&#x20;Type: Guid

***DataSourceController*** (optional)\
&#x20;Specifies the controller of the input.\
&#x20;Type: Guid

***DataSourceOption***\
&#x20;Represent predefined choices.\
&#x20;Type: String

***DataSourceFieldId*** (optional)\
&#x20;The ID of the Field for the a Data Source (must be set with DataSourceClassId).\
&#x20;Type: Guid

***ControlType***\
&#x20;The Type of the Control to display to get the Input.\
&#x20;Type: String

***Length*** (optional)\
&#x20;The maximum Length of the Input.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-2048" id="pragma-line-2048"></a>

Exit

## Inputs

Represents a request for multiple inputs.

#### Syntax <a href="#pragma-line-2057" id="pragma-line-2057"></a>

```
Inputs ( [Name] [, Description] , Parameters [, Validate] )
```

#### Parameters <a href="#pragma-line-2063" id="pragma-line-2063"></a>

***Name*** (optional)\
&#x20;The Name of the Input request (will be displayed to the User).\
&#x20;Type: String

***Description*** (optional)\
&#x20;The Description of the Input request (will be displayed to the User).\
&#x20;Type: String

**Parameters**\
&#x20;The Parameters to request.\
&#x20;Type: List\<Parameter>

***Validate*** (optional)\
A validation callback that validates the given input. \
Type: Dictionary\<String,String>

#### Return Type <a href="#pragma-line-2078" id="pragma-line-2078"></a>

Exit

## Layout

Represents a Field for a Selection.

#### Syntax <a href="#pragma-line-2087" id="pragma-line-2087"></a>

```
Layout ( FieldId , SortType [, Title] )
```

#### Parameters <a href="#pragma-line-2093" id="pragma-line-2093"></a>

***FieldId***\
&#x20;The ID of the Field.\
&#x20;Type: Guid

***SortType***\
&#x20;The sorting direction for the Field ('None', 'Ascending', 'Descending').\
&#x20;Type: String

***Title*** (optional)\
&#x20;The alias used for the Field.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-2108" id="pragma-line-2108"></a>

Layout

## LinkInstances

Link a main-instance (target) to another main-instance (source). The created link not saved! Make sure to execute save on source instance.

#### Syntax <a href="#pragma-line-2117" id="pragma-line-2117"></a>

```
LinkInstances ( SourceInstance , TargetInstance , LinkServiceType )
```

#### Parameters <a href="#pragma-line-2123" id="pragma-line-2123"></a>

***SourceInstance***\
&#x20;the source instance\
&#x20;Type: Object

***TargetInstance***\
&#x20;the target instance\
&#x20;Type: Object

***LinkServiceType***\
&#x20;type of the link\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-2138" id="pragma-line-2138"></a>

Any

## List

Creates an empty list.

#### Syntax <a href="#pragma-line-2147" id="pragma-line-2147"></a>

```
List ( [Items] )
```

#### Parameters <a href="#pragma-line-2153" id="pragma-line-2153"></a>

***Items*** (optional)\
&#x20;The initial Items for the list.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2160" id="pragma-line-2160"></a>

List\<Any>

## LoadNew

Loads a given Object new.

#### Syntax <a href="#pragma-line-2169" id="pragma-line-2169"></a>

```
LoadNew ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-2175" id="pragma-line-2175"></a>

***Object***\
&#x20;The Object to load new.\
&#x20;Type: Any

***LayoutId*** (optional)\
&#x20;The ID of the Layout for the newly loaded Object.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-2186" id="pragma-line-2186"></a>

Exit

## Message

Displays a Message to the User.

#### Syntax <a href="#pragma-line-2195" id="pragma-line-2195"></a>

```
Message ( Message )
```

#### Parameters <a href="#pragma-line-2201" id="pragma-line-2201"></a>

***Message***\
&#x20;The Message to display.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-2208" id="pragma-line-2208"></a>

Exit

## MultiSelectDefaultValue

Builds the MultiSelect default value. This should be used with the DefaultValue of a Parameter.

#### Syntax

```
MultiSelectDefaultValue (Values)
```

#### Parameters

**Values**\
&#x20;The values to use as a default value.\
&#x20;Type: List\<Any>

#### Return type

String

## MultiSelectOptions

Builds the MultiSelect options. This should be used with the Options of a Parameter.

#### Syntax

```
MultiSelectOptions ( [Columns] [, UseDropdownAfter] )
```

#### Parameters

***Columns*** (optional)\
&#x20;The Columns count for the MultiSelect Input.\
&#x20;Type: Int

***UseDropdownAfter*** (optional)\
&#x20;If the number of items within a column is greater than the provided value, the control will be displayed as a dropdown. If not provided, the control will never display as a dropdown.\
Type: Int

#### Return type

Options

## ObjectDefaultValue

Builds the Object default value. This should be used with the DefaultValue of a Parameter.

#### Syntax <a href="#pragma-line-2195" id="pragma-line-2195"></a>

```
String ObjectDefaultValue( 
    Dictionary<String,Any> Object 
)
```

#### Parameters <a href="#pragma-line-2201" id="pragma-line-2201"></a>

***Object***\
&#x20;The object data to use as a default value.\
&#x20;*Type: Dictionary\<String,Any>*

**Return Type**\
String

## ObjectOptions

Builds the Object options. This should be used with the Options of a Parameter.

#### Syntax <a href="#pragma-line-2195" id="pragma-line-2195"></a>

```
Options ObjectOptions(
    List<Parameter> Fields
)
```

#### Parameters <a href="#pragma-line-2201" id="pragma-line-2201"></a>

***Fields***\
&#x20;The fields configuration to edit the object.\
&#x20;*Type: List\<Parameter>*

**Return Type**\
Options

## Open

Opens a given Object.

#### Syntax <a href="#pragma-line-2217" id="pragma-line-2217"></a>

```
Open ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-2223" id="pragma-line-2223"></a>

***Object***\
&#x20;The Object to open.\
&#x20;Type: Object

***LayoutId*** (optional)\
&#x20;The ID of the Layout to open the Object with.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-2234" id="pragma-line-2234"></a>

Exit

## PackZip

Packs Documents in a ZIP archive and returns the result as a Document.

#### Syntax <a href="#pragma-line-2243" id="pragma-line-2243"></a>

```
PackZip ( Name , Entries )
```

#### Parameters <a href="#pragma-line-2249" id="pragma-line-2249"></a>

***Name***\
&#x20;The Name of the archive.\
&#x20;Type: String

***Entries***\
&#x20;The Documents to zip; a Dictionary where the Key is the path in the archive.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-2260" id="pragma-line-2260"></a>

Document

## Pagination

Represents a pagination to use when getting Objects.

#### Syntax

```
Pagination ( Take )
```

#### Parameters

**Take**\
&#x20;The amount of Objects to take.\
&#x20;Type: Int

#### Return Type

Pagination

## Parameter

Represents a Parameter to request as an Input (used with Inputs).

#### Syntax <a href="#pragma-line-2269" id="pragma-line-2269"></a>

```
Parameter ( Key , DataType , Name [, Description] [, IsRequired] [, DefaultValue] [, DataSourceClassId] [, DataSourceFieldId] [, DataSourceControllerId] [, DataSourceOption] [, DataSourceSelectionId] [, DataSourceSelectionKeyFieldId] [, DataSourceSelectionNameFieldId] [, DataSourceSelectionParameters]  [, ControlType] [, Length] [, Options]  )
```

#### Parameters <a href="#pragma-line-2275" id="pragma-line-2275"></a>

**Key**\
&#x20;The Key of the Input (identifies the value after the request).\
&#x20;Type: String

**DataType**\
&#x20;The Type of the Data to request.\
&#x20;Type: String

**Name**\
&#x20;The Name of the Input to display.\
&#x20;Type: String

***Description*** (optional)\
&#x20;The Description of the Input to display.\
&#x20;Type: String

***IsRequired*** (optional)\
&#x20;Defines whether the User has to Input a value.\
&#x20;Type: Boolean

***DefaultValue*** (optional)\
&#x20;The Default Value of the Input.\
&#x20;Type: String

***DataSourceClassId*** (optional)\
&#x20;The ID of the Class to choose a value from.\
&#x20;Type: Guid

***DataSourceFieldId*** (optional)\
&#x20;The ID of the Field to choose a value from (in combination with DataSourceClassId).\
&#x20;Type: Guid

***DataSourceControllerId*** (optional)\
&#x20;The ID of the Controller used to choose a value from.\
&#x20;Type: Guid

***DataSourceOption*** (optional)\
&#x20;A String representation of a list to choose a value from.\
&#x20;Type: String

***DataSourceSelectionId*** (optional)\
The ID of the Selection used to choose a value from.\
Type: Guid

***DataSourceSelectionKeyFieldId*** (optional)\
The ID of the field to identify a value (in combination with DataSourceSelectionId).\
Type: Guid

***DataSourceSelectionNameFieldId*** (optional)\
The ID of the field to display a value (in combination with DataSourceSelectionId).\
Type: Guid

***DataSourceSelectionParameters*** (optional)\
The parameters to use for the Selection as default values.\
Type: Dictionary\<String,Any>

***ControlType*** (optional)\
The Type of Control to display (TextBox, ComboBox, Label, EditComboBox, AddComboBox, MultiSelect, CheckBox, Calendar, DatePicker, TimePicker, Password, TextArea, Email, Phone, Adress, Slider, Upload, UploadMultiple, Url, HtmlEditor, MarkdownEditor, Table, Object).\
&#x20;Type: String

***Length*** (optional)\
&#x20;The maximum Length of the Input.\
&#x20;Type: Int

***Options*** (optional)\
&#x20;Additional configuration for this parameter\
&#x20;Type: Options

#### Return Type <a href="#pragma-line-2326" id="pragma-line-2326"></a>

Parameter

## Parameter2

Represents a Parameter to request as an Input with dynamic keys (used with Inputs).

#### Syntax

```
Parameter Parameter2(
    String Key,
    String DataType,
    String Name,
    String [Description],
    Boolean [IsRequired],
    String [DefaultValue],
    Guid [DataSourceClassId],
    Guid [DataSourceFieldId],
    Guid [DataSourceControllerId],
    String [DataSourceOption],
    Guid [DataSourceSelectionId],
    Guid [DataSourceSelectionKeyFieldId],
    Guid [DataSourceSelectionNameFieldId],
    Dictionary<String,Any> [DataSourceSelectionParameters],
    String [ControlType],
    Int [Length],
    Options [Options]
)
```

**Parameters**

**Key** \
The Key of the Input (identifies the value after the request). \
*Type: String*

**DataType**\
The Type of the Data to request (String, Boolean, File, Integer, DateTime, Date, Time).\
*Type: String*

**Name**\
The Name of the Input to display.\
*Type: String*

***Description*** (optional)\
The Description of the Input to display.\
*Type: String*

***IsRequired*** (optional)\
Defines whether the User has to Input a value.\
*Type: Boolean*

***DefaultValue*** (optional)\
The Default Value of the Input.\
*Type: String*

***DataSourceClassId*** (optional)\
The ID of the Class to choose a value from.\
*Type: Guid*

***DataSourceFieldId*** (optional)\
The ID of the Field to choose a value from (in combination with DataSourceClassId).\
*Type: Guid*

***DataSourceControllerId*** (optional)\
The ID of the Controller used to choose a value from.\
*Type: Guid*

***DataSourceOption*** (optional)\
A String representation of a list to choose a value from.\
*Type: String*

***DataSourceSelectionId*** (optional)\
The ID of the Selection used to choose a value from.\
Type: Guid

***DataSourceSelectionKeyFieldId*** (optional)\
The ID of the field to identify a value (in combination with DataSourceSelectionId).\
Type: Guid

***DataSourceSelectionNameFieldId*** (optional)\
The ID of the field to display a value (in combination with DataSourceSelectionId).\
Type: Guid

***DataSourceSelectionParameters*** (optional)\
The parameters to use for the Selection as default values.\
Type: Dictionary\<String,Any>

***ControlType*** (optional)\
The Type of Control to display (TextBox, ComboBox, Label, EditComboBox, AddComboBox, MultiSelect, CheckBox, Calendar, DatePicker, TimePicker, Password, TextArea, Table, Email, Phone, Adress, Slider, Upload, UploadMultiple, Url, HtmlEditor, MarkdownEditor, Object).\
*Type: String*

***Length*** (optional)\
The maximum Length of the Input.\
*Type: Int*

***Options** (optional)*\
Additional configuration for this parameter\
*Type: Options*

**Return Type**

Parameter

## ReduceLinkPath

Reduces the LinkPath by one step.

#### Syntax <a href="#pragma-line-2335" id="pragma-line-2335"></a>

```
ReduceLinkPath ( LinkPath )
```

#### Parameters <a href="#pragma-line-2341" id="pragma-line-2341"></a>

***LinkPath***\
&#x20;The link which is to be reduced.\
&#x20;Type: LinkPath

#### Return Type <a href="#pragma-line-2348" id="pragma-line-2348"></a>

LinkPath

## Refresh

Refreshes a given Object.

#### Syntax <a href="#pragma-line-2357" id="pragma-line-2357"></a>

```
Refresh ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-2363" id="pragma-line-2363"></a>

***Object***\
&#x20;The Object to refresh.\
&#x20;Type: Object

***LayoutId*** (optional)\
&#x20;The ID of the Layout to refresh the Object with.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-2374" id="pragma-line-2374"></a>

Exit

## Reload

Reloads a given Object

#### Syntax <a href="#pragma-line-2383" id="pragma-line-2383"></a>

```
Reload ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-2389" id="pragma-line-2389"></a>

***Object***\
&#x20;The Object to reload.\
&#x20;Type: Object

***LayoutId*** (optional)\
&#x20;The ID of the Layout to reload the Object with.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-2400" id="pragma-line-2400"></a>

Exit

## RemoveUserFromLicense

Removes a user from a license or license item. Throws an error if the license or license item does not support user assignments.

#### Syntax

```
RemoveUserFromLicense ( LicenseId  [, ItemId] , OfficeId, UserId )
```

#### Parameters

**LicenseId**\
&#x20;The ID of the license the user should get removed from.\
&#x20;Type: Guid

***ItemId*** (optional)\
&#x20;The ID of the license item the user should get removed from.\
&#x20;Type: Guid

**OfficeId**\
&#x20;The office to filter the features (the current office if left empty).\
&#x20;Type: Guid

**UserId**\
&#x20;The ID of the user to remove assign the license from.\
&#x20;Type: Guid

#### Return Type

Void

## RunSelection

Runs a selection in a specific office and application, identified by a SelectionId with certain Parameters and optional LinkPath. RunSelection returns a list of objects.

#### Syntax <a href="#pragma-line-2409" id="pragma-line-2409"></a>

```
RunSelection ( OfficeId , ApplicationId , SelectionId , Parameters [, LinkPath] )
```

#### Parameters <a href="#pragma-line-2415" id="pragma-line-2415"></a>

***OfficeId***\
&#x20;The ID of the office the selection will be associated with.\
&#x20;Type: Guid

***ApplicationId***\
&#x20;The ID of the application the selection will be associated with.\
&#x20;Type: Guid

***SelectionId***\
&#x20;The ID of the selection which will be executed.\
&#x20;Type: Guid

***Parameters***\
&#x20;The parameters used for the selection.\
&#x20;Type: Dictionary\<String,Object>

***LinkPath*** (optional)\
&#x20;Navigation path to the object.\
&#x20;Type: LinkPath

#### Return Type <a href="#pragma-line-2438" id="pragma-line-2438"></a>

List\<Object>

## RunSelection

Executes a Selection and returns the result.

#### Syntax <a href="#pragma-line-2447" id="pragma-line-2447"></a>

```
RunSelection ( Selection [, InstanceId] )
```

#### Parameters <a href="#pragma-line-2453" id="pragma-line-2453"></a>

***Selection***\
&#x20;The Selection to execute.\
&#x20;Type: Selection

***InstanceId*** (optional)\
&#x20;The ID of the Instance to use as a context for the Selection.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2464" id="pragma-line-2464"></a>

List\<Object>

## SaveInstance

Takes an object as an input and saves that instance to disk.

#### Syntax <a href="#pragma-line-2473" id="pragma-line-2473"></a>

```
SaveInstance ( Object )
```

#### Parameters <a href="#pragma-line-2479" id="pragma-line-2479"></a>

***Object***\
&#x20;Object which will be saved to disk.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-2486" id="pragma-line-2486"></a>

Void

## Selection

Represents a Selection for later execution.

#### Syntax <a href="#pragma-line-2495" id="pragma-line-2495"></a>

```
Selection ( [SourceId] [, LinkId] , Layouts , Conditions )
```

#### Parameters <a href="#pragma-line-2501" id="pragma-line-2501"></a>

***SourceId*** (optional)\
&#x20;The ID of the Source Class.\
&#x20;Type: Guid

***LinkId*** (optional)\
&#x20;The ID of the Link of a Context where to execute the Selection in.\
&#x20;Type: Guid

***Layouts***\
&#x20;The Fields to request when executing the Selection.\
&#x20;Type: List\<Layout>

***Conditions***\
&#x20;The Condition used to filter when executing the Selection.\
&#x20;Type: List\<Condition>

#### Return Type <a href="#pragma-line-2520" id="pragma-line-2520"></a>

Selection

## SetEntry

Sets a Value of an entry with the given Key of a Dictionary.

#### Syntax <a href="#pragma-line-2529" id="pragma-line-2529"></a>

```
SetEntry ( Dictionary , Key [, Value] )
```

#### Parameters <a href="#pragma-line-2535" id="pragma-line-2535"></a>

***Dictionary***\
&#x20;The dictionary for which the entry is set.\
&#x20;Type: Dictionary\<Any,Any>

***Key***\
&#x20;The key for which the entry is set.\
&#x20;Type: Any

***Value*** (optional)\
&#x20;The value which is set.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2550" id="pragma-line-2550"></a>

Dictionary\<Any,Any>

## SetValue

Changes the value of a Field in an Object.

#### Syntax <a href="#pragma-line-2559" id="pragma-line-2559"></a>

```
SetValue ( Object , Field , Value )
```

#### Parameters <a href="#pragma-line-2565" id="pragma-line-2565"></a>

***Object***\
&#x20;Object which the value is set to.\
&#x20;Type: Object

***Field***\
&#x20;The name of the field to set.\
&#x20;Type: String

***Value***\
&#x20;Value which is set.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2580" id="pragma-line-2580"></a>

Void

## StatusFeedback

Sends feedback on the status of the executing script to the user. Can be used for checking result of a condition, switch, providing result values and similar.

#### Syntax <a href="#pragma-line-2589" id="pragma-line-2589"></a>

```
StatusFeedback ( Message [, Level] )
```

#### Parameters <a href="#pragma-line-2595" id="pragma-line-2595"></a>

**Message**\
&#x20;The message to be shown to the user\
&#x20;Type: String

***Level** (optional)*\
&#x20;The level of the feedback: Debug, Loading, Info (default), Error\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2606" id="pragma-line-2606"></a>

Void

## TableDefaultValue

Builds the Table default value. This should be used with the DefaultValue of a Parameter.

**Syntax**

```
String TableDefaultValue(
    List<Dictionary<String,Any>> Table
)
```

#### Parameters <a href="#pragma-line-2595" id="pragma-line-2595"></a>

**Table**\
&#x20;The table data to use as a default value.\
&#x20;Type: List\<Dictionary\<String,Any>>

**Return Type**\
String

## TableOptions

Builds the Table options. This should be used with the Options of a Parameter.

**Syntax**

```
TableOptions ( Columns [, DisableAddingRows] [, DisableDeletingRows] [, DisableSortingRows ] )  
```

#### Parameters <a href="#pragma-line-2595" id="pragma-line-2595"></a>

**Columns**\
&#x20;The columns configuration to edit the table.\
&#x20;Type: List\<Parameter>

***DisableAddingRows*** (optional)\
&#x20;The table configuration to restrict adding rows.\
&#x20;Type: Boolean

***DisableDeletingRows*** (optional)\
&#x20;The table configuration to restrict deleting rows.\
&#x20;Type: Boolean

***DisableSortingRows*** (optional)\
&#x20;The table configuration to restrict sorting rows.\
&#x20;Type: Boolean

**Return Type**\
Options

## UnpackZip

Unpacks a given ZIP archive and returns the content as a Dictionary.

#### Syntax <a href="#pragma-line-2615" id="pragma-line-2615"></a>

```
UnpackZip ( Archive )
```

#### Parameters <a href="#pragma-line-2621" id="pragma-line-2621"></a>

***Archive***\
&#x20;The Document to unpack.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-2628" id="pragma-line-2628"></a>

Dictionary

{% hint style="info" %}
Combination of this UnpackZip action with [GetDocumentValue ](#getdocumentvalue)action (Document \<Document>, PropertyName *ModificationTime*, PropertyName *MimeType*) gives you the possibility to retrieve modification time and mime type of the individual zip files/content..
{% endhint %}

## UploadDocument

Uploads a Document to a given Object.

#### Syntax <a href="#pragma-line-2637" id="pragma-line-2637"></a>

```
UploadDocument ( Object , Document )
```

#### Parameters <a href="#pragma-line-2643" id="pragma-line-2643"></a>

***Object***\
&#x20;The Object to upload the Document to.\
&#x20;Type: Object

***Document***\
&#x20;The Document to upload.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-2654" id="pragma-line-2654"></a>

Void

## Variable

Provides a container with a name, which can be used to store and reference all kind of values and Objects.

#### Syntax <a href="#pragma-line-2663" id="pragma-line-2663"></a>

```
Variable ( Name [, Expression] )
```

#### Parameters <a href="#pragma-line-2669" id="pragma-line-2669"></a>

***Name***\
&#x20;Name of the variable.\
&#x20;Type: String

***Expression*** (optional)\
&#x20;Value of the variable.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-2680" id="pragma-line-2680"></a>

Any

## Variable2

Provides a container with a dynamic name, which can be used to store and reference all kind of values and Objects.

#### Syntax

```
Any Variable2(
    String Name,
    Any [Expression]
)
```

**Parameters**

* **Name**\
  Name of the variable.\
  Type String
* **Expression** (optional)\
  Value of the variable.\
  Type Any

**Return Type**

Any


# Date

## AddToDateTime

Adds a given part value to the given DateTime.

#### Syntax <a href="#pragma-line-2941" id="pragma-line-2941"></a>

```
AddToDateTime ( Part , Value , DateTime )
```

#### Parameters <a href="#pragma-line-2947" id="pragma-line-2947"></a>

***Part as String (required)***\
&#x20;Allowed values are 'Time', 'Year', 'Quarter', 'Month', 'Week', 'Day', 'Hour', 'Minute', 'Second', 'Millisecond' and 'Tick' (case-insensitive, can be pluralized).\
&#x20;Type: String

***Value***\
&#x20;The value to add to the DateTime.\
&#x20;Type: Any

***DateTime***\
&#x20;The DateTime to alter.\
&#x20;Type: DateTime

#### Return Type <a href="#pragma-line-2962" id="pragma-line-2962"></a>

DateTime

## AddToTimeSpan

Adds a given part value to the given TimeSpan.

#### Syntax <a href="#pragma-line-2971" id="pragma-line-2971"></a>

```
AddToTimeSpan ( Part , Value , TimeSpan )
```

#### Parameters <a href="#pragma-line-2977" id="pragma-line-2977"></a>

***Part***\
&#x20;Allowed values are 'Time', 'Day', 'Hour', 'Minute', 'Second', 'Millisecond' and 'Tick'.\
&#x20;Type: String

***Value***\
&#x20;The value to add to the TimeSpan.\
&#x20;Type: Any

***TimeSpan***\
&#x20;The TimeSpan to alter.\
&#x20;Type: TimeSpan

#### Return Type <a href="#pragma-line-2992" id="pragma-line-2992"></a>

TimeSpan

## EndOfDateTime

Gets the DateTime representing the end of the given part of a given DateTime.

#### Syntax

```
EndOfDateTime ( DateTime , Part )
```

#### Parameters

**DateTime**\
&#x20;The DateTime to get the end of the given part from.\
&#x20;Type: DateTime

**Part**\
&#x20;Allowed values are 'Year', 'Quarter', 'Month', 'Week', 'Day', 'Hour', 'Minute', 'Second', 'Millisecond' and 'Tick' (case-insensitive, can be pluralized).\
&#x20;Type: String

#### Return type

DateTime

## Now

Represents the current date and time.

#### Syntax <a href="#pragma-line-3001" id="pragma-line-3001"></a>

```
Now (  )
```

#### Parameters <a href="#pragma-line-3007" id="pragma-line-3007"></a>

No parameters

#### Return Type <a href="#pragma-line-3011" id="pragma-line-3011"></a>

DateTime

## PartOfDateTime

Gets the given part of the given DateTime.

#### Syntax <a href="#pragma-line-3020" id="pragma-line-3020"></a>

```
PartOfDateTime ( Part , DateTime )
```

#### Parameters <a href="#pragma-line-3026" id="pragma-line-3026"></a>

***Part as String (required)***\
&#x20;Allowed values are 'Date', 'Time', 'Year', 'Quarter', 'Month', 'Day', 'Hour', 'Minute', 'Second', 'Millisecond' and 'Tick' (case-insensitive, can be pluralized).\
&#x20;Type: String

***DateTime***\
&#x20;The DateTime where to get the part from.\
&#x20;Type: DateTime

#### Return Type <a href="#pragma-line-3037" id="pragma-line-3037"></a>

Any

## PartOfTimeSpan

Deprecated: Use BeginOfDateTime with Part 'Month'.

Gets the given part of the given TimeSpan.

Gets the DateTime representing the beginning of the month of a given DateTime.

#### Syntax <a href="#pragma-line-3046" id="pragma-line-3046"></a>

```
PartOfTimeSpan ( Part , TimeSpan )
```

#### Parameters <a href="#pragma-line-3052" id="pragma-line-3052"></a>

***Part***\
&#x20;Allowed values are 'Day', 'TotalDay', 'Hour', 'TotalHour', 'Minute', 'TotalMinute', 'Second', 'TotalSecond', 'Millisecond', 'TotalMillisecond' and 'Tick'.\
&#x20;Type: String

***TimeSpan***\
&#x20;The TimeSpan where to get the part from.\
&#x20;Type: TimeSpan

#### Return Type <a href="#pragma-line-3063" id="pragma-line-3063"></a>

Any

Deprecated: Use EndOfDateTime with Part 'Month'.

Gets the DateTime representing the ending of the month of a given DateTime

## Deprecated!ToBeginOfMonth

#### Syntax <a href="#pragma-line-3072" id="pragma-line-3072"></a>

```
ToBeginOfMonth ( DateTime )
```

#### Parameters <a href="#pragma-line-3078" id="pragma-line-3078"></a>

***DateTime***\
&#x20;The DateTime to get the beginning of the month from.\
&#x20;Type: DateTime

#### Return Type <a href="#pragma-line-3085" id="pragma-line-3085"></a>

DateTime

## BeginOfDateTime

Gets the DateTime representing the beginning of the given part of a given DateTime.

#### Syntax <a href="#pragma-line-3094" id="pragma-line-3094"></a>

```
BeginOfDateTime ( DateTime , Part )
```

#### Parameters <a href="#pragma-line-3100" id="pragma-line-3100"></a>

***DateTime***\
&#x20;The DateTime to get the beginning of the given part from.

***Part as String (required)***\
&#x20;Allowed values are 'Year', 'Quarter', 'Month', 'Week', 'Day', 'Hour', 'Minute', 'Second' and 'Millisecond' (case-insensitive, can be pluralized).

#### Return Type <a href="#pragma-line-3107" id="pragma-line-3107"></a>

DateTime

## EndOfDateTime

Gets the DateTime representing the end of the given part of a given DateTime.

#### Syntax <a href="#pragma-line-3094" id="pragma-line-3094"></a>

```
EndOfDateTime ( DateTime , Part )
```

#### Parameters <a href="#pragma-line-3100" id="pragma-line-3100"></a>

***DateTime*** (required):\
&#x20;The DateTime to get the end of the given part from.\
&#x20;Type: DateTime

**Part** (required):\
&#x20;Allowed values are 'Year', 'Quarter', 'Month', 'Week', 'Day', 'Hour', 'Minute', 'Second', 'Millisecond' and 'Tick' (case-insensitive, can be pluralized).\
&#x20;Type: String

#### Return Type <a href="#pragma-line-3107" id="pragma-line-3107"></a>

DateTime


# Collection

## All

Takes a list of objects and returns TRUE if each objects meets the specified condition.

#### Syntax <a href="#pragma-line-3118" id="pragma-line-3118"></a>

```
All ( Objects , ObjectName , Condition )
```

#### Parameters <a href="#pragma-line-3124" id="pragma-line-3124"></a>

***Objects***\
&#x20;List of objects which will be evaluated.\
&#x20;Type: List\<Any>

***ObjectName***\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition***\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3139" id="pragma-line-3139"></a>

Boolean

## Any

Takes a list of objects and a determines whether one or more of the items meets a specified condition.

#### Syntax <a href="#pragma-line-3148" id="pragma-line-3148"></a>

```
Any ( Objects [, ObjectName] [, Condition] )
```

#### Parameters <a href="#pragma-line-3154" id="pragma-line-3154"></a>

***Objects***\
&#x20;List of objects which will be evaluated.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition*** (optional)\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3169" id="pragma-line-3169"></a>

Boolean

## Count

Takes a list of objects and returns the number of objects in that list.

#### Syntax <a href="#pragma-line-3178" id="pragma-line-3178"></a>

```
Count ( List )
```

#### Parameters <a href="#pragma-line-3184" id="pragma-line-3184"></a>

***List***\
&#x20;List of objects to count.\
&#x20;Type: List\<Any>

#### Return Type <a href="#pragma-line-3191" id="pragma-line-3191"></a>

Int

## Distinct

Takes a list of objects and a selection criteria as input and and selects by a specified criteria if objects are different. Returns a list of those distinct values.

#### Syntax <a href="#pragma-line-3200" id="pragma-line-3200"></a>

```
Distinct ( Objects [, ObjectName] [, Selection] )
```

#### Parameters <a href="#pragma-line-3206" id="pragma-line-3206"></a>

***Objects***\
&#x20;The list of objects which will be examined.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Selection*** (optional)\
&#x20;Selection Criteria.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3221" id="pragma-line-3221"></a>

List\<Any>

## ElementAt

Takes a list of Objects and returns the object at the given Index.

#### Syntax <a href="#pragma-line-3230" id="pragma-line-3230"></a>

```
ElementAt ( Objects , Index )
```

#### Parameters <a href="#pragma-line-3236" id="pragma-line-3236"></a>

***Objects***\
&#x20;The list of Objects to get the object from.\
&#x20;Type: List\<Any>

***Index***\
&#x20;The Index of the Object to get.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-3247" id="pragma-line-3247"></a>

Any

## First

Takes a List of Objects and returns the first value which satisfies the condition. If no condition is specified, it returns the first object. It returns null, if no item can be found.

#### Syntax <a href="#pragma-line-3256" id="pragma-line-3256"></a>

```
First ( Objects [, ObjectName] [, Condition] )
```

#### Parameters <a href="#pragma-line-3262" id="pragma-line-3262"></a>

***Objects***\
&#x20;List of objects used as basis for the operation.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition*** (optional)\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3277" id="pragma-line-3277"></a>

Any

## GetGroupKey

Gets the Key of a Group (created by GroupBy).

#### Syntax <a href="#pragma-line-3286" id="pragma-line-3286"></a>

```
GetGroupKey ( Group )
```

#### Parameters <a href="#pragma-line-3292" id="pragma-line-3292"></a>

***Group***\
&#x20;The Group to get the Key from.\
&#x20;Type: List\<Any>

#### Return Type <a href="#pragma-line-3299" id="pragma-line-3299"></a>

Any

## GroupBy

Takes a list of Objects and groups them by value retrieved by the Selection criteria.

#### Syntax <a href="#pragma-line-3308" id="pragma-line-3308"></a>

```
GroupBy ( Objects , ObjectName , Selection )
```

#### Parameters <a href="#pragma-line-3314" id="pragma-line-3314"></a>

***Objects***\
&#x20;The list of Objects to Group.\
&#x20;Type: List\<Any>

***ObjectName***\
&#x20;Variable Name to identify the object in the Selection criteria.\
&#x20;Type: String

***Selection***\
&#x20;The Selection criteria.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3329" id="pragma-line-3329"></a>

List\<Group>

## Last

Takes a List of Objects and returns the last value which satisfies the condition. If no condition is specified, it returns the last object. It returns null, if no object is found.

#### Syntax <a href="#pragma-line-3338" id="pragma-line-3338"></a>

```
Last ( Objects [, ObjectName] [, Condition] )
```

#### Parameters <a href="#pragma-line-3344" id="pragma-line-3344"></a>

***Objects***\
&#x20;List of objects used as basis for the operation.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition*** (optional)\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3359" id="pragma-line-3359"></a>

Any

## Many

Takes a list of Objects as input and determines, if the list which is filtered by a condition, contains more than one item.

#### Syntax <a href="#pragma-line-3368" id="pragma-line-3368"></a>

```
Many ( Objects [, ObjectName] [, Condition] )
```

#### Parameters <a href="#pragma-line-3374" id="pragma-line-3374"></a>

***Objects***\
&#x20;List of objects which will be evaluated.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition*** (optional)\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3389" id="pragma-line-3389"></a>

Boolean

## None

Determines whether no object exists which meets a specified condition. If no Condition is specified the list checks whether the List is empty. If the list is empty the method will return TRUE.

#### Syntax <a href="#pragma-line-3398" id="pragma-line-3398"></a>

```
None ( Objects [, ObjectName] [, Condition] )
```

#### Parameters <a href="#pragma-line-3404" id="pragma-line-3404"></a>

***Objects***\
&#x20;List of objects which will be evaluated.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition*** (optional)\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3419" id="pragma-line-3419"></a>

Boolean

## One

Takes a list of Objects as input and determine whether at least one object exists which meets a specified condition. If no objects are provided the function will return FALSE.

#### Syntax <a href="#pragma-line-3428" id="pragma-line-3428"></a>

```
One ( Objects [, ObjectName] [, Condition] )
```

#### Parameters <a href="#pragma-line-3434" id="pragma-line-3434"></a>

***Objects***\
&#x20;List of objects which will be evaluated.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition*** (optional)\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3449" id="pragma-line-3449"></a>

Any

## OrderAscending

Takes a list of objects and a selection as input and orders the objects according to the selection in ascending fashion.

#### Syntax <a href="#pragma-line-3458" id="pragma-line-3458"></a>

```
OrderAscending ( Objects [, ObjectName] [, Selection] )
```

#### Parameters <a href="#pragma-line-3464" id="pragma-line-3464"></a>

***Objects***\
&#x20;List of objects used as basis for the operation.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Selection*** (optional)\
&#x20;The selection which is used as criteria for the ordering.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3479" id="pragma-line-3479"></a>

List\<Any>

## OrderDescending

Takes a list of objects and a selection as input and orders the objects according to the selection in descending fashion.

#### Syntax <a href="#pragma-line-3488" id="pragma-line-3488"></a>

```
OrderDescending ( Objects [, ObjectName] [, Selection] )
```

#### Parameters <a href="#pragma-line-3494" id="pragma-line-3494"></a>

***Objects***\
&#x20;List of objects used as basis for the operation.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Selection*** (optional)\
&#x20;The selection which is used as criteria for the ordering.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3509" id="pragma-line-3509"></a>

List\<Any>

## Reverse

Takes a list of Objects and reverses the Order.

#### Syntax <a href="#pragma-line-3518" id="pragma-line-3518"></a>

```
Reverse ( Objects )
```

#### Parameters <a href="#pragma-line-3524" id="pragma-line-3524"></a>

***Objects***\
&#x20;The list of Objects to reverses.\
&#x20;Type: List\<Any>

#### Return Type <a href="#pragma-line-3531" id="pragma-line-3531"></a>

List\<Any>

## Select

Projects each value of the \<see cref="CollectionElement.Objects"/> into a new form.

#### Syntax <a href="#pragma-line-3540" id="pragma-line-3540"></a>

```
Select ( Objects , ObjectName , Selection )
```

#### Parameters <a href="#pragma-line-3546" id="pragma-line-3546"></a>

***Objects***\
&#x20;List of Objects which are evaluated.\
&#x20;Type: List\<Any>

***ObjectName***\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Selection***\
&#x20;The selection which is used as criteria for the select.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3561" id="pragma-line-3561"></a>

List\<Any>

## Single

Returns the single value (that met a \<see cref="Condition"/> if one is provided).

#### Syntax <a href="#pragma-line-3570" id="pragma-line-3570"></a>

```
Single ( Objects [, ObjectName] [, Condition] )
```

#### Parameters <a href="#pragma-line-3576" id="pragma-line-3576"></a>

***Objects***\
&#x20;List of Objects which is evaluated.\
&#x20;Type: List\<Any>

***ObjectName*** (optional)\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition*** (optional)\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3591" id="pragma-line-3591"></a>

Any

## Skip

Skips a number of Objects and returns the rest.

#### Syntax <a href="#pragma-line-3600" id="pragma-line-3600"></a>

```
Skip ( Objects , Count )
```

#### Parameters <a href="#pragma-line-3606" id="pragma-line-3606"></a>

***Objects***\
&#x20;The list of Objects to skip from.\
&#x20;Type: List\<Any>

***Count***\
&#x20;The amount of Objects to skip.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-3617" id="pragma-line-3617"></a>

List\<Any>

## Take

Returns a number of Objects and skips the rest.

#### Syntax <a href="#pragma-line-3626" id="pragma-line-3626"></a>

```
Take ( Objects , Count )
```

#### Parameters <a href="#pragma-line-3632" id="pragma-line-3632"></a>

***Objects***\
&#x20;The list of Objects to Take from.\
&#x20;Type: List\<Any>

***Count***\
&#x20;The amount of of Objects to Take.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-3643" id="pragma-line-3643"></a>

List\<Any>

## Where

Returns a list of Objects which satisfy a specified condition.

#### Syntax <a href="#pragma-line-3652" id="pragma-line-3652"></a>

```
Where ( Objects , ObjectName , Condition )
```

#### Parameters <a href="#pragma-line-3658" id="pragma-line-3658"></a>

***Objects***\
&#x20;List of Objects which are evaluated.\
&#x20;Type: List\<Object>

***ObjectName***\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Condition***\
&#x20;Condition used to evaluate the list.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3673" id="pragma-line-3673"></a>

List\<Any>

## &#x20;<a href="#pragma-line-3678" id="pragma-line-3678"></a>


# LogicalOperators

## And

Takes the two values ValueA (Boolean) and ValueB (Boolean) as input and determines whether the expression evaluates to TRUE.

#### Syntax <a href="#pragma-line-3684" id="pragma-line-3684"></a>

```
And ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-3690" id="pragma-line-3690"></a>

***ValueA***\
&#x20;First part of the evaluation.\
&#x20;Type: Boolean

***ValueB***\
&#x20;Second part of the evaluation.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3701" id="pragma-line-3701"></a>

Boolean

## Not

Negates the output of Value.

#### Syntax <a href="#pragma-line-3710" id="pragma-line-3710"></a>

```
Not ( Value )
```

#### Parameters <a href="#pragma-line-3716" id="pragma-line-3716"></a>

***Value***\
&#x20;Negation expression.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3723" id="pragma-line-3723"></a>

Boolean

## Or

Takes the two values ValueA and ValueB as input and determines whether the expression evaluates to TRUE.

#### Syntax <a href="#pragma-line-3732" id="pragma-line-3732"></a>

```
Or ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-3738" id="pragma-line-3738"></a>

***ValueA***\
&#x20;First part of the evaluation.\
&#x20;Type: Boolean

***ValueB***\
&#x20;Second part of the evaluation.\
&#x20;Type: Boolean

#### Return Type <a href="#pragma-line-3749" id="pragma-line-3749"></a>

Boolean

##


# Web

## AsDocumentHttpResult

Binary content to consume.

#### Syntax

```
AsDocumentHttpResult ( Response , FileName [, MimeType] )
```

**Parameters**

* **Response**\
  The response object returned from the ExecuteHttpRequest.\
  Type: HttpResponse
* **FileName**\
  The file name of the document.\
  Type: String
* ***MimeType*** (optional)\
  The MIME type of the document. Analyses the header 'Content-Type' if left empty or the FileName extension if the header is missing as well.\
  Type: String

**Return Type**

Document

## AsFormUrlEncodedHttpResult

Returns the received form URL-encoded content as a List\<Entry\<String,String>>.

#### Syntax

```
AsFormUrlEncodedHttpResult ( Response )
```

**Parameters**

* **Response**\
  The response object returned from the ExecuteHttpRequest.\
  Type: HttpResponse

**Return Type**

List\<Entry\<String,String>>

## AsJsonHttpResult

Deserializes the recieved JSON content.

#### Syntax

```typescript
Any AsJsonHttpResult(
    HttpResponse Response
)
```

**Parameters**

* **Response**\
  The response object returned from the ExecuteHttpRequest\
  Type: HttpResponse

**Return Type**

Any

## AsMultipartFormDataHttpResult

Returns the received Multi-part form-data content. Each part can have a Name (String) and a FileName (String) and will have a Response (HttpResponse).

{% hint style="warning" %}
Warning: The return value is not serializable which will cause input request errors!
{% endhint %}

#### Syntax

```
AsMultipartFormDataHttpResult ( Response )
```

**Parameters**

* **Response**\
  The response object returned from the ExecuteHttpRequest.\
  Type: HttpResponse

**Return Type**

List\<Dictionary\<String,Any>>

## AsStringHttpResult

Returns the received content as a String.

#### Syntax

```
AsStringHttpResult ( Response )
```

**Parameters**

* **Response**\
  The response object returned from the ExecuteHttpRequest.\
  Type: HttpResponse

**Return Type**

String

## DeserializeFromJson

Deserializes lists or objects from JSON. Scalar values (Any) and values of type List and Dictionary are supported and can be returned.

#### Syntax

```typescript
Any DeserializeFromJson(
    String Json
)
```

**Parameters**

* **Json**\
  The JSON to deserialize to a value.\
  Type: Any

**Return Type**\
Any

## DocumentHttpContent

Binary content to send (use with HttpRequest). Sets the header 'Content-Type' to the MIME type of the document (defaults to "application/octet-stream").

{% hint style="warning" %}
The return value is not serializable which will cause input request errors!
{% endhint %}

#### Syntax

```
DocumentHttpContent ( Value )
```

**Parameters**

* **Value**\
  The binary content to send.\
  Type: Document

**Return Type**

HttpContent

## ExecuteHttpRequest

Executes an HTTP request and returns the response. The response has a StatusCode (Integer), IsSucessStatusCode (Boolean) and Headers (Dictionary\<String,String>) accessable through GetValue. Warning: The return value is not serializable which will cause input request errors!

#### Syntax

```
HttpResponse ExecuteHttpRequest(
    Any Request
)
```

**Parameters**

* **Request**\
  The object to send serialized as JSON (e.g. Dictionary\<String,Any> or List\<Dictionary\<String,Any>>)\
  Type Any

**Return Type**

HttpResponse

## FormUrlEncodedHttpContent

Form URL-encoded content to send (use with HttpRequest). Sets the header 'Content-Type' to "application/x-www-form-urlencoded".

{% hint style="warning" %}
Warning: The return value is not serializable.
{% endhint %}

#### Syntax

```
FormUrlEncodedHttpContent ( Value )
```

**Parameters**

* **Value**\
  The form values to send.\
  Type: List\<Entry\<String,String>>

**Return Type**

HttpContent

## HttpRequest

Represents an HTTP request (use with ExecuteHttpRequest). Warning: The return value is not serializable which will cause input request errors!

#### Syntax

```
HttpRequest HttpRequest(
    String Method,
    String Uri,
    Dictionary<String,String> [Headers],
    HttpContent [Content]
)
```

**Parameters**

* **Method**\
  The HTTP method to be performaned ('DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'TRACE')\
  Type String
* **Uri**\
  The URI to request to\
  Type String
* **Headers** (optional)\
  The HTTP headers associated with the request\
  Type Dictionary\<String,String>
* **Content** (optional)\
  The content to send with the request\
  Type HttpContent

**Return Type**

HttpRequest

## JsonHttpContent

Content serialized as JSON to send (use with HttpRequest). Warning: The return value is not serializable which will cause input request errors!

#### Syntax

```
HttpContent JsonHttpContent(
    Any Value
)
```

**Parameters**

* **Value**\
  The object to send serialized as JSON (e.g. Dictionary\<String,Any> or List\<Dictionary\<String,Any>>)\
  Type Any

**Return Type**

HttpContent

## MultipartFormDataHttpContent

Multi-part form-data content to send (use with HttpRequest). Sets the header 'Content-Type' to "multipart/form-data".

{% hint style="warning" %}
Warning: The return value is not serializable which will cause input request errors!
{% endhint %}

#### Syntax

```
MultipartFormDataHttpContent ( Value )
```

**Parameters**

* **Value**\
  The Multi-part form-data to send. Each Value part can have a Name (String) and a FileName (String) and must have Content (HttpContent).\
  Type: List\<Dictionary\<String,Any>>

**Return Type**\
HttpContent

## SerializeToJson

Serializes lists or objects to JSON. Scalar values (Any) and values of type List, Object and Dictionary are supported.

#### Syntax

```typescript
Any SerializeToJson(
    String Json
)
```

**Parameters**

* **Value**\
  The value to serialize to JSON.\
  Type: Any

**Return Type**\
String

## StringHttpContent

Content to send (use with HttpRequest). Sets the header 'Content-Type' to "text/plain". The content is encoded as UTF-8.&#x20;

{% hint style="warning" %}
Warning: The return value is not serializable.
{% endhint %}

#### Syntax

```
StringHttpContent ( Value )
```

**Parameters**

* **Value**\
  The string value to send.\
  Type: String

**Return Type**\
HttpContent

## UrlDecode

Decodes invalid URL characters encoded into character-entity equivalents back (e.g. %3c to < or %3e to >).

#### Syntax

```
UrlDecode ( Value )
```

**Parameters**

* **Value**\
  The value to decode.\
  Type: String

**Return Type**\
String

## UrlEncode

Encodes invalid URL characters into character-entity equivalents (e.g. < to %3c or > to %3e).

#### Syntax

```
UrlEncode( Value )
```

**Parameters**

* **Value**\
  The value to encode.\
  Type: String

**Return Type**\
String


# Structure

## Block

Represents a block to group statements. A Block element allows the clustering and naming of statements for a better organization of the code.

#### Syntax <a href="#pragma-line-3760" id="pragma-line-3760"></a>

```
Block ( [Name] , Block )
```

#### Parameters <a href="#pragma-line-3766" id="pragma-line-3766"></a>

\-

***Block***\
&#x20;Represents the list of statements.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3777" id="pragma-line-3777"></a>

Void

## Case

Represents a case element for a Switch structure element. If the evaluated expression is found to be TRUE, the code in the following Branch is executed.

#### Syntax <a href="#pragma-line-3786" id="pragma-line-3786"></a>

```
Case ( Expression [, Branch] )
```

#### Parameters <a href="#pragma-line-3792" id="pragma-line-3792"></a>

***Expression***\
&#x20;Condition that is used to determine if the case matches.\
&#x20;Type: Any

***Branch*** (optional)\
&#x20;List of statements which will be executed if the case matches.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3803" id="pragma-line-3803"></a>

Case

## Comment

Void Comment( String Value ) Allows inline comments (has no effect on execution).

#### Syntax <a href="#pragma-line-3786" id="pragma-line-3786"></a>

```
Void Comment(
    String Value
)
```

#### Parameters <a href="#pragma-line-3792" id="pragma-line-3792"></a>

**Value** *(optional)*\
&#x20;The inline comment.\
&#x20;*Type: String*

**Return Type**\
Void

## DoWhile

Takes a condition as input and evaluates it. As long as this condition evaluates to TRUE, the Statements in the loop will be executed.

#### Syntax <a href="#pragma-line-3812" id="pragma-line-3812"></a>

```
DoWhile ( Condition , Loop )
```

#### Parameters <a href="#pragma-line-3818" id="pragma-line-3818"></a>

***Condition***\
&#x20;Condition which is evaluated.\
&#x20;Type: Boolean

***Loop***\
&#x20;List of statements which will be executed if condition is satisfied.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3829" id="pragma-line-3829"></a>

Void

## Error

Represents an error in the script execution. Takes a String as input which will be displayed as error message.

#### Syntax <a href="#pragma-line-3838" id="pragma-line-3838"></a>

```
Error ( Message )
```

#### Parameters <a href="#pragma-line-3844" id="pragma-line-3844"></a>

***Message***\
&#x20;Message which is shown in case of an error.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-3851" id="pragma-line-3851"></a>

Exit

## ForEach

The ForEach loop takes a list of objects identified with ObjectName as input and executes a list of statements for each item in that list individually.

#### Syntax <a href="#pragma-line-3860" id="pragma-line-3860"></a>

```
ForEach ( Objects , ObjectName , Loop )
```

#### Parameters <a href="#pragma-line-3866" id="pragma-line-3866"></a>

***Objects***\
&#x20;List of objects which the operation is performed on.\
&#x20;Type: List\<Object>

***ObjectName***\
&#x20;Variable Name to identify the object in the condition.\
&#x20;Type: String

***Loop***\
&#x20;List of statements which are executed for each object.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3881" id="pragma-line-3881"></a>

Void

## IfThenElse

Takes a condition as input. If the condition evaluates to TRUE, the statements in the Then block will be executed. If the condition evaluates to FALSE, the statements in the Else Blocks will be executed.

#### Syntax <a href="#pragma-line-3890" id="pragma-line-3890"></a>

```
IfThenElse ( Condition , Then [, Else] )
```

#### Parameters <a href="#pragma-line-3896" id="pragma-line-3896"></a>

***Condition***\
&#x20;Condition which is evaluated.\
&#x20;Type: Boolean

***Then***\
&#x20;List of statements executed if the condition is TRUE.\
&#x20;Type: Any

***Else*** (optional)\
&#x20;List of statements executed if the condition is FALSE.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3911" id="pragma-line-3911"></a>

Void

## IfThenElseExpression

Returns the Then value if the Condition evaluates to TRUE; returns the Else value otherwise (aka conditional operator, ternary operator, ternary if, inline if or iif.

#### Syntax

```
Any IfThenElseExpression(
    Boolean Condition,
    params Any Then,
    params Any Else
)
```

#### Parameters

***Condition***\
The condition to check.\
Type Boolean

***Then***\
The value to return if the condition evaluates to TRUE.\
Type Any

***Else***\
The value to return if the condition evaluates to FALSE.\
Type Any

#### Return Type

Any

## Return

Terminates the script and returns the value of the expression as the result.

#### Syntax <a href="#pragma-line-3920" id="pragma-line-3920"></a>

```
Return ( Expression )
```

#### Parameters <a href="#pragma-line-3926" id="pragma-line-3926"></a>

***Expression***\
&#x20;The expression of the value to return.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-3933" id="pragma-line-3933"></a>

Exit

## Switch

Represents a switch structure element. When a matching case branch is empty, then no branch actions are executed.

#### Syntax <a href="#pragma-line-3942" id="pragma-line-3942"></a>

```
Switch ( Expression [, Default] [, Cases] )
```

#### Parameters <a href="#pragma-line-3948" id="pragma-line-3948"></a>

***Expression***\
&#x20;Expression which is used to match.\
&#x20;Type: Any

***Default*** (optional)\
&#x20;Specifies the default case of the switch case expression.\
&#x20;Type: Any

***Cases*** (optional)\
&#x20;A list of cases that are matched against.\
&#x20;Type: List\<Case>

#### Return Type <a href="#pragma-line-3963" id="pragma-line-3963"></a>

Void

## TryCatch

Represents a try-catch structure element.

#### Syntax <a href="#pragma-line-3972" id="pragma-line-3972"></a>

```
TryCatch ( Try , Catch )
```

#### Parameters <a href="#pragma-line-3978" id="pragma-line-3978"></a>

***Try***\
&#x20;List of statements which can throw an exception while executed\
&#x20;Type: Any

***Catch***\
&#x20;List of statements which are executed in case of an error.\
&#x20;Type: Void

#### Return Type <a href="#pragma-line-3989" id="pragma-line-3989"></a>

Void

## TypeOf

Returns the type of a value as a string. Following types are supported: Boolean, Byte, Char, DateTime, Numeric, Double, Float, Guid, Integer, Long, Short, String, and TimeSpan.

#### Syntax

```
TypeOf ( Value )
```

#### Parameters

**Value**\
&#x20;The value to get the type from.\
&#x20;Type: Any

#### Return Type

String

## While

Represents a while-loop structure element. The while structure executes a list of statements while the conditions is TRUE.

#### Syntax <a href="#pragma-line-3998" id="pragma-line-3998"></a>

```
While ( Condition , Loop )
```

#### Parameters <a href="#pragma-line-4004" id="pragma-line-4004"></a>

***Condition***\
&#x20;Condition which is evaluated.\
&#x20;Type: Boolean

***Loop***\
&#x20;List of statements which is executed while the condition is TRUE.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-4015" id="pragma-line-4015"></a>

Void

## &#x20;<a href="#pragma-line-4020" id="pragma-line-4020"></a>


# Constants

## Byte

Represents a number with the length of a Byte.

#### Syntax <a href="#pragma-line-4026" id="pragma-line-4026"></a>

```
Byte ( Value )
```

#### Parameters <a href="#pragma-line-4032" id="pragma-line-4032"></a>

***Value***\
&#x20;The value which is returned as a Byte.\
&#x20;Type: Byte

#### Return Type <a href="#pragma-line-4039" id="pragma-line-4039"></a>

Byte

## Char

Represents a specified character.

#### Syntax <a href="#pragma-line-4048" id="pragma-line-4048"></a>

```
Char ( Value )
```

#### Parameters <a href="#pragma-line-4054" id="pragma-line-4054"></a>

***Value***\
&#x20;The value which is returned as a Char.\
&#x20;Type: Char

#### Return Type <a href="#pragma-line-4061" id="pragma-line-4061"></a>

Char

## DateTime

Represents a specified DateTime element. Input format: "24.12.2013 19:00:00.000"

#### Syntax <a href="#pragma-line-4070" id="pragma-line-4070"></a>

```
DateTime ( Value )
```

#### Parameters <a href="#pragma-line-4076" id="pragma-line-4076"></a>

***Value***\
&#x20;The value of the DateTime Object.\
&#x20;Type: DateTime

#### Return Type <a href="#pragma-line-4083" id="pragma-line-4083"></a>

DateTime

## DateTime2

Represents a specified DateTime element.

#### Syntax <a href="#pragma-line-4092" id="pragma-line-4092"></a>

```
DateTime2 ( [Year] [, Month] [, Day] [, Hour] [, Minute] [, Second] [, Millisecond] )
```

#### Parameters <a href="#pragma-line-4098" id="pragma-line-4098"></a>

***Year*** (optional)\
&#x20;The year of the DateTime Object.\
&#x20;Type: Int

***Month*** (optional)\
&#x20;The month of the DateTime Object.\
&#x20;Type: Int

***Day*** (optional)\
&#x20;The day of the DateTime Object.\
&#x20;Type: Int

***Hour*** (optional)\
&#x20;The hour of the DateTime Object.\
&#x20;Type: Int

***Minute*** (optional)\
&#x20;The minute of the DateTime Object.\
&#x20;Type: Int

***Second*** (optional)\
&#x20;The second of the DateTime Object.\
&#x20;Type: Int

***Millisecond*** (optional)\
&#x20;The millisecond of the DateTime Object.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-4129" id="pragma-line-4129"></a>

DateTime

## DateTime3

Represents a specified DateTime element.

#### Syntax <a href="#pragma-line-4138" id="pragma-line-4138"></a>

```
DateTime3 ( Ticks )
```

#### Parameters <a href="#pragma-line-4144" id="pragma-line-4144"></a>

***Ticks***\
&#x20;The ticks of the DateTime Object.\
&#x20;Type: Long

#### Return Type <a href="#pragma-line-4151" id="pragma-line-4151"></a>

DateTime

## Double

Returns a specified Double Value. Integers, floats, etc. are casted implicitly.

#### Syntax <a href="#pragma-line-4160" id="pragma-line-4160"></a>

```
Double ( Value )
```

#### Parameters <a href="#pragma-line-4166" id="pragma-line-4166"></a>

***Value***\
&#x20;The value which is returned as a double.\
&#x20;Type: Double

#### Return Type <a href="#pragma-line-4173" id="pragma-line-4173"></a>

Double

## False

Represents a false constant.

#### Syntax <a href="#pragma-line-4182" id="pragma-line-4182"></a>

```
False (  )
```

#### Parameters <a href="#pragma-line-4188" id="pragma-line-4188"></a>

No parameters

#### Return Type <a href="#pragma-line-4192" id="pragma-line-4192"></a>

Boolean

## Float

Represents a specified Float Value. Integers, Double, etc. are casted implicitly.

#### Syntax <a href="#pragma-line-4201" id="pragma-line-4201"></a>

```
Float ( Value )
```

#### Parameters <a href="#pragma-line-4207" id="pragma-line-4207"></a>

***Value***\
&#x20;The value which is returned as a Float.\
&#x20;Type: Float

#### Return Type <a href="#pragma-line-4214" id="pragma-line-4214"></a>

Float

## Guid

Represents a specified GUID element. The input format is: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

#### Syntax <a href="#pragma-line-4223" id="pragma-line-4223"></a>

```
Guid ( Value )
```

#### Parameters <a href="#pragma-line-4229" id="pragma-line-4229"></a>

***Value***\
&#x20;The value which will be returned as a Guid.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-4236" id="pragma-line-4236"></a>

Guid

## NewGuid

Action for creation of a new GUID element.

#### Syntax

```
Guid NewGuid()
```

#### Parameters

This action does not have any parameter.

#### Return Type

Guid

## Int

Represents a specified Integer Value.

#### Syntax <a href="#pragma-line-4245" id="pragma-line-4245"></a>

```
Int ( Value )
```

#### Parameters <a href="#pragma-line-4251" id="pragma-line-4251"></a>

***Value***\
&#x20;The value which is returned as an Int.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-4258" id="pragma-line-4258"></a>

Int

## Language

Represents a language element.

#### Syntax <a href="#pragma-line-4267" id="pragma-line-4267"></a>

```
Language ( Value )
```

#### Parameters <a href="#pragma-line-4273" id="pragma-line-4273"></a>

***Value***\
&#x20;The value which is returned as a Language.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4280" id="pragma-line-4280"></a>

Language

## Long

Represents a long value.

#### Syntax <a href="#pragma-line-4289" id="pragma-line-4289"></a>

```
Long ( Value )
```

#### Parameters <a href="#pragma-line-4295" id="pragma-line-4295"></a>

***Value***\
&#x20;The value which is returned as a long.\
&#x20;Type: Long

#### Return Type <a href="#pragma-line-4302" id="pragma-line-4302"></a>

Long

## Null

Represents a NULL value.

#### Syntax <a href="#pragma-line-4311" id="pragma-line-4311"></a>

```
Null (  )
```

#### Parameters <a href="#pragma-line-4317" id="pragma-line-4317"></a>

No parameters

#### Return Type <a href="#pragma-line-4321" id="pragma-line-4321"></a>

Any

## Short

Represents a 16-bit signed integer.

#### Syntax <a href="#pragma-line-4330" id="pragma-line-4330"></a>

```
Short ( Value )
```

#### Parameters <a href="#pragma-line-4336" id="pragma-line-4336"></a>

***Value***\
&#x20;Value which is returned as Short value.\
&#x20;Type: Short

#### Return Type <a href="#pragma-line-4343" id="pragma-line-4343"></a>

Short

## String

Represents a String constant.

#### Syntax <a href="#pragma-line-4352" id="pragma-line-4352"></a>

```
String ( Value )
```

#### Parameters <a href="#pragma-line-4358" id="pragma-line-4358"></a>

***Value***\
&#x20;Text of the String.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-4365" id="pragma-line-4365"></a>

String

## TimeSpan

Represents a specified TimeSpan element. Input format: "1:14:30:15.000"

#### Syntax <a href="#pragma-line-4374" id="pragma-line-4374"></a>

```
TimeSpan ( Value )
```

#### Parameters <a href="#pragma-line-4380" id="pragma-line-4380"></a>

***Value***\
&#x20;The value of the TimeSpan Object.\
&#x20;Type: TimeSpan

#### Return Type <a href="#pragma-line-4387" id="pragma-line-4387"></a>

TimeSpan

## TimeSpan2

Represents a specified TimeSpan element.

#### Syntax <a href="#pragma-line-4396" id="pragma-line-4396"></a>

```
TimeSpan2 ( [Day] [, Hour] [, Minute] [, Second] [, Millisecond] )
```

#### Parameters <a href="#pragma-line-4402" id="pragma-line-4402"></a>

***Day*** (optional)\
&#x20;The day of the TimeSpan Object.\
&#x20;Type: Int

***Hour*** (optional)\
&#x20;The hour of the TimeSpan Object.\
&#x20;Type: Int

***Minute*** (optional)\
&#x20;The minute of the TimeSpan Object.\
&#x20;Type: Int

***Second*** (optional)\
&#x20;The second of the TimeSpan Object.\
&#x20;Type: Int

***Millisecond*** (optional)\
&#x20;The millisecond of the TimeSpan Object.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-4425" id="pragma-line-4425"></a>

TimeSpan

## TimeSpan3

Represents a specified TimeSpan element.

#### Syntax <a href="#pragma-line-4434" id="pragma-line-4434"></a>

```
TimeSpan3 ( Ticks )
```

#### Parameters <a href="#pragma-line-4440" id="pragma-line-4440"></a>

***Ticks***\
&#x20;The ticks of the TimeSpan Object.\
&#x20;Type: Long

#### Return Type <a href="#pragma-line-4447" id="pragma-line-4447"></a>

TimeSpan

## True

Represents a TRUE constant.

#### Syntax <a href="#pragma-line-4456" id="pragma-line-4456"></a>

```
True (  )
```

#### Parameters <a href="#pragma-line-4462" id="pragma-line-4462"></a>

No parameters

#### Return Type <a href="#pragma-line-4466" id="pragma-line-4466"></a>

Boolean

## Decimal

Represents a specified Decimal Value

#### Syntax <a href="#pragma-line-4352" id="pragma-line-4352"></a>

```
Decimal ( Value )
```

#### Parameters <a href="#pragma-line-4358" id="pragma-line-4358"></a>

***Value***\
Value as Decimal (constant): The value which is returned as a Decimal.

#### Return Type <a href="#pragma-line-4365" id="pragma-line-4365"></a>

Decimal


# Converters

## CanBeDateTime

Checks whether the given Value can be converted to a DateTime.

#### Syntax <a href="#pragma-line-4477" id="pragma-line-4477"></a>

```
CanBeDateTime ( Value [, Format] [, Language] )
```

#### Parameters <a href="#pragma-line-4483" id="pragma-line-4483"></a>

***Value***\
&#x20;The Value to check.\
&#x20;Type: String

***Format*** (optional)\
&#x20;The Format of the Value.\
&#x20;Type: String

***Language*** (optional)\
&#x20;The Culture of the Value.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4498" id="pragma-line-4498"></a>

Boolean

## CanBeInt

Checks whether the given Value can be converted to an Int.

#### Syntax <a href="#pragma-line-4507" id="pragma-line-4507"></a>

```
CanBeInt ( Value [, Language] )
```

#### Parameters <a href="#pragma-line-4513" id="pragma-line-4513"></a>

***Value***\
&#x20;The Value to check.\
&#x20;Type: String

***Language*** (optional)\
&#x20;The Culture of the Value.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4524" id="pragma-line-4524"></a>

Boolean

## FromBase64String

Converts the given Base64 value to a string.&#x20;

As an example the Base64 value *VGhpcyBpcyBhIHRlc3Q* (UTF-8 default encoding) would be converted into String text *This is a test .* See [*ToBase64String* ](#tobase64string)for vice versa conversion.

#### Syntax

```
FromBase64String ( Value [, EncodingCodePage] ) 
```

#### Parameters

**Value**\
&#x20;The Value to convert.\
&#x20;Type: String

***EncodingCodePage*** (optional)\
&#x20;The encoding used for the conversion. Uses UTF-8 encoding by default.\
&#x20;Type: Integer

#### Return Type <a href="#pragma-line-4554" id="pragma-line-4554"></a>

String

## ToBase64String

Converts the given value to a Base64 string.&#x20;

As an example the String text *This is a test* would be converted using UTF-8 encoding by default into *VGhpcyBpcyBhIHRlc3Q= .* See [*FromBase64String* ](#frombase64string)for vice versa conversion.

#### Syntax

```
ToBase64String ( Value [, EncodingCodePage] ) 
```

#### Parameters

**Value**\
&#x20;The Value to convert.\
&#x20;Type: String

***EncodingCodePage*** (optional)\
&#x20;The encoding used for the conversion. Uses UTF-8 encoding by default.\
&#x20;Type: Integer

#### Return Type <a href="#pragma-line-4554" id="pragma-line-4554"></a>

Integer

## ToDateTime

Convert a String to a DateTime.

#### Syntax <a href="#pragma-line-4533" id="pragma-line-4533"></a>

```
ToDateTime ( Value [, Format] [, Language] )
```

#### Parameters <a href="#pragma-line-4539" id="pragma-line-4539"></a>

**Value**\
&#x20;The Value to convert.\
&#x20;Type: String

***Format*** (optional)\
&#x20;The Format of the Value to convert.\
&#x20;Type: String

***Language*** (optional)\
&#x20;The Culture of the Value.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4554" id="pragma-line-4554"></a>

DateTime

## ToDouble

Convert a Value to a Double.

#### Syntax <a href="#pragma-line-4563" id="pragma-line-4563"></a>

```
ToDouble ( Value [, Language] )
```

#### Parameters <a href="#pragma-line-4569" id="pragma-line-4569"></a>

***Value***\
&#x20;The Value to convert.\
&#x20;Type: Any

***Language*** (optional)\
&#x20;The Culture of the Value.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-4580" id="pragma-line-4580"></a>

Double

## ToFloat

Convert a Value to a Float.

#### Syntax <a href="#pragma-line-4589" id="pragma-line-4589"></a>

```
ToFloat ( Value [, Language] )
```

#### Parameters <a href="#pragma-line-4595" id="pragma-line-4595"></a>

***Value***\
&#x20;The Value to convert.\
&#x20;Type: Any

***Language*** (optional)\
&#x20;The Culture of the Value.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4606" id="pragma-line-4606"></a>

Float

## ToGuid

Converts a value to a Guid. The Guid has to be of valid format.

#### Syntax <a href="#pragma-line-4615" id="pragma-line-4615"></a>

```
ToGuid ( Value [, Format] )
```

#### Parameters <a href="#pragma-line-4621" id="pragma-line-4621"></a>

***Value***\
&#x20;The Value to convert.\
&#x20;Type: String

***Format*** (optional)\
&#x20;The Format of the Value to convert.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-4632" id="pragma-line-4632"></a>

Guid

## ToInt

Convert a Value to an Int.

#### Syntax <a href="#pragma-line-4641" id="pragma-line-4641"></a>

```
ToInt ( Value [, Language] )
```

#### Parameters <a href="#pragma-line-4647" id="pragma-line-4647"></a>

***Value***\
&#x20;The Value to convert.\
&#x20;Type: Any

***Language*** (optional)\
&#x20;The Culture of the Value.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4658" id="pragma-line-4658"></a>

Int

## ToString

Converts a value to a string. Can be formatted using the Format element. The language element determines the language if more than language are available.

#### Syntax <a href="#pragma-line-4667" id="pragma-line-4667"></a>

```
ToString ( Value [, Format] [, Language] )
```

#### Parameters <a href="#pragma-line-4673" id="pragma-line-4673"></a>

***Value***\
&#x20;String used as basis for the operation.\
&#x20;Type: Any

***Format*** (optional)\
&#x20;Format element which determines the format of the String.\
&#x20;Type: String

***Language*** (optional)\
&#x20;Determines the language of the String.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4688" id="pragma-line-4688"></a>

String

## ToTimeSpan

Convert a String to a TimeSpan

#### Syntax <a href="#pragma-line-4697" id="pragma-line-4697"></a>

```
ToTimeSpan ( Value [, Format] [, Language] )
```

#### Parameters <a href="#pragma-line-4703" id="pragma-line-4703"></a>

***Value***\
&#x20;The Value to convert.\
&#x20;Type: String

***Format*** (optional)\
&#x20;The Format of the Value to convert.\
&#x20;Type: String

***Language*** (optional)\
&#x20;The Culture of the Value.\
&#x20;Type: Language

#### Return Type <a href="#pragma-line-4718" id="pragma-line-4718"></a>

TimeSpan

## CanBeDecimal

Checks whether the given Value can be converted to a Decimal.

#### Syntax <a href="#pragma-line-4563" id="pragma-line-4563"></a>

```
CanBeDecimal ( Value [, Language] )
```

#### Parameters <a href="#pragma-line-4569" id="pragma-line-4569"></a>

***Value***\
&#x20;Value as String: The Value to check.

***Language*** (optional)\
&#x20;The Culture of the Value.<br>

#### Return Type <a href="#pragma-line-4580" id="pragma-line-4580"></a>

Boolean

## ToDecimal

Converts a Value to a Decimal.

#### Syntax <a href="#pragma-line-4563" id="pragma-line-4563"></a>

```
ToDecimal ( Value [, Language] )
```

#### Parameters <a href="#pragma-line-4569" id="pragma-line-4569"></a>

***Value***\
&#x20;Value as Any: The Value to convert.

***Language*** (optional)\
&#x20;The Culture of the Value.<br>

#### Return Type <a href="#pragma-line-4580" id="pragma-line-4580"></a>

Decimal


# Commands

## CloseCommand

A command when used with ExecuteCommands that closes an Object.

#### Syntax <a href="#pragma-line-4729" id="pragma-line-4729"></a>

```
CloseCommand ( Object )
```

#### Parameters <a href="#pragma-line-4735" id="pragma-line-4735"></a>

***Object***\
&#x20;The Object to close.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-4742" id="pragma-line-4742"></a>

Command

## DownloadCommand

A command when used with ExecuteCommands that downloads a Document.

#### Syntax <a href="#pragma-line-4751" id="pragma-line-4751"></a>

```
DownloadCommand ( Document )
```

#### Parameters <a href="#pragma-line-4757" id="pragma-line-4757"></a>

***Document***\
&#x20;The Document to download.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-4764" id="pragma-line-4764"></a>

Command

## DownloadFromInstanceCommand

A command when used with ExecuteCommands that downloads a Document from an Object.

#### Syntax <a href="#pragma-line-4773" id="pragma-line-4773"></a>

```
DownloadFromInstanceCommand ( Object )
```

#### Parameters <a href="#pragma-line-4779" id="pragma-line-4779"></a>

***Object***\
&#x20;The Object to download the Document from.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-4786" id="pragma-line-4786"></a>

Command

## ExecuteCommands

Exits the Script and executes the given Commands.

#### Syntax <a href="#pragma-line-4795" id="pragma-line-4795"></a>

```
ExecuteCommands ( Commands )
```

#### Parameters <a href="#pragma-line-4801" id="pragma-line-4801"></a>

***Commands***\
&#x20;The Commands to execute.\
&#x20;Type: List\<Command>

#### Return Type <a href="#pragma-line-4808" id="pragma-line-4808"></a>

Exit

## LoadNewCommand

A command when used with ExecuteCommands that loads an Object new.

#### Syntax <a href="#pragma-line-4817" id="pragma-line-4817"></a>

```
LoadNewCommand ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-4823" id="pragma-line-4823"></a>

***Object***\
&#x20;The Object to load new.\
&#x20;Type: Object

***LayoutId*** (optional)\
&#x20;The ID of the new Layout for the Object.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-4834" id="pragma-line-4834"></a>

Command

## MessageCommand

A command when used with ExecuteCommands that displays a Message

#### Syntax <a href="#pragma-line-4843" id="pragma-line-4843"></a>

```
MessageCommand ( Message )
```

#### Parameters <a href="#pragma-line-4849" id="pragma-line-4849"></a>

***Message***\
&#x20;The Message to display.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-4856" id="pragma-line-4856"></a>

Command

## OpenCommand

A command when used with ExecuteCommands that opens an Object.

#### Syntax <a href="#pragma-line-4865" id="pragma-line-4865"></a>

```
OpenCommand ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-4871" id="pragma-line-4871"></a>

***Object***\
&#x20;The Object to open.\
&#x20;Type: Object

***LayoutId*** (optional)\
&#x20;The ID of the Layout to open the Object with.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-4882" id="pragma-line-4882"></a>

Command

## RefreshCommand

A command when used with ExecuteCommands that refreshes an Object.

#### Syntax <a href="#pragma-line-4891" id="pragma-line-4891"></a>

```
RefreshCommand ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-4897" id="pragma-line-4897"></a>

***Object***\
&#x20;The Object to refresh.\
&#x20;Type: Object

***LayoutId*** (optional)\
&#x20;The ID of the Layout for the refreshed Object.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-4908" id="pragma-line-4908"></a>

Command

## ReloadApplicationCommand

A command when used with ExecuteCommands that reloads the entire Application.

#### Syntax <a href="#pragma-line-4917" id="pragma-line-4917"></a>

```
ReloadApplicationCommand (  )
```

#### Parameters <a href="#pragma-line-4923" id="pragma-line-4923"></a>

No parameters

#### Return Type <a href="#pragma-line-4927" id="pragma-line-4927"></a>

Command

## ReloadCommand

A command when used with ExecuteCommands that reloads an Object.

#### Syntax <a href="#pragma-line-4936" id="pragma-line-4936"></a>

```
ReloadCommand ( Object [, LayoutId] )
```

#### Parameters <a href="#pragma-line-4942" id="pragma-line-4942"></a>

***Object***\
&#x20;The Object to reload.\
&#x20;Type: Object

***LayoutId*** (optional)\
&#x20;The ID of the Layout for the reloaded Object.\
&#x20;Type: Guid

#### Return Type <a href="#pragma-line-4953" id="pragma-line-4953"></a>

Command


# Text

## Concat

Takes a list of items as input and returns one concatenated String.

#### Syntax <a href="#pragma-line-5373" id="pragma-line-5373"></a>

```
Concat ( Values )
```

#### Parameters <a href="#pragma-line-5379" id="pragma-line-5379"></a>

***Values***\
&#x20;The list of items which will be concatenated.\
&#x20;Type: List\<Any>

#### Return Type <a href="#pragma-line-5386" id="pragma-line-5386"></a>

String

## Empty

Returns an empty String.

#### Syntax <a href="#pragma-line-5395" id="pragma-line-5395"></a>

```
Empty (  )
```

#### Parameters <a href="#pragma-line-5401" id="pragma-line-5401"></a>

No parameters

#### Return Type <a href="#pragma-line-5405" id="pragma-line-5405"></a>

String

## EndString

Takes the String ValueA as input and returns a String of the specified length starting from the end.

#### Syntax <a href="#pragma-line-5414" id="pragma-line-5414"></a>

```
EndString ( Value , Length )
```

#### Parameters <a href="#pragma-line-5420" id="pragma-line-5420"></a>

***Value***\
&#x20;String the operation is performed on.\
&#x20;Type: String

***Length***\
&#x20;Length of the substring.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-5431" id="pragma-line-5431"></a>

String

## Format

Represents the formatting of a template.

#### Syntax <a href="#pragma-line-5440" id="pragma-line-5440"></a>

```
Format ( Template [, Expressions] )
```

#### Parameters <a href="#pragma-line-5446" id="pragma-line-5446"></a>

***Template***\
&#x20;HTML formatted Template\
&#x20;Type: String

***Expressions*** (optional)\
&#x20;List of expressions which are used in the Template.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-5457" id="pragma-line-5457"></a>

String

## FormatExpression

Formats a Template by replacing placeholders with they given Values.

#### Syntax <a href="#pragma-line-5466" id="pragma-line-5466"></a>

```
FormatExpression ( Template , Values )
```

#### Parameters <a href="#pragma-line-5472" id="pragma-line-5472"></a>

***Template***\
&#x20;The Template to format.\
&#x20;Type: String

***Values***\
&#x20;The Values used to replace placeholders (e.g. ).\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-5483" id="pragma-line-5483"></a>

String

## GetResourceValue

Returns the value of a resource, locale, and key. Returns NULL if either the resource or key are not found in either the locale or default locale.

#### Syntax

```
GetResourceValue( String Resource, String [Locale], String Key )
```

#### Parameters

***Resource***\
The name of the resource.\
Type: String

***Locale*** (optional)\
The name of the locale. Uses the language of the current user by default.\
Type: String

***Key***\
The key of the value.\
Type: String

#### Return Type

String

## IndexOf

Gets the Index of a given Search in a String Value.

#### Syntax <a href="#pragma-line-5492" id="pragma-line-5492"></a>

```
IndexOf ( Value , Search [, StartIndex] [, Count] )
```

#### Parameters <a href="#pragma-line-5498" id="pragma-line-5498"></a>

***Value***\
&#x20;The String Value to search.\
&#x20;Type: String

***Search***\
&#x20;The String to Search for.\
&#x20;Type: String

***StartIndex*** (optional)\
&#x20;The Index to start the search from.\
&#x20;Type: Int

***Count*** (optional)\
&#x20;The Count of Chars to search after the start.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-5517" id="pragma-line-5517"></a>

Int

## Join

Takes a list of values as input, performs the toString method on each item and concatenates the given Values separated by the given Separator and returns the whole String.

#### Syntax <a href="#pragma-line-5526" id="pragma-line-5526"></a>

```
Join ( Separator , Values )
```

#### Parameters <a href="#pragma-line-5532" id="pragma-line-5532"></a>

***Separator***\
&#x20;String which is used to separate the elements.\
&#x20;Type: String

***Values***\
&#x20;List of elements which will be concatenated.\
&#x20;Type: List\<Any>

#### Return Type <a href="#pragma-line-5543" id="pragma-line-5543"></a>

String

## Length

Gets the Length of a given String Value.

#### Syntax <a href="#pragma-line-5552" id="pragma-line-5552"></a>

```
Length ( Value )
```

#### Parameters <a href="#pragma-line-5558" id="pragma-line-5558"></a>

***Value***\
&#x20;The String Value to get the Length of.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5565" id="pragma-line-5565"></a>

Int

## Match

Search the Value for a RegEx-Pattern and returns first match and its groups.

#### Syntax <a href="#pragma-line-5574" id="pragma-line-5574"></a>

```
Match ( Value , Pattern )
```

#### Parameters <a href="#pragma-line-5580" id="pragma-line-5580"></a>

***Value***\
&#x20;The Value to search in.\
&#x20;Type: String

***Pattern***\
&#x20;The RegEx-Pattern to search for.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5591" id="pragma-line-5591"></a>

List\<String>

## Matches

Search the Value for a RegEx-Pattern and returns all matches and its groups.

#### Syntax <a href="#pragma-line-5600" id="pragma-line-5600"></a>

```
Matches ( Value , Pattern )
```

#### Parameters <a href="#pragma-line-5606" id="pragma-line-5606"></a>

***Value***\
&#x20;The Value to search in.\
&#x20;Type: String

***Pattern***\
&#x20;The RegEx-Pattern to search for.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5617" id="pragma-line-5617"></a>

List\<List\<String>>

## MatchesCapture

Searches an input string for all occurrences of a regular expression line for line.

#### Syntax <a href="#pragma-line-5626" id="pragma-line-5626"></a>

```
MatchesCapture ( Value , Pattern )
```

#### Parameters <a href="#pragma-line-5632" id="pragma-line-5632"></a>

***Value***\
&#x20;The string to search for a match.\
&#x20;Type: String

***Pattern***\
&#x20;RegEx-Pattern to match.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5643" id="pragma-line-5643"></a>

List\<String>

## PadLeft

Pads the Value with the Padding character on the left side for a given Width.

#### Syntax <a href="#pragma-line-5652" id="pragma-line-5652"></a>

```
PadLeft ( Value , Width [, Padding] )
```

#### Parameters <a href="#pragma-line-5658" id="pragma-line-5658"></a>

***Value***\
&#x20;String which will be used as basis for the operation.\
&#x20;Type: String

***Width***\
&#x20;Length of the padding.\
&#x20;Type: Int

***Padding*** (optional)\
&#x20;Char used as padding.\
&#x20;Type: Char

#### Return Type <a href="#pragma-line-5673" id="pragma-line-5673"></a>

String

## PadRight

Pads the Value with the Padding character on the right side for a given Width.

#### Syntax <a href="#pragma-line-5682" id="pragma-line-5682"></a>

```
PadRight ( Value , Width [, Padding] )
```

#### Parameters <a href="#pragma-line-5688" id="pragma-line-5688"></a>

***Value***\
&#x20;String which will be used as basis for the operation.\
&#x20;Type: String

***Width***\
&#x20;Length of the padding.\
&#x20;Type: Int

***Padding*** (optional)\
&#x20;Char used as padding.\
&#x20;Type: Char

#### Return Type <a href="#pragma-line-5703" id="pragma-line-5703"></a>

String

## Replace

Replaces the Pattern Old with the Pattern New in the String Value.

#### Syntax <a href="#pragma-line-5712" id="pragma-line-5712"></a>

```
Replace ( Value , Old , New )
```

#### Parameters <a href="#pragma-line-5718" id="pragma-line-5718"></a>

***Value***\
&#x20;String which will be used as basis for the operation.\
&#x20;Type: String

***Old***\
&#x20;Pattern which is replaced.\
&#x20;Type: String

***New***\
&#x20;Value which is the replacement.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5733" id="pragma-line-5733"></a>

String

## RestString

Retrieves a substring thats starts at a specified character position and continues to the end of the string. The index of the first character is 0.

#### Syntax <a href="#pragma-line-5742" id="pragma-line-5742"></a>

```
RestString ( Value , Index )
```

#### Parameters <a href="#pragma-line-5748" id="pragma-line-5748"></a>

***Value***\
&#x20;String which will be used as basis for the operation.\
&#x20;Type: String

***Index***\
&#x20;Index position from which the String is cut off.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-5759" id="pragma-line-5759"></a>

String

## Split

Returns a list of Strings by splitting the Value using a Separator.

#### Syntax <a href="#pragma-line-5768" id="pragma-line-5768"></a>

```
Split ( Value , Separator )
```

#### Parameters <a href="#pragma-line-5774" id="pragma-line-5774"></a>

***Value***\
&#x20;The Value to split.\
&#x20;Type: String

***Separator***\
&#x20;The Separator to split the Value.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5785" id="pragma-line-5785"></a>

List\<String>

## StartString

Returns a copy of the original String ValueA with a specified length Length starting at the first character of the string.

#### Syntax <a href="#pragma-line-5794" id="pragma-line-5794"></a>

```
StartString ( Value , Length )
```

#### Parameters <a href="#pragma-line-5800" id="pragma-line-5800"></a>

***Value***\
&#x20;String the operation is performed on.\
&#x20;Type: String

***Length***\
&#x20;Length of the substring.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-5811" id="pragma-line-5811"></a>

String

## StripHtml

Strips HTML tags from the Value and returns the result.

#### Syntax <a href="#pragma-line-5820" id="pragma-line-5820"></a>

```
StripHtml ( Value )
```

#### Parameters <a href="#pragma-line-5826" id="pragma-line-5826"></a>

***Value***\
&#x20;The Value to strip the HTML from.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5833" id="pragma-line-5833"></a>

String

## SubString

Returns a substring that starts at the character position Index and has a specified length Length. The index of the first character is 0.

#### Syntax <a href="#pragma-line-5842" id="pragma-line-5842"></a>

```
SubString ( Value , Index , Length )
```

#### Parameters <a href="#pragma-line-5848" id="pragma-line-5848"></a>

***Value***\
&#x20;String used as basis for the operation.\
&#x20;Type: String

***Index***\
&#x20;Position, which is used as a starting point for the Substring.\
&#x20;Type: Int

***Length***\
&#x20;Length of the substring.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-5863" id="pragma-line-5863"></a>

String

## ToLower

Takes a String as input and returns a copy of that String in lower case characters.

#### Syntax <a href="#pragma-line-5872" id="pragma-line-5872"></a>

```
ToLower ( Value )
```

#### Parameters <a href="#pragma-line-5878" id="pragma-line-5878"></a>

***Value***\
&#x20;String used as basis for the operation.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5885" id="pragma-line-5885"></a>

String

## ToUpper

Takes a String as input and returns a copy of that String in upper case characters.

#### Syntax <a href="#pragma-line-5894" id="pragma-line-5894"></a>

```
ToUpper ( Value )
```

#### Parameters <a href="#pragma-line-5900" id="pragma-line-5900"></a>

***Value***\
&#x20;String used as basis for the operation.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5907" id="pragma-line-5907"></a>

String

## Translate

Represents a translator for languages.

#### Syntax <a href="#pragma-line-5916" id="pragma-line-5916"></a>

```
Translate ( Language , Default , Translations )
```

#### Parameters <a href="#pragma-line-5922" id="pragma-line-5922"></a>

***Language***\
&#x20;The Language to translate to.\
&#x20;Type: Language

***Default***\
&#x20;The Default text if no translation for the Language is found.\
&#x20;Type: String

***Translations***\
&#x20;The Translations where to search for the correct Language.\
&#x20;Type: List\<Translation>

#### Return Type <a href="#pragma-line-5937" id="pragma-line-5937"></a>

String

## Translation

Represents a Translation for a Language.

#### Syntax <a href="#pragma-line-5946" id="pragma-line-5946"></a>

```
Translation ( Language , Text )
```

#### Parameters <a href="#pragma-line-5952" id="pragma-line-5952"></a>

***Language***\
&#x20;The Language of the Translation.\
&#x20;Type: Language

***Text***\
&#x20;The Translation text.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5963" id="pragma-line-5963"></a>

Translation

## Trim

Removes space characters on both sides of the String.

#### Syntax <a href="#pragma-line-5972" id="pragma-line-5972"></a>

```
Trim ( Value )
```

#### Parameters <a href="#pragma-line-5978" id="pragma-line-5978"></a>

***Value***\
&#x20;String which is the basis of the operation.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-5985" id="pragma-line-5985"></a>

String

## TrimLeft

Removes space characters on the left side of the String.

#### Syntax <a href="#pragma-line-5994" id="pragma-line-5994"></a>

```
TrimLeft ( Value )
```

#### Parameters <a href="#pragma-line-6000" id="pragma-line-6000"></a>

***Value***\
&#x20;String which is the basis of the operation.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6007" id="pragma-line-6007"></a>

String

## TrimRight

Removes space characters on the right side of the String.

#### Syntax <a href="#pragma-line-6016" id="pragma-line-6016"></a>

```
TrimRight ( Value )
```

#### Parameters <a href="#pragma-line-6022" id="pragma-line-6022"></a>

***Value***\
&#x20;String which is the basis of the operation.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6029" id="pragma-line-6029"></a>

String


# PDF

## MergePdfs

Merges the given PDF documents to one PDF document. Throws an error when one of the documents is not a PDF.

#### Syntax

```
MergePdfs ( Documents , Name )
```

#### Parameters

**Documents**\
&#x20;List of PDFs to be merged.\
&#x20;Type: List\<Document>

**Name**\
The name of the document containing merged PDFs.\
&#x20;Type: String

#### Return Type

Document


# Operators

## Contains

Determines whether the String ValueA contains the String ValueB.

#### Syntax <a href="#pragma-line-6040" id="pragma-line-6040"></a>

```
Contains ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6046" id="pragma-line-6046"></a>

***ValueA***\
&#x20;The String examined.\
&#x20;Type: String

***ValueB***\
&#x20;The pattern which is used to examine.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6057" id="pragma-line-6057"></a>

Boolean

## EndsWith

Determines whether String ValueA ends with String ValueB.

#### Syntax <a href="#pragma-line-6066" id="pragma-line-6066"></a>

```
EndsWith ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6072" id="pragma-line-6072"></a>

***ValueA***\
&#x20;String which is matched against.\
&#x20;Type: String

***ValueB***\
&#x20;Pattern which is matched with.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6083" id="pragma-line-6083"></a>

Boolean

## EqualsTo

Takes two values ValueA and ValueB as input, compares them for equality and returns a Boolean.

#### Syntax <a href="#pragma-line-6092" id="pragma-line-6092"></a>

```
EqualsTo ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6098" id="pragma-line-6098"></a>

***ValueA***\
&#x20;First part of the equation.\
&#x20;Type: Any

***ValueB***\
&#x20;Second part of the equation.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6109" id="pragma-line-6109"></a>

Boolean

## IsBigger

Takes ValueA and ValueB as input and determines whether ValueA is bigger than ValueB.

#### Syntax <a href="#pragma-line-6118" id="pragma-line-6118"></a>

```
IsBigger ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6124" id="pragma-line-6124"></a>

***ValueA***\
&#x20;First part of the comparison.\
&#x20;Type: Any

***ValueB***\
&#x20;Second part of the comparison.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6135" id="pragma-line-6135"></a>

Boolean

## IsBiggerEqualsTo

Takes ValueA and ValueB as input and determines whether ValueA is bigger than or equal to ValueB.

#### Syntax <a href="#pragma-line-6144" id="pragma-line-6144"></a>

```
IsBiggerEqualsTo ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6150" id="pragma-line-6150"></a>

***ValueA***\
&#x20;First part of the comparison.\
&#x20;Type: Any

***ValueB***\
&#x20;Second part of the comparison.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6161" id="pragma-line-6161"></a>

Boolean

## IsEmpty

Determines whether the given Value it is empty or not.

#### Syntax <a href="#pragma-line-6170" id="pragma-line-6170"></a>

```
IsEmpty ( Value )
```

#### Parameters <a href="#pragma-line-6176" id="pragma-line-6176"></a>

***Value***\
&#x20;Value which will be evaluated.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6183" id="pragma-line-6183"></a>

Boolean

## IsInList

Determines whether the given Value is in the given List.

#### Syntax <a href="#pragma-line-6192" id="pragma-line-6192"></a>

```
IsInList ( List , Value )
```

#### Parameters <a href="#pragma-line-6198" id="pragma-line-6198"></a>

***List***\
&#x20;The List to check.\
&#x20;Type: List\<Any>

***Value***\
&#x20;The Value to check for.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6209" id="pragma-line-6209"></a>

Boolean

## IsMatch

Determines whether a certain pattern is found in a String. The pattern can be defined using regular expressions.

#### Syntax <a href="#pragma-line-6218" id="pragma-line-6218"></a>

```
IsMatch ( Value , Pattern )
```

#### Parameters <a href="#pragma-line-6224" id="pragma-line-6224"></a>

***Value***\
&#x20;String which will be evaluated.\
&#x20;Type: String

***Pattern***\
&#x20;Regular Expression which will be used for evaluation.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6235" id="pragma-line-6235"></a>

Boolean

## IsNull

Determines whether the given Value is null.

#### Syntax <a href="#pragma-line-6244" id="pragma-line-6244"></a>

```
IsNull ( Value )
```

#### Parameters <a href="#pragma-line-6250" id="pragma-line-6250"></a>

***Value***\
&#x20;Value which will be evaluated.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6257" id="pragma-line-6257"></a>

Boolean

## IsNullOrEmpty

Determines whether the given Value is null or empty.

#### Syntax <a href="#pragma-line-6266" id="pragma-line-6266"></a>

```
IsNullOrEmpty ( Value )
```

#### Parameters <a href="#pragma-line-6272" id="pragma-line-6272"></a>

***Value***\
&#x20;Value which will be evaluated.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6279" id="pragma-line-6279"></a>

Boolean

## IsNullOrWhiteSpace

Determines whether the given Value is null or consists only of white space.

#### Syntax <a href="#pragma-line-6288" id="pragma-line-6288"></a>

```
IsNullOrWhiteSpace ( Value )
```

#### Parameters <a href="#pragma-line-6294" id="pragma-line-6294"></a>

***Value***\
&#x20;Value which will be evaluated.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6301" id="pragma-line-6301"></a>

Boolean

## IsSmaller

Takes ValueA and ValueB as input and determines whether ValueA is smaller than ValueB.

#### Syntax <a href="#pragma-line-6310" id="pragma-line-6310"></a>

```
IsSmaller ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6316" id="pragma-line-6316"></a>

***ValueA***\
&#x20;First part of the comparison.\
&#x20;Type: Any

***ValueB***\
&#x20;Second part of the comparison.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6327" id="pragma-line-6327"></a>

Boolean

## IsSmallerEqualsTo

Takes ValueA and ValueB as input and determines whether ValueA is smaller than or equal to ValueB.

#### Syntax <a href="#pragma-line-6336" id="pragma-line-6336"></a>

```
IsSmallerEqualsTo ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6342" id="pragma-line-6342"></a>

***ValueA***\
&#x20;First part of the comparison.\
&#x20;Type: Any

***ValueB***\
&#x20;Second part of the comparison.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6353" id="pragma-line-6353"></a>

Boolean

## StartsWith

Determines whether String valueA starts with String ValueB.

#### Syntax <a href="#pragma-line-6362" id="pragma-line-6362"></a>

```
StartsWith ( ValueA , ValueB )
```

#### Parameters <a href="#pragma-line-6368" id="pragma-line-6368"></a>

***ValueA***\
&#x20;String which is matched against.\
&#x20;Type: Any

***ValueB***\
&#x20;Pattern which is matched with.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6379" id="pragma-line-6379"></a>

Boolean


# PowerPoint

## CountSlides

Counts the slides from a powerPoint document.

#### Syntax <a href="#pragma-line-6390" id="pragma-line-6390"></a>

```
CountSlides ( Document )
```

#### Parameters <a href="#pragma-line-6396" id="pragma-line-6396"></a>

***Document***\
&#x20;The PowerPoint document.\
&#x20;Type: Any

#### Return Type <a href="#pragma-line-6403" id="pragma-line-6403"></a>

Int

## GetSlideThumbnail

Create a thumbnail image from a PowerPoint slide by index. A dictionary with the image as document (key: 'Thumbnail'), the slide notes (key: 'Notes'), slide title (key: 'Title') and slide index (key: 'Index') returned.

#### Syntax <a href="#pragma-line-6412" id="pragma-line-6412"></a>

```
GetSlideThumbnail ( Document , Index [, Width] )
```

#### Parameters <a href="#pragma-line-6418" id="pragma-line-6418"></a>

***Document***\
&#x20;PowerPoint document\
&#x20;Type: Document

***Index***\
&#x20;Index of the slide in Presentation.\
&#x20;Type: Int

***Width*** (optional)\
&#x20;The desired width (x dimension) in pixel.\
&#x20;Type: Int

#### Return Type <a href="#pragma-line-6433" id="pragma-line-6433"></a>

Dictionary\<Any,Any>

## RemoveAllSlides

Remove all slides in PowerPoint document for the presented index list. The modified Ppt document is returned.

#### Syntax <a href="#pragma-line-6442" id="pragma-line-6442"></a>

```
RemoveAllSlides ( Document , IndexList )
```

#### Parameters <a href="#pragma-line-6448" id="pragma-line-6448"></a>

***Document***\
&#x20;The PowerPoint Document.\
&#x20;Type: Document

***IndexList***\
&#x20;List of indexes that are removed (blacklist).\
&#x20;Type: List\<Int>

#### Return Type <a href="#pragma-line-6459" id="pragma-line-6459"></a>

Document

## RemoveAllSlidesExceptFor

Remove all slides in PowerPoint document except for the presented index list. The modified Ppt document is returned.

#### Syntax <a href="#pragma-line-6468" id="pragma-line-6468"></a>

```
RemoveAllSlidesExceptFor ( Document , IndexList )
```

#### Parameters <a href="#pragma-line-6474" id="pragma-line-6474"></a>

***Document***\
&#x20;The PowerPoint Document.\
&#x20;Type: Document

***IndexList***\
&#x20;List of indexes that are NOT removed (whitelist).\
&#x20;Type: List\<Int>

#### Return Type <a href="#pragma-line-6485" id="pragma-line-6485"></a>

Document


# QR-/Barcode

## CreateBarcode

Creates a QR or bar code and returns the Document with the image. The generated barcode image can be manipulated with parameter options.

#### Syntax <a href="#pragma-line-6496" id="pragma-line-6496"></a>

```
CreateBarcode ( CodeText [, EncodeType] [, XDimension] [, YDimension] [, BarcodeColor] [, RotationAngle] )
```

#### Parameters <a href="#pragma-line-6502" id="pragma-line-6502"></a>

***CodeText***\
&#x20;The coding text of the barcode.\
&#x20;Type: String

***EncodeType*** (optional)\
&#x20;The encode type of the barcode, e.g QR, ISBN, DataMatrix, Pdf417. Default is EAN13\
&#x20;Type: String

***XDimension*** (optional)\
&#x20;The X dimension determines a barcode's density. If the X dimension is large so the barcode can hold more information, in fact the barcode is getting bigger. Default dimension is 0,6.\
&#x20;Type: Double

***YDimension*** (optional)\
&#x20;The Y dimension is to 2D barcodes what the X dimension is for linear barcodes. Default dimension is 2,0.\
&#x20;Type: Double

***BarcodeColor*** (optional)\
&#x20;The barcode color in ARGB format, e.g. '255,0,0,0' for black\
&#x20;Type: String

***RotationAngle*** (optional)\
&#x20;The rotation angle in degrees. If angle NOT equal to 90, 180, 270 or 0, it may difficulty to read the image.\
&#x20;Type: Double

#### Return Type <a href="#pragma-line-6529" id="pragma-line-6529"></a>

Document

## ReadBarcode

Analyzes a QR or bar code and returns the stored information as a string. Input Document must contain an image (supported formats).

#### Syntax <a href="#pragma-line-6538" id="pragma-line-6538"></a>

```
ReadBarcode ( Document [, DecodeBarCodeType] )
```

#### Parameters <a href="#pragma-line-6544" id="pragma-line-6544"></a>

***Document***\
&#x20;Document object containing the barcode image\
&#x20;Type: Document

***DecodeBarCodeType*** (optional)\
&#x20;Specify the type of barcode to read, e.g QR, ISBN, DataMatrix, Pdf417, Code39Standard. Default is all types.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6555" id="pragma-line-6555"></a>

String

## &#x20;<a href="#pragma-line-6560" id="pragma-line-6560"></a>


# Messaging

## CreateMsgDocument

Creates an MSG document based on the provided email parameters.

The generated document represents an email message and may include attachments and inline attachments.

#### **Syntax**

CreateMsgDocument ( From , SentOn , To , CC , BCC , Subject , Body , Attachments , InlineAttachments )

***

#### **Parameters**

**From** *(optional)*\
Sender of the email.\
Type: String

**SentOn** *(optional)*\
Sent date of the email.\
Type: DateTime

**To** *(optional)*\
Recipients of the email.\
Type: String

**CC** *(optional)*\
Carbon copy recipients of the email.\
Type: String

**BCC** *(optional)*\
Blind carbon copy recipients of the email.\
Type: String

**Subject** *(optional)*\
Subject of the email.\
This value is also used as the document name.\
Type: String

**Body** *(optional)*\
Body content of the email.\
Type: String

**Attachments** *(optional)*\
Attachments of the email.\
Type: List\<Document>

**InlineAttachments** *(optional)*\
Inline attachments of the email.

The **FileName** of each Document is used as the content ID.\
A body containing elements that support inline attachments (for example `<img>`) can reference these using the same content ID.

The FileName of each Document must:

* Contain only letters and digits.
* May include the following special characters:\
  `! # $ % & ' * + - / = ? ^ _ { | } ~`
* Dots are allowed, but:
  * Not at the start or end.
  * Not doubled.

Type: List\<Document>

***

#### **Return Type**

Document

## CreateMsgDocumentFromWord

Create MSG-Document based on the parameter From, To, Subject and Body as MHTML (convert from a Word Document).

#### Syntax <a href="#pragma-line-6612" id="pragma-line-6612"></a>

```
Document CreateMsgDocumentFromWord(
    String [From],
    DateTime [SentOn],
    String [To],
    String [CC],
    String [BCC],
    String Subject,
    Document Document,
    List<Document> [Attachments]
)
```

#### Parameters <a href="#pragma-line-6618" id="pragma-line-6618"></a>

***From*** (optional)\
&#x20;Sender of the mail.\
&#x20;*Type: String*

***SentOn*** (optional)\
&#x20;Sent date of the mail.\
&#x20;T*ype: DateTime*

***To*** (optional)\
&#x20;Recipients of the mail.\
&#x20;*Type: String*

***CC*** (optional)\
&#x20;CC of the mail.\
&#x20;*Type: String*

***BCC*** (optional)\
&#x20;BCC of the mail.\
&#x20;*Type: String*

***Subject***\
&#x20;Subject of the mail (also used as the Document name).\
&#x20;*Type: String*

***Document***\
&#x20;The Word Document used as the Body.\
&#x20;*Type: Document*

***Attachments*** (optional)\
&#x20;Attachments of the mail.\
&#x20;*Type: List\<Document>*

**Return Type**\
Document

## GetMailInstance

Get E-Mail object based on the MSG-Document.

#### Syntax <a href="#pragma-line-6658" id="pragma-line-6658"></a>

```
GetMailInstance ( Document )
```

#### Parameters <a href="#pragma-line-6664" id="pragma-line-6664"></a>

***Document***\
&#x20;The MSG-Document.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-6671" id="pragma-line-6671"></a>

Object

## GetMsgProperties

Reads the properties of the MSG file passed in the Document parameter.

#### Syntax <a href="#pragma-line-6680" id="pragma-line-6680"></a>

```
GetMsgProperties ( Document )
```

#### Parameters <a href="#pragma-line-6686" id="pragma-line-6686"></a>

***Document***\
&#x20;Document object containing an MSG file.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-6693" id="pragma-line-6693"></a>

Dictionary\<Any,Any>

## MergeMsgDocuments

Merges MSG files to create a document preserving embedded images.

#### Syntax

```
MergeMsgDocuments ( [Prepend] , Target [, Append] )
```

#### Parameters

***Prepend*** (optional)\
The MSG-Document to prepend to the target.\
Type: Document

**Target** \
The MSG-Document that another MSG-Documents is appended and/ or prepended to.\
Type: Document

***Append*** (optional)\
The MSG-Document to append to the target.\
Type: Document

**Return Type**\
Document

## Notify

Notifies an User with a Subject and a text.

#### Syntax <a href="#pragma-line-6702" id="pragma-line-6702"></a>

```
Notify ( To , Subject , Body )
```

#### Parameters <a href="#pragma-line-6708" id="pragma-line-6708"></a>

**To**\
&#x20;ID of the user which will be notified.\
&#x20;Type: Guid

**Subject**\
&#x20;Title of the notification.\
&#x20;Type: String

**Body**\
&#x20;Content text of the notification.\
&#x20;Type: String

**Return Type**\
Void

## SendMessage

Sends a message with a title Subject and content Body to a person To from a person From.

#### Syntax <a href="#pragma-line-6732" id="pragma-line-6732"></a>

```
SendMessage ( From , To , Subject , Body )
```

#### Parameters <a href="#pragma-line-6738" id="pragma-line-6738"></a>

**From**\
&#x20;Email address of the sender.\
&#x20;Type: String

**To**\
&#x20;Email addresses of the receivers.\
&#x20;Type: String

**Subject**\
&#x20;Title of the message.\
&#x20;Type: String

**Body**\
&#x20;Content text of the message.\
&#x20;Type: String

**Return Type**\
Void

## SendMsgDocument

Send an E-Mail using the platform account based on the MSG-Document

#### Syntax <a href="#pragma-line-6766" id="pragma-line-6766"></a>

```
SendMsgDocument ( Document )
```

#### Parameters <a href="#pragma-line-6772" id="pragma-line-6772"></a>

**Document**\
&#x20;The E-Mail to send.\
&#x20;Type: Document

**Return Type**\
Object

## SetMsgProperties

Copies the MSG-Document and set the properties of the new MSG-File to the values specified in the parameter MsgProperties.

#### Syntax <a href="#pragma-line-6788" id="pragma-line-6788"></a>

```
SetMsgProperties ( Document , MsgValues )
```

#### Parameters <a href="#pragma-line-6794" id="pragma-line-6794"></a>

***Document***\
&#x20;Document containing an MSG file.\
&#x20;Type: Document

***MsgValues***\
&#x20;The values to set.\
&#x20;Type: Dictionary\<Any,Any>

**Return Type**\
Document

## SharedLinkInstance

Creates an URL link for an instance.

#### Syntax <a href="#pragma-line-6814" id="pragma-line-6814"></a>

```
SharedLinkInstance ( Object )
```

#### Parameters <a href="#pragma-line-6820" id="pragma-line-6820"></a>

***Object***\
&#x20;Object which is used as basis of the link.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-6827" id="pragma-line-6827"></a>

String

## TransformMsgDocument

Build an MSG-Document representing a Reply, ReplyAll or Forward-Message to the MSG-Document passed as a parameter.

#### Syntax <a href="#pragma-line-6836" id="pragma-line-6836"></a>

```
TransformMsgDocument ( Document [, TransformationType] )
```

#### Parameters <a href="#pragma-line-6842" id="pragma-line-6842"></a>

***Document***\
&#x20;The Document to transform.\
&#x20;Type: Document

***TransformationType*** (optional)\
&#x20;Type of the transformation: Reply, ReplyAll or Forward.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6857" id="pragma-line-6857"></a>

Document


# Cells

Script actions to create and manipulate Excel documents (workbooks).

## CalculateCellFormula

Calculates the formula of the cell.

#### Syntax

```yaml
Void CalculateCellFormula(
    CellsCell Cell
)
```

#### Parameters

***Cell***\
The cell which contains the formula to calculate.\
Type: CellsCell

#### Return Type

Void

## CalculateWorkbookFormula

Calculates all formulas in the workbook.

#### Syntax

```yaml
Void CalculateWorkbookFormula(
    CellsWorkbook Workbook
)
```

#### Parameters

***Workbook***\
The workbook which contains the formulas to calculate.\
Type: CellsWorkbook

#### Return Type

Void

## CalculateWorksheetFormula

Calculates all formulas in the worksheet.

#### Syntax

```yaml
Void CalculateWorksheetFormula(
    CellsWorksheet Worksheet
)
```

#### Parameters

***Worksheet***\
The worksheet which contains the formulas to calculate.\
Type: CellsWorksheet

#### Return Type

Void

## CreateWorkspace

Creates and returns a new workbook. The workbook has the following fields (accessible through GetValue/ SetValue):

* Worksheets as List (Get)

  Warning: The return value is not serializable (causes input request errors)!

#### Syntax

```yaml
CellsWorkbook CreateWorkbook()
```

#### Parameters

*This action does not have any parameter.*

#### Return Type

CellsWorkbook

## LoadWorkbook

Loads and returns an existing workbook. The workbook has the following fields (accessible through GetValue/ SetValue):

* Worksheets as List (Get)

  Warning: The return value is not serializable (causes input request errors)!

#### Syntax

```yaml
CellsWorkbook LoadWorkbook( Document [, Format ] )
```

#### Parameters

***Format as String (optional):***\
The format of the workbook: Xls, Xlsx. Analyses the given document if format is omitted.

**Workbook**\
The document to load the workbook from.\
Type: Document

***Format*** (optional)\
The format of the workbook. Analyses the given document if format is omitted.\
Type: String

#### Return Type

CellsWorkbook

## SaveWorkbook

Saves a workbook and returns it as a document.

#### Syntax

```yaml
Document SaveWorkbook(
    CellsWorkbook Workbook,
    String Name,
    String Format
)
```

#### Parameters

***Workbook***\
The workbook to save.\
Type: CellsWorkbook

***Name***\
The name of the document.\
Type: String

***Format***\
The format of the workbook: Xls, Xlsx.\
Type: String

#### Return Type

Document

## InsertWorksheets

Inserts worksheets into a workbook.

#### Syntax

```yaml
Void InsertWorksheets(
    CellsWorkbook Workbook,
    Int [Index],
    Int [Count]
)
```

#### Parameters

***Workbook***\
The workbook to insert the worksheets into.\
Type: CellsWorkbook

***Index** (optional)*\
The insertion index of the worksheets (default 0).\
Type: Int

***Count** (optional)*\
The amount of worksheets to insert (default 1).\
Type: Int

## GetWorksheetByIndex

Gets a worksheet by index. The worksheet has the following fields (accessible through GetValue/SetValue):

* DisplayRightToLeft as Boolean (Get/ Set)
* DisplayZeros as Boolean (Get/ Set)
* FirstVisibleColumn as Int (Get/ Set)
* FirstVisibleRow as Int (Get/ Set)
* Index as Int (Get)
* IsSelected as Boolean (Get/ Set)
* IsVisible as Boolean (Get/ Set)
* Name as String (Get/ Set)
* TabColor as String (Get/ Set): HTML color (e.g. #FFFFFF)

{% hint style="warning" %}
The return value is not serializable (causes input request errors)!
{% endhint %}

#### Syntax

```yaml
CellsWorksheet GetWorksheetByIndex(
    CellsWorkbook Workbook,
    Int Index
)
```

#### Parameters

***Workbook***\
The workbook to get the worksheet from.\
Type: CellsWorkbook

***Index***\
The index of the worksheet.\
Type: Int

#### Return Type

CellsWorksheet

## GetWorksheetByName

Gets a worksheet by name. The worksheet has the following fields (accessible through GetValue/ SetValue):

* DisplayRightToLeft as Boolean (Get/ Set)
* DisplayZeros as Boolean (Get/ Set)
* FirstVisibleColumn as Int (Get/ Set)
* FirstVisibleRow as Int (Get/ Set)
* Index as Int (Get)
* IsSelected as Boolean (Get/ Set)
* IsVisible as Boolean (Get/ Set)
* Name as String (Get/ Set)
* TabColor as String (Get/ Set): HTML color (e.g. #FFFFFF)

{% hint style="warning" %}
The return value is not serializable (causes input request errors)!
{% endhint %}

#### Syntax

```yaml
CellsWorksheet GetWorksheetByName(
    CellsWorkbook Workbook,
    String Name
)
```

#### Parameters

***Workbook***\
The workbook to get the worksheet from.\
Type: CellsWorkbook

***Name***\
The name of the worksheet.\
Type: String

**Return Type**

CellsWorksheet

## RemoveWorksheets

Removes worksheets in a workbook.

#### Syntax

```yaml
Void RemoveWorksheets(
    CellsWorkbook Workbook,
    Int Index,
    Int [Count]
)
```

#### Parameters

***Workbook***\
The workbook to remove the worksheets from.\
Type: CellsWorkbook

***Index***\
The starting index of the removal.\
Type: Int

***Count** (optional)*\
The amount of worksheets to remove (default 1).\
Type: Int

#### Return Type

Void

## CellsStyle

Creates a new style. The style has the following fields (accessible through GetValue/ SetValue):

* BorderAll as CellsBorder (Set)
* BorderOutline as CellsBorder (Set)
* BorderInside as CellsBorder (Set)
* BorderLeft as CellsBorder (Get/ Set)
* BorderRight as CellsBorder (Get/ Set)
* BorderTop as CellsBorder (Get/ Set)
* BorderBottom as CellsBorder (Get/ Set)
* BorderDiagonalDown as CellsBorder (Get/ Set)
* BorderDiagonalUp as CellsBorder (Get/ Set)
* BorderVertical as CellsBorder (Get/ Set)
* BorderHorizontal as CellsBorder (Get/ Set)
* FillColor as String (Get/ Set): HTML color (e.g. #FFFFFF)
* FontColor as String (Get/ Set): HTML color (e.g. #FFFFFF)
* FontIsBold as Boolean (Get/ Set)
* FontIsItalic as Boolean (Get/ Set)
* FontIsStrikeout as Boolean (Get/ Set)
* FontIsSuperscript as Boolean (Get/ Set)
* FontIsSubscript as Boolean (Get/ Set)
* FontUnderline  as String (Get/ Set): Single, Double, Accounting, DoubleAccounting
* FontName as String (Get/ Set)
* FontSize as Int (Get/ Set)
* HorizontalAlignment as String (Get/ Set): Bottom, Center, Distributed, Fill, General, Justify, Left, Right and Top
* IsLocked as Boolean (Get/ Set)
* IsTextWrapped as Boolean (Get/ Set)
* Name as String (Get/ Set)
* Number as Int (Get/ Set)
* ShrinkToFit as Boolean (Get/ Set)
* TextDirection as String (Get/ Set): Context, LeftToRight and RightToLeft
* VerticalAlignment as String (Get/ Set): Bottom, Center, Distributed, Fill, General, Justify, Left, Right and Top

{% hint style="warning" %}
The return value is not serializable (causes input request errors)!
{% endhint %}

#### Syntax

```yaml
CellsStyle CellsStyle()
```

#### Parameters

*This action does not have any parameter*

#### Return Type

CellsStyle

## CellsBorder

Creates a new border. The border has the following fields (accessible through GetValue/ SetValue):

* Color as String (Get/ Set): HTML color (e.g. #FFFFFF)
* LineStyle as String (Get/ Set): Thin, Medium, Dashed, Dotted, Thick, Double, Hair, MediumDashed, DashDot, MediumDashDot, DashDotDot, MediumDashDotDot and SlantedDashDot

{% hint style="warning" %}
The return value is not serializable (causes input request errors)!
{% endhint %}

#### Syntax

```yaml
CellsBorder CellsBorder()
```

#### Parameters

*This action does not have any parameter*

#### Return Type

CellsBorder

## ReadColumn

Reads data from a column.

#### Syntax

```yaml
List<Any> ReadColumn(
    CellsWorksheet Worksheet,
    Int ColumnIndex,
    Int [RowIndex],
    Int [RowCount]
)
```

#### Parameters

***Worksheet***\
The worksheet with the column to read from.\
Type: CellsWorksheet

***ColumnIndex***\
The column index to read from.\
Type: Int

***RowIndex** (optional)*\
The starting row index (default 0).\
Type: Int

***RowCount** (optional)*\
The amount of rows to read from (default all upon an empty row).\
Type: Int

#### Return Type

List\<Any>

## ReadWorksheet

Reads data from a worksheet. The first row must contain the data field names.

#### Syntax

```yaml
List<Dictionary<String,Any>> ReadWorksheet(
    CellsWorksheet Worksheet,
    Int [RowIndex],
    Int [ColumnIndex],
    Int [RowCount],
    Int [ColumnCount]
)
```

#### Parameters

***Worksheet***\
The worksheet to read from.\
Type: CellsWorksheet

***RowIndex** (optional)*\
The starting row index (default 0). The first row must contain the field names.\
Type: Int

***ColumnIndex** (optional)*\
The starting column index (default 0).\
Type: Int

***RowCount** (optional)*\
The amount of rows to read from (default all upon an empty row).\
Type: Int

***ColumnCount** (optional)*\
The amount of columns to read from (default all upon an empty column).\
Type: Int

#### Return Type

List\<Dictionary\<String,Any>>

## ReadRow

Reads data from a row.

#### Syntax

```yaml
List<Any> ReadRow(
    CellsWorksheet Worksheet,
    Int RowIndex,
    Int [ColumnIndex],
    Int [ColumnCount]
)
```

#### Parameters

***Worksheet***\
The worksheet with the row to read from.\
Type: CellsWorksheet

***RowIndex***\
The row index to read from.\
Type: Int

***ColumnIndex** (optional)*\
The starting column index (default 0).\
Type: Int

***ColumnCount** (optional)*\
The amount of columns to read from (default all upon an empty column).\
Type: Int

#### Return Type

List\<Any>

## GetCellByIndex

Gets a cell by row and column index. The cell has the following fields (accessible through GetValue/SetValue):

* Column as CellsColumn (Get)
* Formula as String (Get/ Set)
* HtmlString as String (Get/ Set)
* IsErrorValue as Boolean (Get)
* IsFormula as Boolean (Get)
* IsMerged as Boolean (Get)
* Name as String (Get)
* Row as CellsRow (Get)
* Style as CellsStyle (Get/ Set)
* Value as Any (Get/ Set)

{% hint style="warning" %}
The return value is not serializable (causes input request errors)!
{% endhint %}

#### Syntax

```yaml
CellsCell GetCellByIndex(
    CellsWorksheet Worksheet,
    Int RowIndex,
    Int ColumnIndex
)
```

#### Parameters

***Worksheet***\
The worksheet to get the cell from.\
Type: CellsWorksheet

**RowIndex**\
The index of the row.\
Type: Int

***ColumnIndex***\
The index of the column.\
Type: Int

#### Return Type

CellsCell

## GetCellByName

Gets a cell by name (e.g. A1 or Z5). The cell has the following fields (accessible through GetValue/SetValue):

* Column as CellsColumn (Get)
* Formula as String (Get/ Set)
* HtmlString as String (Get/ Set)
* IsErrorValue as Boolean (Get)
* IsFormula as Boolean (Get)
* IsMerged as Boolean (Get)
* Name as String (Get)
* Row as CellsRow (Get)
* Style as CellsStyle (Get/ Set)
* Value as Any (Get/ Set)

{% hint style="warning" %}
The return value is not serializable (causes input request errors)!
{% endhint %}

#### Syntax

```yaml
CellsCell GetCellByName(
    CellsWorksheet Worksheet,
    String Name
)
```

#### Parameters

***Worksheet***\
The worksheet to get the cell from.\
Type: CellsWorksheet

***Name***\
The name of the cell (e.g. A1 or Z5).\
Type: String

#### Return Type

CellsCell

## MergeCells

Merges cells identified by range.

#### Syntax

```yaml
Void MergeCells(
    CellsWorksheet Worksheet,
    Int RowIndex,
    Int ColumnIndex,
    Int RowCount,
    Int ColumnCount
)
```

#### Parameters

***Worksheet***\
The worksheet where to merge the cells.\
Type: CellsWorksheet

***RowIndex***\
The index of the starting row.\
Type: Int

***ColumnIndex***\
The index of the starting column.\
Type: Int

***RowCount***\
The amount of rows to merge.\
Type: Int

***ColumnCount***\
The amount of columns to merge.\
Type: Int

#### Return Type

Void

## UnmergeCells

Unmerges cells identified by range.

#### Syntax

```yaml
Void UnmergeCells(
    CellsWorksheet Worksheet,
    Int RowIndex,
    Int ColumnIndex,
    Int RowCount,
    Int ColumnCount
)
```

**Parameters**

***Worksheet***\
The worksheet where to unmerge the cells.\
Type: CellsWorksheet

***RowIndex***\
The index of the starting row.\
Type: Int

***ColumnIndex***\
The index of the starting column.\
Type: Int

***RowCount***\
The amount of rows to unmerge.\
Type: Int

***ColumnCount***\
The amount of columns to unmerge.\
Type Int

**Return Type**

Void


# Xml

## DictionaryToXml

Creates a XML from Dictionary entries and return the result Xml as string. Structure of the XML is '\<root><>\</>... \</root>'. The is the Entry Key and the Entry Value.

#### Syntax <a href="#pragma-line-6868" id="pragma-line-6868"></a>

```
DictionaryToXml ( Dictionary )
```

#### Parameters <a href="#pragma-line-6874" id="pragma-line-6874"></a>

***Dictionary***\
&#x20;The Dictionary used to generate the Xml.\
&#x20;Type: Dictionary\<Any,Any>

#### Return Type <a href="#pragma-line-6881" id="pragma-line-6881"></a>

String

## InstanceToXml

Creates a XML from an instance and return the result Xml as string. Structure of the XML is '\<root><>\</>... \</root>'. The is the Entry Key and the Entry Value.

#### Syntax <a href="#pragma-line-6890" id="pragma-line-6890"></a>

```
InstanceToXml ( Object )
```

#### Parameters <a href="#pragma-line-6896" id="pragma-line-6896"></a>

***Object***\
&#x20;The Object instance used to generate the Xml.\
&#x20;Type: Object

#### Return Type <a href="#pragma-line-6903" id="pragma-line-6903"></a>

String

## XmlEscape

Escape an input string value to be usable for XML (e.g. `<` to `&lt;`).

#### Syntax

```
String XmlEscape(String Value)
```

#### Parameters

***Value***\
The input string value to escape.\
Type String

#### Return Type

String

## XmlSelectNode

Selects a node via XPath and returns it as a String

#### Syntax

```
XmlSelectNodes ( Xml, XPath )
```

#### Parameters

**Xml**\
&#x20;The XML document as a String.\
&#x20;Type: String

**XPath**\
&#x20;The XPath expression to use.\
&#x20;Type: String

#### Return type

String

## XmlSelectNodes

Selects a list of nodes via XPath and returns them as a list of String.

#### Syntax <a href="#pragma-line-6912" id="pragma-line-6912"></a>

```
XmlSelectNodes ( Xml , XPath )
```

#### Parameters <a href="#pragma-line-6918" id="pragma-line-6918"></a>

**Xml**\
&#x20;The XML document as a String.\
&#x20;Type: String

**XPath**\
&#x20;The XPath expression to use.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6929" id="pragma-line-6929"></a>

List\<String>

## XmlSelectNodeValue

Selects a value via XPath and returns as a String.

#### Syntax <a href="#pragma-line-6938" id="pragma-line-6938"></a>

```
XmlSelectNodeValue ( Xml , XPath )
```

#### Parameters <a href="#pragma-line-6944" id="pragma-line-6944"></a>

***Xml***\
&#x20;The XML document as a String.\
&#x20;Type: String

***XPath***\
&#x20;The XPath expression to use.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6955" id="pragma-line-6955"></a>

String

## XmlSelectNodeValues

Selects a list via XPath and returns them as a list of Strings

#### Syntax <a href="#pragma-line-6964" id="pragma-line-6964"></a>

```
XmlSelectNodeValues ( Xml , XPath )
```

#### Parameters <a href="#pragma-line-6970" id="pragma-line-6970"></a>

***Xml***\
&#x20;The XML document as a String.\
&#x20;Type: String

***XPath***\
&#x20;The XPath expression to use.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-6981" id="pragma-line-6981"></a>

List\<String>

## XmlSetNodeValue

Sets the Value of a node identified via XPath and returns the change XML as a String.

#### Syntax <a href="#pragma-line-6990" id="pragma-line-6990"></a>

```
XmlSetNodeValue ( Xml , Path , Value )
```

#### Parameters <a href="#pragma-line-6996" id="pragma-line-6996"></a>

***Xml***\
&#x20;The XML document as a String.\
&#x20;Type: String

***Path***\
&#x20;The XPath expression to use.\
&#x20;Type: String

***Value***\
&#x20;The Value to set.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-7011" id="pragma-line-7011"></a>

String

## XmlToDictionary

Creates a Dictionary from the given XML. Expected pattern of the XML is '\<root><>\</>... \</root>'. The is the Entry Key and the Entry Value of the Dictionary result.

#### Syntax <a href="#pragma-line-7020" id="pragma-line-7020"></a>

```
XmlToDictionary ( Xml )
```

#### Parameters <a href="#pragma-line-7026" id="pragma-line-7026"></a>

***Xml***\
&#x20;The Xml used to generate the Dictionary.\
&#x20;Type: String

#### Return Type <a href="#pragma-line-7033" id="pragma-line-7033"></a>

Dictionary\<Any, Any>


# Admin

The following actions on this page are only available in the Admin Center (SAML scripts).

## ActivateUser

Activates an user and sends them an activation mail. Throws an error if the user could not be found. Does nothing if the user is already activated.

#### Syntax

```
ActivateUser( UserId )
```

#### Parameters

**UserId**\
The ID of the user to activate.\
Type: Guid

#### Return type

Void

## AddUserToGroup

Takes a GroupId and a UserId as input and adds a user to a group.

#### Syntax

```
Void AddUserToGroup(
    Guid GroupId,
    Guid UserId
)
```

#### Parameters

**GroupId**\
The ID of the group the user should get associated with.\
Type: Guid

**UserId**\
The ID which identifies the user.\
Type: Guid

#### **Return Type**

Void

## AddUserToOffice

Takes an OfficeId and a UserId as input and adds a user to an office.

#### Syntax

```
Void AddUserToOffice(
    Guid OfficeId,
    Guid UserId
)
```

#### Parameters

**OfficeId**\
The ID of the office the user should get added to.\
Type: Guid

**UserId**\
This ID which identifies the user.\
Type: Guid

#### Return Type

Void

## CreateUser

Creates and returns an user with the given information. Throws an error if an user with the same login name already exists.

#### Syntax

```
CreateUser ( OfficeId, LoginName, FirstName, LastName, NickName, Language )
```

#### Parameters

**OfficeId**\
The ID of the office to create the user for (the executing user must have access to it).\
Type: Guid

**LoginName**\
The e-mail address of the new user (must be unique).\
Type: String

**FirstName**\
The first name of the new user.\
Type: String

**LastName**\
The last name of the new user.\
Type: String

**NickName**\
The nick name or abbreviation of the new user.\
Type: String

**Language**\
The language of the new user.\
Type: Language

#### Return type

Object

## DeleteUserFromGroup

Takes a GroupId and a UserId as input and deletes a user from a group.

#### Syntax

```
Void DeleteUserFromGroup(
    Guid GroupId,
    Guid UserId
)
```

#### Parameters

**GroupId**\
The ID of the group the user should get deleted from.\
Type: Guid

**UserId**\
The ID which identifies the user.\
Type: Guid

#### Return Type

Void

## DeleteUserFromOffice

Takes an OfficeId and a UserId as input and deletes a user from an office.

#### Syntax

```
Void DeleteUserFromOffice(
    Guid OfficeId,
    Guid UserId
)
```

#### Parameters

**OfficeId**\
The ID of the office the user should get deleted from.\
Type: Guid

**UserId**\
This ID which identifies the user.\
Type: Guid

#### Return Type

Void

## **CreateUser**

Creates and returns an user with the given information. Throws an error if an user with the same login name already exists.

#### Syntax

```
CreateUser(
    Guid OfficeId,
    String LoginName,
    String FirstName,
    String LastName,
    String NickName,
    String Language
)
```

**Level**

PlatformAdministrator

#### Parameters

***OfficeId***\
The ID of the office to create the user for (the executing user must have access to it).\
Type: Guid

***LoginName***\
The mail address of the new user (must be unique).\
Type: String&#x20;

***FirstName***\
The first name of the new user.\
Type: String&#x20;

***LastName***\
The last name of the new user.\
Type: String&#x20;

***NickName***\
The nick name or abbreviation of the new user.\
Type: String&#x20;

***Language***\
The language of the new user. <br>

**Behavior:**&#x20;

Creates an user like the 'Admin Center' creates user: not activated or confirmed.&#x20;

User can only created for the specified office, however, user must be unique throughout the platform.

#### Return Type

Object

## ActivateUser

Activates an user and sends them an activation mail. Throws an error if the user could not be found. Does nothing if the user is already activated.

#### Syntax

```
CreateUser(
    Guid UserId,
)
```

**Level**

PlatformAdministrator

#### Parameters

***UserId***\
The ID of the user to activate.\
Type: Guid

**Behavior:**&#x20;

Activates an user like the 'Admin Center' activates user: sending the activation mail to change password and confirming the user.&#x20;

Only user to which the current executing user has access to can be activated.

#### Return Type

None


# Integrations

## ScanBusinessCardWithAbbyy

Takes a picture from a business card, analyzes the content and displays the scanned information as a Dictionary. Hint: The "VCardService" class from the ABBYY adapter must be added to the app, otherwise this Script Action cannot be used. Structure of the Dictionary:Dictionary\<string,obj> { 'Firstname': String 'Name': String 'OrganisationName': String 'OrganisationDepartment': String 'Profession': String 'Surname': String 'Title': String 'BusinessCardEmails': List \[ Dictionary\<string,obj> { 'Email': String 'Name': String 'Type': String }] 'BusinessCardPhoneNumbers': List \[ Dictionary\<string,obj> { 'Phone': String 'Name': String 'Type': String }] 'BusinessCardAddresses': List \[ Dictionary\<string,obj> { 'Name': String 'Type': String 'City': String 'Country': String 'PostCode': String 'Region': String 'Street': String }]

#### Syntax <a href="#pragma-line-7044" id="pragma-line-7044"></a>

```
ScanBusinessCardWithAbbyy ( Document )
```

#### Parameters <a href="#pragma-line-7050" id="pragma-line-7050"></a>

***Document***\
&#x20;The Document with the business card image.\
&#x20;Type: Document

#### Return Type <a href="#pragma-line-7057" id="pragma-line-7057"></a>

Dictionary\<Any,Any>


# Expressions


# Expressions in Expressions

Complete reference of built-in expressions in the Expressions of the TIVITY platform.

### {DateTime.Now}

Returns the current date and time.

#### Syntax

```
{DateTime.Now}
```

### {DateTime.Now\.Date}

Returns the current date.

#### Syntax

```
{DateTime.Now.Date}
```

### {DateTime.Now\.Add(\<Parameters>)}

Returns the time calculated based on the current time (the span to be added is passed as a parameter(s)). You can add either years or days or hours or minutes. If the value is negative the resulting time will be in the past.

#### Syntax

```
{DateTime.Now.Add(YEARS, 1)}
{DateTime.Now.Add(DAYS, -7)}
{DateTime.Now.Add(HOURS, 12)}
```

#### Parameters

* YEARS,\<years> or
* DAYS,\<days> or
* HOURS,\<hours> or
* MINUTES,\<minutes>

### {NewGuid()}

Returns a new generated value of the universally unique identifier.

#### Syntax

```
{NewGuid()}
```

### {CurrentUser.\<Property>}

Returns the specified property of the current user.&#x20;

The value of a DefaultTemplate, an Expression or a Condition Value can be a mix of a text and one or more expressions enclosed in the curly brackets. The resulting value is concatenated after evaluation of the expressions. For example if the expression for the virtual field FullName is "{FirstName} {LastName}", the FirstName="John" and the LastName="Brown", the value of the field FullName is "John Brown".

#### Syntax

```
{CurrentUser.Id}
{CurrentUser.FirstName}
{CurrentUser.Nickname}
```

#### Properties

Possible properties:

* Id
* LanguageId
* LoginName
* FirstName
* LastName
* Nickname

### {CurrentUser.Groups}

Returns all group IDs separated by ',' of the current user and office. If no office is provided, no group IDs are returned.

#### Syntax

```
{CurrentUser.Groups}
```

### {CurrentUser.Roles}

Returns all role IDs separated by ',' of the current user, office and app. If no app is provided, all role IDs of all apps of the office for the current user are returned. If no office and app is provided, no role IDs are returned.

#### Syntax

```
 {CurrentUser.Roles}
```

### {CurrentOffice.Id}

Returns the id of the current workspace.

#### Syntax

```
{CurrentOffice.Id}
```

### {CurrentApplication.Id}

Returns the id of the current application.

#### Syntax

```
{CurrentApplication.Id}
```

### {ParentObject.\<Property>}

Returns the specified field of the parent object (relevant if the object is created as a link of some other object - its parent).

#### Syntax

```
{ParentObject.<Property>}
```

### {LinkPath\["\<ClassName>"].\<FieldName>}

Returns the value of the specified field of the parent object with the specified class name (relevant for indirectly linked objects).

#### Syntax

```
{LinkPath["<ClassName>"].<FieldName>}
```

### {\<FieldName>}

Returns the value of the virtual field based on the value of another field.

#### Syntax

```
{<FieldName>}
```

### {Convert(\<Parameters>)}

Returns the value of the virtual field depending on the value of another field according some rules defined as parameters.&#x20;

FieldName - the name of the field the virtual field depends on (e.g. FieldA); Value1, Value2... - possible values of the the FieldA; Result1, Result2 - corresponding return values of the virtual field. For example the expression returns Result1 if the FieldA equals to Value1.

#### Syntax

```
{Convert(<Parameters>)}
```

#### Parameters

\<FieldName>,\<Value1>:\<Result1>\[,\<Value2>:\<Result2>]

### {IsCheckedOut()}

Returns "True" if the document of the current object is checked out, otherwise "False".

#### Syntax

```
{IsCheckedOut()}
```

### {CheckedOutBy()}

Returns the name of the user who has checked out the document of the current object.

#### Syntax

```
{CheckedOutBy()}
```

### {IsFinalized()}

Returns "True" if the document of the current object is finalized, otherwise "False".

#### Syntax

```
{IsFinalized()}
```


# Expressions in Condition Values

Complete reference of built-in expressions in the Conditions of the TIVITY platform.

### {DateTime.Now}

Returns the current date and time.

#### Syntax

```
{DateTime.Now}
```

### {DateTime.Now\.Date}

Returns the current date.

#### Syntax

```
{DateTime.Now.Date}
```

### {DateTime.Now\.Add(\<Parameters>)}

Returns the time calculated based on the current time (the span to be added is passed as a parameter(s)). You can add either years or quarters or months or weeks or days or hours or minutes or miliseconds or ticks. If the value is negative the resulting time will be in the past. The part to add is case insensitive and can be pluralized.

#### Syntax

```
{DateTime.Now.Add(YEARS, 1)}
{DateTime.Now.Add(QUARTER, 1)}
{DateTime.Now.Add(DAYS, -7)}
{DateTime.Now.Add(HOURS, 12)}
{DateTime.Now.Add(MINUTES, 60)}
{DateTime.Now.Add(SECONDS, 35)}
{DateTime.Now.Add(MILISECONDS, 50)}
{DateTime.Now.Add(TICKS, 2)}
```

#### Parameters

* YEARS,\<years> or
* QUARTERS, \<quarters> or
* MONTHS, \<months> or
* WEEKS, \<weeks> or
* DAYS,\<days> or
* HOURS,\<hours> or
* MINUTES,\<minutes>
* SECONDS, \<seconds>
* MILISECONDS, \<miliseconds>
* TICKS, \<ticks>

### {DateTime.Now\.Add(\<Parameters>).BeginOf(\<Parameters>)}

Returns the begin of the given part of the date and time (e.g. begin of the year 2021 would be '2021-01-01 00:00:00.000'). The part is case insensitive and can be pluralized.

#### Syntax

```
{DateTime.Now.Add(WEEK, -1).BeginOf(WEEK)}
{DateTime.Now.Add(YEAR, 1).BeginOf(MONTH)}
```

#### Parameters

* YEARS,\<years> or
* QUARTERS, \<quarters> or
* MONTHS, \<months> or
* WEEKS, \<weeks> or
* DAYS,\<days> or
* HOURS,\<hours> or
* MINUTES,\<minutes>
* SECONDS, \<seconds>

### {DateTime.Now\.Add(\<Parameters>).EndOf(\<Parameters>)}

Returns the end of the given part of the date and time (e.g. end of the year 2021 would be '2021-12-31 23:59:59.999'). It is possible to make expression with both parts 'BeginOf(\<Parameters>)' and 'EndOf(\<Parameters>)', e.g. 'DateTime.Now\.Add(\<Parameters>).BeginOf(\<Parameters>).EndOf(\<Parameters>)'.

#### Syntax

```
{DateTime.Now.Add(QUARTER, 2).EndOf(QUARTER)}
{DateTime.Now.Add(MONTH, 1).EndOf(MONTH)}
```

#### Parameters

* YEARS,\<years> or
* QUARTERS, \<quarters> or
* MONTHS, \<months> or
* WEEKS, \<weeks> or
* DAYS,\<days> or
* HOURS,\<hours> or
* MINUTES,\<minutes>
* SECONDS, \<seconds>

### {CurrentLogin(\<Parameters>)}

The value of the specified attribute received from the account information related to the source the user accessed to.

#### Syntax

```
{CurrentLogin(<Parameters>)}
```

#### Parameters

AttributeName

### {CurrentObject.\<FieldName>}

The value of the specified field of the current object (relevant for example for conditions defined for fields with a data source depending on some field of the current objects).

#### Syntax

```
{CurrentObject.<FieldName>}
```

### {ParentObject.\<FieldName>}

The value of the specified field of the parent object (relevant for example for conditions in selections with a context).

#### Syntax

```
{ParentObject.<FieldName>}
```

### {MainObject.\<FieldName>}

The value of the specified field of the main object (relevant for example for conditions in selections with a context).

#### Syntax

```
{MainObject.<FieldName>}
```

### {\<Type>Object.Attributes\["\<KeyName"]}

The value of the specified field by key name. Can also be the internal name. For vertical fields, the resolved value is output. Alternative to the expressions above (e.g. *ParentObject.\<FieldName>*)

#### Syntax

```
{CurrentObject.Attributes["<KeyName"]}
{ParentObject.Attributes["<KeyName"]}
{MainObject.Attributes["<KeyName"]}
```

### {\<Type>Object.GetValueByKey\["\<KeyName>"]}

The value of the specified field by key name. The key name of the field must be entered (not internal name). With virtual fields, the resolved value is not output, but always the original value. To get the resolved value, the name must be specified explicitly (e.g. *GetValueByKey\["Name\_\_RESOLVED"]*). Can be used for any objects.

#### Syntax

```
{CurrentObject.GetValueByKey["<KeyName>"]}
{ParentObject.GetValueByKey["<KeyName>"]}
{MainObject.GetValueByKey["<KeyName>"]}
```

### {Function.Name\[(\[Parameter1:"Value1"\[,Parameter2:"Value2"]])]\[:Format]}

Expression Function returns the result value of the executed function and is identified with the beginning text 'Function'.

Given a function expression has syntax errors, when the expression is evaluated, then an error message is shown (including the syntactically wrong expression). When a function with the given key or name is not found, then a null value is returned.

Given a function expression does not contain a format, when the expression is evaluated, then the function result value is returned as-is (not formatted in the user-specific language).

Given a function parameter is not specified as an expression parameter, when the expression is evaluated, then the parameter value is evaluated from the context. The following context variable providers are supported:

* CurrentObject.\<Field-Name>: Access to field values of the current object.
* ParentObject.\<Field-Name>: Access to field values of the parent object.
* MainObject.\<Field-Name>: Access to field values of the main object.
* CurrentUser.\<Field-Name>: Access to field values of the current user.

Function expressions are not supported in user-defined reports.

#### Syntax

```
{Function.Name[([Parameter1:"Value1"[,Parameter2:"Value2"]])][:Format]}
```


# Templates

This page covers advanced TIVITY template features: image handling, language settings, and custom functions for dynamic and powerful document generation.

### Overwriting templates with the Team app has been removed.

The Templates area within the Team app of a workspace has been removed. It is no longer possible to overwrite templates via the team app. If it is necessary to overwrite templates for an app, the app creators are now obliged to offer this function in their app themselves.

### Use images in templates

For templates that use an external document of type Word, it is possible to include images in the template.

To do this, a variable must be created in the template script which contains the image to be used. The image can then be retrieved in the Word template via a placeholder ({VariableName}).

The image formats BMP, GIF, JPEG, PNG and TIFF are supported. Other documents (like text documents) cannot be inserted and throw an error.

**Example configuration**

Script:

<figure><img src="/files/FOdN7ryhWEJ65rze9jsM" alt=""><figcaption><p>Script Configuration</p></figcaption></figure>

Word:

<figure><img src="/files/lysIo6nDXHu08Ikivthe" alt=""><figcaption><p>Word Template</p></figcaption></figure>

Result:

<figure><img src="/files/fF70K5DuaCt5g7FEkby5" alt=""><figcaption></figcaption></figure>

### **Limitation**

Even if the context instance contains an image, this cannot be included with the context placeholder (example {Context.Document}). In this case, a new variable would still have to be created in the script to which the document is transferred with the "GetDocument" script action.

### Resize images in templates

Templates for the external documents Words can provide additional resizing formatting. Supported image formats can be resized by width and height, preserving the aspect ratio (uniform) or not (fill) using a format

* Width and height: {Placeholder:**imageresize(\<Stretch>,\<Width-Value>\<Width-Unit>/\<Height-Value>\<Height-Unit>)**}
* Width-only: {Placeholder:**imageresize(\<Stretch>,\<Width-Value>\<Width-Unit>/)**}
* Height-only: {Placeholder:**imageresize(\<Stretch>,/\<Height-Value>\<Height-Unit>)**}

Stretch **uniform** preserves the aspect ratio when resizing the image. Width or height are resized to the given value while preserving the aspect ratio for the missing value. When both width and height are given, then the image is resized to fit the given dimension while preserving the aspect ratio.

Stretch **fill** does not preserve the aspect ratio when resizing the image. Width and/ or height are resized to the given value.

The following units are supported:

* pt: points as is
* cm: converted to points
* inch: converted to points

#### **Examples:**

* **imageresize(uniform,1cm/)** for an image of 2cm/4cm: resizes the image to 1cm width and 2cm height
* **imageresize(uniform,1cm/1cm)** for an image of 2cm/4cm: resizes the image to 0.5cm width and 1cm height
* **imageresize(fill,/1cm)** for an image of 2cm/4cm: resizes the image to 2cm width and 1cm height
* **imageresize(fill,1cm/1cm)** for an image of 2cm/4cm: resizes the image to 1cm width and 1cm height

Unsupported stretch, missing values, unsupported units or other malformed input throw an error.

### Execute template in a specific language

If a template is executed, the language of the executing user is used by default.

If placeholders with formatting are used. These are then formatted depending on the template language.

Example: DE: {Context.DueDate:dddd} --> Mittwoch EN: {Context.DueDate:dddd} --> Wednesday

**If the template is executed via a workflow using the script action "ExecuteTemplate2", the language with which the template is executed can be specified, regardless of the user settings.**

When no language is passed, then the format of the expression is executed with the language of the executing user.

When the script of a template is executed, then a variable with the passed or evaluated language is available through the name 'Context.TemplateLanguage'.

### Functions with parameters in templates

It is possible to execute functions within a template and pass parameters to the function.

**Syntax:**

```csharp
{Function.Name[([Parameter1:"Value1"[,Parameter2:"Value2"]])][:Format]}
```

**Example**:

```csharp
{Function.GetInitialState(ItemType:"Task",IncludeArchivedStates:"False")}
```

Given a function 'Name' has a parameter 'Parameter1' and 'Parameter2' and a template has the expression '{[Function.Name](http://Function.Name)(Parameter1:"Value1",Parameter2:"Value2")}', when the template is executed, then the function 'Name' is executed with "Value1" passed for 'Parameter1' and "Value2" passed for 'Parameter2'.

If only one parameter is passed, the value from the context is evaluated for the other parameter. If parameters are passed that are not present in the function, these are ignored and the missing parameters are evaluated with the values from the context.

Given a function 'Name' has a parameter 'Parameter1' and 'Parameter2' and a template has the expression '{[Function.Name](http://Function.Name)()}' or '{[Function.Name](http://Function.Name)}', when the template is executed, then the function 'Name' is executed with the value for 'Parameter1' and 'Parameter2' evaluated from the context.

> 💡 For more information on context evaluated values for parameters, see the following documentation: [Expressions in Condition Values - Docs (tivity.one)](https://docs.tivity.one/building-an-application/expressions/expressions-in-condition-values)

### **Syntax Error**

Given a template has an expression with a wrong syntax, when the template is executed, then an error message is shown (including the syntactically wrong expression).

### **Formatting**

Given a template has an expression with parameters and a format, when the template is executed, then the function is executed, parameters are passed and the return value is formatted.

Given a template has an expression without parameters and a format, when the template is executed, then the function is executed and the return value is formatted (current behavior).

**Data Types of Values:**

Given a parameter value is surrounded by double-quotes ('{[Function.Name](http://Function.Name)(Parameter1:"Value1"}'), when the expression is executed, then the value is passed as a string. Double-quotes '"' can be escaped with a backslash '\\'. Backslashes '\\' can be escaped with a backslash '\\'.

**Other data types (variables, integer, DateTime, etc.) are currently not supported**


# Tagging

Overview, usage and configuration of Tagging feature


# Getting Started

Overview of the Tagging feature

Tagging is a feature integrated in the TIVITY Platform for use in the apps. Tags let you group, categorize and find your app items more easily. You have the choice: create and use either your personal tags or together with your colleagues the team tags.&#x20;

In the following chapters you will learn all important steps how to create and use tags. We will also show you how platform and workspace administrators can define rules for usage of tags.&#x20;

We want you to use tags in the most effective way. After all, they are there to assist and simplify your undertaking. To do this, consider a few simple principles:

#### NAMING

Avoid making tags too generic or too specific. Generic tags run the risk of being used everywhere. Specific tags can be applied to too few elements. Pay attention to spelling. Consider creating guidelines for naming tags and keep them short.

#### GROUPING

If official grouping is available, such as grouping tasks by story, avoid using tags. Check if suitable team tag exists before creating a personal one.

#### CLEANING UP

Regularly check for obsolete or unnecessary tags and delete them.


# Manage Tags

Learn how to create and group tags

Tags are managed in the Tagging app, where user can create, configure and set rights for User and Teams Tags.

<figure><img src="/files/Yhfh55fVnAdJ7KV8hKRq" alt=""><figcaption><p>Tagging App</p></figcaption></figure>

The Tagging app opens to a landing page with a list overview of all tags, organized by their type.

<figure><img src="/files/ia2utcrqWaqQIM33ycvm" alt=""><figcaption><p>Tagging landing page</p></figcaption></figure>

{% hint style="info" %}
Column *usage* shows count in how many instances the particular tag is being used.
{% endhint %}

If you click the *Create tag*, a new page will open where you can specify the name, type, and color of the new tag. This page allows you to create a new tag and customize its appearance.

<figure><img src="/files/LANKpeF8iqbViHd5NeTC" alt=""><figcaption><p>Create new Tag page</p></figcaption></figure>

{% hint style="info" %}
While Team tags can be used by the whole team for collaborative working, personal tags are used to have better overview of certain topics, which have the capability to be grouped.
{% endhint %}

After tag is created, it can be changed by pressing the tag in the list overview of the landing page. The *Tag - Details* page, which you can access by clicking on a tag in the list on the landing page, provides several options for managing the tag. You can change the tag's colors, view its details, and see a list of the classes where the tag has been applied. This page also displays the number of times the tag has been used.

<figure><img src="/files/5FIQSJyiS7jgwO0iYzfI" alt=""><figcaption><p>Tag - Details page</p></figcaption></figure>

If you click on a class in the *Usage* panel's list, you will be able to see the instances where this tag has been applied. This can be useful for identifying where the tag is being used and understanding its grouping intention.

<figure><img src="/files/jGnaQ9jr3UBJVd6ssBo6" alt=""><figcaption><p>Instance of the class Notification</p></figcaption></figure>


# Settings

Set up Tagging feature for the most efficient usage


# Usage

Tag filter for the lists/boards and instance interface

The pages that follow will provide instructions on how to filter the list by tags and apply tags to specific instances.&#x20;


# Tag filter

Once configured in the Layout designer within the list context, tag filter enables user to show only list/board items which contain the chosen tag. This can be useful for organizing and highlighting certain items in your list or board.

<figure><img src="/files/QMsVnxibVqNJDd0I2cAg" alt=""><figcaption><p>Tag filter</p></figcaption></figure>

Selected tags are visible above the list.

In the case the tag filter is configured as an action in the Layout designer, the end user will have another representation of the tag filter feature:

<figure><img src="/files/evo3jEyHwRENyKOBqcTM" alt=""><figcaption><p>Tag filter as action</p></figcaption></figure>

As you can see in the above presentation, in this variant the filter tag icon ![](/files/wVozbFtOLpjqFwAmlWPp)is gray if not applied. If applied, tag filter icon glows![](/files/VaZ7A1HHiyJS9DevZA3n)and the end user knows it is applied.&#x20;

{% hint style="info" %}
In this variant of the tag filter, the selected tags are not displayed. This can be useful in situations where there is not enough space to show all selected tags, or for aesthetic reasons. This variant of the tag filter allows you to filter the list or board without cluttering the interface with the selected tags.
{% endhint %}


# Tag panel

How to use the tag panel

Implementing a tag panel within an object page allows the end user to manage tags directly in the instance where they want to apply the tag, rather than having to go to the Tagging app. This can be convenient for the user as it allows them to manage tags directly within the context of the instance they are working on. It also allows for quicker access to the tag management tools, as the user does not have to switch to a different app or page to apply or modify tags.

<figure><img src="/files/x11uVUCgNGASiYetyRsv" alt=""><figcaption><p>Tag panel</p></figcaption></figure>

The tag panel consists of several components:

1. A tag type menu for choosing the type of tag to be created
2. A filter, apply, and creation toolbar, where end user can find and apply existing tags or create new ones
3. A list of tags, showing which tags are already applied

<figure><img src="/files/LQFxa6PLTtoSgKJ7bAwO" alt=""><figcaption><p>Tag type menu</p></figcaption></figure>

By clicking on the tag type menu end user can choose between Team and User tag. The choice of tag type will depend on the needs and preferences of the user and the team. Chosen type is then applied for creation of new tags with tag panel toolbar (2).

<figure><img src="/files/0p4slu0cpGBN83avNIAf" alt=""><figcaption><p>Tag proposals &#x26; creation of new tag</p></figcaption></figure>

As soon as the end user starts typing the characters into the toolbar tag proposals of existing tags are listed in the drop down list. If none of the existing and to the particular end user visible tags can be applied to the instance, end user can create a new tag.

Creating new tag is a simple and quick one step process. By typing the name of the tag in the toolbar (2) and clicking on *Create new tag for \<tag name>* at the end of the proposal list new tag is created and automatically applied for the instance.

Tag panel offers additional tag quick access feature. By clicking on the tag within the tag list end user can access the Tag - Details page, which provides several options for managing the tag. Here the end user can change the tag's colors, view its details, and see a list of the classes where the tag has been applied. This page also displays the number of times the tag has been used. For more details about Tag - Details page please go to the page [*Manage tags*](/platform-features/tagging/manage-tags)*.*


# Document Management System (DMS)


# DMS Setup

Tivity DMS Setup command-line interface provides a tool to install or uninstall the TIVITY DMS which handles document related actions.

### Install

The install verb is used to install TIVITY DMS.

#### Options

* path: The absolute path of the instance to setup.
* dms-version (cached): The version of the installation.
* dms-logs-directory (cached): The absolute path of the logs. Default: \[path]\Logs.
* dms-db-host (cached): The SQL host of the SQL server to connect to.
* dms-db-port (cached): The SQL port of the SQL server to connect to.
* dms-db-database (cached): The SQL database to create or use.
* dms-db-username (cached): The SQL username to use to connect to the SQL server.
* dms-db-password: The SQL password to use to connect to the SQL server.
* dms-db-setupsame (cached): Use the same username and password during the setup \[true|false].
* dms-db-setupusername (cached): The SQL username to use to connect to the SQL server during the setup only.
* dms-db-setuppassword: The SQL password to use to connect to the SQL server during the setup only.
* dms-iis-site (cached): The IIS site to use.
* dms-iis-applicationpool (cached): The IIS application pool to use.
* dms-iis-application (cached): The IIS application of the site to create or use.
* dms-iis-applicationpath (cached): The absolute path of the IIS application. Default: \[path]\Web.
* dms-storage-directory (cached): The absolute path of the storage.
* dms-storage-tempdirectory (cached): The absolute path of the temp storage. Default: \[dms-storage-directory]\Temp.
* dms-storage-domain (cached): The Windows domain to use to access the storage.
* dms-storage-username (cached): The Windows username to use to access the storage.
* dms-storage-password: The Windows password to use to access the storage.
* dms-application-domain (cached): The DMS domain to use to connect to the REST-API.
* dms-application-username (cached): The DMS username to use to connect to the REST-API.
* dms-application-password: The DMS password to use to connect to the REST-API.
* dms-services-independent (cached): Run the services independent \[true|false].
* dms-services-storage-directory (cached): The relative path of the storage files. Default: \[dms-storage-directory]\Storage
* dms-services-indexing-path (cached): The absolute path of the indexing service. Default: \[path]\Indexing.
* dms-services-indexing-name (cached): The name of the indexing service (do not change). Default: DMS-Indexing-Service.
* dms-services-indexing-port (cached): The port of the indexing service (do not change). Default: 50515.
* dms-services-indexing-directory (cached): The relative directory of the indexing files. Default: Indexing.
* dms-services-thumbnail-path (cached): The absolute path of the thumbnail service. Default: \[path]\Thumbnails.
* dms-services-thumbnail-name (cached): The name of the thumbnail service (do not change). Default: DMS-Thumbnail-Service.
* dms-services-thumbnail-port (cached): The port of the thumbnail service (do not change). Default: 50525.
* dms-services-thumbnail-directory (cached): The relative directory of the thumbnail files. Default: Thumbnails.
* dms-services-preview-path (cached): The absolute path of the preview service. Default: \[path]\Previews.
* dms-services-preview-name (cached): The name of the preview service (do not change). Default: DMS-Preview-Service.
* dms-services-preview-port (cached): The port of the preview service (do not change). Default: 50505.
* dms-services-preview-directory (cached): The relative directory of the preview files. Default: Previews.
* dms-services-watcher-path (cached): The absolute path of the watcher service. Default: \[path]\Watcher.
* dms-services-watcher-name (cached): The name of the watcher service (do not change). Default: DMS-Watcher-Service.
* dms-services-watcher-port (cached): The port of the watcher service (do not change). Default: 50535.
* tika-path (cached): The absolute path of the Tika service. Default: \[path]\Tika.
* tika-name (cached): The name of the Tika service (do not change). Default: DMS-Tika-Service.
* tika-port (cached): The port of the Tika service (do not change). Default: 50545.

### Uninstall

The uninstall verb is used to uninstall the TIVITY DMS.

#### Options

See install options.

#### Version

The version verb will output the version of the setup (no options are supported).


# Enterprise Search


# Enterprise Search Introduction

TIVITY's Enterprise Search is a powerful, centralized search solution that enables users to find information across multiple applications and data sources within their organization.

Enterprise Search revolutionizes information retrieval across your organization. This guide offers comprehensive instructions for administrators, app creators, and end-users to harness its advanced capabilities, including unified search, semantic query expansion, and customizable personas.

1. [#search](#search "mention")
2. [#general](#general "mention")
3. [#users](#users "mention")
4. [#workspace-administrator](#workspace-administrator "mention")
5. [#app-creator](#app-creator "mention")
6. [#platform-administrator](#platform-administrator "mention")

## Search

In addition to the default Global Search, the TIVITY platform provides an optional advanced Search feature. This feature is accessible via the `Explore` App. The default installation will have it enabled, providing a powerful tool for finding specific information within the platform.

## General

Unlike the default Global Search, the Explore App doesn't use Adapters to perform search operations. Instead, it creates and maintains a dedicated search index. This approach enables advanced features such as:

* Filtering
* Facets
* Customized search ranking
* Search personas

## Users

The advanced search feature is accessible through the App **Explore** which can be found within the list of installed applications within the workspace.

If the App is not available, your Workspace is not allowed to use it. Please contact the Platform Administrator in this case.

### First Time Setup

When the Explore App is opened for the first time within a Workspace, a prompt to initialize it will appear. This prompt will only show up once and only as long as it hasn't been completed yet. If you are an Administrator within the Workspace, you can complete the setup by executing the *Initialize Now* action. If you are not a Workspace Administrator, please contact one of your Administrators to do that. For more information on this process, refer to the Workspace Administrator section.]

Remarks: If your Workspace does not contain any App which supports the Search feature, you will not be able to set up the Workspace. If this is the case, either install an App which supports the Search or ask your App manufacturers to support the feature.

### General Usage

The Explore App allows you to search within all supported Apps within a Workspace. You can enter free text into the search box to search for your specified search terms and/or open the filter menu to drill down until you get to the item you are looking for.

<figure><img src="/files/SBdaHjq3nj7k19uTP957" alt=""><figcaption><p>Explore App - Dashboard</p></figcaption></figure>

### Search Syntax

#### Normal Search

You can enter multiple words within the search box. For an item to be included within the search result, the item must contain all terms you've entered.

Searching for

```
abc jkl
```

will only contain items which matches the terms `abc` and `jkl`. To match a term, an item must have a word which

* Exactly matches. For `abc`, this means that `test abc def` would match.
* Start with the given term. For `abc`, this means that `test abcd def` would match, but `test abdc def` would not.
* End with the given term. For `abc`, this means that `test zabc def` would match, but `test zabck def` would not.

All terms are case-insensitive.

Each term has a little bit of fault tolerance built in. If you make a typo in your search phrase and enter `Affacted`, items which contain the correctly spelled word `Affected` will be included. This includes both directions. If the word within an item is misspelt, it would still match a correctly spelt search phrase. For performance reasons, the fault tolerance is not infinite. The first two characters must match and the rest of the characters can be a little bit off. It supports substation, insertion and removal of single characters.

Each term will also bring additional terms with it. These synonyms are picked automatically. For example, `symbol` will also search for `figure`. These synonym matches are ranked lower compared to the originally entered term.

#### Exact Matches

To search for an exact match, you can surround single or multiple search terms within quotes. An exact match means that a word must exactly match with the entered term. If an exact match contains multiple terms, the order of the terms and the exact spelling of the terms must match. Additionally, these terms must be close to each other, there can only be one word between them.

* `process` will match `processing` or `preprocess`.
* `"process step"` will not match `processing step` or `step process` or `process to be executed in one step`, but it will match `process a step`

When using exact searches, the term will not try to correct spelling mistakes. Additionally, no synonyms will be added.

Like normal searches, exact searches are case-insensitive.

#### Excluding

You can specify one or more terms to exclude items to get into the search result when they include one of those excluded words. To exclude a term, prepend an `-` in front of it. If the `-` is directly between two terms without any white space, it is not detected as an exclude filter.

* `abc -def` will match `test abc jkl` but will not match `test abc def`
* `abc-def` will match `test abc jkl` and `test abc def`

You can add the exclude filter to normal terms or to exact matches.

* `-abc` will exclude `abc`, `abcd` and `zabc`
* `"abc"` will exclude `abc` but not `abcd`
* `"abc def"` will exclude `abc def` but not `abc`

#### Semantic Search

Additionally to the **Normal Search**, the Explore App offers a **Semantic Search** mode. This mode will not only search for items which matches your search phrase, but also items which might be relevant for the matching items.

<figure><img src="/files/0RS5npk2SvhrLDE7e0Uh" alt=""><figcaption><p>Search Options</p></figcaption></figure>

As an example, imagine you have a set of tasks which contain a category and a title. If you enter the category name as your search phrase, all tasks with that category will get returned. If you switch to the *Semantic Search* mode, not only these tasks will be returned but for example also E-Mails which contain the title of the task.

This interconnection is generated automatically based on word combination statistics. The best way to think about it: you do not specify the terms in your search phrase which must match, you provide key words describing a context with your search words and you will find the items which belong to this context.

To work properly, your total number of searchable items needs to have a sufficient size.

The previous methods described the basic syntax of a search phrase. The syntax is valid for both, the normal search and the semantic search.

### Filters and Facets

Additionally to the search phrase, you can drill down into your search result by adding filters or by using facets. To do that, open the filter pane. This can be done by clicking on the filter icon on the left-hand side.

<figure><img src="/files/t2z0oXOPI9LWAi2P9q3o" alt=""><figcaption><p>Explore app - Filters and Facets</p></figcaption></figure>

#### Facets

With the filter pane, you will get a list of all available facets.

<figure><img src="/files/jjgHYPHnEM2lQrT6UxdD" alt=""><figcaption><p>List of available facets</p></figcaption></figure>

By clicking on the checkbox within a facet, the result will be reduced to include items which match the selected facet. If you select multiple values from a single facet, only items which match one of the selected facet items will be within the search result. If you select items from multiple facets, only items which have a match on all facets will be within the search result.

All facets which are currently active will appear on top of the search result as well.

<figure><img src="/files/7JxvDpr3RWSRzfprjqRA" alt=""><figcaption><p>Active Facets View</p></figcaption></figure>

By clicking on an item, you can modify the selection of facet items.

By clicking on the cross on the right hand side of each item, you can remove that facet from the list of active filters.

By clicking on the **Add Filter** button, you will get prompted to select the facet you want to filter by first. After selecting the facet, a popup will appear in which you can select all facet items for that facet. Closing the popup will apply the filter to the search result.

#### Custom Filter

At the top of the filter pane, you can add a custom filter. To do that, click on the **Add custom filter** button. A dropdown will appear below it. In that dropdown, you can select the field for which you want to filter by.

Remarks: The list will only contain fields of all items of the current search result.

After selecting the field, press the **Add** button to add the filter. Depending on the data type of that field, different filter input forms will appear.

#### Numeric filter

For numerical fields, two input bars will appear.

<figure><img src="/files/aNxPxnGKJCYZkOkscpL9" alt=""><figcaption><p>Numerical fields - Minimum and Maximum value</p></figcaption></figure>

Within the left one, you can specify the minimum value (inclusive) for that field for an item to be included within the search result.

Within the right one, you can specify the maximum value (inclusive) for that field for an item to be included within the search result.

If you enter a value in both fields, the value must be within the range of both of your specified numbers.

#### Date Time Filter

For the Date Time fields, a date range input will appear. The default value will be the date range for the last seven days.

<figure><img src="/files/IjoU0CFUT86IXxaCHQc5" alt=""><figcaption><p>Date range input</p></figcaption></figure>

You can customize the range by clicking on the input bar. From the dropdown, you can select from one of the predefined templates or you can specify a custom range. For that, first click on the day in the left calendar first to specify the oldest date. After that, click on a day in in the right calendar to specify the newest date. The filter will get applied after pressing **Apply**

### Sorting

The sorting of the search results can be changed. The default sorting is **Relevance**. If **Relevance** is selected and no search phrase is entered, the sorting will be **Recent + Relevance**

By clicking on the **Sort by** name, a dropdown will appear where you can select the field to sort by.

* **Relevance** sorting will sort the result purely on the relevance calculated based on the match of the search phrase and the matched items.
* **Time + Relevance** sorting will sort the result on the relevance calculated based on the match of the search phrase and the matched items. Additionally, it will move items which where created or modified recently more to the top. Items which were created or edited more recently will be further up within the search result.

### Customization

The Explore App can be customized to better adjust for individual needs. To open the configuration, click on the cog icon in the header of the main Explore App page.

<figure><img src="/files/7tinyP3stpMIYGPQJfTT" alt=""><figcaption><p>Customization location - Cog Wheel</p></figcaption></figure>

#### Sources

The **Sources** tab allows to add pre-configured user sources to the search index. When opening the tab, a list of possible user sources will be displayed. The list of user sources depend on the Apps installed within the workspace and if the Apps are providing user sources. If no user sources are visible, no currently installed application provides any user source.

<figure><img src="/files/sssB2fQnNHEFFToaTce2" alt=""><figcaption><p>List of Sources</p></figcaption></figure>

By clicking on a **User Source**, you can add it to your personal search index. To do that, click on the **Add this source** action.

<figure><img src="/files/TPGnod9x35QPtany2urp" alt=""><figcaption><p>Application Email - Adding a source</p></figcaption></figure>

Important: make sure you've authenticated yourself for the source if necessary. You can do that in the Team App.

After you've added a user source, it will get indexed in the background after a while. Depending on the source itself, it can take a few minutes until you will see search results from that source. The source will be added for all searches automatically if the type is not excluded by your selected persona.

Important: by adding a **User Source**, the content of that source will be persisted on the TIVITY server for indexing. Only you can search in this source. If you do not want to use one of your **User Sources** anymore, you can remove it on the same screen. Removing a user source will delete all persisted data from that source from the TIVITY server.

#### Personas

Personas allow you to customize the priority order of each type in the search result. Each user will get the first matching persona as its default one. As soon as one user can select between multiple personas, he can switch between them either by selecting one on the start screen with the **Search As** selection

<figure><img src="/files/dJOL2INVXbHImD4FSKef" alt=""><figcaption><p>Persona-based search interface</p></figcaption></figure>

or by opening the now-visible **Persona Pane** on the left-hand side.

<figure><img src="/files/TzH6l7dz6KRVUcKuDYIg" alt=""><figcaption><p>Persona panel</p></figcaption></figure>

Hint: You can switch between Personas even if you already entered a search phrase or added a filter. The search result will update as soon as a different persona gets selected.

The persona selection does not persisted.

To create a Persona, click on the **+** sign in the Persona tab. A new Persona will be created.

#### Groups

Not all Personas are relevant for all users within a single workspace. For that, Personas can be filtered by Groups. Select the Groups, a user must be a member in, in the **Common** tab. A user can only select a Persona if his or her group memberships matches one of the selected groups for this persona.

<figure><img src="/files/7557MW2a3prxvYXieLz7" alt=""><figcaption><p>Group selection</p></figcaption></figure>

Remarks: if a user can not use any persona, the Explore App will fall back to the default values for this user.

Remarks: the first matching Persona will be the default selected persona for each user. So applying an order for the Personas is important. You can change the order of the Personas by dragging the items up or down with your mouse.

<figure><img src="/files/QQkYt3i5C3b194CUp9Qr" alt=""><figcaption><p>Order of personas</p></figcaption></figure>

#### Excluded Types

By default, all types which are prepared to use the Explore App will be searchable. In some cases, this might be too much for certain Personas. In the **Excluded Types** tab, you can exclude certain types from the search result entirely.

This is not the recommended way, especially for Personas sorted more on the top. The user will not get any information about excluded types. If he searches for something but doesn't find it, it might be confusing for this user first. Try to adjust the **Relevance** instead in the next tab. This allows you to move all items of one or more types up or down in the search result without excluding them entirely.

#### Relevance

In this tab, you can change the priority of types within the search result. The priority is a numeric factor. All values are relative to each other. If you set the priority of a value to `2`, it will be more on the top compared to types having a lower value. These relevance settings are not absolute. The match relevance of a search phrase with each item is still calculated and will influence the order in the search result. It is not guaranteed that items with a higher value will be always in front of items with a lower value.

The value supports fractional inputs. You can boost an item by a factor of `1.5` if you want.

It is recommended to do small steps, like incrementing the value by `1` or decrementing it by `0.2` and then test the result with various search phrases.

<figure><img src="/files/CI1Amvo9kJnIXKJkiyMB" alt=""><figcaption><p>Relevance priority</p></figcaption></figure>

#### Custom Facets

Custom facets allow you to create a set of pre-defined filters which will be displayed above the build-in facets in the filter pane.

To create a facet, click on the **+** sign above the facet list. A popup will appear where you must select the field you want to create a facet for. For that, you first select the type of the field and you will get a list of field names which have this type.

Hint: if you hover over a type, a hint will appear which will display all types which have this field.

After creating the facet, you have to define the facet items. You can create these from scratch or start with one of the templates.

<figure><img src="/files/m48yBxjbK8LV9rZEzJFK" alt=""><figcaption><p>Custom Facets - Configuration</p></figcaption></figure>

Hint: you can modify all items from each added template, add new ones or even delete them. You can even combine multiple templates. Even if no template is a perfect fit for your data, it might help you getting started.

You can always preview the result with your data by clicking on the **Refresh Icon** in the *Live Preview* box.

Numerical values work exactly like adding a filter in the Explore App. Date and DateTime values can be entered in absolute or by using the built-in expression. When the field supports Date Expressions, an inline help will be visible. It describes the syntax and has a test field where you can enter an expression and see the result immediately.

<figure><img src="/files/RF0P9P1IrFk7FYgG7W94" alt=""><figcaption><p>Numeric Values</p></figcaption></figure>

After saving your custom facets, you need to refresh the **Explore App** main window to load them.

## Workspace Administrator

Workspace Administrators play a crucial role in managing and customizing the search experience for their specific workspace. Their primary responsibilities include:]

1. Initializing the Explore App for their workspace
2. Managing workspace-specific search settings
3. Customizing search experiences for users within their workspace

**Initialize a Workspace**

After the Platform Administrator has enabled the Explore App for a workspace, the Workspace Administrator needs to perform a one-time initialization:

1. Navigate to the Workspaces tab in the Search Administration section.
2. Locate the workspace requiring initialization in the list of pending initializations.
3. Click on the workspace to display the initialization form.
4. Review the initialization information.
5. Click on the Initialize Now action to complete the setup.

<figure><img src="/files/UKH6cilwrf09BKN63liR" alt=""><figcaption><p>Initialization Status</p></figcaption></figure>

After the initialization is done, the workspace details will display two additional tabs, Index Statistics and Timing Statistics.

Note: The initialization will not be available if the workspace does not contain any App having a Search Configuration.

The initialization will not be available if the workspace does not contain any App having a Search Configuration.

After the Platform Administrator has enabled the Explore App for a workspace, the Workspace Administrator needs to perform a one-time initialization:

#### Workspaces

This tab allows performing the one-time initialization of a workspace and viewing various statistics for that workspace.

Within the tab, a list of workspaces with pending initialization is displayed. Clicking on a workspace will display the initialization form. After reviewing the information, clicking on Initialize Now will set it up.

#### Managing Search Settings

Workspace Administrators can:

* Monitor Index Statistics for their workspace
* View Timing Statistics for search operations
* Manage user sources within the workspace

#### Customizing Search Experience

Workspace Administrators have the ability to:

* Create and manage search personas for their workspace
* Configure custom facets
* Adjust relevance settings for different content types within their workspace

## App Creator

The responsibility of the App Creator is to define which classes should be searchable and which fields should be included within the search index. Additionally, the App Creator should add proper cleanup operations for each field.

The Explore App search is designed to work as independently as possible. Because of that, only a limited set of options within the class designer affects the advanced search.

**Note:** The configuration for the search is only available if the search feature is not disabled globally. A workspace is not required to be eligible to use the Explore App to configure the Search.

### General Behavior

Before starting the configuration, some general information about the behaviour is important to know.

#### Mapping

In general, the search works with its own class structure compared to the one defined within the class designer. The translation between the class designer structure and the search structure is called mapping. This allows introducing search-only related configurations to each class and adjusting the configuration independently from the structure within the class designer.

#### Source Types

The search has two operation modes per class: Shared Source and User Source. The crawling of shared sources and user sources doesn't differ.

A shared source is the common case. Shared sources are classes where items can be seen by multiple users (not considering rights). A database table is a common case for a shared source.

A user source defines a source where only one user can see a given set of items. A mailbox is a common case for a user source where each user has its own mailbox even within a single workspace. Each user can manually enable the user sources he or she wants to index.

#### Mapping Key

All items of a class are translated to a configurable structure. The structure is a flat list of key-value pairs. Because the search works outside of any application, the key is not the same as the key of a field within the class designer because this could lead to unwanted conflicts. Instead, a field is mapped to a different independent key. This independence helps avoid unwanted conflicts and allows merging fields from different classes across multiple applications if desired.

The mapping key must have the format of `<Prefix>.<Key>`. Both can be customized. When a search is executed, all values with the same mapping key are grouped into a single search field.

#### Value Processors

Because the raw field values might not always be suitable for a good search experience, each field can have one or more value processors. These will transform the raw value from the source. A good example of this is HTML fields. Without a value processor, the search index will not only contain the text content of the HTML value but also all HTML tags. To exclude these unwanted words from the search index, you can add value processors that will remove these tags.

#### Strategies and Crawling Settings

Not all sources behave equally across the board, and not all sources are updated from within the platform itself only. To be able to also include these sources properly, the App Creator can configure specific strategies and crawling settings.

### Configuration

Within the Configuration Mode for an App, a dedicated Search section is available within the Modules category. Click on this section to open the designer.

The designer has two tabs: Sources and Searching.

Within Sources, you configure which classes should be indexed and how the indexing should operate.

Within Searching, you configure how items of that class are displayed in the search result.

#### Add a Class to be Searchable

Click on the Sources tab. To add a class to the list of mapped classes, click on the `+` above the list of mapped classes.

<figure><img src="/files/72c78MYh1k1sXDCthEK8" alt=""><figcaption><p>Sources - Mapping Summary</p></figcaption></figure>

A popup will appear where you can select one or more classes.

<figure><img src="/files/mJEkaC5ZOF1jDmWqrv74" alt=""><figcaption><p>Adding a Class</p></figcaption></figure>

The prefix should be the general domain of the application. By default, it is the name of the source. The entered value can be changed for each field later on.

For each source, a list of available classes is displayed. Clicking on a class will select it; clicking on it again will unselect it.

After clicking on `Execute`, the class will be added to the list of mapped classes and can now be configured in detail.

#### Fields

First, the fields that should be stored within the index should be selected here. The list of fields is grouped by their data type.

**Type**

* **NaturalText** indicates that the content of the field is some kind of free text without any restriction to a single simple format. The body text of an email is an example of that.
* **String** indicates that the content of the field contains text but follows a specific pattern or is not even modifiable directly by the user, like a combo box value.
* **DateTime**, **Date**, and **Time** fields represent a single point in time.
* **Numeric** fields contain numbers only. All numeric fields have a 64-bit precision.
* **Float** and **Double** fields contain numbers with decimals.
* **Duration** fields represent a time duration without any reference to a point in time. Compared to a Time field, a duration field can be longer than one day.

For certain types of fields, the type can be changed. The pre-selected type is calculated depending on the configuration for that field from within the class designer.

* Fields with a data source are marked as String.
* String fields are marked as NaturalText.
* DateTime fields are marked as DateTime. Depending on the control type, it might get changed to Date or Time.
* Numeric fields like Integer, Byte, etc., are all marked as Numeric. A long field with the control type Duration will be changed to Duration.
* Float fields are marked as Float.
* Double and Decimal fields are marked as Double.
* Boolean fields are not supported and are not available.
* All other fields are marked as NaturalText fields.

#### Search Mode

The search mode indicates the relevancy of this field when the user enters a search text. An item matching a search term in a high-relevancy field will be more at the top compared to a match in a lower-relevancy field.

The order of relevancy is:

1. Title
2. SubTitle
3. Content

Fields set to `NoSearch` are saved within the index, but a user-entered search term will not search within this field. The user can only filter for fields saved within the index, so this option is useful to allow the user to narrow down the search result with more filters later on.

DateTime fields should be set to `NoSearch` normally. The search mode operates on words, and the text representation of DateTime fields is not how the user expects it to be.

#### Multi-Value

Selecting this option indicates that this field might have more than one value simultaneously. While the platform does not support this feature by itself, it can be enabled for search. This can be because a value processor might convert a single text value into multiple distinct values.

Enabling this setting for values that do not have multiple values at the same time has a performance penalty and should be avoided.

Not enabling this setting for values that do have multiple values at the same time might result in incomplete search results.

#### Facet

When enabling this option, a facet will be created for this field at indexing time. A facet allows the user to drill down the search result. A facet is a string representation of the field value, and each value is case-sensitive.

#### Keeping the Fields Up to Date

The fields will not automatically get updated after changes are made within the class designer. To update an existing mapping, click on the `Sync` button. This will compare the mapping with the latest configuration from the class designer. A popup will appear listing:

* All new fields
* Fields that are not equal to the initial mapping configuration
* All deleted fields

In this popup, select the modifications you want to apply and press Execute.

Fields that got modified will be updated. New fields will be added to the list but in a deactivated state. You need to activate them manually by clicking on the checkbox in front of the field.

**Important:** Newly added fields will have the default prefix for the mapping key. Please review this generated mapping key and adjust it to match the expected value.

#### Crawling Settings

These options change how items are retrieved from the source.

#### Paginated Loading

This is the default loading operation. This operation will fetch individual pages with a fixed number of items per page from the source and process them. This option can be configured by providing a JSON configuration like this:

```json
{ 
    "pageSize": 100, "retryCount": 5 
}
```

* The `pageSize` property defines how many items each page should include. The default value is `100` but it can be adjusted depending on the behavior of the source. If the source itself does not support pagination and pagination is done in memory within the adapter, the page size can be increased significantly (e.g., to `10000`) to improve performance and reduce the load on the source itself. This value should also be increased to a proper value if the source itself has high latency, but the latency is not proportional to the number of items requested.
* The `retryCount` specifies how many times a single page should be fetched from the source in case a fetch has failed. This allows indexing sources that are overloaded and produce timeouts regularly. The default value of `5` should be okay for almost all cases.

#### Item Receiving

This option allows adjusting for the behaviour of a given source.

* The `From Page` behaviour is the default one. It means that each requested page will contain all relevant fields from the source itself. This option doesn't have any further configuration.
* The `Fetch Individually` behaviour is for sources that only return a subset of `fields`when multiple are requested. Microsoft Exchange is an example where the body of an email will not be returned if a list of emails is requested. This behaviour will fetch the items first and then fetch each returned item from the source again. This option produces a lot more load on the source and should only be used if the source shows this behaviour.

This option has the following further configuration:

```json
{ 
    "parallelRequests": 1 
}
```

The option `parallelRequests` specifies how many individual item requests should be performed in parallel for each item returned from a single page. Higher values will decrease the time needed to iterate over a list of items but increase the load on the source itself. The default value for `parallelRequests` is `1`.

#### Strategies

This section configures how this class should behave in general and how updates within the class should get detected.

#### Source Type

This specifies the general type of the source itself.

The type **Shared Source** is the default type. This means that there will be one index for this class per workspace. Search queries for all users will be executed within that search index.

This option has an optional advanced configuration:

```json
{ 
    "ignoreConditionalRights": false 
}
```

When `ignoreConditionalRights` is set to `true`:

* All configured conditional rights of the platform will be skipped during crawling.
* The index will still apply the configured rights.
* Items that the crawling user cannot see will be included in the index.

This option should be set to `true` for:

* Classes that use ACL rights
* Bigger tables with many relations or poor indices (only after detailed analysis)

Otherwise, only items visible to the crawl user will be indexed. The default value for this option is `false`.

***

#### Updates

This section specifies how updates are detected and propagated to the search index. Note that multiple strategies can be active simultaneously.

With **Changes within the Platform** enabled, the crawler will periodically check the Activity Stream of the TIVITY platform to detect changes.

***

With **Periodically Reindex** enabled, the crawler will reindex all items of that class at the configured interval. This option should only be used if really needed because it can create a high load on the source. This option requires an additional configuration:

```json
{
    "reindexInterval": "00:10:00"
}
```

The option `reindexInterval` specifies the time between each reindex. The time must be specified in the format `<days>.<hours>:<minutes>:<seconds>`. If no days a specified, the format is `<hours>:<minutes>:<seconds>`. The smallest allowed interval is five minutes.

***

With **an incrementing field** enabled, the crawler will fetch the highest value of each of the specified fields from the index and asks for the source if there are any new items where the field value is greater than the last known value. This option requires an additional configuration:

```json
{
  "fields": [
    "SortingTime"
  ],
  "checkInterval": "01:00:00"
}
```

The option `fields` is a list of field keys (not the mapping key) which should be considered for evaluation. These fields must be saved within the index itself and they must be mapped to one of the following index data types:

* DateTime
* Double
* Float
* Numeric

If multiple fields are specified, each known value is combined with OR.

Example: given that the fields `Foo` and `Bar` are specified. The highest known value for `Foo` is 12 and the highest known value for `Bar` is 42. This would generate a selection like

```sql
SELECT FROM source
WHERE
    Foo > 12
OR  Bar > 42

```

The option `checkInterval` specifies the time between each check. The time must be specified in the format `<days>.<hours>:<minutes>:<seconds>`. If no days a specified, the format is `<hours>:<minutes>:<seconds>`. The smallest allowed interval is five minutes.

***

With **Reindex old items** enabled, the crawler will reindex all items of that class where the last time they were crawled is more than the configured amount of time ago. This option will not perform any operation if the index itself is empty. This option requires an additional configuration:

```json
{
    "itemAge": "30.00:00:00"
}

```

The option `itemAge` specifies the age an item within the index must have before it gets scheduled for a reindex. The time must be specified in the format `<days>.<hours>:<minutes>:<seconds>`. If no days a specified, the format is `<hours>:<minutes>:<seconds>`. The smallest allowed age is five minutes.

#### Value Processors

Value processors will modify the content of a given field before it will get send to the search index. Value Processors are predictively pre-generated when a class is added to the mapping for the first time. The prediction is based on the data type, configured data source and the configured control type from within the class designer.

Value Processors are executed for each field from top to bottom. The output of a value processor will be the input of the next value processor. If the chain of value processors returns `null` for a field, it will not be added to the index.

Remark: a field with an empty string will be added to the index which increases the size of the index.

* **Convert to lowercase** will convert any input to lowercase characters only
* **Convert to upper case** will convert any input to upper case characters only
* **Remove LegacyExchangeDN from Email Address** will remove any ActiveDirectory-only related address from an E-Mail address field text. These values are not valid E-Mail addresses and further E-Mail address-related processors might fail if these values are not removed. If the field can contain multiple E-Mail addresses, do not use the *Split Email Address List* processor before using this one.
* **Ensure not default date**: Some adapters might have a default Date value for a field which has no value. This date value refers to the first of January of the year 0, which is not a common date for most business cases. This Processor will replace this value with `null` meaning that the value will not saved within the index.
* **Ensure not empty**: String fields where the value is an empty string will get replaced by `null` meaning that it will not get saved within the index.
* **Ensure resolved not null**: For fields which have a data source, but the data source does not have any item for the value saved within the field, the foreign key of that field will get saved within the index. With this processor, these values will get replaced with `null` which will not add them to the index. If you use the EditComboBox control type, this processor should not be added.
* **HTML Decode**: this processor will replace common HTML substitutions like `&nbsp;` or `&amp;` with their corresponding normal characters. This processor should come after the *HTML strip* processor.
* **HTML Strip**: this processor will remove all HTML control characters from the string (e.g. `<div>` or `<span>`). This processor tries to represent the layout structure of the HTML itself with its plain text counterpart. If an element has inline styles which will hide its content, this processor will not include any text found in that element in its output. It is recommended to use this processor for all HTML fields.
* **Normalize Email Address**: This processor will remove the optional display name from a single E-Mail address and convert the address itself to lowercase. This is highly recommended if the field is used as a facet. If the field can contain multiple E-Mail addresses, use the *Split Email Address List* processor before using this one.
* **Normalize Line Break** will convert Windows Style line breaks or macOS style line breaks into the one character UNIX style line break.
* **Reduce Whitespace** will remove unnecessary white space characters from a text. Unlike **Trim**, the evaluation is performed per line. It is recommended to put the *Normalize Line Break* processor before this one.
* **Replace Value** will replace values with a set of predefined values. It can be used to exclude fields when having a given value.
* **Split** will create splits of the value on the specified split character into a list of values. This value processor will produce a multi-value list, it is recommended to enable the option `Multi Value` for this field if this processor is used.
* **Split Email Address List** will convert a single recipient address list string into a list of individual E-Mail addresses. The string must be RFC5322 compatible and individual addresses must be separated by a `,`. This value processor will produce a multi-value list, it is recommended to enable the option `Multi Value` for this field if this processor is used. It is highly recommended to use the processor before adding further processors for E-Mails like for example for using the *Normalize Email Address*.
* **Trim** will remove all leading and tailing whitespace characters from a value.

#### Split

The split processor expects the following configuration:

```json
{
    "splitOn": "<value>"
}
```

The option `splitOn` specifies the text on which the value should be split on.

Example: Given a field contains multiple values separated by a `;` like

```
"A;B;C"
```

the configuration would look like this:

```json
{
    "splitOn": ";"
}
```

The processor would output the value as

```
["A", "B", "C"]
```

#### Replace Value

The replace value processor expects the following configuration

```json
{
    "values": {
       "<field value>": "<replace with>",
       "<other value>": "<replacement>"
    }
}
```

The option `values` contains key-value pairs where the key is the value which should get replaced and the value is the replacement.

If the value is set to `null`, the field will not get added to the index.

```json
{
    "values": {
       "Do Not Include Me": null
    }
}
```

If the value does not match any configured replacement, the value will not get replaced.

The keys are case-sensitive.

#### Measure and Analyze

This tab allows to get a look into the data which gets produced by the provided configuration. This allows to quickly iterate over the configuration without having to save it first and waiting for the crawler to catch up to the changes.

Performing the `Measure Now` will fetch the first 100 elements from the source and perform all mapping operations. As a result, the operation produces a JSON for each mapped item. At the bottom of the page, these mapped results are displayed. Additionally, the duration for the operations is measured and displayed.

Keeping the duration small ensures that the load on the source is minimized and updates are published quickly to the search index. The durations are not proportional to normal search operations performed by the end user.

### Items appearing within the search result

After having the Sources configured, the appearance of all configured classes can be changed in the Searching tab.

#### Summary field

By default, an item will display the Name and the Description field within the search result. For items which contain long texts, a summary text can be generated. The summary will detect important sentences based on word heuristics and word frequencies and will take the most relevant sentences to generate the summary itself.

By adding one or more fields to the Summary Field, the summary will be based on these fields combined. You should only add the main text field from the mapping and multiple fields containing lookup values etc.

The summary quality is highly dependent on the quality of the text to summarize. The summary generation performs optimally when the text consists primarily of paragraphs and sentences, without excessive boilerplate content or complex visual structures. Additionally, the text should be free of HTML tags for best results.

Note: The text used will be the content from within the search index. Therefore, any value processors previously applied to these fields may affect the results.

If no field is specified or all specified fields are empty, the configured description field from within the *Loading and Display* tab will be used instead.

#### Loading and Display

#### Item Loading

This option specifies where the data for displaying an item will come from.

* **From Source** is the default selection. For every item to display, the platform will fetch the latest information from the source itself before sending the results to the user. This ensures that the latest information is always displayed for the user. This option has a performance penalty because each displayed item will get loaded first.
* When using **From Search Index**, each matched item will be sent to the user directly without consolidating the source first. This option is highly recommended for slow sources. A slow source might block an available search result for the end user for a long time which reduces the user experience. The downside of this option is that it is not guaranteed that the information displayed is the latest one. For most cases however, this tradeoff might be worth for the performance gain.

#### Display

This section allows to specify which field value should be displayed where within the search result. When using the *From Source* option, the setting **Automatic** will be available. This option will fill the fields depending on the specified internal keys of a field from within the class designer. For each placeholder, you can select one field as the source for this information. If the option *From Source* is selected, each field is added twice to the list of possible fields - one for the field value from the data source and one for the field value from the search index.

Remarks: If a field from the search index is selected, the displayed value will be the value which comes out of the value processor for that field.

#### Additional Attributes

In addition to the placeholder areas, one or more attributes can be added. These attributes will be displayed between the Title and the Description placeholder.

## Platform Administrator <a href="#platform-administrator" id="platform-administrator"></a>

### General

The advanced search feature requires a dedicated search index. This index is used to perform search operations and is maintained within a dedicated search service.

The size of each index depends on two main factors:

1. The size of the original data source
2. The number of fields saved within it In many cases, the index size can be approximately equal to the size of the underlying data source.

To ensure the index remains current, the platform continuously indexes items in the background.

### Disabling

The search feature can be disabled globally without affecting other parts of the platform. To do that, open the `appsettings.json` within the installation folder and remove the configuration with the key:

```
"Modules:ExploreApp:ServiceUri": "http://<some host>:<some port>/,"
```

After a platform restart, the advanced search will not be available anymore.

**Note:** If the feature is disabled this way, all UI elements for the search will not be available anymore.

### General Administration

The platform administrator has a dedicated page within the Admin Center which allows monitoring and managing the search feature.

To open this page, go to the Admin Center, navigate to the Misc tab, and click on the `Search Administration` action.

<figure><img src="/files/WVuSPtt65AJrs9I1WnmU" alt=""><figcaption><p>Admin Center- Misc</p></figcaption></figure>

#### Service Health and Service Logs

These tabs allow monitoring of the current health state of the dedicated search service.

<figure><img src="/files/EPa01QwZDhLY9Pesxbe8" alt=""><figcaption><p>Service Health and Service Logs</p></figcaption></figure>

#### Crawler Health

This tab provides an overview of the current state of the crawler itself. The crawler is responsible for sending updates to the search service to keep the search index up to date.

#### Crawler Logs

The crawler records specific events in the standard log file location. This tab also offers a quick view of the most recent log entries.

**Note:** Only the latest log statements are displayed here. A platform restart will clear the list of available log entries.

#### Availability

The Explore App operates on an opt-in basis. By default, it is not available for any workspace. Workspaces must be explicitly marked to use the Explore App, which can be done in this section.

When a workspace is marked as eligible:

* The Explore App is enabled for all users in that workspace.
* Users will see the Explore App after refreshing the web app or logging in.

**Note:** The first time a workspace is marked eligible, it requires initial setup. Please refer to the Workspace Administrator section for details on this process.

If a workspace is removed from the list of eligible workspaces:

* The Explore App will no longer be visible to users of that workspace.
* The workspace will automatically remove itself from the crawler.

**Important:** Removing a workspace from the eligible list does not delete its search index. To remove the index data, you must either:

1. Manually invoke the corresponding API of the search service, or
2. Delete the workspace entirely.

#### Index Statistics

An initialized workspace will display the Index Statistics tab. This tab will display various information about each created search index for that workspace. The information will include the last time the index was updated, the total size, and the number of items within the index.

<figure><img src="/files/2wMuGxN8v7VSfItvLUkf" alt=""><figcaption><p>Index Statistics</p></figcaption></figure>

#### Timing Statistics

An initialized workspace will display the Timing Statistics tab. This tab will display various timing information about each performed search operation for that workspace. This includes the number of executions and min, max, and average time of various stages for a search operation.

<figure><img src="/files/JoU3pccFJS7iutjGsNyd" alt=""><figcaption><p>Timing Statistics</p></figcaption></figure>

#### Troubleshooting

If, for some reason, the search index is not filled correctly or is out of sync, the index can be forcefully re-created. A complete re-index will iterate over all available items and send them to the search service. The reindexing is an iterative operation, meaning that the index will be re-created while keeping the current content available for new searches. This allows this operation to be performed while keeping the search feature available for the users.

Like the normal crawling operations, the re-indexing happens in the background. The number of parallel re-indexing operations is limited by the number of available CPU cores. The number of parallel executions is `0.33 * [CPU core count]`. Depending on the current amount of work to do for the crawler, it can take a while until the actual operation starts.

To start a reindex, go to Search Administration -> Workspaces -> \[The workspace the reindex should happen in] -> Index Statistics. On the right-hand side of every index is a small reindex action.

**Note:** You cannot schedule a reindex for a user source. In this case, the reindex action will not be visible.

**Note:** The list of pending reindex operations is not persisted. If a long list of reindex operations is requested and the platform gets restarted, the reindex operation will not resume automatically.

**Note**: For information on initializing a workspace, please refer to the Workspace Administrator section


# Integration into an App

There are numerous options for app creators to integrate search with the data of an App.

### **Add Classes to Search**

* **Mapping per Field**: Fields with the same Key are grouped together within the search.
* **Define Search Relevancy per Field**: Setting the Priority to one of:
  * Title
  * Sub Title
  * Content
  * No Search
* **Define the Source Type**: To one of:
  * Shared Source (Team Wide Source)
  * User Source
* **Configure Source Specific Behaviour**:
  * Pagination Size
  * Retry Counter for Failures
  * Bulk Instance Loading vs. Individual Instance Loading
  * Source Fetch Skipping
* **Configure Update Strategies**:
  * System Updates (Activity Stream)
  * Periodic Reindexing
  * Crawl by Modification-Date-Field (Not Ready Yet)
  * Reindex Old Items
* **Configure Cleanup Strategy**:
  * None
  * By Last Indexed Date (Not Ready Yet)
* **Configure Value Processors per Field**:
  * Strip HTML
  * Decode HTML
  * Normalize E-mail
  * Split by Character
  * Split E-mail List
* **Analyse and Measure**:
  * Preview of the Configured Mapping
  * Performance Analysis of the Source

### **Per Class Search Display Configuration**

* **Define One or More Summary Fields**: To get displayed instead of a raw value.
* **Define Which Fields to Display in the Search Result**:
  * Title
  * Description
  * CreatedBy
  * ModifiedBy
  * CreatedOn
  * ModifiedOn
  * Custom Fields to Display


# General Settings

### **General**

* **Automatic Document Level Security**: For every search, based on activity rights and ACL (Access Control Lists).
* **Designed as Optional Service**: The platform remains functional even if the search service is down.
* **Automatic Synchronization**: Between core and search service, even if the service was shut down for an extended period.
* **Designed as Optional Plugin**: The platform can operate without the search feature being active.
* **Main Search Interface Usability**: Compatible with tablet, mobile, and desktop.

### **Tagging**

* **Support for Multi-Field Values**: Tagging is integrated as another field within the mapping, enabling automatic filtering by tags.
* **Source-Independent Tags**: The search feature is indifferent to the origin of the tags, whether they come from a user or an AI-Service.
* **Tagging Extension for Crawler**: Required to detect when and which instances have changed their tags.


# Roles & Permissions (Team app)

This part of the documentation goes though the ways to assign usage and access rights to users on the TIVITY platform.

## Introduction

There are two main ways of assigning access and usage rights to platform users; the **Team App** and the **Rights Designer**.&#x20;

The Team App allows you to define user groups, for example for projects or departments, while the Rights Designer allows to granularly specify the access rights of single users on specific data fields on a per-application basis.

This documentation will go through setting up application roles for the Team App and setting rights and permission using the Rights Designer.&#x20;

## The Team App

<figure><img src="/files/B1LEInY4UooX5hwzXVR8" alt=""><figcaption></figcaption></figure>

As introduced, the Team App allows TIVITY platform administrators to define groups for members of projects or organizational departments. Each group can be given access to a specific set of projects and data.

This allows members of each group to have access only to the projects relevant to them, and prevent others from accessing data they should not.

![Opening the Teams App](/files/-MBeLbThMGxN6xten1XZ)

## Users

In the Users section, all active users are listed alphabetically along with the groups they belong to. To see the details of a user or edit it, you can click on it.

<figure><img src="/files/sRlPFchNLxrBOf5qt4Qe" alt=""><figcaption><p>The Users Section in the Teams App</p></figcaption></figure>

A user's detail view contains relevant information about such as his contact information and group memberships.

![Detailed view for a user](/files/-MBeOjM3n09sMKFMThKA)

### Inviting a new user

To invite a new user to the team, click on the green **Invite User** button on top of the Teams App.

![Inviting a new user](/files/-MCDObzYZeAgSfu1A-tD)

On the next window you can enter the emails of the users you want to invite to the team and assign them to groups in advance.

### Viewing & modifying invitations

To view all pending invitations, click on **Invitations** in the Teams App.

![Pending Invitations](/files/-MCDQC_1YLraF_b8bebv)

If you want to delete **Resend** or **Delete** an invitation, click on the invitation to access the invitations's details. Next open the Actions menu by clicking on the 3 dots the top to access those functionalities.

![](/files/-MCwhRR5YnFYHqnRAnOJ)

## Groups

The Groups section gives an overview of all created organisational groups within your TIVITY Workspace. It allows you to get a quick overview of which administrator own each group and is responsible for it.

<figure><img src="/files/v9FFGrblwbV07GGYWgWR" alt=""><figcaption><p>Groups section in the Team app</p></figcaption></figure>

### Creating a new group

To create a new group, click on **Add new group** on top of the Groups window.

Under **General**, each group must be given a name, an owner and optionally a description.&#x20;

![Creating a new Group](/files/-MBeSy5GuDz8nznNAb2G)

#### Setting Application Roles

Next, you can set the application roles using the from the drop-down menu under **Group Rights**. Setting the drop-down to  **Read** will connect all users of the group to the default **Viewer** application role for all applications, which has read-only permission . By setting it to **Write** on the other hand will connect users in the group to the default **Editor** application role which has both read and write permissions.&#x20;

To allocate application roles a per-application basis, you can select **Custom** and individually select for each application which role you want to assign to the group.

For example, the Demo Group in the figure above has Editor and Viewer application roles for the Projects application, but not to the Documents and Ledger applications&#x20;

#### Adding users

Next to add members to the new group, under **Members** click on the **Add new member** field and select the users from the drop down menu.

### Modify an existing group

The steps to modify an existing are similar to creating a new group, firstly, click on the group you want to modify to access the group's details.&#x20;

Depending on if you want to modify the application roles or add a new user , refer to [Setting Application Roles](/managing-users-and-collaboration/roles-and-permissions#setting-application-roles) or[ Adding users ](/managing-users-and-collaboration/roles-and-permissions#adding-users)sections above and follow the instructions.

## Collaboration

The Collaboration feature provides the foundation for controlling **who can see and collaborate with whom** inside the platform.\
With Collaboration Visibility, administrators can tailor the platform to support different types of user portals—such as customer portals, partner portals, internal departments, or restricted external access.\
By enabling or disabling Collaboration globally or per workspace, administrators can define completely isolated environments, shared collaboration spaces, or selective visibility between specific groups.\
This ensures that each workspace can be configured according to its target user type, security needs, and communication structure.

The second tab of the Team app is **Collaboration**.

* Collaboration: the umbrella feature covering both, visibility and communication.
* Visibility: Specifies who can see who. It is not required that the visibility is mutual, meaning that a user A can see a user B, even if user B can not see user A.
* Communication: A superset of visibility. A user can only be a communication partner if the visibility is mutual. Two users, A and B, can only communicate with each other if B is visible for user A and user A is visible for user B.

<figure><img src="/files/zQsige0kteP55I842YLl" alt=""><figcaption></figcaption></figure>

This section allows you to configure who can collaborate with whom.

Groups can define **rules** to grant or restrict access to users, features, or apps.

Each group defines a set of users, members of that particular group can see. The set of users is build by specifying one or more rules. Each rule is defined by two parameters:

* An operation (Add or Subtract)
* A group

Rules are evaluated from top to bottom.\
The set of visible users starts empty. Then for each rule, the members of the group specified within the rule are either added or subtracted from the set of of visible users.\
The outcome of processing all rules for a single group is set of visible users, each member of the owning group can see.

To manage exceptions, groups are assigned **access levels**:

* **Default** – standard access rights.
* **Priority** – overrides Default access when needed.

This structure enables both simple and complex scenarios:

* By default, **Everyone** can collaborate with all users.
* Special groups can be restricted from seeing others.
* Exclusive groups can be configured so only they collaborate among themselves.

A user can see another user if **any** of the groups they belong to indicates that the other user is visible. In other words, a user’s groups are effectively combined using a logical **OR** — if even one group allows visibility, the user can see the other person.

However, the set of groups that need to be evaluated can be narrowed down by considering the **Access Level**.

When a user belongs to multiple groups, only the groups that share the **same access level** are evaluated together. For example, if a user is part of one or more groups where the access level is set to **Priority**, then any groups with the access level **Default** will be **ignored** during visibility evaluation.

### **Example setup**

<figure><img src="/files/4bP663Bh0tagUtClDClr" alt=""><figcaption></figcaption></figure>

* **Everyone** → Default access with Everyone.
* **Managers** → no specific rules, but can collaborate through Everyone.
* **Developers** → no specific rules, but can collaborate through Everyone.
* **Externs** → Priority access, collaborate only with Managers and Developers.
* **Customer A** → Priority access, collaborate only with Managers and Customer A.

### Testing Configurations

The **Test** section makes it possible to validate configured collaboration rules.

<figure><img src="/files/U3NoaZHiHJqoNjeQEsCI" alt=""><figcaption></figcaption></figure>

Two users (User A and User B) can be assigned to specific groups. Based on these memberships, the following results are shown:

* **Visibility Result** – whether User A can see User B, and vice versa.
* **Communication Result** – whether both users are able to communicate.

This ensures that group rights and collaboration rules behave as expected before being applied in real usage.

### Collaboration Visibility

Learn how to manage the Collaboration feature globally and per workspace.

#### Overview

The **Collaboration Visibility** feature allows platform administrators to control whether the **Collaboration** functionality is available globally or within specific workspaces.\
This provides flexibility in managing collaboration access and ensures consistency across the platform.

The configuration can be accessed in the **Admin Center, more info** about the **Admin Center** can be found under the [**Platform**](/administration/platform).

#### Global Collaboration Configuration

<figure><img src="/files/6AEAp1KtpspjOPUOT3MM" alt=""><figcaption></figcaption></figure>

The **Collaboration Availability** setting offers three configuration options:

* **Disabled**\
  Disables the Collaboration feature globally across all workspaces.\
  When this option is selected, all collaboration features and filters are turned off, but existing configurations are **not deleted**.\
  This is also the **default setting** for new installations of the platform.
* **Available (Workspace default: Disabled)**\
  Enables the Collaboration feature globally but keeps it **disabled by default** for newly created workspaces.\
  Administrators can enable it manually per workspace.\
  The default state does affect all workspaces - new or existing ones - which use the UseDefault setting for the collaboration.
* **Available (Workspace default: Enabled)**\
  Enables the Collaboration feature globally and sets the **default state to enabled** for newly created workspaces.\
  The default state does affect all workspaces - new or existing ones - which use the UseDefault setting for the collaboration.

#### Workspace-Level Collaboration Management

When Collaboration is available globally, administrators can manage it per workspace.

To do this:

1. Open the **Admin Center**.
2. Go to the **Workspaces** tab.
3. Select and open the desired workspace.

<figure><img src="/files/tpDkcQYneThszglLyJRj" alt=""><figcaption></figcaption></figure>

In the workspace view, open the **Settings** tab.\
Under the **Features** section, there will be an option to enable or disable **Collaboration** for this specific workspace.

<figure><img src="/files/f5sinhsnPMaksxTWdXae" alt=""><figcaption></figcaption></figure>

If Collaboration has been disabled globally, a **warning message** will appear.\
This message indicates that no matter what is being selected under the workspace settings Collaboration will be disabled because of the global setting.

<figure><img src="/files/ZChKmuiYylN2lT3AxDXq" alt="" width="373"><figcaption></figcaption></figure>

#### Example Scenario

If the global setting **Available (Workspace default: Disabled)** is selected:

* New workspaces will have Collaboration **disabled** by default.
* Administrators can later open a workspace and **enable** Collaboration manually via its **Settings → Features** section.

This structure ensures centralized control over the platform’s Collaboration capabilities while allowing workspace-level flexibility.


# Rights Designer

This section will go through using the Rights Designer to specify the access rights of roles of users in an application

The Rights Designer is used to set-up roles with specific rights when building an application. For example, a role may need access granted to edit or read specific classes, see data fields or execute workflows while other users do not. We also want administrators to have the ability to have the full access. In this document we will have a look at how to create roles, managing users in a role and setting permissions for various functionalities of an application.&#x20;

## Opening the Rights Designer

To open the Rights Designer, enter **Config Mode** and click on **Rights**.

<figure><img src="/files/sttDfmketIfp68n6bsvL" alt=""><figcaption></figcaption></figure>

## Roles

The Rights Designer opens in the **Roles Tab**. With roles, rights can be set for a set of users at once. All users of this role possess the rights that are assigned to this role.

<figure><img src="/files/MstemMWNCnU9gTAA5ZXo" alt=""><figcaption></figcaption></figure>

## Users

In the **Users Tab**, we can find a list of all users. If we have a large organization, the list of users can become quite long. We can use the filter function to find a specific user. To use the filter function, we simply start typing the name of the user in the **Filter field** <img src="/files/-MBtJ6nMxEoekyr7NnC5" alt="" data-size="line">.

<figure><img src="/files/Yg2LdIv8wA4KNqGDsfLH" alt=""><figcaption></figcaption></figure>

## Managing Roles

### Default roles: Viewer & Editor

By default, all applications are created with the two roles; Viewer and Editor. The Viewer role is set up so that it’s members can view but not edit the application whereas the Editor role extends the rights so that it’s members can also edit the application.

### Creating a new Role

To add a role, we simply press on the **plus icon** <img src="/files/-MBtSP5qPRcigb5LG0xJ" alt="" data-size="line"> in the top left corner of the Roles tab. Afterwards, we specify a name and then click on **Execute** in the bottom right corner.

<figure><img src="/files/qj92NnNK4wvvcprUlcF1" alt=""><figcaption></figcaption></figure>

### Deleting a role

To delete a role, we simply click on the **trash icon** <img src="/files/-MBtMKzT2L3ybncWQsly" alt="" data-size="line"> on the right of the group we want to delete.

<figure><img src="/files/09sbMalLrYLs8FdLLRfw" alt=""><figcaption></figcaption></figure>

### Changing role details

In the Common Tab of a Role, we can change the following:

<figure><img src="/files/9D1oqe4WnNXjspa8HdZu" alt=""><figcaption></figcaption></figure>

* **Name** – The identifier of the custom role.
* **Description** – A short explanation of the role’s purpose.
* **Assignable by Users** – A checkbox that determines whether the role can be assigned to Groups within the Teams app.

If this option is **checked**, the role will appear in the **Team** app and can be assigned to users or groups.

If the option is **unchecked**, the role will be hidden from the Team app and cannot be assigned manually.

#### Behavior and Version Control

All **newly created custom roles** (specified roles) are **assignable by users by default**.

If a role is made unavailable in the **Rights Designer** by unchecking *Assignable by Users*, the following will occur automatically:

* All rights or restrictions previously granted by that custom role will be **removed** from users and groups.
* The same behavior applies when a role’s assignable status is changed as part of an **app version update**.

The **Team** app also offers the option to **export and import group rights**.

If an exported group includes a specified role that is **unmarked** (meaning it is not assignable by users), and the same group rights are later imported where that specified role was **marked**, it will become **unmarked** and all related rights will be **automatically removed**.

This ensures that imported configurations remain consistent with the current state of available roles and their permissions.

### Assigning Permissions

The **Permissions Tab** allows us to assign rights to roles.&#x20;

<figure><img src="/files/mxAoNBHwD4PdcMjvW28Y" alt=""><figcaption><p>Role Permissions</p></figcaption></figure>

In area 1, we can set the **Overall Rights** for the role, which will apply by default for objects. In area 2 we can set or modify rights for individual classes.

Later on, we will also see how to apply [Scoped Rights](/managing-users-and-collaboration/roles-and-permissions/rights-designer#scoped-permissions) form this window.

For better overview, you can expand or collapse the individual classes of area 2.

<figure><img src="/files/SpDxpei8kerGSPt6eV5z" alt=""><figcaption><p>Expanding and Collapsing Classes</p></figcaption></figure>

### Adding new member

The **Members Tab** allows us to add or remove members to a role.&#x20;

To add a member, click on the **plus icon** <img src="/files/-MBtSP5qPRcigb5LG0xJ" alt="" data-size="line"> in the top left corner.

<figure><img src="/files/L1GVyrH6cdfsKfXmPYXP" alt=""><figcaption></figcaption></figure>

Then we can choose which users to add to the current role. We can also add roles as members of a role and this is explained under [Hierarchical Organization & Inheritance](/managing-users-and-collaboration/roles-and-permissions/rights-designer#hierarchical-organization-and-inheritance).

### Removing Member

To remove a member, we click on the&#x20;

&#x20;**icon**<img src="/files/-MBtSTqSuV6sW-onXSIc" alt="" data-size="line">on the right side of the Member we want to delete.

<figure><img src="/files/Az5fHgFL7Y9AJUZlwFd5" alt=""><figcaption></figcaption></figure>

### Hierarchical Organization & Inheritance&#x20;

The TIVITY platform allows us to hierarchically organise roles.

Using the example of Viewer & Editor. A Viewer has Viewing Permissions but no Writing Permissions. By default, an Editor is part of the role Viewer. The editor therefore automatically inherits the rights of a viewer and has the possibility to extend them.&#x20;

<figure><img src="/files/9TxQvSAzAuooi4CPMUyw" alt=""><figcaption></figcaption></figure>

The **Member Of Tab** shows us all the roles that this role is a member of.

![Editor is a member of Viwer](/files/-MBtVsN_pXhQg9pwBpUE)

#### Joining a role

To join a role, we click on the **link icon** <img src="/files/-MBtWUTq_SSLxVHh55Wo" alt="" data-size="line"> in the top left corner of the Tab.

![](/files/-MCwlJQroknD6gbGXWDT)

#### Leaving a role

To leave a role, we click on the **unlink icon** <img src="/files/-MBtSTqSuV6sW-onXSIc" alt="" data-size="line"> on the right side of the Role.

Every user can have different rights to access or edit items and call functions. These are stored in a user’s detail page, which can be accessed at **Rights Designer > Users Tab > Click on user**

## Managing Rights

Permissions can be set at user level or role level.

* To set permissions for a specific user, navigate to **Rights Designer > Users Tab > Username**
* To set permission for a role navigate to **Rights Windows > Roles > Permissions Tab**

### **Overall rights and per-class rights**

The Permissions Tab for both a Role and a User will look similar.

![](/files/-MCwlxAyYM91Vrc6J6N1)

In Area 1 we can set the Overall rights which will will affect all classes. In Area 2 we can set or modify rights for individual classes. The following table describes the permissions of the class and the effect the specified permission has for the class elements :

| Right        | Abilities                                                                                                                                                         |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Not set      | (no rights set)                                                                                                                                                   |
| Read + Write | <p></p><p>Users can</p><ul><li>read and edit data fields</li><li>execute all actions</li><li>execute workflows</li></ul>                                          |
| Read         | <p></p><p>Users can</p><ul><li>read data fields</li><li>execute read actions</li></ul><p>Users <strong>cannot</strong></p><ul><li>not execute workflows</li></ul> |
| Deny Write   | <p></p><p>Users are actively <strong>denied</strong> to</p><ul><li>write data</li><li>execute write actions</li><li>execute workflows</li></ul>                   |
| Deny Read    | <p></p><p>Users are actively <strong>denied</strong> to</p><ul><li>read or write data</li><li>execute actions</li><li>execute workflows</li></ul>                 |

### Scoped Rights

Permissions can also be applied to data fields, actions and workflows. This allows to granularly define how users can interact with specific items of the platform. For example, a specific user or role can be given the right to fully interact with a class but denied the right to apply all workflows defined for the object.&#x20;

For this, we are back in the **Permissions Tab** of a Role or a **User** and expand an object.

![](/files/-MCwmjVlZEy0qDmWPHgA)

For a summary of the whole permissions tab, from here we can :

1. Set overall rights for all classes
2. Set rights for one class of our application
3. Set rights for the Actions of that specific class
4. Set rights for the Fields of that specific class
5. Set rights for the instance workflows of that specific class

Overall (1) and class (2) permissions have been covered in the previous sections. To set right for a specific Action, Field or Workflow, expand the corresponding panel.

#### Field

Fields permissions work similarly to class permissions, you can refer to the table under [Overall rights and per class permissions ](/managing-users-and-collaboration/roles-and-permissions/rights-designer#overall-rights-and-per-class-rights)for more information about those permissions.

![Permissions for the App field in a class](/files/-MCTBXhqwSV4gOpustgr)

#### Action and Workflow

Rights to execute an action or a workflow can either be granted or denied by setting the permission to **Grant** or **Deny** respectively.

![Rights to execute action or workflow can be either grated or denied](/files/-MCTDgnRJDqvmgLHVWpP)

### Conditional Permissions

For every Action, Field and Workflow, it can be specified whether a permission is granted depending on the state of a conditional variable. For example, a workflow for an object can only be executed by the user when the object has the defined value.&#x20;

Firstly, open the drop-down list for an object. Then click on Actions, Fields or Workflows, depending for what type you want to set the conditions and click the **settings icon** <img src="/files/-MBCo7T7BtG64Zwffv31" alt="" data-size="line">.

![](/files/-MCwn6iQCOcjwvp2Rn5o)

In the **Conditions Tab**, several settings can be adjusted to fit the conditions of the permissions and denials to your specific use case.&#x20;

![](/files/-MDF4sAR_Njwqzsq-kbY)

For example in the last figure, the Save Action is granted only if the Object's Name field is not empty.

In the **Overall** drop down, you can specify whether the access to this field is granted or denied by default. There are three options:

| Option  | Details                                                                                           |
| ------- | ------------------------------------------------------------------------------------------------- |
| Not set | No condition is applied to this action/field/workflow (initial value)                             |
| Grant   | This action is by default granted for the user unless other specified by the following conditions |
| Deny    | This action is by default denied for the user unless other specified by the following conditions  |

Then, using the **Matches** drop-down, you defined whether items that match the following conditions are included or excluded.

| Option   | Details                                                           |
| -------- | ----------------------------------------------------------------- |
| None     | No conditions are relevant for this item                          |
| Included | The right is applied to all instances that fit the conditions     |
| Excluded | The right is not applied to the instances that fit the conditions |

There can be single conditions or groups of several conditions that the object must match in order for the right to apply.&#x20;

### Copy permissions and conditions

The set permission and conditions on one object can be copied to member of the same object:

* **Class right**: The permission and conditions can be copied to the same class of other roles of the same application (at least one role must be selected)
* **Action right**: The permission and conditions can be copied to other actions of the same class and for other roles of the same application (at least one action and one role must be selected)
* **Field right**: The permission and conditions can be copied to other fields of the same class and for other roles of the same application (at least one field and one role must be selected)
* **Workflow right**: The permission and conditions can be copied to other workflows of the same class and for other roles of the same application (at least one workflow and one role must be selected)

To save a set of permissions and conditions press the `Copy` button at the bottom left of the window.

![](/files/-M_WBwa_sMN_OYJwNFkV)

An overlay with multiple selection fields opens. You can now select the objects to which the set will be copied. Execute `Copy` after the selection.

![Overlay with selection](/files/-M_WDeBs5MSJSKhzyf11)


# Access Control Lists (ACL)

This part of the documentation will go through how to set up ACL as an application creator and how to enforce ACLs as a workspace administrator.

For each application, Access Control Lists (ACLs) can be defined by the application creator to regulates the access to objects of a class using the ACL Designer. Those ACLs can then be used by an administrator to assign access to users base on their role on the platform using the Teams App.&#x20;

## ACL Designer

Setting up ACL for a class comes in two steps. First you need to create an ACL class in the[ Class Designer](/building-an-application/data/data-modelling) to store the ACL properties, then head to the ACL designer and configure ACL for your class.

### Creating an new ACL Class

In order to configure the ACL for a class (Class X),  a second class (ACL-Class) must be created to store the information about the access to specific objects of the Class A. The ACL-Class must contain the following fields:

* a field linked to Class A's `ID` field with a Data Type `uniqueidentifier` (referred to as InstanceId field in the documentation)
* a field to store the ID of a role with Data Type `uniqueidentifier`(refereed to as RoleId field in the documentation)

If the ACL class is used for more than one class, a field with the **Internal Key** `RefClassId` must be linked to field `ID` of Class X.&#x20;

{% hint style="info" %}
Read more about creating classes using the Class Designer on the following page :&#x20;
{% endhint %}

{% content-ref url="/pages/-MAVBfh9UZcHTNc6Jnx-" %}
[Data Modelling](/building-an-application/data/data-modelling)
{% endcontent-ref %}

### Opening ACL Designer

To open the ACL Designer, enter **Config Mode** and click on **ACL**.

![Opening ACL Designer](/files/-MDG1-_Tx6CvH-HkV7cd)

### Setting up ACL for a class

To setup ACL for a class, first locate the class in the **Class** column. Next there's 5 parameters you need to configure in the 5 corresponding columns :

* Mode
* Storage
* Source
* Credentials
* Owner

![Example of ACL setup for the Order Class using the OderACL Class as an ACL source](/files/-MDG23Tqg55xBMa-LWP7)

#### Mode

The Access Control List mode. There are two modes&#x20;

* Restrictable: when creating a new instance of the Class X, an ACL-record for the Everyone role is added by default.
* Restrictive: when creating a new instance of the Class X, no ACL-records added. The access to the new instance must be configured by the administrator explicitly or by the owner of the object.

#### Storage

The only storage option available at the moment is **External Storage**. This is used when the the application creator defines the ACL class which will be used to store ACL records.

#### Source

&#x20;The ACL class which is used to store the ACL for the Class X&#x20;

#### Credentials

&#x20;The field of the ACL-Class which is used to store the role id.

#### Owner (Optional)

The field of the Class X which stores the Id of the user who is the owner of the instance. The owner can read or change the corresponding instance independently of the ACL.

## ACL Configuration in the Team App

When ACL is configured for a class in an application, administrators can specify how individual instances of this class are accessed for specific roles in the [Team App](/managing-users-and-collaboration/roles-and-permissions#the-team-app).

First go to **Team App > Groups > Select a group**.  In the **Instances** section, select an application and a class for which you want to configure ACL.

![ACL configuration for instances of the Project Class in the Projects app ](/files/-MDLbcMhNNKg2z-N2bpd)

In the list of instances of the selected class the administrator can select or deselect individual instances of a class to set if that instance can be accessed for the group or not. For example in the figure above, the group has access to "Test Project 1" but not to "Test Project 2".

The kind of the access is determined by the group rights or the rights that the [roles](/managing-users-and-collaboration/roles-and-permissions#setting-application-roles) assigned to this group have :

* If the group right is Write, the selected instances can be read, created, changed or deleted.
* If the group right is Read, the selected instances can only be read.
* If the group right is Custom, the access kind (Read or Write) is determined by the rights that application roles assigned to the group.

{% hint style="info" %}
You can learn more about the Roles and Permissions on the following page :&#x20;
{% endhint %}

{% content-ref url="/pages/-M8Hj\_UaVWiMHpDIqtPC" %}
[Roles & Permissions (Team app)](/managing-users-and-collaboration/roles-and-permissions)
{% endcontent-ref %}


# Platform (Admin Center)

Basic configuration of the platform.

The configuration of the platform is done in the Admin Center. Only the administrator of the platform has access to the Admin Center. In this area workspaces and new users can be created or general settings of the platform can be made. In addition, various settings such as app management or platform tasks are also located here.

To enter the Admin Center it is necessary to log in as administrator. Under the Account Settings menu you can select the Admin Center. This selection is not available for normal users and App Creator.

![User configuration menu](/files/-MKkRJwTFeEdEprmho58)

After opening the Admin Center the different setting areas are shown in the tabs.

![Admin Center card](/files/-MKkV32mxvw8WJdpz0F3)

Overview of the configuration tabs

* [**Workspaces**: Configuration of all workspaces of the platform.](/administration/workspace)
* [**Platform** **Users**: Here all users can be viewed and edited](/administration/platform#platform-users).
* [**Platform Config**: Different configurations concerning the platform](/administration/platform#platform-config).
* [**Misc**: Miscellaneous](/administration/platform#misc)

## Workspaces

For the documentation of the workspace configuration there is a separate chapter under the topic Administration.

{% content-ref url="/pages/-M8Hh90\_lfntWe5p2pGQ" %}
[Workspace](/administration/workspace)
{% endcontent-ref %}

## Platform Users

Under the tab 'Platform Users' you get a list of all users of this platform. Here the administrator can delete or configure users. There will also be the unconfirmed users, i.e. those who register after a registration and receive an email but not response.

![User configuration](/files/-MKuagL882HsyyrIW_oc)

To view the details of a user click on an entry from the list. A new map with the details opens. In the header area there are more options in the menu. Here the administrator can delete a user. The two actions "delete user" and "delete user persistent" are available.

![User details](/files/-ML8lhIRjp4n2HocDmDN)

With "Delete user" this user remains in the database. He is only marked as "deleted". If the action "delete persistently" has been executed, the user is deleted irrevocably and cannot be restored.

## Platform Config

Here the platform can be individually adapted. In addition, further functionalities can be activated. We will go through all the points from top to bottom.

<figure><img src="/files/S6EpVJ2BBiNmCbc75GoF" alt=""><figcaption><p>Platform Config Options</p></figcaption></figure>

### Schedule Maintenance

Under "Schedule Maintenance" information of maintenance work can be displayed. The text of the information can be entered individually. An Html editor is available for formatting the text e.g. links. The message text can be entered in several languages (currently only German/English).

![Html editor for entering text](/files/-ML8w4ai004xL_MmydcA)

Afterwards the start date can be entered when the maintenance work starts. Next the end date is selected. This is the period of time when the user of this platform can see the information about the maintenance.

![Example of a configured schedule](/files/-ML90hYFh65C7B6FO-h4)

As soon as the maintenance appointment starts, the information is displayed on the platform's surface. Directly on the login page as well as on the main page at the top, a colored highlighted field with the information appears.

![Login page](/files/-MLEOh4DxF7UiTs1vys2)

### Platform Features

The "Platform Config" panel provides various settings for hiding and showing buttons. In addition, further cross-platform settings can be made here.

These settings allow administrators to streamline workspace creation and maintain consistency across the platform:

* Config Mode: display Config Mode button (#1). The button is always enabled for the platform administrator.
* Default workspace templates: Workspaces which are used as templates when creating default workspaces (MultiSelect). See “Workspace templates”.
* New workspace template: Workspace which is used as a template when creating a new workspace (ComboBox). See “Workspace templates”.

<figure><img src="/files/d46X67en04xssHWO0czR" alt=""><figcaption><p>Admin Center - Platform Config</p></figcaption></figure>

Global Add Button: display Add button

* App Menu Button: display App Menu button
* Add App Button: display Add App button (#2)
* User Registration Button: display the User Registration button
* Add Team Button: display Add Team button
* Delete Team Button: display Delete Team button
* Invitations: display Invitations button (#3 and #4)
* Delete User From Team: display Delete User From Team button
* Dropbox Button: display Dropbox button
* Personal Workspace: display Personal Workspace (#5)
* Config Mode: display Config Mode button (#1)
* Feedback Button: Feedback button is only displayed if the option is checked. Also sending feedback is not possible if the option is unchecked. (#6)
* Staying Signed In: enable how long the users staying in without new login
* User Can Change Abbreviation: Users can change their abbreviation in the account settings

![](/files/-MUt2bXN7-vUw90Q-bT1)

### Platform Branding

Setup the branding of the platform by setting the app name, app icon, sidebar app name and sidebar app logo.

<figure><img src="/files/58d91xCOL7NpAqTePE6V" alt=""><figcaption><p>Setup of Platform Branding</p></figcaption></figure>

Pressing *Reset* on the bottom of the Platform Branding resets app name, app icon, sidebar app name and sideber app logo to platform default settings value.&#x20;

### System Apps

Configure whether system-wide apps are displayed or not. The following apps can currently be configured:

* Activity App
* Activity Ticker
* Dashboard App
* License App
* Reporting App

<figure><img src="/files/ToIA6XgdrYLb3AM7gR7D" alt=""><figcaption><p>System Apps</p></figcaption></figure>

### Password Settings

Here you can configure the strength of the password. And the error output if the validation fails.

For the password strength a regular expression pattern is used. The error message can be entered in German and English.

![](/files/-MLJNj-REgcYjbhvsXk_)

### Script Settings

Script Settings section has the option *Action Platform Administrator Restriction* which is by default enabled. It restricts script actions, so that they cannot be used outside of platform administrative scripts.&#x20;

There are two levels for script actions:&#x20;

1. User - Script actions can be used in every script. No restriction exists.
2. Platform Administrator - Script actions can only be used in platform-wide scripts (SAML scripts). Saving scripts with these script actions or execution of these scripts outside of the restriction results in an error.

<figure><img src="/files/dufF8KNKo6zrY4YWAiMO" alt=""><figcaption><p>Default Script Settings Status</p></figcaption></figure>

### SMTP Settings

Here you can configure the SMTP (simple mail transfer protocol) server that is used for sending mails from the Platform Admin. Required are the host, port and credentials. SSL, Anonymous and Domain are optional.

### Mail Settings

With this settings you can first enter an email address that is used for sending mails from the platform.Then follows a set of settings for various standard mails that the platform sends. The text of a mail subject and the body can be adjusted there.

![Mail Settings](/files/-MLOWw2vQDyG0ivtUb63)

* From Address: An email address that is used for sending emails from the platform.
* BCC Addresses: Email addresses which are added as BCC when system emails are sent. The addresses are added in the following cases: activation, registration or invitation of a new user, changing the user’s email address and resetting the user’s password. If there are multiple email addresses, they are separated by a semicolon.
* Then follows a set of settings for various standard emails that the platform sends. The text of a mail subject and the body can be adjusted here.

### Notification Settings

This settings offers to customize the shell text for notifications in English and German language. They are divided into 3 types of notifications.

![](/files/-MUo3Z3Hncn7bfZO3NZk)

#### Email notifications

This notification is sent when there are unread messages in the platform notifications and the throttle time has expired. The throttle time can be configured in the user's account settings.

These parts of a notification can be configured:

* Subject (only for multiple notifications)
* Body
* Separator (separates multiple notifications)

The following placeholder can be used in subject and body:

* {FIRST\_NAME}: The first name of the recipient
* {LAST\_NAME}: The last name of the recipient
* {NOTIFICATIONS\_BODY}: The notification body (or all bodies separated)
* {NOTIFICATIONS\_COUNT}: The count of new notifications
* {NOTIFICATIONS\_LINK}: The link to all notifications

#### Unread chat messages

This notification is sent when there are unread chat messages and the throttle time is expired. e throttle time can be configured in the user's account settings.

These parts of a notification can be configured:

* Subject
* Body
* Separator (separates multiple notifications)

The following placeholder can be used in subject and body:

* {FIRST\_NAME}: The first name of the recipient
* {LAST\_NAME}: The last name of the recipient
* {MESSAGES\_BODY}: The chat message to notify of (or all messages separated)
* {MESSAGES\_COUNT}: The count of unread messages
* {MESSAGE\_LINK}: The link to the chat

#### Share messages

This notification is sent when a share action is performed on an instance.

These parts of a notification can be configured:

* Subject
* Body

The following placeholder can be used in subject and body:

* {SENDER\_FIRST\_NAME}: The first name of the sharing user
* {SENDER\_LAST\_NAME}: The last name of the sharing user
* {TEXT}: The text added by the sharing user
* {CONTEXT\_NAME}: The name of the shared instance
* {CONTEXT\_LINK}: The link to the shared instance

### Tagging Settings

Platform administrator regulates in Tagging settings the Tagging feature and its usability through workspaces:

<figure><img src="/files/x6rByUiww9ghkR24sfBk" alt=""><figcaption><p>Tagging Settings</p></figcaption></figure>

Prerequisite for the activation of the Tagging feature and its usage accross the platform is that platform administrator sets the Tagging feature to *Enabled*.&#x20;

<figure><img src="/files/hTnR4XQXQvwOHRJFpH1n" alt=""><figcaption><p>Tagging settings set to enabled</p></figcaption></figure>

If the platform admin sets the Tagging Settings to not enabled, then the Tagging feature is also not visible for the Workspace administrator in the Teams App Settings:

<figure><img src="/files/GnRuE58CLwm8U6TvKQMn" alt=""><figcaption><p>Tagging Settings disabled</p></figcaption></figure>

<figure><img src="/files/ZfO4NLAHdSrjb8gL5Vmi" alt=""><figcaption><p>Team Settings has no Tagging Feature</p></figcaption></figure>

If the platform Administrator sets the Tagging Setting to enabled, but disables the *Workspace enableable* option, the Tagging feature is visible for the Workspace administrator, but cannot be disabled:

<figure><img src="/files/JN2ZU6C3eq8Lw4KiSOlI" alt=""><figcaption><p>Tagging enabled, but Workspace enableable disabled</p></figcaption></figure>

<figure><img src="/files/DCTElw4Dt4PxACHqZQRJ" alt=""><figcaption><p>Tagging feature cannot be disabled</p></figcaption></figure>

Last but not least, if the platform administrator enables the option *Workspace enabled default*, then the Tagging feature will be enabled by default when installing the new workspace:

<figure><img src="/files/GytW0ZDGYx3jLsqAikuO" alt=""><figcaption><p>Tagging settings enabled by default</p></figcaption></figure>

## Asynchronous Preview Generation

The Platform automatically generates a PDF from non-image documents to be able to preview them within the browser. This preview generation happens asynchronously after the user uploads a non-image document in the background. While the preview generation is happening, the user will see a loading indicator when he opens a Page which displays that documents preview. The user can continue to work while the loading is happening.

To ensure that the system itself is not overloaded, the number of parallel preview generations is tight to the number of CPU cores available on the server. The formula for the number if 33% => x Number of CPU cores.

## Grid Column Reordering

The order of Columns within a Grid can be changed. To change the order of a column, click and hold on the header of the column to change and move it while keeping the mouse button clicked. When reaching the place where the column should move to, release the mouse button.

<figure><img src="/files/QIy90slTrERPpSpaxNfm" alt=""><figcaption><p>Grid Column Reordering</p></figcaption></figure>

The order of the columns will be preserved for a single Page. If a page gets closed and opened again at a later point in time, the column order will be the previously customized order.

### Limitations

The column order can not be changed when the content of the grid is grouped by a one or more columns

The column order is not preserved for hierarchical grids.

Changing the column order will collapse all open sub levels within a grid.

The column order will not be preserved in the Reporting App.

## Selection Filter

With the selection filter, the content of a Grid can be reduced to only show rows which have specified values.

#### Adding a filter

To open the selection filter for a given column, click on the left *Column Actions* button within the header. In the appearing Drop Down Menu, select *Selection filter.*

<figure><img src="/files/pTVzTrXABjnAOohuR0V7" alt=""><figcaption><p>Selecting a filter</p></figcaption></figure>

A popup will appear which will list all unique values from all items of the current column. Mark the values which should be kept by clicking on them.

<figure><img src="/files/ZjsWgjawxzgjM3Ef4UKA" alt=""><figcaption><p>Priority values</p></figcaption></figure>

After clicking on **Update**, only rows which have the selected values will get displayed. Additionally, a filter bar will appear above the Grid to give a quick glance which columns have which filtered values.

<figure><img src="/files/CcqS6PvlZDMljcvYXF6h" alt=""><figcaption><p>Task management interface</p></figcaption></figure>

#### Modifying or removing a filter

To modify an currently active filter, click on the corresponding item in the filter bar or use the same drop down menu which was used to create a filter. A popup will appear where the filter can be modified.

To remove a filter, click on the **X** in the filter bar or unselect all values when the filter modification popup is visible.

#### Adding more filters

The filter bar shows an additional button which allows to add more filters quickly if at least one filter is already active. Clicking on that button will display a list of columns filters can be added to as well.

<figure><img src="/files/BYG7p3DIOuuq3QN8WMVA" alt=""><figcaption><p>List of filters</p></figcaption></figure>

Remark: The list will also contain columns which already have a filter. If such a column is selected, the modification popup for that filter will get shown.

Remark: Multiple filters are applied using the AND operator. Meaning that all filters must match for each row to be become visible.

#### Negating a filter

If the option **Exclude selected values** within the filter popup is enabled, the Grid will only show rows which do not match the selected values for this column. Additionally, the filter bar will show a red indicator for that filter.

<figure><img src="/files/jhhYHuwjVJ0K7lspvlMd" alt=""><figcaption><p>Negating a Filter</p></figcaption></figure>

#### Select All

When using the Column Filter, all currently visible items can be selected at once. To do that, click on the **All** checkbox within the header of the list of possible values.

<figure><img src="/files/4mFEBPoQLWYWt7UZRqjB" alt=""><figcaption><p>Categories List</p></figcaption></figure>

Remarks: If the list contains more than 1000 unique items, it will be limited to the first 1000 items. Selecting all will also only select the first 1000 items. Additionally, a warning will indicate that the list is truncated.

<figure><img src="/files/Rn1oNrQ7zoEHN4Rhv5mI" alt=""><figcaption><p>Warning - Maximum units selected</p></figcaption></figure>

#### Limitations

The selection filter is not available if the Grid displays grouped content.

### Workspace Templates

A workspace template is a workspace defining the apps and the app data that are pre-installed in new workspaces. Any workspace can be used as a template. Workspace templates are used for two purposes.&#x20;

**Default workspace template:**&#x20;

This option specifies which workspaces will be used as templates for default workspaces when a new user is registered or created in the Admin Center. If no templates are selected, the new users will have no default workspaces. If one or more templates are selected, the corresponding number of workspaces will be created with the same names as the names of the templates. If a template workspace has apps installed, those apps will be installed in the corresponding default workspace of a new user. If some data is defined in a template app, this data will be copied to the corresponding app in the default workspace. This allows for example creating a default workspace with several apps defined, so that every new user will have the same set of apps installed. Another example is a demo workspace template, so that every new user will get a workspace with demo apps and demo data.&#x20;

**New workspace template:**&#x20;

This option specifies a workspace which will be used as a template for any new workspace created by a user or by the platform administrator in the Admin Center. The apps and the app data defined in this template will be added to the new workspace, so that every new workspace will have the same set of apps installed. When the platform is installed, two workspaces are created: “Default workspace” and “New workspace”. The owner of these workspaces is the admin user. The first one is set as the Default workspace template, the second one is set as the New workspace template.

### Other Settings

Currently there is only one setting in Others Settings. Here you can enter the Google API key.

![](/files/-MUo3xvhfX1ZR7qHmz4b)

### Help Settings

For external help pages settings can be made here. These help links are called on the main page of the platform. There you will find a '? button. Clicking on it opens a dropdown menu which contains the two entries for external pages / links.

![](/files/-MLnI0bHcw-kAyRtaIF2)

## Misc

In Misc they can perform actions or administrative tasks on the platform. In addition, administrative configurations can be made here.

![overview Misc tab](/files/-MLTj_W2FYR4vJ_T9Us5)

### Platform Actions

* **Restart application**: the restart of the web application is forced
* **Clear repository cache**: the cache of the platform is cleared so it can be rebuild
* **Repair document index**: the document index is read in again

### Platform Configurations

**App Management** is used to manage the apps that are available on the platform. The apps can be imported here and then installed as well.

For more details see the chapter [Publishing the Application](/building-an-application/application-setup/publishing-the-application).

### Feedback

All platform users can share the user experience topics like suggestions, feature improvements, bugs, compliments or any other comments with the Feedback feature.

<figure><img src="/files/YKwsaltvMcocJnsFq01p" alt=""><figcaption><p>User Feedback </p></figcaption></figure>

Feedback form is opened by clicking on the *Feedback* ![](/files/utsUiHdyG35msnec8Ev1)in the top right corner.&#x20;

<figure><img src="/files/253Gnuj1CtBnjJLE10uN" alt=""><figcaption><p>Feedback Form</p></figcaption></figure>

The feedback subject is not a mandatory field and can contain up to 100 characters, while feedback message can contain up to 2000 characters and is a mandatory field.&#x20;

In addition, up to 3 screenshots can be either uploaded (PNG or JPEG, maximum size 2 MB) or automatically generated by pressing *Generate* ![](/files/pIjFHWAmrcO9D4m3rlkH). For the latter the screenshot of the actual browser content is taken.&#x20;

{% hint style="warning" %}
Due to browser restrictions, certain parts of the screenshot may be missing. Please make sure that everything important is visible or make you own screenshot.
{% endhint %}

#### Security

The documentation of the security settings can be found in the chapter Security.

{% content-ref url="/pages/-MUyIl9GDnfjNwGo\_P7j" %}
[Security](/administration/security)
{% endcontent-ref %}




---

[Next Page](/llms-full.txt/1)

