Hello Community,
Could you please assist me to display only limited options for a second custom field option and also let me know which script runner option I should use? Is it the option Behaviours because I am very new to the groovy script.
For example,
I have two fields: Field1 and Field2.
Field1 contains three dropdown menus: A, B, and C.
Field2 has the following dropdown options: E, F, G, H, and I.
Now all I need are options for field2 to display E, F, and I If, A is selected in Field1. and the same, if B is selected, options F and G should be displayed, and if C is selected, options E and I should be displayed.
Your description of what you're trying to achieve is screaming "cascading select list" to me. Jira has these off-the-shelf, no need to mess with Behaviours or any other complexities.
If cascading select lists are not right for you, could you explain why?
I have already defined a filed script of those custom field values. It's okay with me to use cascading field but I need the correct script. Could you please help me with my below script to convert from custom filed to cascading?
-------------------------------------------------------------
Below are two fields that I am changing to Cascading.
customfield_18840 and customfield_18841
---------------------------------------------------------------
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.user.ApplicationUser
def issueManager = ComponentAccessor.getIssueManager()
def linkManager = ComponentAccessor.getIssueLinkManager()
def cfm = ComponentAccessor.getCustomFieldManager()
Issue issueKey = issue
def id=issueKey.getId()
def customFieldManager = ComponentAccessor.getCustomFieldManager();
def cf = customFieldManager.getCustomFieldObject("customfield_18840") //field1 ID - Category Field
def cff = customFieldManager.getCustomFieldObject("customfield_18841") // field2 ID - Size field
def field3 = customFieldManager.getCustomFieldObject("customfield_18844") // field3 ID - Actual hour work
def n = issue.getCustomFieldValue(cf).toString()
def b = issue.getCustomFieldValue(cff).toString()
def c = Integer.parseInt((issue.getCustomFieldValue(field3) ?: 0).toString().replaceAll(~/[.].*/, ""))
def d = 0;
if(n=="CONCEPT" && b =="M"){ d = 48 }
if(n=="CONCEPT" && b =="M"){ d = 48 }
if(n=="POC" && b =="S"){ d = 30 }
if(n=="POC" && b =="M"){ d = 60 }
if(n=="SYSSPEC" && b =="S"){ d = 29 }
if(n=="SYSSPEC" && b =="M"){ d = 58 }
Integer remaining = d - c
return remaining
------------------------------------------------
Thank you for your support!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I don't understand. Why are you not just using a cascading select list?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello @Nic Brough -Adaptavist-
I have already configured the cascading select list and it is now functional.
but I need to get a calculated automation result from both cascade values and one more field value.
Example:
We have predefined the hour of matching value from fields 1 and 2.
For example, if I choose A from field1 and B from field2, the total hour is 60. (There are multiple total hours values according to the field1 and field2)
In my case, I want the remaining hour in the result if someone mentions his work hour in the filed3 then
Example:
Field1=A
Field2=B
(AB total hours = 60)
Field3 (My working hour) = 4
Remaining Hour I want = 60 - 4 = 56hr
I was using the above script before configuring cascading select list. Could you please change the script for me?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
This really sounds like Time Tracking now.
The only difference with the value you get from a Cascading field is that instead of a single value you would get before (aka single-select list returns single option), you now get a map instead. E.g. [null:parentValue, 1:childValue].
So you're currently getting the value like this
def n = issue.getCustomFieldValue(cf).toString()
So instead, don't convert to String, parse the map first, something like this
def cascadingValue = issue.getCustomFieldValue(cf)
def parent = cascadingValue?.get(null).toString()
def child = cascadingValue?.get("1").toString()
You can do 'log.warn("Current Cascading Value: " + cascadingValue) so you can see what the map looks like, but it's either: null, [null:parent], or [null:parent, 1:child]
In any case I am also somewhat bemused how or why this is setup this way, because this kind of hour tracking is.. well it's not exactly a robust setup. Time Tracking is there for that.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Kindly review my script and make it correct as I'm getting error on line no -29
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.issue.MutableIssue
import com.opensymphony.workflow.InvalidInputException
//def cf = issue.getCustomFieldValue(cff).toString()
def issueManager = ComponentAccessor.getIssueManager()
def linkManager = ComponentAccessor.getIssueLinkManager()
def cfm = ComponentAccessor.getCustomFieldManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager();
def field3 = customFieldManager.getCustomFieldObject("customfield_18844") // field3 ID - Actual hour work
//def cf = customFieldManager.getCustomFieldObject("customfield_18840") //field1 ID - Category Field
//def cff = customFieldManager.getCustomFieldObject("customfield_18841") // field2 ID - Size field
Issue issueKey = issue
def id=issueKey.getId()
final myField = "Category"
def cf = ComponentAccessor.customFieldManager.getCustomFieldObjectByName("myField")
//def issue = issue as MutableIssue
def cfValue = issue.getCustomFieldValue(cf) as HashMap
//def cfValue = issue.getCustomFieldValue(cf) as HashMap
def n = cfValue?.get(0).toString()
def b = cfValue?.get(1).toString()
if (!b) {
throw new InvalidInputException("Child option is Null")
}
//def n = issue.getCustomFieldValue(parentOption).toString()
//def b = issue.getCustomFieldValue(childOption).toString()
def c = Integer.parseInt((issue.getCustomFieldValue(field3) ?: 0).toString().replaceAll(~/[.].*/, ""))
def d = 0;
if(n=="CONCEPT" && b =="M"){ d = 48 }
if(n=="CONCEPT" && b =="M"){ d = 48 }
if(n=="POC" && b =="S"){ d = 30 }
if(n=="POC" && b =="M"){ d = 60 }
if(n=="POC" && b =="L"){ d = 120 }
if(n=="SYSSPEC" && b =="S"){ d = 29 }
if(n=="SYSSPEC" && b =="M"){ d = 58 }
Integer remaining = d - c
return remaining
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
0 is not null, and 1 is not "1", see my snippet, it contains the correct get() syntax.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Why not use a cascading field? It does exactly what you describe - parent & child values.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I have already defined a filed script of those custom field values. It's okay with me to use cascading field but I need the correct script. Could you please help me with my below script to convert from custom filed to cascading?
-------------------------------------------------------------
Below are two fields that I am changing to Cascading.
customfield_18840 and customfield_18841
---------------------------------------------------------------
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.user.ApplicationUser
def issueManager = ComponentAccessor.getIssueManager()
def linkManager = ComponentAccessor.getIssueLinkManager()
def cfm = ComponentAccessor.getCustomFieldManager()
Issue issueKey = issue
def id=issueKey.getId()
def customFieldManager = ComponentAccessor.getCustomFieldManager();
def cf = customFieldManager.getCustomFieldObject("customfield_18840") //field1 ID - Category Field
def cff = customFieldManager.getCustomFieldObject("customfield_18841") // field2 ID - Size field
def field3 = customFieldManager.getCustomFieldObject("customfield_18844") // field3 ID - Actual hour work
def n = issue.getCustomFieldValue(cf).toString()
def b = issue.getCustomFieldValue(cff).toString()
def c = Integer.parseInt((issue.getCustomFieldValue(field3) ?: 0).toString().replaceAll(~/[.].*/, ""))
def d = 0;
if(n=="CONCEPT" && b =="M"){ d = 48 }
if(n=="CONCEPT" && b =="M"){ d = 48 }
if(n=="POC" && b =="S"){ d = 30 }
if(n=="POC" && b =="M"){ d = 60 }
if(n=="SYSSPEC" && b =="S"){ d = 29 }
if(n=="SYSSPEC" && b =="M"){ d = 58 }
Integer remaining = d - c
return remaining
------------------------------------------------
Thanks for support!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Please help me here, as I am getting the negative value in the remaining field if the category and size field is blank. Could you please help me to put a condition here, if the category field is blank then the remaining time script result should not be shown in the issue?
I have used below but it not working .
if (cf == null) {
return
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
A map with keys null and 1 is a very strange data structure. Best not to think why it was done like that.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.