Dynamic Forms
Use the Dynamic Forms feature to simplify the process of adding variables to your ScriptRunner Groovy scripts.
With Dynamic Forms, you can annotate your variables in a script so they appear as selectable form fields. You can then save that script as a file to be shared with multiple users, allowing one script to be used for various use cases.
Why is the Dynamic Forms Feature Useful?
Inline scripts are often copied and pasted, with minor changes made for different use cases, which requires maintenance for each script usage. Using Dynamic Forms, you can create flexible scripts with annotated variables that can be stored as files, reducing maintenance requirements while allowing for script customization. Additionally, these annotations allow variable values within a script to be changed easily by those with limited code familiarity.
Where can you use the Dynamic Forms Feature?
Dynamic Forms are everywhere! You can use them on Jobs, Listeners, Pre Hooks, Post Hooks, Merge Checks, and just about everywhere you can write code.
Available Dynamic Form Field Types
The following dynamic form field types are available:
| Name | Description | Target Type |
|---|---|---|
| User Picker | Field allowing user selection. | com.atlassian.bitbucket.user.ApplicationUser |
| Short Text | Field allowing a short text input. | String |
| Select List | Single-select list field. Custom select list If you cannot find an annotation that is suitable for your purpose, you can useoptionsGenerator within the select list annotation to customize your own list options. | String |
| Checkbox | A checkbox field. | Boolean |
| Project Picker | Field allowing project selection. | com.atlassian.bitbucket.project.Project |
| Repository Picker | Field allowing repository selection. | com.atlassian.bitbucket.repository.Repository |
| Branch Picker | Field allowing branch selection. | com.onresolve.scriptrunner.bitbucket.branch.BranchWithRepository
|
| Tag Picker | Field allowing branch selection. | com.onresolve.scriptrunner.bitbucket.tag.TagWithRepository
|
Creating a Dynamic Form
There are three main steps in creating a dynamic form that can be used across multiple features by multiple users:
The steps below describe how we expect most users to use the Dynamic Forms feature. This feature can be used in whatever way you find most useful.
- Create the dynamic form in the Script Console to make sure it works as expected.
- Save the dynamic form as a file.
- Use the saved file in a Job, Listener, Pre Hook, Post Hook, Merge Check, or other ScriptRunner feature.
The above steps are detailed below.
Transforming an Existing Inline Script into a Dynamic form
To enable sharing of annotated scripts, all inline scripts must be saved as files.
Annotations
You can use the following annotations to construct your dynamic forms.
User Picker
Add a user picker field into your script.
import com.atlassian.bitbucket.user.ApplicationUser
import com.onresolve.scriptrunner.parameters.annotation.*
@UserPicker(label = "User", description = "Select a user")
ApplicationUser userUser multi-pickers are also supported.
import com.atlassian.bitbucket.user.ApplicationUser
import com.onresolve.scriptrunner.parameters.annotation.*
@UserPicker(label = "Users", description = "Select users", multiple = true)
List<ApplicationUser> usersShort Text
Add a short text field to a script.
import com.onresolve.scriptrunner.parameters.annotation.ShortTextInput
@ShortTextInput(label = "Branch name", description = "Enter the branch name")
String branchNameSelect List
Add a single-select list with configurable options.
import com.onresolve.scriptrunner.parameters.annotation.Select
import com.onresolve.scriptrunner.parameters.annotation.meta.Option
@Select(
label = "Color",
description = "Select color",
options = [
@Option(label = "Green", value = "green"),
@Option(label = "Blue", value = "blue"),
]
)
String valueMulti-select lists are also supported.
import com.onresolve.scriptrunner.parameters.annotation.Select
import com.onresolve.scriptrunner.parameters.annotation.meta.Option
@Select(
label = "Colors",
description = "Select colors",
options = [
@Option(label = "Green", value = "green"),
@Option(label = "Blue", value = "blue"),
@Option(label = "Red", value = "red"),
],
multiple = true
)
List<String> valuesUsing optionsGenerator in a select list
If you cannot find an annotation that is suitable for your purpose, you can provide an optionsGenerator closure when using @Select to generate a list of custom options. For example:
import com.onresolve.scriptrunner.parameters.annotation.Select
@Select(
label = "Color",
description = "Select color",
optionsGenerator = {
[
['yellow', 'Yellow'],
['red', 'Red'],
]
}
String value- The first element must be the option value (that is, what is injected into your variable).
- The second element must be the display value.
The closure code must be completely self-contained, apart from import declarations. Therefore, you cannot use variables or methods declared outside the closure.
We recommend you keep the contents of these closures short and simple.
The following is a Jira example, using optionsGenerator, that lists all projects in a specific project category:
import com.atlassian.jira.component.ComponentAccessor
import com.onresolve.scriptrunner.parameters.annotation.Select
@Select(
label = "Project",
description = "Select the Space project",
optionsGenerator = {
def projectManager = ComponentAccessor.projectManager
def category = projectManager.getProjectCategoryObjectByName('Space Projects')
projectManager.getProjectObjectsFromProjectCategory(category.id).collect { project ->
[project.key, project.name]
}
}
)
String valueCheckbox
Add a checkbox to a script.
import com.onresolve.scriptrunner.parameters.annotation.Checkbox
@Checkbox(label = "Delete branch", description = "Select the checkbox to delete the branch")
Boolean shouldDeleteBranchProject Picker
Add a project picker to a script.
import com.atlassian.bitbucket.project.Project
import com.onresolve.scriptrunner.parameters.annotation.ProjectPicker
@ProjectPicker(label = 'Project', description = 'Pick a project')
Project projectProject multi-pickers are also supported.
import com.atlassian.bitbucket.project.Project
import com.onresolve.scriptrunner.parameters.annotation.ProjectPicker
@ProjectPicker(label = 'Projects', description = 'Pick some projects', multiple = true)
List<Project> projectsRepository Picker
Add a repository picker to a script.
import com.atlassian.bitbucket.repository.Repository
import com.onresolve.scriptrunner.parameters.annotation.RepositoryPicker
@RepositoryPicker(label = 'Repository', description = 'Select a repository')
Repository repositoryRepository multi-pickers are also supported.
import com.atlassian.bitbucket.repository.Repository
import com.onresolve.scriptrunner.parameters.annotation.RepositoryPicker
@RepositoryPicker(label = 'Repositories', description = 'Select repositories', multiple = true)
List<Repository> repositoriesBranch Picker
Add a branch picker to a script.
import com.onresolve.scriptrunner.bitbucket.branch.BranchWithRepository
import com.onresolve.scriptrunner.parameters.annotation.BranchPicker
@BranchPicker(label = 'Branch', description = 'Select a Branch')
BranchWithRepository branchTag Picker
import com.onresolve.scriptrunner.bitbucket.tag.TagWithRepository
import com.onresolve.scriptrunner.parameters.annotation.TagPicker
@TagPicker(label = 'Tag', description = 'Select a tag')
TagWithRepository tag