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&#8221;);

    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 !!!

Advertisements

Leave a comment

Filed under JS Script, MS CRM 4.0

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s