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

enter image description here

Edit Mode

enter image description here

-Thank you again for any help you can provide

Was it helpful?

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>
Licensed under: CC-BY-SA with attribution
Not affiliated with sharepoint.stackexchange
scroll top