Blog

JWT Release Notes 2.9.3

Compatibility

  • Added support for Jira 8.12

Improvements

  • Access the internal ID of your Jira projects by using projectIDFromKey() either as a field code or parser function
  • Access the sprint completion date through a brand new field code 
  • The function usersWithEmail() now ignores the case which makes it easier to find the users you are looking for
  • Smart improvements in terms of logging and security

Bug fixes

  • The function timeInStatus() returned wrong results in case an issue was never transitioned
  • The functions fieldHistory() and previousValue() returned unexpected results for user picker fields
  • Improvements to the Automation Rules configuration

Find more release notes in our Version History section.

JWT Release Notes 2.9.2

Bug fixes

  • Expression parser fields were broken in 2.9.1 when editing some workflow functions



Find more release notes in our Version History section.

JWT Release Notes 2.9.1

Improvements

  • Extended support for Botron's Configuration Manager, now including versions, components and custom field options
  • The child level of cascading selects fields is now validated as required only when there are child options available
  • Added warning in case of configuring self-referencing expressions in calculated custom fields
  • Minor UI updates

Bug fixes

  • The selected transition could be cleared unintentionally when editing a Transition issues post function
  • Parent fields were not avaible in the Field Changed Event trigger 

Find more release notes in our Version History section.

Direct download from Marketplace  

"Building the best processes to support your teams."

- Automation rules are now available within Jira Workflow Toolbox -




A year ago we released our app Automation Toolbox to not only enable you to automate your daily work in Jira workflows but also match your business processes with automation rules listening to Jira's various events like field, issue, project, and system events.

With the release of Jira Workflow Toolbox 2.9.0, Automation Toolbox will become an integral part of Jira Workflow Toolbox because we decided you should not need two apps for one common goal: Building the best processes to support your teams.

But it is not just a merge... it's a match!

With the merge of the two products, Jira Workflow Toolbox has become the complete automation solution for your Jira on Server and Data Center platforms. The name remains the same, but now you can go way beyond your Jira workflows.



New features

Improvements

  • A Get started page was added to serve as a central hub for accessing all JWT-related functions
  • An option to suppress the default Jira email subject prefix was added to the Send an email post function 


Bug fixes

  • Setting components did not work properly when using special characters within component names
  • Cascading select list field names were not resolved correctly within our view screens
  • Post functions using the Target issue parameter could result in corrupt snapshots for Botron's Configuration Manager for Jira
  • The Field required or changed validator did not show the red asterisk for certain field types
  • The Transition issues post function lost certain parameters when it was being edited

Find more release notes in our Version History section.

JWT Release Notes 2.8.1

New features

  • Added RUN_AS_LANG as a new language parameter to the expression parser
  • Added RUN_AS_LOCAL as a new time zone parameter to the expression parser

Bug fixes

  • The Send an email post function did not include zip files attached during the transition
  • The Assign to Project Role post function was always executed by the current user
  • The Assign to Project Role post function didn't work properly when selecting Last user or Previous user in project role
  • The timeInStatus function returned negative values if the initial status was changed in the workflow
  • The Epic Link field could not be edited inline within the 3rd party app Structure by ALM Works
  • Adding a Transition issue post function caused problems in case the status or transition selection was not changed

Find more release notes in our Version History section.

JWT Release Notes 2.8.0

New features

  • Added support for Botron's Configuration Manager for Jira (see our documentation)
  • Added support for Jira 8.6.x

Bug fixes

  • The Fields required or changed validator did not work properly when using version fields after upgrading to JWT version 2.7.1
  • Jira Service Desk approval emails did not work properly when using JWT-related post functions on the transition to the approval step

Find more release notes in our Version History section.

JWT Release Notes 2.7.1


Direct download from Marketplace  

Bug fixes

  • The function dateTimeToString() generated an error
  • All functions returning users now exclude inactive users
  • Conditions based on JQL expressions did not work properly when a query included an ORDER BY clause
  • Multi-level cascading select fields from Sourcesense (3rd party app) could not be set
  • The red asterisk in the Fields required or changed validator was not shown for some fields
  • Fields required or change validator did not work properly for fields including a comma in their names
  • Message to show at failed validation in validators was not shown next to the specified field in the create transition
  • Performance improvements for the timeInStatus() function
  • Conditions Only users in a field/Except users in field evaluated against the changed issue instead of the original issue

Find more release notes in our Version History section.

JWT Release Notes 2.7.0

Direct download from Marketplace  

"Small step for a validator, giant leap for Jira users"

- Show a red asterisk * and a custom error message next to fields that are only required in a specific transition -







New features

  • The Field is/isn't initialized validator was renamed to Fields required or changed
  • The Field is/isn't initialized condition was renamed to Fields required
  • The Fields required or changed validator and the Fields required condition can now validate multiple fields
  • The field/s configured as required in the Fields required or changed validator is/are marked with an asterisk (*) in the transition screen

Improvements

  • An optional delayed execution was added to the Move issues post function
  • In the Send mail post function all the inactive users and email addresses with an incorrect format are filtered out  


Bug fixes

  • A Null-Pointer Exception was thrown in the Create issues post function while copying options from deleted custom fields
  • The addDaysSkippingWeekends function ran into a timeout for large numbers
  • The selected issue type was not set in the corresponding select element while editing a Move issues post function
  • The Move issues post function produced corrupt issues when the status was changed without changing the workflow
  • The Field is/isn't initialized or has/hasn't been modified validator did not work properly for text fields with multiple lines in Chrome browser
  • The Move issues post function used to move an issue to a selected project with a retained issue type even though that issue type was not available in the target project

Find more release notes in our Version History section.

JWT Release Notes 2.6.2


Direct download from Marketplace  

Bug fixes

  • Last comment's visibility restrictions did not return the Service Desk visibility of a transition comment
  • Value type Standard did not work properly when setting fields in the Create issues post function
  • Disabling and enabling the app could produce a "Service proxy has been destroyed" error


Find more release notes in our Version History section.

JWT Release Notes 2.6.1

Direct download from Marketplace  

Bug fixes

  • Setting Clear field value as value type in distinct post functions did not work properly for version and component fields
  • Post functions stopped executing when trying to access a non-existent (e.g. deleted) custom field
  • Executing Jira Workflow Toolbox post functions via the Workflow Enhancer for Jira app did not work properly

Find more release notes in our  Version History section .

JWT Release Notes 2.6.0

Direct download from Marketplace  

Improvements

  • The Move issues post function now supports parsed text to be used to determine target project, issue type and status selection
  • The Move issues post function now shows custom error message on the screen when issues can't be moved due to incompatibility
  • The expression parser and the field injector now support the Resolution Date
  • The Send an Email post function now supports mixed parsing mode when using personalized mode

New expressions in the parser

Function Returned Value 
setBoolean(string variable_name, boolean value) : boolean

Creates a variable named variable_name for storing a boolean value, and assigns it a value, which is also returned in order to be used within an expression.

Example: setBoolean("myBoolean",true)

getBoolean(string variable_name) : boolean

Returns the value stored in a boolean variable named variable_name, which was previously created using the setBoolean() function.

Example: getBoolean("myBoolean")

setNumber(string variable_name, number value) : number

Creates a variable named variable_name for storing a number, and assigns it a value, which is also returned in order to be used within an expression.

Example: setNumber("myNumber",100)

getNumber(string variable_name) : number

Returns the value stored in a numeric variable named variable_name, which was previously created using the setNumber() function.

Example: getNumber("myNumber")

setString(string variable_name, string value) : string

Creates a variable named variable_name for storing a string, and assigns it a value, which is also returned in order to be used within an expression.

Example: setString("myString","Hello World!")

getString(string variable_name) : string

Returns the value stored in string variable named variable_name, which was previously created using the setString() function.

Example: getString("myString")

setNumberList(string variable_name, number list value) : number list

Creates a variable named variable_name for storing a number list, and assigns it a value, which is also returned in order to be used within an expression.

Example: setNumberList("myNumberList",[1,2,3])

getNumberList(string variable_name) : number list

Returns the value stored in number list variable named variable_name, which was previously created using the setNumberList() function.

Example: getNumberList("myNumberList")

setStringList(string variable_name, string list value) : string list

Creates a variable named variable_name for storing a string list, and assigns it a value, which is also returned in order to be used within an expression.

Example: setStringList("myStringList",["Hello","World"])

getStringList(string variable_name) : string list

Returns the value stored in string list variable named variable_name, which was previously created using the setStringList() function.

Example: getStringList("myStringList")

setIssueList(string variable_name, issue list value) : issue list

Creates a variable named variable_name for storing an issue list, and assigns it a value, which is also returned in order to be used within an expression.

Example: setIssueList("myIssueList",["KEY-1","KEY-2"])

getIssueList(string variable_name) : issue list

Returns the value stored in issue list variable named variable_name, which was previously created using setIssueList() function.

Example: getIssueList("myIssueList")

weekOfTheYear(number t, number firstDayOfTheWeek, number minimalDaysInFirstWeek, timeZone time_zone) : number

Returns the week of the year of the date-time t in a certain time_zone. The parameter firstDayOfTheWeek represents the first day of the week, e.g.: {SUNDAY} in the U.S., and {MONDAY} in Germany. The parameter minimalDaysInFirstWeek represents the minimal number of days required in the first week of the year, e.g., if the first week is defined as the one that contains the first day of the first month of the year, value 1 should be used. If the minimal number of days required must be a full week (e.g. all days of the week need to be in that year), value 7 should be used.

Example: weekOfTheYear(2023/01/03, {SUNDAY}, 1, LOCAL) returns 1.

Example: weekOfTheYear(2023/01/03, {MONDAY}, 1, LOCAL) returns 2.

Example: weekOfTheYear(2023/01/03, {MONDAY}, 7, LOCAL) returns 1.

dayOfTheYear(number t, timeZone time_zone) : number

Returns the day of the year of date-time in a certain time_zone, e.g. for January 1st the value returned will be 1.

Example: dayOfTheYear(2019/02/01, LOCAL) returns 32

timeInValue(string field field, boolean expression predicate) : number

Returns the number of milliseconds a string field with code %{nnnnn} of the current issue has had a value satisfying a boolean expression predicate, where the string value of the field with code %{nnnnn} is represented by ^%.

Example: timeInValue(%{00000}, ^% ~~ "ERROR" OR ^% ~~ "WARNING") returns the number of milliseconds the field summary (field code %{00000}) of the current issue has contained any of the words "ERROR" or "WARNING", ignoring the case.

Example: timeInValue(%{00094}, count(toStringList(^%, ",")) > 1) returns the number of milliseconds the field components (field code %{00094}) of the current issue has contained more than one selected component.

Example: timeInValue(%{00017}, ^% in ["Critical", "High"]) returns the number of milliseconds the field priority (field code %{00017}) of the current issue has had a value of Critical or High.

timeInValue(number field field, boolean expression predicate) : number

Returns the number of milliseconds a number or date-time field with code {nnnnn} of the current issue has had a value satisfying a boolean expression predicate, where the numeric value of the field with code {nnnnn} is represented by ^.

Example: timeInValue({00012}, ^ != null) returns the number of milliseconds the field Due date (field code {00012}) of the current issue has had a value.

Example: timeInValue({10001}, ^ >= 5 AND ^ <= 10) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) of the current issue has remained between 5 and 10.

Example: timeInValue({10001}, modulus(^, 2) = 0) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) of the current issue has had an even value (2, 4, 6,...).

timeInValue(string field field, issue list issues, boolean expression predicate) : number

Returns the sum of milliseconds a string field with code %{nnnnn} has had a value satisfying a boolean expression predicate in distinct issues, where the string value of the field with code %{nnnnn} is represented by ^%.

Example: timeInValue(%{00000}, subtasks(), ^% ~~ "ERROR" OR ^% ~~ "WARNING") returns the sum of milliseconds the field summary (field code %{00000}) of all sub-tasks of the current issue have contained any of the words "ERROR" or "WARNING", ignoring the case.

Example: timeInValue(%{00094}, epic(), count(toStringList(^%, ",")) > 1) returns the number of milliseconds the field components (field code %{00094}) in a linked Epic issue have contained more than one selected component.

Example: timeInValue(%{00017}, filterByIssueType(linkedIssues(), "Bug, New Feature"), ^% in ["Critical", "High"]) returns the sum of milliseconds all linked Bugs and New Features of the current issue have had a priority (field code %{00017}) value of Critical or High.

timeInValue(number field field, issue list issues, boolean expression predicate) : number

Returns the sum of milliseconds a number or date-time field with code {nnnnn} has had a value satisfying a boolean expression predicate in distinct issues, where the numeric value of the field with code {nnnnn} is represented by ^.

Example: timeInValue({00012}, subtasks(), ^ != null) returns the number of milliseconds the field Due Date (field code {00012}) of all sub-tasks of the current issue has had a value.

Example: timeInValue({10001}, epic(), ^ >= 5 AND ^ <= 10) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) of an Epic issue has had a value between 5 and 10.

Example: timeInValue({10001}, filterByIssueType(linkedIssues(), "Bug, New Feature"), modulus(^, 2) = 0) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) has had an even value in any linked Bug or New Feature.

timeInValue(string field field, boolean expression predicate, string schedule_name, timeZone time_zone) : number

Returns the number of milliseconds a string field with code %{nnnnn} of the current issue has had a value satisfying a boolean expression predicate, where the string value of the field with code %{nnnnn} is represented by ^%. The time being calculated by this function is only counted during a defined schedule with name schedule_name for timeZone time_zone

Example: timeInValue(%{00000}, ^% ~~ "ERROR" OR ^% ~~ "WARNING", "my_schedule", LOCAL) returns the number of milliseconds the field summary (field code %{00000}) of the current issue has contained any of the words "ERROR" or "WARNING", ignoring the case, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue(%{00094}, count(toStringList(^%, ",")) > 1, "my_schedule", LOCAL) returns the number of milliseconds the field components (field code %{00094}) of the current issue has contained more than one selected component, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue(%{00017}, ^% in ["Critical", "High"], "my_schedule", LOCAL) returns the number of milliseconds the current issue has had a priority value of Critical or High (field code %{00017}), within a schedule named my_schedule for the server's default time_zone.

timeInValue(number field field, boolean expression predicate, string schedule_name, timeZone time_zone) : number

Returns the number of milliseconds of a number or date-time field with code {nnnnn} of the current issue has had a values satisfying a boolean expression predicate, where the numeric value of the field with code {nnnnn} is represented by ^. The time being calculated by this function is only counted during a defined schedule with name schedule_name for timeZone time_zone.

Example: timeInValue({00012}, ^ != null, "my_schedule", LOCAL) returns the number of milliseconds the field Due Date (field code {00012}) of the current issue has had a value, ignoring the case, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue({10001}, ^ >= 5 AND ^ <= 10, "my_schedule", LOCAL) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) of the current issue has had a value between 5 and 10, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue({10001}, modulus(^, 2) = 0, "my_schedule", LOCAL) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) in current issue has had an even value, within a schedule named my_schedule for the server's default time_zone.

timeInValue(string field field, issue list issues, boolean expression predicate, string schedule_name, timeZone time_zone) : number

Returns the sum of milliseconds a string field with code %{nnnnn} has had a value satisfying a boolean expression predicate in distinct issues, where the value of the field with code %{nnnnn} is represented by ^%. The time being calculated by this function is only counted during a defined schedule with name schedule_name for timeZone time_zone.

Example: timeInValue(%{00000}, subtasks(), ^% ~~ "ERROR" OR ^% ~~ "WARNING", "my_schedule", LOCAL) returns the sum of milliseconds the fields summary (field code %{00000}) of all sub-tasks of the current issue have contained any of the words "ERROR" or "WARNING", ignoring the case, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue(%{00094}, epic(), count(toStringList(^%, ",")) > 1, "my_schedule", LOCAL) returns the number of milliseconds the field components (field code %{00094}) in the linked Epic issue has contained more than one selected component, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue(%{00017}, filterByIssueType(linkedIssues(), "Bug, New Feature"), ^% in ["Critical", "High"], "my_schedule", LOCAL) returns the sum of milliseconds all linked Bugs and New Features of the current issue have had a priority (field code %{00017}) value of Critical or High, within a schedule named my_schedule for the server's default time_zone.

timeInValue(number field field, issue list issues, boolean expression predicate, string schedule_name, timeZone time_zone) : number

Returns the sum of milliseconds number or date-time field with code {nnnnn} has had a value satisfying a boolean expression predicate in distinct issues, where the numeric value of the field with code {nnnnn} is represented by ^. The time being calculated by this function is only counted during a defined schedule with name schedule_name for timeZone time_zone.

Example: timeInValue({00012}, subtasks(), ^ != null, "my_schedule", LOCAL) returns the number of milliseconds the field Due date (field code {00012}) of all sub-tasks of the current issue have had a value, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue({10001}, epic(), ^ >= 5 AND ^ <= 10, "my_schedule", LOCAL) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) in the linked Epic issue has had a value between 5 and 10, within a schedule named my_schedule for the server's default time_zone.

Example: timeInValue({10001}, filterByIssueType(linkedIssues(), "Bug, New Feature"), modulus(^, 2) = 0, "my_schedule", LOCAL) returns the number of milliseconds a hypothetical numeric field called Passengers (field code {10001}) has had an even value in any linked Bug or New Feature, within a schedule named my_schedule for the server's default time_zone.

fieldChangeTimes(string field field, boolean expression predicate) : number list

Returns the timestamps of when a string value of field with code %{nnnnn} has changed satisfying a certain predicate that depends on the values of the field before and after the value change. The string value before the change is represented by ^0%, and after the change by ^1%. The timestamps are returned as a number list sorted in ascending order.

Example: fieldChangeTimes(%{00000}, ^0% !~~ "IMPORTANT" AND ^1% ~~ "IMPORTANT") returns the list of timestamps when the word "IMPORTANT" has been added to the current issue's summary (field code %{00000}) ignoring the case.

Example: fieldChangeTimes(%{00017}, ^0% = null AND ^1% != null) returns the list of timestamps of when the issue's priority (field code %{00017}) of the current issue has been set.

Example: fieldChangeTimes(%{00017}, ^0% not in ["Critical", "High"] AND ^1% in ["Critical", "High"]) returns the list of timestamps when current issue's priority (field code %{00017}) has become Critical or High.

fieldChangeTimes(number field field, boolean expression predicate) : number list

Returns the timestamps of when a numeric / date-time value of field with code {nnnnn} has changed satisfying a certain predicate that depends on the values of the field before and after the value change. The numeric value before the change is represented by ^0, and after the change by ^1. The timestamps are returned as a number list sorted in ascending order.

Example: fieldChangeTimes({00012}, ^0 < ^1) returns the timestamps of when the Due date (field code {00012}) has been edited to a higher value.

Example: fieldChangeTimes({10001}, abs(^0 - ^1) / ^0 >= 0.25) returns the timestamps of when a hypothetical numeric field called Passengers (field code {10001}) has been edited with a variation of at least 25% over its previous value.

fieldChangeTimes(string field field, issue list issues, boolean expression predicate) : number list

Returns the timestamps of when a string value of fields with code %{nnnnn} in distinct parameter issues have changed satisfying certain predicate that depends on the values of the fields before and after the value change. The string value before the change is represented by ^0%, and after the change by ^1%. The timestamps are returned as a number list containing a sequence of sorted numeric values in ascending order for each parameter issue.

Example: fieldChangeTimes(%{00000}, subtasks(), ^0% !~~ "IMPORTANT" AND ^1% ~~ "IMPORTANT") returns the list of timestamps of when the word "IMPORTANT" has been added the the summary (field code %{00000}) of all current issue's sub-tasks, ignoring the case.

Example: fieldChangeTimes(%{00017}, epic(), ^0% = null AND ^1% != null) returns the list of timestamps of when the issue priority (field code %{00017}) of the current issue's epic has been set.

Example: fieldChangeTimes(%{00017}, linkedIssues("is blocked by"), ^0% not in ["Critical", "High"] AND ^1% in ["Critical", "High"]) returns the list of timestamps of when the priority (field code %{00017}) in all blocking linked issues has become Critical or High.

fieldChangeTimes(number field field, issue list issues, boolean expression predicate) : number list

Returns the timestamps of when a numeric value of fields with code {nnnnn} in distinct parameter issues have changed satisfying a certain predicate that depends on the values of the fields before and after the value change. The numeric value before the change is represented by ^0, and after the change by ^1. The timestamps are returned as a number list containing a sequence of sorted numeric values in ascending order for each parameter issue.

Example: fieldChangeTimes({00012}, subtasks(), ^0 < ^1) returns the timestamps of when the Due Date (field code {00012}) has been edited to a higher value in any of the current issue's sub-tasks.

Example: fieldChangeTimes({10001}, epic(), abs(^0 - ^1) / ^0 >= 0.25) returns the timestamps when a hypothetical numeric field called Passengers (field code {10001}) in the current issue's epic has been edited with a variation of at least 25% over its previous value

lastFieldChangeTime(string field field) : number

Returns the timestamp of most recent value update of a field with code %{00000}.

Example: lastFieldChangeTime(%{00000}) returns the timestamp of the last update of an issue's summary (field code {00000}).

unreleasedVersionsBySequence() : string listReturns a string list with the unreleased versions in the current project with the default order. Only non-archived versions are returned. The first version in the list is the lowest version in the version table.
releasedVersionsBySequence() : string listReturns a string list with the released versions in the current project with the default order. Only non-archived versions are returned. The first version in the list is the lowest version in the version table.

Bug fixes

  • Using the Move issues post function on individual sub-tasks (without moving the parent) resulting resulted in incompatible parent-child relationships. Moving individual sub-tasks is currently not available (warning)
  • Issues were not correctly moved to newly created Epics.
  • Custom fields could be set to values not available/valid in their respective field context using the Move issues post function
  • Setting the "Sprint ID" to a value equal or greater than 1000 produced an error
  • Incorrect error messages were logged when detecting deleted custom fields




Find more release notes in our Version History section.

JWT Release Notes 2.5.4

Direct download from Marketplace  

Bug fixes

  • While performing the Move issues post function all the custom field values of the moved issue were deleted


Find more release notes in our Version History section.


JWT Release Notes 2.5.3

Direct download from Marketplace  

Bug fixes

  • Create issues and subtasks post function bug when the option inherit rest of the fields was selected


Find more release notes in our Version History section.

JWT Release Notes 2.5.2

Unable to render {include} The included page could not be found.

Find more release notes in our Version History section.

JWT Release Notes 2.5.1

Unable to render {include} The included page could not be found.

Find more Release Notes in our Version History section.