SharePoint Online: Hide specific field in View/Edit views based on permission group
-
22-01-2021 - |
Question
I am fairly new to SharePoint Online... What I am trying to accomplish is hiding a certain field in the View and Edit view mode on a Custom List. I have found articles on it but can't seem to figure what I am doing wrong because nothing I do works. I am entering the following code as SEWP in both the View and Edit view modes.
The goal I am trying to achieve: Hide the "Feedback" column if the user IS NOT part of the "Template Test Members" permission group.
<script type="text/javascript>
function checkUser() {
IsCurrentUserMemberOfGroup("Template Test Members", function(isCurrentUserInGroup) {
if (isCurrentUserInGroup) {
} else {
document.getElementById("Feedback").style.display = "none";
}
});
}
function IsCurrentUserMemberOfGroup(groupName, OnComplete) {
var currentContext = new SP.ClientContext.get_current();
var currentWeb = currentContext.get_web();
var currentUser = currentContext.get_web().get_currentUser();
currentContext.load(currentUser);
var allGroups = currentWeb.get_siteGroups();
currentContext.load(allGroups);
var group = allGroups.getByName(groupName);
currentContext.load(group);
var groupUsers = group.get_users();
currentContext.load(groupUsers);
currentContext.executeQueryAsync(OnSuccess, OnFailure);
function OnSuccess(sender, args) {
var userInGroup = false;
var groupUserEnumerator = groupUsers.getEnumerator();
while (groupUserEnumerator.moveNext()) {
var groupUser = groupUserEnumerator.get_current();
if (groupUser.get_id() == currentUser.get_id()) {
userInGroup = true;
break;
}
}
OnComplete(userInGroup);
}
function OnFailure(sender, args) {
OnComplete(false);
}
}
</script>
Display/View Mode
Edit Mode
-Thank you again for any help you can provide
Solution
You can also use jQuery and REST API in script editor webpart:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript">
IsCurrentUserMemberOfGroup = function (groupName) {
var result = false;
$.ajax({
url: _spPageContextInfo.webAbsoluteUrl +'/_api/web/currentuser/groups',
type: "GET",
async: false,
contentType: "application/json;odata=verbose",
headers: {
"Accept": "application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
},
success: function(data){
var groups = data.d.results
for(i=0; i<groups.length; i++) {
if (groups[i].LoginName == groupName) {
result = true;
}
};
},
error: function() { return false; }
})
return result;
}
checkUser = function() {
if (IsCurrentUserMemberOfGroup("Template Test Members") == false)
$('nobr:contains("Feedback")').closest('tr').hide();
}
_spBodyOnLoadFunctionNames.push("checkUser");
</script>
OTHER TIPS
In your code, try to use $('nobr:contains("Feedback")').closest('tr').hide();
instead of document.getElementById("Feedback").style.display = "none";
where there is no ID for each field.
Note: don't forget to add JQuery ref
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
Also, you can achieve that using **SPServices**
Try to add the below Code in script editor web part
for each Edit/ Display Page
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.SPServices/2014.02/jquery.SPServices.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$().SPServices({
operation: "GetGroupCollectionFromUser",
userLoginName: $().SPServices.SPGetCurrentUser(),
async: false,
completefunc: function(xData, Status) {
//in case, the current User does belong to the group "Template Test Members"
if($(xData.responseXML).find("Group[Name='Template Test Members']").length != 1)
{
$('nobr:contains("Feedback")').closest('tr').show();
} else
{
$('nobr:contains("Feedback")').closest('tr').hide();
}
}
});
});
</script>
Note: In display mode, you should use
$('h3:contains("Feedback")').closest('tr').hide();
Check also, Show / Hide a Div based on a user group in SharePoint via SPServices
Test script based on your code.
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script type="text/javascript">
SP.SOD.executeOrDelayUntilScriptLoaded(Validator, 'SP.js');
function Validator() {
IsCurrentUserMemberOfGroup("GroupName", function (isCurrentUserInGroup) {
if (isCurrentUserInGroup) {
alert("1");
} else {
alert("0");
$('input[title="Feedback"]').closest('tr').css('display', 'none');
}
});
}
function IsCurrentUserMemberOfGroup(groupName, OnComplete) {
var currentContext = new SP.ClientContext.get_current();
var currentWeb = currentContext.get_web();
var currentUser = currentContext.get_web().get_currentUser();
currentContext.load(currentUser);
var allGroups = currentWeb.get_siteGroups();
currentContext.load(allGroups);
var group = allGroups.getByName(groupName);
currentContext.load(group);
var groupUsers = group.get_users();
currentContext.load(groupUsers);
currentContext.executeQueryAsync(OnSuccess, OnFailure);
function OnSuccess(sender, args) {
var userInGroup = false;
var groupUserEnumerator = groupUsers.getEnumerator();
while (groupUserEnumerator.moveNext()) {
var groupUser = groupUserEnumerator.get_current();
if (groupUser.get_id() == currentUser.get_id()) {
userInGroup = true;
break;
}
}
OnComplete(userInGroup);
}
function OnFailure(sender, args) {
OnComplete(false);
}
}
</script>