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?
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
@Log4j
public 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 ticket
List 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)
}
}
}
}
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Cannot get it to work. If I uses inline-script I guess I shouldn't create the class and method?
Kind of new to Script-runner ;)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.