Monday 10 September 2012

Creating Color-Coded Calendar Events in SharePoint 2010


A great addition to SharePoint 2010 is the Calendar Overlay functionality, allowing the user to create color-coded events in a calendar based on user-defined event categories, out of the box.  Below is a simple walkthrough of the process.
 
1. Modify the default categories created by the list (Calendar Tab on Ribbon -> List Settings -> Category Column)
Modify Calendar Categories
 
2. Add a couple of events, at least one in each category for testing purposes
 Add Calendar Events by Category

 
3. Create a separate view to display each Category (Calendar Tab on Ribbon -> Create View -> Calendar View)  
 Create Category Views
**You will end up with one view for each category**
 
4. Make one more view that will be the view with all color coded views overlaid  (Calendar Tab on Ribbon -> Create View -> Calendar View) 
Create View for Overlays
 
5. Add a new calendar (category view)  to the Calendar Color Overlay View (Calendar Tab on Ribbon -> Calendars Overlay) with a Category that is blank **You must do this FROM the Calendar Color Overlay View
Calendar Overlay Settings
 
6. Name the Calendar, select SharePoint, select a color for the category, and click Resolve to populate the Lists and List Views available in the SharePoint site under Web URL. Select your Calendar and the View you created in Step 3.  Select Always Show.  **Repeat steps 4 and 5 for each category view**
Color Coding Details
 
7. Your Calendar Overlay Settings for the Calendar Color Overlay View will look similar to the screenshot with a Calendar for each category
All Overlaid Views
 
8. Your resulting calendar view will have the four views overlaid, with a color for each category.  A legend is displayed on the left corresponding to each view.  
Overlaid Calendar Events

Thursday 6 September 2012

Add List Item Using Infopath Form SharePoint 2010


using Microsoft.Office.InfoPath;
using System;
using System.Xml;
using System.Xml.XPath;
using Microsoft.SharePoint;

namespace Form1
{
    public partial class FormCode
    {
        // Member variables are not supported in browser-enabled forms.
        // Instead, write and read these values from the FormState
        // dictionary using code such as the following:
        //
        // private object _memberVariable
        // {
        //     get
        //     {
        //         return FormState["_memberVariable"];
        //     }
        //     set
        //     {
        //         FormState["_memberVariable"] = value;
        //     }
        // }

        // NOTE: The following procedure is required by Microsoft InfoPath.
        // It can be modified using Microsoft InfoPath.
        public void InternalStartup()
        {
            ((ButtonEvent)EventManager.ControlEvents["CTRL5_5"]).Clicked += new ClickedEventHandler(CTRL5_5_Clicked);
        }

        public void CTRL5_5_Clicked(object sender, ClickedEventArgs e)
        {
            SPSite site = new SPSite("siteurl");
            SPWeb web = site.OpenWeb();
            web.AllowUnsafeUpdates = true;
            SPList InfopathList = web.Lists["InfopathList"];
         
            XPathNavigator xnav = MainDataSource.CreateNavigator();
            XPathNodeIterator rows = xnav.Select("/my:myFields", NamespaceManager);
            while (rows.MoveNext())
            {
                SPListItem item = InfopathList.Items.Add();

                string Title = rows.Current.SelectSingleNode("@my:Title", NamespaceManager).Value;
                string EmployeeId = rows.Current.SelectSingleNode("my:EmployeeId", NamespaceManager).Value;
                string EmployeeName = rows.Current.SelectSingleNode("my:EmployeeName", NamespaceManager).Value;


                item["Title"] = Title;
                item["EmployeeId"] = EmployeeId;
                item["EmployeeName"] = EmployeeName;
                item.Update();
            }
            XPathNavigator x1 = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/@my:Title", this.NamespaceManager);
            XPathNavigator x2 = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:EmployeeId", this.NamespaceManager);
            XPathNavigator x3 = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:EmployeeName", this.NamespaceManager);

            x1.SetValue("");
            x2.SetValue("");
            x3.SetValue("");
        }
    }
}

Timer Job In Sharepoint 2010


1. Open Visual Studio 2010 and select File –> New –Project…image
2. In the New Project window, under Installed Templates, select SharePoint –> 2010 and select Empty SharePoint Project. Give the project a Name and click OK.image
3. Enter the URL for SharePoint local site, check the Deploy as a farm solution, and click Finish.image
4. Create a new class.  Right click on the project in the Solution Explorer window and select Add –New Item…image
5. In the Add New Item window, under Installed Templates, select Visual C# –Code and select Class.  Give the class a name and click OK.image
6. The new class needs to inherit from the Microsoft.SharePoint.Administration.SPJobDefinition class. Copy and paste the following code, which creates a the constructors, overrides the Execute() method, and inherits theSPJobDefinition class: (Note: In this code example, an item is added to a SharePoint list every time the Execute() method is called.  The list called “ListTimerJob” must reside within SharePoint.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
 
namespace UpshotSP
{
    class ListTimerJob : SPJobDefinition
    {
         public ListTimerJob()
 
            : base()
        {
 
        }
 
        public ListTimerJob(string jobName, SPService service, SPServer server, SPJobLockType targetType)
 
            : base(jobName, service, server, targetType)
        {
 
        }
 
        public ListTimerJob(string jobName, SPWebApplication webApplication)
 
            : base(jobName, webApplication, null, SPJobLockType.ContentDatabase)
        {
 
            this.Title = "List Timer Job";
 
        }
 
        public override void Execute(Guid contentDbId)
        {
 
            // get a reference to the current site collection's content database
 
            SPWebApplication webApplication = this.Parent as SPWebApplication;
 
            SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];
 
            // get a reference to the "ListTimerJob" list in the RootWeb of the first site collection in the content database
 
            SPList Listjob = contentDb.Sites[0].RootWeb.Lists["ListTimerJob"];
 
            // create a new list Item, set the Title to the current day/time, and update the item
 
            SPListItem newList = Listjob.Items.Add();
 
            newList["Title"] = DateTime.Now.ToString();
 
            newList.Update();
 
        }
    }
}

7. Add a Feature to the solution by right clicking on Features in the Solution Explorer window and selecting Add Feature.image
8. Right click on Feature1 and select Add Event Receiver.image
9.  A new class is created that handles the feature’s events.  Copy and paste the following code, which handles theFeatureActivated event, installing the custom timer job, and handles the FeatureDeactivating event, uninstalling the custom timer job:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
namespace UpshotSP.Features.Feature1
{
[Guid("9a724fdb-e423-4232-9626-0cffc53fb74b")]
public class Feature1EventReceiver : SPFeatureReceiver
    {
        const string List_JOB_NAME = "ListLogger";
        // Uncomment the method below to handle the event raised after a feature has been activated.
 
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;
 
            // make sure the job isn't already registered
 
            foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
            {
 
                if (job.Name == List_JOB_NAME)
 
                    job.Delete();
 
            }
 
            // install the job
 
            ListTimerJob listLoggerJob = new ListTimerJob(List_JOB_NAME, site.WebApplication);
 
            SPMinuteSchedule schedule = new SPMinuteSchedule();
 
            schedule.BeginSecond = 0;
 
            schedule.EndSecond = 59;
 
            schedule.Interval = 5;
 
            listLoggerJob.Schedule = schedule;
 
            listLoggerJob.Update();
 
        }
 
        // Uncomment the method below to handle the event raised before a feature is deactivated.
 
        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;
 
            // delete the job
 
            foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
            {
 
                if (job.Name == List_JOB_NAME)
 
                    job.Delete();
 
            }
 
        }
 
    }
 
}

10. Select the appropriate scope where the new feature will be activated.  Double click Feature1.Feature in theSolution Explorer window and choose the desired Scope from the dropdown menu.image
11. Deploy the solution by right clicking on the project in the Solution Explorer window and selecting Deploy.image
12. Navigate to the SharePoint “ListTimerJob” list and verify that a new item has been added with the current day/time as the title. (Note: The custom timer job , and many other services, can be modified within Central Administration site.)
13. Finished!