Hi everyone,
I'm trying to limit the options of a multi select list based on a choice that's been made in a single select list via Behaviors.
So the single select listA has values of A, AB and the multi-select listB has values Monday, Tuesday, Wednesday
If single select listA= A, I want multi-select listB to show the values Monday, Wednesday
If single select listA= AB, I want multi-select listB to show the values Monday, Tuesday
Any Ideas how to archive this?
thanks in advance for any help
Hi Melanie
Welcome to the community :)
There are dozens of such examples in the community, but here is how I would do it.
def formFieldA = getFieldByName('fieldA')
def formFieldB = getFieldByName('fieldB')
def map = [
'A':['Monday', 'Wednesday'],
'AB':['Monday', 'Tuesday']
]
def cfFieldB = customFieldManager.getCustomFieldObject(formFieldB.fieldId)
def config = cfFieldB.getRelevantConfig(issueContext)
def allOptions = optionsManager.getOptions(config)
def optionsToAllow = allOptions.findAll{ option->
map[formFieldA.value].contains(option.value)
}
formFieldB.setFieldOptions(optionsToAllow)
This script should be applied to the server-side script for FieldA. This will make the script run each time fieldA is changed.
Writing it this way makes it easier to copy to other scenarios and/or add new option mapping in the future.
Hi @PD Sheehan
thanks so much for your help. Really appreciate it! 🙏
I applied it to my fieldA but I'm getting two errors, not sure if I can just ignore them or if its something that must be fixed to have it work properly..
-> def allOptions = optionsManager.getOptions(config)
variable is undeclared
-> map[formFieldA.value].contains(option.value)
no such property: value for class: java.lang.Object
Could you have a look at it and tell me, what needs to be changed/added here?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Ah... sorry, I wasn't careful with the details.
Add the following 3 lines a tthe top of the script:
import com.atlassian.jira.component.ComponentAccessor
def optionsManager = ComponentAccessor.optionsManager
def customFieldManager = ComponentAccessor.customFieldManager
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Did it. No errors now. But it's only working for my first mapping.
So selecting A shows the multi-select with the options I want but selecting B shows nothing at all, the multi-select field is not showing up.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Make sure the spelling for B matches the first part in my example
def map = [
'A':['Monday', 'Wednesday'],
'AB':['Monday', 'Tuesday']
]
I took you literally and labeled the second option "AB". If your second label is B and not AB, then your map will look like this:
def map = [
'A':['Monday', 'Wednesday'],
'B':['Monday', 'Tuesday']
]
Beyond that, I'll need to see your full script.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
import com.atlassian.jira.component.ComponentAccessor
def optionsManager = ComponentAccessor.optionsManager
def customFieldManager = ComponentAccessor.customFieldManager
def formFieldA = getFieldByName('Zielgruppe')
def formFieldB = getFieldByName('Tätigkeit')
def map = [
'Büropersonal':["Arbeitszeitmanager/-in","Betriebsdisponent/-in","Betriebsmanager", "Fahr-, Dienst- und Umlaufplaner/-in","Koordinator Kundendialog", "Leiter Fahrgastmarketing", "Leiter/-in Niederlassung" ,"Marktmanager","Mitarbeiter Fahrtwunschzentrale", "Personaldisponent/-in","Referent Fahrgastmarketing", "Referent Kommunikation", "Sachbearbeiter Abomanagement","Sachbearbeiter Kundencenter","Sachbearbeiter Kundendialog","Teamleiter Abomanagement","Teamleiter Fahrdienst","Teamleiter Fahrtwunschzentrale","Teamleiter Kundencenter","Teamleiter Leistelle","Teamleiter Werkstatt"],
'Fahrpersonal':["Busfahrer","Teamleiter Fahrdienst"]
]
def cfFieldB = customFieldManager.getCustomFieldObject(formFieldB.fieldId)
def config = cfFieldB.getRelevantConfig(issueContext)
def allOptions = optionsManager.getOptions(config)
def optionsToAllow = allOptions.findAll{ option->
map[formFieldA.value].contains(option.value)
}
formFieldB.setFieldOptions(optionsToAllow)
Thats how it looks. The Values I gave you were just examples because, as you can see, there are a lot of values I want to show
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 see anything inherently wrong there.
You can add something like this to give you immediate clues:
formFieldA.setHelpText("Detected value $formFieldA.value (${formFieldA.value.getClass()}) in $formFieldA.fieldId this maps to ${map[formFieldA.value]}")
That might provide some clues. Maybe there is a slight spelling diference.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Okay, added this to my script and I noticed something odd while running it.
Selecting A gets me the multi-select and some info what options are mapped to A.
Selecting B only gets me the info about the mapped options, but no multi-select.
And selecting another option C in FieldA shows me the info about the mapped options even tough I haven't even mapped them. But it says, that the options from B are also mapped to C. I made some screenshots so it might be more clear.. except the lines you posted last I havent changed anything in the script.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Okay, added this to my script and I noticed something odd while running it.
Selecting A gets me the multi-select and some info what options are mapped to A.
Selecting B only gets me the info about the mapped options, but no multi-select.
And selecting another option C in FieldA shows me the info about the mapped options even tough I haven't even mapped them. But it says, that the options from B are also mapped to C. I made some screenshots so it might be more clear.. except the lines you posted last I havent changed anything in the script.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
When the helpText doesn't change after you change the single-select, I suspect there is some error happening in the code. If you have access to your <jira-home>/log/atlassian-jira.log I suspect you will find some additional clues there.
But given that you have unmapped options that I assume you want to default to showing all options in that case.
You can try this
import com.atlassian.jira.component.ComponentAccessor
def optionsManager = ComponentAccessor.optionsManager
def customFieldManager = ComponentAccessor.customFieldManager
def formFieldA = getFieldByName('Zielgruppe')
def formFieldB = getFieldByName('Tätigkeit')
def map = [
'Büropersonal':["Arbeitszeitmanager/-in","Betriebsdisponent/-in","Betriebsmanager", "Fahr-, Dienst- und Umlaufplaner/-in","Koordinator Kundendialog", "Leiter Fahrgastmarketing", "Leiter/-in Niederlassung" ,"Marktmanager","Mitarbeiter Fahrtwunschzentrale", "Personaldisponent/-in","Referent Fahrgastmarketing", "Referent Kommunikation", "Sachbearbeiter Abomanagement","Sachbearbeiter Kundencenter","Sachbearbeiter Kundendialog","Teamleiter Abomanagement","Teamleiter Fahrdienst","Teamleiter Fahrtwunschzentrale","Teamleiter Kundencenter","Teamleiter Leistelle","Teamleiter Werkstatt"],
'Fahrpersonal':["Busfahrer","Teamleiter Fahrdienst"]
]
def cfFieldB = customFieldManager.getCustomFieldObject(formFieldB.fieldId)
def config = cfFieldB.getRelevantConfig(issueContext)
def allOptions = optionsManager.getOptions(config)
def optionsToAllow
def selected = formFieldA.value
if(selected in map.keySet()){
formFieldA.setHelpText("Detected mapped value $formFieldA.value in ${formFieldA.fieldId}. Multi-select will be limited to ${map[formFieldA.value]}")
optionsToAllow = allOptions.findAll{ option->
map[formFieldA.value].contains(option.value)
}
} else {
formFieldA.setHelpText("Detected unmapped value $formFieldA.value in ${formFieldA.fieldId}. Multi-select will include all options")
optionsToAllow = allOptions
}
formFieldB.setFieldOptions(optionsToAllow)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I was able to find the reason why it wasn't working. Another plugin was the reason. Now everything works perfectly :) Thank you so much for you help and patience!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Happy to help.
Glad you figured it out. :)
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.