Change where Edit Control Button (ECB) appears in a list or library in sharepoint

The Edit Control Button (ECB) aka the context drop-down menu that appears for lists and libraries, as shown in the image below, is the way you can execute built in and custom actions on list and library items.

image

A question that many people wonder about is: how can I move this menu so it appears on a different field instead of the default one?

Well, wonder no more! Watch the video below to see how it's done. One catch though: you will need SharePoint Designer 2010 (available for free) to make the change.

Enabling and Disabling ECB menu on list/library items





SharePoint 2013 Themes engine

In SharePoint 2010, we are able to use any of the pre-built Themes or customize any of them using just the browser. If that was not enough , we are able to use either Microsoft Word, PowerPoint or Theme Builder to create new .thmx files that could then be uploaded to the Theme gallery by the site collection administrator and made available for site owners and designers to use on their sites.

The whole theming engine has changed and been reworked in SharePoint 2013. Everything is based on HTML instead of any proprietary format. The image below shows the actual Theme Gallery which is filled with font and color palette files.

Theme gallery

As a result of this change in direction for theme building, you are no longer able to use Word, PowerPoint or Theme Builder to create new Themes.

Themes are only modifiable using the internet browser (aside from programmatic methods of course, which we will not be discussing here). Fourteen HTML 5 based Themes are available out-of-the-box to be used as needed. When designing a theme in the browser, you can pick any of the provided Themes as a starter template then design a much richer customized theme by choosing the fonts, color palette and your own background image.

Available Themes






jQuery and Sharepoint Web Services: GetListItems with queries

The business case for this, was to add a context menu item based on an item property, in my case, document status.


Essentially this method was called just before the item is added to the context menu item, it is intercepted at the Custom_AddListMenuItems method which allows you to add list menu items. In the method below, i use the local ID of the conext menu item clicked, together with the list guid (ctx.listname) and i query the list for the document status of that item.
I only add the menu item when docstatus is not equal to published. Another interesting note is the ajax call is done synchronously which forces the program halt execution until the ajax call has received a response from the web service.

01

02
function ShowModerationHistory(currentItemID, r, t, m, v, y) {
03
 
04
    var returnValue = false;
05
    var soapEnv =
06
            "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
07
                <soapenv:Body> \
08
                     <GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
09
                        <listName>" + ctx.listName + "</listName>" +
10
			            "<viewFields>" +
11
			            "<ViewFields>" +
12
		                    "<FieldRef Name='DocumentStatus' />" +
13
			            "</ViewFields>" +
14
     			        "</viewFields>" +
15
                            "<query>" +
16
			                    "<Query>" +
17
                                    "<Where>" +
18
                                    "<Eq>" +
19
                                    "<FieldRef Name='ID' />" +
20
                                    "<Value Type='Integer'>" + currentItemID + "</Value>" +
21
                                    "</Eq>" +
22
                                    "</Where>" +
23
                                "</Query>" +
24
                            "</query> " +
25
                        "</GetListItems> " +
26
                    "</soapenv:Body> " +
27
                "</soapenv:Envelope>";
28
    $.ajax({
29
        url: SP.PageContextInfo.get_webServerRelativeUrl() + "/_vti_bin/lists.asmx",
30
        type: "POST",
31
        dataType: "xml",
32
        data: soapEnv,
33
        async: false,
34
        complete: function (xData, status) {
35
            var docStatus = $(xData.responseXML).find("z\\:row:eq(0)").attr("ows_DocumentStatus");
36
            if (docStatus != null && docStatus != undefined) {
37
                if (docStatus.toUpperCase() != "PUBLISHED") {
38
                    x = CIMOpt(r, t, m, v, null, y);
39
                }
40
            }
41
        },
42
        beforeSend: function (xhr) {
43
            xhr.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/sharepoint/soap/GetListItems');
44
        },
45
        contentType: "text/xml; charset=\"utf-8\""
46
    });
47
 
48
}

How to Creat List Items with jQuery and the SharePoint Web Services


In How to Call the SharePoint Web Services with jQuery I showed how to make a call to SharePoint’s Lists.asmx web service with the jQuery library to retrieve information about the Lists and Document Libraries that are available on a specific SharePoint Site. In the comments of that post, one of the readers asked if it would be possible to create a new item in a List using the same technique. Of course this is possible, you just need to make use of the UpdateListItems web method (yeah, the name of that method is not very intuitive). Here is a quick example!
First let’s create the UI (in this example I'll use a basic Site Page) to allow the user to enter a Title for the new task, and a button to do the action.
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderMain">
<p>
Task Title:
<input id="newTaskTitle" type="text" />
<input id="newTaskButton" type="button" value="Create Task" />
</p>
</asp:Content>
Next let’s create a Javascript function that will create a new item in a Task list. In the Javascript function I’m declaring two variables that will contain the XML which will be sent to the SharePoint Lists.asmx web service. The first variable (I called it batch) contains the CAML to create a new item. For simplicity the CAML only provides a value for the Title field, add more fields if you’d like. The second variable (called soapEnv) is the SOAP Envelope XML which wraps the batch XML. Notice that in the SOAP Envelope the name of the list is mentioned in which we’re going to create a new item (in this case the Task list). Finally the jQuery ajax function is used to POST the data to the Lists.asmx web service. (If you test this code make sure you update the url option with the URL of your site).
function CreateNewItem(title) {
var batch =
"<Batch OnError=\"Continue\"> \
<Method ID=\"1\" Cmd=\"New\"> \
<Field Name=\"Title\">" + title + "</Field> \
</Method> \
</Batch>";
var soapEnv =
"<?xml version=\"1.0\" encoding=\"utf-8\"?> \
<soap:Envelope xmlns:xsi=\"
http://www.w3.org/2001/XMLSchema-instance\" \
xmlns:xsd=\"
http://www.w3.org/2001/XMLSchema\" \
xmlns:soap=\"
http://schemas.xmlsoap.org/soap/envelope/\"> \
<soap:Body> \
<UpdateListItems xmlns=\"
http://schemas.microsoft.com/sharepoint/soap/\"> \
<listName>Tasks</listName> \
<updates> \
" + batch + "</updates> \
</UpdateListItems> \
</soap:Body> \
</soap:Envelope>";
$.ajax({
url: "
http://yoursite/_vti_bin/lists.asmx",
beforeSend: function(xhr) {
xhr.setRequestHeader("SOAPAction",
"
http://schemas.microsoft.com/sharepoint/soap/UpdateListItems");
},
type: "POST",
dataType: "xml",
data: soapEnv,
complete: processResult,
contentType: "text/xml; charset=utf-8"
});
}
The jQuery ajax function call has a complete option which points to a function, in this function you can process the result as follows:
function processResult(xData, status) {
alert(status);
}
The status parameter is a string which can be for example success or error. Finally in the ready event of the document, we'll hook up the click event of the button so the CreateNewItem function is called, with the value of the textbox as the parameter.
$(document).ready(function() {
$("#newTaskButton").click(function() {
CreateNewItem($("#newTaskTitle").val());
});
});
That’s it! If you put all the code in a simple Site Page, upload the page to a Document Library in a SharePoint site, and now you can create Task list items by only using Javascript! The sample code can be downloaded in the following zip file. The zip file also contains the jQuery library which you can upload to the same Document Library if it isn't already loaded with the help of the SmartTools.jQuery component for example.

Sharepoint2013/SharePoint2010/SharePoint2007 and JQuery Web Services: DeleteList


I had a requirement today to be able to perform a delete of a list without having to perform a postback. After a little bit of How to Call the SharePoint Web Services with jQuery and a little bit of fine-tuning i came up with a delete list method (deletelist()). Below is just an example of what can be done with the Lists.asmx webservice provided by Sharepoint. Obviously any Web Service can be used or called as required.

01
 
02
function delete_list(listid) {
03
            if (confirm("Are you sure you want to delete this container?") == true) {
04
                var message = listid;
05
                var soapEnv =
06
                "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
07
                    <soapenv:Body> \
08
                        <DeleteList xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
09
                        <listName>" + listid + "</listName>\
10
                        </DeleteList> \
11
                    </soapenv:Body> \
12
                </soapenv:Envelope>";
13
 
14
                $.ajax({
15
                    url: "_vti_bin/lists.asmx",
16
                    beforeSend: function (xhr) {
17
                        xhr.setRequestHeader("SOAPAction",
18
        "http://schemas.microsoft.com/sharepoint/soap/DeleteList");
19
                    },
20
                    type: "POST",
21
                    dataType: "xml",
22
                    data: soapEnv,
23
                    contentType: "text/xml; charset=\"utf-8\"",
24
                    complete: processResult,
25
                    success: function (j) {
26
                        document.location.reload();
27
                    }
28
                });
29
 
30
            } else {
31
                return false;
32
            }
33
        }
34
        function processResult(xData, status) { 
35
            var resultXml = $(xData.responseXML).find("errorstring").text();
36
            resultXml = $.trim(resultXml);
37
            if (resultXml != "") {
38
                alert(resultXml);
39
            }           
40
        }
41

How to Creat List Items with jQuery and the SharePoint Web Services


In How to Call the SharePoint Web Services with jQuery I showed how to make a call to SharePoint’s Lists.asmx web service with the jQuery library to retrieve information about the Lists and Document Libraries that are available on a specific SharePoint Site. In the comments of that post, one of the readers asked if it would be possible to create a new item in a List using the same technique. Of course this is possible, you just need to make use of the UpdateListItems web method (yeah, the name of that method is not very intuitive). Here is a quick example!
First let’s create the UI (in this example I'll use a basic Site Page) to allow the user to enter a Title for the new task, and a button to do the action.
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderMain">
<p>
Task Title:
<input id="newTaskTitle" type="text" />
<input id="newTaskButton" type="button" value="Create Task" />
</p>
</asp:Content>
Next let’s create a Javascript function that will create a new item in a Task list. In the Javascript function I’m declaring two variables that will contain the XML which will be sent to the SharePoint Lists.asmx web service. The first variable (I called it batch) contains the CAML to create a new item. For simplicity the CAML only provides a value for the Title field, add more fields if you’d like. The second variable (called soapEnv) is the SOAP Envelope XML which wraps the batch XML. Notice that in the SOAP Envelope the name of the list is mentioned in which we’re going to create a new item (in this case the Task list). Finally the jQuery ajax function is used to POST the data to the Lists.asmx web service. (If you test this code make sure you update the url option with the URL of your site).
function CreateNewItem(title) {
var batch =
"<Batch OnError=\"Continue\"> \
<Method ID=\"1\" Cmd=\"New\"> \
<Field Name=\"Title\">" + title + "</Field> \
</Method> \
</Batch>";
var soapEnv =
"<?xml version=\"1.0\" encoding=\"utf-8\"?> \
<soap:Envelope xmlns:xsi=\"
http://www.w3.org/2001/XMLSchema-instance\" \
xmlns:xsd=\"
http://www.w3.org/2001/XMLSchema\" \
xmlns:soap=\"
http://schemas.xmlsoap.org/soap/envelope/\"> \
<soap:Body> \
<UpdateListItems xmlns=\"
http://schemas.microsoft.com/sharepoint/soap/\"> \
<listName>Tasks</listName> \
<updates> \
" + batch + "</updates> \
</UpdateListItems> \
</soap:Body> \
</soap:Envelope>";
$.ajax({
url: "
http://yoursite/_vti_bin/lists.asmx",
beforeSend: function(xhr) {
xhr.setRequestHeader("SOAPAction",
"
http://schemas.microsoft.com/sharepoint/soap/UpdateListItems");
},
type: "POST",
dataType: "xml",
data: soapEnv,
complete: processResult,
contentType: "text/xml; charset=utf-8"
});
}
The jQuery ajax function call has a complete option which points to a function, in this function you can process the result as follows:
function processResult(xData, status) {
alert(status);
}
The status parameter is a string which can be for example success or error. Finally in the ready event of the document, we'll hook up the click event of the button so the CreateNewItem function is called, with the value of the textbox as the parameter.
$(document).ready(function() {
$("#newTaskButton").click(function() {
CreateNewItem($("#newTaskTitle").val());
});
});
That’s it! If you put all the code in a simple Site Page, upload the page to a Document Library in a SharePoint site, and now you can create Task list items by only using Javascript! The sample code can be downloaded in the following zip file. The zip file also contains the jQuery library which you can upload to the same Document Library if it isn't already loaded with the help of the SmartTools.jQuery component for example.

How to Call the SharePoint Web Services with jQuery


If you read this blog you probably know that besides the web user interface, SharePoint also exposes some interfaces which you can use from code: the SharePoint object model and the SharePoint web services. The object model of SharePoint can only be used by code/applications that are running on a SharePoint server in your Server Farm, so you can’t use the object model on client machines. The SharePoint web services can be used of course across a network boundary, that’s what they are built for! In this post I’m going to show you how you can access the out-of-the-box SharePoint web services by making use of the jQuery Javascript library. First let’s see what you can do with this technique: download this zip file that contains an ASPX page (a basic Site Page without any code behind), and the jQuery Javascript library (in case you don’t have it already). Upload the two individual files (not the zip file) in the root of a Document Library in any of your SharePoint sites. You can do this by making use of the web user interface; you don’t have to touch anything on the server itself. When done, just click on the link of the uploaded ASPX and you’ll see following page:


Probably you’re not really impressed but think about the fact that this page is just an ASPX file you’ve uploaded through the web user interface, there is absolutely no code behind involved (which would have been blocked by SharePoint’s default security settings). The details of the SharePoint lists are loaded by making use of Javascript code that calls the web SharePoint lists.asmx web service.
So how do you call a SharePoint web service in Javascript code; well you can use the XmlHttpRequest object and write lots of boring code, or you can make use of a Javascript library that wraps this XmlHttpRequest object and exposes a nice and easy interface. In this demo I’ll use the jQuery Javascript library, so the first thing that you’ll need to do is to make sure the page is loading that library:
<script type="text/javascript" src="jquery-1.3.2.min.js" mce_src="jquery-1.3.2.min.js"></script>
If you already configured your SharePoint site so the jQuery library is loaded (for example by making use of the SmartTools.jQuery component), you can skip this line of course.
When the page is loaded, the Lists web service (e.g. http://yoursite/_vti_bin/lists.asmx) of SharePoint needs to be called; this can be accomplished by making use of the jQuery’s ajax method. This method can post the necessary SOAP envelope message to the Lists web service. The XML of the SOAP envelope can easily be copied from the .NET web service test form of the desired web method (e.g. http://yoursite/_vti_bin/lists.asmx?op=GetListCollection). In the code below, a call to the GetListCollection web method is made when the page is loaded. The complete parameter of the ajax method is actually a pointer to another Javascript function (which we’ll implement later on) that will be called asynchronously when the web service call is done. Don’t forget to update the url parameter with your SharePoint site’s URL!
$(document).ready(function() {
var soapEnv =
"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
<soapenv:Body> \
<GetListCollection xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
</GetListCollection> \
</soapenv:Body> \
</soapenv:Envelope>";
$.ajax({
url: "
http://yoursite/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
complete: processResult,
contentType: "text/xml; charset=\"utf-8\""
});
});
As I already mentioned, the processResult function is called when the response XML of the web service call is received. In this method a loop is created which will iterate over every List element of the response XML. For every List element a <li></li> element is added to the element with the ID attribute set to data.
function processResult(xData, status) {
$(xData.responseXML).find("List").each(function() {
$("#data").append("<li>" + $(this).attr("Title") + "</li>");
});
}
This data element is the actual <ul></ul> list in HTML:
<ul id="data"></ul>
When you put everything together in a Site Page, this is the result:


In the zip file mentioned in the beginning of this post, you can find an extended version of the processResult function which will display some additional metadata for every list (like the ID, ItemCount etc). The entire contents of basic version of the Site Page built in this post goes as follows:
<%@ Page Language="C#" MasterPageFile="~masterurl/default.master" %>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderAdditionalPageHead">
<script type="text/javascript" src="jquery-1.3.2.min.js" mce_src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var soapEnv =
"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
<soapenv:Body> \
<GetListCollection xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
</GetListCollection> \
</soapenv:Body> \
</soapenv:Envelope>";
$.ajax({
url: "
http://yoursite/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
complete: processResult,
contentType: "text/xml; charset=\"utf-8\""
});
});
function processResult(xData, status) {
$(xData.responseXML).find("List").each(function() {
$("#data").append("<li>" + $(this).attr("Title") + "</li>");
});
}
</script>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderMain">
<ul id="data"></ul>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea">
List Details
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderPageTitle">
List Details
</asp:Content>

How to Call the SharePoint Web Services with jQuery


If you read this blog you probably know that besides the web user interface, SharePoint also exposes some interfaces which you can use from code: the SharePoint object model and the SharePoint web services. The object model of SharePoint can only be used by code/applications that are running on a SharePoint server in your Server Farm, so you can’t use the object model on client machines. The SharePoint web services can be used of course across a network boundary, that’s what they are built for! In this post I’m going to show you how you can access the out-of-the-box SharePoint web services by making use of the jQuery Javascript library. First let’s see what you can do with this technique: download this zip file that contains an ASPX page (a basic Site Page without any code behind), and the jQuery Javascript library (in case you don’t have it already). Upload the two individual files (not the zip file) in the root of a Document Library in any of your SharePoint sites. You can do this by making use of the web user interface; you don’t have to touch anything on the server itself. When done, just click on the link of the uploaded ASPX and you’ll see following page:


Probably you’re not really impressed but think about the fact that this page is just an ASPX file you’ve uploaded through the web user interface, there is absolutely no code behind involved (which would have been blocked by SharePoint’s default security settings). The details of the SharePoint lists are loaded by making use of Javascript code that calls the web SharePoint lists.asmx web service.
So how do you call a SharePoint web service in Javascript code; well you can use the XmlHttpRequest object and write lots of boring code, or you can make use of a Javascript library that wraps this XmlHttpRequest object and exposes a nice and easy interface. In this demo I’ll use the jQuery Javascript library, so the first thing that you’ll need to do is to make sure the page is loading that library:
<script type="text/javascript" src="jquery-1.3.2.min.js" mce_src="jquery-1.3.2.min.js"></script>
If you already configured your SharePoint site so the jQuery library is loaded (for example by making use of the SmartTools.jQuery component), you can skip this line of course.
When the page is loaded, the Lists web service (e.g. http://yoursite/_vti_bin/lists.asmx) of SharePoint needs to be called; this can be accomplished by making use of the jQuery’s ajax method. This method can post the necessary SOAP envelope message to the Lists web service. The XML of the SOAP envelope can easily be copied from the .NET web service test form of the desired web method (e.g. http://yoursite/_vti_bin/lists.asmx?op=GetListCollection). In the code below, a call to the GetListCollection web method is made when the page is loaded. The complete parameter of the ajax method is actually a pointer to another Javascript function (which we’ll implement later on) that will be called asynchronously when the web service call is done. Don’t forget to update the url parameter with your SharePoint site’s URL!
$(document).ready(function() {
var soapEnv =
"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
<soapenv:Body> \
<GetListCollection xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
</GetListCollection> \
</soapenv:Body> \
</soapenv:Envelope>";
$.ajax({
url: "
http://yoursite/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
complete: processResult,
contentType: "text/xml; charset=\"utf-8\""
});
});
As I already mentioned, the processResult function is called when the response XML of the web service call is received. In this method a loop is created which will iterate over every List element of the response XML. For every List element a <li></li> element is added to the element with the ID attribute set to data.
function processResult(xData, status) {
$(xData.responseXML).find("List").each(function() {
$("#data").append("<li>" + $(this).attr("Title") + "</li>");
});
}
This data element is the actual <ul></ul> list in HTML:
<ul id="data"></ul>
When you put everything together in a Site Page, this is the result:


In the zip file mentioned in the beginning of this post, you can find an extended version of the processResult function which will display some additional metadata for every list (like the ID, ItemCount etc). The entire contents of basic version of the Site Page built in this post goes as follows:
<%@ Page Language="C#" MasterPageFile="~masterurl/default.master" %>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderAdditionalPageHead">
<script type="text/javascript" src="jquery-1.3.2.min.js" mce_src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var soapEnv =
"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
<soapenv:Body> \
<GetListCollection xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
</GetListCollection> \
</soapenv:Body> \
</soapenv:Envelope>";
$.ajax({
url: "
http://yoursite/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
complete: processResult,
contentType: "text/xml; charset=\"utf-8\""
});
});
function processResult(xData, status) {
$(xData.responseXML).find("List").each(function() {
$("#data").append("<li>" + $(this).attr("Title") + "</li>");
});
}
</script>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderMain">
<ul id="data"></ul>
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea">
List Details
</asp:Content>
<asp:Content runat="server" ContentPlaceHolderID="PlaceHolderPageTitle">
List Details
</asp:Content>

How to Add a Lookup Column in CAML for sharepoint 2010/sharepoint2007

I was creating a list definition in code which needed to lookup to a column of another list on the same site. After consulting this article, it seemed easy. Well as with many MSDN articles, they don't give the full picture. After playing with it for a while i finally came to a solution. Here are some gotchas:

Problem: The get information from lookup list was empty
Solution:
Here is my final XML for the field:

01
02
<Field ID="{3F55B8CF-3537-4488-B250-02914EE6C5A1}" 
03
Name="BoardsID" DisplayName="BoardsID" StaticName="BoardsID" 
04
FillInChoice="TRUE" List="Lists/Board" Type="Lookup"
05
Group="Custom Fields"
06
Required="TRUE" 
07
ShowInNewForm="TRUE" 
08
ShowInEditForm="TRUE" 
09
ShowInViewForms="TRUE">
10
      </Field>

Make sure firstly the "List" property has the correct url. Lists/[List Name]. Also make sure it contains nothing else, like "ShowField" property. It stopped working for me.

Problem: Field not showing on NewForm etc
Solution:

1. Check content types. My List in which the lookup field resided was inherting from the "item" content type. I needed to remove this. Search for the ContentTypes tag and remove all items:

1
<ContentTypes>      
2
    </ContentTypes>





Using PeopleEditor throw the WSS Error: “the control is not available because you do not have the correct permissions” in SharePoint

 I was using a people picker which was filtered to only use a particular sharepoint group! If I, as site collection administrator, accessed it, it worked fine and i was able to select a person. However for anyone else this did not work!
 

Solution:

Well, it worked out that all the users needed to be added to this list in order to get it working. I even tried to set the permission of the lists in the User permission List itself, gave them full control but still nothing.

This is due to the settings of the group you have specified in the "People Picket Column"

Browse to the group which you have the people picker set to, check the group settings Who can view the membership of the group? Group Members * Everyone (check Everyone) now the error you had before of "the control is not available because you do not have the correct permissions" should be gone…..