如何在jira中动态或使用插件添加新值以选择列表字段

Posted

技术标签:

【中文标题】如何在jira中动态或使用插件添加新值以选择列表字段【英文标题】:How to add new values to select list field in jira dynamically or using plug-in 【发布时间】:2014-05-18 12:32:27 【问题描述】:

这是我的用例。 1. 我有一个“客户名称”文本字段和“所有客户”单选列表。 2. 问题解决后,我想选择“客户名称”中存在的值,并希望添加到“所有客户”中。

如果“所有客户”中已经存在要添加的值,我可以实现这一点。但是,如果“所有客户”字段尚不存在,我想用新值填充它,以便将来可以选择。 这个怎么做?有可能吗?

【问题讨论】:

JIRA 不提供根据问题中的值更新选择列表中的选项的方法。这可以通过创建新的自定义字段类型来完成。或者也许通过将所有客户设置为标签字段并使用 JIRA 6.3(尚未推出)来限制谁可以编辑标签 @mdoar 幸运的是我找到了这样做的方法。请看下面我的回答。 【参考方案1】:

我找到了答案。这是完整的代码。它的 jira 插件会引发已解决的事件并从一个自定义字段中获取值并填充另一个字段。希望对其他人有所帮助。

package com.spmsoftware.plugin.listeners;

import com.atlassian.event.api.EventListener;
import com.atlassian.event.api.EventPublisher;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.event.issue.IssueEvent;
import com.atlassian.jira.event.type.EventType;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.issue.customfields.manager.OptionsManager;
import com.atlassian.jira.issue.customfields.option.Option;
import com.atlassian.jira.issue.customfields.option.Options;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.fields.config.FieldConfig;
import com.atlassian.jira.issue.fields.config.FieldConfigScheme;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import java.util.List;
import java.util.Map;

/**
 * User: adnan
 * Date: 5/4/14
 * Time: 4:49 PM
 */
public class IssueUpdateListener  implements InitializingBean, DisposableBean 

    private static final Logger LOGGER = Logger.getLogger(IssueUpdateListener.class);

    private final EventPublisher eventPublisher;
   // private final JiraAuthenticationContext authenticationContext;

    public IssueUpdateListener(EventPublisher eventPublisher) 
        this.eventPublisher = eventPublisher;
       // this.authenticationContext = ComponentAccessor.getJiraAuthenticationContext();
    

    @Override
    public void afterPropertiesSet() throws Exception 
        eventPublisher.register(this);
    

    @Override
    public void destroy() throws Exception 
        eventPublisher.unregister(this);
    

    @EventListener
    public void onIssueEvent(IssueEvent issueEvent) 
        Long eventTypeId = issueEvent.getEventTypeId();
        Issue issue = issueEvent.getIssue();
        if (eventTypeId.equals(EventType.ISSUE_RESOLVED_ID)) 
            MutableIssue mutableIssue = getMutableIssue(issue);
            CustomField customerNameCF = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Customer Name");
            CustomField allCustomersCF = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("All Customers");
            Object customerNameVal = mutableIssue.getCustomFieldValue(customerNameCF);
            Option newOptions = addOptionToCustomField(allCustomersCF, customerNameVal.toString());
            LOGGER.info("New updated option " + newOptions);
        
    

    private MutableIssue getMutableIssue(Issue issue) 
        MutableIssue mutableIssue;
        if (issue instanceof MutableIssue)   
            mutableIssue = (MutableIssue)issue;
         else 
            mutableIssue = ComponentAccessor.getIssueManager().getIssueObject(issue.getKey());
        
        return mutableIssue;
    


    public Option addOptionToCustomField(CustomField customField, String value) 
        Option newOption = null;
        if (customField != null) 
            List<FieldConfigScheme> schemes = customField.getConfigurationSchemes();
            if (schemes != null && !schemes.isEmpty()) 
                FieldConfigScheme sc = schemes.get(0);
                Map configs = sc.getConfigsByConfig();
                if (configs != null && !configs.isEmpty()) 
                    FieldConfig config = (FieldConfig) configs.keySet().iterator().next();
                    OptionsManager optionsManager = ComponentAccessor.getOptionsManager();
                    Options l = optionsManager.getOptions(config);
                    int nextSequence = l.isEmpty() ? 1 : l.getRootOptions().size() + 1;
                    newOption = optionsManager.createOption(config, null, (long) nextSequence, value);
                
            
        

        return newOption;
    


【讨论】:

感谢分享解决方案@MohdAdnan,我们也有类似的情况。但是在尝试了上面的代码之后,侦听器将在文本字段中输入的新值添加到选择列表选项中 3 次。我刚刚实现了上面相同的代码。因此,每次输入新值时,都会将多重重复选项添加到“选择列表”字段中。 @Naren 您可以检查唯一性并仅在不可用时添加选项。 在将新值作为选项添加到“选择列表”字段之前,我尝试检查唯一性。下面是我应用的检查 - 'code'if(!options.contains(value)) int nextSequence = options.isEmpty() ? 1 : 选项.size() + 1; newOption = optionsManager.createOption(fieldConfig, null, new Long (nextSequence), value); 'code' 使用此方法,而不是将 rootOptions 与新值一起传递给它 private boolean newValueAlreadyPresent(List

以上是关于如何在jira中动态或使用插件添加新值以选择列表字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP .NET MVC 5 中使用 select2 将新值动态添加到列表框并将其传递给控制器​​?

从 Json 中选择值以添加到下拉列表

在 laravel 表单中添加默认值以选择列表

如何强制用户从下拉列表和按钮中选择一个值以启用保存按钮?

如何在 JIRA 插件中通过电子邮件获取用户

如何在 JavaScript 中设置多个值以列出值