Table of Contents outline true
Introduction
This article describes how to build folder structures ('virtual' folders') in product version 4. The new folder structure replaces the familiar subfolders from of version 3.3. The new structure is based on the configuration of each context folder.
You configure the folder structure in a text file in the designer. In future versions, a graphical tool will make configuration simplereasier.
The client 4.x gets the folder structure by requesting the new microservice named Structure Service.
For more general information, refer to the Frequently Asked Questions.
The following Find here a presentation that explains how folder structures are set up and used (German only): Widget Connector
Folder Structure Configuration
This section describes the Folder Structure API. This API leads to individual folder structures for a folder (German: Ordner).
The REST calls used to request the folder structure for a single folder are documented here.
Syntax
Currently, the folder structure configuration is a text file written in a JSON-based syntax. In the future, the configuration will be supported by a visual editor and preview similar to that for forms.
Structure Service Testing Tool
Beginning with version 4.3, a testing tool is available to help you validate structure configurations. For more information, refer to the testing tool documentation.
Standard
...
Structure
If no individual folder structure configuration is given for a folder, the standard structure offers the 'structure elements' (German: Strukturelemente) as shown in the client:
...
Figure 1: Standard structure of a folder
Children tree definition
The configuration for the standard structure is shown in the following code sample. The details are explained below.
Code Block |
---|
[ { "title" : "All objects", "title_locales" : { "de":"Alle Objekte", "es":"Todos los objetos", "fr":"Tous les objets", "it":"Tutti gli oggetti", "pt":"Todos os objetos", "ru":"Все объекты", "zh":"所有對象" }, "key" : "Types", "field" : "type", "expanded" : true, "showempty" : true }, { "title" : "Edited by me", "title_locales" : { "de":"Von mir bearbeitet", "es":"Editado por mí", "fr":"Edité par moi", "it":"Modificato da me", "pt":"Editado por mim", "ru":"Отредактировано мной", "zh":"由我編輯" }, "key" : "ModifiedByMe", "condition" : "modifier=#CURRENTUSER#" }, { "title": "Editors", "title_locales" : { "de":"Bearbeiter", "es":"Editores", "fr":"Éditeurs", "it":"Editors", "pt":"Editores", "ru":"редакторы", "zh":"編者" }, "key": "Modifier", "field": "modifiertitle" }, { "title" : "Modification range", "title_locales" : { "de":"Bearbeitungszeitraum", "es":"Rango de modificación", "fr":"Plage de modification", "it":"Gamma di modifica", "pt":"Faixa de modificação", "ru":"Диапазон модификации", "zh":"修改範圍" }, "key" : "ModifiedRange", "method" : "daterange", "field" : "modified" } ] |
List of structure terms
...
[ ]
...
mandatory
...
Opens and closes the whole folder structure configuration. Use JSON syntax for arrays.
...
{ }
...
mandatory
...
Opens and closes the configuration of a node, as well as each subnode. Use a comma ( , ) to separate sets of curly brackets ( { } ). Use JSON syntax for objects.
...
key
...
mandatory
...
There is a unique key for each level in the tree. It is used to reference the results in the structure tree.
...
title
...
mandatory
...
The label for the key.
...
field
...
optional
The contents of the index field referenced here are displayed as subfolders in the structure. The value of 'field' can be the technical name of general object attributes (see chapter 'List of general object attributes') or of individual index data with the format 'technical and normalized name of object type'.'technical name of index field' (qualified technical name).
If the field is one of an abstract object type, all objects of the derived object types are shown in the corresponding list of objects.
Info | ||
---|---|---|
| ||
Only lower-case characters are allowed. |
...
condition
...
optional
...
Use 'condition' to filter objects. For more information, see the chapter 'Condition grammar'
...
method
...
optional
...
Use 'method' to aggregate objects in the following ways:
- daterange: for fields of type date and date/time. Aggregates objects by today, yesterday, this week (last seven days), last week, this month, last month, this year and last year.
- yearhistogram: for fields of type date and date/time. Aggregates objects by year.
- sum: Adds up the values of the referenced 'field'.
- avg: Build the average of the referenced 'field'.
- min: Gets the minimum value of the referenced 'field'.
- max: Gets the maximum value of the referenced 'field'.
The default, if 'method' is not given, is 'count'. The aggregation will count the objects referenced by 'field'.
...
For count aggregations, the structure service returns the 10 top results. If you want more results, you can set a higher size (e.g. 10,000), for example if 'showempty' is used and there are more than 10 structure elements.
Note: A higher size can decrease the performance of the aggregation. It is not recommended to set a high size on each structure element definition.
The size property can only be used if the method is 'count'.
If the field reference is a catalog, it is not needed to set the size in the structure element definition. The size is automatically set to the number of possible elements in the catalog. But it is still possible to override this behavior by setting a size.
...
A boolean that controls whether a folder with substructure is shown expanded when the object view is opened. Default is 'false' (not shown expanded).
Supported since product version 3.32
...
A boolean that controls whether a folder with substructure shows all folders, regardless of whether an object can be found for it. Default is 'false' (no empty folders are shown).
This property can only be used, if the possible child elements are known. The element must have a field property. The child elements are known if a fixed catalogue is used, the 'type' field is used, or if a 'showemptylist' property is provided for a string field.
...
'showemptylist' can be used for fields from type catalog and string. If use the elements of the list are shown even if no object with the value is given. If such element is marked in the structure tree it is offered within the create object menu and preset in the create form.
In case of a fields from type catalog the list values must be the data values of the catalog.
Code Block |
---|
...,
{
"title": "Documents",
"key": "Docs",
"field": "eoxdocument.eoxdocumenttype",
"showempty": true,
"showemptylist": ["Whitepaper","Correspondence"]
}, |
Supported since product version 4.10
...
A boolean that controls whether a node folder element is shown if all child elements are empty. If set to 'true', the node element is hidden from the result, if the count of objects - the aggregations - are zero. If at least one child element is available, the folder element is shown.
The property 'showempty' controls the behaviour for empty child elements, while the property 'hideempty' controls the behaviour of the parent element.
Supported since product version 4.12
...
contextcondition
...
The element is only visible, if the context folder condition matches.
In the following example the node 'Candidate' is only shown if the personalfile class is a 'Applicant'.
Code Block | ||
---|---|---|
| ||
[
{
"key":"CandidateInformation",
"title":"Candidate",
"contextcondition":"personalfile.class='Applicant'",
"folder":[ ... ]
}
] |
Hint: If a contextcondition is used, the service is doing a additional call to the eleasticsearch to resolve the index data of the context folder. If used to often, this will decrease the performance.
Supported since product version 4.12
...
If a aggregation of a field is builded, by using the field property and the default method 'count', the results are sorted by relevance returning the most frequently used terms first.
This behaviour can be changed by using the 'sort' property.
If set to the 'count' (default), the most frequently terms are returned first.
If set to 'title', the result is sorted by the user interface title.
If a catalogue is used for the 'field' property, the sort property can also be set to 'catalogue', In this case, the return is sorted by the designed order of the catalogue entries.
Supported since product version 4.12
List of general object attributes (term: 'field')
...
created
...
Created
...
Date of object creation.
...
creatortitle
...
Modified
...
'Name, Firstname' of creator.
...
mimetypegroup
...
File type
...
Group of files whose extension references one application. Examples: pdf, word, excel, image
...
modified
...
Edited
...
Date the object was last edited.
...
modifiertitle
...
Editor
...
'Name, Firstname' of last editor.
...
Condition grammar
The structure definition term "condition":"<condition grammar>" is used to define a search filter. This section describes the tokens used.
...
#LASTYEAR#
...
During runtime, this week is used for filtering. Example:
Code Block | ||
---|---|---|
| ||
{
"title": "Edited by me this year",
"key": "EditedByMeThisYear",
"condition": "modifier=#CURRENTUSER# AND modified=#THISWEEK#"
} |
...
A field modifier that can be used on datetime or date fields. It provides access to the year value of the field.
Example:
Code Block | ||
---|---|---|
| ||
{
"title": "Edited in 2016",
"key": "Edited2016",
"condition": "modified(YEAR)=2016"
} |
...
A field modifier that can be used to resolve a hierarchical catalog node.
This example shows all children of node with the value Europe which may be its countries:
Code Block | ||
---|---|---|
| ||
{
"title": "Employees in Europe",
"key": "EmpEurope",
"condition": "personalfile.continent(PARENT)='Europe'"
} |
It can be used on catalogue fields. The parent node itself is always included.
...
Equability comparing.
Example:
Code Block | ||
---|---|---|
| ||
"codition":"modifier=#CURRENTUSER#" |
...
Compares two values. Result is true if they are not equal.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "modifier!=#CURRENTUSER" |
...
Compares two values, result is true if first value is less than second one.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "version<4" |
...
Compares two values, result is true if first value is greater than second one.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "version>1" |
...
Combines logically two terms.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "doc.status!='new' AND doc.status!=null" |
...
Combines logically two terms.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "doc.status='started' OR doc.status='tobereworked'" |
...
Without value.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "doc.active=null" |
...
For comparing Boolean fields.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "doc.active=false" |
...
For comparing Boolean fields.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "doc.active=true" |
...
Integer value.
Example:
Code Block | ||
---|---|---|
| ||
"condition": "doc.amount>4711" |
Configuration examples
This chapter explains the configuration syntax step by step.
One single folder for listing all context folder objects
The configuration is based on JSON syntax. The definition begins and ends with square brackets [ ]. Inside the brackets are lists, enclosed in curly brackets { }, of parameters defining the node attributes. The first example defines the smallest configuration with only one node. This node offers access to a list of all objects within the context folder.
Code Block | ||
---|---|---|
| ||
[
{
"key":"all",
"title":"All objects"
}
] |
One folder for each object type
The next example extends the node by grouping all objects by type, as shown for the first node in Figure 1.
Code Block | ||
---|---|---|
| ||
[
{
"key":"all",
"title":"All objects",
"field":"type",
"showempty":true
}
] |
Complex folder structure
The following complex example shows how to configure subnodes.
...
title | Complex configuration with many nodes and leaves |
---|
...
Reference tree definition
Beginning with product version 5.16 an additional tree is offered that shows all objects referencing the current folder.
The structure tree that was described in the first section is able to show all children of a folder. If you model id references to the folder it is useful to show also these references to the current folder. There may be many other referencing objects and it is useful to be able to navigate to them.
Since product version 5.16, it is possible to model and use a reference tree to an object. Contrary to the structure tree, which is selecting all children, the reference tree is selecting all objects that have references to a target object. For example, you have two other objects, project and task that reference to a target object. The object 'project' defines an id reference field named 'participants' and the other object 'task' defines two reference fields named 'reviewer' and 'responsible'. We have 3 modeled id reference fields to the target object. The condition that is used to select these referencing object is this :
Code Block | ||
---|---|---|
| ||
project.participants=#TARGETID# OR task.responsible=#TARGETID# OR task.reviewby=#TARGETID# |
The default reference tree that is used for this is:
Code Block | ||||
---|---|---|---|---|
| ||||
[
{
"title": "project",
"title_locales": {
"en": "Project",
"de": "Projekt"
},
"key": "ReferenceType#project",
"type": "project",
"folder": [
{
"title": "participants",
"title_locales": {
"en": "Participants",
"de": "Teilnehmer"
},
"key": "Referencefield#project.participants"
}
]
},
{
"title": "task",
"title_locales": {
"en": "Task",
"de": "Aufgabe"
},
"key": "ReferenceType#task",
"type": "task",
"folder": [
{
"title": "Responsible",
"title_locales": {
"de": "Verantwortlich",
"en": "Responsible"
},
"key": "Referencefield#task.responsible",
"condition": "task.responsible=#TARGETID#"
},
{
"title": "reviewby",
"title_locales": {
"de": "Prüfung von",
"en": "Review by"
},
"key": "Referencefield#task.reviewby",
"condition": "task.reviewby=#TARGETID#"
}
]
} |
Each referencing type is given as a folder and each referencing field is a subtree element. To distinguish between the task responsible and the task reviewer an additional condition is set, that is using the current target id.
List of tree node element properties
Term | Description | ||||||
---|---|---|---|---|---|---|---|
[ ] | mandatory | Opens and closes the whole folder structure configuration. Use JSON syntax for arrays. | |||||
{ } | mandatory | Opens and closes the configuration of a node, as well as each subnode. Use a comma ( , ) to separate sets of curly brackets ( { } ). Use JSON syntax for objects. | |||||
key | mandatory | There is a unique key for each level in the tree. It is used to reference the results in the structure tree. | |||||
title | mandatory | The label for the key. | |||||
field | optional | The contents of the index field referenced here are displayed as subfolders in the structure. The value of 'field' can be the technical name of general object attributes (see chapter 'List of general object attributes') or of individual index data with the format 'technical and normalized name of object type','technical name of index field' (qualified technical name). If the field is one of an abstract object type, all objects of the derived object types are shown in the corresponding list of objects.
| |||||
type | optional | Use 'type' to filter for a specific type. All elements provided in the result are instances of this type.
| |||||
condition | optional | Use 'condition' to filter objects. For more information, see the chapter 'Condition grammar' | |||||
method | optional | Use 'method' to aggregate objects in the following ways:
If 'method' is not defined, the default is 'count'. The aggregation will count the objects referenced by 'field'. | |||||
size | optional | For count aggregations, the structure service returns the first 10 results. If you want more results, you can set a higher limit (e.g., 10,000), for example, if 'showempty' is used and there are more than 10 structure elements. Note: A higher limit can decrease the performance of the aggregation. It is not recommended to set a high limit on each structure element definition. The size property can only be used if the method is 'count'. If the field reference is a catalog, it is not necessary to set the size in the structure element definition. The size is automatically set to the number of possible elements in the catalog. But it is still possible to override this behavior by setting a size. | |||||
folder | optional | To set up subfolder structures | |||||
hide | optional | A boolean that can be used to hide a folder from the result. It can be used to "pull-up" all child results. The result folder is always hidden from the result and all child results are shown in the parent result folder of this element. | |||||
expanded | optional | A boolean that controls whether a folder with substructure is shown expanded when the object view is opened. Default is 'false' (not shown expanded). Supported since product version 3.32 | |||||
showempty | optional | A boolean that controls whether a folder with substructure shows all folders, regardless of whether an object can be found for it. The default is 'false' (no empty folders are shown). This property can only be used if the possible child elements are known. The element must have a field property. The child elements are known if a fixed catalog is used, the 'type' field is used, or if a 'showemptylist' property is provided for a string field. | |||||
showemptylist | optional | 'showemptylist' can be used for fields of type catalog and string. If used, the elements of the list are shown even if no object with the value is given. If such an element is marked in the structure tree it is offered within the create object menu and preset in the create form. In case of a field of type catalog, the list values must be the data values of the catalog.
Supported since product version 4.10 | |||||
hideempty | optional | A boolean that controls whether a node folder element is shown if all child elements are empty. If set to 'true', the node element is hidden from the result, if the number of objects - the aggregations - is zero. If at least one child element is available, the folder element is shown. The property 'showempty' controls the behavior for empty child elements, while the property 'hideempty' controls the behavior of the parent element. Supported since product version 4.12 | |||||
contextcondition | optional | The element is only visible if the context folder condition matches.
Hint: If a contextcondition is used, the service will carry out an additional call to Eleasticsearch to resolve the index data of the context folder. If used too often, this will decrease the performance. Supported since product version 4.12 | |||||
sort | optional | If aggregation of a field is built by using the field property and the default method 'count', the results are sorted by relevance returning the most frequently used terms first. This behavior can be changed by using the 'sort' property. If a catalog is used for the 'field' property, the sort property can also be set to 'catalog', In this case, the return is sorted by the designed order of the catalog entries.
Supported since product version 4.12 |
List of general object attributes (term: 'field')
technical name | English name | Description |
---|---|---|
created | Created | Date of object creation. |
creatortitle | Modified | 'Last name, First name' of the creator. |
filesize | Filesize | Size of the content in bytes. |
mimetypegroup | File type | Group of files whose extension references one application. Examples: pdf, word, excel, image |
modified | Edited | Date the object was last edited. |
modifiertitle | Editor | 'Last name, First name' of the last editor. |
version | Version | Current version number (count starts with 1). |
Condition grammar
The structure definition term "condition":"<condition grammar>" is used to define a search filter. This section describes the tokens used.
Token | Use | Description | |||||
---|---|---|---|---|---|---|---|
#CURRENTUSER# | Placeholder | During runtime, the logged-in user name is used for filtering | |||||
#CURRENTYEAR# | Placeholder | During runtime, the current year is used for filtering | |||||
#LASTYEAR# | Placeholder | During runtime, the last year is used for filtering | |||||
#TODAY# | Placeholder | During runtime, today is used for filtering | |||||
#YESTERDAY# | Placeholder | During runtime, yesterday is used for filtering | |||||
#THISWEEK# | Placeholder | During runtime, this week is used for filtering. Example:
| |||||
#LASTWEEK# | Placeholder | During runtime, the last week is used for filtering | |||||
#THISMONTH# | Placeholder | During runtime, this month is used for filtering | |||||
#LASTMONTH# | Placeholder | During runtime, the last month is used for filtering | |||||
#TARGETID# | Placeholder | Target id (in most cases a folder) that is used in a reference tree as root id. Supported since product version 5.16 | |||||
#TARGETTYPE# | Placehoder | Target type name that is used in a reference tree as root type. Supported since product version 5.16 | |||||
#CONTEXTID# | Placeholder | Context folder id that is the common parent for a structure tree. Supported since product version 5.16 | |||||
#CONTEXTTYPE# | Placeholder | Context folder type. Supported since product version 5.16 | |||||
YEAR | Modifier | A field modifier that can be used on datetime or date fields. It provides access to the year value of the field.
| |||||
MONTH | Modifier | A field modifier that can be used on datetime or date fields. It provides access to the month value of the field.
Supported since product version 9.12 | |||||
PARENT | Modifier | A field modifier that can be used to resolve a hierarchical catalog node.
It can be used for catalogue fields. The parent node itself is always included. | |||||
= | Operator | Compares for equality.
| |||||
!= | Operator | Compares two values. Result is true if they are not equal.
| |||||
< | Operator | Compares two values. Result is true if the first value is less than the second one.
| |||||
> | Operator | Compares two values. Result is true if the first value is greater than the second one.
| |||||
>= | Operator | Compares two values. Result is true if the first value is greater than or equal to the second one.
Since product version 5.8. | |||||
<= | Operator | Compares two values. Result is true if the first value is less than or equal to the second one.
Since product version 5.8. | |||||
AND | Operator | Logically combines two terms.
| |||||
OR | Operator | Logically combines two terms.
| |||||
null | Value | Without value.
| |||||
false | Value | For comparing Boolean fields.
| |||||
true | Value | For comparing Boolean fields.
| |||||
[0-9] | Value | Integer value.
|
Configuration Examples
This chapter explains the configuration syntax step by step.
One single folder for listing all context folder objects
The configuration is based on JSON syntax. The definition begins and ends with square brackets [ ]. Inside the brackets are lists, enclosed in curly brackets { }, of parameters defining the node attributes. The first example defines the shortest configuration with only one node. This node offers access to a list of all objects within the context folder.
Code Block | ||
---|---|---|
| ||
[
{
"key":"all",
"title":"All objects"
}
] |
One folder for each object type
The next example extends the node by grouping all objects by type, as shown for the first node in Figure 1.
Code Block | ||
---|---|---|
| ||
[
{
"key":"all",
"title":"All objects",
"field":"type",
"showempty":true
}
] |
Complex folder structure
The following complex example shows how to configure subnodes.
Code Block | ||
---|---|---|
| ||
[ { "title": "All", "key": "Common", "folder": [ { "title": "Created by me", "key": "CreatedByMe", "condition": "creator=#CURRENTUSER#" }, { "title": "Modified by me", "key": "ModifiedByMe", "condition": "modifier=#CURRENTUSER#" }, { "title": "Modified by others", "key": "ModifiedByOther", "condition": "modifier!=#CURRENTUSER# AND modifier!='Bartonitz'" }, { "title": "Modified by Martin", "key": "ModifiedByMartin", "condition": "modifier='Bartonitz'", "folder": [ { "title": "CreatedModified by Martin by meyears", "key": "CreatedByMemodifiedyear", "conditionfield": "creator=#CURRENTUSER#" }, modified", { "titlemethod": "Modified by meyearhistogram", "key": "ModifiedByMe", } "condition": "modifier=#CURRENTUSER#" ] }, { "title": "ModifiedBy by otherstypes", "key": "ModifiedByOthertype", "conditionfield": "modifier!=#CURRENTUSER# AND modifier!='Bartonitz'"type" }, { "title": "Modifiedby byfile Martintype", "key": "ModifiedByMartinmimetypegroup", "conditionfield": "modifier='Bartonitz'",mimetypegroup" }, "folder": [ { { "title": "Year of modification", "titlekey": "Modified by Martin by years","modifiedyear", "field": "modified", "keymethod": "modifiedyear",yearhistogram" }, { "fieldtitle": "modifiedYear of creation", "methodkey": "yearhistogramcreatedyear", "field": "created", } ]"method": "yearhistogram" }, { "title": "By typescreator", "key": "typecreator", "field": "typecreatortitle" }, { "title": "byBy file typemodifier", "key": "mimetypegroupmodifier", "field": "mimetypegroupmodifiertitle" }, { "title": "YearTime period of modification", "key": "modifiedyearModifiedRange", "fieldmethod": "modifieddaterange", "methodfield": "yearhistogrammodified" }, { "title": "YearTime period of creation", "key": "createdyearCreatedRange", "fieldmethod": "createddaterange", "methodfield": "yearhistogramcreated" }, ] }, { { "title": "BySickness creatornotification", "key": "creatorsicknessnotification", "fieldtype": "creatortitlesicknessnotification", },"folder": [ { "title": "By modifierLonger then 3 days", "key": "modifiersicknessnotificationlong", "fieldcondition": "modifiertitlesicknessnotification.numberdays>3" }, { "title": "Time period of modificationBy years", "key": "ModifiedRangeyear", "method": "daterangeyearmonthhistogram", "field": "modifiedsicknessnotification.begin", }, "folder": [ { "title": "Time period of creation",{ "key": "CreatedRangedays", "method": "daterange", "fieldmethod": "createdsum", } ] "title": "Days", }, { "titlefield": "Sickness notification","sicknessnotification.numberdays" } "key": "sicknessnotification", "type": "sicknessnotification",] "folder": [ }, { "title": "Longer then 3 daysChild sick", "key": "sicknessnotificationlongsicknessnotificationchild", "condition": "sicknessnotification.numberdays>3" sickness!='employee' AND sicknessnotification.sickness!=null", "folder": [ }, { { "titlekey": "By yearsdays", "keymethod": "yearsum", "methodtitle": "yearhistogramDays", "field": "sicknessnotification.beginnumberdays", "folder": [ } ] { }, "key": "days", { "methodtitle": "sumEmployee sick", "titlekey": "Dayssicknessnotification", "fieldcondition": "sicknessnotification.numberdays" }sickness='employee'", ] "folder": [ }, { { "titlekey": "Child sickdays", "keymethod": "sicknessnotificationchildsum", "conditiontitle": "sicknessnotification.sickness!='employee' AND sicknessnotification.sickness!=null","Days", "folderfield": ["sicknessnotification.numberdays" {} ] "key": "days", } ] "method": "sum" }, { "title": "DaysVacation management", "key": "holidays", "fieldtype": "sicknessnotification.numberdaysvacation", "folder": [ } { ] "title": }, {"By year", "titlekey": "Employee sickyear", "keymethod": "sicknessnotificationyearhistogram", "conditionfield": "sicknessnotification.sickness='employee'vacation.holidayfrom", "folder": [ { "key": "days", "method": "sum", "title": "Days", "field": "sicknessnotificationvacation.numberdaysholidaysrequested" } ] }, ] { }, { "title": "VacationApproved by managementme", "key": "holidaysHolidaysApprovedByMe", "typecondition": "vacation.approvedby=#CURRENTUSER#", "folder": [ { { "title": "By year", "key": "yeardays", "method": "yearhistogramsum", "fieldtitle": "vacation.holidayfromDays", "folder": [ "field": "vacation.holidaysrequested" { } "key": "days",] }, "method": "sum", { "title": "DaysNot yet approved", "fieldkey": "vacation.holidaysrequestedHolidayNotApproved", "condition": }"vacation.approvedby=null", "folder": ][ }, { { "titlekey": "days"Approved, by me", "keymethod": "HolidaysApprovedByMesum", "conditiontitle": "vacation.approvedby=#CURRENTUSER#Days", "folder": [ "field": "vacation.holidaysrequested" { } "key": "days",] }, "method": "sum", { "title": "DaysApproved", "fieldkey": "vacation.holidaysrequestedHolidayApproved", "condition": }"vacation.approvedby!=null", "folder": ][ }, { { "titlekey": "days"Not, yet approved", "keymethod": "HolidayNotApprovedsum", "conditiontitle": "vacation.approvedby=nullDays", "folder": [ { "field": "vacation.holidaysrequested" "key": "days",} ] "method": "sum", } ] "title": "Days"}, { "fieldtitle": "vacation.holidaysrequested"Statement of earnings", "key": "statementofearnings", } "type": "statementofearnings", ] "folder": [ }, { "titlekey": "Approvedyear", "keytitle": "HolidayApprovedBy years", "conditionfield": "vacation.approvedby!=null",statementofearnings.yearofpayment" } "folder": [ ] }, { "title": "Contract documents", "key": "dayscontract", "methodtype": "sumcontractdocuments", "folder": [ "title": "Days", { "fieldtitle": "vacation.holidaysrequested"By type", "key": "type", } ]"field": "contractdocuments.type" } ] }, { "title": "Statement of earningsDocuments", "key": "statementofearningsdocuments", "type": "statementofearningsdocument", "folder": [ { "keytitle": "By "yearstatus", "titlekey": "By yearsstate", "field": "statementofearningsbasicdocument.yearofpaymentstatus" } ] }, { "title": "Contract documents", "key": "contract", "type": "contractdocuments", "folder": [ { ] |
'Unplugged' - Additional Examples
Vacation Management / Urlaubsverwaltung
The following example shows a configuration for a personnel file. There are two object types for vacation management ("Urlaubsverwaltung") in the file. You access the two object types, "Leave available" ("Urlaubsanspruch") and "Leave requested" ("Urlaubsantrag"), under this heading. The next level aggregates the years. Leave requests are aggregated in the next level down using the status catalog. The sum of relevant days for each status type is displayed here. Since there is only one "Leave available" object type per year, no "Business year" is necessary on the additional level.
This is an example of the configuration for the vacation management only:
Code Block | ||||
---|---|---|---|---|
| ||||
[ { "title": "By typeUrlaubsverwaltung", "key": "typeurlaubv", "field"condition": "contractdocuments.type" } ] }, {type='abwesenheit' OR type='urlaubsverwaltung'", "folder": [ { "title": "DocumentsUrlaubsantrag", "key": "ulantr", "condition": "abwesenheit.art='Urlaub'", "folder": [ { "keytitle": "documentsGeschäftsjahre", "hide": true, "key": "type"year", "field": "documentabwesenheit.geschaeftsjahr", "folder": [ { { "title": "By statusGenehmigt", "key": "state", "hide":true, "field": "basicdocument.status", "showempty":true, "folder": } ] } ] |
'Unplugged' - Additional Examples
Vacation leave management / Urlaubsverwaltung
The following example shows a configuration for a personnel file. In the file are two object types for vacation leave management ("Urlaubsverwaltung"). You access the two object types, "Leave available" ("Urlaubsanspruch") and "Leave requested" ("Urlaubsantrag"), under this heading. The next level aggregates the years. Leave requests are aggregated in the next level down using the status catalog. The sum of relevant days for each status type is displayed here. Since there is only one "Leave available" object type per year, no "Business year" is necessary on the additional level.
Following is an example of the configuration for the leave management only.
Code Block | ||||
---|---|---|---|---|
| ||||
[ { "title": "Urlaubsverwaltung", "key": "urlaubv", "condition": "type='abwesenheit' OR type='urlaubsverwaltung'[ { "title": "Tage", "method": "sum", "key": "days", "field": "abwesenheit.tage" } ] } ] } ] }, { "title": "Urlaubsanspruch", "key": "ulantr2", "type": "urlaubsverwaltung" }, { "title": "Project", "folder": [ { "title"key": "UrlaubsantragYear", "key "type": "ulantrproject", "condition" "field" : "abwesenheit.art='Urlaub'project.startday", "folder": [ { "title" "method" : "Geschäftsjahreyearhistogram", "hide "expanded": true, "key": "year", "field "folder":[{ "title": "abwesenheit.geschaeftsjahrProjects", "folder": [ { "title "hide":true, "key": "GenehmigtProjectMonth", "key"type": "stateproject", "hide":true, "field" : "basicdocumentproject.statusstartday", "showempty":true, "folder": [ { "title": "Tage", "method": "sum", "key": "days", "field": "abwesenheit.tage" } ] } ] } ] }, { "title": "Urlaubsanspruch", "key": "ulantr2", "type": "urlaubsverwaltung" } ] "method" : "monthhistogram", "expanded": true }] } ] |
Specific settings for Elasticsearch
A limitation regarding 'conditions' was introduced with the Elasticsearch version that is used in yuuvis® RAD 8.16.
Reason: https://github.com/elastic/elasticsearch/issues/55303
To solve this, this property is introduced: indices.query.bool.max_nested_depth
For more details, see this documentation: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-settings.html
Solution for yuuvis® RAD since 8.16 LTS
- Add this line to the elasticsearch.yml file in the config folder of the elasticsearch installation:
indices.query.bool.max_nested_depth: 100 - Restart the service.