Page tree

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 63 Next »

This is the documentation for ConfiForms Server/Data Center app

However, this might also work for ConfiForms cloud and in most cases it does. But please see this page to understand the differences between server and cloud versions of the ConfiForms app.


In order to make it easier to integrate with other external systems, such as JIRA, for example, we have implemented so called "virtual" functions, what you can call on field values.


Usage:

  • When using in IFTTT macro body or in ListView/PlainView/CalendarView - the notation would be: [entry.fieldname.virtual_function] 


  • When using in ConfiForms Field macro then reference it by fieldname, adding the virtual function name: fieldname.virtual_function


Useful, when you try to prepare a JSON or some other format when used together with IFTTT macro to enable integrations with other systems


See also Accessing field values and properties. You can use complex properties in your filters. For example filtering dropdown fields by values and by labels, filtering page type fields by page metadata fields, filtering user fields by, for example - email property


As of now, the following functions are supported:

FunctionDescriptionUsing in ConfiForms Field macroUsing in ListVIew/PlanView/CalendarView or in IFTTT macro body
urlencode

Does URL encode on given value, see "urlEncode" method in

https://developer.atlassian.com/static/javadoc/confluence/4.0/reference/com/atlassian/confluence/util/GeneralUtil.html

myfield.urlencode[entry.myfield.urlencode]
escapeXML

Escapes XML on given value, see "escapeXml" method in

https://developer.atlassian.com/static/javadoc/confluence/4.0/reference/com/atlassian/confluence/util/GeneralUtil.html

myfield.escapeXml[entry.myfield.escapeXml]
escape

Escapes string as in "escapeForHtmlAttribute" method in

https://developer.atlassian.com/static/javadoc/confluence/4.0/reference/com/atlassian/confluence/util/GeneralUtil.html

myfield.escapeForHtmlAttribute[entry.myfield.escapeForHtmlAttribute]
formatDate
Tries to format date fields in the specified format, expects date format as in http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.htmlmyfield.formatDate(JAVA_FORMAT)

[entry.myfield.formatDate(JAVA_FORMAT)]

(no quotes)

jiraDate
Same as "formatDate" method above, but specifies constant dateformat pattern (yyyy-MM-dd), suitable for JIRA REST APImyfield.jiraDate[entry.myfield.jiraDate]
jiraDateTime
Same as "formatDate" method above, but specifies constant dateformat pattern ("yyyy-MM-dd'T'HH:mm:ss.SSSZ"), should be compatible with ISO 8601 standard as JIRA requires when setting timestamps to JIRA fieldsmyfield.jiraDateTime[entry.myfield.jiraDateTime]
escapeJSON

Escapes illegal characters in the field value to generate a valid JSON property. New lines, quotes, tabs and etc will be properly escaped

[entry.myfield.escapeJSON]
myfield.escapeJSON[entry.myfield.escapeJSON]
asArray
asArrayMultiSelect
asArrayMultiUserPicker


Tries to create an array from the value. Useful when you want to pass ConfiForms multi-select values to JIRA. Something like

"customfield_XXXX" : [[entry.myfield.asArray]]
 
this will generate
 
"customfield_XXXX" : ["val1","val2"]
 
assuming "myfield" field is a multi select and has 2 values: val1 and val2


There are variations to support other multi-select fields in JIRA

https://developer.atlassian.com/jiradev/jira-apis/about-the-jira-rest-apis/jira-rest-api-tutorials/jira-rest-api-example-create-issue

  • asArrayMultiSelect
  • asArrayMultiUserPicker (can be used to generate arrays for both: multi-user and multi-group field types)


myfield.asArray

myfield.asArrayMultiSelect

myfield.asArrayMultiUserPicker

[entry.myfield.asArray]

[entry.myfield.asArrayMultiSelect]

 [entry.myfield.asArrayMultiUserPicker]

asArray(separator)

FROM V. 1.35

Same as "asArray" without a parameter, but allows you to set own separator

Example:

asArray(') will wrap the values into list of 'v1', 'v2'...
asArray will do the same with default separator ", like this "v1", "v2"
asArray(_) will output _v1_, _v2_
myfield.asArray(separator)[entry.myfield.asArray(separator)]
asArrayOfIds

Same as the above, but exporting IDs of the multi-select values in the following format:

"1", "2"
myfield.asArrayOfIds[entry.myfield.asArrayOfIds]

asArrayOfKVPairs(key)

FROM V. 1.35

Will output the list of values in a format:

{"key":"value"}, {"key2": "value2"}

Useful for adding JIRA labels, like when giving a key as "add"

{"add": "value"}, {"add", "value2"}


replaceCRLFWithBR
Replaces CR/LF with <BR/> to show with line brakes in HTML (useful when you reference the textarea field using [entry.] notation)myfield.replaceCRLFWithBR[entry.myfield.replaceCRLFWithBR]
asUserFullNames
Works only with User multi-select fields and shows list of full names for selected usersmyfield.asUserFullNames[entry.myfield.asUserFullNames]
asUserEmails
Works only with User multi-select fields and shows list of emails for selected usersmyfield.asUserEmails[entry.myfield.asUserEmails]
asUserNames
Works only with User multi-select fields and shows list of usernames for selected usersmyfield.asUserNames[entry.myfield.asUserNames]
friendlyDate
Formatting date and date/time field types with https://docs.atlassian.com/confluence/latest/com/atlassian/confluence/core/datetime/FriendlyDateFormatter.htmlmyfield.friendlyDate[entry.myfield.friendlyDate]
asCount
Returns size of a collection for multi-value fields or number of chars for other typesmyfield.asCount[entry.myfield.asCount]
asSize
Returns size of a collection for multi-value fields or number of chars for other types (same as "count")myfield.asSize[entry.myfield.asSize]
asLength
Returns size of a collection for multi-value fields or number of chars for other typesmyfield.asLength[entry.myfield.asLength]
formatCurrency


Tries to format value as currency using either default or given format

https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

If value could not be formatted according to given format then value will be returned as is

Can be used with any number (and not only currency)

myfield.formatCurrency(JAVA_FORMAT)

myfield.formatCurrency()

(default decimal format is used if empty)

[entry.myfield.formatCurrency(JAVA_FORMAT)]

(no quotes, JAVA_FORMAT could be empty, default will be used)


[entry.myfield.formatCurrency(# ###.##)]

[entry.myfield.formatCurrency(# ###.00)]

formatNumber
alias to formatCurrency

myfield.formatNumber(JAVA_FORMAT)

myfield.formatNumber()

(default decimal format is used if empty)

[entry.myfield.formatNumber(JAVA_FORMAT)]

[entry.myfield.formatNumber(# ###.##)]

[entry.myfield.formatNumber(# ###.00)]

asFilteredBy(FILTER)

Very powerful function to extract the value by given filter (mostly used for multi-value fields).

Especially useful with Multi-select fields which are of type "smart fields", the ones referencing other forms and fields

Example:

You have one form which has a field called "mf" which holds multi-value references to another form which has the following fields: name, surname, position

Then... when showing the data from the first form you can actually show only specific choices.

For example:

  • entry.mf.asFilteredBy(name:Alex) - to show only persons selected with name Alex only (here "name" references a field in 2nd form)
  • entry.mf.asFilteredBy(surname:Ve*) - to show only persons selected with surnames starting with "Ve" only (here "surname" references a field in 2nd form)
  • entry.mf.asFilteredBy(position:CEO) - to filter OUT all those selected who are NOT in CEO position
entry.mf.asFilteredBy(FILTER)

Filter should be in a format:

property:filter

[entry.mf.asFilteredBy(name:Alex)]

The following filters are supported:

  • value*
  • *value
  • *value*
  • *
  • [empty]


trimAllSpaces

Removes all the spaces in the field value.

Can be used when creating page labels automatically from ConfiForms field values and want to ensure the value is taken as a label and not split by spaces into differenet labels

entry.myfield.trimAllSpaces[entry.myfield.trimAllSpaces]
camelCase
Makes a CamelCase string from a given valueentry.myfield.camelCase[entry.myfield.camelCase]
camelCaseAndTrim
Makes a CamelCase string from a given value and, additionally, removes all the spacesentry.myfield.camelCaseAndTrim[entry.myfield.camelCaseAndTrim]
addCRLFAdds CR and LF characters after the valueentry.addCRLF[entry.addCRLF]
addCRLFHtmlAdds <br/> (brake) after the value in HTML formatentry.addCRLFHtml[entry.addCRLFHtml]
trunc(NUMBER)Truncates the value. Leaves "n" first symbolsentry.trunc(100)[entry.trunc(100)]
trim(NUMBER)Trims the value, Skips "n" first symbolsentry.trim(10)[entry.trim(10)]

asAttachment

asAttachment(n)

You can reference a particular attachment stored in Confluence and linked though ConfiForms Field (either File or Attachment picker)

n - is the index of the attachment stored/linked using ConfiForms Field. Index starts with 0. When no index is specified, then the 1st attachment is taken (1st attachment is stored with index 0)

This means that

asAttachment = asAttachment(0)

This function is a "bridge" to get other properties of the attachment stored. See below.

entry.asAttachment

[entry.asAttachment]

[entry.asAttachment(0)]

[entry.asAttachment(1)]

asAttachment.base64

asAttachment(1).base64

Returns bas64 encoded string of the file contents in this attachmententry.asAttachment.base64

[entry.asAttachment.base64]

[entry.asAttachment(0).base64]

[entry.asAttachment(1).base64]

asAttachment.ANY_PROPERTY

asAttachment(n).ANY_PROPERTY


Where ANY_PROPERTY is the "get" methods of the class Attachment https://docs.atlassian.com/confluence/5.9.1/com/atlassian/confluence/pages/Attachment.html

Examples:

asAttachment.displayTitle
asAttachment.id
asAttachment.downloadPath
asAttachment.contentType 
 
and many other properties of the Attachment object
 
asAttachment(1).displayTitle - also perfectly valid and will try to get the display title for the attachment stored "second" in the field


asUsers

FROM V. 1.39.2

Converts multi-user / multi-owner (ownedBy field in ConfiForms) field values to list of user objects, which can be then transformed into the desired output as needed, for example:

ownedBy.asUsers.transform(email)

Any property of the User object (see below) is accessible




asUser.username

asUser.fullName

asUser.email

asUser(n).username

asUser(n).fullName

asUser(n).email

 When working with multi-select user control/field and want to get a particular user info

Only works with Multi-select user field!



asEntryRef(REF_TO_ENTRY)

Example:

[entry.id.asEntryRef(entry.id)]

This will return

[entry.id]

When this is necessary?

The use case is when you use it within an IFTTT or have a ListView which has another ListView inside and you want to prevent ConfiForms from applying the context variables onto the sub-lists


The function can be used with any field type (as long as the field exists) and actually the following constructions are perfectly valid

[entry.id.asEntryRef(entry.somefield)] will return [entry.somefield]
[entry.id.asEntryRef(entry.mytextfield)] will return [entry.mytextfield]
[entry.id.asEntryRef(entry.anotherfield)] will return [entry.anotherfield]
[entry.id.asEntryRef(entry.id)] will return [entry.id]


As you can see we apply the function on the same ID field (exists in every ConfiForms record) and the parameter you give in is the important bit in all this...

So, the parameter (PARAM) you give to asEntryRef is wrapped into the brackets and returned:

[PARAM]



asJSONConverts a value to JSON and allows to access JSON object properties

entry.myfield.asJSON.someJSONProperty

entry.myfield.asJSON.anotherJSONProperty


asUserProfile

Converts to User profile (or tries to, if a given field value can be resulved as a user object)

Available user profile properties (all standard ones, available in the profile) to reference are:

  • phone
  • im
  • website
  • position
  • department
  • location

entry.somefield.asUserProfile.phone

entry.somefield.asUserProfile.im

entry.somefield.asUserProfile.website

entry.somefield.asUserProfile.position

entry.somefield.asUserProfile.department

entry.somefield.asUserProfile.location


where "somefield" should get resolved into username (can be user field)

[entry.somefield.asUserProfile.phone]

[entry.somefield.asUserProfile.im]

[entry.somefield.asUserProfile.website]

[entry.somefield.asUserProfile.position]

[entry.somefield.asUserProfile.department]

[entry.somefield.asUserProfile.location]

asListExtracts values of a list and converts to a comma-separated string, see below for examples on transform and asList

asAttachments

Converts the file/attachment field values into the array of Attachment objects

https://docs.atlassian.com/confluence/5.9.1/com/atlassian/confluence/pages/Attachment.html



transform(property_name)

Converts the list of some objects into the list of values for the given property

For example:

[entry.myfile.asAttachments.transform(id)]

When "myfile" is a field of type file/attachment, a function "asAttachments" will convert it's values into the list of Attachments objects and then function "transform" will extract and "id" property of each Attachment object and will put it into the resulting list

[entry.myfile.asAttachments.transform(id).asList]

Same as in previous example, but we convert the otput into a comma separated list of attachment IDs

Below, is another example, which returns a result of ID's, but wrapped into quotes

[entry.myfile.asAttachments.transform(id).asArray]


Function "transform" can be used on a multi-value field.(on Multi-select fields, which hold the structure of ID and LABEL (properties "id" and "label")) See Accessing field values and properties and dropdown fields

For example, to get the list of dropdown IDs

[entry.mymultifield.transform(id)]

To get the list of dropdown labels

[entry.mymultifield.transform(label)]


To get the list of User's full names for multi-user field (User field has properties: fullName, username, email, lastName, firstname) See Accessing field values and properties

[entry.mymultiuserfield.transform(fullName)]

same as above, but in "coma-separated" string

[entry.mymultiuserfield.transform(fullName).asList]

Important!

Transform function also works with smart fields, and could transform the fields / values referenced from another form through the reference (a field) in your current form

See an example here: Using transform function with smart fields



add(number)

Adds a numeric value to a field (can substract as well, if a negative number is given)

[entry.somedatefield.timestamp.add(86400000)]

to add 1 day to the date (value of 86400000 is in milliseconds)

[entry.somedatefield.timestamp.add(-86400000)]

to add -1 day (substract a day) to the date (value of 86400000 is in milliseconds)




split(separator)

separator could be a space, like:

split( )

Split is an intermediate function to help you with transforming the string values into the arrays of strings, which then can be used with "array type" virtual functions

For example:

We have a field type called "mytextfield" and want it's content to be passed to JIRA as labels. For this we need to make sure we split the entered text by "space" and then use a corresponding virtual function to transform the object inti the desired representation

mytextfield.split( ).asArrayMultiSelect

Any other "array type" function can be applied. For example to get the count, one will write the following

mytextfield.split( ).asCount


hasChanged(fieldName)

FROM V. 1.36

Now you can easily understand if the field value has been changed or not. Can be used ONLY in IFTTT macro, in "condition" parameter. Only in this case, we have a previous snapshot of the data for this record. And the function is applied on the whole entry and not on the field.

Example in IFTTT macro:

The result of the function is a boolean, "true" is returned when the value for the field is different from current, and "false" is returned otherwise

Example:

hasChanged(somefield):true

or

hasChanged(somefield):true AND hasChanged(anotherfield):false

In addition to "hasChanged" function, ConfiForms has a support to get "previous state" of the record. And that is using a "virtual property" called: "_previousState"

Below example has the same result as "hasChanged(somefield):true"

!somefield:[entry._previousState.somefield]

This expression could be also used with IFTTT macro condition to determine if the value has been changed, but also allows you to create a more sophisticated filters like the one below:

hasChanged(mynum):true AND mynum:<[entry._previousState.mynum]

Checks if the value has been changed and if the previous value was bigger than current

This is available only in IFTTT and this also means that the synthetic property _previousState is available for you to us ein filters

For example - we want to run another IFTTT when the record status has changed from one value to another

(when "MyStatus" status field has changed it's value and the value was changed from "requested" to "development")

hasChanged(MyStatus):true AND MyStatus:development AND _previousState.MyStatus:requested






asUserLink

asUserLinks (same as above, but works on user multiselect fields)

FROM V. 1.36.3

Also, there is a function which renders it as a macro: useful for usage withing a template or LIstView/CalendarView

asUserLinkMacro

Generates a macro

<ac:link><ri:user ri:userkey="USER_KEY_HERE"></ac:link>

and renders the HTML out of it

USER_KEY_HERE is looked up by function based on the username given
 entry.myfield.asUserLink

[entry.myfield.asUserLink]

on multi-select user fields use

[entry.myfield.asUserLinks]

asLink

FROM V. 1.37.1

asLinks

FROM V. 1.38

asLink(Some label)

FROM V. 1.44

Returns value as HTML link (<a href="VALUE">VALUE</a>)

Also, for collections: function "asLinks"

 entry.myfield.asLink

entry.myfield.asLink(I am a link label)

[entry.myfield.asLink]

[entry.myfield.asLink(I am a label)]

acLink

acLinkMacro

Renders a link to local resource

acLinkMacro functions generates a macro only (without rendering to HTML)

<ac:link><ri:page ri:content-title="SPACEKEy:PAGE_TITLE"/></ac:link>




parseDate(FORMAT)

FROM V. 1.36.6

Tries to format date fields in the specified format, expects date format as in http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html


Example on how to parse and format a date from JIRA issue

jirakey.fields.created.parseDate(yyyy-MM-dd'T'HH:mm:ss.SSSZ).formatDate(yyyy-MM-dd)

In this example we have a field called "jirakey" in ConfiForms Form, and access a property "created" from JIRA issue.

Then we parse the created date, using the format JIRA uses when returning the date/time field via REST API and then we format the date using another virtual function called "formatDate" to show it as year-month-day only

entry.myfield.parseDate(JAVA_FOMAT)

[entry.myfield.parseDate(JAVA_FOMAT)]

Returns a timestamp, which you can transform to date using formatDate function or use as a filtering criteria

join

FROM V. 1.38

You can join the field values into one string. Works best on multi-select fields


Form example (expect a field to be a multi-select field here):

id:[entry.mymultifield.transform(id).join( OR id:)]

Will extract the ID's from a record stored, and then join (concatenate) those ID's into one string, separated by OR id:

Something like this (when mymultifield contains 2 items):

id:1234-5678-9000-1234-5678-9000 OR id:1234-5678-9000-1234-5678-9001
entry.myfield..join(SOME VALUE)[entry,myfield.join(, Hello: )]

asJIRAIssue

FROM V. 1.40

Helps you to transform the values of a "JIRA Issues multi-select" field into a JIRA objects to allow access to any property/field of the JIRA issue

entry.myfield.asJIRAIssue.key

entry.myfield.asJIRAIssue.fields.customfield_x

Any property from JIRA issue, See Accessing field values and properties for JIRA field type

asInsightObject

FROM V. 1.49.1

Helps you to transform the values of a "Insight Objects multi-select" field into a list of Insight Objects, which can be then transformed via "transform" function or properties can be accesssed directy

asPage

FROM V. 1.40

Helps you to transform the values saved to Page objects when used on Page/BlogPosts multi-select fieldentry.myfield.asPage.spaceKeyAny property from a Page object, see Accessing field values and properties

userInSecurityGroup

securityGroupHas

FROM V. 1.40

Both functions allow you to check if a particular user belongs to a given security group or not

Examples:

If field "u" is holding a username and we want to check if this user belongs to "confluence-administrators" group

u.userInSecurityGroup(confluence-administrators)

If field "sg" holds a name of a security group and we want top check if a username is in this security group

sg.securityGroupHas(sash)

In the example below we check the same, but for currently logged in user

sg.securityGroupHas()

Both functions return "true" when condition is matched and "false" otherwise

(without quotes)


This means that if you need to put a filter to check the condition, the full expression will look like:

u.userInSecurityGroup(confluence-administrators):true

or

sg.securityGroupHas():true


get(index)

FROM V. 1.42.4

Using get() without an index will return the last item from the list

FROM V. 1.44.2

Get's the element by index form a multi-value field

To get the first element (index starts from 0)

somefield.get(0)

Another example with chaining the functions (when somefield holds a string value and we split it by "," and get the first element)

somefield.split(,).get(0)


append

FROM V. 1.43

Appends text to a value

Will append a space to the value of "somefield"

somefield.append( )

For multi-select dropdown, adding space after transformation and shows in as html link

somefield.transform(label.append()).asLinks


prepend

FROM V. 1.45.2

Prepends text to a value

Will append a space to the value of "somefield"

somefield.prepend(SOME TEXT HERE)


lowerCase

FROM V. 1.44.2

Returns a lowercases value for the field

upperCase

FROM V. 1.44.2

Returns a uppercased value for the field

formatLinks

FROM V. 1.45.2

Tries to format the http(s) links found in the text as HTML links

somefield.formatLinks


greenhopperAsJSON

FROM V. 1.45.3

Tries to parse the fiedl value returned by JIRA API for greenhopper fields

com.atlassian.greenhopper.service.sprint.Sprint@71f1f2ae[id=6745,rapidViewId=2391,state=ACTIVE,name=My Sprint 2,startDate=2017-08-29T10:46:33.923+01:00,endDate=2017-09-08T10:46:00.000+01:00,completeDate=<null>,sequence=6745]

to a structure you can access via properties

id=6745
rapidViewId=2391
state=ACTIVE
name=My Sprint 2
startDate=2017-08-29T10:46:33.923+01:00
endDate=2017-09-08T10:46:00.000+01:00
completeDate=
sequence=6745

Example (to return a sprint name)

myJIRAField.fields.customfield_10900.greenhopperAsJSON.name


asIFTTTRef(RESULT_NAME_AND_MORE)

FROM V. 1.47.2

The idea and the need for this function is the same as described for function asEntryRef(REF_TO_ENTRY)

This allows you to "escape" the ${IftttResult_NAME.someproperty} into a function to workaround template evaluations against the current record. Useful when your ConfiForms Form creates a page with another ConfiFormiForms Form and that form has various rules using iftttResults or entry.fieldnames


entry.id.asIFTTTRef(MYRESULT.id) will produce ${iftttResult_MYRESULT.id}


entry.id.asIFTTTRef(MYRESULT) will produce ${iftttResult_MYRESULT}


asUserProfileLink

FROM V. 1.48

Outputs a field value as a link to user profile (with avatar and full name). The field must have a username as a value

[entry.myfieldholdingusername.asUserProfileLink]


replaceAccents

replaceAccents()

FROM V. 1.48.2

Replaces the following accents letters using the folllwing mapping

"Ä" -> "Ae"
"Æ" -> "Ae"
"ä" -> "ae"
"æ" -> "ae"
"Ö" -> "Oe"
"ö" -> "oe"
"Ü" -> "Ue"
"ü" -> "ue"
"ß" -> "ss"
"ó" -> "o"
"ú" -> "u"
"Ç" -> "C"
"ç" -> "c"
"í" -> "i"
"Ñ" -> "N"
"ñ" -> "n"
"À" -> "A"
"Â" -> "A"
"à" -> "a"
"â" -> "a"
"È" -> "E"
"É" -> "E"
"Ê" -> "E"
"è" -> "e"
"é" -> "e"
"ê" -> "e"
[entry.myfield.replaceAccents]


replaceWith(searchstring,replacewith)

FROM V. 1.48.2

Replaces every value matching "search string" in a field with given "replace with" value

[entry.myfield.replaceWith(hi,hola)]

Will match every "hi" and replace it with "hola"





If entry value is null or could not be formatted according to rules then value is returned as-is 

See also Accessing field values and properties. You can use complex properties in your filters. For example filtering dropdown fields by values and by labels, filtering page type fields by page metadata fields, filtering user fields by, for example - email property


It is important to understand that it is absolutely possible to combine virtual functions WITH field properties


(JAVA_FORMAT)

  • No labels