在 Jira 问题创建中处理 SelectList 的动态选项
Dealing with dynamic options for SelectList in Jira issue creation
在我的 Jira 项目中,我有一个名为 "CASE-Environment" 的自定义字段。它是一个 Select 列表(多个值)
我希望此自定义字段具有动态填充的值。在我的实际项目中,我正在使用 RESTFul 调用,其中我从内部 RESTFul 服务获取实际值。但出于演示目的,我在这里显示的值是通过初始化程序硬编码的。
我正在使用 Script Runner Jira 插件,它可以让我定义行为,并将其与字段相关联。我在行为的初始化部分有以下内容。
import com.onresolve.jira.groovy.user.FieldBehaviours
import com.onresolve.jira.groovy.user.FormField
Map fieldOptions = [:]
fieldOptions.put("-1","None")
fieldOptions.put("100","Dev");
fieldOptions.put("101","Staging");
fieldOptions.put("102","QA");
fieldOptions.put("103","Production");
FormField env = getFieldByName("CASE-Environment");
env.setFieldOptions(fieldOptions)
当我尝试创建问题时,我在 UI 上成功地看到了这个值。
但是当我尝试提交问题时,我遇到了一条 Jira 验证错误消息,内容如下
Invalid value '102' passed for customfield 'CASE-Environment'
我猜测 Jira 不知何故无法识别我的 SelectList [多个值]
的动态添加的选项值
我什至尝试为这个字段构建一个映射,其中每次自定义字段 CASE-Environment 发生变化时我的行为都会被触发。
映射代码如下:
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.customfields.option.Options
import com.atlassian.jira.issue.customfields.option.Option
import com.onresolve.jira.groovy.user.FieldBehaviours
import com.onresolve.jira.groovy.user.FormField
def adddOption = {
Issue issue,
CustomField customField,
String value ->
Options l = ComponentAccessor.getOptionsManager().getOptions(customField.getRelevantConfig(issue))
int nextSequence = l.isEmpty() ? 1 : l.getRootOptions().size() + 1;
Option newOption = ComponentAccessor.getOptionsManager().createOption(customField.getRelevantConfig(issue), null, (Long)nextSequence, value);
return newOption;
}
FormField environment = getFieldById(fieldChanged)
Issue issue = getUnderlyingIssue()
MutableIssue mutableIssue = ComponentAccessor.getIssueManager().getIssueObject(issue.id);
CustomField field = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("CASE-Environment")
List<Option> allOptions = new LinkedList<>();
List<String> chosenValues = (List<String>) mutableIssue.getCustomFieldValue(field);
for (String eachValue : chosenValues) {
allOptions.add(adddOption(issue, field, eachValue));
}
mutableIssue.setCustomFieldValue(field, allOptions);
但即使在这之后我仍然无法理解错误消息。有人可以帮我解决这个问题吗?
为了它的价值,我正在使用 Jira:JIRA v6.3.5
所以在这上面玩了很久之后,我终于自己破解了。
下面提到的初始化程序部分应该有助于轻松解决这个问题。
import com.atlassian.jira.component.ComponentAccessor
def optionsManager = ComponentAccessor.getOptionsManager()
def fieldManager = ComponentAccessor.getCustomFieldManager()
def envFld = fieldManager.getCustomFieldObjectByName("CASE-Environment")
def fieldConfig = envFld.getRelevantConfig(getIssueContext())
def newSeqId = 0
//For the sake of e.g., I am using a initialized array. In real life one can
// construct this by querying a DB or hitting a RestFul service etc.,
def envs = ["QA", "Staging", "Dev", "Production"]
def issueService = ComponentAccessor.getIssueService()
def issueInputParameters = issueService.newIssueInputParameters()
for (String env : envs) {
def option = optionsManager.createOption(fieldConfig, null, newSeqId++, env)
issueInputParameters.addCustomFieldValue(envFld.idAsLong, option.optionId.toString())
}
感谢@Krishan
只有一条评论,新的 JIRA 7/ScriptRunner 在静态类型检查方面存在问题。替换 "newSeqID"
的定义
def newSeqId = 0
和
Long newSeqId = 0
在我的 Jira 项目中,我有一个名为 "CASE-Environment" 的自定义字段。它是一个 Select 列表(多个值)
我希望此自定义字段具有动态填充的值。在我的实际项目中,我正在使用 RESTFul 调用,其中我从内部 RESTFul 服务获取实际值。但出于演示目的,我在这里显示的值是通过初始化程序硬编码的。
我正在使用 Script Runner Jira 插件,它可以让我定义行为,并将其与字段相关联。我在行为的初始化部分有以下内容。
import com.onresolve.jira.groovy.user.FieldBehaviours
import com.onresolve.jira.groovy.user.FormField
Map fieldOptions = [:]
fieldOptions.put("-1","None")
fieldOptions.put("100","Dev");
fieldOptions.put("101","Staging");
fieldOptions.put("102","QA");
fieldOptions.put("103","Production");
FormField env = getFieldByName("CASE-Environment");
env.setFieldOptions(fieldOptions)
当我尝试创建问题时,我在 UI 上成功地看到了这个值。
但是当我尝试提交问题时,我遇到了一条 Jira 验证错误消息,内容如下
Invalid value '102' passed for customfield 'CASE-Environment'
我猜测 Jira 不知何故无法识别我的 SelectList [多个值]
的动态添加的选项值我什至尝试为这个字段构建一个映射,其中每次自定义字段 CASE-Environment 发生变化时我的行为都会被触发。
映射代码如下:
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.customfields.option.Options
import com.atlassian.jira.issue.customfields.option.Option
import com.onresolve.jira.groovy.user.FieldBehaviours
import com.onresolve.jira.groovy.user.FormField
def adddOption = {
Issue issue,
CustomField customField,
String value ->
Options l = ComponentAccessor.getOptionsManager().getOptions(customField.getRelevantConfig(issue))
int nextSequence = l.isEmpty() ? 1 : l.getRootOptions().size() + 1;
Option newOption = ComponentAccessor.getOptionsManager().createOption(customField.getRelevantConfig(issue), null, (Long)nextSequence, value);
return newOption;
}
FormField environment = getFieldById(fieldChanged)
Issue issue = getUnderlyingIssue()
MutableIssue mutableIssue = ComponentAccessor.getIssueManager().getIssueObject(issue.id);
CustomField field = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("CASE-Environment")
List<Option> allOptions = new LinkedList<>();
List<String> chosenValues = (List<String>) mutableIssue.getCustomFieldValue(field);
for (String eachValue : chosenValues) {
allOptions.add(adddOption(issue, field, eachValue));
}
mutableIssue.setCustomFieldValue(field, allOptions);
但即使在这之后我仍然无法理解错误消息。有人可以帮我解决这个问题吗?
为了它的价值,我正在使用 Jira:JIRA v6.3.5
所以在这上面玩了很久之后,我终于自己破解了。
下面提到的初始化程序部分应该有助于轻松解决这个问题。
import com.atlassian.jira.component.ComponentAccessor
def optionsManager = ComponentAccessor.getOptionsManager()
def fieldManager = ComponentAccessor.getCustomFieldManager()
def envFld = fieldManager.getCustomFieldObjectByName("CASE-Environment")
def fieldConfig = envFld.getRelevantConfig(getIssueContext())
def newSeqId = 0
//For the sake of e.g., I am using a initialized array. In real life one can
// construct this by querying a DB or hitting a RestFul service etc.,
def envs = ["QA", "Staging", "Dev", "Production"]
def issueService = ComponentAccessor.getIssueService()
def issueInputParameters = issueService.newIssueInputParameters()
for (String env : envs) {
def option = optionsManager.createOption(fieldConfig, null, newSeqId++, env)
issueInputParameters.addCustomFieldValue(envFld.idAsLong, option.optionId.toString())
}
感谢@Krishan 只有一条评论,新的 JIRA 7/ScriptRunner 在静态类型检查方面存在问题。替换 "newSeqID"
的定义def newSeqId = 0
和
Long newSeqId = 0