Remove Picklist option based on Security Roles

Most of the client asks for this requirement. They want to hide picklist options based on security roles. Let’s take an example for this, for example if we have picklist “Customer Status” having four option like “Request for Approve”,”Approved”,”Rejected”,”Black Listed”. Let’s say we have requirement to show only first option to all users having security roles other then “System Admin”. Only “System Admin” should be able to see all of these options, you can implement this using below code

//First check user have “sys admin” role or not

function CheckSecurityRole() {

    var xml = “” +

    “<?xml version=”1.0″ encoding=”utf-8″?>” +

    “<soap:Envelope xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>” +

    GenerateAuthenticationHeader() +

    ” <soap:Body>” +

    ” <RetrieveMultiple xmlns=”http://schemas.microsoft.com/crm/2007/WebServices”>” +

    ” <query xmlns:q1=”http://schemas.microsoft.com/crm/2006/Query” xsi:type=”q1:QueryExpression”>” +

    ” <q1:EntityName>role</q1:EntityName>” +

    ” <q1:ColumnSet xsi:type=”q1:ColumnSet”>” +

    ” <q1:Attributes>” +

    ” <q1:Attribute>name</q1:Attribute>” +

    ” </q1:Attributes>” +

    ” </q1:ColumnSet>” +

    ” <q1:Distinct>false</q1:Distinct>” +

    ” <q1:LinkEntities>” +

    ” <q1:LinkEntity>” +

    ” <q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>” +

    ” <q1:LinkFromEntityName>role</q1:LinkFromEntityName>” +

    ” <q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>” +

    ” <q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>” +

    ” <q1:JoinOperator>Inner</q1:JoinOperator>” +

    ” <q1:LinkEntities>” +

    ” <q1:LinkEntity>” +

    ” <q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>” +

    ” <q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>” +

    ” <q1:LinkToEntityName>systemuser</q1:LinkToEntityName>” +

    ” <q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>” +

    ” <q1:JoinOperator>Inner</q1:JoinOperator>” +

    ” <q1:LinkCriteria>” +

    ” <q1:FilterOperator>And</q1:FilterOperator>” +

    ” <q1:Conditions>” +

    ” <q1:Condition>” +

    ” <q1:AttributeName>systemuserid</q1:AttributeName>” +

    ” <q1:Operator>EqualUserId</q1:Operator>” +

    ” </q1:Condition>” +

    ” </q1:Conditions>” +

    ” </q1:LinkCriteria>” +

    ” </q1:LinkEntity>” +

    ” </q1:LinkEntities>” +

    ” </q1:LinkEntity>” +

    ” </q1:LinkEntities>” +

    ” </query>” +

    ” </RetrieveMultiple>” +

    ” </soap:Body>” +

    “</soap:Envelope>” +

    “”;

    var xmlHttpRequest = new ActiveXObject(“Msxml2.XMLHTTP”);

    xmlHttpRequest.Open(“POST”, “/mscrmservices/2007/CrmService.asmx”, false);

    xmlHttpRequest.setRequestHeader(“SOAPAction”, ” http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple”);

    xmlHttpRequest.setRequestHeader(“Content-Type”, “text/xml; charset=utf-8”);

    xmlHttpRequest.setRequestHeader(“Content-Length”, xml.length);

    xmlHttpRequest.send(xml);

    var resultXml = xmlHttpRequest.responseXML;

    if (resultXml != null) {

        //select the node text

        var RoleResponse = resultXml.selectNodes(“//BusinessEntity/q1:name”);

        if (RoleResponse != null) {

            for (i = 0; i < RoleResponse.length; i++) {

                if (RoleResponse[i].text == ‘System Administrator’) {

                    return true;

                }

            }

        }

    }

    return false;

}

//if your does not have sys admin role remove picklist options

//Let consider I have used index 1,2,3,4 for our picklist options

function HidePicklistOptions()

{

    If(!CheckSecurityRole())

    {

    var Picklist=crmForm.all.new_customerstatus; // get picklist

    Picklist.DeleteOption(2); //use approval index to remove Approved from piclist

    Picklist.DeleteOption(3); //to remove Rejected

    Picklist.DeleteOption(4); //to remove Black Listed

    }

}

 DeleteOption basically removes picklist option temporary, it does not remove them from database permanently.

Enjoy !!!

Leave a Reply

Your email address will not be published. Required fields are marked *