I've written an own plugin according to https://developer.atlassian.com/server/jira/platform/creating-a-custom-field-type/
hiding custom field to users being member of a specific project role:
package com.test;
import com.atlassian.jira.issue.customfields.impl.GenericTextCFType;
import com.atlassian.jira.issue.customfields.manager.GenericConfigManager;
import com.atlassian.jira.issue.customfields.persistence.CustomFieldValuePersister;
import com.atlassian.jira.issue.customfields.view.CustomFieldParams;
import com.atlassian.jira.issue.fields.TextFieldCharacterLengthValidator;
import com.atlassian.jira.security.JiraAuthenticationContext;
import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport;
import java.util.Collection;
import java.util.Map;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.security.JiraAuthenticationContext;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.project.Project;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.security.roles.*;
import java.util.Iterator;
public class JiraCustomField extends GenericTextCFType {
private final JiraAuthenticationContext authContext;
private final ProjectRoleManager roleManager;
public JiraCustomField(
@JiraImport CustomFieldValuePersister customFieldValuePersister, @JiraImport TextFieldCharacterLengthValidator textFieldCharacterLengthValidator, @JiraImport JiraAuthenticationContext jiraAuthenticationContext) { super(customFieldValuePersister, genericConfigManager, textFieldCharacterLengthValidator , jiraAuthenticationContext);
this.authContext = jiraAuthenticationContext;
this.roleManager = projectRoleManager;
}
public Map getVelocityParameters(Issue issue, CustomField field, FieldLayoutItem fieldLayoutItem) {
Map params = super.getVelocityParameters(issue, field, fieldLayoutItem);
Collection<ProjectRole> roles = roleManager.getProjectRoles(authContext.getLoggedInUser(), issue.getProjectObject());
Iterator<ProjectRole> iterator = roles.iterator();
boolean bHidden = false;
while (iterator.hasNext()) {
if(iterator.next().getName().startsWith("external")) {
bHidden = true;
break;
}
}
params.put("hidden", bHidden);
return params;
}
}
Parameter "hidden" is successfully accessible in the vm files.
I've managed to set the field to readonly in edit screen which works flawlessly.
#disable_html_escaping()
#customControlHeader ($action $customField.id $customField.name $fieldLayoutItem.required $displayParameters $auiparams)
#if ($hidden)
<input class="text" id="$customField.id" name="$customField.id" type="text" value="[hidden]" readonly="readonly"/>
#else
<input class="text" id="$customField.id" name="$customField.id" type="text" value="$textutils.htmlEncode($!value)"/>
#end
#customControlFooter ($action $customField.id $fieldLayoutItem.fieldDescription $displayParameters $auiparams)
Unfortunately in view screen there is always the little edit pencil behind the field which allows all users to see and edit the field.
Question:
How can I hide content and the edit button in view screen to non authorized users?