Hi,
I am able to add my custom field type (which was added via a plugin by extending MultiSelectCFType) in Jira and associate it with screen and projects. However it does not show up in the screen(eg create issue screen with which it was associated). I populate the MultiSelectCFType with in jira after adding it.
My code for the field is:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import webwork.action.ActionContext; import com.atlassian.jira.bc.issue.search.SearchService; import com.atlassian.jira.bc.project.component.ProjectComponent; import com.atlassian.jira.component.ComponentAccessor; import com.atlassian.jira.config.FeatureManager; //import com.atlassian.jira.issue.customfields.impl.*; //import com.atlassian.jira.issue.customfields.impl.MultiSelectCFType; import com.atlassian.jira.issue.customfields.impl.MultiSelectCFType; //import com.atlassian.jira.issue.customfields.impl.GenericTextCFType; import com.atlassian.jira.issue.fields.rest.json.beans.JiraBaseUrls; import com.atlassian.jira.issue.customfields.manager.GenericConfigManager; import com.atlassian.jira.issue.customfields.manager.OptionsManager; import com.atlassian.jira.issue.customfields.option.Option; import com.atlassian.jira.issue.customfields.persistence.CustomFieldValuePersister; import com.atlassian.jira.issue.customfields.persistence.PersistenceFieldType; import com.atlassian.jira.issue.customfields.impl.FieldValidationException; import com.atlassian.jira.issue.Issue; import com.atlassian.jira.issue.fields.CustomField; import com.atlassian.jira.issue.fields.config.FieldConfig; import com.atlassian.jira.issue.fields.config.FieldConfigScheme; import com.atlassian.jira.issue.fields.config.manager.FieldConfigSchemeManager; import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem; import com.atlassian.jira.security.JiraAuthenticationContext; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Nullable; public class MyCustomField extends MultiSelectCFType { private JiraAuthenticationContext authContext; private OptionsManager optionsManager; private static final Logger log = LoggerFactory.getLogger(MyCustomField.class); public MyCustomField(OptionsManager optionsManager, CustomFieldValuePersister valuePersister, GenericConfigManager genericConfigManager, JiraBaseUrls jiraBaseUrls, SearchService searchService, FeatureManager featureManager) { super(optionsManager, valuePersister, genericConfigManager, jiraBaseUrls, searchService, featureManager); this.optionsManager = optionsManager; this.authContext = authContext; } @Override public Map<String, Object> getVelocityParameters(final Issue issue, final CustomField field, final FieldLayoutItem fieldLayoutItem) { final Map<String, Object> params = super.getVelocityParameters(issue, field, fieldLayoutItem); //field.getOptions(arg0, arg1) params.put("currentUser", authContext.getLoggedInUser().getName() ); params.put("options", ActionContext.getParameters().get(field.getName()) ); return params; } }
My plugin description uses two velocity files.
<customfield-type name="My Custom Field" i18n-name-key="my-custom-field.name" key="my-custom-field" class="com.fieldPlugin.jira.customfields.MyCustomField"> <description key="my-custom-field.description">The My Custom Field Plugin</description> <resource name="view" type="velocity" location="templates/view-readonly-user.vm"/> <resource name="column-view" type="velocity" location="templates/view-readonly-user.vm"/> <resource name="xml" type="velocity" location="templates/view-readonly-user.vm"/> <resource name="edit" type="velocity" location="templates/edit-readonly-user.vm"/> </customfield-type>
My edit-readonly-user.vm is:
#customControlHeader ($action $customField.id $customField.name $fieldLayoutItem.required $displayParameters) <select name="$customField.id" id="$customField.id" multiple size="5"> <option value="-1">None</option> #foreach ($option in $options) <option value="$option.id">$option.name</option> #end
</select> #customControlFooter ($action $customField.id $fieldLayoutItem.fieldDescription $displayParameters)
My view-readonly-user.vm is:
$!value
I believe I might be getting the $options in the edit-readonly-user.vm wrong (from code).
Can anyone solve this for me? I have not been able to find a working tutorial for a multi-select custom field which gave the .vm as well.
Thanks
Hi,
Have you implemented getValueFromIssue method. A sample is as below
@Override public Collection<Option> getValueFromIssue(CustomField field, Issue issue) { Collection<Option> retValues = new ArrayList<Option>(); List<Object> values = customFieldValuePersister.getValues(field, issue.getId(), PersistenceFieldType.TYPE_LIMITED_TEXT); for (Iterator<Object> iterator = values.iterator(); iterator.hasNext();) { Long optionId = Long.valueOf((String)iterator.next()); retValues.add(optionsManager.findByOptionId(optionId)); } return retValues; }
And in the vm file try using $configs.options
#foreach ($option in $configs.options)
... #end
Tuncay Senturk
Yes I am aware of this funciton, however is it mandatory to override it?
After all I am extending MultiSelectCFType and would not mind using the super class function.
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.
will try it tommorrow
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
@TuncayYes I tried the vm part you suggested. It didnt work.
My edit vm is:
#customControlHeader ($action $customField.id $customField.name $fieldLayoutItem.required
$displayParameters)
<select name="$customField.id" id="$customField.id" multiple size="5">
<option value="-1">None</option>
#foreach ($option in $configs.options)
<option value="$option.id">$option.name</option>
#end
</select>
#customControlFooter ($action $customField.id $fieldLayoutItem.fieldDescription
$displayParameters)
While my class is:
public class MyCustomField extends MultiSelectCFType { private JiraAuthenticationContext authContext; private OptionsManager optionsManager; private static final Logger log = LoggerFactory.getLogger(MyCustomField.class); public MyCustomField(OptionsManager optionsManager, CustomFieldValuePersister valuePersister, GenericConfigManager genericConfigManager, JiraBaseUrls jiraBaseUrls, SearchService searchService, FeatureManager featureManager) { super(optionsManager, valuePersister, genericConfigManager, jiraBaseUrls, searchService, featureManager); this.optionsManager = optionsManager; this.authContext = authContext; } @Override public Map<String, Object> getVelocityParameters(final Issue issue, final CustomField field, final FieldLayoutItem fieldLayoutItem) { final Map<String, Object> params = super.getVelocityParameters(issue, field, fieldLayoutItem); //field.getOptions(arg0, arg1) params.put("currentUser", authContext.getLoggedInUser().getName() ); return params; } };
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Also I tried putting in this function as is you suggested in the class:
@Override public Collection<Option> getValueFromIssue(CustomField field, Issue issue) { Collection<Option> retValues = new ArrayList<Option>(); List<Object> values = customFieldValuePersister.getValues(field, issue.getId(), PersistenceFieldType.TYPE_LIMITED_TEXT); for (Iterator<Object> iterator = values.iterator(); iterator.hasNext();) { Long optionId = Long.valueOf((String)iterator.next()); retValues.add(optionsManager.findByOptionId(optionId)); } return retValues; }
still the field doesnt show.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Thanks for the sample @Tuncay.
The field doenst show up on the screen even when the type has been added.
One thing to know is that when I edit the custom field and go the edit custom field details from JIRA,
it says:
There are no search templates for this custom field type.
Could that be the problem?
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.
I have been able to find out the reason why it was not working.
In the getVelocityParameters function of the class I was doing:
params.put("currentUser", authContext.getLoggedInUser().getName() );
For some reason with that particular statement present the class extended from MultiSelectCFType would not show.
@jobin kuruvilla[Go2Group]
I used your tutorial on how to make a custom field type where you made a class: ReadOnlyUserCF extends GenericTextCFType and used the statement :
params.put("currentUser", authContext.getLoggedInUser().getName() );
for illustration. It didnt give any problems displaying the field on the screen however when extending from MultiSelectCFType this prevents the field from even displaying.
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.
Hi,
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.