Thursday, February 19, 2009

AJAX enable Zone Tabs Web part in Sharepoint

1. Install Zone Tabs web part from http://code.msdn.microsoft.com/zonetabs/Release/ProjectReleases.aspx?ReleaseId=201

All credit goes to Bob German who developed this wonderful web part: http://blogs.msdn.com/bobgerman/archive/2008/02/19/back-in-the-zone-with-zonetabs.aspx

Installation steps:
a) Add Solution: (assuming you copy the .wsp file in C drive)
stsadm.exe –o addsolution –filename “C:\ EasyTabParts.wsp”

b) Deploy Solution:
stsadm.exe –o deploysolution –name “EasyTabParts.wsp” –url “http://sitecollectionurl” –allowgacdeployment –immediate

c)This feature has now been installed at your site collection specified
Activate this feature for your Site Collection.

Add this web part to any of your pages in web part zones i.e Left, Right, Middle, Bottom etc. (Note: you have to AJAXIFY this zone in the Page Layout, covered later in this article)

Works wonderfully well, but refreshes the whole page when you click on respective Tabs, our task is to make it AJAX driven, thereby causing only partial post-backs and not full page refreshes.

2. Download ASP.NET 2.0 AJAX extensions 1.0 from http://www.ajax.asp.net

3. Ensure that you have MOSS SP 1 installed for sure; also install the December Cumulative updates from Microsoft too.

4. Configure your SharePoint web application with AJAX.
It means you have to add some entries in web.config for your SharePoint web application. This could be time consuming and error-prone, instead I recommend you to install this great utility available at Codeplex, http://www.codeplex.com/ajaxifymoss/Release/ProjectReleases.aspx?ReleaseId=13360

It automatically adds the web.config extensions for you.

Here are the installation steps:Download the zip file, extract it, and execute deploy.cmd on your MOSS environment. The stsadm commands for ajaxifying MOSS will then be available.

- add asp.net ajax to web.config
stsadm -o addajax -url "http://your.moss.webapplication"

NOTE: After installing this, one entry got missed from Safe Control assembly, I guess it is an inherent bug in the utility, go to your web.config file and ensure that this piece of code exists in your web.config Safe Control section

<SafeControl Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />

If it exists, its good for you, in case it doesn’t, then you have to add it manually

- remove asp.net ajax from web.config
stsadm -o removeajax -url http://your.moss.webapplication

- add .Net 3.5 ajax to web.config
stsadm -o addajax35 -url http://your.moss.webapplication

-remove .Net 3.5 ajax from web.config
stsadm -o removeajax35 -url "http://your.moss.webapplication"

In any case, you are not successful and get stuck, using the above utility, refer to Mike’s blog at: http://sharepoint.microsoft.com/blogs/mike/Lists/Posts/Post.aspx?ID=3 and make the web.config changes manually.

5. Modify your master page. If you have an customized your master page, using SharePoint designer, Check Out and make changes, else if you have deployed master page as a feature, make these changes in your Visual Studio solution and re-deploy the feature once again using upgrade command of stsadm utility

a) Search for <webpartpages:spwebpartmanager id="m" runat="Server"> in your master page and add the Script Manager tag just beneath the above tag

<asp:ScriptManager runat="server" ID="ScriptManager1" />

b) Add the following JavaScript function in your master page, just above the closing head tag

<script type="text/javascript" language="javascript">
function RestoreToOriginalFormAction()
{
if (_spOriginalFormAction != null) {
if (_spEscapedFormAction==document.forms[0].action){
document.forms[0].action=_spOriginalFormAction;
}
_spOriginalFormAction=null;
_spEscapedFormAction=null;

document.forms[0]._initialAction = document.forms[0].action;
}

</script>

c) Add the javascript method RestoreToOriginalFormAction() in the Body onload tag, as follows:

<BODY scroll="yes" onload="javascript:if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper(); RestoreToOriginalFormAction();">

6. Modify your Page Layout
This is the final step in getting your Zone Tabs to work with AJAX, choose your Page Layout depending on your page, where you have added the Easy Tabs webpart, remember the webpart zone: for eg: Left, Middle, Right, Bottom, Top Left, Top Right etc.

We need to place the Update Panel just above the webpart zone, here is the code for update panel (assuming, we are adding the update panel on the left webpart zone), copy this code:

<asp:UpdatePanel id="LeftPanel" runat="server">
<ContentTemplate>
<WebPartPages:WebPartZone runat="server" Title="Left" ID="LeftColumn" Orientation="Vertical">
<ZoneTemplate></ZoneTemplate>
</WebPartPages:WebPartZone>
</ContentTemplate>
</asp:UpdatePanel>
After adding this code to your page layout, it should appear in the following way in Sharepoint Designer:



Similar to this you can add many Update Panels in different zones in the same page layout, I added two update panel controls with different id’s on the Left Webpart zone and the other on the Right webpart zone.

Finally go to your site page, see the Easy Tab webparts with AJAX in action. Now when you click any of the tabs, you will see only the webpart zone getting refreshed and not the full page.

If you find this information useful, send in your valuable comments

Wednesday, February 11, 2009

Sharepoint List/Library Permissions - A new utility on Codeplex

Recently, I released my own utility on CodePlex, it is known as Sharepoint List Security Manager.

It addresses the inherent permission issue of Sharepoint Document Library, where two contributors are able to edit/delete each others document.

I personally faced this issue, while I was developing a Knowledge Base Portal, we were dealing with a lot of document libraries in this project, but unlike Lists, there was no OOTB way to set who should Read or Edit documents within the library.

Sharepoint Lists have this built-in mechanism in place OOTB, so when you go to List Settings -> Advanced Settings you can set this permission, but the same is missing for a Document Library.

I made a generic tool to set these permissions for any list/library on your server farm.

The utility allows you to set
List/Library Read permissions to: a) Everyone b) Only Author
Write permissions to: a) Everyone b) Only Author c) None


The utility is developed using Windows Forms in C#, it is very intuitive and user-friendly. You can download this from CodePlex, available here: http://www.codeplex.com/ListSecurityManager/Release/ProjectReleases.aspx?ReleaseId=23086

Saturday, February 7, 2009

Shared Services Error "An indexer is not assigned to the Shared Services Provider 'SharedServices1"

A few days back, i was unable to import user profiles, after our development server crashed and fortunately we restored it using the last known back-up of the Virtual machine. All of a sudden our user profiles import and search crawling and indexing services stopped abruptly, throwing a nasty "An indexer is not assigned to the Shared Services Provider 'SharedServices1' error.

Luckily i found a solution for the same:
a. Log in to Central Administration
b. Select your Shared Services provider and choose "Edit Properties" from the drop-down context menu
c. Configure your Index server and it works like a charm...