/src/main/resources/com/onresolve/jira/groovy/canned/workflow/conditions/AllSubtasksResolvedCondition.groovy
https://bitbucket.org/sorin/jira-plugin-intellij · Groovy · 137 lines · 108 code · 19 blank · 10 comment · 21 complexity · 43dffde5dc4ae7a1715bbab7cd8d520d MD5 · raw file
- package com.onresolve.jira.groovy.canned.workflow.conditions
-
- import com.onresolve.jira.groovy.canned.CannedScript
- import com.atlassian.jira.util.ErrorCollection
- import com.atlassian.jira.ComponentManager
-
- import com.atlassian.jira.issue.Issue
- import org.apache.log4j.Category
- import com.onresolve.jira.groovy.canned.utils.CannedScriptUtils
-
- import com.atlassian.jira.util.SimpleErrorCollection
-
- class AllSubtasksResolvedCondition implements CannedScript {
- Category log = Category.getInstance(this.class)
- ComponentManager componentManager = ComponentManager.getInstance()
- public static final String FIELD_REQUIRED_RESOLUTION_ID = "RESOLUTION_FIELD_NAME"
-
- // Note: this parameter not exposed through the GUI, it changes the meaning of "no open subtasks"
- // to "no open subtasks in issuetype [N, M] (list of string IDs)"
- public static final String FIELD_SUBTASK_TYPE = "FIELD_SUBTASK_TYPE"
-
- List getCategories() {
- ["Condition"]
- }
-
- String getName() {
- "All sub-tasks must be resolved";
- }
-
- public String getHelpUrl() {
- "https://studio.plugins.atlassian.com/wiki/display/GRV/Built-In+Scripts#Built-InScripts-Allsubtasksmustberesolved"
- }
-
- String getDescription() {
- """Does not allow the action unless all sub-tasks have a <i>resolution</i> set. You can choose <i>any</i>
- resolution, a named one, or same as parent task.""";
- }
-
- def Map getResolutionOptions() {
- Map<String, String> options = new LinkedHashMap()
- options.put('','Any')
- options.put('PARENT','Same as parent')
- options.putAll(CannedScriptUtils.getResolutionOptions(false))
- options
- }
-
- List getParameters(Map params) {
- [
- [
- Name:FIELD_REQUIRED_RESOLUTION_ID,
- Label:"Resolution",
- Type: "list",
- Description:"Resolution to use",
- Values: getResolutionOptions(),
- ],
- ]
- }
-
- ErrorCollection doValidate(Map params, boolean forPreview) {
- // check that the resolution ID is valid / still valid
- def constantsManager = componentManager.getConstantsManager()
-
- String requiredResolutionId = getRequiredResolutionId(params)
- if (!requiredResolutionId || requiredResolutionId == 'PARENT') {
- return null
- }
- if (!constantsManager.getResolutionObjects()*.id.contains(requiredResolutionId)) {
- SimpleErrorCollection errors = new SimpleErrorCollection()
- errors.addError (FIELD_REQUIRED_RESOLUTION_ID, "$requiredResolutionId is not a valid resolution ID")
- return errors
- }
- null
- }
-
- Map doScript(Map params) {
- def passesCondition = true
- String requiredResolutionId = getRequiredResolutionId(params)
- List subTaskIssueTypes = params[FIELD_SUBTASK_TYPE] as List
-
- Issue myIssue = params['issue'] as Issue
- def subTaskManager = componentManager.getSubTaskManager();
- Collection subTasks = myIssue.getSubTaskObjects()
- if (subTaskManager.subTasksEnabled && !subTasks.empty) {
- passesCondition = subTasks.every {
- if (subTaskIssueTypes && ! subTaskIssueTypes.contains(it.issueTypeObject.id)) {
- return true
- }
- // it is a GV
- if (requiredResolutionId) {
- if (requiredResolutionId == "PARENT") {
- myIssue.getResolution() && (it.resolutionId == myIssue.resolutionId)
- }
- else {
- it.resolutionId == requiredResolutionId
- }
- }
- else {
- it.resolution // as Boolean
- }
- }
- }
- // log.debug("Returning: " + passesCondition)
- params['passesCondition'] = passesCondition
- params
- }
-
- String getDescription(Map params, boolean forPreview) {
- String s
- String requiredResolutionId = getRequiredResolutionId(params)
- if (requiredResolutionId) {
- if (requiredResolutionId == "PARENT") {
- s = "the <i>parent</i>"
- }
- else {
- s = "the <i>" + componentManager.getConstantsManager().getResolutionObject(requiredResolutionId).getName() + "</i>"
- }
- }
- else {
- s = "<i>any</i>"
- }
- """Does not allow the action unless all sub-tasks have $s <i>resolution</i> set. """;
- }
-
- /**
- * This is to handle the fact that the internal string for resolution was changed at some point
- * @param params
- * @return
- */
- private String getRequiredResolutionId(Map params) {
- params[FIELD_REQUIRED_RESOLUTION_ID] ?: params['Resolution'] as String
- }
-
- public Boolean isFinalParamsPage(Map params) {
- true
- }
-
- }