Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Introduction

What are Hash Variables?

...

English

Hash variables in Joget are placeholders used to dynamically display data within applications. They allow users to insert dynamic content without hardcoding values, which enhances flexibility and customization. Hash variables can fetch and display data from various sources such as forms, workflows, and the system itself. They promote customization and flexibility by avoiding hardcoded values, ultimately improving the user-friendliness of Joget applications.

A hash variable is a special hash-escaped keyword that can be used in :

...

NameDescription
PrefixuserviewKey
Description

Userview Key Hash Variable is used solely for the purpose of accessing the current UI key's value.

Typical use case for this hash variable are:-

  • Filtering a List based on UI Key.
  • Preloading certain form data field (e.g. subform) in a Form or Form part of a process flow based on UI Key.
Attributes
  • #userviewKey#
Scope of Use

Workflow Variable Hash Variable

...

NameDescription
Prefixdatalist
DescriptionTo display the List records in a grid format in your form or email tool.
Attributes
  • #datalist.html.ID#
  • #datalist.csv.ID#
  • #datalist.json.ID#
  • #datalist.size.ID# = Size returns only the number of records based on Datalist filter.
  • #datalist.total.ID# = Total returns the record count regardless of Datalist filter.
  • #datalist.col.csv.ID.column#
  • #datalist.col.sum.ID.column#
  • #datalist.col.avg.ID.column#
  • #datalist.col.csv.ID.column[FILTER_PARAMETERS]#
  • #datalist.col.sum.ID.column[FILTER_PARAMETERS]#
  • #datalist.col.avg.ID.column[FILTER_PARAMETERS]#
  • #datalist.html.ID[FILTER_PARAM1=FILTER_VALUE1&FILTER_PARAM2=FILTER_VALUE2]#
  • #datalist.csv.ID[FILTER_PARAM1=FILTER_VALUE1&FILTER_PARAM2=FILTER_VALUE2]#
  • #datalist.json.ID[FILTER_PARAM1=FILTER_VALUE1&FILTER_PARAM2=FILTER_VALUE2]#
  • #datalist.size.ID[FILTER_PARAM1=FILTER_VALUE1&FILTER_PARAM2=FILTER_VALUE2]#
  • #datalist.total.ID[FILTER_PARAM1=FILTER_VALUE1&FILTER_PARAM2=FILTER_VALUE2]#
Scope of Use
  • All components within the App.
Sample Attributes
  • #datalist.html.myDataList#
  • #datalist.csv.ImyDataList#
  • #datalist.col.sum.list_f1.column_0#
  • #datalist.size.ImyDataList# = Size returns size.ImyDataList# = Size returns only the number of records based on Datalist filter.
  • #datalist.total.ImyDataList# = Total returns the record count regardless of Datalist filter.
  • #datalist.html.myDataList[d-8015999-fn_name=James&d-6304176-fn_email=james@gmail.com]#
  • #datalist.csv.myDataList[d-8015999-fn_name=James&d-6304176-fn_email=james@gmail.com]#
  • #datalist.size.myDataList[d-8015999-fn_name=James&d-6304176-fn_email=james@gmail.com]#
  • #datalist.total.myDataList[d-8015999-fn_name=James&d-6304176-fn_email=james@gmail.com]#
  • #datalist.html.list_f1[d-1338250-fn_id={process.recordId}]#
  • #datalist.html.listId[filterId={form.table.field[{envVariable.variableId}]}]#

Expression Hash Variable


** for "datalist.col.xx.ID.column" variables, the "column" parameter refers to the order of the column in the list starting from 0. hence, to refer to the first column in a list called list_f1, your hash variable would look like this : #datalist.col.sum.list_f1.column_0
** the column are counted from 0, and does not include the default checkbox included in list tables

Expression Hash Variable

NameDescription
Prefixexp
DescriptionMathematical and string operations on hash variables
Attributes#exp.variable#
Scope of Use
  • All components within the App.
Sample Attributes

Testing Values

  • #envVariable.num1# = 55
  • #envVariable.num2# = 288
  • #envVariable.double1# = 123.45
  • #envVariable.double2# = 246.78
  • #envVariable.bool1# = true
  • #envVariable.bool2# = false
  • #envVariable.str1# = Hello World!
  • #envVariable.str2# = Using Joget Hash Variables!
  • #envVariable.empty# =
  • #envVariable.hashVariable# = #assignment.processId#

Mathematical

NameDescription
Prefixexp
DescriptionMathematical and string operations on hash variables
Attributes#exp.variable#
Scope of Use
  • All components within the App.
Sample Attributes

Testing Values

  • #envVariable.num1# = 55
  • #envVariable.num2# = 288
  • #envVariable.double1# = 123.45
  • #envVariable.double2# = 246.78
  • #envVariable.bool1# = true
  • #envVariable.bool2# = false
  • #envVariable.str1# = Hello World!
  • #envVariable.str2# = Using Joget Hash Variables!
  • #envVariable.empty# =
  • #envVariable.hashVariable# = #assignment.processId#

Mathematical operators

  • #exp.{envVariable.num1} + {envVariable.num2}# = 343
  • #exp.{envVariable.num1} - {envVariable.num2}# = -233
  • #exp.{envVariable.double1} * {envVariable.double2}# = 30464.991
  • #exp.{envVariable.num2} / {envVariable.num1}# = 5
  • #exp.{envVariable.num1} % 7# = 6
  • #exp.({envVariable.num1} + 2) * 2# = 114
  • #exp.{envVariable.num1} + 2 * 2# = 59
  • #exp.2 ^ 2# = 4

Logical operators

  • #exp.{envVariable.bool1num1} and + {envVariable.bool2num2}# = false343
  • #exp.{envVariable.bool1num1} or - {envVariable.bool2num2}# = true-233
  • #exp.!.{envVariable.double1} * {envVariable.bool1double2}# = false

Relational operators

  • 30464.991
  • #exp.#{envVariable.num1num2} gt / {envVariable.num2num1}# = false5#
  • #exp.{envVariable.num1} ge % 7# = 6
  • #exp.({envVariable.num1} # = true#+ 2) * 2# = 114
  • #exp.{envVariable.num1} + 2 * 2# = 59
  • #exp.2 ^ 2# = 4

Logical operators

  • #exp. lt {envVariable.num2}# = true#{envVariable.num1bool1} le and {envVariable.num1bool2}# = truefalse#
  • #exp.{envVariable.bool1} or {envVariable.bool2}# = true
  • #exp.!{envVariable.bool1}# = false

Relational operators

  • #{envVariable.num1} gt {envVariable.num2}# = false
  • #{envVariable.num1} ge {envVariable.num1}# = true
  • #{envVariable.num1} lt {envVariable.num2}# = true
  • #{envVariable.num1} le {envVariable.num1}# = true
  • #{envVariable.num1} num1} eq {envVariable.num1}# = true
  • #{envVariable.num1} ne {envVariable.num1}# = false

Ternary Operator (If Else)

  • #exp.({envVariable.num1} lt {envVariable.num2})?{envVariable.num1}:{envVariable.num2}#= 55
  • #exp.'{envVariable.empty?expression}'.isEmpty()?'empty':'has value'#= empty

String methods

Note: Basically most of the String methods can be used, using `?expression` to escape single quote in value.

  • #exp.'{envVariable.str1?expression}' + ' ' + '{envVariable.str2?expression}'# = Hello World! Using Joget Hash Variables
  • #exp.'{envVariable.str1?expression}'.substring(5)# = World!
  • #exp.'{envVariable.str1?expression}'.toLowerCase()# = hello world!
  • #exp.'{envVariable.str1?expression}'.toUpperCase()# = HELLO WORLD!
  • #exp.'{envVariable.str1?expression}'.replace('world', 'there')# = Hello World!
  • #exp.'{envVariable.str1?expression}'.replaceFirst('[a-z]', '*')# = H*llo World!
  • #exp.'{envVariable.str1?expression}'.replaceAll('[a-z]', '*')# = H**** W****!
  • #exp.'{envVariable.str1?expression}'.charAt(0)# = H
  • #exp.'{envVariable.str1?expression}'.contains('World')# = true
  • #exp.'{envVariable.str1?expression}'.equalsIgnoreCase('{envVariable.str1?expression}'.toLowerCase())# = true
  • #exp.'{envVariable.empty?expression}'.isEmpty()# = true
  • #exp.'{envVariable.str1?expression}'.indexOf('World')# = 6
  • #exp.'{envVariable.str1?expression}'.lastIndexOf('World')# = 6
  • #exp.'{envVariable.str1?expression}'.startsWith('H')# = true
  • #exp.'{envVariable.str1?expression}'.endsWith('!')# = true

Custom Methods

  • #exp.$isParsed('{envVariable.hashVariable}')# = false

Math methods

Note: All java.lang.Math methods can be used.

  • #exp.$sin(30)# = -0.9880316240928618
  • #exp.$cos(30)# = 0.15425144988758405
  • #exp.$tan(30)# = -6.405331196646276
  • #exp.$asin(30)# = NaN
  • #exp.$acos(30)# = NaN
  • #exp.$atan(30)# = 1.5374753309166493
  • #exp.$sinh(30)# = 5.343237290762231E12
  • #exp.$cosh(30)# = 5.343237290762231E12
  • #exp.$tanh(30)# = 1.0
  • #exp.$abs(-7)# = 7.0
  • #exp.$max(60,30)# = 60.0
  • #exp.$min(60,30)# = 30
  • #exp.$round(79.52)# = 80
  • #exp.$sqrt(12)# = 3.4641016151377544
  • #exp.$cbrt(81)# = 4.326748710922225
  • #exp.$pow(4, 2)# = 16.0
  • #exp.$signum(82.7)# = 1.0
  • #exp.$ceil(82.7)# = 83.0
  • #exp.$copySign(740.4, -29.1)# = -740.4
  • #exp.$nextAfter(84352.24, 154.284)# = 84352.234
  • #exp.$nextUp(744.93)# = 744.93005
  • #exp.$nextDown(744.93)# = 744.9299999999998
  • #exp.$floor(744.93)# = 744.0
  • #exp.$floorDiv(25, 3)# = 8
  • #exp.$random()# = 0.3988245190916774
  • #exp.$rint(81.68)# = 82.0
  • #exp.$hypot(8, 6)# = 10.0
  • #exp.$ulp(8.1)# = 9.536743E-7
  • #exp.$getExponent(50.45)# = 5
  • #exp.$IEEEremainder(387.1, 4.2)# = 0.7000000000000064
  • #exp.$addExact(469, 737)# = 1206
  • #exp.$subtractExact(469, 737)# = -268
  • #exp.$multiplyExact(469, 737)# = 345653
  • #exp.$incrementExact(674)# = 675
  • #exp.$decrementExact(674)# = 673
  • #exp.$negateExact(674)# = -674
  • #exp.$toIntExact(-829)# = -829
  • #exp.$log(38.9)# = 3.6609942506244004
  • #exp.$log10(38.9)# = 1.5899496013257077
  • #exp.$log1p(26)# = 3.295836866004329
  • #exp.$exp(2)# = 7.38905609893065
  • #exp.$expm1(2)# = 6.38905609893065
  • #exp.$toDegrees(5)# = 286.4788975654116
  • #exp.$toRadians(180.0)# = 3.141592653589793

...

NameDescription
PrefixuiListCount
Description

The uiListCount hash variable is primarily utilized to retrieve the Datalist or Inbox menu count value.

Attributes
  • #uiListCount.MENU_ID#
  • #uiListCount.UI_ID.MENU_ID#

The uiListCount hash variable is primarily utilized to retrieve the Datalist or Inbox menu count value.

Attributes
  • #uiListCount.MENU_ID#
  • #uiListCount.UI_ID.MENU_ID#
Scope of Use
  • All components within the App except UI Permission.
Warning

uiListCount cannot be used inside UI permission. This is due to:
1. UI permission contains a uiListCount hash variable
2. uiListCount Hash requires UI to load to get the count
3. In order to load the UI design,  the UI permission will be called. It goes back to step 1.
(Will cause an infinite recursion that eventually returns a StackOverflow exception error :

 ERROR 15 May 2024 09:27:20 org.apache.jsp.WEB_002dINF.jsp.error500_jsp - Handler dispatch failed; nested exception is java.lang.StackOverflowError2org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError
Caused by: java.lang.StackOverflowError

Scope of UseAll components within the App.



Sample Attributes

See examples below, based on the usage within the default CRM application:

  • #uiListCount.MENU_ID# where MENU_ID is the id of the menu in your Userview for Datalist or Inbox (Example usage: "#uiListCount.proposal_inbox_list#")
  • #uiListCount.UI_ID.MENU_ID# where UI_ID is the id of the Userview (Example usage: "#uiListCount.crm_userview_sales.proposal_inbox_list#")

...

Download Demo App

View file
nameAPP_demo_hash_variable_demo_dx8_kb.jwa
height150