DataTables server-side processing example feeding from SharePoint 2010 search service plus Reformatting Columns To Hyperlink

DataTables server-side processing example feeding from SharePoint 2010 search service plus Reformatting Columns To Hyperlink 


My SharePoint search started to return a huge number of records back so I decided to use the service side processing technique.  I didn't see any example in the internet so I decided to publish mine.

Step 1

So here is my HTML Markup to create the page

 <table id="GADIR-datagrid" >  
        <thead>  
            <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Number</th>
            <th>Supervising Partner</th>
            <th>Billing address</th>
            <th>Filing address</th>
            <th>Status</th>
            <th>Open Date</th>
            <th>Close Date</th>
            </tr>  
        </thead>  
    </table> 


Step 2

And here is my Script top populate the grid from the Share Point service 

 function DisplayRelatedProject(QueryStr) {
            var sQuery = "SCOPE:\"GADIR\" (GADIRCLIENTKEY:\"" + GADIRCLIENTNUMBER + "\")"
            if ($("#OnlyOpenProjectsCheckbox").val() == "checked") {
                sQuery = sQuery + " AND (GADIRProjectSMATSTATUS:\"OPEN\")\"";
            }
            var tableProjects = $('#Projects-datagrid').dataTable({
                "fields": [{
                    "label": "OCG",
                    "name": "GADIRhasocg"
                }, {
                    "label": "Project Name",
                    "name": "GADIRProjectsname"
                }, {
                    "label": "Number",
                    "name": "GADIRProjectsnumber"
                }, {
                    "label": "Supervising Partner",
                    "name": "GADIRProjectssuppartnerpreferredname"
                }, {
                    "label": "Billing Atty",
                    "name": "GADIRProjectsbillattypreferredname"
                }, {
                    "label": "Filing Atty",
                    "name": "GADIRProjectsfilattypreferredname"
                }, {
                    "label": "Status",
                    "name": "GADIRProjectsmatstatus"
                }, {
                    "label": "Open Date",
                    "name": "GADIRmatopendate"
                }, {
                    "label": "Close Date",
                    "name": "GADIRmatclosedate"
                }],
                "bProcessing": true,
                "bFilter": false,
                "aaSorting": [
                    [7, "desc"]
                ],
                "sDom": "Tfrtip",
                "sPaginationType": "full_numbers",
                "oTableTools": {},
                "bServerSide": true,
                "sAjaxSource": "/_Layouts/GADIR.ClientsProjects/ProjectsData.aspx",
                "aoColumns": [{
                    "mData": "GADIRhasocg"
                }, {
                    "mData": "GADIRProjectsname"
                }, {
                    "mData": "GADIRProjectsnumber"
                }, {
                    "mData": "GADIRProjectssuppartnerpreferredname"
                }, {
                    "mData": "GADIRProjectsbillattypreferredname"
                }, {
                    "mData": "GADIRProjectsfilattypreferredname"
                }, {
                    "mData": "GADIRProjectsmatstatus"
                }, {
                    "mData": "GADIRmatopendate"
                }, {
                    "mData": "GADIRmatclosedate"
                }],
                "aoColumnDefs": [{
                    "fnRender": function (oObj) {
                        return hasOCG(oObj.aData.GADIRhasocg, oObj.aData.GADIRProjectsmatstatus);
                    },
                    "aTargets": [0]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRProjectsname, "<A style='color:black !important;' class='AProjectsdatagrid'  href='/Pages/Projects/Project_summary.aspx?Projectkey=" + oObj.aData.GADIRProjectskey + "' target='_blank'>" + oObj.aData.GADIRProjectsname + "</A>");
                    },
                    "aTargets": [1]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRProjectsnumber, oObj.aData.GADIRProjectsnumber);
                    },
                    "aTargets": [2]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRProjectssuppartnerpreferredname, "<A style='color:black !important;' class='AProjectsdatagrid'  href='/pages/people/Bio.aspx?peopleKey=" + oObj.aData.GADIRProjectssuppartnerpeoplekey + "' target='_blank'>" + oObj.aData.GADIRProjectssuppartnerpreferredname + "</A>");
                    },
                    "aTargets": [3]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRProjectsbillattypreferredname, "<A style='color:black !important;' class='AProjectsdatagrid'  href='/pages/people/Bio.aspx?peopleKey=" + oObj.aData.GADIRProjectsbillattypeoplekey + "' target='_blank'>" + oObj.aData.GADIRProjectsbillattypreferredname + "</A>");
                    },
                    "aTargets": [4]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRProjectsfilattypreferredname, "<A style='color:black !important;' class='AProjectsdatagrid'  href='/pages/people/Bio.aspx?peopleKey=" + oObj.aData.GADIRProjectsfilattypeoplekey + "' target='_blank'>" + oObj.aData.GADIRProjectsfilattypreferredname + "</A>");
                    },
                    "aTargets": [5]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRProjectsmatstatus, oObj.aData.GADIRProjectsmatstatus);
                    },
                    "aTargets": [6]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRmatopendate, oObj.aData.GADIRmatopendate);
                    },
                    "aTargets": [7]
                }, {
                    "fnRender": function (oObj) {
                        return CheckForNull(oObj.aData.GADIRmatclosedate, oObj.aData.GADIRmatclosedate);
                    },
                    "aTargets": [8]
                }],
                "fnServerParams": function (aoData) {
                    aoData.push({
                        "name": "iQueryText",
                        "value": sQuery
                    });
                }
            });
        }


Step 3

If you notice, I am calling an aspx page from you grid in line("sAjaxSource": "/_Layouts/GADIR.ClientsProjects/ProjectsData.aspx",).  This page is going to only contain JSON (Please make sure there isn't any HTML in that page) 
So I created an application page that will call a method called GetProjectData(). That method is going to query the search service and convert the data to JSON and return it.
The page job is to take the JSON and display it.


        protected void Page_Load(object sender, EventArgs e)
        {

            JavaScriptSerializer ser = new JavaScriptSerializer();
            int iDisplayLength = Convert.ToInt32(HttpContext.Current.Request["iDisplayLength"]);
            int iDisplayStart= Convert.ToInt32(HttpContext.Current.Request["iDisplayStart"]);
            var data = ExternalServiceCalls.GetProjectData();           
            HttpContext.Current.Response.Clear();          
            HttpContext.Current.Response.Write(data);
        }

Step 4

Here is my C# code querying the Share Point 2010 search service 
Notice, I added a sorting logic and filtering logic. All the parameters that you will need are going to be in the HttpContext.Current.Request object 

 public static string GetProjectData()
        {

            string QueryText = HttpContext.Current.Request.Params["iQueryText"];
            String JsonData = String.Empty;
            if (!String.IsNullOrEmpty(QueryText))
            {
                try
                {
                    int iDisplayLength = 0;
                    int iDisplayStart = 0;
                    int sEcho = 0;
                    int.TryParse(HttpContext.Current.Request["iDisplayLength"], out iDisplayLength);
                    int.TryParse(HttpContext.Current.Request["iDisplayStart"], out iDisplayStart);
                    int.TryParse(HttpContext.Current.Request["sEcho"], out sEcho);
                    int iSortCol = Convert.ToInt32(HttpContext.Current.Request["iSortCol_0"]);
                    string sSortDir = HttpContext.Current.Request["sSortDir_0"];
                    int iSortingCols = Convert.ToInt32(HttpContext.Current.Request["iSortingCols"]);

                    string sStatus = HttpContext.Current.Request["sSearch_6"];
                    if (!String.IsNullOrEmpty(sStatus)) { QueryText = QueryText + " AND (PROJSTATUS:\"OPEN\")\""; }
                    SearchServiceApplicationProxy proxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy
                    (SPServiceContext.GetContext(SPContext.Current.Site));
                    KeywordQuery query = new KeywordQuery(proxy);
                    query.ResultsProvider = Microsoft.Office.Server.Search.Query.SearchProvider.Default;
                    query.QueryText = QueryText;
                    query.SelectProperties.Add("GADIRProjectskey");
                    query.SelectProperties.Add("GADIRProjectsname");
                    query.SelectProperties.Add("GADIRProjectsnumber");
                    query.SelectProperties.Add("GADIRmatopendate");
                    query.SelectProperties.Add("GADIRhasocg");
                    query.SelectProperties.Add("GADIRProjectsmatstatus");
                    query.SelectProperties.Add("GADIRProjectsmatisactive");
                    query.SelectProperties.Add("GADIRProjectsprackey");
                    query.SelectProperties.Add("GADIRProjectsdeptkey");
                    query.SelectProperties.Add("GADIRProjectsarrangementkey");
                    query.SelectProperties.Add("GADIRProjectsarrangementcode");
                    query.SelectProperties.Add("GADIRProjectsarrangement");
                    query.SelectProperties.Add("GADIRProjectsaolkey");
                    query.SelectProperties.Add("GADIRProjectsaolcode");
                    query.SelectProperties.Add("GADIRProjectsaoldesc");
                    query.SelectProperties.Add("GADIRProjectssuppartnerpeoplekey");
                    query.SelectProperties.Add("GADIRProjectssuppartnerpreferredname");
                    query.SelectProperties.Add("GADIRProjectsbillattypeoplekey");
                    query.SelectProperties.Add("GADIRProjectsbillattypreferredname");
                    query.SelectProperties.Add("GADIRProjectsfilattypeoplekey");
                    query.SelectProperties.Add("GADIRProjectsfilattypreferredname");
                    query.SelectProperties.Add("GADIRclientkey");
                    query.SelectProperties.Add("GADIRclientname");
                    query.SelectProperties.Add("GADIRclientnumber");
                    query.SelectProperties.Add("GADIRmatclosedate");
                    query.RowLimit = iDisplayLength;// int.MaxValue;
                    query.StartRow = iDisplayStart;
                    query.TrimDuplicates = false;

                    //Sorting
                    if (iSortingCols == 1)
                    {
                        if (sSortDir == "asc" && iSortCol == 0) { query.SortList.Add("GADIRhasocg", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 0) { query.SortList.Add("GADIRhasocg", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 1) { query.SortList.Add("GADIRProjectsname", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 1) { query.SortList.Add("GADIRProjectsname", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 2) { query.SortList.Add("GADIRProjectsnumber", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 2) { query.SortList.Add("GADIRProjectsnumber", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 3) { query.SortList.Add("GADIRProjectssuppartnerpreferredname", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 3) { query.SortList.Add("GADIRProjectssuppartnerpreferredname", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 4) { query.SortList.Add("GADIRProjectsbillattypreferredname", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 4) { query.SortList.Add("GADIRProjectsbillattypreferredname", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 5) { query.SortList.Add("GADIRProjectsfilattypreferredname", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 5) { query.SortList.Add("GADIRProjectsfilattypreferredname", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 6) { query.SortList.Add("GADIRProjectsmatstatus", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 6) { query.SortList.Add("GADIRProjectsmatstatus", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 7) { query.SortList.Add("GADIRmatopendate", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 7) { query.SortList.Add("GADIRmatopendate", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }

                        if (sSortDir == "asc" && iSortCol == 8) { query.SortList.Add("GADIRmatclosedate", Microsoft.Office.Server.Search.Query.SortDirection.Ascending); }
                        if (sSortDir == "desc" && iSortCol == 8) { query.SortList.Add("GADIRmatclosedate", Microsoft.Office.Server.Search.Query.SortDirection.Descending); }
                    }

                    //
                    query.ResultTypes |= ResultType.RelevantResults;
                    ResultTableCollection searchResults = query.Execute();
                    if (searchResults.Exists(ResultType.RelevantResults))
                    {
                        ResultTable searchResult = searchResults[ResultType.RelevantResults];
                      
                        DataTable result = new DataTable();
                        result.TableName = "aaData";                       
                        result.Load(searchResult, LoadOption.OverwriteChanges);
                        JsonData = JsonConvert.SerializeObject(result, Formatting.None, new IsoDateTimeConverter() { DateTimeFormat = "MM/dd/yyyy" });

                        //build JSON
                        StringBuilder jdata = new StringBuilder();
                        jdata.Append("{");
                        //sEcho
                        jdata.Append("\"sEcho\":" + sEcho);
                        jdata.Append(",");
                        jdata.Append("\"iTotalRecords\":" + searchResult.TotalRows);
                        jdata.Append(",");
                        jdata.Append("\"iTotalDisplayRecords\":" + searchResult.TotalRows);
                        jdata.Append(",");
                        jdata.Append("\"aaData\":" + JsonData);
                        jdata.Append("}");
                        JsonData = jdata.ToString();
                    }
                }
                catch (Exception ex)
                {
                    JsonData = String.Format("Error:\"{0}\"",ex.Message);
                }
            }
            return JsonData;
        }



Comments

Popular posts from this blog

How can TeamCity generate Release notes from JIRA during a build