Monday, October 29, 2012

SharePoint 2013 REST Service

SP 2010 is the first version of SharePoint which supports REST API/Service (REpresentational State Transfer). SP 2010 has REST located at http://[web site URL/_vti_bin/ListData.svc.

SharePoint 2013 has few changes related to REST access URL. SP 2013 has REST located at http://[web site URL]/_api/.

SharePoint 2013 REST endpoints map to SharePoint Client object model types and members. As we know that, SharePoint Client Object Model allows access to various objects in the hierarchy down from the Site Collection i.e. Site (Site Collection), Web (Web Site), List, ListItem etc.

Similarly, the SP 2013 REST allows access to object Site and the objects below it in the hierarchy.

SP 2010 REST API was allowing access to only lists and their items in a web site. SP 2010 REST never given access to Site or Web objects whereas SP 2013 REST can access these objects as well.

Let us see how REST works and how the REST endpoints are formed.


Access Site Collection Object and its properties

http://[Web Url]/_api/site

Use above URL format to access the site collection object in Atom feed format. Do you re-collect “Site” object in Client Object Model representing site collection? Here we used the same object after “_api/”.

Web URL can be any web site in the site collection. Site object can be accessed from any web site in the site collection.

Look at the below XML response for the site collection object.


 
There are two XML namespaces “m:” and “d:” representing metadata and data namespaces respectively.  Complex types and collections are represented as Atom feeds in REST and belong to default namespace. The properties with primitive types belong to “<m:properties>” node.

The “term” attribute on the “<category>” node has value set to fully qualified name of the type of Client Object Model.

The <link> node represents the collections and complex type properties of the object. The “href” attribute provides the /site relative URL to access the atom feed for collection/complex type.

e.g. To access Root Web of the site collection, use

http://[web URL]/_api/site/RootWeb

Similarly one can access the primitive properties by appending the name property in URL after “/site/”. The response is not in Atom feed format. It is just a XML fragment. e.g. To know if the site collection allows use of SharePoint Designer, use

http://[web URL]/_api/site/AllowDesigner

The properties presented in REST response do not contain all properties of “Site” type. e.g “Site” has property “Usage”. There is no <link> node for it in the response, but we can access the property using below URL.
http://[web URL] /_api/site/usage

Access Web site and its properties
http://[Web Url]/_api/web

The above REST endpoint lets us access the basic Web object of Client Object Model.
 
To read web “Title”, use

http://[web URL]/_api/web/title
To read lists collection in a web site, use

http://[web URL]/_api_web/lists

The response from above REST endpoint contains nodes for each list/library in the web site. You can access the specific list, using the <id> node value inside the specific list’s entry.

To read the specific list details, use
http://[Web Url]/_api/web/Lists(guid'[Guid of the list]')

To access the items of a list, use
http://[Web Url]/_api/web/Lists(guid'[guid of the list]')/Items

To access an item with specific ID, use
http://[Web Url]/_api/web/Lists(guid'[guid of the list]')/Items([id of the item])

Thursday, October 4, 2012

Related List /Items View in SharePoint 2010

SharePoint 2010 has an enhancment to show related list views. There is pre-requisite to make it work. You should have lists with relation established using lookup columns.

Let's try it.

1. Create a custom list named "Country". We will use "Title" column. If you want to add any new columns, you can do so.

2. Create one more list named "City". Create the columns as shown below. The "Country" must be a lookup column to "Country" list.

3. Add some city information to the list.

4. Right-click on any city and click "Open in New tab/Window". This way it will launch the display form in browser window. This will make "Site Actions" menu available. The "Site Actions" menu is not available in dialog. Click "Site Actions" -> Edit Page.

Click inside the existing web part zone. The ribbon starts presenting "Page Tools" tab. It has a button "Related List". Click it. It shows the all related list. In our case, it is city.

5. Click on the related List "City". It added a related items view as shown below. It will only show cities for the selected country. i.e. the country for which display form is shown.

6. Do not forget to click "Stop Editing" in the "Page" tab of ribbon. This actually saves the page with changes.

7. User can add items to the related list using related items web part. Click the "Add new item" link and it starts showing add new item form page for the "City" list. You can add item here. If the Country display form (View Properties) is being preseneted for "India", still you can add item for "Japan" from this screen. Be careful.


8. You can change the view of related list items. You can add/ remove column from the view using "Edit the current view" link or selected the appropriate view from the drop-down.

9. Edit the current view, after saving view changes takes back to the display form which will show nothing. So close the browser tab/window and reopen. You can see the changes.

Using SPD 2010:

1. Create a new view "DetailedView" for Country list. The view must be same as All Items view.
2. Check-out the page in SharePoint Designer 2010. To accomplish this, open the list using All Files option in SPD 2010.
3. Right-click the page and click on "Edit in Advanced mode".
4. In "Design" view, click inside the available web part zone. Put the cursor at a location where you want to add the related list items web part.
5. Click "Insert" tab in ribbon and it has a button called "Related Item View". This button presents all related lists as shown below.

6. Click the "City:Country" and it adds the related items view on the page as below. Save the page and check -in
7. The view page on browser refresh starts showing a new column as shown below to select an item and the related items are shown for the selected item. Selected item has dark black arrow icon.
 


I will suggest to use browser based method as it will avoid the un-ghosting of the page. But if you would like to customize the XSL of related items web part, better to use SharePoint Designer.

Saturday, September 29, 2012

My First Look at SharePoint 2013 Site

[The content is specific to SharePoint 2013 Preview. The RTM may come up with some changes.]

SharePoint 2013 - I was waiting for you. Yes, today I started working on SharePoint 2013 (Preview) site.

I put the URL in browser and this is what I see on home page.


I have highlighted few parts in the picture. These are new in the UI and are not self-explanatory.

Let us have a look at each one.

Edit Links

What links are they talking about? Do they mean page links? Can we re-organize or update page links? Why duplicates are placed at top and below left navigation? Too many questions... came to my mind. Let's give it a try.

Click "Edit Links" in the top. The UI changes in-place as below.

I clicked the "+" sign and it presented me with screen below. It asks for the "Text to be displayed as link" and the target URL.

Can't I specify the target to open the link in new window? There is no way. This a Global navigation, use it only for links scoped to the content in the site collection.

Click "OK". It added a link in Global navigation. But the link is not saved... we have to click on "Save".

Here is how it looks after saving.

Can I edit the link? Yes, I can. Click on "Edit Links" and then click on the link itself. It presents the below screen changes. Click on "Link" icon which is similar to infinity symbol.

It allows to update the link. (Note: This applies to only saved links. If you have added a link but not saved and before saving you want to edit. It does not allow to do it.)

So the duplicate below left navigation...it updates the links in left navigation and it should contain links scoped to the site level content.

Focus On Content

There is an icon on right side at the top icons collection. On hovering the icon, it displays a tooltip saying "Focus on content".

I clicked it...the left navigation bar disappeared. I again clicked it, the left navigation re-appeared. This is really good. Rather than the navigation items occupying the real-esate of screen, it will become available for content. User will have a better experience while working with the content. When required, user can invoke the navigation on demand. Really, cool...!

Stay tuned...!more stuff coming up about SP 2013.

(The screen-shots are from Office 365 Preview site. There is not much difference in the UI of actual SharePoint 2013 site. So the notes apply to SharePoint 2013 Preview site.)

Sunday, September 23, 2012

List the "vti_" properties using PowerShell

Every file/document in SharePoint possess some meta-info. It is stored in hashtable presented by SPFile.Properties property. Most of the properties start with "vti_". We cannot write the "vti_" properties as they are read-only.

But we can use this property-bag store custom meta-property for the file. We can manage the custom properties using below method:
  • SPFile.AddProperty
  • SPFile.SetProperty
  • SPFile.GetProperty

SPFile.CustomizedPageStatus property determines the customization status of wiki page or page layout using below properties.
  • vti_setuppath
  • vti_hasdefaultcontent
Different SharePoint objects has the hashtable based property to store these kind of properties. e.g SPWeb.AllProperties. SPWeb.AllProperties["__PagesListId"] stores the GUID value of "Pages" library created on activating publishing feature.

Changing the UIVersion of migrated sites automatically updates the master page to appropriate UIVersion. This is possible because of the SPWeb.AllProperties. It stores the master page details related to each UIVersion.

PowerShell script to list the "vti_" properties of a file.

$web=Get-SPWeb <webSite URL >
$list=$web.Lists["Site Pages"]
foreach($item in $list.Items)
{
    $item.File.Name
    Write-Host "**********"
    foreach($key in $item.File.Properties.Keys)
    {
        Write-Host $key "=" $item.File.Properties[$key]
    }
    Write-Host "------------------*****---------------------------"
}

PowerShell script to list "vti_" properties of web site.

$web=Get-SPWeb <webSite URL >
foreach($key in $web.AllProperties.Keys)
{
     Write-Host $key "=" $web.AllProperties[$key]
}

Have a look!

Saturday, July 7, 2012

Missing IIS_WPG group on SharePoint 2010 server

If you have came across this TechNet link, you will find that the SP 2010 setup user account should be present in IIS_WPG group. We faced some issue for which we were investigating the account permissions and their group memberships.

On our servers we found that there is no IIS_WPG group. Initially I thought this can be the cause of issue. But I also noted that there is IIS_IUSRS group. I never paid attention to this group or never came across any such group in the context of Web development.

I googled for IIS_WPG and IIS_IUSRS keywords. I found a good link explaining the difference of these group. IIS_WPG is replaced by IIS_IUSRS group in IIS 7. Our servers are Window 2008 based and so our systems have the IIS 7.

IIS_WPG group is specific to earlier versions of IIS.

So if you find similar discrepancy in SharePoint systems, do not panic. Check for availability of IIS_IUSRS group.

Friday, June 15, 2012

Insert Picture From SharePoint is disabled in CEWP

Recently I came across a scenario in which the user was using content editor web part (CEWP) and using the Rich Text Editor ribbon of SharePoint 2010 to format the content. The user noted that "Insert Picture From SharePoint" option is disabled on a page.



I started investigating and came across MSDN Forum where it is mentioned that activating a publishing feature will resolve the issue. The site must be in publishing context. In our case, the site has the publishing feature activated.

We tried creating various kind of pages (Wiki Page, Web Part Page and Publishing Page). The option was enabled for every kind of page on the same site.

The option was disabled for only one page i.e. default.aspx. The page resides at the site root. I created a web part page in "Site Pages" and verified the option is enabled for the page. I opened the site in SharePoint Designer 2010. I moved the page to the site root. Again, I browsed for the page in edit mode and verified the option, it was disabled.

The page at site root does not belong to any library and has no associated content type for it. The page has few content management features disabled such as "Versioning", "Edit Properties". This is because the page was not child of any library (an orphan page or the parent is site).

Publishing feature has a strong bond with content management features. As the page do not have content management features available, it was not able to take advantage of the publishing context also. That's the reason, it was showing "Insert Picture From SharePoint" in disabled state.

This is not only this option, it also disables capabilities to cut, copy, paste in the Rich Text Editor.

Wednesday, June 13, 2012

Content Editor Web Part duplicating content

Today I received a request mentioning that Content Editor Web Part is duplicating the content. The user was adding clock object prepared in Adobe Flash. This clock was being duplicated whenever the user is editing the web part.

I checked the content editor web part. It has got too many "<embed>" tag. The tags were being duplicated. The clock was being rendered using some JavaScript method. We inspected the method. The method was using "document.write" to add the "<embed>" tag.

Content editor web part renders its HTML/JavaScript content on its canvas. So document.write was adding "<embed>" tag on every "Save" for the web part. So every edit action for the web part was adding "<embed>" tag causing duplicate clocks (content).

We resolved the issue by creating separate content file for Content Editor Web Part. The content file is linked to the Content Editor Web part. As the "document.write" is moved to separate file, for every request the file is read and parsed for render. "document.write" do not append content in the file. So it has no duplication of content.

Always use separate content file whenever we have a content which includes "document.write" in JavaScript.

More Reference(s):

Wednesday, May 23, 2012

SPDocumentLibrary.CheckedOutFiles? A Common Misunderstanding

What is a checked out file?
Any file which locked for changes...so the changes are not visible to the other users. In SharePoint, we have a option to check out a file.
Go to the library, open a file's ECB (Edit Control Block) menu options and clik "Check Out" menu item.

So any file, which is checked out this way, is a checked out file. Isn't it? Yes, it is checked out file.

Now, try this.
Write a small console application, which will display count of SPDocumentLibrary.CheckedOutFiles. In case of SharePoint 2010, a small PowerShell script will do.

Execute the utility and note down the count of Checked Out files. Go to a document library and check out one file. Re-execute the utility and read the count...It does not change.Try again with two-three files. It does not change the count of SPDocuemntLibrary.CheckedOutFiles.

Why?
 MSDN describes "SPDocumentLibrary.CheckedOutFiles" as "the collection of files that are uploaded to the document library but are not checked in."

If the document library requires check out before editing any file and you upload a file to this library...the file will added in a checked out state. The file does not have a checked in version available. The file will not be visible to any one before check in.

SPDocumentLibrary.CheckedOutFiles represent the collection of files, which do not have a checked in version.

"Requires Check out" setting is available in "Version Settings" of library.

Can we override Check out of these files from Object Model?
SPDocumentLibrary.CheckedOutFiles is a collection of SPCheckedOutFile objects. SPCheckedOutFile does not derive from any class. SPCheckedOutFile does not have any member to check in the file.

SPCheckedOutFile has a property "ListItemId". If we exploit it to retrieve SPFile object, then we can check in the file. SPFile has a method "CheckIn". Code must be executed with the credentials of the user who has the ownership of these files. As the files are not visible to others, code with other user credentials fails to retrieve the SPFile object for these files.

SPCheckedOutFile type has a method "TakeOverCheckOut". If we use this method, you will have the file ownership and then we can retrieve the SPFile object for check in purpose.

Can we override check out of these files from UI?
These files are only visible to the user who has uploaded the files. Then how to override the check out for these files.
Go to the library settings, you will see a link "Manage Checked Out Files" in "Permissions and Management" category. MOSS 2007 and SharePoint 2010 has different versions of the link text as  follows.
MOSS 2007:
SPS 2010:
SharePoint 2010 corrected the confusing text.

So click on this link, and you can see the files which do not have checked in version. The UI provide the option to take the ownership of these files. Take the ownership of this files and from library view, you can check in/ delete the files. Taking ownership of these files, makes the files visible to you only and other users can not see the files.

Files checked out which have checked in version
Any file which is explictly checked out from the library...is visible to all with check out status. It can be retrieved as SPFile object. SPFile has properties to read the details of check out. These details are also presented in UI.

SPFile.CheckOutStatus property indicates whether the file is checked out or not. There are other members of SPFile which gives details about check out. e.g.CheckedOutBy, CheckedOutDate etc.

As the files are visible to all, we can easily override the check out of these files from UI or Object Model code.

To summarize
SPDocumentLibrary.CheckedOutFiles represents files which does not have checked version. This property does not count the files, which are explictly checked out. This property should not be used to report the number of checked out files.

Use loop in object model and count the files with CheckedOutStatus turned ON.  Then add the count of SPDocumentLibrary.CheckedOutFiles.

In UI, create a view of checked files, note the count of files. Visit "Manage Checked out files" link in library settings, count the files. Add the counts of these files.

Tuesday, May 8, 2012

Home page of Wiki Page Library / Site

SPFolder class has a "WelcomePage" property. This property is used to set home page for a site / a library or a folder. How to do use it in PowerShell?

1. To set site home page.

$web=Get-SPWeb {webUrl} #remove curly braces
$web.RootFolder.WelcomePage="default.aspx" #change to appropriate value
$web.RootFolder.Update()

2.To set a default page for Wiki Page Library. If clicking on "Wiki Page Libray" in quick launch menu or in all site contents directly opens a page in the library instead of showing the library pages, execute below script. It will start showing all pages.

$web=Get-SPWeb {webUrl} #remove curly braces
$list=$web.Lists[{Wiki Library Name}] #curly braces must be removed.
$list.RootFolder.WelcomePage="Forms/AllPages.aspx"
$list.RootFolder.Update()

Saturday, May 5, 2012

List Settings Error 0x80070024

Recently we faced a problem accessing "List Settings". The error said "The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator. 0x80070024." The List Settings page was working fine in the other site collections.

We created one custom list with one item. The list has the same issue even though it has single item.

We found an entry in ULS Logs saying "big list, slow query operation" The log has mentioned the List GUID which is being queried. I wrote a Powershell to find the list. The list is hidden "Workflows" document library. I tried the document library URL in browser, it returned me "404 Not found". One of my colleague used the list guid with _layouts/listedit.aspx(application page List Settings refer) and it did show us the Library settings. We verified the library settings but it did not helped.

I wrote a PowerShell to find the number of items in the list and it returned 0. So there are no items but still it is causing the issue. We were clueless about the behavior. I wrote the below PowerShell script, executed it, and there were no errors on hitting the "List Settings".

$web=Get-SPWeb [webUrl]  #remove the square bracckets here
$list=$web.Lists["Workflows"]  #Keep the square brackets in this line.
$list.EnableThrottling=$false
$list.Update()

For the time being, we used this solution. I am investigating the cause for the issue. The "Workflows" document library is used to store the site level workflows. The library is created by SharePoint Designer (SPD) on first ever SPD workflow creation in the site.

Visit again, for the updates!
[Update 05/08/2012: I found that the "Workflows" library reports -1 in ItemCount. As such, no list or library should report ItemCount as a negative number. As mentioned in this post, Microsoft has accepted that MOSS 2007 has the issue of negative ItemCount. The site, we are referring to, is a migrated site. So the library was reporting negative ItemCount. Negative item count is a cause for failure of indexing operation. If indexing fails, queries perform slow. It was causing the throttle issue even though the "Workflows" library is empty.

Resolution: If the "Workflows" library is empty, delete it. SharePoint Designer will recreate the library on SPD workflow creation. If the library is not empty, then there will be no issue as ItemCount will always report positive number.

The issue may occur only in migrated sites hoping that Microsoft has taken care of the issue in SharePoint 2010.]

Sunday, April 29, 2012

Missing "Manage Permissions" in Document Library

While working on a site, I encountered a document library where it was showing fewer menus in Edit Control Block (EBC) (also referred as List Item Menu). I noticed there is absence of "Manage Permissions" menu. It was a clear indication that document library has been broken. I tried to figure it out looking at the list schema, field schemas, views etc. but of no use.

"Manage Permissions" is the essential menu item to manage the item level permissions. Client was also interested in it.

The document library was the only one which was misbehaving in the site.

After looking at various options, I realized that we can provide "Manage Permissions" link using Custom Action.

SharePoint Designer 2010 has made it very easy to create Custom Action. Custom Actions can be created to display the new/edit or display form, to initiate a workflow or to navigate to a url. Custom Actions also support URL tokens such as {ListId}. I just observed the "Manage Permissions" link in other document libraries and analyzed the URL with query string parameters.

"Manage Permissions" navigate to : _layouts/user.aspx (application page)
Query string comprises of obj (it has list id/GUID, item id and entity category), and list (it has list GUID).

URL looks like as below:
http://server/<weburl>/_layouts/user.aspx?obj=<list Id>,<item id>, LISTITEM&List=<list id>

Custom Actions support various URL tokens. I referred the below URL tokens.
  1. {ListId} --List Guid
  2. {ItemId} -- Item Guid
My URL for custom action :

http://server/<weburl>/_layouts/user.aspx?obj={ListId},{ItemId},LISTITEM&List={ListId}

That's it! I named my custom action as "Manage Permissions". This is just a workaround. We will investiagate the reason behind misbehave and update the post.

Thursday, April 26, 2012

Filterable Multi-valued PeopelPicker Column using PowerShell

Recently I came across an error while filtering the multi-valued PeoplePicker column. The error reads "Cannot show the value of filter. The field may not be filterable, or the number of items returned exceeds the list view threshold enforced by the administrator." There are only four values in the column, surely it has no rleation to the list view threshold value.

Internally, SharePoint server uses "_layouts/filter.aspx" application page for filter values which are presented in an iFrame. I checked the ULS logs and copied the Request URL with filter.aspx. I pasted it in browser and hit "Enter". It returned no result.

What is multi-valued field?
The field which allows more than one values or which allows multiple selections. The multi-valued fileds are non-sortable, non-filterable. Multi-valued fields cannot be indexed.

Fix:
This behavior can be overridden. Every field has an associated schema. Multi-valued fields are marked as "Sortable =false" in the schema for performance reasons. Note: Apply the workaround wherever it is unavoidable.

If we mark the multi-valued PeoplePicker as "Sortable=true", the column turns filterable/ sortable. This can be achieved using SharePoint Server Object Model or using Windows PowerShell (I love it).

PowerShell Script to mark the column as Sortable:

$web=Get-SPWeb <weburl>
$list=$web.Lists[<list title>]
$field=$list.Fields[<field title>]
$strSchema=$field.SchemaXml
$str=Schema$strSchema.Replace("Sortable=`"FALSE`"","Sortable=`"true`"")
$field.SchemaXml = $strSchema
[Update: I noticed that multi-valued "person or group" coulmn in other web application was showing filter choices even though "Sortable=false". Googling did not help. I checked at various levels and found that "Online Presence" setting causes this error. If Online presence setting is turned OFF, SP 2010 starts showing this error for multi-valued columns when tried to filter. So turn it ON, and...no error, filter choices are shown back. The Online Presence setting is available in Web applications's General Settings.]

Sunday, April 8, 2012

Powershell to find site collections with specific feature activated

This is a one liner Powershell to find site collections which have the specific feature activated. See the below example, it display URLs of site collections where "SharePoint Publishing Infrastructure" feature is activated. The "PublishingSite" is the name of publishing infrastructure feature.

Get-SPSite -Limit All| Where-Object {(Get-SPFeature "PublishingSite" -ErrorAction SilentlyContinue -Site $_.Url) -ne $null } | Select Url

So the format is

Get-SPSite -Limit All | Where-Object { (Get-SPFeature <Feature Name> -ErrorAction SilentlyContinue -Site $_.Url) -ne $null } | Select Url

Note that it will only check for site collection scoped features. The above Powershell can be modified for web scoped features as below.

Get-SPSite -Limit All| Get-SPWeb -Limit All | Where-Object { (Get-SPFeature <Feature Name> -ErrorAction SilentlyContinue -Web $_.Url) -ne $null } | Select Url

e.g. To check Publishing feature activation status at web scope, it will look like as below. "PublishingWeb" is a web scoped feature.

Get-SPSite -Limit All| Get-SPWeb -Limit All | Where-Object { (Get-SPFeature "PublishingWeb" -ErrorAction SilentlyContinue -Web $_.Url) -ne $null } | Select Url

This powershell block can be extended for web application/Farm scoped features also.