Как добавить новые значения для выбора поля списка в jira динамически или с помощью плагина

Вот мой вариант использования.
1. У меня есть текстовое поле "Имя клиента" и одиночный список выбора "Все клиенты".
2. Когда проблема будет решена, я хочу выбрать значение, присутствующее в «Имени клиента», и добавить его в «Все клиенты».

Я могу добиться этого, если значение, которое нужно добавить, уже присутствует в «Все клиенты». Но я хочу заполнить поле «Все клиенты» новым значением, если его еще нет, чтобы в будущем оно было доступно для выбора. Как это сделать? возможно ли это сделать?


person Mohammad Adnan    schedule 06.04.2014    source источник
comment
JIRA не предоставляет способа обновить параметры в списке выбора на основе значения в задаче. Это можно сделать, создав новый настраиваемый тип поля. Или, возможно, сделав «Все клиенты» полем меток и используя JIRA 6.3 (еще не выпущенную), чтобы ограничить, кто может редактировать метки.   -  person mdoar    schedule 08.04.2014
comment
@mdoar, к счастью, я нашел способ сделать это. Просто посмотрите мой ответ ниже.   -  person Mohammad Adnan    schedule 21.04.2014


Ответы (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;
    }

}
person Mohammad Adnan    schedule 21.04.2014
comment
Спасибо, что поделились решением @MohdAdnan, у нас похожая ситуация. Но попробовав приведенный выше код, слушатель трижды добавляет новое значение, введенное в текстовое поле, к параметрам списка выбора. Я только что реализовал тот же код выше. Таким образом, опции множественных дубликатов добавляются в поле «Список выбора» каждый раз, когда вводится новое значение. - person Naren; 04.08.2014
comment
@Naren, вы можете проверить уникальность и добавить опцию, только если она недоступна. - person Mohammad Adnan; 07.08.2014
comment
Я попытался проверить уникальность, прежде чем добавлять новое значение в качестве опции в поле «Список выбора». Ниже приведена проверка, которую я применил: 'code'if(!options.contains(value)) { int nextSequence = options.isEmpty() ? 1 : options.size() + 1; newOption = optionsManager.createOption (fieldConfig, null, new Long (nextSequence), значение);} 'код' - person Naren; 08.08.2014
comment
лучше используйте этот метод — передайте ему rootOptions вместе с новым значением private boolean newValueAlreadyPresent(List‹Option› rootOptions, String value) { for (Option o : rootOptions) { if (o.getValue().equals(value)) { return истинный; } } вернуть ложь; } - person Mohammad Adnan; 08.08.2014