I want to add a button (Web Item) that will clone the current issue and change the issue type.
How should that be done? Is the only way to create a REST endpoint and a Script Fragment or is there a better way?
Hey @Michael Bendtsen
You'll want to use the Script Fragment (Constrained create issue dialog) and a Behaviour.
See below image. See example code below for the behaviour.
import com.atlassian.jira.component.ComponentAccessor;import com.atlassian.jira.issue.Issue;import com.atlassian.jira.issue.IssueManager;import com.onresolve.jira.groovy.user.FieldBehaviours;import groovy.util.logging.Log4j;import org.apache.log4j.Level;import com.atlassian.jira.issue.fields.CustomField;import com.atlassian.jira.user.ApplicationUser;import com.atlassian.jira.issue.customfields.option.Option@Log4jpublic class CreateIssueButton extends FieldBehaviours { // Constants private static final String CONTEXT = "SET KEY NAME HERE"; // Managers private static IssueManager issueManager = ComponentAccessor.getIssueManager(); public run () { // Check the behaviour context ID if (behaviourContextId == CONTEXT) { log.setLevel(Level.DEBUG); log.debug("Constrained issue creation: Task triggered"); // Set the issue and project fields to read only getFieldById("project-field").setReadOnly(true); getFieldById("issuetype-field").setReadOnly(true); // Get the issue that was created from Issue contextIssue = issueManager.getIssueObject(getContextIssueId()); // Set any other fields here getFieldById("summary").setFormValue("Cloned issue: ${contextIssue.summary}"); getFieldById("description").setFormValue("Cloned issue: ${contextIssue.summary}"); getFieldById("issuelinks-linktype").setFormValue("SET LINK NAME HERE").setReadOnly(true); getFieldById("issuelinks-issues").setFormValue(contextIssue.key).setReadOnly(true); } } }
//This copies specific fields to the new ticketList copyCustomFields = ["Custom Field Name", "Custom Field Name", "Custom Field Name"]List<CustomField> contextFields = customFieldManager.getCustomFieldObjects(contextIssue)contextFields.each { CustomField cf -> if (copyCustomFields && !copyCustomFields.contains(cf.name)) { return } def contextValue = cf.getValue(contextIssue)?.toString() if (!contextValue) { return } getFieldById(cf.id).setFormValue(contextValue) log.debug("contextValue: ${contextValue?.class} for type ${cf.name}") if (contextValue instanceof ApplicationUser) { getFieldById(cf.id).setFormValue(contextValue.username) } else if (contextValue instanceof List && contextValue[0] instanceof Option) { getFieldById(cf.id).setFormValue(contextValue*.optionId) } else { getFieldById(cf.id).setFormValue(contextValue) }}}}}
Should the CONTEXT be the key of the Script Fragment?
@Michael Bendtsen
Yes!
It looks like you're new here. Sign in or register to get started.